<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://devlicio.us/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Christopher Bennage : Agile</title><link>http://devlicio.us/blogs/christopher_bennage/archive/tags/Agile/default.aspx</link><description>Tags: Agile</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>What I Learned Playing StarCraft</title><link>http://devlicio.us/blogs/christopher_bennage/archive/2011/01/30/what-i-learned-playing-starcraft.aspx</link><pubDate>Mon, 31 Jan 2011 02:13:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:64869</guid><dc:creator>Christopher Bennage</dc:creator><slash:comments>3</slash:comments><description>&lt;p&gt;On March 31, 1998, around 10am, my then-manager Alex and I left the office we shared together and headed over to Electronics Boutique. Alex and I were both developers working for the IT department of an up and coming software company called PC DOCS. In those days, we didn’t have a corporate firewall. My desktop was a node on the internet. In fact, I was running a web server on it. A bunch of us would stay late after work, barricaded in other peoples’ cubicles, all phones on speaker, playing WarCraft II and Quake. Those were halcyon days. I was just about to turn 23. I was just about to get married.&lt;/p&gt;  &lt;p&gt;Alex and I had headed to EB because it was Release Day for StarCraft. I don’t think that I had ever been so excited about a video game. Well, maybe once but that’s another story…&lt;/p&gt;  &lt;p&gt;A few months ago, StarCraft 2 was released. While there wasn’t as personal ceremony this time, I still purchased it on Release Day.&lt;/p&gt;  &lt;p&gt;This time around I decided to &lt;em&gt;really&lt;/em&gt; learn how to play the game. In case you are unaware, StarCraft is huge. There are &lt;a href="http://en.wikipedia.org/wiki/StarCraft_professional_competition" target="_blank"&gt;televised tournaments, professional players, and so on&lt;/a&gt;. In many ways, it’s analogous to chess. As I began to learn more about it, I found that there are certain tenets of gameplay and, as I mused on these, I found that they extend to life in general (though I’ll limit them here to a professional context).&lt;/p&gt;  &lt;h3&gt;The First Lesson&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://devlicious.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/christopher_5F00_bennage/ss107_2D00_hires_5F00_06905021.jpg"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:0px 0px 0px 4px;padding-left:0px;padding-right:0px;display:inline;float:right;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="ss107-hires" border="0" alt="ss107-hires" align="right" src="http://devlicious.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/christopher_5F00_bennage/ss107_2D00_hires_5F00_thumb_5F00_2566C3FF.jpg" width="300" height="162" /&gt;&lt;/a&gt;In the game, there are a dizziness amount of options. Your opponent can overwhelm you with astounding ease if you are unprepared for their particular tactic. So you might be inclined to try and prepare for all contingencies. But guess what? You can’t. You will end up spending all of your resources ‘preparing’. You think that this aligns with your overarching goal, but in reality it is a distraction.&lt;/p&gt;  &lt;p&gt;Professionally, we are given a goal: build software that will do &lt;strong&gt;X&lt;/strong&gt;. As developers we typically and immediately begin thinking about all the ‘what ifs’. Usually because we’ve been burned by them in the past. &lt;strong&gt;X&lt;/strong&gt; is still in sight, but there is a long road to get to there, because we have to deal with Y and Z and so many other things. We have to be prepared.&lt;/p&gt;  &lt;p&gt;The truth is that you &lt;em&gt;cannot&lt;/em&gt; be prepared for everything. It is actually a waste of energy and a distraction from your real goal. In the game of StarCraft, if you try to prepare for everything, you &lt;em&gt;will&lt;/em&gt; lose. Instead, you must choose your battles. &lt;/p&gt;  &lt;h3&gt;The Second Lesson&lt;/h3&gt;  &lt;p&gt;How do you know which battles to choose? Surely a battle is coming. There are always problems in every project. You can’t simply be &lt;em&gt;unprepared&lt;/em&gt;. That’s suicide.&lt;/p&gt;  &lt;p&gt;In StarCraft, the answer is scouting. That is, you gather intelligence about what the enemy is doing. Once you know, then you can prepare properly and efficiently.&lt;/p&gt;  &lt;p&gt;Recently, I was asked about some performance concerns at the start of a project. Now, I have been seriously burned by performance issues. In fact, one of the worst software disasters I was a part of was a performance issue. Nevertheless, the concerns raised with granular and premature. As Donald Knuth said “&lt;a href="http://c2.com/cgi/wiki?PrematureOptimization" target="_blank"&gt;premature optimization is the root of all evil&lt;/a&gt;”. Now, I am most emphatically &lt;em&gt;not&lt;/em&gt; saying to avoid optimization. What I am saying is to scout, gathering intelligence and responding accordingly.&lt;/p&gt;  &lt;h3&gt;A Summary&lt;/h3&gt;  &lt;p&gt;I’ll sum up these two thoughts:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Don’t waste time on things you don’t need.&lt;/li&gt;    &lt;li&gt;Find out what you need through active analysis.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;None of this is new. In fact, you see pretty much the same things preached all over. I hear it in &lt;a title="Never Add Functionality Early." href="http://www.extremeprogramming.org/rules/early.html" target="_blank"&gt;XP&lt;/a&gt;, I hear it in Agile, I hear it in StarCraft.&lt;/p&gt;  &lt;h3&gt;Epilogue&lt;/h3&gt;  &lt;p&gt;I’m reminded of a passage from &lt;a href="http://www.gutenberg.org/cache/epub/1718/pg1718.html" target="_blank"&gt;G. K. Chesterton’s Manalive&lt;/a&gt; (chapter 3):&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;quot;Well,&amp;quot; said the girl solidly, &amp;quot;what is there to wake up to?&amp;quot;&lt;/p&gt;    &lt;p&gt;&amp;quot;There must be!&amp;quot; cried Inglewood, turning round in a singular excitement—&amp;quot;there must be something to wake up to! All we do is preparations—your cleanliness, and my healthiness, and Warner&amp;#39;s scientific appliances. We&amp;#39;re always preparing for something—something that never comes off. I ventilate the house, and you sweep the house; but what is going to HAPPEN in the house?&amp;quot;&lt;/p&gt;&lt;/blockquote&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=64869" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/humor/default.aspx">humor</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Musings/default.aspx">Musings</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Opinion/default.aspx">Opinion</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/PointlessStory/default.aspx">PointlessStory</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/gaming/default.aspx">gaming</category></item><item><title>Visions of Software Development or Can’t We Just All Get Along?</title><link>http://devlicio.us/blogs/christopher_bennage/archive/2010/01/12/visions-of-software-development.aspx</link><pubDate>Tue, 12 Jan 2010 11:38:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:54958</guid><dc:creator>Christopher Bennage</dc:creator><slash:comments>7</slash:comments><description>&lt;p&gt;I’m currently reading Thomas Sowell’s &lt;a href="http://www.amazon.com/gp/product/0465002056?ie=UTF8&amp;amp;tag=bluspiconinc-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0465002056"&gt;A Conflict of Visions: Ideological Origins of Political Struggles&lt;/a&gt;&lt;img style="margin:0px;" border="0" alt="" src="http://www.assoc-amazon.com/e/ir?t=bluspiconinc-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0465002056" width="1" height="1" /&gt;. As the title suggests, it deals with certain fundamental differences in the way we see the world and how that affects our political views. Don’t worry, I’m not going to delve into politics in the post. However, I was struck by how applicable the ‘visions’ in the book are to the competing (and conflicting) views about how we should write software.&lt;/p&gt;  &lt;p&gt;Here’s a simplified sketch of the two fundamental visions in the book. (Note that I’m not attempting to make a judgment call here on which vision is correct or better. Though admittedly, I have my bias. Likewise, I’m necessarily keeping it simplified.).&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Complex problems are best addressed by:      &lt;br /&gt;[a] systemic evolution or [b] clear and articulated reason &lt;/li&gt;    &lt;li&gt;When a complex problem is addressed the result will most likely be:      &lt;br /&gt;[a] a set of prudent trade-offs or [b] a solution &lt;/li&gt;    &lt;li&gt;Better results are produced when governance is provided by      &lt;br /&gt;[a] role and ritual or [b] well-educated individuals &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;This is just a few characteristics indentified in the book. We have a tendency to favor either the &lt;strong&gt;A&lt;/strong&gt; answers or the &lt;strong&gt;B&lt;/strong&gt; ones.&lt;/p&gt;  &lt;p&gt;Let me unpack this now in terms of software development. I think that the philosophy of agile/software craftsmanship/etc has generally preferred the A answers. While more traditional software development has generally preferred the B answers.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Many agile practices (such as TDD) build up software through systemic evolution. (Tim Barcz touched upon &lt;a title="Irreducible Complexity and Evolutionary Design in Software" href="http://www.timbarcz.com/blog/IrreducibleComplexityAndEvolutionaryDesign.aspx"&gt;this idea&lt;/a&gt; some time ago). Evolution is at the heart of iterative design. In opposition to this is a heavy initial design phase (or Big Design Up Front). In BDUF, the problem is analyzed and a clear, detailed path is laid out.&lt;/li&gt;    &lt;li&gt;I think the second point follows implicitly from the first point. BDUF is a ‘solution’, whereas iterative development is inherently about trade-offs. By the term ‘solution’ I am implying that on such-and-such a date, the software will be delivered and the problem will be solved. The value is delayed, but it is complete. In an iterative project the goal is to deliver immediate, but only partial value. It acknowledges that some value is always omitted and that the software might never be complete.&lt;/li&gt;    &lt;li&gt;The third point is one of the more divisive ones. I believe that agile practices focus a lot on ritual. TDD is a ritual. (I believe there was a Hanselman interview with Robert Martin that discussed this point). Kaban, Scrum, and other similar practices are ritualistic. These rituals are the soil where the systemic evolution grows. On the opposing side, development teams are led by architects. That is, by well-educated and intelligent individuals who have a greater understanding of what needs to be done.&lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;My Bias&lt;/h3&gt;  &lt;p&gt;It is always important to admit your bias. I tend to favor the &lt;strong&gt;A&lt;/strong&gt; answers above, though not always. I have been in circumstances where that approach broke down.&lt;/p&gt;  &lt;p&gt;Regardless, I highly recommend the book as it has given me a lot of insight into my own views and those of others.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=54958" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Reflection/default.aspx">Reflection</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/ALT.NET/default.aspx">ALT.NET</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Opinion/default.aspx">Opinion</category></item><item><title>Refactoring Relationships</title><link>http://devlicio.us/blogs/christopher_bennage/archive/2009/08/08/refactoring-relationships.aspx</link><pubDate>Sun, 09 Aug 2009 01:45:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:49911</guid><dc:creator>Christopher Bennage</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Working with people is a lot like working with code. New relationships are green fields. Over time they become brown fields and (just like code) they require maintenance. I’m sure that everyone reading this can identify some legacy relationships that they would describer as, well, complicated. Just like some legacy code.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;margin-left:0px;border-left-width:0px;margin-right:0px;" title="working together" border="0" alt="working together" align="right" src="http://devlicious.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/christopher_5F00_bennage/iStock_5F00_000000810058XSmall_5F00_15B7B6E6.jpg" width="191" height="240" /&gt;I mean a lot with the word ‘relationship’. I have in mind everything from co-workers to friends to significant others. These variations all require maintenance and I think we should deliberately structure our relationships so that maintenance is easier.&lt;/p&gt;  &lt;h3&gt;Interaction Smells&lt;/h3&gt;  &lt;p&gt;So what &lt;em&gt;is&lt;/em&gt; the social equivalent of a switch\case statement?&lt;/p&gt;  &lt;p&gt;We talk about &lt;a href="http://en.wikipedia.org/wiki/Code_smell" target="_blank"&gt;code smells&lt;/a&gt; in software development as suggestive indicators that something is wrong. In our relationships, it is &lt;em&gt;interaction smells&lt;/em&gt;. I would consider these common emotional responses to be smells:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;avoidance &lt;/li&gt;    &lt;li&gt;irritation &lt;/li&gt;    &lt;li&gt;suspicion &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Personally, I have been guilty of avoiding someone because I thought I would irritate them and I didn’t want the hassle. This was in a work environment and it a negative effect on the overall efficacy of the group. My impulse to avoid was a smell and it led to a problem that needed to be addressed.&lt;/p&gt;  &lt;h3&gt;Amicability Debt&lt;/h3&gt;  &lt;p&gt;Bad code gets worse over time. We call this &lt;a href="http://martinfowler.com/bliki/TechnicalDebt.html" target="_blank"&gt;technical debt&lt;/a&gt;. Relationships that have soured do not get better by themselves. Little fractures grow over time. If we don’t address them when we smell them, the stink only gets worse. In addition, the stinky relationship can be begin affecting other parts of design, uh I mean, other social interactions (e.g., the team you are working with).&lt;/p&gt;  &lt;h3&gt;Refactoring the Relationship&lt;/h3&gt;  &lt;p&gt;Relationships are more difficult to work with than code for one primary reason:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;You cannot revert back to the last revision if your changes fail.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Nevertheless, we often need to make changes. Refactoring code doesn’t change the exposed functionality, but we make internal changes to improve it. If you are beginning to have problems with your boss, that doesn’t necessarily mean it’s time to quit (change the function) rather you might just need some relational refactoring.&lt;/p&gt;  &lt;p&gt;But what do I mean by refactoring a relationship? Well, there’s a lot to be said there and you can find a lot of practical advice on dealing with conflict and more over on &lt;a href="http://www.stevenlist.com/blog/" target="_blank"&gt;“Doc” List’s blog&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;In brief though, I mean this: &lt;/p&gt;  &lt;p&gt;Be honest and humble. “Hey, Joe, I feel like you’ve been a bit on edge with me. Did I do something to frustrate you? I’d like to clear the air.” Then talk it over. Again, refer to Doc’s blog for lots of details.&lt;/p&gt;  &lt;p&gt;I would like to qualify this further. Since you cannot revert what you say and do, you must be deliberate and thoughtful about your refactoring.&lt;/p&gt;  &lt;h3&gt;Afterword&lt;/h3&gt;  &lt;p&gt;You can see where my brain has been lately. It’s the cross-pollination of ideas from software development into all other human interests. Next week: multithreading and Italian cooking, followed up by ALT.NET and comparative religion.&lt;/p&gt;  &lt;p&gt;If any of this resonates with you, you might be interested in &lt;span title="it&amp;#39;s a Christian perspective on marriage, but I do have Justice Gray&amp;#39;s support."&gt;(a possibly controversial)&lt;/span&gt; post regarding the &lt;a href="http://blog.bennage.com/2008/07/de-matrimonium.html" target="_blank"&gt;maintenance of marriage&lt;/a&gt; on my personal blog.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=49911" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Best+Practices/default.aspx">Best Practices</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Opinion/default.aspx">Opinion</category></item><item><title>Agile Living</title><link>http://devlicio.us/blogs/christopher_bennage/archive/2009/08/04/agile-living.aspx</link><pubDate>Wed, 05 Aug 2009 03:14:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:49842</guid><dc:creator>Christopher Bennage</dc:creator><slash:comments>3</slash:comments><description>&lt;p&gt;I yearn to be consistent. I want my professional values to be the same as my personal ones. This is why I was quick to sign the &lt;a href="http://agilemanifesto.org/"&gt;Agile Manifesto&lt;/a&gt;; it aligned with my personal values.&lt;/p&gt;  &lt;p&gt;&lt;img style="display:inline;margin-left:0px;margin-right:0px;" title="The 4-Hour Workweek" alt="The 4-Hour Workweek" align="right" src="http://ecx.images-amazon.com/images/I/51FSaZaVA3L._SS500_.jpg" width="240" height="240" /&gt;I have been overcommitted for the last couple of months and the stress has forced me to do some professional reevaluation. I had&amp;#160; a number of entrepreneurial and professional books on my back log. One of the book was &lt;a href="http://www.amazon.com/4-Hour-Workweek-Escape-Live-Anywhere/dp/0307353133"&gt;The 4-Hour Workweek&lt;/a&gt; by Timothy Ferriss.&lt;/p&gt;  &lt;p&gt;I really like this book.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;That’s nice, Christopher. Thanks for sharing. What does this have to do with software development?&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Not a&amp;#160; lot. Perhaps. But I think it has a lot to do with the philosophy of Agile.&lt;/p&gt;  &lt;h3&gt;Eschew BDUF&lt;/h3&gt;  &lt;p&gt;One of the first ideas in the book is that the notion that retirement is a bit silly. We spend forty something odd years saving up money to retire and for what? How do we really know what to save up for? Do we honestly know what our requirements for old age will be? The standard cultural approach to professional life is Waterfall. We spend so much time building our product, and we have one big rollout.&lt;/p&gt;  &lt;h3&gt;Iterative Design&lt;/h3&gt;  &lt;p&gt;I recently watched the film &lt;a href="http://en.wikipedia.org/wiki/Holiday_(1938_film)"&gt;Holiday&lt;/a&gt; with Cary Grant and Katharine Hepburn. In the movie, a young and savvy Johnny Case (Grant) struggles between Doing Business (because that’s sensible) and taking time off to figure out what he &lt;em&gt;wants&lt;/em&gt; out of life. Ferris makes a similar proposition in the book. He suggests planning mini-retirements. It’s a release often, release early approach to life. Discover what you want you by trying things out. It’s Life in Sprints.&lt;/p&gt;  &lt;h3&gt;Illusion of Slackness&lt;/h3&gt;  &lt;p&gt;Agile has had a bad rep for being unstructured and lacking in discipline. Of course, practitioners of Agile know the&lt;em&gt; exact opposite&lt;/em&gt; is the case (and let that be a life lesson in itself). One of the things I love about Agile is the focus on delivering value. Likewise, my initial perception of the book was that it was a guide for the lazy; just another Get Rich Quick scheme. No, it’s about being deliberate with your life. It’s not a book that most people can use, because it requires disciple.&lt;/p&gt;  &lt;h3&gt;Eliminate Waste&lt;/h3&gt;  &lt;p&gt;If I’m being technical, I guess I would say that this is a Lean principle. However, Lean and Agile are complimentary ingredients in the tossed salad that is my head. Ferris applies this principle to all of life. It’s a beautiful thing. There’s a lot of waste in our lives, hidden under the veil of busyness. Find it and eliminate it. Repeat. &lt;/p&gt;  &lt;h3&gt;Conclusion&lt;/h3&gt;  &lt;p&gt;Okay, so I guess this turned out to be a book review of a non-technical book. If any of this stirs your brain, then I recommend that you read the book. If you are compelled by the ideas of Agile or Continuous Improvement, read the book.&lt;/p&gt;  &lt;p&gt;My Advice: be deliberate with your life, your professional, and your time.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="right"&gt;“… the unexamined life is not worth living…”      &lt;br /&gt;Socrates, &lt;a href="http://www.gutenberg.org/etext/1656"&gt;Plato’s Apology&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p align="right"&gt;“Whatever your hand finds to do, do it with all your might, for in the grave, where you are going, there is neither working nor planning nor knowledge nor wisdom.”&lt;/p&gt;    &lt;p align="right"&gt;&lt;a title="That&amp;#39;s another name for Ecclesiates. I&amp;#39;m just trying to make you curious." href="http://www.biblegateway.com/passage/?search=Ecclesiastes%209:10;&amp;amp;version=31;"&gt;Kohelet 9:10&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=49842" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Opinion/default.aspx">Opinion</category></item><item><title>Idealistic vs. Practical</title><link>http://devlicio.us/blogs/christopher_bennage/archive/2009/03/24/idealistic-vs-practical.aspx</link><pubDate>Tue, 24 Mar 2009 14:05:09 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:45121</guid><dc:creator>Christopher Bennage</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;I often identify myself as an Agilist. When I first began to use the term, I was met with a great deal of trepidation. I remember the first few times I attended the local user group. “Oh, you’re one of those guys”. This hesitation has diminished considerably, but I still find that there are some interesting misconceptions about agile.&lt;/p&gt;  &lt;p&gt;For example, people frequently contrast &lt;em&gt;Agile&lt;/em&gt; with &lt;em&gt;Pragmatic&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;“Oh, I’ve heard about SOLID principles (or whatever), but I’m really more pragmatic.”&lt;/em&gt; &lt;/p&gt;  &lt;p&gt;This has actually made me laugh out loud. You see, it was pragmatism that drove me towards the agile philosophy.&lt;/p&gt;  &lt;p&gt;According to Meriam-Webster, &lt;a href="http://www.merriam-webster.com/dictionary/pragmatic" target="_blank"&gt;pragmatic&lt;/a&gt; means:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;relating to matters of fact or practical affairs often to the exclusion of intellectual or artistic matters &lt;strong&gt;:&lt;/strong&gt; practical as opposed to idealistic&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;So here is the relevant contrast: &lt;/p&gt;  &lt;p align="center"&gt;&lt;strong&gt;Idealistic vs. Practical&lt;/strong&gt;&lt;/p&gt;  &lt;p align="left"&gt;Is Agile idealistic or practical? Agile does embraces a set of principles (ideals) and I’ve seen many of its adherents become drunk with the beauty of it. I’ve been there a few times myself. So yes, it is idealistic in that respect. However, I think a better question is this:&lt;/p&gt;  &lt;p align="left"&gt;Is Agile &lt;em&gt;merely&lt;/em&gt; idealistic?&lt;/p&gt;  &lt;p align="left"&gt;There is a strong idealistic streak in Agile, we will not deny it, however the ideal is actually “get work done”. In other words, Agile is the art of pragmatism.&lt;/p&gt;  &lt;p align="left"&gt;I am motivated by success. I am motivated by accomplishing things. The quickest route to depressing me (or frustrating me) is to prevent me from getting work done. Because of this, when I first encountered the agile idea that change is expensive and therefore we should reduce the cost of change, I was listening. When I discovered that agile methodology offers a set of tools for reducing the cost of change, I was ecstatic.&lt;/p&gt;  &lt;p align="left"&gt;In the interest of being brief, I’ll jump to my conclusion:&lt;/p&gt;  &lt;p align="left"&gt;The application of the &lt;a href="http://agilemanifesto.org/principles.html" target="_blank"&gt;agile principles&lt;/a&gt; is about being successful in software development projects. It is not ars gratia artis. While some enthusiasts may forget that, it doesn’t change the nature of the underlying principles. &lt;/p&gt;  &lt;p align="left"&gt;Agile is the art of being pragmatic.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=45121" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Opinion/default.aspx">Opinion</category></item><item><title>Solving Problems with TDD</title><link>http://devlicio.us/blogs/christopher_bennage/archive/2008/11/06/solving-problems-with-tdd.aspx</link><pubDate>Thu, 06 Nov 2008 20:03:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:42921</guid><dc:creator>Christopher Bennage</dc:creator><slash:comments>7</slash:comments><description>&lt;p&gt;I&amp;#39;m giving a talk on TDD at our local UG tonight, and under the influence of some recent posts here on devlicio.us, I just finished reworking my presentation. This post is an outline for the first half of my presentation.&lt;/p&gt; &lt;h3&gt;The Problems&lt;/h3&gt; &lt;p&gt;Code has entropy. That is over time it deteriorates. At least, that&amp;#39;s the metaphor we developers like to use. What is really means is that the code becomes harder to maintain and extend as it is maintained and extended over time. Did you follow that? Our typical approach to maintaining and extending code causes the code to become fragile and rigid and thus harder to maintain and extend in the future.&lt;/p&gt; &lt;p&gt;There are three common difficulties that arise, maybe more, but I&amp;#39;m focusing on three:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Unchangeable Code&lt;/li&gt; &lt;li&gt;Unintelligible Code&lt;/li&gt; &lt;li&gt;Unnecessary Code&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;A portion of code becomes unchangeable when its deeply entwined and entangled with other portions of code that have different responsibilities. You can&amp;#39;t change method X because we really don&amp;#39;t know what that will do to Y and Z.&lt;/p&gt; &lt;p&gt;Code can become unintelligible for lots of reasons: abbreviated names, circuitous logic, enormous methods, confusion of responsibilities, use of php☺, etc.&lt;/p&gt; &lt;p&gt;Finally, unnecessary code is code that is not used by the system. It can be vestigial, or as often happens, it can be the result of feature anticipation. &lt;em&gt;We thought this was going to be needed in the app, so...&lt;/em&gt;&lt;/p&gt; &lt;h3&gt;The Solutions&lt;/h3&gt; &lt;p&gt;There are some generally accepted solutions to these three problems.&lt;/p&gt; &lt;p&gt;In the case of unchangeable code, we can apply such patterns as &lt;a href="http://en.wikipedia.org/wiki/Separation_of_concerns" target="_blank"&gt;Separation of Concerns&lt;/a&gt; (SoC) and the &lt;a href="http://en.wikipedia.org/wiki/Single_responsibility_principle" target="_blank"&gt;Single Responsibility Principle&lt;/a&gt; (SRP). For addressing unintelligible code, we have a number of techniques such as &lt;em&gt;thoughtful&lt;/em&gt; comments, explicit naming, SRP again, etc. Finally, for unnecessary code we have the old axiom of &lt;a href="http://en.wikipedia.org/wiki/YAGNI" target="_blank"&gt;You Ain&amp;#39;t Gonna Need It.&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Okay, so we know how to solve the problems. Or least, we know how to mediate them. So what? What does that have to do with TDD?&lt;/p&gt; &lt;p&gt;My proposition is this:&lt;strong&gt; solutions are without value unless they are applied&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Additionally, when a problem occurs over time, the solution must be applied over time.&lt;/p&gt; &lt;h3&gt;The Analogy&lt;/h3&gt; &lt;p&gt;I just started going to the gym. It&amp;#39;s been about a decade since I did that, but I&amp;#39;m back. For the past several years however, I have been preaching to certain family members the value of exercise and healthy diet. I knew the benefits: stress reduction, longevity, improved sleeping, and just plain feeling better. However, I wasn&amp;#39;t really doing either.&lt;/p&gt; &lt;p&gt;I had the problem and I believed in the solution and, in fact, I made attempts to employ the solution. Ultimately, I was unsuccessful. That is, until I committed to go to the gym three days week at a set time and with a workout buddy.&lt;/p&gt; &lt;p&gt;My point is this, we are human beings and despite being smart we frequently revert to doing &amp;quot;the easiest thing&amp;quot;. Therefore, we ought to set up some sort of framework of methodology or discipline where the easiest thing is actually what we &lt;em&gt;want&lt;/em&gt; to do.&lt;/p&gt; &lt;p&gt;Additionally, I have to &lt;em&gt;keep on going&lt;/em&gt; to gym. For as long as I want to be fit, I will need to exercise. In the same way, for as long as I want my code to fit I will need to apply good principles.&lt;/p&gt; &lt;h3&gt;TDD as a Discipline&lt;/h3&gt; &lt;p&gt;I will argue that TDD is a discipline that enables the application of the solutions outlined above. Perhaps you apply those solution naturally. Perhaps you can benchmark 200lbs because of your genetic disposition. Bully for you. Go ahead and skip the rest.&lt;/p&gt; &lt;p&gt;Let&amp;#39;s examine a few essentials of TDD and see if they really address the problems we outlined.&lt;/p&gt; &lt;h4&gt;Test First&lt;/h4&gt; &lt;p&gt;I&amp;#39;m an advocate of automated testing in general. However, I do think that writing your tests first yields additional value. Primarily, it helps you &lt;em&gt;discover your ideal API&lt;/em&gt;. In other words, you can design your API up front such that it is more intuitive. More intuitive means easier to understand. &lt;/p&gt; &lt;p&gt;Secondly, testing first helps you identify dependencies early. You quickly discover that class X will need a Y and so you are forced to create seams in the application at the onset. This encourages SoC and SRP.&lt;/p&gt; &lt;h4&gt;Testing Units&lt;/h4&gt; &lt;p&gt;It took me a long time to understand the &amp;quot;unit&amp;quot; part of unit testing. The idea is that you decompose your problem into units, and deal with the problem one unit at a time. You could call this &amp;quot;test just one thing&amp;quot;. Okay, well what is &amp;quot;one thing&amp;quot;? That is hard to tell and comes with experience. Nevertheless, &lt;em&gt;the practice&lt;/em&gt; of trying to decompose a problem and identifying units leads you back to SoC and SRP again.&lt;/p&gt; &lt;h4&gt;Just Enough Code&lt;/h4&gt; &lt;p&gt;Another tenet of TDD is to &lt;em&gt;write only enough code to pass the test&lt;/em&gt;. Our natural instinct is to anticipate. It is part of what we are as developer, and it is not a bad thing. However, like many strengths, it can become a weakness. By constraining ourselves to a single problem at a time we will end up with less code. It also forces us to be conscious about our anticipation and to ask if a given scenario is &lt;em&gt;really&lt;/em&gt; necessary.&lt;/p&gt; &lt;h3&gt;Conclusion&lt;/h3&gt; &lt;p&gt;I know that there is much contention over the actual value of TDD as a practice, and I am not going to force it on anyone (unless I hire you and now you are warned). However, I have found it to be a useful discipline for helping me to overcome common problems and because of that I encourage it&amp;#39;s use.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=42921" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Design+Patterns/default.aspx">Design Patterns</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Software+Architecture/default.aspx">Software Architecture</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/TDD/default.aspx">TDD</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/ALT.NET/default.aspx">ALT.NET</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Best+Practices/default.aspx">Best Practices</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Opinion/default.aspx">Opinion</category></item><item><title>ALT.Consultancy: Reflections on doing it my way</title><link>http://devlicio.us/blogs/christopher_bennage/archive/2008/05/18/alt-consultancy-reflections-on-doing-it-my-way.aspx</link><pubDate>Sun, 18 May 2008 23:48:32 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:40622</guid><dc:creator>Christopher Bennage</dc:creator><slash:comments>7</slash:comments><description>&lt;p&gt;Awhile back there was some &lt;a href="http://tech.groups.yahoo.com/group/altdotnet/message/4540" target="_blank"&gt;discussion&lt;/a&gt; on the new &lt;a href="http://tech.groups.yahoo.com/group/altdotnet/" target="_blank"&gt;ALT.NET list&lt;/a&gt; about what it would be like to start a consultancy with a bunch ALT.NET minded people. The hypothetical scenario proposed there wasn&amp;#39;t &lt;em&gt;quite&lt;/em&gt; what I did, but I thought I&amp;#39;d go ahead and share my experiences and how we addressed (or are still addressing) some of the problems in running a business like this.&lt;/p&gt; &lt;h4&gt;The Background&lt;/h4&gt; &lt;p&gt;&lt;a href="http://devlicio.us/blogs/rob_eisenberg/default.aspx" target="_blank"&gt;Rob Eisenberg&lt;/a&gt; and I founded our company &lt;a href="http://www.bluespire.com/" target="_blank"&gt;Blue Spire&lt;/a&gt; in October 2006. We were long time friends, and had worked together for about two years prior to starting the company. In that time, we were learning about &lt;a title="Manifesto for Agile Software Development" href="http://www.agilemanifesto.org/" target="_blank"&gt;Agile&lt;/a&gt; in general, as well as patterns, TDD, OR/M, the myriad of awesome OSS tools, etc.&amp;nbsp; We didn&amp;#39;t know it, but we were developing a &lt;em&gt;culture&lt;/em&gt; between the two of us&lt;em&gt;. &lt;/em&gt;The elements of this culture included:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;continuous learning  &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/magazine/cc135988.aspx" target="_blank"&gt;passion for our craft&lt;/a&gt;&amp;nbsp; &lt;li&gt;learning to &amp;quot;&lt;a href="http://www.extremeprogramming.org/rules/collective.html" target="_blank"&gt;code without ego&lt;/a&gt;&amp;quot;  &lt;li&gt;excitement about &amp;quot;doing things better&amp;quot; and discovering &amp;quot;better practices&amp;quot;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;We started our consulting firm with the belief that we could deliver quality, human friendly software in less time and for less cost that the majority of other firms. (The genesis of this thought occurred over a decade ago when I was subcontracting for a large consulting shop, working on an 18 month project with a team of around 25. I&amp;#39;m sure I was pretty cocky back then, but I felt at the time that a team of 5 could have delivered more in less than a year.) &lt;/p&gt; &lt;p&gt;We began with just the two of us, and we envisioned growing to a team of 4 to 6. &lt;a title="&amp;quot;Getting Real&amp;quot; is a must read..." href="http://gettingreal.37signals.com/ch08_Hire_Less_and_Hire_Later.php" target="_blank"&gt;Smaller is better&lt;/a&gt;. Even at the beginning though, we felt that consulting was just a stepping stone to something else.&lt;/p&gt; &lt;h4&gt;Kicking It Off&lt;/h4&gt; &lt;p&gt;The question was asked on the list if such a shop could compete.&amp;nbsp; What kind of sales and marketing would you need? How do you break in and demonstrate to potential clients that you can provide a better value than super consulting company X?&lt;/p&gt; &lt;p&gt;We&amp;#39;ve had zero down time since we started, and we&amp;#39;ve had almost zero sales and marketing efforts.&amp;nbsp; We started off having lunch with other software development shops in the area. We told them what we were doing (without being derogatory) and we talked about overflow work, and subcontracting. There&amp;#39;s enough business out there that the competition is pretty friendly.&amp;nbsp; We also offered ourselves at very, very reasonable rate. (We&amp;#39;re now charging double from what we started, and we&amp;#39;re probably going to raise our rates again this year.)&lt;/p&gt; &lt;p&gt;The majority of our clients have been other software shops. What&amp;#39;s cool is that they saw our value pretty quickly. What&amp;#39;s bad is that we were sometimes restricted from using the practices and tools that we wanted.&lt;/p&gt; &lt;p&gt;We also decided it was important to connect with the local developer community. Both for our own continuing professional development, but also for growing the reputation of our company. Rob has especially put in efforts to speak at Code Camps, and the &lt;a href="http://capitalcitydotnet.net/dotnetnuke/" target="_blank"&gt;local user group&lt;/a&gt;. It helps that we are genuinely excited about sharing. (This even helped us land a really fun agile coaching gig for the internal development team of a state agency.)&lt;/p&gt; &lt;h4&gt;Convincing Clients&lt;/h4&gt; &lt;p&gt;We&amp;#39;ve focused on Scrum for project management, and we were lucky to have a client who was already intent on using it. Nonetheless, even that client (who was not a software shop) required a statement of work. We estimated as best we could, and the client agreed that the SOW was a target and not a guarantee. &lt;/p&gt; &lt;p&gt;In our &amp;quot;sales pitch&amp;quot;, we tell clients that software development in inherently unpredictable. We contrast &amp;quot;release early, release often&amp;quot; with &amp;quot;throwing the spec over the wall&amp;quot;.&amp;nbsp; (There&amp;#39;s usually a lot of resonance if they&amp;#39;ve had software developed before.) We (cautiously) explain to them that no one really knows exactly what they need up front. Change is inevitable.&lt;/p&gt; &lt;h4&gt;What Really Happens&lt;/h4&gt; &lt;p&gt;Our projects have usually taken one of the following forms:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;The client budgets a set amount of hours.&amp;nbsp; We provide a conservative statement of what we think can be accomplished in that time.&amp;nbsp; We explicitly qualify the risks as soon as they are known. &lt;br /&gt;We get the client to buy into the project, by allowing them to manage the priorities for each iteration in the project (usually 2 - 4 weeks). In this way, they share the responsibility with us for hitting the desired target.&lt;br /&gt;Because of the iterative nature, they are aware of risks and problems early.&lt;/li&gt; &lt;li&gt;Some client are too deeply rooted in the idea of &amp;quot;build me X, in Y hours, for Z dollars&amp;quot;.&amp;nbsp; We try to avoid that situation, but we&amp;#39;ve been there.&amp;nbsp; When that occurs we greatly exaggerate the hours (3x or 4x).&amp;nbsp; Funny enough, the exaggerated estimate is often within the client&amp;#39;s expectations.&amp;nbsp; We&amp;#39;ve alternately benefited and been burned by this arrangement.&amp;nbsp; I don&amp;#39;t like to do it this way.&lt;/li&gt; &lt;li&gt;This last arrangement is a mixture of the other two, and it&amp;#39;s only been useful for periods where we would would have been between projects and when a client has some flexibility in scheduling.&amp;nbsp; Essentially, we budget some initial time to size tasks.&amp;nbsp; Again we pad the hours to mitigate risk, and then we allow the client to pick and choose the tasks.&amp;nbsp; We commit to delivering an individual task for the number of hours we estimated, but we are not committed to delivering the entire project for a set amount.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;The first option is preferred and honestly it is the one that provides the most cost effectiveness for the client.&amp;nbsp; We only use the other arrangements when the client isn&amp;#39;t comfortable with the first.&lt;/p&gt; &lt;h4&gt;Some Final Thoughts&lt;/h4&gt; &lt;p&gt;Here&amp;#39;s a few additional observations:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Having the right clients is paramount.&amp;nbsp; You want a genuine trust relationship.&amp;nbsp; We had one project where trust was eroded (if it was ever present on their side) and it was by far the most stress I&amp;#39;ve had in years.&amp;nbsp; It&amp;#39;s hard to turn down business, but sometimes you really need too.&lt;/li&gt; &lt;li&gt;Scheduling is difficult. Managing the pipeline is one of the more difficult tasks in managing a small shop.&amp;nbsp; &lt;em&gt;When is this project really going to be over? What if the client wants to extend? How much downtime can we afford? At what point are we over extended?&lt;br /&gt;&lt;/em&gt;Everyone that I&amp;#39;ve talked to that has a small project-based business seems to have the same difficulty.&amp;nbsp; So far, we haven&amp;#39;t made any clients mad, but we&amp;#39;ve had a few periods of &lt;a title="My goal is to eliminate this." href="http://www.extremeprogramming.org/rules/overtime.html" target="_blank"&gt;overtime&lt;/a&gt;.&amp;nbsp; This would be easier if we were a larger company, but size has many disadvantages too.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;I&amp;#39;m a developer at heart, and running a business has been challenging (and distracting). So I&amp;#39;d love to hear from anyone else who is doing this sort of thing. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=40622" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/ALT.NET/default.aspx">ALT.NET</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Business/default.aspx">Business</category></item><item><title>Thoughts on ALT.NET</title><link>http://devlicio.us/blogs/christopher_bennage/archive/2008/03/15/thoughts-on-alt-net.aspx</link><pubDate>Sat, 15 Mar 2008 21:39:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:39678</guid><dc:creator>Christopher Bennage</dc:creator><slash:comments>6</slash:comments><description>&lt;p&gt;I just listened to &lt;a href="http://www.hanselminutes.com/default.aspx?showID=122" target="_blank"&gt;Scott Hanselman interviewing Dave Laribee&lt;/a&gt; regarding &lt;a href="http://altdotnet.org/" target="_blank"&gt;ALT.NET&lt;/a&gt;. I really like what Dave had to say, and I encourage everyone to go and listen.&amp;nbsp; I&amp;#39;ve been reticent about the ALT.NET movement (aside from my initial surge of enthusiasm.) I&amp;#39;m a bit shy when it comes to controversy, and even though I have strong evangelistic tendencies, I am also quick to shut up. ALT.NET has had its &lt;a href="http://altnetpursefight.blogspot.com/" target="_blank"&gt;share&lt;/a&gt; of &lt;a href="http://samgentile.com/blogs/samgentile/archive/2007/10/06/goodbye-codebetter-and-alt-net.aspx" target="_blank"&gt;controversy&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;&lt;a href="http://devlicious.com/blogs/christopher_bennage/WindowsLiveWriter/ThoughtsonALT.NET_EF75/RWS2-Big_2.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="92" alt="Now we&amp;#39;re an institution!" src="http://devlicious.com/blogs/christopher_bennage/WindowsLiveWriter/ThoughtsonALT.NET_EF75/RWS2-Big_thumb.png" width="240" align="right" border="0" /&gt;&lt;/a&gt;I really like that Dave said &lt;em&gt;it&amp;#39;s not about the tools, it&amp;#39;s about the principles&lt;/em&gt;.&amp;nbsp; I am frequently asked about &amp;quot;good design&amp;quot; and &amp;quot;best practices&amp;quot;.&amp;nbsp;&amp;nbsp; This is why I&amp;#39;m ALT.NET. (In fact, I have a series of posts on this topic that I intend to start after we&amp;#39;re done with the &lt;a title="Sams Teach Yourself WPF in 24 Hours -- preorder yours today! :-)" href="http://www.amazon.com/Sams-Teach-Yourself-WPF-Hours/dp/0672329859" target="_blank"&gt;book&lt;/a&gt;.)&lt;/p&gt; &lt;p&gt;There&amp;#39;s an item in the interview that I&amp;#39;d like to comment on.&lt;/p&gt; &lt;p&gt;Scott asks (pardon my paraphrasing) why would the hypothetical &lt;a title="Is he (or she) a real person?" href="http://www.nfs.unl.edu/" target="_blank"&gt;Chief Architect of the Nebraska Department of Forestry&lt;/a&gt; have any interest in ALT.NET? The mythical Mort has pressing concerns, he just needs to get work done, why would he care about these conversations, discussions, and principles? Listen to the podcast for Dave&amp;#39;s answer.&amp;nbsp; However, my answer is this: &lt;em&gt;he probably doesn&amp;#39;t care and that&amp;#39;s okay&lt;/em&gt;. I think that ALT.NET is about bringing good design and principle to the forefront.&amp;nbsp; However, good ideas take a while to be adopted, to be democratized.&amp;nbsp; Those who are hungry, we&amp;#39;ll feed.&amp;nbsp; Those who aren&amp;#39;t, we&amp;#39;ll wish them well.&amp;nbsp; No hard feelings. Eventually, the good ideas will be institutionalized and they&amp;#39;ll trickle down. (Have you noticed the &amp;quot;refactor&amp;quot; menu in Visual Studio?) I&amp;#39;m more concerned about convincing the institutions and the thought leaders.&amp;nbsp; (Perhaps &amp;quot;convincing&amp;quot; is the wrong word, ALT.NET is more about &amp;quot;conversing&amp;quot; to me.) That&amp;#39;s why it&amp;#39;s good that ALT.NET is conversing with Microsoft, and that&amp;#39;s also why I&amp;#39;m encouraged to see Microsoft paying attention to things like open source (though I know many people are angry about the kind of attention being paid).&lt;/p&gt; &lt;p&gt;Now go learn &lt;a title="One-Click Ruby Installer for Windows" href="http://rubyinstaller.rubyforge.org/wiki/wiki.pl" target="_blank"&gt;Ruby&lt;/a&gt;!&amp;nbsp; :-)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=39678" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Musings/default.aspx">Musings</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Featured/default.aspx">Featured</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/ALT.NET/default.aspx">ALT.NET</category></item><item><title>The Words We Use</title><link>http://devlicio.us/blogs/christopher_bennage/archive/2008/02/07/the-words-we-use.aspx</link><pubDate>Thu, 07 Feb 2008 15:50:48 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:39397</guid><dc:creator>Christopher Bennage</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;I just read this &lt;a title="Stories, requirements, and language" href="http://www.lostechies.com/blogs/jimmy_bogard/archive/2008/02/06/stories-requirements-and-language.aspx" target="_blank"&gt;great post&lt;/a&gt; by Jimmy Bogard over at&amp;nbsp; &lt;a title="another place where you should subscribe to the feed!" href="http://www.lostechies.com/" target="_blank"&gt;Los Techies&lt;/a&gt;. He talks about &lt;a href="http://www.extremeprogramming.org/rules/userstories.html" target="_blank"&gt;user stories&lt;/a&gt; and the fact that &lt;em&gt;what you call a user story&lt;/em&gt; is very important. (&lt;a title="Yes, I&amp;#39;m editing Shakespeare" href="http://www.enotes.com/shakespeare-quotes/what-s-name-that-which-we-call-rose" target="_blank"&gt;A rose by another other name would&lt;em&gt; not&lt;/em&gt; smell as sweet&lt;/a&gt;. ) Words affect how we think about things; though we don&amp;#39;t like to admit it.&amp;nbsp; I&amp;#39;ve definitely struggled with this myself.&lt;/p&gt; &lt;p&gt;If you ever communicate with your clients, then I recommend checking out the post.&amp;nbsp; It&amp;#39;s short too. &lt;/p&gt; &lt;p&gt;I particularly like his comment that prioritizing a requirement is like putting lipstick on a pig.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=39397" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Agile/default.aspx">Agile</category></item><item><title>Continuous Integration with Draco.NET</title><link>http://devlicio.us/blogs/christopher_bennage/archive/2007/08/12/continuous-integration-with-draco-net.aspx</link><pubDate>Sun, 12 Aug 2007 19:37:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:38047</guid><dc:creator>Christopher Bennage</dc:creator><slash:comments>15</slash:comments><description>&lt;p&gt;At our most recent .NET users group meeting,&amp;nbsp;&lt;a href="http://www.devfish.net/" title="Developer Evangelist for Microsoft Gulf States" target="_blank"&gt;Joe Healy&lt;/a&gt; asked for a show of hands&amp;nbsp;for those doing Continuous Integration.&amp;nbsp; There were about 40 of us and (I&amp;#39;m pretty sure) no one raised their hand.&lt;/p&gt;
 
&lt;p&gt;A few years back, I had a &lt;a href="http://nant.sourceforge.net/" target="_blank"&gt;NAnt&lt;/a&gt; script that was scheduled to execute nightly (you could also call it manually via a classic ASP page).&amp;nbsp; The script would grab the source from Subversion, build it, execute&amp;nbsp;some SQL&amp;nbsp;scripts to&amp;nbsp;construct a fresh&amp;nbsp;database, bcp in some data, and finally publish the Web application to the staging server. (Notice that I didn&amp;#39;t mention anything about unit testing). This was the closest I ever got to Continuous Integration, and I was &lt;i&gt;tempted&lt;/i&gt; to raise my hand.&lt;/p&gt;
 &lt;h4&gt;Why I didn&amp;#39;t do it...&lt;/h4&gt; 
&lt;p&gt;I&amp;#39;ve thought about CI many times over the years, but I kept putting it off.&amp;nbsp; The configuration challenge was always a bit daunting. A couple of months ago, I started to get excited again after watching the &lt;a href="http://www.dnrtv.com/default.aspx?showID=64" title="Scott Hanselman and Jay Flowers on CI Factory" target="_blank"&gt;dnrTV episode on CI Factory&lt;/a&gt;. However, even with the simplification brought about by CI Factory, it didn&amp;#39;t quite seem worth the effort.&amp;nbsp; (I should punctuate that we are still a small shop operating in teams of 2&amp;nbsp;or 3).&amp;nbsp;&lt;/p&gt;
 
&lt;p&gt;I had mostly experimented with CruiseControl.NET in the past, and the configuration was more than I wanted to deal with.&lt;/p&gt;
 &lt;h4&gt;I Value Simplicity.&lt;/h4&gt; 
&lt;p&gt;Or as &lt;a href="http://www.ayende.com/Blog/archive/2007/04/29/TFS-Zero-Friction-and-living-in-an-imperfect-world.aspx" title="TFS, Zero Friction and living in an imperfect world" target="_blank"&gt;Ayende might say Zero Friction&lt;/a&gt;.&amp;nbsp; I imagine that CC.NET might have been zero friction to use, if I had ever gotten past the setup.&amp;nbsp; (I will readily admit a good deal of laziness here).&lt;/p&gt;
 
&lt;p&gt;After Joe&amp;#39;s admonition about not doing CI, I asked Google about my choices for CI in the .NET world and it reminded me of &lt;a href="http://draconet.sourceforge.net/" target="_blank"&gt;Draco.NET&lt;/a&gt;.&lt;/p&gt;
 
&lt;p&gt;I installed Dract.NET, and I was happily doing CI within an hour.&lt;/p&gt;
 &lt;h4&gt;How to configure Draco.NET&lt;/h4&gt; 
&lt;p&gt;Specifically, I will step through how I set it up to work with Subversion 1.4.4&amp;nbsp;and NAnt 0.85.&lt;/p&gt;
 
&lt;ul&gt; 
&lt;li&gt;Download Draco Server 1.6.4 from &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=66880" title="project page on SF.net" target="_blank"&gt;here&lt;/a&gt;.&lt;/li&gt;
 
&lt;li&gt;The installer will create a service named &amp;quot;&lt;b&gt;Draco.NET&lt;/b&gt;&amp;quot;.&lt;br /&gt;In order to have this service work properly with NAnt I had to run it under domain account.&amp;nbsp; (At first I used &lt;i&gt;Local System Account with Allow service to interact with desktop&lt;/i&gt;, but it reported a File Not Found when it attempted to call nant.exe.)&lt;/li&gt;
 
&lt;li&gt;Add the bin directory for NAnt to your path.&amp;nbsp; Additionally, I copied the some assemblies from NAntContrib and MbUnit in the NAnt bin directory in order to access tasks for msbuild and MbUnit within my NAnt script.&lt;/li&gt;
 
&lt;li&gt;The install will create a directory at &amp;quot;&lt;b&gt;C:\Program Files\Draco.NET Service&lt;/b&gt;&amp;quot; and place&amp;nbsp;two config files in a subdirectory &lt;b&gt;bin&lt;/b&gt;.&lt;/li&gt;
 
&lt;li&gt;The default Draco.exe.config is fine, but I recommend taking a look at it.&lt;/li&gt;
 
&lt;li&gt;The other file, &lt;b&gt;Draco.builds.config&lt;/b&gt;,&amp;nbsp;tells Draco what projects to monitor.&amp;nbsp; It can point to many projects under diverse source control.&amp;nbsp; &lt;/li&gt;
 
&lt;li&gt;I deleted all of the &amp;lt;build/&amp;gt; nodes expect for the one referencing Subversion. You will have one &amp;lt;build/&amp;gt; node for every project the server monitors.&lt;/li&gt;
 
&lt;li&gt;Inside the &amp;lt;build /&amp;gt; node:&lt;br /&gt;&amp;lt;name /&amp;gt; is merely a unique name to identify the project.&lt;br /&gt;&amp;lt;nant /&amp;gt; tells Draco to use NAnt to execute the build process, and points to your build file within the source that it checked out.&lt;br /&gt;&amp;lt;svn /&amp;gt; tells Draco the repository that it will monitor for this build.&amp;nbsp; You&amp;#39;ll probably want to create a readonly account for Draco to use.&lt;/li&gt;
&lt;/ul&gt;
 &lt;h4&gt;What Draco does&lt;/h4&gt; 
&lt;p&gt;Aside from hating Harry Potter...&lt;/p&gt;
 
&lt;p&gt;Draco will poll the repository in the build every 60 by default.&amp;nbsp; If it finds any modifications since the last build, it will wait for the repository to be quiet for a designated amount of time (again 60 seconds by default).&amp;nbsp; Quiet means no further commits during the period.&amp;nbsp; After the repository been quiet, it will check out the source to a temp directory and then execute NAnt script.&lt;/p&gt;
 
&lt;p&gt;At this point, it is really up to your NAnt script.&amp;nbsp; Currently, mine is very simple.&amp;nbsp; &lt;a href="http://nantcontrib.sourceforge.net/" title="You&amp;#39;ll need NAntContrib to call msbuild elegantly from your script." target="_blank"&gt;It calls msbuild&lt;/a&gt; to compile the solutions, and then calls MbUnit to execute the tests.&lt;/p&gt;
 &lt;h4&gt;Monitoring the Build&lt;/h4&gt; 
&lt;p&gt;Draco.NET has a client for monitoring the status of builds available &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=66880" target="_blank"&gt;here&lt;/a&gt;.&amp;nbsp; I installed 1.6.4, and it did not add anything to my start menu.&lt;/p&gt;
 
&lt;p&gt;It installed a help file to this location:&lt;br /&gt;C:\Program Files\Draco.NET Client Tools\Draco.chm&lt;/p&gt;
 
&lt;p&gt;And a monitoring app that runs in the systray here:&lt;br /&gt;C:\Program Files\Draco.NET Client Tools\bin\DracoGui.exe&lt;/p&gt;
 
&lt;p&gt;In addition to monitoring, you can:&lt;/p&gt;
 
&lt;ul&gt; 
&lt;li&gt;&lt;b&gt;Start Build&lt;/b&gt; - which tells Draco to check the repository for modifications, but only starts the build if there has been a change.&lt;/li&gt;
 
&lt;li&gt;&lt;b&gt;Force Start Build&lt;/b&gt; - which kicks off a build even if there no modifications.&lt;/li&gt;
&lt;/ul&gt;
 
&lt;p&gt;Finally, there is an install for monitoring builds over the Web, but I haven&amp;#39;t played with that yet.&lt;/p&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http://devlicious.com/blogs/christopher_bennage/archive/2007/08/12/continuous-integration-with-draco-net.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://devlicious.com/blogs/christopher_bennage/archive/2007/08/12/continuous-integration-with-draco-net.aspx" alt="kick it on DotNetKicks.com" border="0" /&gt;&lt;/a&gt;

&lt;img src="http://devlicio.us/aggbug.aspx?PostID=38047" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/development+tools/default.aspx">development tools</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/XP/default.aspx">XP</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Continuous+Integration/default.aspx">Continuous Integration</category></item><item><title>Scrumming for the first time</title><link>http://devlicio.us/blogs/christopher_bennage/archive/2007/08/03/scrumming-for-the-first-time.aspx</link><pubDate>Fri, 03 Aug 2007 21:54:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:36693</guid><dc:creator>Christopher Bennage</dc:creator><slash:comments>8</slash:comments><description>
&lt;p&gt;We finished our second sprint today.&amp;nbsp; In fact, I just left the Sprint Retrospective Meeting (which was actually quite brief).&lt;/p&gt;
 
&lt;p&gt;We&amp;#39;ve been very lucky to have a client that &lt;i&gt;insisted&lt;/i&gt; on using &lt;a href="http://en.wikipedia.org/wiki/Scrum_%28development%29" title="So what is Scrum anyway?" target="_blank"&gt;Scrum&lt;/a&gt; to manage the project.&amp;nbsp; Before this I only had a cursory knowledge of Scrum. We are a small shop, and while we&amp;#39;ve been influenced significantly by &lt;a href="http://en.wikipedia.org/wiki/Extreme_Programming" title="XP?" target="_blank"&gt;Extreme Programming&lt;/a&gt;&amp;nbsp;(XP), we haven&amp;#39;t had the mass to implement all the practices we&amp;#39;d like.&lt;/p&gt;
 &lt;h4&gt;What is Scrum?&lt;/h4&gt; 
&lt;p&gt;I discovered quickly that I had&amp;nbsp;a misconception about Scrum.&amp;nbsp; I had assumed that it was just a different flavor of the &lt;i&gt;same thing as XP&lt;/i&gt;.&amp;nbsp;But there&amp;#39;s a difference of scale, Scrum is about managing a project, or multiple projects.&amp;nbsp; Within Scrum you might have multiple teams, and each of those teams is responsible for Self Organizing.&amp;nbsp; XP is one way for a team to self-organize.&amp;nbsp; In this way, XP fits nicely inside of Scrum.&amp;nbsp; &lt;/p&gt;
 
&lt;p&gt;I began reading &lt;a href="http://www.amazon.com/Agile-Project-Management-Microsoft-Professional/dp/073561993X" title="Agile Project Management with Scrum" target="_blank"&gt;Ken Schwaber&amp;#39;s book&lt;/a&gt; just before this project started.&amp;nbsp; I highly recommend it.&amp;nbsp; It is a set of case studies discussing how Scrum works, and it comes across as honest and realistic.&lt;/p&gt;
 
&lt;p&gt;The significant parts of Scrum, as adapted from Ken&amp;#39;s book, are: &lt;/p&gt;
 
&lt;ul&gt; 
&lt;li&gt;&lt;b&gt;Scrum Master&lt;/b&gt; - The individual responsible for managing the Scrum process.&amp;nbsp; The Scrum Master&amp;#39;s job is to &lt;i&gt;facilitate&lt;/i&gt; the project. On our current project, this role is filled by our client&amp;#39;s IT Director.&lt;/li&gt;
 
&lt;li&gt;&lt;b&gt;Product Owner&lt;/b&gt; - The representative of the stakeholders.&amp;nbsp; An individual responsible for making the final decisions about what needs to get done.&amp;nbsp; On our current project, this role is filled by an employee who was a Power User of the legacy system we are replacing.&lt;/li&gt;
 
&lt;li&gt;&lt;b&gt;The Team&lt;/b&gt; - The people responsible for doing the work.&amp;nbsp; In this case, it&amp;#39;s &lt;a href="http://www.bluespire.com/blogs" title="Blue Spire Consulting, Inc.  You should hire us!" target="_blank"&gt;my company&lt;/a&gt;.&lt;/li&gt;
 
&lt;li&gt;&lt;b&gt;Sprint&lt;/b&gt; -&amp;nbsp;Typically,&amp;nbsp;a sprint is a 30 day span of time, during which the team is working toward a specific goal.&amp;nbsp; On our current project,&amp;nbsp;sprints are just&amp;nbsp;two weeks (some XP influence here).&amp;nbsp; I think 30 days is preferable though.&lt;/li&gt;
 
&lt;li&gt;&lt;b&gt;Product Backlog&lt;/b&gt; - this is the list of requirements.&amp;nbsp; It can always be added to.&amp;nbsp; In our case, it is a list of User Stories.&amp;nbsp; Each sprint begins with a meeting to decide which stories from the Product Backlog will be worked on in the upcoming sprint.&amp;nbsp; The stories that the team commits to are then moved the Sprint Backlog.&lt;/li&gt;
 
&lt;li&gt;&lt;b&gt;Daily Scrum&lt;/b&gt; -&amp;nbsp;A daily, but brief meeting, where the Scrum Master has the the team answer three questions: What did you do yesterday? What are you doing today? And what is getting&amp;nbsp;in your way?&lt;/li&gt;
&lt;/ul&gt;
 &lt;h4&gt;First Impressions&lt;/h4&gt; 
&lt;p&gt;I will first acknowledge my basis: I believe in &lt;a href="http://agilemanifesto.org/" title="Manifesto for Agile Software Development" target="_blank"&gt;Agile&lt;/a&gt; methodology and the concepts underlying Scrum resonate with me.&amp;nbsp; &lt;/p&gt;
 
&lt;p&gt;But how does it shake out in practice?&lt;/p&gt;
 
&lt;p&gt;I think that Scrum is a great way to manage software projects.&amp;nbsp; Possibly, the best that I have attempted. However, based on my limited experience here are few things to consider.&lt;/p&gt;
 
&lt;p&gt;&lt;b&gt;It is hard to write &lt;i&gt;good&lt;/i&gt; user stories.&lt;/b&gt;&amp;nbsp; I&amp;#39;ve struggled with this for several years now, and I hate to admit it. The problem mostly lies with my tendency toward optimism.&amp;nbsp;We&amp;#39;ll write some initial&amp;nbsp;stories, they&amp;#39;ll sound great to the stakeholders.&amp;nbsp; We commit to delivering them by such and such a date, then we begin to realize that we left out a number of prerequisites.&amp;nbsp; I always pad my numbers, so it has always worked out, but it feels too much like guess work to me.&amp;nbsp;&amp;nbsp;(I have Mike Cohn&amp;#39;s &lt;a href="http://www.amazon.com/User-Stories-Applied-Development-Addison-Wesley/dp/0321205685/" title="User Stories Applied: For Agile Software Development" target="_blank"&gt;User Stories Applied&lt;/a&gt; on my desk, but I have to finish finding out what happens to Harry first.)&lt;/p&gt;
 
&lt;p&gt;&lt;b&gt;The mechanics of tracking are awkward.&lt;/b&gt; We&amp;#39;ve been using &lt;a href="http://www.targetprocess.com/" title="TP v.2" target="_blank"&gt;TargetProcess&lt;/a&gt; to keep track of the Product Backlog, monitor burn down, etc.&amp;nbsp; I had used version 1.x and I liked it, however 2.x is a little overkill I think.&amp;nbsp; I believe that it&amp;#39;s likely a great tool, but&amp;nbsp;I lack the patience to overcome the learning curve, at least&amp;nbsp;at the moment. 4 x6 note cards are becoming &amp;nbsp;more and more attractive to me.&amp;nbsp; (I also like white boards!)&lt;/p&gt;
 
&lt;p&gt;Ok, so neither of these caveats is the fault of Scrum.&amp;nbsp; However, they both fall in a region that Scrum leaves undefined.&lt;/p&gt;
 &lt;h4&gt;Finally&lt;/h4&gt; 
&lt;p&gt;I think it is hard to sell Scrum to a client.&amp;nbsp; We are a consulting company.&amp;nbsp; Our clients come to us and they want to know exactly how much&amp;nbsp;they will spend to get custom&amp;nbsp;software.&amp;nbsp;We all know that it is inherently impossible to predict the cost of developing custom software.&amp;nbsp; Scrum (and agile practices in general) acknowledge this and provide a solution.&amp;nbsp; However, clients still want a commitment to deliver X for Y amount of money in Z amount of time.&amp;nbsp; It is hard to convince a client to work with something &amp;quot;open-ended&amp;quot; like Scrum.&amp;nbsp; (I think that this is not a problem for in house projects). Again, we&amp;#39;ve been very been very blessed to have a client who understands custom software development and asked for this.&lt;/p&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http://devlicious.com/blogs/christopher_bennage/archive/2007/08/03/scrumming-for-the-first-time.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://devlicious.com/blogs/christopher_bennage/archive/2007/08/03/scrumming-for-the-first-time.aspx" alt="kick it on DotNetKicks.com" border="0" /&gt;&lt;/a&gt;
&lt;img src="http://devlicio.us/aggbug.aspx?PostID=36693" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/XP/default.aspx">XP</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Scrum/default.aspx">Scrum</category></item><item><title>Best Practices, Training, &amp; Tools</title><link>http://devlicio.us/blogs/christopher_bennage/archive/2007/06/18/best-practices-training-tools.aspx</link><pubDate>Mon, 18 Jun 2007 20:44:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:29279</guid><dc:creator>Christopher Bennage</dc:creator><slash:comments>4</slash:comments><description>&lt;p&gt;We were recently contracted to assist a development team in employing some &lt;i&gt;Best Practices&lt;/i&gt;.&amp;nbsp; Specifically, they were interested in learning Agile.&lt;/p&gt; &lt;p&gt;We began by speaking with the developers and managers to try to determine what would benefit them the most.&amp;nbsp; We were only given three weeks to teach/guide/coach, and we knew that we could easily overwhelm them and thus provide no value.&lt;/p&gt; &lt;p&gt;After the initial exploration, we decided to focus these ideas:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;TDD\BDD&lt;/li&gt; &lt;li&gt;O\R M&lt;/li&gt; &lt;li&gt;MVC/MVP (they have a focus on Web development)&lt;/li&gt; &lt;li&gt;Iterations, User Stories, Planning Game, etc.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;We were also sprinkling bits of Domain-Driven Design through-out.&lt;/p&gt; &lt;p&gt;What surprised me about this experience is that fact that I &lt;i&gt;could not &lt;/i&gt;teach these concepts without discussing the supporting tools.&amp;nbsp; Maybe this seem strikingly obvious, but it did not occur to me until we were outlining the agenda for our daily training sessions.&amp;nbsp; It went something like this:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Monday, &lt;a href="http://www.codeproject.com/useritems/ModelViewPresenter.asp" title="thanks Billy" target="_blank"&gt;MVP &amp;amp; WebForms&lt;/a&gt;&lt;/li&gt; &lt;li&gt;Tuesday, MVC&amp;nbsp; &amp;amp; MonoRail&lt;/li&gt; &lt;li&gt;Wednesday, &lt;a href="http://nspecify.sourceforge.net/" title="Behavior Driven Development" target="_blank"&gt;NSpecify&lt;/a&gt;&lt;/li&gt; &lt;li&gt;Thursday, NHibernate&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Ayende already hit on&amp;nbsp;&lt;a href="http://www.ayende.com/Blog/archive/2007/06/03/Domain-Driven-on-Naked-CLR.aspx" title="Domain Driven on Naked CLR?" target="_blank"&gt;this idea&lt;/a&gt;, but I guess that it did not sink in for me. I love these tools, but I just wish that they were not so conspicuous in what I consider to be a &lt;i&gt;&lt;a href="http://laribee.com/blog/2007/04/10/altnet/" title="I'm ALT.NET, but I don't mean to be!" target="_blank"&gt;better way of doing software development&lt;/a&gt;&lt;/i&gt;.&lt;/p&gt; &lt;p&gt;...&lt;/p&gt; &lt;p&gt;It occurred to me later that some future generation of developers will very rarely think about all of this, in the same way that I so infrequently think about memory management and garbage collection.&amp;nbsp; I believe we are in a transition (and maybe it's always in transit).&amp;nbsp; Best Practices are always trickling their way down lower and lower into the stack, as Software Development moves from &lt;i&gt;combing letters into words&lt;/i&gt; towards &lt;i&gt;writing poetry&lt;/i&gt;.&lt;/p&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=29279" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/development+tools/default.aspx">development tools</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/XP/default.aspx">XP</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/TDD/default.aspx">TDD</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Musings/default.aspx">Musings</category></item><item><title>Sam's List</title><link>http://devlicio.us/blogs/christopher_bennage/archive/2007/01/25/sam-s-list.aspx</link><pubDate>Thu, 25 Jan 2007 19:47:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:6233</guid><dc:creator>Christopher Bennage</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;I've been overloaded lately with my infant .NET consulting company, and I have to apologize for the lack of consistent posts.&amp;nbsp; &lt;/p&gt;&lt;p&gt;I just read a terse, but very &lt;a href="http://codebetter.com/blogs/sam.gentile/archive/2007/01/25/Our-.NET-3.0-Enterprise-Application-and-Architecture-Shipped.aspx"&gt;insightful post&lt;/a&gt; from Sam Gentile. You'll need to dig into it and read the cross links, but it's a worth the while.&amp;nbsp; Basically, he's covering the techniques and technologies that he employed over the last 14 months on an enterprise scale project.&lt;br&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=6233" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Design+Patterns/default.aspx">Design Patterns</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/.NET+3.0/default.aspx">.NET 3.0</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/Software+Architecture/default.aspx">Software Architecture</category><category domain="http://devlicio.us/blogs/christopher_bennage/archive/tags/XP/default.aspx">XP</category></item></channel></rss>