<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Assembla Blog: Lessons for Hyper-Agile product development</title>
    <link>http://andy.blogs.assembla.com/articles/2007/01/07/lessons-for-hyper-agile-product-development</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>Wetware - Men among the Machines, by Andy Singleton</description>
    <item>
      <title>Lessons for Hyper-Agile product development</title>
      <description>&lt;p&gt;Recently we were called upon to build and launch a new Web product with a hard deadline in a seasonal business.  By the time we started our work, only three months remained until the planned launch date.  It was a big system.  Our mission was to build a new and greatly enhanced version of a product which had taken 15 months to build in its last iteration.  So, we had a benchmark.&lt;/p&gt;


	&lt;p&gt;In this case, we ran more than four times faster than a similar project implemented last year with older tools and development methods.  We also came in on-time and under budget, and we ended up implementing features faster than we could figure out how to use them.&lt;/p&gt;


	&lt;p&gt;How did this happen?  Want to try this at home?  I will share our lessons below.  Good luck.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Don&#226;&#8364;&#8482;t do things that take time to arrange&lt;/li&gt;
		&lt;li&gt;Don&#226;&#8364;&#8482;t get dragged down by old code&lt;/li&gt;
		&lt;li&gt;Establish the data schema&lt;/li&gt;
		&lt;li&gt;Pile on with new team members&lt;/li&gt;
		&lt;li&gt;Use a ticket list / work queue&lt;/li&gt;
		&lt;li&gt;Build something now, even though we know we will have to rebuild&lt;/li&gt;
		&lt;li&gt;Don&#226;&#8364;&#8482;t split the codebase into components&lt;/li&gt;
		&lt;li&gt;Daily releases instead of stabilization periods&lt;/li&gt;
		&lt;li&gt;Make a usage dashboard&lt;/li&gt;
		&lt;li&gt;Web services are your friend&lt;/li&gt;
		&lt;li&gt;Hire users as product managers&lt;/li&gt;
		&lt;li&gt;Don&#226;&#8364;&#8482;t create obstacles: Users provide the data&lt;/li&gt;
		&lt;li&gt;Documentation on a wiki&lt;/li&gt;
		&lt;li&gt;Find the one thing people will use&lt;/li&gt;
	&lt;/ul&gt;&lt;h2&gt;Here is the expanded version, for people who actually do this for a living.&lt;/h2&gt;


	&lt;h3&gt;Don&#226;&#8364;&#8482;t do things that take time to arrange&lt;/h3&gt;


	&lt;p&gt;We get big time savings by not moving people around.  Travel takes time to arrange, and it takes time to do.  People should be working, not moving, and they should start now.  I don&#226;&#8364;&#8482;t do interviews.  I found that even arranging a phone interview takes five to seven days &#226;&#8364;&#8220; a big chunk of a 70 day project.  Instead, I let people start work and I evaluate their work later.  I also don&#226;&#8364;&#8482;t set up conference calls for the product team.  In my observation, time spent on the phone is a good indicator of communication problems, and is best avoided by improved management and communication.&lt;/p&gt;


	&lt;h3&gt;Don&#226;&#8364;&#8482;t get dragged down by old code.&lt;/h3&gt;


	&lt;p&gt;I believe in doing a lot of research and trying to adapt existing open source code, as an alternative to diving into new development.  We spent a week of our precious schedule taking a in-depth look at open source alternatives.  We considered a system with a friendly academic license and $4M worth of development behind it.  What we found was big, complicated enterprise software with lots of heavy baggage.  We talked to people who were adding to Sakai, and found that they were typically taking 8 months to do things that I thought should take a month.  We discarded the existing product for the same reason.  We moved on to a more agile architecture and never looked back.  I had to change my thinking because, in the new world, it often is faster to build from scratch.&lt;/p&gt;


	&lt;p&gt;Rails is simpler than java for this type of application, and the build was much faster as a result.&lt;/p&gt;


	&lt;h3&gt;Establish the data schema&lt;/h3&gt;


	&lt;p&gt;It is easy to add to a data schema, but difficult to change it.  I sometimes visit old clients and find that the people, products, and code that I knew are long forgotten, but the data schema remains.  Data schema is the one piece of up-front design that we do before diving into the build.&lt;/p&gt;


	&lt;h3&gt;Pile on with new team members&lt;/h3&gt;


	&lt;p&gt;It is possible to bring in a lot of new team members and let people pick their own tasks. Using this technique, we were able to triple our output in three weeks.  This approach is the exact opposite of the &amp;#8220;Mythical Man Month&amp;#8221; recommendation, which holds that adding new team members imposes a cost of learning time and management time which will delay a project that is on a short time schedule.  In my experience, adding team members &lt;span class="caps"&gt;DOES&lt;/span&gt; delay a project, if you need to guide them and manage them.  The pile-on method works if the new developers are good and can find their own way.  We are helped by our &#226;&#8364;&#339;inspired by open source&#226;&#8364;? methods, which were developed to serve large teams with loose central management, and the fact that some of the new developers are very good.    We can weed out the rest a few weeks later.&lt;/p&gt;


	&lt;p&gt;An obvious related lesson is to work with good people.  I am not even going to put it in the list of lessons from this project because it is far from a new lesson.  A good developer seems to be about 5 times as productive as an average developer.  In this project, there were several cases where a team member spent 2 weeks working on something, did not finish it, and then found it replaced by something our best guy finished in 2 days.  Given the potential gains, most project managers don&#226;&#8364;&#8482;t invest enough in recruiting and retention.&lt;/p&gt;


	&lt;h3&gt;Use a ticket list / work queue&lt;/h3&gt;


	&lt;p&gt;We put all of our tasks, bugs, and new requests into a list of &amp;#8220;tickets&amp;#8221;, often called a work queue.  We use Trac.  In fact, we use &lt;a href="http://www.assembla.com"&gt;Assembla.com&lt;/a&gt;. We sort the tickets by priority and milestone, so the tasks from the next milestone are on top of the list (queue).  It&#226;&#8364;&#8482;s easy to figure out what to do.  Just look at the list of tickets and pick something near the top.  You can try to adopt a more rigorous agile methodology, but you will find that it is hard to improve on this simple and effective technique.&lt;/p&gt;


	&lt;h3&gt;Build something now, even though we know we will have to rebuild&lt;/h3&gt;


	&lt;p&gt;We started building copies of the old product, and copies of features that we saw in other products, before we even had a coherent visual design or plan for the new product.  Then we ripped out a lot of the guts and rebuilt it.  This was still faster than waiting around for a coherent design and product plan.  Why?  In this new environment, development is faster than product management.  From a product management point of view, it is faster to ask for changes than to figure out what the product should do from scratch.  It takes forever to build something that is unknown, but if you know what you want, builds are fast. So, the two steps (copy and redesign/refactor), with clear instructions for each, are faster than one build from a blank sheet.&lt;/p&gt;


	&lt;h3&gt;Don&#226;&#8364;&#8482;t split the codebase into components&lt;/h3&gt;


	&lt;p&gt;In this application we needed several types of servers that were different &#226;&#8364;&#8220;a permissioned application, a public portal, and a central user registration server.  We lumped them together in one repository and one application with configurable &#226;&#8364;&#339;roles&#226;&#8364;? that turn features on or off.  This made the code a bit more complicated.  However, it made other aspects of managing the app &#226;&#8364;&#8220; setting up developers, testing, staging, deployment &#226;&#8364;&#8220; a lot simpler.&lt;/p&gt;


	&lt;h3&gt;Daily releases instead of stabilization periods&lt;/h3&gt;


	&lt;p&gt;In a normal Web 2.0 style release, you just run beta releases of increasing quality, until you are ready to do a bigger announcement.  In this case, I didn&#226;&#8364;&#8482;t think we had time for such gradual stabilization.  I initially recommended that we do a code freeze with a week of testing and stabilization.  The resulting product might not be perfect, but at least it wouldn&#226;&#8364;&#8482;t crash.  We started with a daily release process and no code freeze, and it worked well enough that we didn&#226;&#8364;&#8482;t need to a code freeze and stabilization period.  It&#226;&#8364;&#8482;s not bug free, but we fix the bugs as fast as people notice them.  I now have abundant evidence, from several projects, one of them a big enterprise &lt;span class="caps"&gt;ASP&lt;/span&gt;, that users will tolerate a product which comes directly from developers, every day, with minimal testing, if the time to release a bug fix is less than 24 hours.&lt;/p&gt;


	&lt;h3&gt;Make a usage dashboard&lt;/h3&gt;


	&lt;p&gt;Program a custom dashboard that shows registration and usage statistics.  Everyone on the team will use it every day as soon as the beta period starts.&lt;/p&gt;


	&lt;h3&gt;Web services are your friend&lt;/h3&gt;


	&lt;p&gt;Arranging integration with external systems can absorb a lot of calendar time.  We were able to use &lt;span class="caps"&gt;SOAP&lt;/span&gt; services (easily offered or called in Rails) to make it go faster than I expected.&lt;/p&gt;


	&lt;h3&gt;Hire users as product managers&lt;/h3&gt;


	&lt;p&gt;Product management &#226;&#8364;&#8220; figuring out what the product should do &#226;&#8364;&#8220; became the bottleneck early on and remains the bottleneck.  Using the above techniques, the developers pull requests off the ticket stack and implement them as fast  as we can make the requests.  Our strategy to deal with this is to hire users as part-time product managers, and let them each work with a mockup team to redesign the visual parts of the app.  With the distributed team system, it&#226;&#8364;&#8482;s easy to integrate part-timers like this.&lt;/p&gt;


	&lt;h3&gt;Don&#226;&#8364;&#8482;t create obstacles: Users provide the data&lt;/h3&gt;


	&lt;p&gt;We took out the centrally controlled categories and allowing users to just type their own tags for the content that they entered and shared.  I think we would still be waiting if we had to build our own categories.  We got a surprise when we released with a comprehensive list of US data, and we had immediate requests from dozens of countries.  I now think that users should be able to post additions to any part of the database if they need to.  Why block them?  Sometimes the additions can be released directly, and sometimes they may need to be approved by an editor.&lt;/p&gt;


	&lt;h3&gt;Documentation on a wiki&lt;/h3&gt;


	&lt;p&gt;If your application changes every day, you need to put the documentation on a wiki.  If you set up the documentation wiki early in the development process, you can start linking to it from inside the app, just like embedded help pages.&lt;/p&gt;


	&lt;h3&gt;Find the one thing people will use&lt;/h3&gt;


	&lt;p&gt;If you can find the one feature that people will use and adopt, it makes the whole system simpler.  So, release early and often and watch your dashboard.  Find that thing.&lt;/p&gt;</description>
      <pubDate>Sun, 07 Jan 2007 21:15:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:da8afd4fe43da86e6518be87762f9a97</guid>
      <author>andy@assembla.com</author>
      <link>http://andy.blogs.assembla.com/articles/2007/01/07/lessons-for-hyper-agile-product-development</link>
      <category>Agile Development</category>
      <category>Open Source</category>
      <category>Software Business</category>
      <trackback:ping>http://andy.blogs.assembla.com/articles/trackback/35</trackback:ping>
    </item>
  </channel>
</rss>
