<?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>Jak Charlton - Insane World : Agile, Rants</title><link>http://devlicio.us/blogs/casey/archive/tags/Agile/Rants/default.aspx</link><description>Tags: Agile, Rants</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>Trust, Honesty, Openness, Cooperation and Friction-free Tooling</title><link>http://devlicio.us/blogs/casey/archive/2011/05/03/trust-honesty-openness-cooperation-and-friction-free-tooling.aspx</link><pubDate>Tue, 03 May 2011 22:59:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:67188</guid><dc:creator>Jak Charlton</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/rsscomments.aspx?PostID=67188</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/commentapi.aspx?PostID=67188</wfw:comment><comments>http://devlicio.us/blogs/casey/archive/2011/05/03/trust-honesty-openness-cooperation-and-friction-free-tooling.aspx#comments</comments><description>&lt;p&gt;There is an inherent danger in using electronic tools to manage a process like software development, and one that almost always comes true - the tool defines your process, it doesn&amp;#39;t enable it.&lt;/p&gt;
&lt;p&gt;When people encounter limitations in the software tool, they begin to accept that these are limitations of the process and these become ingrained in your methodology. If the tool doesn&amp;#39;t support the &amp;quot;thing you want to do&amp;quot; then it is far easier to change the &amp;quot;thing&amp;quot; rather than rewrite or change the software.&lt;/p&gt;
&lt;p&gt;Were any of the electronic tools to have got the process &amp;quot;right&amp;quot; this might not be such a bad thing, but it would be reasonable to assume that in a field as adaptive and evolutionary as software development there is no such thing as the &amp;quot;right&amp;quot; process for an individual team, let alone for such a widely disparate ecosystem as development.&lt;/p&gt;
&lt;p&gt;And this conflict between our tools and our actual practices and processes is what we refer to as &amp;quot;friction&amp;quot;, and as physics defines it;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Friction is the &amp;quot;evil&amp;quot; of all motion. No matter which direction something moves in, friction pulls it the other way. Move something left, friction pulls right. Move something up, friction pulls down. It appears as if nature has given us friction to stop us from moving anything.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;We aim for &amp;quot;friction-free&amp;quot; tools to allow us to better get on with moving things, specifically developing software, which is a constantly moving and adaptive process.&lt;/p&gt;
&lt;p&gt;Some tools aim to allow endless configuration or programmability, in their objective of being a universal solution. These tools tend to actually make the problem worse, by either leaving you bogged down in configuration or customisation, or leaving the tool so generic that it solves no problem at all.&lt;/p&gt;
&lt;p&gt;Of course, some tools are better than others. Lightweight tools are obviously going to create less friction as they have less moving parts, and less touch points with your actual process.&amp;nbsp;&amp;nbsp;But these are the ones that some see as &amp;quot;lacking features&amp;quot;, or as being &amp;quot;too simplistic&amp;quot; - but it is these things specifically that enable the process of development to continue.&lt;/p&gt;
&lt;p&gt;And ultimately, these tools expose a greater problem - there is usually a disjoint between project management and the development teams here. A lack of trust and visibility leads managers to seek to control or monitor the process more tightly, and these tools promise to allow that to happen. Surely if we can tie everything into a database or a spreadsheet or something similar, we can then see exactly what is happening, who is doing what, when things will be done, and how long they will take?&lt;/p&gt;
&lt;p&gt;But it is not the tool that enables this to happen - it is serving here merely to try and enforce control upon people - which as any good manager knows, enforcement is a far blunter instrument than cooperation.&lt;/p&gt;
&lt;p&gt;What enables proper management of the software development process is trust, honesty, openness and cooperation. Tools should reflect and enable those objectives, rather than try to enforce them. And most importantly, they should stay out of the way of the development teams to allow them to get on with their real job - developing software.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=67188" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/casey/archive/tags/Practices+and+Principles/default.aspx">Practices and Principles</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Rants/default.aspx">Rants</category></item><item><title>Agile is Performance, Feedback, Revision</title><link>http://devlicio.us/blogs/casey/archive/2010/04/15/agile-is-performance-feedback-revision.aspx</link><pubDate>Thu, 15 Apr 2010 02:45:08 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:57265</guid><dc:creator>Jak Charlton</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/rsscomments.aspx?PostID=57265</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/commentapi.aspx?PostID=57265</wfw:comment><comments>http://devlicio.us/blogs/casey/archive/2010/04/15/agile-is-performance-feedback-revision.aspx#comments</comments><description>&lt;p&gt;I came across a great video link yesterday, entitled “&lt;a href="http://blog.newhumanist.org.uk/2010/03/see-baba-brinkmans-rap-guide-to.html" target="_blank"&gt;Performance, Feedback, Revision&lt;/a&gt;”. It’s a Canadian rapper named Baba Brinkman covering the theory of evolution and the work of Charles Darwin, and he equates evolution with how he writes his lyrics, Performance, Feedback, Revision.&lt;/p&gt;  &lt;p&gt;As I listened to it, it struck me that this is Agile … we develop, we run retrospectives, and we revise what we have.&lt;/p&gt;  &lt;p&gt;Evolution may be more like waterfall, and take millions of years to evolve something as fundamentally pointless as the &lt;a href="http://www.talkorigins.org/faqs/vestiges/appendix.html" target="_blank"&gt;appendix&lt;/a&gt;, and in Agile we may look to have Performance, Feedback and Revision inside a week or two.&lt;/p&gt;  &lt;p&gt;I can’t quite believe I just showed this video to a client to explain Agile, but it seemed to get the idea across pretty well. I’m considering using it more often, but I promise to draw the line at learning to rap.&lt;/p&gt;  &lt;p&gt;But from now on, in big letters across the top of my white boards will go the words:&lt;/p&gt;  &lt;h3 align="center"&gt;Performance, Feedback, Revision&lt;/h3&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=57265" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/casey/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Rants/default.aspx">Rants</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Architecture/default.aspx">Architecture</category></item><item><title>Ship it, or Ship Out</title><link>http://devlicio.us/blogs/casey/archive/2009/09/25/ship-it-or-ship-out.aspx</link><pubDate>Fri, 25 Sep 2009 08:38:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:51716</guid><dc:creator>Jak Charlton</dc:creator><slash:comments>27</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/rsscomments.aspx?PostID=51716</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/commentapi.aspx?PostID=51716</wfw:comment><comments>http://devlicio.us/blogs/casey/archive/2009/09/25/ship-it-or-ship-out.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://www.joelonsoftware.com/"&gt;Joel&lt;/a&gt;, in his inimitable way, &lt;a href="http://www.joelonsoftware.com/items/2009/09/23.html"&gt;posted the flame bait of all flame bait posts yesterday&lt;/a&gt;, explaining the role of the Duct Tape Programmer.&lt;/p&gt;
&lt;p&gt;To my surprise, the Twitterverse started to reverberate with commentary, but weirdly, almost all of it was very negative about the post, many claiming that Joel was just creating straw men and knocking them down, or was characterising developers who care about quality as being poor developers.&lt;/p&gt;
&lt;p&gt;I was surprised, because I read the article totally the other way around - and had said so earlier in the day to someone on Twitter, saying I largely agreed with it. It seems that there were two ways of reading the article, and mine differed substantially to most people I follow on Twitter.&lt;/p&gt;
&lt;p&gt;I was quite pleased to see Michael Neel post last night in a &lt;a href="http://devlicio.us/blogs/vinull/archive/2009/09/24/being-a-duct-tape-programmer.aspx"&gt;semi-defence of Joel&amp;#39;s standpoint&lt;/a&gt;, and I thought the 140 char limit of Twitter wasn&amp;#39;t enough for me to post my opinions.&lt;/p&gt;
&lt;h3&gt;Background&lt;/h3&gt;
&lt;p&gt;Joel has a bit of a record on this, he isn&amp;#39;t best liked by a large proportion of the developer community who see their focus and remit as producing high quality, well tested and highly maintainable software. His &lt;a href="http://blog.stackoverflow.com/2009/01/podcast-38/"&gt;original tirades in a podcast&lt;/a&gt; about his deep distrust of Test Driven Development and of Unit Testing in &lt;a href="http://blog.objectmentor.com/articles/2009/01/31/quality-doesnt-matter-that-much-jeff-and-joel"&gt;general brought uproar&lt;/a&gt;. And on that matter he was so far off the mark, it was understandable why he had riled so many people - he really just didn&amp;#39;t understand or &amp;quot;get&amp;quot; TDD or testing in general.&lt;/p&gt;
&lt;p&gt;But, what he had done, in conjunction with &lt;a href="http://www.codinghorror.com/blog/"&gt;Jeff Atwood&lt;/a&gt;, was to deliver a website, &lt;a href="http://stackoverflow.com/"&gt;stackoverflow.com&lt;/a&gt;, that was proving hugely successful, and was being used extensively by all those same developers who railed against his podcasts and blogs.&lt;/p&gt;
&lt;p&gt;That website, as Joel and Jeff explained, was not done with TDD, was not well tested (via Unit Tests), was badly hacked together in places, and used &amp;quot;old&amp;quot; technologies like TSQL over &amp;quot;modern&amp;quot; solutions like ORMs&lt;/p&gt;
&lt;p&gt;Whether Joel &amp;quot;got&amp;quot; TDD wasn&amp;#39;t important, what he and Jeff had done was to ship a product, get it to market, and build upon that release to make stackoverflow the massive success it is today. It&amp;#39;s so successful, that soon after stackoverflow was released, they used the same code and model to release other Q&amp;amp;A sites, and they continue to do so.&lt;/p&gt;
&lt;h3&gt;The Duct Tape Programmer&lt;/h3&gt;
&lt;p&gt;So with all of that in mind, it was sort of obviously flame bait for Joel to make a post that basically boiled down to &amp;quot;shipping it way more important than fancy patterns and great tools&amp;quot; - he certainly has a way of putting such a simple message that can antagonise the meekest of individuals (and some not so meek). &lt;/p&gt;
&lt;p&gt;It was a terrible choice of label, but I guess &amp;quot;Pragmatic Programmer&amp;quot; had already been taken.&lt;/p&gt;
&lt;h3&gt;Time, Quality, Functionality&lt;/h3&gt;
&lt;p&gt;I read the article slight differently - I read it as an urge to maintain your highest priority as shipping the product your business wants you to ship.&lt;/p&gt;
&lt;p&gt;There are three factors involved in a project (if you exclude Resourcing, which falls under Brooks Law):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Time&lt;/li&gt;
&lt;li&gt;Quality&lt;/li&gt;
&lt;li&gt;Functionality (or Scope)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you try and maintain all three factors as fixed, your project is doomed to fail. Something will, unless you are really lucky, break. And then one of those factors will suffer, and it will be luck as to which it is. At best you can fix two of those factors, and then the third has to be allowed to slip when the unexpected happens (as it always does).&lt;/p&gt;
&lt;p&gt;But, the important part here, is that which of those factors is fixed, and which is allowed to slip is NOT a developer decision - it is a business decision.&lt;/p&gt;
&lt;p&gt;Much of the outrage about Joel&amp;#39;s article stated that he isn&amp;#39;t a developer - and they are correct - he is a business owner, and prior to that a project manager. His focus is therefore on shipping his product, and inevitably from that perspective, the instinct is to fix Time and Functionality (ship as soon as possible, with as much functionality as possible) and to let Quality suffer to achieve that objective.&lt;/p&gt;
&lt;p&gt;This is a TOTALLY VALID business decision - it is just one that developers don&amp;#39;t like, it offends their sense of code quality and high standards.&lt;/p&gt;
&lt;h3&gt;Why Do Developers Care So Much About Quality?&lt;/h3&gt;
&lt;p&gt;I&amp;#39;ll start with the cynical view: development is only fun while you are trying new things, trying to perfect a tricky algorithm, or make some great new OSS component do some magic. By nature, the developers who care deeply about quality are also perfectionists, they like to make sure they have done a good job, and have written the best code they can.&lt;/p&gt;
&lt;p&gt;Go on, admit it, if developers just did routine coding all day long, our jobs would be boring. We like new toys, new language features, we like to play.&lt;/p&gt;
&lt;p&gt;And we know that better code will be easier to maintain - and developers HATE bug fixing duty, so we want to ensure we don&amp;#39;t have to do much of it.&lt;/p&gt;
&lt;p&gt;To a developer, the most important factor in any project is Quality, followed by Time (because we know our bosses will be mad if we miss our deadlines), but we are happy to slip Functionality because it matters little to us if a new feature isn&amp;#39;t included in the release.&lt;/p&gt;
&lt;h3&gt;Fundamentally We Are Not Aligned&lt;/h3&gt;
&lt;p&gt;Developers and business owners are not aligned in their goals - we prioritise the three factors very differently, and for different reasons.&lt;/p&gt;
&lt;p&gt;Only two things can happen here, your developers need to align with their business objectives, or the business needs to align with the developers - or they can both compromise.&lt;/p&gt;
&lt;p&gt;Agile is all about the compromise, making both sides aware of the issues involved, and then coming to an agreement, but fundamentally - it is STILL A BUSINESS DECISION.&lt;/p&gt;
&lt;p&gt;While it is the responsibility of a professional developer to explain all the problems they see with low quality code, and to make their boss aware of all the potential future issues this may cause, it is also their professional responsibility to go with the decision their boss makes.&lt;/p&gt;
&lt;p&gt;They have one other option - resign and go somewhere that is more closely aligned with their values.&lt;/p&gt;
&lt;h3&gt;Ship It or Ship Out&lt;/h3&gt;
&lt;p&gt;Whatever your opinions of Joel and Jeff&amp;#39;s understandings of TDD, Unit testing, maintainable code or just code in general (and I&amp;#39;m sure yours aren&amp;#39;t too far from mine), you have to admit they delivered a product to market (many in fact), and have turned it into a huge success. They may have to pay for that speed to market later, but that was a business decision they were willing to take.&lt;/p&gt;
&lt;p&gt;Never underestimate the value to a business of being fast to market - there is a risk the product will be so bugged it will backfire - but there is a chance they could steal the march on their competitors, and gain critical traction. Business is all about assessing risk, that is what a business owner has to do, and if they do it right their business flourishes.&lt;/p&gt;
&lt;p&gt;If your boss wants a product shipped by a particular date, and that is their highest priority, you have a responsibility to ship it. If they won&amp;#39;t sacrifice functionality to achieve that goal, then code quality will have to suffer - in that case do the best you can do with the restraints you are under. And if all that fails, quit, go somewhere that appreciates your values and dedication to your art - you do not have a right to hold your employer to ransom.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So, Ship It or Ship Out.&lt;/strong&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=51716" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/casey/archive/tags/TDD/default.aspx">TDD</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Rants/default.aspx">Rants</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Twitter/default.aspx">Twitter</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Testing/default.aspx">Testing</category></item><item><title>Software Development is a Creative Skill, Building Houses is a Technical One</title><link>http://devlicio.us/blogs/casey/archive/2008/08/18/software-development-is-a-creative-skill-building-houses-is-a-technical-one.aspx</link><pubDate>Mon, 18 Aug 2008 06:26:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:41878</guid><dc:creator>Jak Charlton</dc:creator><slash:comments>14</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/rsscomments.aspx?PostID=41878</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/commentapi.aspx?PostID=41878</wfw:comment><comments>http://devlicio.us/blogs/casey/archive/2008/08/18/software-development-is-a-creative-skill-building-houses-is-a-technical-one.aspx#comments</comments><description>&lt;p&gt;&lt;a class="" href="http://bradwilson.typepad.com/"&gt;Brad Wilson&lt;/a&gt; mentioned on the &lt;a class="" href="http://groups.yahoo.com/group/testdrivendevelopment"&gt;TDD mailing list&lt;/a&gt; that the waste and inefficiency within the software industry was akin to the house building industry. I&amp;#39;m sure in some respects he is right, but in a more fundamental way I disagree.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;An average layman off the street hiring a builder can ask them to build a wall. The average layman can see if the wall isn&amp;#39;t straight, the average layman can see when bricks are not aligned, they can see when a house is built to a high quality finish, where attention has been paid to detail. They may not be able to see if the builder has been deceitful by using substandard materials or hiding shortcuts, but a few hundred pounds to a surveyor will tell them all they need to know.&lt;/p&gt;
&lt;p&gt;Even the most technical of software management cannot tell if a basic 5 line piece of code is well written or not, let alone an application comprising many millions of lines of code. The best of them cannot even tell a &amp;quot;good&amp;quot; user experience from a &amp;quot;bad&amp;quot; one. It is almost accepted wisdom now that all developers write bad code, that all software is buggy, and that software projects never deliver what they promise.&lt;/p&gt;
&lt;p&gt;It is this problem that needs to be overcome ... it is easy to spend a lifetime in a development career, without ever having written a single line of even average quality code. There is very little visibility to non-developers.&lt;/p&gt;
&lt;p&gt;However, I assert the problem is that development is largely a creative skill, not a technical one. And creative skills are nearly impossible to quantify - you know when you like a piece of artwork, but you cannot say why in a way that means anything to anyone else. I cannot prove I am worth my daily rate, other than by people trusting me.&lt;/p&gt;
&lt;p&gt;With that kind of stumbling block, the best we can do is to rely upon automated tests, continuous integration, and Agile methodologies to at least make us more accountable, even if we are still unquantifiable.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=41878" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/casey/archive/tags/Practices+and+Principles/default.aspx">Practices and Principles</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Rants/default.aspx">Rants</category></item><item><title>Recovering a Project with ASP.NET MVC and Agile </title><link>http://devlicio.us/blogs/casey/archive/2008/08/13/recovering-a-project-with-asp-net-mvc-and-agile.aspx</link><pubDate>Wed, 13 Aug 2008 06:35:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:41809</guid><dc:creator>Jak Charlton</dc:creator><slash:comments>15</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/rsscomments.aspx?PostID=41809</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/commentapi.aspx?PostID=41809</wfw:comment><comments>http://devlicio.us/blogs/casey/archive/2008/08/13/recovering-a-project-with-asp-net-mvc-and-agile.aspx#comments</comments><description>&lt;p&gt;I recently got brought on board to a new client where, true to form, a project was in&amp;nbsp;a state of failure - everybody sort of knew it, but nobody would say it out loud.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What Was Going Wrong?&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;After my initial assessment, I made a quick decision that the major thing holding everyone back was an early decision to use MOSS 2007 to host an external website, and as the primary content management system. This wouldn&amp;#39;t have been a totally bad decision, if the team had a lot of good MOSS 2007 experience on board, but unfortunately they were learning as they went. If there is one thing that really doesn&amp;#39;t work well in MOSS it is a &amp;quot;lets just start and change it as we learn and go along&amp;quot; approach. MOSS takes a fair amount of careful up front analysis and planning to get right, and has enough permeutations and &amp;quot;gotchas&amp;quot; to require some good experience on the team before starting. Otherwise you can rapidly end up with a &lt;a class="" href="http://en.wikipedia.org/wiki/Big_ball_of_mud"&gt;big ball of mud&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So we took the decision that using MOSS was a major stumbling block, and this had to be removed from the equation. Of course it *could* have all been done in MOSS, but it wasn&amp;#39;t going to happen in the time left. There was also a small &amp;quot;jedi mind trick&amp;quot; involved too ... people had become so focused on the SharePoint &amp;quot;way&amp;quot; that they could no longer see the bigger picture.&lt;/p&gt;
&lt;p&gt;The decision was made to separate the public application away from MOSS, and to write it as a bespoke system. MOSS would still be used internally for document collaboration (which is where the strength of MOSS lies), and later on for publishing that information to the web site.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Software Stack&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;After some fast prototyping, some instinct based decisions, and a bit of faith, I finally decided on the following software stack to write the application:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;&lt;a class="" href="http://www.asp.net/mvc/"&gt;ASP.NET MVC&lt;/a&gt;&amp;nbsp;(&lt;a class="" href="http://www.codeplex.com/aspnet/Wiki/View.aspx?title=MVC&amp;amp;referringTitle=Home"&gt;preview 4&lt;/a&gt;)&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;a class="" href="http://www.hibernate.org/343.html"&gt;NHibernate&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;a class="" href="http://www.castleproject.org/activerecord/index.html"&gt;Castle ActiveRecord&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;a class="" href="http://www.castleproject.org/container/index.html"&gt;Castle Windsor&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;a class="" href="http://ayende.com/wiki/Rhino+Commons.ashx"&gt;Rhino Commons&lt;/a&gt; (IRepository, ARRepository, UnitOfWork)&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;a class="" href="http://logging.apache.org/log4net/index.html"&gt;log4net&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Some of these were fairly safe choices, I have used them before, or they are tried and tested in the field. But obviously the major exception to that rule was ASP.NET MVC&lt;/p&gt;
&lt;p&gt;I very briefly considered Monorail, but it does not have the tooling support or documentation support of ASP.NET MVC, and going forwards Monorail is likely to dwindle whilst ASP.NET MVC will only grow.&lt;/p&gt;
&lt;p&gt;I also considered writing a Webforms application, and using MVP to split the UI from the logic, but this approach required a fair ramp up from the developers, and had too many possible variations to try and coax people into the right appraoch.&lt;/p&gt;
&lt;p&gt;ASP.NET MVC therefore would provide a degree of familiarity to the ASP.NET developers we have in the team, whilst providing a clean separation of responsibilities. The only question was stability, which after asking around seemed not to be an issue, despite being only at preview stage (something MS haven&amp;#39;t done before but is very welcome here) nobody reported any problems.&lt;/p&gt;
&lt;p&gt;By changing pretty much every element of the software stack we were using the team&amp;nbsp;has been&amp;nbsp;revitalised, and has approached the project with renewed vigor and enthusiasm. They get to learn some new things for their CV (pretty much none of them have used any of the new comnponents), and due to the amount of &amp;quot;magic&amp;quot; that things like Rhino and Windsor introduce they could get on with writing real functionality almost from day one.&lt;/p&gt;
&lt;p&gt;I am very impressed by how fast the developers have picked up MVC, here a large amount of credit goes to MS for making a very usable, approachable, and simple framework that does exactly what it needs to, and very little more.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Making it Build With Continuous Integration&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When&amp;nbsp;I arrived there was no project in place. Nothing, nada. I could not pull the project, build it and see it work. As everything was being done in MOSS people were writing projects for each small bit of fucntionality, and manually copying assemblies into a single MOSS deployment. And the only source control that existed was Visual Source Safe.&amp;nbsp;To say the least, this was scary.&lt;/p&gt;
&lt;p&gt;So the first thing I did here was to install &lt;a class="" href="http://www.visualsvn.com/server/"&gt;VisualSVN&lt;/a&gt;&amp;nbsp;and &lt;a class="" href="http://www.jetbrains.com/teamcity/"&gt;TeamCity&lt;/a&gt; and get a build server running. After setting up a single solution with all the relevant projects included, we now have a build that operates on every check in, and it automatically displays on a web site for everyone internally to see the progress. On the dev machines we installed &lt;a class="" href="http://tortoisesvn.tigris.org/"&gt;Tortoise SVN&lt;/a&gt; and &lt;a class="" href="http://ankhsvn.open.collab.net/"&gt;Ankh SVN&lt;/a&gt;, Ankh now seems a lot more stable in version 2, but has some irritating quirks still - it is however much better than any MS source control plugin, and falling back to Tortoise almost always fixes the problem.&lt;/p&gt;
&lt;p&gt;We also installed the trial version of &lt;a class="" href="http://www.jetbrains.com/resharper/"&gt;ReSharper&lt;/a&gt; on the dev machines. None of the people here had used it before, but within only a few days we were hearing a lot of &amp;quot;oh wow&amp;quot;, &amp;quot;that&amp;#39;s amazing&amp;quot;, and &amp;quot;that used to take me so long to do&amp;quot; ... in a week or two we will have to buy licences, but I think it has more than justified itself to the development team.&lt;/p&gt;
&lt;p&gt;The URL of the build site was distributed to the business users, and now they take an active interest in telling me the &amp;quot;walking skeleton&amp;quot; is a &amp;quot;pile of bones&amp;quot; when someone changes the DB loging details last thing at night :) &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changing the Process&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Also evident was that the approach that was being taken to the project was classic waterfall, along with a mixture of daily constantly changing and fluctuating requests and requirements. Communication was good with daily meetings, but the same things seemed to be repeated at each.&lt;/p&gt;
&lt;p&gt;So another bold decision I took was to approach this as a far more Agile project - using some elements of XP.&lt;/p&gt;
&lt;p&gt;I threw out the gant chart - much to the dismay of the project manager - and started writing up story cards, which promptly got placed on a commandeered wall. The project manager now has these story cards listed in an Excel spreadsheet so that he and the people he reports to can see exaclty where things are in a palatable form, but the wall remains the &amp;quot;one true master&amp;quot;&lt;/p&gt;
&lt;p&gt;We changed the 8.30am sit down meeting to a 9.30am stand up meeting, and have been trying to enforce a fast &amp;quot;what I did yesterday, what I will do today, what is holding me up&amp;quot; approach to stop us getting dragged down into details.&lt;/p&gt;
&lt;p&gt;We now have a lot more communication between developers as a result of this, and the business representatives are feeling very involved. There is still a degree of trepidation around what will be delivered, my protests of &amp;quot;you can see it as it goes along&amp;quot; and &amp;quot;it will be done when it will be done&amp;quot; are proving quite hard to swallow, but I think everyone understands there is no magic pill here and we just have to judge it step by step.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Proof Will Be in the Pudding&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So some good early steps have been taken. I cannot say the project is back on track, but everyone is now far more involved, has far more enthusiasm, and can see something starting to take shape. The perceived deadline of a few weeks from now is unlikely to be met with a fully functional site, but as &amp;quot;fully functional&amp;quot; is only vaguely defined, we are aiming to have something that is &amp;quot;good enough&amp;quot; by then, and then to make it better as people feed back into the process.&lt;/p&gt;
&lt;p&gt;So far a major success on the approach, now to see if we can turn that into a successfully delivered solution!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=41809" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/casey/archive/tags/Practices+and+Principles/default.aspx">Practices and Principles</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Rants/default.aspx">Rants</category><category domain="http://devlicio.us/blogs/casey/archive/tags/.NET/default.aspx">.NET</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Featured/default.aspx">Featured</category></item><item><title>What Determines High Quality Code?</title><link>http://devlicio.us/blogs/casey/archive/2008/05/16/what-determines-high-quality-code.aspx</link><pubDate>Fri, 16 May 2008 13:59:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:40579</guid><dc:creator>Jak Charlton</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/rsscomments.aspx?PostID=40579</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/commentapi.aspx?PostID=40579</wfw:comment><comments>http://devlicio.us/blogs/casey/archive/2008/05/16/what-determines-high-quality-code.aspx#comments</comments><description>&lt;p&gt;Code quality is an abstract concept again, and can be defined may ways depending on how you perceive quality. A good discussion of the many aspects of code quality can be found on Wikipedia at &lt;a href="http://en.wikipedia.org/wiki/Software_quality"&gt;http://en.wikipedia.org/wiki/Software_quality&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Some general high level objectives for software quality could be considered to be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Conformance to requirements&lt;/li&gt;
&lt;li&gt;Scalability&lt;/li&gt;
&lt;li&gt;Correctness&lt;/li&gt;
&lt;li&gt;Completeness&lt;/li&gt;
&lt;li&gt;Absence of Bugs&lt;/li&gt;
&lt;li&gt;Fault tolerance&lt;/li&gt;
&lt;li&gt;Extensibility&lt;/li&gt;
&lt;li&gt;Maintainability&lt;/li&gt;
&lt;li&gt;Documentation&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;At a code quality level, some general good guidelines would be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Readability&lt;br /&gt;&lt;/b&gt;- Code should be simple to read, even without comments&lt;br /&gt;- Class, method, and variable names should be expressive and unambiguous&lt;br /&gt;- Functional intent should be easily understood&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Ease of Maintenance, Testing and Debugging&lt;/b&gt;&lt;br /&gt;The degree of effort required to maintain, test and debug an application is a strong indication of the quality of the code and architecture. As the great majority of the cost of an application is actually composed of these three activities, these should be primary considerations&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Low Complexity&lt;/b&gt;&lt;br /&gt;Complex code is rarely complex because the business functionality it implements is complex. Most software complexity comes through poorly designed and implemented code, over analysis of the problem, or adding additional functionality for requirements that do not yet exist.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Low Resource Consumption&lt;/b&gt;&lt;br /&gt;Poorly written code will not take account of resource usage, for example it will not cache information it could cache, or it will create new objects when it did not need to. These issues lead to hard to maintain applications when deployed and used.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;To achieve these objectives, some basic principles of development and design can be applied. These have been referenced elsewhere, but are repeated here for clarity:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Single Responsibility Principle&lt;br /&gt;&lt;/b&gt;There should never be more than one reason for a class to change&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Liskov Substitution Principle&lt;/b&gt;&lt;br /&gt;Methods that use references to base classes should be able to use derived classes without knowing they are doing so&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Open Closed Principle&lt;/b&gt;&lt;br /&gt;Software entities (classes, modules, methods) should be open for extension but closed for modification&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Interface Segregation Principle&lt;/b&gt;&lt;br /&gt;Clients should not be forced to depend upon interfaces they do not use&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Dependency Inversion Principle&lt;br /&gt;&lt;/b&gt;High level modules should not depend upon low level modules, they should both depend upon abstractions&lt;br /&gt;Abstractions should not depend upon details, details should depend upon abstractions&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Principle of Least Surprise (sometimes known as Principle of Least Astonishment)&lt;/b&gt;&lt;br /&gt;The result of performing some operation should be obvious, consistent, and predictable, based upon the name of the operation and other clues&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Separation of Concerns&lt;/b&gt;&lt;br /&gt;The application should be broken into components that overlap in functionality as little as possible &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;An assessment of code against these core principles should give a developer a good basis for assessment of the quality of a code base.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=40579" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/casey/archive/tags/Practices+and+Principles/default.aspx">Practices and Principles</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Rants/default.aspx">Rants</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Architecture/default.aspx">Architecture</category></item><item><title>Statistics and How They Lie</title><link>http://devlicio.us/blogs/casey/archive/2008/05/16/statistics-and-how-they-lie.aspx</link><pubDate>Fri, 16 May 2008 09:49:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:40577</guid><dc:creator>Jak Charlton</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/rsscomments.aspx?PostID=40577</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/commentapi.aspx?PostID=40577</wfw:comment><comments>http://devlicio.us/blogs/casey/archive/2008/05/16/statistics-and-how-they-lie.aspx#comments</comments><description>&lt;p&gt;&lt;b&gt;&lt;i&gt;Industry experience suggests that the design of metrics will encourage certain kinds of behaviour from the people being measured. The common phrase applied is &amp;quot;you get what you measure&amp;quot; (or &amp;quot;be careful what you wish for&amp;quot;).&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h3&gt;A Brief Explanation of Cyclomatic Complexity and Code Coverage&lt;/h3&gt;
&lt;p&gt;Cyclomatic complexity is a measure of the number of possible paths through a piece of code. This is a relatively easy measurement to make, and code analysis tools can give you this figure directly. As cyclomatic complexity is directly analogous to the number of paths through the code, it is also a direct count of the number of unit tests required as a &lt;i&gt;minimum&lt;/i&gt; to test all the code paths.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A cyclomatic complexity of 1-10 is a simple piece of code that is easily maintainable.&lt;/li&gt;
&lt;li&gt;A cyclomatic complexity of 11-20 is a moderately complex piece of code, that is relatively easy to maintain.&lt;/li&gt;
&lt;li&gt;A cyclomatic complexity of 21-50 would indicate either a highly complex or high risk piece of code. The functionality of the code observed indicates it is in no way complex, and therefore it must fall into the high risk category.&lt;/li&gt;
&lt;li&gt;A cyclomatic complexity of 51 and above indicates un-testable code, and a very high risk to the project.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Code coverage measures the number of paths through your code that had at least one execution when unit tests were run. It does not however give any real quality measure against the value of those tests, or the actual quality of those tests.&lt;/p&gt;
&lt;p&gt;It is actually easier to get better coverage results from writing poor code. The poorer the quality of your code and of your tests, the easier it is to achieve high coverage figures.&lt;/p&gt;
&lt;p&gt;See also: &lt;a class="" href="http://devlicio.us/blogs/casey/archive/2008/05/15/measuring-progress.aspx"&gt;Measuring Progress&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=40577" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/casey/archive/tags/Practices+and+Principles/default.aspx">Practices and Principles</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Rants/default.aspx">Rants</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Architecture/default.aspx">Architecture</category></item><item><title>Lines of Code as a Measure of Progress</title><link>http://devlicio.us/blogs/casey/archive/2008/05/16/lines-of-code-as-a-measure-of-progress.aspx</link><pubDate>Fri, 16 May 2008 08:51:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:40578</guid><dc:creator>Jak Charlton</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/rsscomments.aspx?PostID=40578</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/commentapi.aspx?PostID=40578</wfw:comment><comments>http://devlicio.us/blogs/casey/archive/2008/05/16/lines-of-code-as-a-measure-of-progress.aspx#comments</comments><description>&lt;p&gt;Some reports will highlight lines of code as a figure to attach some relevance to, and these become measures used to establish progress.&lt;/p&gt;
&lt;p&gt;These are possibly the most misleading figures to use, in fact almost always within a well designed application and code base, the reverse is true.&lt;/p&gt;
&lt;p&gt;Good code tends to be more concise than poor code, and therefore it is less lines of code. &lt;/p&gt;
&lt;p&gt;Good code also tends to have high levels of code reuse; one of the primary refactoring exercises is removing code duplication. This obviously again leads to a lower number of lines of code. However, the concept of reuse can also be used to increase lines of code and reduce quality in the hands of inexperienced developers.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;An example:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;The following pieces of code are all functionally identical:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Version One (4 lines):&lt;/b&gt;&lt;/p&gt;&lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; MyMethod()
        {
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (myObject == &lt;span class="kwrd"&gt;null&lt;/span&gt;) doSomething();
        }
&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Version Two (8 lines):&lt;/b&gt;&lt;/p&gt;&lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; MyMethod()
        {
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (Assert(myObject)) doSomething();
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; Assert(&lt;span class="kwrd"&gt;object&lt;/span&gt; theObject)
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt; theObject == &lt;span class="kwrd"&gt;null&lt;/span&gt;;
        }
&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Version Three (8 lines of code):&lt;/b&gt;&lt;/p&gt;&lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; MyMethod()
        {
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (Assert(myObject))
            {
                doSomething();
            }
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; Assert(&lt;span class="kwrd"&gt;object&lt;/span&gt; theObject)
        {
            &lt;span class="kwrd"&gt;bool&lt;/span&gt; theResult = (theObject==&lt;span class="kwrd"&gt;null&lt;/span&gt;);
            &lt;span class="kwrd"&gt;return&lt;/span&gt; theResult;
        }
&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Version Four (20 lines of code):&lt;/b&gt;&lt;/p&gt;&lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; MyMethod()
        {
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (Assert(myObject))
            {
                doSomething();
            } 
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; Assert(&lt;span class="kwrd"&gt;object&lt;/span&gt; theObject)
        {
            &lt;span class="kwrd"&gt;bool&lt;/span&gt; theResult;
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (theObject==&lt;span class="kwrd"&gt;null&lt;/span&gt;)
            {
                theResult = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
            }
            &lt;span class="kwrd"&gt;else&lt;/span&gt;
            {
                theResult = &lt;span class="kwrd"&gt;false&lt;/span&gt;;
            }
            &lt;span class="kwrd"&gt;return&lt;/span&gt; theResult;=
        }
&lt;/pre&gt;
&lt;p&gt;As it turns out, the version of that code with the highest quality is Version One, coming in at 4 lines of code total, and actually only 1 line of code that does anything. Version Four has 5 times the number of lines of code as a base guideline, but has 8 times the lines of code if only actual statements are counted. Version Four is coincidentally the poorest quality version of the functionality.&lt;/p&gt;
&lt;p&gt;So if lines of code are a measure of progress, a developer can, consciously or subconsciously, increase their visible progress, by writing lower quality and less maintainable code.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;i&gt;How About Measuring Decreasing Lines of Code as Success?&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Depending on how you are measuring lines of code, even looking for trends in reduction of lines of code can be considered the wrong approach. For example, now if I concatenate multiple statements into a single terse, unreadable and un-maintainable statement, I can reduce my line count.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;i&gt;An example:&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Version One (8 lines):&lt;/b&gt;&lt;/p&gt;&lt;pre class="csharpcode"&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; MyMethod(&lt;span class="kwrd"&gt;string&lt;/span&gt; myString, &lt;span class="kwrd"&gt;int&lt;/span&gt; result)
   {
       &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; SmallIncrease = 1;
       &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; LargeIncrease = 2;

       &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(myString))
           result = result + SmallIncrease;
       &lt;span class="kwrd"&gt;else&lt;/span&gt;
           result = result + LargeIncrease;
      &lt;span class="kwrd"&gt;return&lt;/span&gt; result;
   }
&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Version Two (4 lines):&lt;/b&gt;&lt;/p&gt;&lt;pre class="csharpcode"&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; MyMethod(&lt;span class="kwrd"&gt;string&lt;/span&gt; myString, &lt;span class="kwrd"&gt;int&lt;/span&gt; result)
   {
      &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(myString) ? result+1 result+2;
   }
&lt;/pre&gt;
&lt;p&gt;In this example, Version One of the code is simpler to read, but is twice as many lines of code. This is also a very simple example; a more complex example would be even more drastic in the difference between the numbers of lines of code in the two methods.&lt;/p&gt;
&lt;p&gt;Within this simple example the first is much easier to read, understand, and therefore maintain. The second obfuscates the values of 1 and 2 in the calculation, and makes it harder to follow the execution path of the code.&lt;/p&gt;
&lt;p&gt;Arguably Version Two could be considered acceptable with some modifications (like the addition of the constants defined in Version One), however both of these piece of code will actually compile to identical binary code.&lt;/p&gt;
&lt;p&gt;In this case Version One is higher quality code as it is easier to understand its intention, and the ability to quickly read and understand intent is a major factor in determining the quality of code.&lt;/p&gt;
&lt;style&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, &amp;quot;Courier New&amp;quot;, Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/style&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=40578" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/casey/archive/tags/Practices+and+Principles/default.aspx">Practices and Principles</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Rants/default.aspx">Rants</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Architecture/default.aspx">Architecture</category></item><item><title>Measuring Progress</title><link>http://devlicio.us/blogs/casey/archive/2008/05/15/measuring-progress.aspx</link><pubDate>Thu, 15 May 2008 08:48:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:40576</guid><dc:creator>Jak Charlton</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/rsscomments.aspx?PostID=40576</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/commentapi.aspx?PostID=40576</wfw:comment><comments>http://devlicio.us/blogs/casey/archive/2008/05/15/measuring-progress.aspx#comments</comments><description>&lt;p&gt;&lt;b&gt;&lt;i&gt;&amp;quot;Working software is the primary measure of progress&amp;quot;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Fundamentally, there is no more valid measure for progress, than the working software itself. This only leaves open to discussion, the definition of &amp;quot;working software&amp;quot;.&lt;/p&gt;
&lt;h3&gt;Defining &amp;quot;Working Software&amp;quot;&lt;/h3&gt;
&lt;p&gt;The criterion for defining working software is obviously open to debate. A common definition is:&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Software can be called &amp;quot;working software&amp;quot; when it meets a defined set of business requirements and can be demonstrated to do so through testing.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;This is one reason why Agile processes put so much value on unit testing, these tests show very early on in the process that software is meeting business requirements, without the need to create a fully functional user testable application. These unit tests also allow demonstration at a fairly low level of granularity that code is meeting requirements, where a user facing application is dependent on too many factors to easily establish correctness.&lt;/p&gt;
&lt;h3&gt;So How Do We Measure Progress?&lt;/h3&gt;
&lt;p&gt;Based on this definition, our best way to measure progress and velocity on projects is to evaluate defined business requirements, against the code that is provided to meet those requirements.&lt;/p&gt;
&lt;p&gt;Code that is written, but is not yet functional and passing tests cannot be considered progress until it has been completed to a level as defined above.&lt;/p&gt;
&lt;p&gt;This then prioritises getting components of functionality completed early, rather than attempting to do all things simultaneously. &lt;/p&gt;
&lt;p&gt;The traditional &amp;quot;waterfall&amp;quot; approach to software development is to spread large amounts of functional requirements out amongst large teams, for example assigning each piece of functionality to a team member with an expected delivery date measured in weeks or months. This leads to very long cycles for delivery of something correlating to &amp;quot;working software&amp;quot;&lt;/p&gt;
&lt;p&gt;An Agile approach to the same problem is to focus the teams on only a small subset of that functionality, and to attempt to deliver it in a working and testable state in very short iterations. The degree of success with which they do this then becomes their &amp;quot;velocity&amp;quot;. The velocity can then be used as a predictor of future success rates and therefore of future timescales. This also allows a &amp;quot;fail fast&amp;quot; mentality, where it is better to hit problems early on and resolve them, rather than delay all the problems for as long as possible down the development path.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Therefore, the best way of measuring success is to do one thing at a time, do it well, ensure it works, ensure it meets criteria, ensure it can be tested, and then to replicate the things that went right on the next piece of functionality, and eliminate the things that did not go so well.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;/em&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=40576" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/casey/archive/tags/Practices+and+Principles/default.aspx">Practices and Principles</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Rants/default.aspx">Rants</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Architecture/default.aspx">Architecture</category></item><item><title>The Only Certainty is Change</title><link>http://devlicio.us/blogs/casey/archive/2008/05/14/the-only-certainty-is-change.aspx</link><pubDate>Wed, 14 May 2008 06:08:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:40543</guid><dc:creator>Jak Charlton</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/rsscomments.aspx?PostID=40543</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/commentapi.aspx?PostID=40543</wfw:comment><comments>http://devlicio.us/blogs/casey/archive/2008/05/14/the-only-certainty-is-change.aspx#comments</comments><description>&lt;p&gt;I got an email at the&amp;nbsp;end of last week from a developer asking about Agile development. It highlights a few problems with development in general, and with Agile as a &amp;quot;badge of honour&amp;quot; that are worth exploring. It deserved a fairly detailed reply, so excerts of the email follow:&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;
&lt;p&gt;I just came into an Agile project with some difficulties, they have stopped doing Agile development and gone back to a&amp;nbsp;Waterfall approach. Coming into the project late, I saw numerous problems with the approach that&amp;nbsp;are not&amp;nbsp;helping.&lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;It strikes me that developers rarely come onto a project and think how wonderful it is and how well it is running. This could be because they just have different ideas to everyone else, we all know developers are pretty opinionated, and believe they have the &amp;quot;right&amp;quot; answer to all the questions.&lt;/p&gt;
&lt;p&gt;There is however a more likely reason, when you are close to a project, it is sometimes hard to see what is glaringly obvious to anyone with fresh eyes.&lt;/p&gt;
&lt;p&gt;Agile can be daunting, you are fully exposed, you need to have Courage, you need to resist the urge to falling back to lines like &amp;quot;well we don&amp;#39;t have written requirements&amp;quot;, &amp;quot;it will be fixed in testing&amp;quot;, &amp;quot;it isn&amp;#39;t my code&amp;quot;, and all the other Waterfall phrases.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;
&lt;p&gt;Developers would be working on stories but things were not available to them as they had not been created yet - those items were in other stories&lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;This sounds like a bad planning excercise. If you are using user stories, then it is the job of the developers to be involved in the planning of these, and to be able to assess up front what dependencies these stories have upon each other, and to properly break these down to more manageable, and more appropriate, stories.&lt;/p&gt;
&lt;p&gt;I have seen similar problems, and it was generally caused by project managers&amp;nbsp;deciding upon the priorities for things, and not listening to developer feedback (or not even including them). A good project manager is vital to a project to act as an &amp;quot;enabler&amp;quot;, someone who can make things happen, can remove stumbling blocks, and can generally &amp;quot;grease the wheels&amp;quot;. A bad project manager is the worst thing that can happen to a project.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;
&lt;p&gt;Requirements changes by the business could cause certain functionality to have to be reworked significantly, causing a lot of problems, if the stakeholders changed their mind every time they saw something, more changes would be introduced. The more they saw, the more they wanted to change.&lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Well, Agile dictates (in so far as Agile dictates anything) that the only certainty in a project is that the requirements will change. We embrace change. Agile methodologies are all designed to allow change to happen as easily as possible, and to encourage change to be a core part of the driving process.&lt;/p&gt;
&lt;p&gt;There is a point at which this can easily go wrong though, and again it comes down to either the wrong people in the planning excercise, or someone not listening.&lt;/p&gt;
&lt;p&gt;Understanding change happens is only the first step. &lt;/p&gt;
&lt;p&gt;You have to also explain to the business that change is inevitable, but it is certainly not free. The decision rests with them, but it is the job of the development team to properly evaluate requests and user stories to see what impact they will have on the project now, and into the future. Business users presented with an option to change, but no consequences of doing so, will of course choose change. When asked whether they want to make the change they think is needed, or do the other three user stories that were scheduled for this week instead, the choice becomes rather different. Agile encourages everyone in the process to become a stakeholder, but everyone also has to bear the cost of change.&lt;/p&gt;
&lt;p&gt;Then you have to be able to think ahead and to design your system in such a way as to allow for change. This is a technical challenge, largely only obtained via experience, both of the development language and tools you are using, but also of the business team you are dealing with - how often do they change their minds, how often do they express things badly, how often do they get the wrong person to make the decision. In the sales game, you always want to be talking to the decision maker, becasue only they can give you the answer you need - make sure as a development team you are talking to the decision maker too.&lt;/p&gt;
&lt;p&gt;A well designed architecture is fundamental to a successful project, and a key quality of a well designed architecture is the ability to make changes with relatively little impact upon other system components. Adding or modifying behaviour should not be a traumatic process - it may not be trivial either, but it should never be traumatic. I covered &lt;a class="" href="http://devlicio.us/blogs/casey/archive/2008/05/02/castle-windsor-one-small-step-towards-better-software.aspx"&gt;some of the aspects of this previously&lt;/a&gt;, and although that post was geared towards why Inversion of Control can benefit your code, it also deals with Robert C Martin&amp;#39;s observations on a Rotting Design. Make no mistake, it is perfectly possible to start a greenfield project and have a rotting design from day one. It is also a large risk to any project that the once elegant code base rapidly slips into being a rotting design when time pressures are on, and people start taking shortcuts.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;
&lt;p&gt;It is&amp;nbsp;hard to know when it will be finished when things are always open to change&lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Agile methodologies do not say we have no delivery date, in fact almost to the contrary. Generally under an Agile project you should be able to deliver a working version of the software at any point in the development.&lt;/p&gt;
&lt;p&gt;Admittedly the functionality present within that software will be largely restricted the earlier on in the process you decide to deliver, but 75% of functionality with a high quality code base is a lot better than 100% functionality which it is heavily bugged and fragile.&lt;/p&gt;
&lt;p&gt;I often draw a triangle for clients, with Time, Quality, Functionality as the three points (Resources is often included here, but I ignore it for this purpose, &lt;a class="" href="http://en.wikipedia.org/wiki/Brooks&amp;#39;s_law"&gt;Brooks Law&lt;/a&gt; usually applies by the point this matters). I tell them they can pick any two of those aspects and fix them, but that means the last one will have to vary. They cannot fix all three.&lt;/p&gt;
&lt;p&gt;If Time is a critical deliverable, then you can choose to sacrifice Quality or Functionality (or both). The perfectionist in me says sacrifice Functionality, Quality is too precious to be the one to slip.&lt;/p&gt;
&lt;p&gt;If Quality is a critical deliverable, then choose to slip Time or Functionality. The choice here only comes down to whether you want it fast or complete, or what combination of the two you want.&lt;/p&gt;
&lt;p&gt;If Functionality is the key deliverable, then you can slip Time or Quality, and again I would say that Time has to slip, as Quality is too precious.&lt;/p&gt;
&lt;p&gt;My personal opinion is therefore that Quality comes first, Functionality and Time&amp;nbsp;are the things you can&amp;nbsp;alter - but not only does this vary by project, but also by business circumstances. Sometimes it really is better to get to market with a low quality product, in the lowest possible time, with limited functionality (Twitter&amp;nbsp;immediately comes to mind), just to steal a march on the opposition.&lt;/p&gt;
&lt;p&gt;But what is really important, is that you express these aspects of development explicitly. If you are sacrificing quality because the business has asked for something unachievable, then let them know you are doing this, and make it an express design decision. If later on the business tells you the software is bugged to hell, you can point out when they took that decision to satisfy another need. If you need to take two more months because the business just changed the business model, then fine, but again make it an expressed and documented design decision.&lt;/p&gt;
&lt;p&gt;Too many of these things get left as &amp;quot;assumptions&amp;quot; ... if you don&amp;#39;t say otherwise, the business will assume a really high quality product, with massive functionality, in a very short timescale ... it isn&amp;#39;t possible, so let them make the choice.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=40543" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/casey/archive/tags/Practices+and+Principles/default.aspx">Practices and Principles</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Rants/default.aspx">Rants</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Architecture/default.aspx">Architecture</category></item><item><title>Project Failures - Blame the Process, or the People?</title><link>http://devlicio.us/blogs/casey/archive/2008/05/09/project-failures-blame-the-process-or-the-people.aspx</link><pubDate>Fri, 09 May 2008 07:15:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:40389</guid><dc:creator>Jak Charlton</dc:creator><slash:comments>19</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/rsscomments.aspx?PostID=40389</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/casey/commentapi.aspx?PostID=40389</wfw:comment><comments>http://devlicio.us/blogs/casey/archive/2008/05/09/project-failures-blame-the-process-or-the-people.aspx#comments</comments><description>&lt;p&gt;Prompted partially by &lt;a class="" href="http://devlicio.us/blogs/casey/archive/2008/05/08/how-to-make-late-software-even-later.aspx"&gt;some comments yesterday on my post on&amp;nbsp;How to Make Late Software, Even Later&lt;/a&gt;, and partially by a discussion on the altdotnet&amp;nbsp;Yahoo list, I wrote this long email. As it became an epic in its own right, I thought it deserved a blog.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;We&amp;nbsp;Are Doing Agile!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I can claim to be doing Agile, and following with some degree of conformance, a known and understood Agile methodology. If my project fails, we must blame the Agile process, and our practices in some way for this&lt;/p&gt;
&lt;p&gt;I can claim to be doing Agile, but make up my own variation of a known methodology, in which case a failure of the project is largely encumbant upon&amp;nbsp;me for&amp;nbsp;deciding to sacrifice the practices we chose to ignore, and the new ones we added.&lt;/p&gt;
&lt;p&gt;I can claim to be doing Agile while just coding hell for leather and following no methodology, just cherry picking a couple of practices here and there, and picking the principles I like - in which case any failure is mine to bear.&lt;/p&gt;
&lt;p&gt;All of these approaches should be highlighted in a risk analysis to management to make the decisions *before* you decide to pursue any of these paths. It is the decision of management to weigh risk vs reward and to make that decision. If I didn&amp;#39;t write that report, or I wrote it badly, then again the fault is mine to bear. If I wrote it clearly expressing the dangers of a hack and see approach, and management chose that path, then it is their&amp;nbsp;cross to bear.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You Cannot Blame A Process For Producing Bad Results&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If all participants in a waterfall methodology like RUP followed the practice rigourously, then I have little doubt the project would have a high chance of success (as defined by the process, a close match to the intial requirements)&lt;br /&gt;&amp;nbsp;&lt;br /&gt;If all participants in an Agile process like XP followed the practice rigourously, then I have little doubt the project would have a high chance of success (as defined by by the process, a close match to the evolving requirements)&lt;/p&gt;
&lt;p&gt;Bad people on any project can stuff any methodology, and bad application of good practices will always result in failure. Agile just gives you much earlier feedback that you are not getting it right - how you choose to interpret that feedback, or how management choose to, is the fault of those communicating or interpreting the information - not of the process.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How To Fail Under Agile&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The worst, and I mean &lt;em&gt;absolute&lt;/em&gt; worst project failure I ever worked on was done using Agile, using Extreme Programming, and the practices were fairly closely followed. It should have been a success. And for a few small but critical&amp;nbsp;mistakes it would have been.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;The first big mistake was not evolving the architecture first. The application had been developed under XP for over 9 months when I was brought in the provide the &amp;quot;Enterprise component&amp;quot; of the application. It became rapidly apparent that the application had been written as a desktop applciation, and was too tightly coupled to allow any extension points for an evolution of the functionality into a different UI and service layer.&lt;/p&gt;
&lt;p&gt;The second big mistake was a large amount of code that had been written to allow the client applciation to operate on domain objects, using an ORM, persisted across a web service layer, relying on massive amounts of code generation. This was a technical mistake that should have been picked up by prototyping and getting the architecture right first.&lt;/p&gt;
&lt;p&gt;The third big mistake was a very poor application of the XP process. The bug backlog for each week was continual, and continally increasing. It was seen as acceptable that stuff didn;t work, and in each stand up it was just refered to as a bug and would go on the backlog. Nobody ever stopped to take a grip of this, and realise that this was a warning sign. As complexity was increaing, the number of interactions in the software was going up rapidly, and people spent more time bug fixing. Out of around 5000 unit tests (afair) that existed when I got there, around 2000+ were failing - this was explained as changes to the code and hence they couldn&amp;#39;t get them working. This invalidated pretty much the entire test suite.&lt;/p&gt;
&lt;p&gt;These were not problems with the process (XP), but clear problems with no up front design or prototyping (point one), no technical understanding of the challenges involved (point two), and people badly applying the process (point three).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Was Agile or Extreme Programming to Blame? &lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Yeah, we know loads of it is in flux, and it is a bit &amp;#39;out there&amp;#39; but this is Agile man, we live by the seat of our pants, we ride fast and hard, this is EXTREME!!!!!&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;In the respect that it allowed developers to go to senior management and say&amp;nbsp;this, hell yes Agile and XP&amp;nbsp;were to blame. It gave the excuse to developers that they could excuse stuff being chaotic, as being all part of the way this stuff works.&lt;/p&gt;
&lt;p&gt;The reality was the project failed due to a manager that for all his ability, had never done Agile or XP before, and had taken to quoting Martin Fowler PoEAA so often when we tried to raise problems, that his copy was starting to fall apart. And the business owner took the Agile/XP no requirements thing to the Nth degree and would change his mind on features on a daily basis, so the team could never get a handle on the problem. And lastly the team, that had gone into a terminal march towards inevitable failure, but had never spoken up loudly enough.&lt;/p&gt;
&lt;p&gt;Oddly enough, that was the single team I have worked on that had by far the highest technical ability of any team as a whole I have ever worked with. They had some absolutely superb developers - but sometimes even that isn&amp;#39;t enough.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=40389" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/casey/archive/tags/Practices+and+Principles/default.aspx">Practices and Principles</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Rants/default.aspx">Rants</category><category domain="http://devlicio.us/blogs/casey/archive/tags/Featured/default.aspx">Featured</category></item></channel></rss>