<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>James Kovacs' Weblog</title>
    <link>http://www.jameskovacs.com/blog/</link>
    <description />
    <language>en-us</language>
    <copyright>James Kovacs</copyright>
    <lastBuildDate>Tue, 20 May 2008 04:44:43 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 1.9.6264.0</generator>
    <managingEditor>jkovacs@post.harvard.edu</managingEditor>
    <webMaster>jkovacs@post.harvard.edu</webMaster>
    <item>
      <trackback:ping>http://www.jameskovacs.com/blog/Trackback.aspx?guid=65e3707c-e62b-46b8-bb5c-82f3d7712425</trackback:ping>
      <pingback:server>http://www.jameskovacs.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.jameskovacs.com/blog/PermaLink.aspx?guid=65e3707c-e62b-46b8-bb5c-82f3d7712425</pingback:target>
      <dc:creator>James Kovacs</dc:creator>
      <wfw:comment>http://www.jameskovacs.com/blog/CommentView.aspx?guid=65e3707c-e62b-46b8-bb5c-82f3d7712425</wfw:comment>
      <wfw:commentRss>http://www.jameskovacs.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=65e3707c-e62b-46b8-bb5c-82f3d7712425</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Another DevTeach has come and gone. I had an awesome time. I enjoyed hanging out with
old friends and meeting some new ones. I saw a lot of great sessions, but the best
part, as always, is the hallway and bar conversations. (No, I still haven't quite
figured out <a href="http://codebetter.com/blogs/david_laribee/archive/2008/04/22/metastones.aspx">Metastones</a>,
even after playing for hours.) I wanted to especially thank everyone involved in the
agile track - both presenters and attendees. I have received a lot of positive feedback
on the track. Given that I organized the track, I am immensely pleased with its success.
</p>
        <p>
You can download my slides and demos from here or the <a href="http://www.devteach.com">DevTeach</a> site.
</p>
        <p>
          <a href="http://www.jameskovacs.com/downloads/PersistenceIgnorance-DevTeachToronto2008.zip">Achieving
Persistence Ignorance with NHibernate</a> (2.6 MB)
</p>
        <p>
          <a href="http://www.jameskovacs.com/downloads/TamingDependencies-DevTeachToronto2008.zip">Taming
Software Dependencies with DI and IoC</a> (20.9 MB)
</p>
        <p>
I have started keeping my latest presentations online in Google Code's Subversion
repository.
</p>
        <p>
svn checkout <a href="http://jameskovacs.googlecode.com/svn/Presentations/">http://jameskovacs.googlecode.com/svn/Presentations/</a></p>
        <p>
Take a look in the tags to get the slide deck and demos for a particular event. For
example, you'll find tags/DevTeachToronto2008 contains the version from - surprise,
surprise - DevTeach Toronto 2008. If you have any questions or comments on slides,
demos, or techniques, please don't hesitate to <a href="mailto:jkovacs@post.harvard.edu?subject=DevTeach%20Toronto%202008%20Question">email
me</a>.
</p>
        <p>
DevTeach is returning to Montreal on December 1 to 5, 2008. I'll be the Agile Track
Tech Chair again. Jean-Rene will be putting out a call for sessions in the near future
and you should find the announcement <a href="http://www.devteach.com/TechChair.aspx">here</a>.
If you are interested in speaking in the Agile Track, feel free to email me. If you
attended any sessions in the Agile Track and have suggestions for things that you'd
like to see again or suggestions for improvement, <a href="mailto:jkovacs@post.harvard.edu?subject=DevTeach%20Toronto%202008%20Question">email
me</a>!
</p>
        <img width="0" height="0" src="http://www.jameskovacs.com/blog/aggbug.ashx?id=65e3707c-e62b-46b8-bb5c-82f3d7712425" />
      </body>
      <title>DevTeach Toronto 2008 Wrap-up</title>
      <guid isPermaLink="false">http://www.jameskovacs.com/blog/PermaLink.aspx?guid=65e3707c-e62b-46b8-bb5c-82f3d7712425</guid>
      <link>http://www.jameskovacs.com/blog/DevTeachToronto2008Wrapup.aspx</link>
      <pubDate>Tue, 20 May 2008 04:44:43 GMT</pubDate>
      <description>&lt;p&gt;
Another DevTeach has come and gone. I had an awesome time. I enjoyed hanging out with
old friends and meeting some new ones. I saw a lot of great sessions, but the best
part, as always, is the hallway and bar conversations. (No, I still haven't quite
figured out &lt;a href="http://codebetter.com/blogs/david_laribee/archive/2008/04/22/metastones.aspx"&gt;Metastones&lt;/a&gt;,
even after playing for hours.) I wanted to especially thank everyone involved in the
agile track - both presenters and attendees. I have received a lot of positive feedback
on the track. Given that I organized the track, I am immensely pleased with its success.
&lt;/p&gt;
&lt;p&gt;
You can download my slides and demos from here or the &lt;a href="http://www.devteach.com"&gt;DevTeach&lt;/a&gt; site.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.jameskovacs.com/downloads/PersistenceIgnorance-DevTeachToronto2008.zip"&gt;Achieving
Persistence Ignorance with NHibernate&lt;/a&gt; (2.6 MB)
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.jameskovacs.com/downloads/TamingDependencies-DevTeachToronto2008.zip"&gt;Taming
Software Dependencies with DI and IoC&lt;/a&gt; (20.9 MB)
&lt;/p&gt;
&lt;p&gt;
I have started keeping my latest presentations online in Google Code's Subversion
repository.
&lt;/p&gt;
&lt;p&gt;
svn checkout &lt;a href="http://jameskovacs.googlecode.com/svn/Presentations/"&gt;http://jameskovacs.googlecode.com/svn/Presentations/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Take a look in the tags to get the slide deck and demos for a particular event. For
example, you'll find tags/DevTeachToronto2008 contains the version from - surprise,
surprise - DevTeach Toronto 2008. If you have any questions or comments on slides,
demos, or techniques, please don't hesitate to &lt;a href="mailto:jkovacs@post.harvard.edu?subject=DevTeach%20Toronto%202008%20Question"&gt;email
me&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
DevTeach is returning to Montreal on December 1 to 5, 2008. I'll be the Agile Track
Tech Chair again. Jean-Rene will be putting out a call for sessions in the near future
and you should find the announcement &lt;a href="http://www.devteach.com/TechChair.aspx"&gt;here&lt;/a&gt;.
If you are interested in speaking in the Agile Track, feel free to email me. If you
attended any sessions in the Agile Track and have suggestions for things that you'd
like to see again or suggestions for improvement, &lt;a href="mailto:jkovacs@post.harvard.edu?subject=DevTeach%20Toronto%202008%20Question"&gt;email
me&lt;/a&gt;!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.jameskovacs.com/blog/aggbug.ashx?id=65e3707c-e62b-46b8-bb5c-82f3d7712425" /&gt;</description>
      <comments>http://www.jameskovacs.com/blog/CommentView.aspx?guid=65e3707c-e62b-46b8-bb5c-82f3d7712425</comments>
      <category>Agile;Events;Presentations</category>
    </item>
    <item>
      <trackback:ping>http://www.jameskovacs.com/blog/Trackback.aspx?guid=9dd33e10-3c88-4742-a26d-37fb473d7e68</trackback:ping>
      <pingback:server>http://www.jameskovacs.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.jameskovacs.com/blog/PermaLink.aspx?guid=9dd33e10-3c88-4742-a26d-37fb473d7e68</pingback:target>
      <dc:creator>James Kovacs</dc:creator>
      <wfw:comment>http://www.jameskovacs.com/blog/CommentView.aspx?guid=9dd33e10-3c88-4742-a26d-37fb473d7e68</wfw:comment>
      <wfw:commentRss>http://www.jameskovacs.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=9dd33e10-3c88-4742-a26d-37fb473d7e68</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
...a ReSharper Jedi, that is. I am making no claims about my own ReSharper Jedi abilities. <a href="http://www.jpboodhoo.com">JP</a> and <a href="http://www.ayende.com">Oren</a> are
known ReSharper Jedi Masters. I feel more like Luke Skywalker when he first landed
on Dagobah in comparison. Back to the point of this post...
</p>
        <p>
Many developers don't see the value of <a href="http://www.jetbrains.com/resharper">JetBrains'
ReSharper</a> until they've seen it in action. So I'm putting together this screencast
series to show off my favourite ReSharper features. My goal is to keep each screencast
to 5 to 10 minutes and focus on a related set of capabilities. In the first episode,
I look at ReSharper's Code Browsing - CTRL-N, CTRL-B, CTRL-ALT-B, ALT-F7, and related.
</p>
        <p>
Streaming: <a href="http://kovacsoncode.com/episodes/BecomingAJedi-Part1/index.mvc">Becoming
a Jedi - Part 1: Code Browsing</a> (requires Silverlight 1.0 or higher)*
</p>
        <p>
Download: <a href="http://cid-9863a1726a0813de.skydrive.live.com/self.aspx/Screencasts/BecomingAJedi/BecomingAJedi-Part1.wmv">Becoming
a Jedi - Part 1: Code Browsing</a> (via Live SkyDrive)
</p>
        <p>
Before someone makes a snarky comment about my coding speed, I'm intentionally taking
the time to explain the features. That and I'm not as adept as <a href="http://www.jpboodhoo.com">some</a> at
coding and talking at the same time. Hopefully I'll improve with practice as this
screencast series progresses. Any constructive feedback on the content or presentation
style is appreciated. Enjoy!
</p>
        <p>
* I am encoding the series using Silverlight 1.0 for two reasons:
</p>
        <ol>
          <li>
In my tests with Camtasia, the Silverlight version scaled better than the Flash version.
Text in Visual Studio remained clearer as the video was resized. The original recording
is at 1024x768, but is still legible when scaled to 640x480 or smaller. 
</li>
          <li>
I can host the content on <a href="http://streaming.live.com">Silverlight Streaming</a> for
free. When you sign up for an account, you get 10 GB of storage and 5 TB of bandwidth
per month. The videos are distributed by Microsoft's content delivery network and
streamed from a server close to the viewer. As an author you simply upload your videos
to Silverlight Streaming and Microsoft does the rest. I also don't run the risk of
blowing the bandwidth allotment at my hosting provider and incurring charges for bandwidth
overages.</li>
        </ol>
        <img width="0" height="0" src="http://www.jameskovacs.com/blog/aggbug.ashx?id=9dd33e10-3c88-4742-a26d-37fb473d7e68" />
      </body>
      <title>Becoming a Jedi - Part 1 of N</title>
      <guid isPermaLink="false">http://www.jameskovacs.com/blog/PermaLink.aspx?guid=9dd33e10-3c88-4742-a26d-37fb473d7e68</guid>
      <link>http://www.jameskovacs.com/blog/BecomingAJediPart1OfN.aspx</link>
      <pubDate>Wed, 07 May 2008 10:08:03 GMT</pubDate>
      <description>&lt;p&gt;
...a ReSharper Jedi, that is. I am making no claims about my own ReSharper Jedi abilities. &lt;a href="http://www.jpboodhoo.com"&gt;JP&lt;/a&gt; and &lt;a href="http://www.ayende.com"&gt;Oren&lt;/a&gt; are
known ReSharper Jedi Masters. I feel more like Luke Skywalker when he first landed
on Dagobah in comparison. Back to the point of this post...
&lt;/p&gt;
&lt;p&gt;
Many developers don't see the value of &lt;a href="http://www.jetbrains.com/resharper"&gt;JetBrains'
ReSharper&lt;/a&gt; until they've seen it in action. So I'm putting together this screencast
series to show off my favourite ReSharper features. My goal is to keep each screencast
to 5 to 10 minutes and focus on a related set of capabilities. In the first episode,
I look at ReSharper's Code Browsing - CTRL-N, CTRL-B, CTRL-ALT-B, ALT-F7, and related.
&lt;/p&gt;
&lt;p&gt;
Streaming: &lt;a href="http://kovacsoncode.com/episodes/BecomingAJedi-Part1/index.mvc"&gt;Becoming
a Jedi - Part 1: Code Browsing&lt;/a&gt; (requires Silverlight 1.0 or higher)*
&lt;/p&gt;
&lt;p&gt;
Download: &lt;a href="http://cid-9863a1726a0813de.skydrive.live.com/self.aspx/Screencasts/BecomingAJedi/BecomingAJedi-Part1.wmv"&gt;Becoming
a Jedi - Part 1: Code Browsing&lt;/a&gt; (via Live SkyDrive)
&lt;/p&gt;
&lt;p&gt;
Before someone makes a snarky comment about my coding speed, I'm intentionally taking
the time to explain the features. That and I'm not as adept as &lt;a href="http://www.jpboodhoo.com"&gt;some&lt;/a&gt; at
coding and talking at the same time. Hopefully I'll improve with practice as this
screencast series progresses. Any constructive feedback on the content or presentation
style is appreciated. Enjoy!
&lt;/p&gt;
&lt;p&gt;
* I am encoding the series using Silverlight 1.0 for two reasons:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
In my tests with Camtasia, the Silverlight version scaled better than the Flash version.
Text in Visual Studio remained clearer as the video was resized. The original recording
is at 1024x768, but is still legible when scaled to 640x480 or smaller. 
&lt;li&gt;
I can host the content on &lt;a href="http://streaming.live.com"&gt;Silverlight Streaming&lt;/a&gt; for
free. When you sign up for an account, you get 10 GB of storage and 5 TB of bandwidth
per month. The videos are distributed by Microsoft's content delivery network and
streamed from a server close to the viewer. As an author you simply upload your videos
to Silverlight Streaming and Microsoft does the rest. I also don't run the risk of
blowing the bandwidth allotment at my hosting provider and incurring charges for bandwidth
overages.&lt;/li&gt;
&lt;/ol&gt;
&lt;img width="0" height="0" src="http://www.jameskovacs.com/blog/aggbug.ashx?id=9dd33e10-3c88-4742-a26d-37fb473d7e68" /&gt;</description>
      <comments>http://www.jameskovacs.com/blog/CommentView.aspx?guid=9dd33e10-3c88-4742-a26d-37fb473d7e68</comments>
      <category>.NET Tools;Screencast</category>
    </item>
    <item>
      <trackback:ping>http://www.jameskovacs.com/blog/Trackback.aspx?guid=4a00b307-7c1e-4de7-9575-97e00f86d69b</trackback:ping>
      <pingback:server>http://www.jameskovacs.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.jameskovacs.com/blog/PermaLink.aspx?guid=4a00b307-7c1e-4de7-9575-97e00f86d69b</pingback:target>
      <dc:creator>James Kovacs</dc:creator>
      <wfw:comment>http://www.jameskovacs.com/blog/CommentView.aspx?guid=4a00b307-7c1e-4de7-9575-97e00f86d69b</wfw:comment>
      <wfw:commentRss>http://www.jameskovacs.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=4a00b307-7c1e-4de7-9575-97e00f86d69b</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The following is a list of excellent books that every developer should read. I have
focused on technology-agnostic books as I find them the most valuable. I have read
every book on this list and recommend them without reservation. As I read more, I'll
update this list. At bottom, you'll also find a list of books that I'm currently reading.
The worthy ones will gradually appear in the main list, while the others will ignominiously
disappear.
</p>
        <p>
          <em>Full Disclosure: The book links below are through the Amazon Affiliates Program.
If you buy a book through a link, I get more books from Amazon to sate my hunger for
knowledge.</em>
        </p>
        <h3>Becoming a Better Developer
</h3>
        <ul>
          <li>
            <a href="http://www.amazon.com/gp/product/020161622X?ie=UTF8&amp;tag=jamkovweb-20&amp;link_code=as3&amp;camp=211189&amp;creative=373489&amp;creativeASIN=020161622X">
              <em>The
Pragmatic Programmer: From Journeyman to Master</em>
            </a> by Andrew Hunt and David
Thomas 
<ul><li>
In terms of biggest bang for your reading buck, <em>The Pragmatic Programmer</em> tops
my list. This book is a timeless classic originally published in 1999. It will introduce
you to such fundamental concepts as the evils of duplication, orthogonality, design
by contract, testing, refactoring, and more. Many of the core development concepts
that agile/XP/lean developers take for granted are laid out in this book.</li></ul></li>
          <li>
            <a href="http://www.amazon.com/gp/product/0978739213?ie=UTF8&amp;tag=jamkovweb-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0978739213">
              <em>Release
It!: Design and Deploy Production-Ready Software</em>
            </a> by Michael Nygard 
<ul><li>
How often have you seen the disclaimer, "This isn't production code." Ever wondered
what production-ready code looks like. In this book, Michael Nygard clearly documents
what it means to be production-ready and how to get there. He discusses common concerns
that often get forgotten by developers, such as how is the IT department going to
support and monitor the application once it goes live. A must-read for any developer
who aspires to have their code deployed into production.</li></ul></li>
        </ul>
        <h3>Design Patterns
</h3>
        <ul>
          <li>
            <em>
              <a id="lnx6" href="http://www.amazon.com/gp/product/0596007124?ie=UTF8&amp;tag=jamkovweb-20&amp;link_code=as3&amp;camp=211189&amp;creative=373489&amp;creativeASIN=0596007124">Head
First Design Patterns</a>
              <img height="1" alt="" src="http://www.assoc-amazon.com/e/ir?t=jamkovweb-20&amp;l=as2&amp;o=1&amp;a=0596007124" width="1" border="0" />
            </em> by
Eric Freeman and Elizabeth Freeman 
<ul><li>
This book offers deep insight into core programming concepts in a playful, approachable
way. Although it is written for Java developers, it is equally applicable to and comprehensible
by C# developers. It covers the classic "Gang of Four" software patterns, but frames
them in within actual problems so that you can see how to apply them. You understand
the power of coding to interface not implementation, why we favour composition over
inheritance, and how to apply the open-closed principle. Even if you have read the
GoF, I would highly recommend this fun read!</li></ul></li>
          <li>
            <a id="lnx8" href="http://www.amazon.com/gp/product/0201633612?ie=UTF8&amp;tag=jamkovweb-20&amp;link_code=as3&amp;camp=211189&amp;creative=373489&amp;creativeASIN=0201633612">
              <em>Design
Patterns: Elements of Reusable Object-Oriented Software</em>
            </a>
            <img height="1" alt="" src="http://www.assoc-amazon.com/e/ir?t=jamkovweb-20&amp;l=as2&amp;o=1&amp;a=0201633612" width="1" border="0" /> by
Gamma, Helm, Johnson, and Vlissides (aka The Gang of Four) 
<ul><li>
Another classic, it provides an invaluable reference, but is one of the worst ways
to learn design patterns. Often considered a cure for insomnia, it takes a real geek
to read this book cover-to-cover. (Yes, I read it cover-to-cover.) If you're looking
to learn design patterns, you would be better served picking up <em>Head First Design
Patterns</em> first (see above).</li></ul></li>
          <li>
            <a id="lnx9" href="http://www.amazon.com/gp/product/0321127420?ie=UTF8&amp;tag=jamkovweb-20&amp;link_code=as3&amp;camp=211189&amp;creative=373489&amp;creativeASIN=0321127420">
              <em>Patterns
of Enterprise Application Architecture</em>
            </a> by <a href="http://www.martinfowler.com/">Martin
Fowler</a><ul><li>
This book is a fantastic compendium of patterns for building real applications. It
covers everything from data access (unit of work, table data gateway, repository,
lazy loading) to business (domain model, null object, value objects) to UI (MVC, front
controller, MVP).</li></ul></li>
          <li>
            <a id="lnx4" href="http://www.amazon.com/gp/product/0321268202?ie=UTF8&amp;tag=jamkovweb-20&amp;link_code=as3&amp;camp=211189&amp;creative=373489&amp;creativeASIN=0321268202">
              <em>Applying
Domain Driven Design and Patterns</em>
            </a> by Jimmy Nilsson 
</li>
          <li>
            <a id="lnx10" href="http://www.amazon.com/gp/product/0321125215?ie=UTF8&amp;tag=jamkovweb-20&amp;link_code=as3&amp;camp=211189&amp;creative=373489&amp;creativeASIN=0321125215">
              <em>Domain
Driven Design: Tackling Complexity in the Heart of Software</em>
            </a>
            <img height="1" alt="" src="http://www.assoc-amazon.com/e/ir?t=jamkovweb-20&amp;l=as2&amp;o=1&amp;a=0321125215" width="1" border="0" /> by <a href="http://www.domainlanguage.com/about/ericevans.html">Eric
Evans</a><ul><li>
Domain driven design is all about how to build applications where the most important
part of the application is your domain or business logic, not the libraries and frameworks
on which it is built. How can we structure our code to shield ourselves from the UI,
database, logging frameworks, and other concerns? The purpose of erecting these anti-corruption
layers is not to live in an ivory tower, but to allow us to focus on the unique aspects
of our application - its business logic. Eric Evans provides valuable insights into
how to build better software, but many people find his book a difficult introduction
to the subject. Jimmy Nilsson's book provides a practical guide to using DDD concepts
along with patterns from <em>Patterns of Enterprise Application Architecture</em>.
I personally found Evans book easier to understand after reading Nilsson's. I heartily
recommend both books.</li></ul></li>
          <li>
            <em>
              <a id="lnx0" href="http://www.amazon.com/gp/product/0321200683?ie=UTF8&amp;tag=jamkovweb-20&amp;link_code=as3&amp;camp=211189&amp;creative=373489&amp;creativeASIN=0321200683">Enterprise
Integration Patterns</a>
            </em> by Gregor Hohpe and Bobby Woolf 
<ul><li>
If you're building a distributed system, then this is a must-read book. It doesn't
matter whether it will be based on a commercial EAI product (BizTalk, Tibco, ...)
or plain old .NET/Java/... code. This book documents common patterns for building
distributed applications.</li></ul></li>
        </ul>
        <h3>Refactoring
</h3>
        <ul>
          <li>
            <a href="http://www.amazon.com/gp/product/0201485672?ie=UTF8&amp;tag=jamkovweb-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0201485672">
              <em>Refactoring:
Improving the Design of Existing Code</em>
            </a> by Martin Fowler, Kent Beck, John Brant,
William Opdyke, Don Roberts 
</li>
          <li>
            <a href="http://www.amazon.com/gp/product/0321213351?ie=UTF8&amp;tag=jamkovweb-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0321213351">
              <em>Refactoring
to Patterns</em>
            </a> by Joshua Kerievsky 
<ul><li>
Refactoring isn't a discrete task in your development schedule. It is a continuous
activity to improve your codebase as you add features. With a good suite of tests
around your code, you can safely refactor it as you add features. If you do not refactor,
you build up technical debt where each new feature takes longer and longer to implement
as the codebase becomes more and more unwieldy. These books provide a catalogue of
refactorings to solve common development challenges. Kerievsky's book continues on
where Fowler's book left off. Both are excellent reads.</li></ul></li>
          <li>
            <a id="lnx7" href="http://www.amazon.com/gp/product/0131177052?ie=UTF8&amp;tag=jamkovweb-20&amp;link_code=as3&amp;camp=211189&amp;creative=373489&amp;creativeASIN=0131177052">
              <em>Working
Effectively with Legacy Code</em>
            </a> by Michael Feathers 
<ul><li>
The one big assumption that both Fowler's and Kerievsky's books make is that you've
got a solid suite of tests around your code. But what if you don't yet? That is where
Michael Feathers' book comes to the rescue. It provides excellent strategies and patterns
for safely implementing tests around untested code, which is crucial in order to make
non-breaking changes to an existing application AKA refactoring. If you can refactor
your code, you can improve your code.</li></ul></li>
        </ul>
        <h3>Agile Practices
</h3>
        <ul>
          <li>
            <a href="http://www.amazon.com/gp/product/0321437381?ie=UTF8&amp;tag=jamkovweb-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0321437381">
              <em>Implementing
Lean Software Development</em>
            </a> by Mary and Tom Poppendieck 
<ul><li>
What a fantastic book! Have you ever needed to convince a management type why iterative
development, continuous integration, refactoring, or other agile technique was important?
Then this is the book for you. Lean development takes its cue from lean manufacturing
as pioneered by Toyota and applies the same ideas to software development. It provides
a solid grounding in business principles for agile development without the dogma often
encountered in other methodologies. If you're going to read one book on how to manage
agile projects, this has to be it.</li></ul></li>
          <li>
            <a href="http://www.amazon.com/gp/product/0321278658?ie=UTF8&amp;tag=jamkovweb-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0321278658">
              <em>Extreme
Programming Explained: Embrace Change</em>
            </a> by Kent Beck and Cynthia Andres 
<ul><li>
Ever wondered how a development team should work on a day-to-day basis? Then this
is the book for you. It provides a list of values, principles, and practices for the
agile team. It is light on the overall management of a project, but you can look to
Lean or Scrum to fill in the gaps.</li></ul></li>
          <li>
            <a href="http://www.amazon.com/gp/product/0130676349?ie=UTF8&amp;tag=jamkovweb-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0130676349">
              <em>Agile
Software Development with Scrum</em>
            </a> by Ken Schwaber and Mike Beedle 
<ul><li>
A good introduction to the Scrum methodology. Scrum is primarily concerned with providing
structure between a project team and management. It doesn't address how a development
team should run day-to-day. So it dovetails nicely with Extreme Programming. The book
provides lots of anecdotal success stories, which are fun reads. Keep in mind that
it recommends an iteration length of one month, which is too long in my opinion. One
to two weeks provides a much better feedback loop.</li></ul></li>
          <li>
            <a href="http://www.amazon.com/gp/product/0321205685?ie=UTF8&amp;tag=jamkovweb-20&amp;link_code=as3&amp;camp=211189&amp;creative=373489&amp;creativeASIN=0321205685">
              <em>User
Stories Applied</em>
            </a> by Mike Cohn 
<ul><li>
Use cases and requirements documents are seldom read and often misinterpreted. Is
there a better way? For agile projects, look no further than user stories. User stories
are a lightweight technique for capturing and prioritizing end user requirements.
Mike Cohn provides a great description of the technique and practical advice on how
to apply it.</li></ul></li>
          <li>
            <a href="http://www.amazon.com/gp/product/0131479415?ie=UTF8&amp;tag=jamkovweb-20&amp;link_code=as3&amp;camp=211189&amp;creative=373489&amp;creativeASIN=0131479415">
              <em>Agile
Estimating and Planning</em>
            </a> by Mike Cohn 
<ul><li>
Project estimation is hard. Very hard. Every project is different from the last. If
it wasn't, you'd just pop a blank DVD-R in your burner and copy the previous solution.
This book provides practical advice for how to estimate projects, especially agile
ones. One of the big revelations for me was the distinction between absolute and relative
size of tasks/stories/epics. Humans are fantastic at estimating relative size, but
horrible at absolute size. Quick - order these dogs from largest to smallest: Terrier,
Poodle, Great Dane, German Shepherd, Chihuahua. Probably not too difficult. Now how
tall is a Chihuahua at the shoulder? You're probably a lot less certain. Mike makes
a convincing argument for using story points (comparative estimates of size) combined
with velocity (story points completed per iteration) to drive planning. This is a
must-read for any developer who ever has to answer the questions "How long is this
going to take?" and "When is this going to be done?"</li></ul></li>
        </ul>
        <h3>Currently Reading (in no particular order)
</h3>
        <ul>
          <li>
            <a href="http://www.amazon.com/gp/product/0321293533?ie=UTF8&amp;tag=jamkovweb-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0321293533">
              <em>Refactoring
Databases</em>
            </a> by Scott W. Ambler and Pramodkumar J. Sadalage 
</li>
          <li>
            <a href="http://www.amazon.com/gp/product/0321336380?ie=UTF8&amp;tag=jamkovweb-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0321336380">
              <em>Continuous
Integration</em>
            </a> by Paul Duvall, Steve Matyas, and Andrew Glover 
</li>
          <li>
            <a href="http://www.amazon.com/gp/product/0321413091?ie=UTF8&amp;tag=jamkovweb-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0321413091">
              <em>Implementation
Patterns</em>
            </a> by Kent Beck 
</li>
          <li>
            <em>
              <a id="lnx3" href="http://www.amazon.com/gp/product/0131495054?ie=UTF8&amp;tag=jamkovweb-20&amp;link_code=as3&amp;camp=211189&amp;creative=373489&amp;creativeASIN=0131495054">xUnit
Test Patterns</a>
            </em> by Gerard Meszaros 
</li>
        </ul>
        <img width="0" height="0" src="http://www.jameskovacs.com/blog/aggbug.ashx?id=4a00b307-7c1e-4de7-9575-97e00f86d69b" />
      </body>
      <title>The Bookshelf</title>
      <guid isPermaLink="false">http://www.jameskovacs.com/blog/PermaLink.aspx?guid=4a00b307-7c1e-4de7-9575-97e00f86d69b</guid>
      <link>http://www.jameskovacs.com/blog/TheBookshelf.aspx</link>
      <pubDate>Tue, 06 May 2008 23:23:04 GMT</pubDate>
      <description>&lt;p&gt;
The following is a list of excellent books that every developer should read. I have
focused on technology-agnostic books as I find them the most valuable. I have read
every book on this list and recommend them without reservation. As I read more, I'll
update this list. At bottom, you'll also find a list of books that I'm currently reading.
The worthy ones will gradually appear in the main list, while the others will ignominiously
disappear.
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Full Disclosure: The book links below are through the Amazon Affiliates Program.
If you buy a book through a link, I get more books from Amazon to sate my hunger for
knowledge.&lt;/em&gt;
&lt;/p&gt;
&lt;h3&gt;Becoming a Better Developer
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.amazon.com/gp/product/020161622X?ie=UTF8&amp;amp;tag=jamkovweb-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=020161622X"&gt;&lt;em&gt;The
Pragmatic Programmer: From Journeyman to Master&lt;/em&gt;&lt;/a&gt; by Andrew Hunt and David
Thomas 
&lt;ul&gt;
&lt;li&gt;
In terms of biggest bang for your reading buck, &lt;em&gt;The Pragmatic Programmer&lt;/em&gt; tops
my list. This book is a timeless classic originally published in 1999. It will introduce
you to such fundamental concepts as the evils of duplication, orthogonality, design
by contract, testing, refactoring, and more. Many of the core development concepts
that agile/XP/lean developers take for granted are laid out in this book.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
&lt;a href="http://www.amazon.com/gp/product/0978739213?ie=UTF8&amp;amp;tag=jamkovweb-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0978739213"&gt;&lt;em&gt;Release
It!: Design and Deploy Production-Ready Software&lt;/em&gt;&lt;/a&gt; by Michael Nygard 
&lt;ul&gt;
&lt;li&gt;
How often have you seen the disclaimer, "This isn't production code." Ever wondered
what production-ready code looks like. In this book, Michael Nygard clearly documents
what it means to be production-ready and how to get there. He discusses common concerns
that often get forgotten by developers, such as how is the IT department going to
support and monitor the application once it goes live. A must-read for any developer
who aspires to have their code deployed into production.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Design Patterns
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;&lt;a id="lnx6" href="http://www.amazon.com/gp/product/0596007124?ie=UTF8&amp;amp;tag=jamkovweb-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=0596007124"&gt;Head
First Design Patterns&lt;/a&gt;&lt;img height="1" alt="" src="http://www.assoc-amazon.com/e/ir?t=jamkovweb-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0596007124" width="1" border="0"&gt;&lt;/em&gt; by
Eric Freeman and Elizabeth Freeman 
&lt;ul&gt;
&lt;li&gt;
This book offers deep insight into core programming concepts in a playful, approachable
way. Although it is written for Java developers, it is equally applicable to and comprehensible
by C# developers. It covers the classic "Gang of Four" software patterns, but frames
them in within actual problems so that you can see how to apply them. You understand
the power of coding to interface not implementation, why we favour composition over
inheritance, and how to apply the open-closed principle. Even if you have read the
GoF, I would highly recommend this fun read!&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
&lt;a id="lnx8" href="http://www.amazon.com/gp/product/0201633612?ie=UTF8&amp;amp;tag=jamkovweb-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=0201633612"&gt;&lt;em&gt;Design
Patterns: Elements of Reusable Object-Oriented Software&lt;/em&gt;&lt;/a&gt;&lt;img height="1" alt="" src="http://www.assoc-amazon.com/e/ir?t=jamkovweb-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0201633612" width="1" border="0"&gt; by
Gamma, Helm, Johnson, and Vlissides (aka The Gang of Four) 
&lt;ul&gt;
&lt;li&gt;
Another classic, it provides an invaluable reference, but is one of the worst ways
to learn design patterns. Often considered a cure for insomnia, it takes a real geek
to read this book cover-to-cover. (Yes, I read it cover-to-cover.) If you're looking
to learn design patterns, you would be better served picking up &lt;em&gt;Head First Design
Patterns&lt;/em&gt; first (see above).&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
&lt;a id="lnx9" href="http://www.amazon.com/gp/product/0321127420?ie=UTF8&amp;amp;tag=jamkovweb-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=0321127420"&gt;&lt;em&gt;Patterns
of Enterprise Application Architecture&lt;/em&gt;&lt;/a&gt; by &lt;a href="http://www.martinfowler.com/"&gt;Martin
Fowler&lt;/a&gt; 
&lt;ul&gt;
&lt;li&gt;
This book is a fantastic compendium of patterns for building real applications. It
covers everything from data access (unit of work, table data gateway, repository,
lazy loading) to business (domain model, null object, value objects) to UI (MVC, front
controller, MVP).&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
&lt;a id="lnx4" href="http://www.amazon.com/gp/product/0321268202?ie=UTF8&amp;amp;tag=jamkovweb-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=0321268202"&gt;&lt;em&gt;Applying
Domain Driven Design and Patterns&lt;/em&gt;&lt;/a&gt; by Jimmy Nilsson 
&lt;li&gt;
&lt;a id="lnx10" href="http://www.amazon.com/gp/product/0321125215?ie=UTF8&amp;amp;tag=jamkovweb-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=0321125215"&gt;&lt;em&gt;Domain
Driven Design: Tackling Complexity in the Heart of Software&lt;/em&gt;&lt;/a&gt;&lt;img height="1" alt="" src="http://www.assoc-amazon.com/e/ir?t=jamkovweb-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0321125215" width="1" border="0"&gt; by &lt;a href="http://www.domainlanguage.com/about/ericevans.html"&gt;Eric
Evans&lt;/a&gt; 
&lt;ul&gt;
&lt;li&gt;
Domain driven design is all about how to build applications where the most important
part of the application is your domain or business logic, not the libraries and frameworks
on which it is built. How can we structure our code to shield ourselves from the UI,
database, logging frameworks, and other concerns? The purpose of erecting these anti-corruption
layers is not to live in an ivory tower, but to allow us to focus on the unique aspects
of our application - its business logic. Eric Evans provides valuable insights into
how to build better software, but many people find his book a difficult introduction
to the subject. Jimmy Nilsson's book provides a practical guide to using DDD concepts
along with patterns from &lt;em&gt;Patterns of Enterprise Application Architecture&lt;/em&gt;.
I personally found Evans book easier to understand after reading Nilsson's. I heartily
recommend both books.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
&lt;em&gt;&lt;a id="lnx0" href="http://www.amazon.com/gp/product/0321200683?ie=UTF8&amp;amp;tag=jamkovweb-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=0321200683"&gt;Enterprise
Integration Patterns&lt;/a&gt;&lt;/em&gt; by Gregor Hohpe and Bobby Woolf 
&lt;ul&gt;
&lt;li&gt;
If you're building a distributed system, then this is a must-read book. It doesn't
matter whether it will be based on a commercial EAI product (BizTalk, Tibco, ...)
or plain old .NET/Java/... code. This book documents common patterns for building
distributed applications.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Refactoring
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.amazon.com/gp/product/0201485672?ie=UTF8&amp;amp;tag=jamkovweb-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0201485672"&gt;&lt;em&gt;Refactoring:
Improving the Design of Existing Code&lt;/em&gt;&lt;/a&gt; by Martin Fowler, Kent Beck, John Brant,
William Opdyke, Don Roberts 
&lt;li&gt;
&lt;a href="http://www.amazon.com/gp/product/0321213351?ie=UTF8&amp;amp;tag=jamkovweb-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321213351"&gt;&lt;em&gt;Refactoring
to Patterns&lt;/em&gt;&lt;/a&gt; by Joshua Kerievsky 
&lt;ul&gt;
&lt;li&gt;
Refactoring isn't a discrete task in your development schedule. It is a continuous
activity to improve your codebase as you add features. With a good suite of tests
around your code, you can safely refactor it as you add features. If you do not refactor,
you build up technical debt where each new feature takes longer and longer to implement
as the codebase becomes more and more unwieldy. These books provide a catalogue of
refactorings to solve common development challenges. Kerievsky's book continues on
where Fowler's book left off. Both are excellent reads.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
&lt;a id="lnx7" href="http://www.amazon.com/gp/product/0131177052?ie=UTF8&amp;amp;tag=jamkovweb-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=0131177052"&gt;&lt;em&gt;Working
Effectively with Legacy Code&lt;/em&gt;&lt;/a&gt; by Michael Feathers 
&lt;ul&gt;
&lt;li&gt;
The one big assumption that both Fowler's and Kerievsky's books make is that you've
got a solid suite of tests around your code. But what if you don't yet? That is where
Michael Feathers' book comes to the rescue. It provides excellent strategies and patterns
for safely implementing tests around untested code, which is crucial in order to make
non-breaking changes to an existing application AKA refactoring. If you can refactor
your code, you can improve your code.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Agile Practices
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.amazon.com/gp/product/0321437381?ie=UTF8&amp;amp;tag=jamkovweb-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321437381"&gt;&lt;em&gt;Implementing
Lean Software Development&lt;/em&gt;&lt;/a&gt; by Mary and Tom Poppendieck 
&lt;ul&gt;
&lt;li&gt;
What a fantastic book! Have you ever needed to convince a management type why iterative
development, continuous integration, refactoring, or other agile technique was important?
Then this is the book for you. Lean development takes its cue from lean manufacturing
as pioneered by Toyota and applies the same ideas to software development. It provides
a solid grounding in business principles for agile development without the dogma often
encountered in other methodologies. If you're going to read one book on how to manage
agile projects, this has to be it.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
&lt;a href="http://www.amazon.com/gp/product/0321278658?ie=UTF8&amp;amp;tag=jamkovweb-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321278658"&gt;&lt;em&gt;Extreme
Programming Explained: Embrace Change&lt;/em&gt;&lt;/a&gt; by Kent Beck and Cynthia Andres 
&lt;ul&gt;
&lt;li&gt;
Ever wondered how a development team should work on a day-to-day basis? Then this
is the book for you. It provides a list of values, principles, and practices for the
agile team. It is light on the overall management of a project, but you can look to
Lean or Scrum to fill in the gaps.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
&lt;a href="http://www.amazon.com/gp/product/0130676349?ie=UTF8&amp;amp;tag=jamkovweb-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0130676349"&gt;&lt;em&gt;Agile
Software Development with Scrum&lt;/em&gt;&lt;/a&gt; by Ken Schwaber and Mike Beedle 
&lt;ul&gt;
&lt;li&gt;
A good introduction to the Scrum methodology. Scrum is primarily concerned with providing
structure between a project team and management. It doesn't address how a development
team should run day-to-day. So it dovetails nicely with Extreme Programming. The book
provides lots of anecdotal success stories, which are fun reads. Keep in mind that
it recommends an iteration length of one month, which is too long in my opinion. One
to two weeks provides a much better feedback loop.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
&lt;a href="http://www.amazon.com/gp/product/0321205685?ie=UTF8&amp;amp;tag=jamkovweb-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=0321205685"&gt;&lt;em&gt;User
Stories Applied&lt;/em&gt;&lt;/a&gt; by Mike Cohn 
&lt;ul&gt;
&lt;li&gt;
Use cases and requirements documents are seldom read and often misinterpreted. Is
there a better way? For agile projects, look no further than user stories. User stories
are a lightweight technique for capturing and prioritizing end user requirements.
Mike Cohn provides a great description of the technique and practical advice on how
to apply it.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
&lt;a href="http://www.amazon.com/gp/product/0131479415?ie=UTF8&amp;amp;tag=jamkovweb-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=0131479415"&gt;&lt;em&gt;Agile
Estimating and Planning&lt;/em&gt;&lt;/a&gt; by Mike Cohn 
&lt;ul&gt;
&lt;li&gt;
Project estimation is hard. Very hard. Every project is different from the last. If
it wasn't, you'd just pop a blank DVD-R in your burner and copy the previous solution.
This book provides practical advice for how to estimate projects, especially agile
ones. One of the big revelations for me was the distinction between absolute and relative
size of tasks/stories/epics. Humans are fantastic at estimating relative size, but
horrible at absolute size. Quick - order these dogs from largest to smallest: Terrier,
Poodle, Great Dane, German Shepherd, Chihuahua. Probably not too difficult. Now how
tall is a Chihuahua at the shoulder? You're probably a lot less certain. Mike makes
a convincing argument for using story points (comparative estimates of size) combined
with velocity (story points completed per iteration) to drive planning. This is a
must-read for any developer who ever has to answer the questions "How long is this
going to take?" and "When is this going to be done?"&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Currently Reading (in no particular order)
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.amazon.com/gp/product/0321293533?ie=UTF8&amp;amp;tag=jamkovweb-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321293533"&gt;&lt;em&gt;Refactoring
Databases&lt;/em&gt;&lt;/a&gt; by Scott W. Ambler and Pramodkumar J. Sadalage 
&lt;li&gt;
&lt;a href="http://www.amazon.com/gp/product/0321336380?ie=UTF8&amp;amp;tag=jamkovweb-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321336380"&gt;&lt;em&gt;Continuous
Integration&lt;/em&gt;&lt;/a&gt; by Paul Duvall, Steve Matyas, and Andrew Glover 
&lt;li&gt;
&lt;a href="http://www.amazon.com/gp/product/0321413091?ie=UTF8&amp;amp;tag=jamkovweb-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321413091"&gt;&lt;em&gt;Implementation
Patterns&lt;/em&gt;&lt;/a&gt; by Kent Beck 
&lt;li&gt;
&lt;em&gt;&lt;a id="lnx3" href="http://www.amazon.com/gp/product/0131495054?ie=UTF8&amp;amp;tag=jamkovweb-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=0131495054"&gt;xUnit
Test Patterns&lt;/a&gt;&lt;/em&gt; by Gerard Meszaros 
&lt;/li&gt;
&lt;/ul&gt;
&lt;img width="0" height="0" src="http://www.jameskovacs.com/blog/aggbug.ashx?id=4a00b307-7c1e-4de7-9575-97e00f86d69b" /&gt;</description>
      <comments>http://www.jameskovacs.com/blog/CommentView.aspx?guid=4a00b307-7c1e-4de7-9575-97e00f86d69b</comments>
      <category>Agile;Software Design</category>
    </item>
    <item>
      <trackback:ping>http://www.jameskovacs.com/blog/Trackback.aspx?guid=9273c877-0c27-4904-a5b9-7a986d172f23</trackback:ping>
      <pingback:server>http://www.jameskovacs.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.jameskovacs.com/blog/PermaLink.aspx?guid=9273c877-0c27-4904-a5b9-7a986d172f23</pingback:target>
      <dc:creator>James Kovacs</dc:creator>
      <wfw:comment>http://www.jameskovacs.com/blog/CommentView.aspx?guid=9273c877-0c27-4904-a5b9-7a986d172f23</wfw:comment>
      <wfw:commentRss>http://www.jameskovacs.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=9273c877-0c27-4904-a5b9-7a986d172f23</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://www.devteach.com">DevTeach</a> is happening May 12-16, 2008, this
time in Toronto, Canada. DevTeach is a fantastic conference and that's not because
I'm speaking there or organizing the <a href="http://www.devteach.com/Session.aspx#90">Agile
Track</a> - though those are good reasons too. Just take a look at the line-up of <a href="http://www.devteach.com/Speaker.aspx">internationally
known speakers</a>. Attendance is purposely capped in the hundreds to encourage speakers
and attendees to meet, chat, dine, drink, and otherwise talk tech in a relaxed atmosphere.
For those interested in agile development, the Agile Track has been expanded to 17
sessions over the full three days. There is also <a href="http://www.partywithpalermo.com/">Party
with Palermo</a>, a keynote by Scott Hanselman (Microsoft), and .NET Rocks Panel Discussion
with Scott Bellware, Ted Neward, and Oren Eini. If you've been itching to learn about
TDD, Silverlight, WPF, SQL CLR, or other topics, there are one-day pre-/post-conference
sessions available at reasonable prices. DevTeach is a fun and amazing learning experience.
Hope to see you there! You can register <a href="http://www.devteach.com/Register.aspx">here</a>.
</p>
        <img width="0" height="0" src="http://www.jameskovacs.com/blog/aggbug.ashx?id=9273c877-0c27-4904-a5b9-7a986d172f23" />
      </body>
      <title>DevTeach Toronto Coming Up Fast</title>
      <guid isPermaLink="false">http://www.jameskovacs.com/blog/PermaLink.aspx?guid=9273c877-0c27-4904-a5b9-7a986d172f23</guid>
      <link>http://www.jameskovacs.com/blog/DevTeachTorontoComingUpFast.aspx</link>
      <pubDate>Tue, 29 Apr 2008 17:53:50 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://www.devteach.com"&gt;DevTeach&lt;/a&gt; is happening May 12-16, 2008, this
time in Toronto, Canada. DevTeach is a fantastic conference and that's not because
I'm speaking there or organizing the &lt;a href="http://www.devteach.com/Session.aspx#90"&gt;Agile
Track&lt;/a&gt; - though those are good reasons too. Just take a look at the line-up of &lt;a href="http://www.devteach.com/Speaker.aspx"&gt;internationally
known speakers&lt;/a&gt;. Attendance is purposely capped in the hundreds to encourage speakers
and attendees to meet, chat, dine, drink, and otherwise talk tech in a relaxed atmosphere.
For those interested in agile development, the Agile Track has been expanded to 17
sessions over the full three days. There is also &lt;a href="http://www.partywithpalermo.com/"&gt;Party
with Palermo&lt;/a&gt;, a keynote by Scott Hanselman (Microsoft), and .NET Rocks Panel Discussion
with Scott Bellware, Ted Neward, and Oren Eini. If you've been itching to learn about
TDD, Silverlight, WPF, SQL CLR, or other topics, there are one-day pre-/post-conference
sessions available at reasonable prices. DevTeach is a fun and amazing learning experience.
Hope to see you there! You can register &lt;a href="http://www.devteach.com/Register.aspx"&gt;here&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.jameskovacs.com/blog/aggbug.ashx?id=9273c877-0c27-4904-a5b9-7a986d172f23" /&gt;</description>
      <comments>http://www.jameskovacs.com/blog/CommentView.aspx?guid=9273c877-0c27-4904-a5b9-7a986d172f23</comments>
      <category>Events</category>
    </item>
    <item>
      <trackback:ping>http://www.jameskovacs.com/blog/Trackback.aspx?guid=edd2ba9a-c024-4a98-b273-646dec223eef</trackback:ping>
      <pingback:server>http://www.jameskovacs.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.jameskovacs.com/blog/PermaLink.aspx?guid=edd2ba9a-c024-4a98-b273-646dec223eef</pingback:target>
      <dc:creator>James Kovacs</dc:creator>
      <wfw:comment>http://www.jameskovacs.com/blog/CommentView.aspx?guid=edd2ba9a-c024-4a98-b273-646dec223eef</wfw:comment>
      <wfw:commentRss>http://www.jameskovacs.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=edd2ba9a-c024-4a98-b273-646dec223eef</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This morning I was getting ready to record a screencast about ReSharper 4 EAP. To
make it easier for people to follow along, I launched <a href="http://weblogs.asp.net/rosherove/">Roy
Osherove's</a> excellent utility, <a href="http://weblogs.asp.net/rosherove/archive/2007/06/03/train-to-be-a-keyboard-master-with-keyboard-jedi.aspx">Keyboard
Jedi</a>. Rather than the expected result, this friendly dialog box greeted me:
</p>
        <p>
          <a href="http://www.jameskovacs.com/blog/content/binary/WindowsLiveWriter/KeyboardJedionVistax64_98A8/image_thumb%5B2%5D_4.png">
            <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="215" alt="image_thumb[2]" src="http://www.jameskovacs.com/blog/content/binary/WindowsLiveWriter/KeyboardJedionVistax64_98A8/image_thumb%5B2%5D_thumb_1.png" width="408" border="0" />
          </a>
        </p>
        <h3>Living La Vida x64
</h3>
        <p>
My main development machine is running Vista x64. I've used KeyJedi frequently on
my Vista x86 laptop and never had a problem. So I immediately suspected a 64-bit compatibility
issue. KeyJedi is a .NET 2.0 application, which means that it will execute on the
64-bit CLR if available. (The 64-bit CLR was introduced with .NET 2.0. You don't have
to do anything special. If you install .NET 2.0 or higher on 64-bit Windows, the 64-bit
CLR is installed automatically.) The 64-bit CLR uses a 64-bit JIT compiler, which
produces x64 (or IA64)* machine code. This is why things like Paint.NET's Gaussian
Blur, which involves a lot of 64-bit arithmetic, run faster on 64-bit Windows. The
MSIL is identical, but on 64-bit platforms, the JIT produces 64-bit optimized code.
For example, a 64-bit ADD can be done in a single instruction on 64-bit hardware,
but requires multiple instructions on 32-bit. (N.B. If you're running 32-bit Windows
on 64-bit hardware, there is no way to access the 64-bit capabilities of the chip
as the OS thinks it's running on a 32-bit chip.)
</p>
        <p>
* x64 is the 64-bit enhanced, x86-compatible instruction set introduced by AMD. IA64
is used by Intel's Itanium processors and is incompatible with x86. So you have to
recompile the world to use IA64. Once Intel realized that not everyone on the planet
was willing to recompile their programs, they introduced EMT64 for the Pentiums and
Core chips. EMT64 is functionally identical to x64 from AMD.
</p>
        <h3>WoW
</h3>
        <p>
So on Vista x64, KeyJedi is running on the 64-bit CLR. But that doesn't explain why
it fails. Most programs, like Paint.NET, just work. What is KeyJedi doing that is
special and incompatible with 64-bit Windows? It is registering global system hooks
to capture keyboard and mouse messages. Registering hooks and receiving messages involves
Win32 calls, which are handled by Michael Kennedy's <a href="http://www.codeproject.com/KB/system/globalsystemhook.aspx">Global
System Hooks in .NET library</a>. This library includes both managed (Kennedy.ManagedHooks.dll)
and unmanaged (SystemHookCore.dll) code. SystemHookCore.dll makes 32-bit Win32 calls
and receives 32-bit callbacks. You cannot make 32-bit Win32 calls directly to the
64-bit Windows kernel. You need a translation layer, which is the Windows-on-Windows
or WoW layer.
</p>
        <p>
The WoW layer marshals 32-bit Win32 calls to and from their 64-bit equivalent, translating
data structures on the way in and out. This marvelous piece of magic is built into
64-bit Windows and allows most 32-bit programs to execute on 64-bit Windows without
problem. The WoW layer sits below all 32-bit processes happily marshalling system
calls back and forth. If you're running in a 64-bit process, such as the 64-bit CLR
host, there is no WoW layer beneath you. So you cannot load 32-bit DLL, such as SystemHookCore.dll.
(This is also why 32-bit kernel-mode drivers don't work on 64-bit Windows. There is
no WoW layer in the kernel. It exists between user and kernel mode.)
</p>
        <p>
Now we know the problem. The question is how to fix it. We could create a 64-bit version
of SystemHookCore.dll, but that would involve a lot of spelunking and debugging of
unmanaged C++ code. Not exactly how I want to spend my morning. The other option is
to force KeyJedi to run on the 32-bit CLR even on 64-bit Windows. Then we would have
the WoW layer beneath us and SystemHookCore.dll could merrily assume that it is running
on 32-bit Windows while the WoW layer takes care of all the 32-bit to 64-bit Win32
marshalling. So how do we force a managed application to run on the 32-bit CLR...
</p>
        <h3>Any CPU vs. x86
</h3>
        <p>
The easiest technique is to modify your project settings in Visual Studio. Just go
to Project Properties... Build... Platform target and change it from Any CPU to x86.
</p>
        <p>
          <a href="http://www.jameskovacs.com/blog/content/binary/WindowsLiveWriter/KeyboardJedionVistax64_98A8/image_thumb%5B9%5D_4.png">
            <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="517" alt="image_thumb[9]" src="http://www.jameskovacs.com/blog/content/binary/WindowsLiveWriter/KeyboardJedionVistax64_98A8/image_thumb%5B9%5D_thumb_1.png" width="673" border="0" />
          </a>
        </p>
        <p>
Now you might think, "Wait a second. I'm compiling to MSIL, which is processor independent."
Yes, you are, but when you select Any CPU (the default), your program will load on
the 64-bit CLR if available. By selecting x86, you are forcing the program to run
on the 32-bit CLR. Then just recompile your program and problem solved. Just one problem...
Roy never released the source. (Yes, I've emailed Roy and asked him to do recompile
with x86 as the target platform.)
</p>
        <h3>No Source, No Problem
</h3>
        <p>
We don't want to modify the application, just ask it to run on the 32-bit CLR. Turns
out that the project settings above just twiddle the CORFLAGS inside the PE file header
of the executable. The .NET Framework SDK ships with a program called corflags.exe
for just this purpose:
</p>
        <p>
          <a href="http://www.jameskovacs.com/blog/content/binary/WindowsLiveWriter/KeyboardJedionVistax64_98A8/image_thumb%5B12%5D_4.png">
            <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="228" alt="image_thumb[12]" src="http://www.jameskovacs.com/blog/content/binary/WindowsLiveWriter/KeyboardJedionVistax64_98A8/image_thumb%5B12%5D_thumb_1.png" width="673" border="0" />
          </a>
        </p>
        <p>
You'll notice that 32BIT has a value of 0, which means Any CPU. We want to twiddle
this to 1. One little problem. The assembly is signed. Twiddling even a single bit
will invalidate the signature and the CLR loader will prevent the application from
loading. If the assembly weren't signed, you could just execute:
</p>
        <p>
corflags KeyJedi.exe /32BIT+
</p>
        <h3>ILDASM to the Rescue
</h3>
        <p>
Time to bring out the big guns. We're going to disassemble KeyJedi.exe into MSIL.
Hold onto your hats...
</p>
        <p>
ildasm /all KeyJedi.exe /out=KeyJedi.il
</p>
        <p>
This produces three files:
</p>
        <p>
KeyJedi.il
</p>
        <p>
KeyJedi.res
</p>
        <p>
Osherove.KeyJedi.MainForm.resources
</p>
        <p>
Time to hack some MSIL... Open KeyJedi.il in your text editor of choice and search
for ".corflags". Change the line to:
</p>
        <p>
.corflags 0x0000000b    //  ILONLY 32BITREQUIRED
</p>
        <p>
We can't compile the code yet because we don't have the private key that matches the
public key embedded in the MSIL. Search for .publickey and delete it. (You could change
it to your own public key generated with sn -k, but there's no reason that we need
to sign the assembly.) Now we can re-compile the MSIL using ilasm:
</p>
        <p>
ilasm /res:KeyJedi.res KeyJedi.il /output:KeyJedi-x86.exe
</p>
        <p>
If we execute KeyJedi-x86.exe, we get:
</p>
        <p>
          <a href="http://www.jameskovacs.com/blog/content/binary/WindowsLiveWriter/KeyboardJedionVistax64_98A8/image_thumb%5B14%5D_4.png">
            <img height="232" alt="image_thumb[14]" src="http://www.jameskovacs.com/blog/content/binary/WindowsLiveWriter/KeyboardJedionVistax64_98A8/image_thumb%5B14%5D_thumb_1.png" width="248" border="0" />
          </a>
        </p>
        <p>
Success!!! KeyJedi is now running on Vista x64.
</p>
        <h3>Postscript
</h3>
        <p>
I'm not going to redistribute the recompiled binary because KeyJedi is Roy's baby
and the fix is really straightforward for him to make. Look to his blog for an update.
My main purpose was to help people better understand 64-bit compatibility issues and
some tricks that 64-bit Windows does so that, in most cases, you aren't forced to
recompile the world to run the programs you've come to depend on.
</p>
        <img width="0" height="0" src="http://www.jameskovacs.com/blog/aggbug.ashx?id=edd2ba9a-c024-4a98-b273-646dec223eef" />
      </body>
      <title>Keyboard Jedi on Vista x64</title>
      <guid isPermaLink="false">http://www.jameskovacs.com/blog/PermaLink.aspx?guid=edd2ba9a-c024-4a98-b273-646dec223eef</guid>
      <link>http://www.jameskovacs.com/blog/KeyboardJediOnVistaX64.aspx</link>
      <pubDate>Fri, 25 Apr 2008 16:52:53 GMT</pubDate>
      <description>&lt;p&gt;
This morning I was getting ready to record a screencast about ReSharper 4 EAP. To
make it easier for people to follow along, I launched &lt;a href="http://weblogs.asp.net/rosherove/"&gt;Roy
Osherove's&lt;/a&gt; excellent utility, &lt;a href="http://weblogs.asp.net/rosherove/archive/2007/06/03/train-to-be-a-keyboard-master-with-keyboard-jedi.aspx"&gt;Keyboard
Jedi&lt;/a&gt;. Rather than the expected result, this friendly dialog box greeted me:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.jameskovacs.com/blog/content/binary/WindowsLiveWriter/KeyboardJedionVistax64_98A8/image_thumb%5B2%5D_4.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="215" alt="image_thumb[2]" src="http://www.jameskovacs.com/blog/content/binary/WindowsLiveWriter/KeyboardJedionVistax64_98A8/image_thumb%5B2%5D_thumb_1.png" width="408" border="0"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;h3&gt;Living La Vida x64
&lt;/h3&gt;
&lt;p&gt;
My main development machine is running Vista x64. I've used KeyJedi frequently on
my Vista x86 laptop and never had a problem. So I immediately suspected a 64-bit compatibility
issue. KeyJedi is a .NET 2.0 application, which means that it will execute on the
64-bit CLR if available. (The 64-bit CLR was introduced with .NET 2.0. You don't have
to do anything special. If you install .NET 2.0 or higher on 64-bit Windows, the 64-bit
CLR is installed automatically.) The 64-bit CLR uses a 64-bit JIT compiler, which
produces x64 (or IA64)* machine code. This is why things like Paint.NET's Gaussian
Blur, which involves a lot of 64-bit arithmetic, run faster on 64-bit Windows. The
MSIL is identical, but on 64-bit platforms, the JIT produces 64-bit optimized code.
For example, a 64-bit ADD can be done in a single instruction on 64-bit hardware,
but requires multiple instructions on 32-bit. (N.B. If you're running 32-bit Windows
on 64-bit hardware, there is no way to access the 64-bit capabilities of the chip
as the OS thinks it's running on a 32-bit chip.)
&lt;/p&gt;
&lt;p&gt;
* x64 is the 64-bit enhanced, x86-compatible instruction set introduced by AMD. IA64
is used by Intel's Itanium processors and is incompatible with x86. So you have to
recompile the world to use IA64. Once Intel realized that not everyone on the planet
was willing to recompile their programs, they introduced EMT64 for the Pentiums and
Core chips. EMT64 is functionally identical to x64 from AMD.
&lt;/p&gt;
&lt;h3&gt;WoW
&lt;/h3&gt;
&lt;p&gt;
So on Vista x64, KeyJedi is running on the 64-bit CLR. But that doesn't explain why
it fails. Most programs, like Paint.NET, just work. What is KeyJedi doing that is
special and incompatible with 64-bit Windows? It is registering global system hooks
to capture keyboard and mouse messages. Registering hooks and receiving messages involves
Win32 calls, which are handled by Michael Kennedy's &lt;a href="http://www.codeproject.com/KB/system/globalsystemhook.aspx"&gt;Global
System Hooks in .NET library&lt;/a&gt;. This library includes both managed (Kennedy.ManagedHooks.dll)
and unmanaged (SystemHookCore.dll) code. SystemHookCore.dll makes 32-bit Win32 calls
and receives 32-bit callbacks. You cannot make 32-bit Win32 calls directly to the
64-bit Windows kernel. You need a translation layer, which is the Windows-on-Windows
or WoW layer.
&lt;/p&gt;
&lt;p&gt;
The WoW layer marshals 32-bit Win32 calls to and from their 64-bit equivalent, translating
data structures on the way in and out. This marvelous piece of magic is built into
64-bit Windows and allows most 32-bit programs to execute on 64-bit Windows without
problem. The WoW layer sits below all 32-bit processes happily marshalling system
calls back and forth. If you're running in a 64-bit process, such as the 64-bit CLR
host, there is no WoW layer beneath you. So you cannot load 32-bit DLL, such as SystemHookCore.dll.
(This is also why 32-bit kernel-mode drivers don't work on 64-bit Windows. There is
no WoW layer in the kernel. It exists between user and kernel mode.)
&lt;/p&gt;
&lt;p&gt;
Now we know the problem. The question is how to fix it. We could create a 64-bit version
of SystemHookCore.dll, but that would involve a lot of spelunking and debugging of
unmanaged C++ code. Not exactly how I want to spend my morning. The other option is
to force KeyJedi to run on the 32-bit CLR even on 64-bit Windows. Then we would have
the WoW layer beneath us and SystemHookCore.dll could merrily assume that it is running
on 32-bit Windows while the WoW layer takes care of all the 32-bit to 64-bit Win32
marshalling. So how do we force a managed application to run on the 32-bit CLR...
&lt;/p&gt;
&lt;h3&gt;Any CPU vs. x86
&lt;/h3&gt;
&lt;p&gt;
The easiest technique is to modify your project settings in Visual Studio. Just go
to Project Properties... Build... Platform target and change it from Any CPU to x86.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.jameskovacs.com/blog/content/binary/WindowsLiveWriter/KeyboardJedionVistax64_98A8/image_thumb%5B9%5D_4.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="517" alt="image_thumb[9]" src="http://www.jameskovacs.com/blog/content/binary/WindowsLiveWriter/KeyboardJedionVistax64_98A8/image_thumb%5B9%5D_thumb_1.png" width="673" border="0"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Now you might think, "Wait a second. I'm compiling to MSIL, which is processor independent."
Yes, you are, but when you select Any CPU (the default), your program will load on
the 64-bit CLR if available. By selecting x86, you are forcing the program to run
on the 32-bit CLR. Then just recompile your program and problem solved. Just one problem...
Roy never released the source. (Yes, I've emailed Roy and asked him to do recompile
with x86 as the target platform.)
&lt;/p&gt;
&lt;h3&gt;No Source, No Problem
&lt;/h3&gt;
&lt;p&gt;
We don't want to modify the application, just ask it to run on the 32-bit CLR. Turns
out that the project settings above just twiddle the CORFLAGS inside the PE file header
of the executable. The .NET Framework SDK ships with a program called corflags.exe
for just this purpose:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.jameskovacs.com/blog/content/binary/WindowsLiveWriter/KeyboardJedionVistax64_98A8/image_thumb%5B12%5D_4.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="228" alt="image_thumb[12]" src="http://www.jameskovacs.com/blog/content/binary/WindowsLiveWriter/KeyboardJedionVistax64_98A8/image_thumb%5B12%5D_thumb_1.png" width="673" border="0"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
You'll notice that 32BIT has a value of 0, which means Any CPU. We want to twiddle
this to 1. One little problem. The assembly is signed. Twiddling even a single bit
will invalidate the signature and the CLR loader will prevent the application from
loading. If the assembly weren't signed, you could just execute:
&lt;/p&gt;
&lt;p&gt;
corflags KeyJedi.exe /32BIT+
&lt;/p&gt;
&lt;h3&gt;ILDASM to the Rescue
&lt;/h3&gt;
&lt;p&gt;
Time to bring out the big guns. We're going to disassemble KeyJedi.exe into MSIL.
Hold onto your hats...
&lt;/p&gt;
&lt;p&gt;
ildasm /all KeyJedi.exe /out=KeyJedi.il
&lt;/p&gt;
&lt;p&gt;
This produces three files:
&lt;/p&gt;
&lt;p&gt;
KeyJedi.il
&lt;/p&gt;
&lt;p&gt;
KeyJedi.res
&lt;/p&gt;
&lt;p&gt;
Osherove.KeyJedi.MainForm.resources
&lt;/p&gt;
&lt;p&gt;
Time to hack some MSIL... Open KeyJedi.il in your text editor of choice and search
for ".corflags". Change the line to:
&lt;/p&gt;
&lt;p&gt;
.corflags 0x0000000b&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp; ILONLY 32BITREQUIRED
&lt;/p&gt;
&lt;p&gt;
We can't compile the code yet because we don't have the private key that matches the
public key embedded in the MSIL. Search for .publickey and delete it. (You could change
it to your own public key generated with sn -k, but there's no reason that we need
to sign the assembly.) Now we can re-compile the MSIL using ilasm:
&lt;/p&gt;
&lt;p&gt;
ilasm /res:KeyJedi.res KeyJedi.il /output:KeyJedi-x86.exe
&lt;/p&gt;
&lt;p&gt;
If we execute KeyJedi-x86.exe, we get:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.jameskovacs.com/blog/content/binary/WindowsLiveWriter/KeyboardJedionVistax64_98A8/image_thumb%5B14%5D_4.png"&gt;&lt;img height="232" alt="image_thumb[14]" src="http://www.jameskovacs.com/blog/content/binary/WindowsLiveWriter/KeyboardJedionVistax64_98A8/image_thumb%5B14%5D_thumb_1.png" width="248" border="0"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Success!!! KeyJedi is now running on Vista x64.
&lt;/p&gt;
&lt;h3&gt;Postscript
&lt;/h3&gt;
&lt;p&gt;
I'm not going to redistribute the recompiled binary because KeyJedi is Roy's baby
and the fix is really straightforward for him to make. Look to his blog for an update.
My main purpose was to help people better understand 64-bit compatibility issues and
some tricks that 64-bit Windows does so that, in most cases, you aren't forced to
recompile the world to run the programs you've come to depend on.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.jameskovacs.com/blog/aggbug.ashx?id=edd2ba9a-c024-4a98-b273-646dec223eef" /&gt;</description>
      <comments>http://www.jameskovacs.com/blog/CommentView.aspx?guid=edd2ba9a-c024-4a98-b273-646dec223eef</comments>
      <category>.NET General;.NET Tools</category>
    </item>
    <item>
      <trackback:ping>http://www.jameskovacs.com/blog/Trackback.aspx?guid=ab3023b6-8670-409f-b4fe-467df0f4a8e7</trackback:ping>
      <pingback:server>http://www.jameskovacs.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.jameskovacs.com/blog/PermaLink.aspx?guid=ab3023b6-8670-409f-b4fe-467df0f4a8e7</pingback:target>
      <dc:creator>James Kovacs</dc:creator>
      <wfw:comment>http://www.jameskovacs.com/blog/CommentView.aspx?guid=ab3023b6-8670-409f-b4fe-467df0f4a8e7</wfw:comment>
      <wfw:commentRss>http://www.jameskovacs.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=ab3023b6-8670-409f-b4fe-467df0f4a8e7</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Earlier today, an unknown hacker exploited a security vulnerability in <a href="http://www.screwturn.eu">ScrewTurn
Wiki</a> and replaced the <a href="http://altnetpedia.com">altnetpedia site</a> with
pron links. I have restored the site and upgraded to the latest version of ScrewTurn,
which is v2.0.30. (We were running v2.0.21 and the vulnerability was fixed in v2.0.24.)
My bad for not keeping the site updated with latest. I apologize to the ALT.NET community
for not being more vigilant with patches to the wiki software. I've added the ScrewTurn
RSS feed to my reader to keep me apprised of future fixes.
</p>
        <p>
To the unknown hacker, I hope that you're satisfied. I had booked the afternoon off
to take my two boys (ages 3 and 5) to the Science Centre, but instead spent it undoing
your evil.
</p>
        <img width="0" height="0" src="http://www.jameskovacs.com/blog/aggbug.ashx?id=ab3023b6-8670-409f-b4fe-467df0f4a8e7" />
      </body>
      <title>altnetpedia Back in Business</title>
      <guid isPermaLink="false">http://www.jameskovacs.com/blog/PermaLink.aspx?guid=ab3023b6-8670-409f-b4fe-467df0f4a8e7</guid>
      <link>http://www.jameskovacs.com/blog/altnetpediaBackInBusiness.aspx</link>
      <pubDate>Tue, 22 Apr 2008 23:36:19 GMT</pubDate>
      <description>&lt;p&gt;
Earlier today, an unknown hacker exploited a security vulnerability in &lt;a href="http://www.screwturn.eu"&gt;ScrewTurn
Wiki&lt;/a&gt; and replaced the &lt;a href="http://altnetpedia.com"&gt;altnetpedia site&lt;/a&gt; with
pron links. I have restored the site and upgraded to the latest version of ScrewTurn,
which is v2.0.30. (We were running v2.0.21 and the vulnerability was fixed in v2.0.24.)
My bad for not keeping the site updated with latest. I apologize to the ALT.NET community
for not being more vigilant with patches to the wiki software. I've added the ScrewTurn
RSS feed to my reader to keep me apprised of future fixes.
&lt;/p&gt;
&lt;p&gt;
To the unknown hacker, I hope that you're satisfied. I had booked the afternoon off
to take my two boys (ages 3 and 5) to the Science Centre, but instead spent it undoing
your evil.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.jameskovacs.com/blog/aggbug.ashx?id=ab3023b6-8670-409f-b4fe-467df0f4a8e7" /&gt;</description>
      <comments>http://www.jameskovacs.com/blog/CommentView.aspx?guid=ab3023b6-8670-409f-b4fe-467df0f4a8e7</comments>
      <category>Miscellaneous</category>
    </item>
    <item>
      <trackback:ping>http://www.jameskovacs.com/blog/Trackback.aspx?guid=03bf0f76-3075-407e-9c9e-602002f6bb8f</trackback:ping>
      <pingback:server>http://www.jameskovacs.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.jameskovacs.com/blog/PermaLink.aspx?guid=03bf0f76-3075-407e-9c9e-602002f6bb8f</pingback:target>
      <dc:creator>James Kovacs</dc:creator>
      <wfw:comment>http://www.jameskovacs.com/blog/CommentView.aspx?guid=03bf0f76-3075-407e-9c9e-602002f6bb8f</wfw:comment>
      <wfw:commentRss>http://www.jameskovacs.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=03bf0f76-3075-407e-9c9e-602002f6bb8f</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <title>Breaking Dependencies</title>
      <guid isPermaLink="false">http://www.jameskovacs.com/blog/PermaLink.aspx?guid=03bf0f76-3075-407e-9c9e-602002f6bb8f</guid>
      <link>http://www.jameskovacs.com/blog/BreakingDependencies.aspx</link>
      <pubDate>Sat, 29 Mar 2008 23:10:13 GMT</pubDate>
      <description>&lt;p&gt;
During &lt;a href="http://blogs.msdn.com/geekspeak/archive/2008/03/25/next-geekspeak-tame-your-software-dependencies-with-james-kovacs-wednesday-march-26-2008.aspx"&gt;my
geekSpeak screencast&lt;/a&gt; last week, one of the attendees asked:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Any recommendations for refactoring existing code to insert interfaces? (e.g., what's
the best dependency to break first, the database?)
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Excellent question! Most of us do not have the luxury of working on greenfield projects,
but instead work on &lt;a href="http://www.igloocoder.com/archive/2007/12/23/what-is-brownfield.aspx" target="_blank"&gt;brownfield
projects&lt;/a&gt; - existing applications that could use some tender loving care. Brownfield
projects are often inflicted with legacy code. What do I mean by legacy code? I agree
with Michael Feathers' definition:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Legacy code is simple code without tests.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Michael elaborates further saying:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Code without tests is bad code. It doesn't matter how well written it is; it doesn't
matter how pretty or object-oriented or well-encapsulated it is. With tests, we can
change the behavior of our code quickly and verifiably. Without them, we really don't
know if our code is getting better or worse.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
If you haven't read Michael's book, &lt;a href="http://www.amazon.com/gp/product/0131177052?ie=UTF8&amp;amp;tag=jamkovweb-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0131177052" target="_blank"&gt;&lt;em&gt;Working
Effectively with Legacy Code&lt;/em&gt;&lt;/a&gt;, you really must. It is on my short list of
must-read development books. Michael provides excellent strategies and patterns for
safely implementing tests around untested code, which is crucial in order to make
non-breaking changes to an existing application AKA refactoring. If you can refactor
your code, you can improve your code.
&lt;/p&gt;
&lt;p&gt;
Now back to the question at hand... Which dependency to break first? Let me turn the
question around. Which dependency is causing you the most pain?
&lt;/p&gt;
&lt;p&gt;
In my experience, it is typically the database as round-tripping to a database on
each test to fetch or save data dramatically slows the tests down. If you have slow
tests, you'll be unlikely to run them as often and then the tests start to lose their
value as a safety net. (N.B. You still want integration tests that access the database.
You just don't want each and every unit test to do so.) As well it requires a lot
of effort to keep consistent data for tests, often using test data setup scripts or
rolling back transactions at the end of tests.
&lt;/p&gt;
&lt;p&gt;
Other areas that often cause pain are integration points - web services, DCOM/Enterprise
Services, external text files, ... Anywhere your application is relying on an external
application. Integration points are problems for tests because if you're relying on
them, your tests will fail when the external applications are unavailable due to crashes,
service outages, integration point upgrades, external network failures, behaviour
changes, ... Imagine that your e-commerce website integrates with 6 external systems
(credit card processor, credit check, inventory, sales, address verification, and
shipping). Your development environment integrates with DEV/QA versions of each of
these services. Each service has 95% uptime, which translates into 1.5 days of downtime
a month for maintenance, upgrades, and unexpected outages. The chance of all systems
being available is the product of their availabilities or 95%*95%*95%*95%*95%*95%=73.5%
uptime for all 6 integration points. If your tests directly use these test systems,
your test suite will fail over 25% of the time for reasons beyond your control. Now
is that because you introduced a breaking change or because one of your integration
points is temporarily unavailable or misbehaving? Life gets worse when you integrate
with more systems or when the availability of those systems is lower. Imagine you
have to integrate with 12 integration points with 95% availability - your test suite
will only pass 54% of the time. Or if your 6 test systems only have 90% availability,
your test suite only passes 53% of the time. In each case, it's a coin toss whether
you know for certain whether the change you just made broke the application. When
you start getting a lot of false negatives (failing tests when the problem is in an
integration point), you stop trusting your tests and you're essentially flying without
a parachute. 
&lt;br&gt;
By decoupling yourself from your integration points by using interfaces for the majority
of your tests, you know that the code base is healthy and you can separately test
the interactions with your integration points.
&lt;/p&gt;
&lt;p&gt;
To figure out which dependency to break first, take a critical look at your codebase.
What is causing you the most pain? Pain can manifest itself as long debug sessions,
waiting for external services to be available, high bug counts, ... Solve the pain
by decoupling yourself from that dependency. Then look at what is now causing you
the most pain and solve that. Lather, rinse, repeat. It might take a few weeks or
months, but eventually you'll have a codebase that is a pleasure to work with. If
you don't believe me, read this email that I received from Karl (originally posted &lt;a href="http://www.jameskovacs.com/blog/WhyIDoWhatIDo.aspx" target="_blank"&gt;here&lt;/a&gt;):
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Hi James, 
&lt;/p&gt;
&lt;p&gt;
I'm writing you because I just wanted to thank you! 
&lt;/p&gt;
&lt;p&gt;
It was about two months ago and I attended TechEd/Orlando. I have to say that it was
the first time for me and it really was an honor to be the one and only chosen from
approximately 300 software developers working in my company to go to Orlando. I was
very impressed about the good quality of the sessions, especially on the architecture
track, but your tiny little discussion on Tuesday evening really opened my mind. At
that time I had been working as a software developer for 7 years with about 5 years
experience in software design and project management and 5 years of .NET experience.
I was fighting with a 400,000 LOC .NET legacy monster that's used by public safety
agencies around the world in security related areas. I have a team of 12 developers
and we were trying really hard to keep this beast up and running and extend it with
new features. I think you can imagine that most of the time we were using the trial
and error approach to get new features in (just hack it in and prepare for long debugging
sessions hunting weird bugs in parts of the application you never expected to be affected
by the new feature…). The main problem was - guess what - the dependencies. There
were about 50 classes (all singleton "Managers"), and every single manager was tied
to at least 10 other managers - no interfaces at all - and that's just one of several
layers of the app... We knew that dependencies were our problem, but we had no clue
how to solve it - there was this chicken/egg problem - I want to decouple my system,
which needs a lot of refactoring. To ensure that I don't break anything I'd need unit
tests but I can't use them because my system is so highly coupled &lt;img alt="&lt;img alt=";-)" src="smilies/wink.gif"&gt;"
src="http://www.jameskovacs.com/blog/smilies/wink.gif"&gt; We have tried TypeMock, but
my feeling was that this went in the wrong direction. Needless to say that this attempt
failed. 
&lt;/p&gt;
&lt;p&gt;
During the discussion after your session you gave me some quite useful hints: 
&lt;/p&gt;
&lt;p&gt;
1. Read &lt;a href="http://www.amazon.com/gp/product/0321268202?ie=UTF8&amp;amp;tag=jamkovweb-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321268202"&gt;Applying
Domain Driven Design and Patterns&lt;/a&gt; by Jimmy Nilsson 
&lt;br&gt;
2. Read &lt;a href="http://www.amazon.com/gp/product/0321268202?ie=UTF8&amp;amp;tag=jamkovweb-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321268202"&gt;Working
Effectively with Legacy Code&lt;/a&gt; by Michael Feathers 
&lt;br&gt;
3. Use ReSharper (especially for Refactoring) 
&lt;br&gt;
4. Use a Mock-Framework (preferably RhinoMocks) 
&lt;br&gt;
5. Use a Dependency Injection Framework like Spring.NET 
&lt;/p&gt;
&lt;p&gt;
I bought Jimmy Nilsson's book in the conference store and read it cover to cover on
my flight back to Vienna. Then I bought the second book and read it within one week.
I started to use ReSharper more extensively to apply some of the patterns from Michael
Feathers' book to get some unit tests in place. I extracted a lot of interfaces, brought
Spring.NET into action and used RhinoMocks and the VS2005 built in UnitTest-Framework
to write some useful unit tests. I also used the built in code coverage functionality
in combination with the unit tests. In addition we already started Design for a messaging
based service application that we want to develop in a very TDDish style. 
&lt;/p&gt;
&lt;p&gt;
As you can see there's a lot going on since I attended your session. It was really
this discussion about agile principles that gave me sort of a boost. 
&lt;/p&gt;
&lt;p&gt;
So again - thanks for opening my mind and keep on doing this great work! 
&lt;/p&gt;
&lt;p&gt;
Regards, 
&lt;br&gt;
Karl
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
In my opinion, Karl and his team are the real heroes here. You can be a hero too by &lt;a href="http://msdn2.microsoft.com/en-us/magazine/cc337885.aspx"&gt;taming
your software dependencies&lt;/a&gt;!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.jameskovacs.com/blog/aggbug.ashx?id=03bf0f76-3075-407e-9c9e-602002f6bb8f" /&gt;</description>
      <comments>http://www.jameskovacs.com/blog/CommentView.aspx?guid=03bf0f76-3075-407e-9c9e-602002f6bb8f</comments>
      <category>.NET General;Agile;Presentations;Software Design</category>
    </item>
    <item>
      <trackback:ping>http://www.jameskovacs.com/blog/Trackback.aspx?guid=d9cbf72a-546c-4b15-a961-156b954de07f</trackback:ping>
      <pingback:server>http://www.jameskovacs.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.jameskovacs.com/blog/PermaLink.aspx?guid=d9cbf72a-546c-4b15-a961-156b954de07f</pingback:target>
      <dc:creator>James Kovacs</dc:creator>
      <wfw:comment>http://www.jameskovacs.com/blog/CommentView.aspx?guid=d9cbf72a-546c-4b15-a961-156b954de07f</wfw:comment>
      <wfw:commentRss>http://www.jameskovacs.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=d9cbf72a-546c-4b15-a961-156b954de07f</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Today at lunch* I'll be joining Glen Gordon and Lynn Langit on <a href="http://blogs.msdn.com/geekspeak/">geekSpeak</a> to
talk about Taming Your Software Dependencies. Specifically I'll be talking about moving
from tightly-coupled to loosely-coupled architectures using dependency inversion,
dependency injection, and inversion of control containers. geekSpeak is an interactive
LiveMeeting driven by audience questions with no PowerPoint and lots of code. Come
and geek out with me on geekSpeak! Register <a href="http://msevents.microsoft.com/cui/WebCastEventDetails.aspx?EventID=1032369634&amp;EventCategory=4&amp;culture=en-US&amp;CountryCode=US">here</a>.
</p>
        <p>
* Today at lunch == Wednesday, March 26, 2008 from 12-1pm PST or 1-2pm MST or 2-3pm
CST or 3-4pm EST or ...
</p>
        <img width="0" height="0" src="http://www.jameskovacs.com/blog/aggbug.ashx?id=d9cbf72a-546c-4b15-a961-156b954de07f" />
      </body>
      <title>Tame Your Software Dependencies on geekSpeak</title>
      <guid isPermaLink="false">http://www.jameskovacs.com/blog/PermaLink.aspx?guid=d9cbf72a-546c-4b15-a961-156b954de07f</guid>
      <link>http://www.jameskovacs.com/blog/TameYourSoftwareDependenciesOnGeekSpeak.aspx</link>
      <pubDate>Wed, 26 Mar 2008 15:16:49 GMT</pubDate>
      <description>&lt;p&gt;
Today at lunch* I'll be joining Glen Gordon and Lynn Langit on &lt;a href="http://blogs.msdn.com/geekspeak/"&gt;geekSpeak&lt;/a&gt; to
talk about Taming Your Software Dependencies. Specifically I'll be talking about moving
from tightly-coupled to loosely-coupled architectures using dependency inversion,
dependency injection, and inversion of control containers. geekSpeak is an interactive
LiveMeeting driven by audience questions with no PowerPoint and lots of code. Come
and geek out with me on geekSpeak! Register &lt;a href="http://msevents.microsoft.com/cui/WebCastEventDetails.aspx?EventID=1032369634&amp;amp;EventCategory=4&amp;amp;culture=en-US&amp;amp;CountryCode=US"&gt;here&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
* Today at lunch == Wednesday, March 26, 2008 from 12-1pm PST or 1-2pm MST or 2-3pm
CST or 3-4pm EST or ...
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.jameskovacs.com/blog/aggbug.ashx?id=d9cbf72a-546c-4b15-a961-156b954de07f" /&gt;</description>
      <comments>http://www.jameskovacs.com/blog/CommentView.aspx?guid=d9cbf72a-546c-4b15-a961-156b954de07f</comments>
      <category>.NET General;Agile;Presentations;Software Design</category>
    </item>
    <item>
      <trackback:ping>http://www.jameskovacs.com/blog/Trackback.aspx?guid=b3bc3324-e3fa-4ae0-8323-0e276e351c66</trackback:ping>
      <pingback:server>http://www.jameskovacs.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.jameskovacs.com/blog/PermaLink.aspx?guid=b3bc3324-e3fa-4ae0-8323-0e276e351c66</pingback:target>
      <dc:creator>James Kovacs</dc:creator>
      <wfw:comment>http://www.jameskovacs.com/blog/CommentView.aspx?guid=b3bc3324-e3fa-4ae0-8323-0e276e351c66</wfw:comment>
      <wfw:commentRss>http://www.jameskovacs.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=b3bc3324-e3fa-4ae0-8323-0e276e351c66</wfw:commentRss>
      <slash:comments>8</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
My latest article just hit the web in the March 2008 issue of MSDN Magazine. <a href="http://msdn2.microsoft.com/en-us/magazine/cc337885.aspx">Loosen
Up: Tame Your Software Dependencies for More Flexible Apps</a> takes you on a journey
from a highly-coupled architecture, which we're all familiar with, to gradually more
loosely-coupled ones. First stop is the problems inherent in highly-coupled applications.
To start solving those problems, I look to dependency inversion and service location.
Next stop is poor man's dependency injection and then a simple, hand-rolled inversion
of control (IoC) container. From there, I look at the features provided by full-fledged
IoC containers and use <a href="http://www.castleproject.org/container/">Castle Windsor</a> as
an example, along with some Binsor thrown in for configuration goodness. My goal was
to help developers understand the benefits of dependency injection and IoC containers
by showing them the problems solved at each stage of the journey.
</p>
        <p>
A big thanks to <a href="http://blogs.msdn.com/howard_dierking/">Howard Dierking</a>,
MSDN Magazine editor extraordinaire, for his encouragement and not having an issue
with using Windsor for the advanced examples. Thanks to <a href="http://www.ayende.com">Oren
Eini</a> for help debugging a Binsor configuration problem in one of the examples.
And an especially big thanks to my spouse and two young sons for their patience while
I was writing.
</p>
        <p>
Thanks in advance for reading the article. I welcome your feedback and questions.
</p>
        <img width="0" height="0" src="http://www.jameskovacs.com/blog/aggbug.ashx?id=b3bc3324-e3fa-4ae0-8323-0e276e351c66" />
      </body>
      <title>Loosen Up: Tame Your Software Dependencies for More Flexible Apps</title>
      <guid isPermaLink="false">http://www.jameskovacs.com/blog/PermaLink.aspx?guid=b3bc3324-e3fa-4ae0-8323-0e276e351c66</guid>
      <link>http://www.jameskovacs.com/blog/LoosenUpTameYourSoftwareDependenciesForMoreFlexibleApps.aspx</link>
      <pubDate>Fri, 14 Mar 2008 04:54:59 GMT</pubDate>
      <description>&lt;p&gt;
My latest article just hit the web in the March 2008 issue of MSDN Magazine. &lt;a href="http://msdn2.microsoft.com/en-us/magazine/cc337885.aspx"&gt;Loosen
Up: Tame Your Software Dependencies for More Flexible Apps&lt;/a&gt; takes you on a journey
from a highly-coupled architecture, which we're all familiar with, to gradually more
loosely-coupled ones. First stop is the problems inherent in highly-coupled applications.
To start solving those problems, I look to dependency inversion and service location.
Next stop is poor man's dependency injection and then a simple, hand-rolled inversion
of control (IoC) container. From there, I look at the features provided by full-fledged
IoC containers and use &lt;a href="http://www.castleproject.org/container/"&gt;Castle Windsor&lt;/a&gt; as
an example, along with some Binsor thrown in for configuration goodness. My goal was
to help developers understand the benefits of dependency injection and IoC containers
by showing them the problems solved at each stage of the journey.
&lt;/p&gt;
&lt;p&gt;
A big thanks to &lt;a href="http://blogs.msdn.com/howard_dierking/"&gt;Howard Dierking&lt;/a&gt;,
MSDN Magazine editor extraordinaire, for his encouragement and not having an issue
with using Windsor for the advanced examples. Thanks to &lt;a href="http://www.ayende.com"&gt;Oren
Eini&lt;/a&gt; for help debugging a Binsor configuration problem in one of the examples.
And an especially big thanks to my spouse and two young sons for their patience while
I was writing.
&lt;/p&gt;
&lt;p&gt;
Thanks in advance for reading the article. I welcome your feedback and questions.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.jameskovacs.com/blog/aggbug.ashx?id=b3bc3324-e3fa-4ae0-8323-0e276e351c66" /&gt;</description>
      <comments>http://www.jameskovacs.com/blog/CommentView.aspx?guid=b3bc3324-e3fa-4ae0-8323-0e276e351c66</comments>
      <category>.NET General;Agile;Software Design</category>
    </item>
    <item>
      <trackback:ping>http://www.jameskovacs.com/blog/Trackback.aspx?guid=c13b038e-bda0-4530-aec6-3312e0fceff8</trackback:ping>
      <pingback:server>http://www.jameskovacs.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.jameskovacs.com/blog/PermaLink.aspx?guid=c13b038e-bda0-4530-aec6-3312e0fceff8</pingback:target>
      <dc:creator>James Kovacs</dc:creator>
      <wfw:comment>http://www.jameskovacs.com/blog/CommentView.aspx?guid=c13b038e-bda0-4530-aec6-3312e0fceff8</wfw:comment>
      <wfw:commentRss>http://www.jameskovacs.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=c13b038e-bda0-4530-aec6-3312e0fceff8</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
DISCLAIMER: For the agilists reading this post, there is nothing new here. I just
hear a lot of misconceptions around terms like YAGNI and wanted to provide my own
take on things.
</p>
        <p>
YAGNI is an acronym for "you ain't gonna need it". You often hear it bandied about
agile shops. One developer suggests an over-architected solution and the other cries
out YAGNI. For example:
</p>
        <p>
          <strong>Dev#1:</strong> We can transfer that file using BizTalk!
</p>
        <p>
          <strong>Dev#2:</strong> YAGNI. We can download it using HttpWebRequest.
</p>
        <p>
I'm not knocking BizTalk here. My point is that if all you need to do is transfer
a file from point A to point B, BizTalk is an awfully complicated and expensive way
to do it.
</p>
        <p>
Many agile critics see YAGNI as an excuse for developers to do stupid things. Critics
claim that YAGNI encourages developers to hard-code connection strings and other silliness.
"In development, you're not going to need to change the connection string. So by the
YAGNI principle, you should hard-code your connection strings. Isn't agile stupid?"
YAGNI is a principle like any other and should be applied intelligently. It's about
keeping simple problems simple. It's about the right tools for the right job - don't
try to drive a finishing nail with a sledgehammer. Too often we as an industry implement
"enterprise solutions" to solve otherwise trivial problems.
</p>
        <p>
YAGNI isn't an excuse to be sloppy with your architecture. If you're building the
next hot social bookmarking application, it better scale. You better design with caching,
distribution, load-balancing, etc. in mind. I would want some architectural spikes
demonstrating acceptable performance at high user loads. Similarly if you're developing
an internal application to be used by 10 users, I would bet that you don't need the
complexity of a load-balanced web farm, distributed middle-tier cache infrastructure,
and a clustered database. YAGNI is about choosing the appropriate amount of complexity
for the problem at hand.
</p>
        <p>
YAGNI is about building software at the last responsible moment. The "responsible"
part is key. You can't slap an asynchronous architecture in after the fact. You need
to design that in up front. At the same time you should avoid speculative generalization.
Solve the problems at hand with a responsible eye toward future requirements. Keep
yourself lean and nimble enough to respond to those future requirements, but don't
build them "just in case we need them". What you will need in the future seldom has
any resemblance to what you might build now. Even worse, unused features add complexity
and rigidity to a codebase. You're actually worse off than if you didn't have those
features at all! Keeping your architecture simple, lean, and nimble requires a lot
of discipline.
</p>
        <p>
So next time someone suggests using a SOA-based ESB to integrate the disparate workflows
in the document lifecycle, ask yourself whether a wiki couldn't work just as well.
:^)
</p>
        <img width="0" height="0" src="http://www.jameskovacs.com/blog/aggbug.ashx?id=c13b038e-bda0-4530-aec6-3312e0fceff8" />
      </body>
      <title>Using YAGNI Responsibly</title>
      <guid isPermaLink="false">http://www.jameskovacs.com/blog/PermaLink.aspx?guid=c13b038e-bda0-4530-aec6-3312e0fceff8</guid>
      <link>http://www.jameskovacs.com/blog/UsingYAGNIResponsibly.aspx</link>
      <pubDate>Thu, 13 Mar 2008 16:55:07 GMT</pubDate>
      <description>&lt;p&gt;
DISCLAIMER: For the agilists reading this post, there is nothing new here. I just
hear a lot of misconceptions around terms like YAGNI and wanted to provide my own
take on things.
&lt;/p&gt;
&lt;p&gt;
YAGNI is an acronym for "you ain't gonna need it". You often hear it bandied about
agile shops. One developer suggests an over-architected solution and the other cries
out YAGNI. For example:
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Dev#1:&lt;/strong&gt; We can transfer that file using BizTalk!
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Dev#2:&lt;/strong&gt; YAGNI. We can download it using HttpWebRequest.
&lt;/p&gt;
&lt;p&gt;
I'm not knocking BizTalk here. My point is that if all you need to do is transfer
a file from point A to point B, BizTalk is an awfully complicated and expensive way
to do it.
&lt;/p&gt;
&lt;p&gt;
Many agile critics see YAGNI as an excuse for developers to do stupid things. Critics
claim that YAGNI encourages developers to hard-code connection strings and other silliness.
"In development, you're not going to need to change the connection string. So by the
YAGNI principle, you should hard-code your connection strings. Isn't agile stupid?"
YAGNI is a principle like any other and should be applied intelligently. It's about
keeping simple problems simple. It's about the right tools for the right job - don't
try to drive a finishing nail with a sledgehammer. Too often we as an industry implement
"enterprise solutions" to solve otherwise trivial problems.
&lt;/p&gt;
&lt;p&gt;
YAGNI isn't an excuse to be sloppy with your architecture. If you're building the
next hot social bookmarking application, it better scale. You better design with caching,
distribution, load-balancing, etc. in mind. I would want some architectural spikes
demonstrating acceptable performance at high user loads. Similarly if you're developing
an internal application to be used by 10 users, I would bet that you don't need the
complexity of a load-balanced web farm, distributed middle-tier cache infrastructure,
and a clustered database. YAGNI is about choosing the appropriate amount of complexity
for the problem at hand.
&lt;/p&gt;
&lt;p&gt;
YAGNI is about building software at the last responsible moment. The "responsible"
part is key. You can't slap an asynchronous architecture in after the fact. You need
to design that in up front. At the same time you should avoid speculative generalization.
Solve the problems at hand with a responsible eye toward future requirements. Keep
yourself lean and nimble enough to respond to those future requirements, but don't
build them "just in case we need them". What you will need in the future seldom has
any resemblance to what you might build now. Even worse, unused features add complexity
and rigidity to a codebase. You're actually worse off than if you didn't have those
features at all! Keeping your architecture simple, lean, and nimble requires a lot
of discipline.
&lt;/p&gt;
&lt;p&gt;
So next time someone suggests using a SOA-based ESB to integrate the disparate workflows
in the document lifecycle, ask yourself whether a wiki couldn't work just as well.
:^)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.jameskovacs.com/blog/aggbug.ashx?id=c13b038e-bda0-4530-aec6-3312e0fceff8" /&gt;</description>
      <comments>http://www.jameskovacs.com/blog/CommentView.aspx?guid=c13b038e-bda0-4530-aec6-3312e0fceff8</comments>
      <category>Agile</category>
    </item>
  </channel>
</rss>