<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/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>Jose's Blog : Agile</title><link>http://blogs.msdn.com/josealmeida/archive/tags/Agile/default.aspx</link><description>Tags: Agile</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Creating a Customized Guidance Repository</title><link>http://blogs.msdn.com/josealmeida/archive/2008/09/19/creating-a-customized-guidance-repository.aspx</link><pubDate>Fri, 19 Sep 2008 04:55:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8958034</guid><dc:creator>josealmeida</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/josealmeida/comments/8958034.aspx</comments><wfw:commentRss>http://blogs.msdn.com/josealmeida/commentrss.aspx?PostID=8958034</wfw:commentRss><description>&lt;P&gt;As a consultant part of my job is to provide guidance to our customers on the best way to use our technology, namely in terms of application development practices. Over time, you start to better understand the type of customer you’re working with, what works, what doesn’t and you start to optimize your own delivery processes. You reuse material and refine it the next time around. That’s the nature of our work in the Services organization.&lt;/P&gt;
&lt;P&gt;Lately I’ve been involved in several engagements in the &lt;A target=_blank href="http://www.microsoft.com/services/microsoftservices/srv_apo.mspx" mce_href="http://www.microsoft.com/services/microsoftservices/srv_apo.mspx"&gt;Application Platform Optimization&lt;/A&gt; space, mainly the Application Lifecycle Management suite of Offerings.&lt;/P&gt;
&lt;P&gt;At the present I’m working with one customer who has gone through the &lt;A target=_blank href="http://download.microsoft.com/download/e/f/6/ef63554d-1685-48de-b684-2cb61cc99f49/alm_assessment.pdf" mce_href="http://download.microsoft.com/download/e/f/6/ef63554d-1685-48de-b684-2cb61cc99f49/alm_assessment.pdf"&gt;Assessment&lt;/A&gt; phase and we’ve arrived at a six phases maturity growth roadmap that they’re starting to implement. One of the key aspects of this type of custom engagement is that all the experience gained by the customer and all the guidance delivered by the consulting team, should be persisted by the customer. We’re working with a small team within the customer and they are the ones who will have the responsibility of creating their own guidance and internal best practices and sharing all this information with the rest of the organization. So to collect, persist, distribute and, later on, update their in-house customized guidance for application architecture, development and lifecycle management, we’ve chosen to use the &lt;A target=_blank href="http://www.codeplex.com/guidanceExplorer" mce_href="http://www.codeplex.com/guidanceExplorer"&gt;Guidance Explorer&lt;/A&gt; tool available on &lt;a href="http://www.codeplex.com"&gt;Codeplex&lt;/a&gt;.&lt;/P&gt;
&lt;P&gt;The use of this tool turned out to be a great fit for this scenario. Instead of compiling one giant document, that would go through several versions and would quickly fall out of synch, the customer is now publishing and updating guidance, based on an existing database of industry and technology best practices. Guidance articles have their own metadata, the lifecycle of each piece of guidance is independent of each other and, if needed, all the guidance can be compiled into a Word document for a hardcopy reference. Additionally, one of my favorite features is the ability to subscribe to the guidance through a published RSS feed and receive a notification whenever guidance changes or a new best practice is published.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8958034" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/josealmeida/archive/tags/Development/default.aspx">Development</category><category domain="http://blogs.msdn.com/josealmeida/archive/tags/Agile/default.aspx">Agile</category><category domain="http://blogs.msdn.com/josealmeida/archive/tags/General/default.aspx">General</category><category domain="http://blogs.msdn.com/josealmeida/archive/tags/SCM/default.aspx">SCM</category><category domain="http://blogs.msdn.com/josealmeida/archive/tags/Application+Lifecycle+Management/default.aspx">Application Lifecycle Management</category></item><item><title>Economics of Agile Software Development</title><link>http://blogs.msdn.com/josealmeida/archive/2008/09/17/economics-of-agile-software-development.aspx</link><pubDate>Wed, 17 Sep 2008 04:12:08 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8954639</guid><dc:creator>josealmeida</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/josealmeida/comments/8954639.aspx</comments><wfw:commentRss>http://blogs.msdn.com/josealmeida/commentrss.aspx?PostID=8954639</wfw:commentRss><description>&lt;p&gt;&lt;a target="_blank" href="http://collaboration.csc.ncsu.edu/laurie/index.html"&gt;Dr. Laurie Williams&lt;/a&gt; has been a long-time researcher on Agile methods and their impact on software engineering.&lt;/p&gt;  &lt;p&gt;She and her students have published a number of very interesting papers on varied subjects, particularly on the economics of agile practices, like Test Driven Development (TDD) or Pair Programming.&lt;/p&gt;  &lt;p&gt;You can find a list of publications &lt;a target="_blank" href="http://collaboration.csc.ncsu.edu/laurie/publications.html"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8954639" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/josealmeida/archive/tags/Agile/default.aspx">Agile</category></item><item><title>Unit Testing User Interfaces (Updated!)</title><link>http://blogs.msdn.com/josealmeida/archive/2004/06/15/UnitTestingUserInterfaces.aspx</link><pubDate>Tue, 15 Jun 2004 23:13:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:156101</guid><dc:creator>josealmeida</dc:creator><slash:comments>7</slash:comments><comments>http://blogs.msdn.com/josealmeida/comments/156101.aspx</comments><wfw:commentRss>http://blogs.msdn.com/josealmeida/commentrss.aspx?PostID=156101</wfw:commentRss><description>Usually one of the major difficulties a developer faces when writing unit tests is how to write test code for User Interfaces. This is particularly important when we're doing Test-Driven Development....(&lt;a href="http://blogs.msdn.com/josealmeida/archive/2004/06/15/UnitTestingUserInterfaces.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=156101" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/josealmeida/archive/tags/Development/default.aspx">Development</category><category domain="http://blogs.msdn.com/josealmeida/archive/tags/Agile/default.aspx">Agile</category><category domain="http://blogs.msdn.com/josealmeida/archive/tags/Testing/default.aspx">Testing</category><category domain="http://blogs.msdn.com/josealmeida/archive/tags/Post+Updates/default.aspx">Post Updates</category></item><item><title>Testable code</title><link>http://blogs.msdn.com/josealmeida/archive/2004/04/27/120968.aspx</link><pubDate>Tue, 27 Apr 2004 19:31:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:120968</guid><dc:creator>josealmeida</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/josealmeida/comments/120968.aspx</comments><wfw:commentRss>http://blogs.msdn.com/josealmeida/commentrss.aspx?PostID=120968</wfw:commentRss><description>&lt;P&gt;Previously I mentioned that one of the most important benefits I get from using TDD is that it drives me to write more testable code. I've been thinking quite a lot about this, and another recent &lt;A href="http://blogs.msdn.com/chappell/archive/2004/04/21/117670.aspx"&gt;post&lt;/A&gt; from &lt;A href="http://blogs.msdn.com/chappell/"&gt;Chris Dickens&lt;/A&gt; made we even more aware of the importance behind writing testable code.&lt;/P&gt;
&lt;P&gt;Chris states:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;"As you might expect, before we can start serious development we have to write specs. Those aren't my job (that's what &lt;A href="http://www.microsoft.com/college/fulltime/pm.asp"&gt;Program Managers&lt;/A&gt; do) but developers and testers are actively involved in critiquing the specs. Technically my purpose in those meetings is to flag any design issues that would make the product untestable, but in reality I'm there to provide my input on what the product should do."&lt;/P&gt;
&lt;P&gt;I've found (the hard way) that trying to test code that wasn't written with testing in mind, is extremely hard, especially when you find tightly-coupled code.&lt;/P&gt;
&lt;P&gt;TDD promotes decoupling and this, by itself, is very helpful in producing testable code, because there's some way to plug into the production logic you want to test. If the code you're testing depends on other parts of the system you can find yourself writing a huge amount of code into the setup methods of the unit tests. This, unfortunately, introduces a high degree of coupling into the testing logic, particularly if the code you're dependant on belongs to another domain (i.e. it's an external system)&lt;/P&gt;
&lt;P&gt;Using&amp;nbsp;mock objects can help us develop loosely-coupled unit tests.&amp;nbsp;Considering this, some questions seem to arise almost instantly... "When should mock objects be used?", "Is it recommended to use mock objects to represent every external system that our production code interacts with?", etc.&lt;/P&gt;
&lt;P&gt;Here's a definition of&amp;nbsp;a &lt;A href="http://c2.com/cgi/wiki?MockObject"&gt;Mock Object&lt;/A&gt;:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;is easily created 
&lt;LI&gt;is easily set up 
&lt;LI&gt;is quick 
&lt;LI&gt;is deterministic 
&lt;LI&gt;has easily caused behaviour 
&lt;LI&gt;has no direct user interface 
&lt;LI&gt;is directly queriable &lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;From the above definition, it's possible to identify a couple of situations where using mock objects can be valuable in coding&amp;nbsp;unit tests: &lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;the real object doesn't yet exist 
&lt;LI&gt;the real object is difficult to setup 
&lt;LI&gt;the real object is slow (if it takes too long to run the tests, you might feel discouraged to run them) 
&lt;LI&gt;the real object produces unpredictable results which may cause the test to behave in a nondeterministic way; 
&lt;LI&gt;the real object is a user interface 
&lt;LI&gt;the test needs to ask the real object how it was used (for instance, the test might need to verify if an event was raised and caught correctly)&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Developing unit tests with mock objects, improves domain code by preserving encapsulation, reducing global dependencies, and clarifying the interactions between classes [&lt;A href="http://www.connextra.com/aboutUs/mockobjects.pdf"&gt;Mackinnon, 2000&lt;/A&gt;].&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=120968" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/josealmeida/archive/tags/Development/default.aspx">Development</category><category domain="http://blogs.msdn.com/josealmeida/archive/tags/Agile/default.aspx">Agile</category><category domain="http://blogs.msdn.com/josealmeida/archive/tags/Testing/default.aspx">Testing</category></item><item><title>TDD Adoption Numbers</title><link>http://blogs.msdn.com/josealmeida/archive/2004/04/16/114483.aspx</link><pubDate>Fri, 16 Apr 2004 12:19:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:114483</guid><dc:creator>josealmeida</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/josealmeida/comments/114483.aspx</comments><wfw:commentRss>http://blogs.msdn.com/josealmeida/commentrss.aspx?PostID=114483</wfw:commentRss><description>&lt;P&gt;Matt Hawley &lt;A href="http://weblogs.asp.net/mhawley/archive/2004/04/15/114005.aspx"&gt;posted&lt;/A&gt; a few numbers in order to justify/support the adoption of TDD.&lt;/P&gt;
&lt;P&gt;I've found an interesting &lt;A href="http://www.ipd.uka.de/~muellerm/publications/edser03.pdf"&gt;research paper &lt;/A&gt;on the subject, from Matthias Müller and Frank Padberg from the &lt;A href="http://www.uni-karlsruhe.de/Uni/"&gt;Karlsruhe University&lt;/A&gt; in Germany.&lt;/P&gt;
&lt;P&gt;Some of my personal views on the subject are:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;I do find there's a slight overhead to developing Test-First. However all developers unit-test their code, to one degree or another. All developers write some form of test code. I believe the overhead comes, not from writing test code, but from using a testing framework. 
&lt;LI&gt;IMO one of the greatest benefits I've experienced by coding test-first is that the code I write is testable (i.e. If someone else needs to write/extend test-code,&amp;nbsp;for instance to&amp;nbsp;test&amp;nbsp;some wierd situation, it can easily be done); 
&lt;LI&gt;Coding flows with much more confidence (more immediate feedback on what's wrong);&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;I do believe that TDD is a very helpful practice and from my experience, together with other practices like Refactoring,&amp;nbsp;I do believe that it helps to write better code.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=114483" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/josealmeida/archive/tags/Development/default.aspx">Development</category><category domain="http://blogs.msdn.com/josealmeida/archive/tags/Agile/default.aspx">Agile</category><category domain="http://blogs.msdn.com/josealmeida/archive/tags/Testing/default.aspx">Testing</category></item></channel></rss>