<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Arnon Rotem-Gal-Oz's Cirrus Minor - Project Management</title>
    <link>http://www.rgoarchitects.com/nblog/</link>
    <description>"Making IT work" - Musings of a Holistict Architect</description>
    <language>en-us</language>
    <copyright>Arnon Rotem-Gal-Oz</copyright>
    <lastBuildDate>Sat, 01 Aug 2009 13:59:18 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.0.7226.0</generator>
    <managingEditor>Arnon@RgoArchitects.com</managingEditor>
    <webMaster>Arnon@RgoArchitects.com</webMaster>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=871605be-4aba-4a55-b3ba-4b4119df02d2</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,871605be-4aba-4a55-b3ba-4b4119df02d2.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,871605be-4aba-4a55-b3ba-4b4119df02d2.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=871605be-4aba-4a55-b3ba-4b4119df02d2</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Reacting to a <a href="http://ayende.com/Blog/archive/2009/07/21/answering-to-nhibernate-codebase-quality-criticism.aspx#feedback">comment</a> left
by <a href="http://weblogs.asp.net/fbouma">Frans Bauma</a>, Ayende recently <a href="http://ayende.com/Blog/archive/2009/07/29/what-is-maintainable.aspx">wrote
about “Maintainability”</a></p>
        <blockquote>
          <p>
Maintainable is a value that can only be applied by someone who is familiar with the
codebase. If that someone find it hard to work on the codebase, it is hard to maintain.
If someone with no knowledge of a codebase find it hard to work with it, tough luck,
but that doesn’t say anything about the maintainability of a code base. 
</p>
        </blockquote>
        <p>
I usually agree with what Ayende has to say, but not this time. First I hope that
by “someone who is familiar with the codebase” he doesn’t refer to the person that
actually wrote the code – since if the person who wrote the code can’t understand
what he/she wrote than the code base is doomed anyway.
</p>
        <p>
In the wider-sense “someone who is familiar with the codebase” is just part of the
picture – a code base is only maintainable is a reasonably professional developer
can get to a point where she is familiar enough with the code to be able to maintain
it. This doesn’t imply that the time it takes to be productive with the code base
is zero – but the lower the time it takes to get up to speed means the more maintainable
is the code.
</p>
        <p>
In any event, for a codebase to be maintainable, it has to show several quality attributes
.For the most part I agree withthe definition of Maintainability in <a href="http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=22749">ISO
9126:2001 Software Engineering Product Quality</a>* 
</p>
        <blockquote>
          <p>
6.5 <strong>Maintainability</strong><br />
The capability of the software product to be modified. Modifications may include corrections,
improvements or adaptation of the software to changes in environment, and in requirements
and functional specifications. 
</p>
          <ul>
            <li>
6.5.1 Analysability - The capability of the software product to be diagnosed for deficiencies
or causes of failures in the software, or for the parts to be modified to be identified. 
</li>
            <li>
6.5.2 Changeability - The capability of the software product to enable a specified
modification to be implemented. 
<br />
NOTE 1 Implementation includes coding, designing and documenting changes. 
<br />
NOTE 2 If the software is to be modified by the end user, changeability may affect
operability. 
</li>
            <li>
6.5.3 Stability - The capability of the software product to avoid unexpected effects
from modifications of the software 
</li>
            <li>
6.5.4 Testability - The capability of the software product to enable modified software
to be validated. 
</li>
            <li>
6.5.5 Maintainability compliance -The capability of the software product to adhere
to standards or conventions relating to maintainability. 
</li>
          </ul>
        </blockquote>
        <p>
Naturally, being a standard it has the “compliance” thingy which is usually only relevant
for large organizations and project but for the most part the different aspects mentioned
above are the parts you need to take care of when you want someone besides yourself
to make changes to the software.
</p>
        <p>
The view of Maintainability Ayende uses is problematic esp. when we consider that
(successful) software will spend most its life in maintenance and not in development
(you can read Robert L. Glass’s excellent “<a href="http://www.developerdotstar.com/mag/articles/maintenance_solution.html">Software
Maintenance is a Solution, Not a Problem</a>” paper in this regard). Assuming someone
maintaining the code will always be familiar with it is expecting the same developer(s)
to stay at the same project for as long as the project will live (which is not likely)
and/or assuming the project will have a short life (not something I’d want from my
projects)
</p>
        <p>
So don’t forget that other people will have to maintain your code and they probably
won’t live the code-base as you do or as they say in “<a href="http://c2.com/cgi/wiki?CodeForTheMaintainer">Code
for the maintainer</a>” in the C2 wiki 
</p>
        <blockquote>
          <p>
“Always code as if the person who ends up maintaining your code is a violent psychopath
who knows where you live. “ :)
</p>
        </blockquote>
        <hr />
* ISO 9126 is a multi-part standard for QA. I think ISO9126:2001 is good quick reference
for quality attributes ( i.e. something you can look at when you try to elicit quality
attributes for an architecture). I, personally think the other parts of the standard
are pretty useless but that's another story :) <img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=871605be-4aba-4a55-b3ba-4b4119df02d2" /></body>
      <title>What is maintainability anyway?</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,871605be-4aba-4a55-b3ba-4b4119df02d2.aspx</guid>
      <link>http://www.rgoarchitects.com/nblog/2009/08/01/WhatIsMaintainabilityAnyway.aspx</link>
      <pubDate>Sat, 01 Aug 2009 13:59:18 GMT</pubDate>
      <description>&lt;p&gt;
Reacting to a &lt;a href="http://ayende.com/Blog/archive/2009/07/21/answering-to-nhibernate-codebase-quality-criticism.aspx#feedback"&gt;comment&lt;/a&gt; left
by &lt;a href="http://weblogs.asp.net/fbouma"&gt;Frans Bauma&lt;/a&gt;, Ayende recently &lt;a href="http://ayende.com/Blog/archive/2009/07/29/what-is-maintainable.aspx"&gt;wrote
about “Maintainability”&lt;/a&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Maintainable is a value that can only be applied by someone who is familiar with the
codebase. If that someone find it hard to work on the codebase, it is hard to maintain.
If someone with no knowledge of a codebase find it hard to work with it, tough luck,
but that doesn’t say anything about the maintainability of a code base. 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
I usually agree with what Ayende has to say, but not this time. First I hope that
by “someone who is familiar with the codebase” he doesn’t refer to the person that
actually wrote the code – since if the person who wrote the code can’t understand
what he/she wrote than the code base is doomed anyway.
&lt;/p&gt;
&lt;p&gt;
In the wider-sense “someone who is familiar with the codebase” is just part of the
picture – a code base is only maintainable is a reasonably professional developer
can get to a point where she is familiar enough with the code to be able to maintain
it. This doesn’t imply that the time it takes to be productive with the code base
is zero – but the lower the time it takes to get up to speed means the more maintainable
is the code.
&lt;/p&gt;
&lt;p&gt;
In any event, for a codebase to be maintainable, it has to show several quality attributes
.For the most part I agree withthe definition of Maintainability in &lt;a href="http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=22749"&gt;ISO
9126:2001 Software Engineering Product Quality&lt;/a&gt;* 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
6.5 &lt;strong&gt;Maintainability&lt;/strong&gt; 
&lt;br /&gt;
The capability of the software product to be modified. Modifications may include corrections,
improvements or adaptation of the software to changes in environment, and in requirements
and functional specifications. 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
6.5.1 Analysability - The capability of the software product to be diagnosed for deficiencies
or causes of failures in the software, or for the parts to be modified to be identified. 
&lt;/li&gt;
&lt;li&gt;
6.5.2 Changeability - The capability of the software product to enable a specified
modification to be implemented. 
&lt;br /&gt;
NOTE 1 Implementation includes coding, designing and documenting changes. 
&lt;br /&gt;
NOTE 2 If the software is to be modified by the end user, changeability may affect
operability. 
&lt;/li&gt;
&lt;li&gt;
6.5.3 Stability - The capability of the software product to avoid unexpected effects
from modifications of the software 
&lt;/li&gt;
&lt;li&gt;
6.5.4 Testability - The capability of the software product to enable modified software
to be validated. 
&lt;/li&gt;
&lt;li&gt;
6.5.5 Maintainability compliance -The capability of the software product to adhere
to standards or conventions relating to maintainability. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Naturally, being a standard it has the “compliance” thingy which is usually only relevant
for large organizations and project but for the most part the different aspects mentioned
above are the parts you need to take care of when you want someone besides yourself
to make changes to the software.
&lt;/p&gt;
&lt;p&gt;
The view of Maintainability Ayende uses is problematic esp. when we consider that
(successful) software will spend most its life in maintenance and not in development
(you can read Robert L. Glass’s excellent “&lt;a href="http://www.developerdotstar.com/mag/articles/maintenance_solution.html"&gt;Software
Maintenance is a Solution, Not a Problem&lt;/a&gt;” paper in this regard). Assuming someone
maintaining the code will always be familiar with it is expecting the same developer(s)
to stay at the same project for as long as the project will live (which is not likely)
and/or assuming the project will have a short life (not something I’d want from my
projects)
&lt;/p&gt;
&lt;p&gt;
So don’t forget that other people will have to maintain your code and they probably
won’t live the code-base as you do or as they say in “&lt;a href="http://c2.com/cgi/wiki?CodeForTheMaintainer"&gt;Code
for the maintainer&lt;/a&gt;” in the C2 wiki 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
“Always code as if the person who ends up maintaining your code is a violent psychopath
who knows where you live. “ :)
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;hr /&gt;
* ISO 9126 is a multi-part standard for QA. I think ISO9126:2001 is good quick reference
for quality attributes ( i.e. something you can look at when you try to elicit quality
attributes for an architecture). I, personally think the other parts of the standard
are pretty useless but that's another story :) &lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=871605be-4aba-4a55-b3ba-4b4119df02d2" /&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,871605be-4aba-4a55-b3ba-4b4119df02d2.aspx</comments>
      <category>Agile</category>
      <category>Project Management</category>
    </item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=63218d3a-d00a-4592-a094-e84c9eaf1c49</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,63218d3a-d00a-4592-a094-e84c9eaf1c49.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,63218d3a-d00a-4592-a094-e84c9eaf1c49.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=63218d3a-d00a-4592-a094-e84c9eaf1c49</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <div style="FLOAT: right" class="zemanta-image">
          <img src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a3/Butchers_creek_-_omeo13.jpg/202px-Butchers_creek_-_omeo13.jpg" />
          <br />
          <small>Image via <a href="http://commons.wikipedia.org/wiki/Image:Butchers_creek_-_omeo13.jpg">Wikipedia</a></small>
        </div>
You might have noticed my blogging is slowing down a little,  in case you're
wondering the culprit is xsights - As we're getting closer to<br />
production (2-3 weeks if all goes well) everything else slows down... 
<br /><br />
We all know about continuous integration (CI). We (xsights) are seeing a lot of ROI
on the investments we made into signing up to CI esp. when we augmented by automated
testing. Everyday we can and do actually release several versions and run load tests
on them on different server seeking the best release to  "freeze". Where "freezing"
means the  system that will be used in production.  That's the way it is
done, right? You work on a release for x months (sometimes years..) and after an integration
period at the client's site you go live and forget about them (save for show-stopping
bugs) until the next major update several months later. For instance, setting up our
"methodology" I figured a 6 months release cycles for major versions plus 1 month
releases of minor version would suffice.<br /><br />
These days, however the more I think about it, The more I believe this approach is
not the right one for our situation. We are going to go with Continous Deployment.
There are many reasons for that  primarily:<br /><ul><li>
The requirements stream (new reqs and changes) is still pouring in - and in increased
rate. 
</li><li>
We are building a service platform not an installable product -  This means we
get to control where how it is run so there's less overhead in<br />
streamlining updates 
</li><li>
It would be our first public installation - were going to roll out bug fixes anyway
(I personally never write bugs... but you know ;) ). We'll need a proper procedure
for updates anyway 
</li><li>
We are doing this anyway - every new demo/internal run we have is using the "stablest"
latest and greatest :)</li></ul>
What does  Continuous Deployment means? It means we'll be rolling out new production
versions on a daily basis (or even more frequently!)<br />
How that's going to work? Well, First there are the prerequisites: 
<br /><br /><ul><li>
Version control - something that can track and tag versions...<br /></li><li>
Continous integration which is set up and running. You cannot release continously
if every new development offer breaks the system. An automated smoke test is 
<br /></li><li>
Automates tests that provide a good approximation of real usage<br />
(.e.g. usage patterns, loads etc.) - You need to be able to have a high<br />
confidence level that whatever you have.<br /></li><li>
Staging environment - An environment as close as possible to the production system
(just like you'd have for a web-site) 
</li><li>
Monitoring and alert system - You need to be able to identify problems quickly - the
running 
<br /><br /></li></ul>
Then there's the process:<br /><ol><li>
identify a baseline Stable release -The "fallback". 
</li><li>
pick the most promising build of the day 
</li><li>
run it through more extensive tests (at least burn-down and load - which means a release
maybe 1-2 days old by the time it hits the production system)<br /></li><li>
if everyhting is cool deploy to staging - else fix bugs and repeat from 2 
</li><li>
repeat tests in staging environment 
</li><li>
Update system (This is a point that still needs work so we can support a version hot-swap
i.e. without a shutdown).. 
</li><li>
If the monitoring system alerts unforeseen bugs (i.e. problems with the release) -
roll back to stable release, try to add test for the problematic behavior and repeat
from 2<br /></li><li>
if the release worked good enough - mark it as the next Stable release<br /></li></ol><br />
That's the plan. However as we all know, talk is cheap so be sure to check in here
in 2-3 months to hear how did we fare :)<br /><br /><div class="zemanta-pixie"><a class="zemanta-pixie-a" title="Zemified by Zemanta" href="http://reblog.zemanta.com/zemified/5cf72484-f08f-422f-9f63-03c477bbbe36/"><img class="zemanta-pixie-img" alt="Reblog this post [with Zemanta]" src="http://img.zemanta.com/reblog_e.png?x-id=5cf72484-f08f-422f-9f63-03c477bbbe36" /></a></div><p class="scribefire-powered"><br /></p><img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=63218d3a-d00a-4592-a094-e84c9eaf1c49" /></body>
      <title>Continuous Deployment</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,63218d3a-d00a-4592-a094-e84c9eaf1c49.aspx</guid>
      <link>http://www.rgoarchitects.com/nblog/2009/03/18/ContinuousDeployment.aspx</link>
      <pubDate>Wed, 18 Mar 2009 19:35:26 GMT</pubDate>
      <description>&lt;div style="FLOAT: right" class=zemanta-image&gt;&lt;img src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a3/Butchers_creek_-_omeo13.jpg/202px-Butchers_creek_-_omeo13.jpg"&gt;
&lt;br&gt;
&lt;small&gt;Image via &lt;a href="http://commons.wikipedia.org/wiki/Image:Butchers_creek_-_omeo13.jpg"&gt;Wikipedia&lt;/a&gt;&lt;/small&gt;
&lt;/div&gt;
You might have noticed my blogging is slowing down a little,&amp;nbsp; in case you're
wondering the culprit is xsights - As we're getting closer to&lt;br&gt;
production (2-3 weeks if all goes well) everything else slows down... 
&lt;br&gt;
&lt;br&gt;
We all know about continuous integration (CI). We (xsights) are seeing a lot of ROI
on the investments we made into signing up to CI esp. when we augmented by automated
testing. Everyday we can and do actually release several versions and run load tests
on them on different server seeking the best release to&amp;nbsp; "freeze". Where "freezing"
means the&amp;nbsp; system that will be used in production.&amp;nbsp; That's the way it is
done, right? You work on a release for x months (sometimes years..) and after an integration
period at the client's site you go live and forget about them (save for show-stopping
bugs) until the next major update several months later. For instance, setting up our
"methodology" I figured a 6 months release cycles for major versions plus 1 month
releases of minor version would suffice.&lt;br&gt;
&lt;br&gt;
These days, however the more I think about it, The more I believe this approach is
not the right one for our situation. We are going to go with Continous Deployment.
There are many reasons for that&amp;nbsp; primarily:&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;
The requirements stream (new reqs and changes) is still pouring in - and in increased
rate. 
&lt;li&gt;
We are building a service platform not an installable product -&amp;nbsp; This means we
get to control where how it is run so there's less overhead in&lt;br&gt;
streamlining updates 
&lt;li&gt;
It would be our first public installation - were going to roll out bug fixes anyway
(I personally never write bugs... but you know ;) ). We'll need a proper procedure
for updates anyway 
&lt;li&gt;
We are doing this anyway - every new demo/internal run we have is using the "stablest"
latest and greatest :)&lt;/li&gt;
&lt;/ul&gt;
What does&amp;nbsp; Continuous Deployment means? It means we'll be rolling out new production
versions on a daily basis (or even more frequently!)&lt;br&gt;
How that's going to work? Well, First there are the prerequisites: 
&lt;br&gt;
&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;
Version control - something that can track and tag versions...&lt;br&gt;
&lt;li&gt;
Continous integration which is set up and running. You cannot release continously
if every new development offer breaks the system. An automated smoke test is 
&lt;br&gt;
&lt;li&gt;
Automates tests that provide a good approximation of real usage&lt;br&gt;
(.e.g. usage patterns, loads etc.) - You need to be able to have a high&lt;br&gt;
confidence level that whatever you have.&lt;br&gt;
&lt;li&gt;
Staging environment - An environment as close as possible to the production system
(just like you'd have for a web-site) 
&lt;li&gt;
Monitoring and alert system - You need to be able to identify problems quickly - the
running 
&lt;br&gt;
&lt;br&gt;
&lt;/li&gt;
&lt;/ul&gt;
Then there's the process:&lt;br&gt;
&lt;ol&gt;
&lt;li&gt;
identify a baseline Stable release -The "fallback". 
&lt;li&gt;
pick the most promising build of the day 
&lt;li&gt;
run it through more extensive tests (at least burn-down and load - which means a release
maybe 1-2 days old by the time it hits the production system)&lt;br&gt;
&lt;li&gt;
if everyhting is cool deploy to staging - else fix bugs and repeat from 2 
&lt;li&gt;
repeat tests in staging environment 
&lt;li&gt;
Update system (This is a point that still needs work so we can support a version hot-swap
i.e. without a shutdown).. 
&lt;li&gt;
If the monitoring system alerts unforeseen bugs (i.e. problems with the release) -
roll back to stable release, try to add test for the problematic behavior and repeat
from 2&lt;br&gt;
&lt;li&gt;
if the release worked good enough - mark it as the next Stable release&lt;br&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;br&gt;
That's the plan. However as we all know, talk is cheap so be sure to check in here
in 2-3 months to hear how did we fare :)&lt;br&gt;
&lt;br&gt;
&lt;div class=zemanta-pixie&gt;&lt;a class=zemanta-pixie-a title="Zemified by Zemanta" href="http://reblog.zemanta.com/zemified/5cf72484-f08f-422f-9f63-03c477bbbe36/"&gt;&lt;img class=zemanta-pixie-img alt="Reblog this post [with Zemanta]" src="http://img.zemanta.com/reblog_e.png?x-id=5cf72484-f08f-422f-9f63-03c477bbbe36"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p class=scribefire-powered&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=63218d3a-d00a-4592-a094-e84c9eaf1c49" /&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,63218d3a-d00a-4592-a094-e84c9eaf1c49.aspx</comments>
      <category>Agile</category>
      <category>Project Management</category>
      <category>xsights</category>
    </item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=4e705feb-dd22-411a-9c70-ac36d9506461</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,4e705feb-dd22-411a-9c70-ac36d9506461.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,4e705feb-dd22-411a-9c70-ac36d9506461.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=4e705feb-dd22-411a-9c70-ac36d9506461</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">The year is almost done so I'd thought
it would be a good time for a short retrospective into what I blogged here. The 13 
posts below are the ones  I liked best this year. Turns out these posts touch
on a lot of different subjects: requirement, software management, agile development,
architecture, SOA and programming. 
<br /><br /><ul><li><a href="http://www.rgoarchitects.com/nblog/2008/01/09/UseCasesVsUserStories.aspx">Use
Cases vs. User Stories</a></li><li><a href="http://www.rgoarchitects.com/nblog/2008/02/05/TheLayeredArchitectureStyle.aspx">The
Layered Architecture Style</a></li><li><a href="http://www.rgoarchitects.com/nblog/2008/03/30/StickyNotesVsTheComputer.aspx">Sticky
notes vs. the computer</a></li><li><a href="http://www.rgoarchitects.com/nblog/2008/04/15/SleepTightDontLetTheTestBugsBite.aspx">Sleep
tight, don't let the test bugs bite</a></li><li><a class="TitleLinkStyle" rel="bookmark" href="http://www.rgoarchitects.com/nblog/2008/05/18/StatelessServicesTheStateIsOutThere.aspx">Stateless
services - The state is out there</a></li><li><a class="TitleLinkStyle" rel="bookmark" href="http://www.rgoarchitects.com/nblog/2008/06/18/CodeReadabilityDocumentationVsRefactoring.aspx">Code
readability - Documentation vs. Refactoring</a></li><li><a class="TitleLinkStyle" rel="bookmark" href="http://www.rgoarchitects.com/nblog/2008/07/12/SOASecurityReminder.aspx">SOA
security reminder</a></li><li><a class="TitleLinkStyle" rel="bookmark" href="http://www.rgoarchitects.com/nblog/2008/08/17/WhyTheDatabaseAsAServiceIsABadIdea.aspx">Why
the Database as a Service is a bad idea</a></li><li><a class="TitleLinkStyle" rel="bookmark" href="http://www.rgoarchitects.com/nblog/2008/08/31/ThinkHollistically.aspx">Think
Hollistically</a></li><li><a class="TitleLinkStyle" rel="bookmark" href="http://www.rgoarchitects.com/nblog/2008/09/20/ArchitectureItIsAlwaysATradeoff.aspx">Architecture
- It is always a tradeoff</a></li><li><a class="TitleLinkStyle" rel="bookmark" href="http://www.rgoarchitects.com/nblog/2008/10/26/ArchitectSoftSkills.aspx">Architect
Soft Skills</a></li><li><a class="TitleLinkStyle" rel="bookmark" href="http://www.rgoarchitects.com/nblog/2008/11/16/BrokenBuildWhiteNoise.aspx">Broken
build white noise</a></li><li><a class="TitleLinkStyle" rel="bookmark" href="http://www.rgoarchitects.com/nblog/2008/12/16/SOAAntiPatternTheKnot.aspx">SOA
Anti-Pattern : The Knot</a></li></ul><br /><img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=4e705feb-dd22-411a-9c70-ac36d9506461" /></body>
      <title>The baker's dozen - my best posts for 2008</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,4e705feb-dd22-411a-9c70-ac36d9506461.aspx</guid>
      <link>http://www.rgoarchitects.com/nblog/2008/12/20/TheBakersDozenMyBestPostsFor2008.aspx</link>
      <pubDate>Sat, 20 Dec 2008 22:10:06 GMT</pubDate>
      <description>The year is almost done so I'd thought it would be a good time for a short retrospective into what I blogged here. The 13&amp;nbsp; posts below are the ones&amp;nbsp; I liked best this year. Turns out these posts touch on a lot of different subjects: requirement, software management, agile development, architecture, SOA and programming. &lt;br&gt;
&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.rgoarchitects.com/nblog/2008/01/09/UseCasesVsUserStories.aspx"&gt;Use
Cases vs. User Stories&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.rgoarchitects.com/nblog/2008/02/05/TheLayeredArchitectureStyle.aspx"&gt;The
Layered Architecture Style&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.rgoarchitects.com/nblog/2008/03/30/StickyNotesVsTheComputer.aspx"&gt;Sticky
notes vs. the computer&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.rgoarchitects.com/nblog/2008/04/15/SleepTightDontLetTheTestBugsBite.aspx"&gt;Sleep
tight, don't let the test bugs bite&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a class="TitleLinkStyle" rel="bookmark" href="http://www.rgoarchitects.com/nblog/2008/05/18/StatelessServicesTheStateIsOutThere.aspx"&gt;Stateless
services - The state is out there&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a class="TitleLinkStyle" rel="bookmark" href="http://www.rgoarchitects.com/nblog/2008/06/18/CodeReadabilityDocumentationVsRefactoring.aspx"&gt;Code
readability - Documentation vs. Refactoring&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a class="TitleLinkStyle" rel="bookmark" href="http://www.rgoarchitects.com/nblog/2008/07/12/SOASecurityReminder.aspx"&gt;SOA
security reminder&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a class="TitleLinkStyle" rel="bookmark" href="http://www.rgoarchitects.com/nblog/2008/08/17/WhyTheDatabaseAsAServiceIsABadIdea.aspx"&gt;Why
the Database as a Service is a bad idea&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a class="TitleLinkStyle" rel="bookmark" href="http://www.rgoarchitects.com/nblog/2008/08/31/ThinkHollistically.aspx"&gt;Think
Hollistically&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a class="TitleLinkStyle" rel="bookmark" href="http://www.rgoarchitects.com/nblog/2008/09/20/ArchitectureItIsAlwaysATradeoff.aspx"&gt;Architecture
- It is always a tradeoff&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a class="TitleLinkStyle" rel="bookmark" href="http://www.rgoarchitects.com/nblog/2008/10/26/ArchitectSoftSkills.aspx"&gt;Architect
Soft Skills&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a class="TitleLinkStyle" rel="bookmark" href="http://www.rgoarchitects.com/nblog/2008/11/16/BrokenBuildWhiteNoise.aspx"&gt;Broken
build white noise&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a class="TitleLinkStyle" rel="bookmark" href="http://www.rgoarchitects.com/nblog/2008/12/16/SOAAntiPatternTheKnot.aspx"&gt;SOA
Anti-Pattern : The Knot&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=4e705feb-dd22-411a-9c70-ac36d9506461" /&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,4e705feb-dd22-411a-9c70-ac36d9506461.aspx</comments>
      <category>Agile</category>
      <category>Project Management</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
      <category>TDD</category>
    </item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=9f24d204-1604-46b1-96cf-e6d04bd60edc</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,9f24d204-1604-46b1-96cf-e6d04bd60edc.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,9f24d204-1604-46b1-96cf-e6d04bd60edc.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=9f24d204-1604-46b1-96cf-e6d04bd60edc</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">One important (yes, yes important) aspect
of <a href="http://martinfowler.com/articles/continuousIntegration.html">continuous
integration (CI)</a> is the way broken builds are reported. I'll tell you why but
before that let's quickly recap on CI in general. 
<br />
The point is to get an automated build process that run's after every check-in and
takes the system for a quick spin to verify all the major parts are still OK. CI helps
maintain the quality of the overall code by ensuring that components don't drift too
much apart and that the current version is still valid to a reasonable degree.<br /><br />
Martin Fowler's article on CI (referenced above) lists the following practices<br /><ul><li>
Maintain a Single Source Repository.</li><li>
Automate the Build</li><li>
Make Your Build Self-Testing</li><li>
Everyone Commits Every Day</li><li>
Every Commit Should Build the Mainline on an Integration Machine</li><li>
Keep the Build Fast</li><li>
Test in a Clone of the Production Environment</li><li>
Make it Easy for Anyone to Get the Latest Executable</li><li>
Everyone can see what's happening</li><li>
Automate Deployment</li></ul>
What I am saying that a practice missing from this list is to <b>maintain a clear
concise broken build report</b>. You see, whether we like it or not builds break.
Not every checking (well hopefully anyway:) and not every day but that isn't a scarce
sight either.<br />
In our setup we get an email every time the build breaks. That's a good thing - since
it increases the visibility of the problem. The message tells us who broke the build
and what's the error (something doesn't compile, unit test broken or smoke test broken)
and which file.<br /><br />
The problem is that is (was) that up until recently these details were unreliable
for instance<br /><ul><li>
The error message was so long nobody bothered to read where the problem is</li><li>
Once a build was broken every new checkin also got the broken build notice - this
time pointing the new person (doing the checking ) as the problem's source (even though
the previous person was to blame"</li><li>
etc.</li></ul>
The problem here is that unreliable reports quickly turn into white noise nobody pays
attention to (someone at the team said it was like the boy who cried wolf -by the
time it is really "your" problem you are no longer listening. When nobody pays attention,
problems get to age - in the long run this can also invalidate the whole CI approach
- somewhat like the <a href="http://en.wikipedia.org/wiki/Broken_windows_theory">broken
windows theory</a>. So for no broken builds the team has to pay attention to what's
wrong. The way to do that is to invest in the build script to make it more easy to
understand  and as reliable as possible  - this is something we did (and
still working on). I know I don't want to take the risk of broken build white noise...<br /><p class="scribefire-powered">
Powered by <a href="http://www.scribefire.com/">ScribeFire</a>.
</p><img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=9f24d204-1604-46b1-96cf-e6d04bd60edc" /></body>
      <title>Broken build white noise</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,9f24d204-1604-46b1-96cf-e6d04bd60edc.aspx</guid>
      <link>http://www.rgoarchitects.com/nblog/2008/11/16/BrokenBuildWhiteNoise.aspx</link>
      <pubDate>Sun, 16 Nov 2008 22:52:24 GMT</pubDate>
      <description>One important (yes, yes important) aspect of &lt;a href="http://martinfowler.com/articles/continuousIntegration.html"&gt;continuous
integration (CI)&lt;/a&gt; is the way broken builds are reported. I'll tell you why but
before that let's quickly recap on CI in general. 
&lt;br /&gt;
The point is to get an automated build process that run's after every check-in and
takes the system for a quick spin to verify all the major parts are still OK. CI helps
maintain the quality of the overall code by ensuring that components don't drift too
much apart and that the current version is still valid to a reasonable degree.&lt;br /&gt;
&lt;br /&gt;
Martin Fowler's article on CI (referenced above) lists the following practices&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;
Maintain a Single Source Repository.&lt;/li&gt;
&lt;li&gt;
Automate the Build&lt;/li&gt;
&lt;li&gt;
Make Your Build Self-Testing&lt;/li&gt;
&lt;li&gt;
Everyone Commits Every Day&lt;/li&gt;
&lt;li&gt;
Every Commit Should Build the Mainline on an Integration Machine&lt;/li&gt;
&lt;li&gt;
Keep the Build Fast&lt;/li&gt;
&lt;li&gt;
Test in a Clone of the Production Environment&lt;/li&gt;
&lt;li&gt;
Make it Easy for Anyone to Get the Latest Executable&lt;/li&gt;
&lt;li&gt;
Everyone can see what's happening&lt;/li&gt;
&lt;li&gt;
Automate Deployment&lt;/li&gt;
&lt;/ul&gt;
What I am saying that a practice missing from this list is to &lt;b&gt;maintain a clear
concise broken build report&lt;/b&gt;. You see, whether we like it or not builds break.
Not every checking (well hopefully anyway:) and not every day but that isn't a scarce
sight either.&lt;br /&gt;
In our setup we get an email every time the build breaks. That's a good thing - since
it increases the visibility of the problem. The message tells us who broke the build
and what's the error (something doesn't compile, unit test broken or smoke test broken)
and which file.&lt;br /&gt;
&lt;br /&gt;
The problem is that is (was) that up until recently these details were unreliable
for instance&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;
The error message was so long nobody bothered to read where the problem is&lt;/li&gt;
&lt;li&gt;
Once a build was broken every new checkin also got the broken build notice - this
time pointing the new person (doing the checking ) as the problem's source (even though
the previous person was to blame"&lt;/li&gt;
&lt;li&gt;
etc.&lt;/li&gt;
&lt;/ul&gt;
The problem here is that unreliable reports quickly turn into white noise nobody pays
attention to (someone at the team said it was like the boy who cried wolf -by the
time it is really "your" problem you are no longer listening. When nobody pays attention,
problems get to age - in the long run this can also invalidate the whole CI approach
- somewhat like the &lt;a href="http://en.wikipedia.org/wiki/Broken_windows_theory"&gt;broken
windows theory&lt;/a&gt;. So for no broken builds the team has to pay attention to what's
wrong. The way to do that is to invest in the build script to make it more easy to
understand&amp;nbsp; and as reliable as possible&amp;nbsp; - this is something we did (and
still working on). I know I don't want to take the risk of broken build white noise...&lt;br /&gt;
&lt;p class="scribefire-powered"&gt;
Powered by &lt;a href="http://www.scribefire.com/"&gt;ScribeFire&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=9f24d204-1604-46b1-96cf-e6d04bd60edc" /&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,9f24d204-1604-46b1-96cf-e6d04bd60edc.aspx</comments>
      <category>Agile</category>
      <category>Project Management</category>
    </item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=5852ab2d-55c1-4c19-b961-ff7babbc2e0f</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,5852ab2d-55c1-4c19-b961-ff7babbc2e0f.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,5852ab2d-55c1-4c19-b961-ff7babbc2e0f.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=5852ab2d-55c1-4c19-b961-ff7babbc2e0f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">Retrospectives, every "agile" team does
retrospectives.What are retrospectives anyway?<br /><br /><blockquote>A retrospective is a meeting where the team takes a look and inspect the
past, in order to adapt and improve the future.<br /></blockquote><br />
Agile or not, our team does a retrospective at the end of each iteration (every two
weeks in our case). We try to look at what worked, what didn't , how we are meeting
our goals etc, how is the product going etc.. These meetings provide a lot of value
for steering us at the right direction. 
<br />
On going retrospectives that look at the near past allows for suppleness and change
adaptation and they are very powerful at that - However it is sometimes worthwhile
to reflect over longer periods of time.<br /><br />
One area where longer perspective is important is the architecture of the project. <a href="http://www.rgoarchitects.com/nblog/2007/05/13/EvolvingArchitectures.aspx">Evolving
an architecture</a> you run the risk of accepting wrong decisions - mostly because
architectural decisions have long term implications, while YAGNI, time constraints
and life in general drive you toward short term gains.<br /><br />
Again, taking an example from my current project, working towards <a href="http://www.xsights.com/">the
first release</a>, we took a few major decisions during the development e.g.<br /><ul><li>
federated resource management - Taking into consideration the <a href="http://www.rgoarchitects.com/Files/fallacies.pdf">fallacies
of distributed computing</a> we decided that we'd have local resource managers that
will take care of resource utilization and allocation. The resource managers will
have a hierarchy where they'd communicate with each other to gain the "bigger picture"</li><li>
Introduce Parallel Pipelines - handle image understanding by dividing the work between
specialized components. 
<br /></li><li>
RESTful control channel - to use a "lingua franca" between all component types so
that we can easily integrate across platforms and languages<br /></li><li>
local failure handling - resources and components handle failure by themselves</li><li>
Communication technology (WCF in our case) is isolated from the business logic by
an Edge Component<br /></li><li>
etc.</li></ul>
Once we finished delivering the first release. We took a few "days off" to consider
what we've done thus far. updated our quality attribute list per our knowledge working
with the system and looking at some customer scenarios. studies the things we liked/didn't
like in the design and architecture of the working system. and revised a few of our
decisions for instance<br /><ul><li>
We found that rushing to a working system we introduced some excess coupling to a
specific technological solution (for video rendering). We initiated a few proof of
concepts and found out how to both isolate the technology from the rest of the system
as well as allow more technology choices.</li><li>
We found that the some of the data flows were not as clean as we thought they'd be
- adding new features caused more resource interactions than we thought when we partitioned
the resources. We redefined some of the resource roles to get less message clutter
(and higher cohesion)<br /></li><li>
The federated resource management works well, but introduce needless latency in session
initiation. We now opted for introduce "Active services" which are more autonomous.</li><li>
Add a blogjecting Watchdog in addition to local failure handling to both increase
the chances of failure identification and recovery as well as get a better picture
in a centralized Service Monitor.</li><li>
RESTful control channel worked well and will continue for later release</li><li>
Some of the scale issues will be handled by introducing "Virtual Endpoints" while
some would continue to use autonoumous endpoint creation and liveliness dissemination
(hopefully learning from <a href="http://status.aws.amazon.com/s3-20080720.html">the
mistakes of others</a>)</li><li>
etc.<br /></li></ul>
The result of these and the other decisions we've maid is a rework plan that will
(hopefully anyway) make our overall solution better.<br />
What we see is that we evolved our architecture as we went forward. While all the
the decisions we made seemed right at the time we took them, only through reviewing
them in a wider perspective (architecture retrospective) we identified the decisions
that we need to change and the ones that we have to enhance. The insight you gain
after working on a project for awhile are much better than the initial thoughts you
have or the understanding you master in the initial interations. 
<br />
I think it is essential to review the architecture once you've gained more experience
with the realities of the system you write (vs. the precieved realities you have on
the get go)<br /><br />
By the way if you work with a waterfall approach your situation is worse. Since in
this case you take your decisions before you write any code so, you don't even have
the benefit of POCs, and working code to enhance your insights<br /><br /><br />
PS<br />
if you have the MEAP version of <a href="http://www.rgoarchitects.com/SOAPatterns/">SOA
Patterns</a> you can read more on the patterns I've mentioned here: Active service
in chapter 2, blogjecting watchdog in chapter3, Service Monitor in chapter 4, Parallel
Pipelines in chapter 3, Edge Component in chapter 2<br /><br /><img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=5852ab2d-55c1-4c19-b961-ff7babbc2e0f" /></body>
      <title>Evolving Architectures - Architecture Retrospective</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,5852ab2d-55c1-4c19-b961-ff7babbc2e0f.aspx</guid>
      <link>http://www.rgoarchitects.com/nblog/2008/08/12/EvolvingArchitecturesArchitectureRetrospective.aspx</link>
      <pubDate>Tue, 12 Aug 2008 21:40:21 GMT</pubDate>
      <description>Retrospectives, every "agile" team does retrospectives.What are retrospectives anyway?&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;A retrospective is a meeting where the team takes a look and inspect the
past, in order to adapt and improve the future.&lt;br /&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
Agile or not, our team does a retrospective at the end of each iteration (every two
weeks in our case). We try to look at what worked, what didn't , how we are meeting
our goals etc, how is the product going etc.. These meetings provide a lot of value
for steering us at the right direction. 
&lt;br /&gt;
On going retrospectives that look at the near past allows for suppleness and change
adaptation and they are very powerful at that - However it is sometimes worthwhile
to reflect over longer periods of time.&lt;br /&gt;
&lt;br /&gt;
One area where longer perspective is important is the architecture of the project. &lt;a href="http://www.rgoarchitects.com/nblog/2007/05/13/EvolvingArchitectures.aspx"&gt;Evolving
an architecture&lt;/a&gt; you run the risk of accepting wrong decisions - mostly because
architectural decisions have long term implications, while YAGNI, time constraints
and life in general drive you toward short term gains.&lt;br /&gt;
&lt;br /&gt;
Again, taking an example from my current project, working towards &lt;a href="http://www.xsights.com/"&gt;the
first release&lt;/a&gt;, we took a few major decisions during the development e.g.&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;
federated resource management - Taking into consideration the &lt;a href="http://www.rgoarchitects.com/Files/fallacies.pdf"&gt;fallacies
of distributed computing&lt;/a&gt; we decided that we'd have local resource managers that
will take care of resource utilization and allocation. The resource managers will
have a hierarchy where they'd communicate with each other to gain the "bigger picture"&lt;/li&gt;
&lt;li&gt;
Introduce Parallel Pipelines - handle image understanding by dividing the work between
specialized components. 
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;
RESTful control channel - to use a "lingua franca" between all component types so
that we can easily integrate across platforms and languages&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;
local failure handling - resources and components handle failure by themselves&lt;/li&gt;
&lt;li&gt;
Communication technology (WCF in our case) is isolated from the business logic by
an Edge Component&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;
etc.&lt;/li&gt;
&lt;/ul&gt;
Once we finished delivering the first release. We took a few "days off" to consider
what we've done thus far. updated our quality attribute list per our knowledge working
with the system and looking at some customer scenarios. studies the things we liked/didn't
like in the design and architecture of the working system. and revised a few of our
decisions for instance&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;
We found that rushing to a working system we introduced some excess coupling to a
specific technological solution (for video rendering). We initiated a few proof of
concepts and found out how to both isolate the technology from the rest of the system
as well as allow more technology choices.&lt;/li&gt;
&lt;li&gt;
We found that the some of the data flows were not as clean as we thought they'd be
- adding new features caused more resource interactions than we thought when we partitioned
the resources. We redefined some of the resource roles to get less message clutter
(and higher cohesion)&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;
The federated resource management works well, but introduce needless latency in session
initiation. We now opted for introduce "Active services" which are more autonomous.&lt;/li&gt;
&lt;li&gt;
Add a blogjecting Watchdog in addition to local failure handling to both increase
the chances of failure identification and recovery as well as get a better picture
in a centralized Service Monitor.&lt;/li&gt;
&lt;li&gt;
RESTful control channel worked well and will continue for later release&lt;/li&gt;
&lt;li&gt;
Some of the scale issues will be handled by introducing "Virtual Endpoints" while
some would continue to use autonoumous endpoint creation and liveliness dissemination
(hopefully learning from &lt;a href="http://status.aws.amazon.com/s3-20080720.html"&gt;the
mistakes of others&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
etc.&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;
The result of these and the other decisions we've maid is a rework plan that will
(hopefully anyway) make our overall solution better.&lt;br /&gt;
What we see is that we evolved our architecture as we went forward. While all the
the decisions we made seemed right at the time we took them, only through reviewing
them in a wider perspective (architecture retrospective) we identified the decisions
that we need to change and the ones that we have to enhance. The insight you gain
after working on a project for awhile are much better than the initial thoughts you
have or the understanding you master in the initial interations. 
&lt;br /&gt;
I think it is essential to review the architecture once you've gained more experience
with the realities of the system you write (vs. the precieved realities you have on
the get go)&lt;br /&gt;
&lt;br /&gt;
By the way if you work with a waterfall approach your situation is worse. Since in
this case you take your decisions before you write any code so, you don't even have
the benefit of POCs, and working code to enhance your insights&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PS&lt;br /&gt;
if you have the MEAP version of &lt;a href="http://www.rgoarchitects.com/SOAPatterns/"&gt;SOA
Patterns&lt;/a&gt; you can read more on the patterns I've mentioned here: Active service
in chapter 2, blogjecting watchdog in chapter3, Service Monitor in chapter 4, Parallel
Pipelines in chapter 3, Edge Component in chapter 2&lt;br /&gt;
&lt;br /&gt;
&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=5852ab2d-55c1-4c19-b961-ff7babbc2e0f" /&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,5852ab2d-55c1-4c19-b961-ff7babbc2e0f.aspx</comments>
      <category>Agile</category>
      <category>Project Management</category>
      <category>REST</category>
      <category>SOA</category>
      <category>SOA Patterns</category>
      <category>Software Architecture</category>
    </item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=7d6b3e46-a65d-4b39-be95-83b833fd652c</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,7d6b3e46-a65d-4b39-be95-83b833fd652c.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,7d6b3e46-a65d-4b39-be95-83b833fd652c.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=7d6b3e46-a65d-4b39-be95-83b833fd652c</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <a href="http://jrothman.com/blog/mpd/2008/07/funding-projects-incrementally.html">Johanna
writes</a> about how you should fund project in an incremental manner especially when
it comes to the most risky ones:<br /><br /><blockquote>incrementally, in some sort of a timebox. (Gotcha!) But here’s why it
make sense to do that: 
<ul><li>
If you show value to someone, preferably your customer, you are much more likely to
get more funding.</li><li>
If you’re not showing value early and often, you get feedback early enough to change
before you start a death march for something your customers don’t want.</li><li>
You can start highly risky projects, because you’re not committing a ton of money
and time to that much risk. You’re just committing 2, 3, or 4 weeks.</li></ul></blockquote><br />
I have to say I agree 100%. One nice anecdote in this regard, happened to me a few
years ago. I was working for a rather bureaucratic, waterfallish organization. I wanted
to outsource part of a project I was running and I found an agile sub-contractor for
the job. I somehow managed to convince both my management and the methods and practices
group that this project should be using SCRUM (the only "cost" for me was that I had
to write a Software Development Plan , proving that SCRUM can be ISO 90003 compliant,
but that's another story). 
<br />
We set up a rough plan (release plan) with timeboxed releases every three months (every
3 iterations) and we were all set. Almost, that is - when I approached the procurement
group they told me to hold my horses. They were not willing to go through the procurment
process every three month. They also weren't very keen on the cost plus nature of
the plan (the deliverables weren't prefixed as we were going to evolve the solution).
To went over this hurdle I had to prepare a pseudo plan were they had "real" mile
stones (basically based on the release planning mentioned above). We ended up budgeting
the whole thing in advance, however I did convince them to establish sort of a blanket
purchase order, so that we were able to release funds incrementally as we progressed.<br /><img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=7d6b3e46-a65d-4b39-be95-83b833fd652c" /></body>
      <title>Funding projects incrementally</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,7d6b3e46-a65d-4b39-be95-83b833fd652c.aspx</guid>
      <link>http://www.rgoarchitects.com/nblog/2008/08/03/FundingProjectsIncrementally.aspx</link>
      <pubDate>Sun, 03 Aug 2008 21:44:38 GMT</pubDate>
      <description>&lt;a href="http://jrothman.com/blog/mpd/2008/07/funding-projects-incrementally.html"&gt;Johanna
writes&lt;/a&gt; about how you should fund project in an incremental manner especially when
it comes to the most risky ones:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;incrementally, in some sort of a timebox. (Gotcha!) But here’s why it
make sense to do that: 
&lt;ul&gt;
&lt;li&gt;
If you show value to someone, preferably your customer, you are much more likely to
get more funding.&lt;/li&gt;
&lt;li&gt;
If you’re not showing value early and often, you get feedback early enough to change
before you start a death march for something your customers don’t want.&lt;/li&gt;
&lt;li&gt;
You can start highly risky projects, because you’re not committing a ton of money
and time to that much risk. You’re just committing 2, 3, or 4 weeks.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
I have to say I agree 100%. One nice anecdote in this regard, happened to me a few
years ago. I was working for a rather bureaucratic, waterfallish organization. I wanted
to outsource part of a project I was running and I found an agile sub-contractor for
the job. I somehow managed to convince both my management and the methods and practices
group that this project should be using SCRUM (the only "cost" for me was that I had
to write a Software Development Plan , proving that SCRUM can be ISO 90003 compliant,
but that's another story). 
&lt;br /&gt;
We set up a rough plan (release plan) with timeboxed releases every three months (every
3 iterations) and we were all set. Almost, that is - when I approached the procurement
group they told me to hold my horses. They were not willing to go through the procurment
process every three month. They also weren't very keen on the cost plus nature of
the plan (the deliverables weren't prefixed as we were going to evolve the solution).
To went over this hurdle I had to prepare a pseudo plan were they had "real" mile
stones (basically based on the release planning mentioned above). We ended up budgeting
the whole thing in advance, however I did convince them to establish sort of a blanket
purchase order, so that we were able to release funds incrementally as we progressed.&lt;br /&gt;
&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=7d6b3e46-a65d-4b39-be95-83b833fd652c" /&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,7d6b3e46-a65d-4b39-be95-83b833fd652c.aspx</comments>
      <category>Agile</category>
      <category>Project Management</category>
    </item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=3c8e61d4-d07e-4f73-b62a-8d3adc7bf9ca</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,3c8e61d4-d07e-4f73-b62a-8d3adc7bf9ca.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,3c8e61d4-d07e-4f73-b62a-8d3adc7bf9ca.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=3c8e61d4-d07e-4f73-b62a-8d3adc7bf9ca</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <a href="http://www.rgoarchitects.com/nblog/default.aspx?page=admin">While
I am on the subject of Project management, </a>One nice feature of <a href="http://studios.thoughtworks.com/mingle-project-intelligence">Mingle </a>(I
am not sure if it is new in v.2 or it was there in v1) is requirements traceability.<br />
Requirements traceability is a requirements management discipline which makes it possible
to attribute artifacts (design/code etc) to the requirements that originated them.
It also provides a way to mange changes (if you know which artifacts were created
to fulfill a requirement you also know the artifacts that are likely to change when
the requirement change).<br /><br />
However, above all that, Requirements traceability is a pain in the ass* ! Which means
it is hardly ever done. Especially in agile projects (working code over extensive
documentation, remeber?)<br /><br />
Anyway, as I said, a nice feature of mingle is that, if you set it to work with your
subversion repository (I created a user for mingle) and when you check in code you
add the card number to the check-in comments (e.g. #123 - fixed this and that bug).
Mingle will let you navigate that relation. i.e. in the History -&gt; revisions you
can see the card number and click through to the card it-self. If you also do the
same from tasks to stories you get a good traceability with very little effort<br /><br /><br /><hr />
And I can tell you that from personal experience having once volunteered(!) to do
the whole traceability matrix for a 1000+ man/year project from the analysis to the
customer requirements ( it took more than 2 weeks in case you are wondering) <img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=3c8e61d4-d07e-4f73-b62a-8d3adc7bf9ca" /></body>
      <title>Requirements Tracability in Mingle</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,3c8e61d4-d07e-4f73-b62a-8d3adc7bf9ca.aspx</guid>
      <link>http://www.rgoarchitects.com/nblog/2008/06/02/RequirementsTracabilityInMingle.aspx</link>
      <pubDate>Mon, 02 Jun 2008 21:17:32 GMT</pubDate>
      <description>&lt;a href="http://www.rgoarchitects.com/nblog/default.aspx?page=admin"&gt;While I am on
the subject of Project management, &lt;/a&gt;One nice feature of &lt;a href="http://studios.thoughtworks.com/mingle-project-intelligence"&gt;Mingle &lt;/a&gt;(I
am not sure if it is new in v.2 or it was there in v1) is requirements traceability.&lt;br&gt;
Requirements traceability is a requirements management discipline which makes it possible
to attribute artifacts (design/code etc) to the requirements that originated them.
It also provides a way to mange changes (if you know which artifacts were created
to fulfill a requirement you also know the artifacts that are likely to change when
the requirement change).&lt;br&gt;
&lt;br&gt;
However, above all that, Requirements traceability is a pain in the ass* ! Which means
it is hardly ever done. Especially in agile projects (working code over extensive
documentation, remeber?)&lt;br&gt;
&lt;br&gt;
Anyway, as I said, a nice feature of mingle is that, if you set it to work with your
subversion repository (I created a user for mingle) and when you check in code you
add the card number to the check-in comments (e.g. #123 - fixed this and that bug).
Mingle will let you navigate that relation. i.e. in the History -&amp;gt; revisions you
can see the card number and click through to the card it-self. If you also do the
same from tasks to stories you get a good traceability with very little effort&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;hr&gt;
And I can tell you that from personal experience having once volunteered(!) to do
the whole traceability matrix for a 1000+ man/year project from the analysis to the
customer requirements ( it took more than 2 weeks in case you are wondering) &lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=3c8e61d4-d07e-4f73-b62a-8d3adc7bf9ca" /&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,3c8e61d4-d07e-4f73-b62a-8d3adc7bf9ca.aspx</comments>
      <category>Agile</category>
      <category>Project Management</category>
    </item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=2f65da71-15bb-490d-9d2a-454f175eb5e6</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,2f65da71-15bb-490d-9d2a-454f175eb5e6.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,2f65da71-15bb-490d-9d2a-454f175eb5e6.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=2f65da71-15bb-490d-9d2a-454f175eb5e6</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">When you are working towards a specific
goal esp. if it is a looming mile stone or something to that effect, you tend to leave
stuff behind, cut some corners, just a wee bit of slack... This "stuff" has a nice
metaphor to describe it. It is called <a href="http://www.c2.com/cgi/wiki?TechnicalDebt">"Technical
Debt" .</a><br /><br />
If you don't mind your technical debt it can grow so much you'd end up with a <a href="http://www.laputan.org/mud/">big-ball-of-mud</a> which
is hard to maintain, change and, well, do anything useful with.<br /><br />
The best way, I've found to deal with this is to "add a card" every time I feel the
urge to add a //TODO comment. Or in other words add the technical debt as a task into
the product/task backlog.<br />
Having the technical debt on the backlog has several benefits such as<br /><ul><li>
It will not be forgotten - it will be documented...<br /></li><li>
It will not be hidden - The true state of the product will be in the open for management/product
owner to see. As a manager I want to know the true state of the product. If I know
what I can and can't have I can get ready for that. If I think everything is rosy
and then the system blows up in my face, that's not so good..</li><li>
It will be managed - The importance/relevance of the "debt" will be reevaluated every
time the product backlog get prioritized. 
<br /></li></ul>
Technical debt will occur in your project, whether it is agile, "water-falled" , incremental
or what not. Don't ignore it<br /><br /><br /><img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=2f65da71-15bb-490d-9d2a-454f175eb5e6" /></body>
      <title>Make technical debt explicit</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,2f65da71-15bb-490d-9d2a-454f175eb5e6.aspx</guid>
      <link>http://www.rgoarchitects.com/nblog/2008/06/02/MakeTechnicalDebtExplicit.aspx</link>
      <pubDate>Mon, 02 Jun 2008 20:56:50 GMT</pubDate>
      <description>When you are working towards a specific goal esp. if it is a looming mile stone or something to that effect, you tend to leave stuff behind, cut some corners, just a wee bit of slack... This "stuff" has a nice metaphor to describe it. It is called &lt;a href="http://www.c2.com/cgi/wiki?TechnicalDebt"&gt;"Technical
Debt" .&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
If you don't mind your technical debt it can grow so much you'd end up with a &lt;a href="http://www.laputan.org/mud/"&gt;big-ball-of-mud&lt;/a&gt; which
is hard to maintain, change and, well, do anything useful with.&lt;br /&gt;
&lt;br /&gt;
The best way, I've found to deal with this is to "add a card" every time I feel the
urge to add a //TODO comment. Or in other words add the technical debt as a task into
the product/task backlog.&lt;br /&gt;
Having the technical debt on the backlog has several benefits such as&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;
It will not be forgotten - it will be documented...&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;
It will not be hidden - The true state of the product will be in the open for management/product
owner to see. As a manager I want to know the true state of the product. If I know
what I can and can't have I can get ready for that. If I think everything is rosy
and then the system blows up in my face, that's not so good..&lt;/li&gt;
&lt;li&gt;
It will be managed - The importance/relevance of the "debt" will be reevaluated every
time the product backlog get prioritized. 
&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;
Technical debt will occur in your project, whether it is agile, "water-falled" , incremental
or what not. Don't ignore it&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=2f65da71-15bb-490d-9d2a-454f175eb5e6" /&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,2f65da71-15bb-490d-9d2a-454f175eb5e6.aspx</comments>
      <category>Agile</category>
      <category>Project Management</category>
    </item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=20ec7cd5-f182-41bc-bb78-e5320ec177f1</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,20ec7cd5-f182-41bc-bb78-e5320ec177f1.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,20ec7cd5-f182-41bc-bb78-e5320ec177f1.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=20ec7cd5-f182-41bc-bb78-e5320ec177f1</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">I never really understood would I want
to use sticky notes/cards  in my agile projects rather than use a software tools.
After all we write software for others - how can we say that software is not a good
enough solution for us ?<br />
For instance, in our <a href="http://studios.thoughtworks.com/mingle-project-intelligence">team
we use Mingle by Thoughtworks</a>. I think it is one of the best tools for project
management I've ever used.  Its serves us well for sprint planning, daily scrums
etc. Among other things it gives you "digital" sticky notes which you can drag around
to move between statuses or whatnot - just perfect.<br /><br />
And yet, last week when we were pushing for completing our first major milestone I
decided to try real sticky notes, and finally I understood the difference - <b>constant
visibility.</b> Computerized tasks seem to be just as accessible as physical cards
but in fact they aren't. Yes, everyone <b>can</b> see the status whenever they want.
But the fact that you can doesn't mean that you do. Digital cards don't have the "in-your-face"
kind of effect that always visible notes has. I've seen a notable  difference
in maintaining the dev team's focus and making managers (the CEO in my case) feel
they are in the loop and that progress is constantly made.<br />
My conclusion is clear. While I still use electronic tools, I guess, until we'd have
large enough <a href="http://www.eink.com/index.html">e-ink</a> boards to allow us
to get the same effect physicals cards give us I'll just have to keep restocking my
sticky notes inventory :)<br /><p></p><img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=20ec7cd5-f182-41bc-bb78-e5320ec177f1" /></body>
      <title>Sticky notes vs. the computer</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,20ec7cd5-f182-41bc-bb78-e5320ec177f1.aspx</guid>
      <link>http://www.rgoarchitects.com/nblog/2008/03/30/StickyNotesVsTheComputer.aspx</link>
      <pubDate>Sun, 30 Mar 2008 22:07:28 GMT</pubDate>
      <description>I never really understood would I want to use sticky notes/cards&amp;nbsp; in my
agile projects rather than use a software tools. After all we write
software for others - how can we say that software is not a good enough
solution for us ?&lt;br&gt;
For instance, in our &lt;a href="http://studios.thoughtworks.com/mingle-project-intelligence"&gt;team
we use Mingle by Thoughtworks&lt;/a&gt;. I think it is one of the best tools for project
management I've ever used.&amp;nbsp; Its serves us well for sprint planning, daily scrums
etc. Among other things it gives you "digital" sticky notes which you can drag around
to move between statuses or whatnot - just perfect.&lt;br&gt;
&lt;br&gt;
And yet, last week when we were pushing for completing our first major milestone I
decided to try real sticky notes, and finally I understood the difference - &lt;b&gt;constant
visibility.&lt;/b&gt; Computerized tasks seem to be just as accessible as physical cards
but in fact they aren't. Yes, everyone &lt;b&gt;can&lt;/b&gt; see the status whenever they want.
But the fact that you can doesn't mean that you do. Digital cards don't have the "in-your-face"
kind of effect that always visible notes has. I've seen a notable&amp;nbsp; difference
in maintaining the dev team's focus and making managers (the CEO in my case) feel
they are in the loop and that progress is constantly made.&lt;br&gt;
My conclusion is clear. While I still use electronic tools, I guess, until we'd have
large enough &lt;a href="http://www.eink.com/index.html"&gt;e-ink&lt;/a&gt; boards to allow us
to get the same effect physicals cards give us I'll just have to keep restocking my
sticky notes inventory :)&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=20ec7cd5-f182-41bc-bb78-e5320ec177f1" /&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,20ec7cd5-f182-41bc-bb78-e5320ec177f1.aspx</comments>
      <category>Agile</category>
      <category>Project Management</category>
      <category>SCRUM</category>
    </item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=9cd847cb-fa11-4240-bf63-b165863c8409</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,9cd847cb-fa11-4240-bf63-b165863c8409.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,9cd847cb-fa11-4240-bf63-b165863c8409.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=9cd847cb-fa11-4240-bf63-b165863c8409</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">Jeremy D. Miller <a href="http://codebetter.com/blogs/jeremy.miller/archive/2007/11/13/a-train-of-thought-november-13th-2007-edition.aspx">writes
that he prefers user stories better than use cases</a> - and I basically agree with
him. Mostly because user stories are finer grained which lends to make them more "estimateable" 
and manageable then use cases are.<br /><br />
However, having used both, I think there's one thing use cases do better then user
stories which is eliciting related scenarios. When you write a use case that covers
a  business scenario the use case template makes you think about variations and
exceptions. When you try to think of a theme of user stories if you're not careful
to do that in a structured manner you may miss some. 
<br /><br />
One important point regarding use cases is that you don't have to treat the use case
a single monolithic block. When you work with use cases it doesn't have to mean that
you sign-off use cases in a waterfall-ish manner- that is something that has to do
with your development methodology.<br />
You can develop use cases incrementally i.e. only do some of the use cases per "release".
You can also elaborate use cases   iteratively by only elaborating/identifying
some of the scenarios in each iteration (in a manner similar to user stories). I have
successfully use both incremental and iterative use case elaborations  on several
projects and I find it very useful (<a href="../blog/content/binary/uc.pdf">I even
wrote paper summarizing my use cases experience a few years ago</a> (warning - more
than 60 pages with the examples and all..)<br /><br />
In fact, even today I find it useful to use both tools where I would usually start
with identifying a user story and writing that down. Then map it to a use case (either
existing  or a new one) - where a use case roughly equals a user story theme.
As I mentioned previously I can them identify more user stories and add them to the
product backlog. The use case stays a skeleton with links to the user stories and
helps provide more context to individual use stories (ok, so that isn't a use case
in the traditional sense, but I find it useful anyway).<br /><br />
Generally speaking, it is important to note that while it is tempting to equate a
user story with a scenario in a use case, that isn't always true. sometime a user
story would be a step in a use case and sometimes a story is shared by several use
cases - since a fine grained feature that delivers business value is can be used in
many business processes which is what use cases are oriented to<br /><br /><br />
As a side note, if you have a project where you do have to write all the requirements
up-front (as if they won't change anyway...) then I find that use cases are way superior
than IEEE 830 style requirements ("The system shall...")  - but hey, that's another
story :)<p></p><img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=9cd847cb-fa11-4240-bf63-b165863c8409" /></body>
      <title>Use Cases and User Stories </title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,9cd847cb-fa11-4240-bf63-b165863c8409.aspx</guid>
      <link>http://www.rgoarchitects.com/nblog/2007/11/14/UseCasesAndUserStories.aspx</link>
      <pubDate>Wed, 14 Nov 2007 00:15:55 GMT</pubDate>
      <description>Jeremy D. Miller &lt;a href="http://codebetter.com/blogs/jeremy.miller/archive/2007/11/13/a-train-of-thought-november-13th-2007-edition.aspx"&gt;writes
that he prefers user stories better than use cases&lt;/a&gt; - and I basically agree with
him. Mostly because user stories are finer grained which lends to make them more "estimateable"&amp;nbsp;
and manageable then use cases are.&lt;br&gt;
&lt;br&gt;
However, having used both, I think there's one thing use cases do better then user
stories which is eliciting related scenarios. When you write a use case that covers
a&amp;nbsp; business scenario the use case template makes you think about variations and
exceptions. When you try to think of a theme of user stories if you're not careful
to do that in a structured manner you may miss some. 
&lt;br&gt;
&lt;br&gt;
One important point regarding use cases is that you don't have to treat the use case
a single monolithic block. When you work with use cases it doesn't have to mean that
you sign-off use cases in a waterfall-ish manner- that is something that has to do
with your development methodology.&lt;br&gt;
You can develop use cases incrementally i.e. only do some of the use cases per "release".
You can also elaborate use cases&amp;nbsp;&amp;nbsp; iteratively by only elaborating/identifying
some of the scenarios in each iteration (in a manner similar to user stories). I have
successfully use both incremental and iterative use case elaborations&amp;nbsp; on several
projects and I find it very useful (&lt;a href="../blog/content/binary/uc.pdf"&gt;I even
wrote paper summarizing my use cases experience a few years ago&lt;/a&gt; (warning - more
than 60 pages with the examples and all..)&lt;br&gt;
&lt;br&gt;
In fact, even today I find it useful to use both tools where I would usually start
with identifying a user story and writing that down. Then map it to a use case (either
existing&amp;nbsp; or a new one) - where a use case roughly equals a user story theme.
As I mentioned previously I can them identify more user stories and add them to the
product backlog. The use case stays a skeleton with links to the user stories and
helps provide more context to individual use stories (ok, so that isn't a use case
in the traditional sense, but I find it useful anyway).&lt;br&gt;
&lt;br&gt;
Generally speaking, it is important to note that while it is tempting to equate a
user story with a scenario in a use case, that isn't always true. sometime a user
story would be a step in a use case and sometimes a story is shared by several use
cases - since a fine grained feature that delivers business value is can be used in
many business processes which is what use cases are oriented to&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
As a side note, if you have a project where you do have to write all the requirements
up-front (as if they won't change anyway...) then I find that use cases are way superior
than IEEE 830 style requirements ("The system shall...")&amp;nbsp; - but hey, that's another
story :)&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=9cd847cb-fa11-4240-bf63-b165863c8409" /&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,9cd847cb-fa11-4240-bf63-b165863c8409.aspx</comments>
      <category>Agile</category>
      <category>Everything</category>
      <category>Project Management</category>
      <category>Requirements </category>
    </item>
    <item>
      <trackback:ping>http://www.rgoarchitects.com/nblog/Trackback.aspx?guid=468fc490-ae60-4ba4-88c6-32e0c0488b5e</trackback:ping>
      <pingback:server>http://www.rgoarchitects.com/nblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.rgoarchitects.com/nblog/PermaLink,guid,468fc490-ae60-4ba4-88c6-32e0c0488b5e.aspx</pingback:target>
      <dc:creator>Arnon Rotem-Gal-Oz</dc:creator>
      <wfw:comment>http://www.rgoarchitects.com/nblog/CommentView,guid,468fc490-ae60-4ba4-88c6-32e0c0488b5e.aspx</wfw:comment>
      <wfw:commentRss>http://www.rgoarchitects.com/nblog/SyndicationService.asmx/GetEntryCommentsRss?guid=468fc490-ae60-4ba4-88c6-32e0c0488b5e</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">Jeremy Miller recently <a href="http://codebetter.com/blogs/jeremy.miller/archive/2007/08/31/trying-to-answer-hard-questions-about-agile-development.aspx">tried
to "answer hard questions about Agile development"</a>. One question he didn't really
answer was that of agile and fixed bids :<br /><blockquote>"I don't really think the Agile answer to a fixed bid is any different
from any other process.  I do think that Agile practices and project management
can give you far more control and feedback on the "Iron Triangle" of resources, time,
and features"<br /></blockquote><br />
Jeremy says that this would enable the team to fail "softly" (i.e with some functionality
etc.). 
<br />
I think (well, actually, I know since I did that) we can do better than just use Agile
and hope for the best. For instance, here are a few  strategies I successfully
used:<br /><br />
1. Pre-budget the whole project with rough milestones and estimates (works best if
you have prior experience in the domain)<br />
2. Coordinate expectations with the client and trade - the single project to many
smaller ones. What I did was to get a blanket purchase order for the estimated amount
and each smaller order/project  "ate" some of that budget until it was done.<br />
3. Since the project was for a CMMI level 3/ ISO 90003 we also added a few documents
to the backlog - and let the product owner prioritize them vs. deliverables. For instance
the "Architecture document" was delivered after 6 iterations when the architecture
stabilized 
<br />
4 <b>exchange</b> requests instead of <b>change</b> request - new functionality comes
instead of old promised one<br /><br />
Of course we also did the other SCRUM practices of releasing frequently, demonstrating
progress, retrospective etc.<br /><br />
I would love to take credit for the ideas above - however, Pascal Van Cauwenberghe
details most of them (and more) in two papers called <a href="http://www.nayima.be/download/fixedpriceprojects.pdf">"Agile
Fixed Price Projects part 1: The Price is Right"</a> and<a href="http://www.nayima.be/download/agilefixedprice.pdf"> "Agile
Fixed Price Projects part 2: Do you want agility with that"</a> (go read them..)<br /><br /><p></p><img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=468fc490-ae60-4ba4-88c6-32e0c0488b5e" /></body>
      <title>Fixed Bids and Agile Projects</title>
      <guid isPermaLink="false">http://www.rgoarchitects.com/nblog/PermaLink,guid,468fc490-ae60-4ba4-88c6-32e0c0488b5e.aspx</guid>
      <link>http://www.rgoarchitects.com/nblog/2007/09/02/FixedBidsAndAgileProjects.aspx</link>
      <pubDate>Sun, 02 Sep 2007 21:02:10 GMT</pubDate>
      <description>Jeremy Miller recently &lt;a href="http://codebetter.com/blogs/jeremy.miller/archive/2007/08/31/trying-to-answer-hard-questions-about-agile-development.aspx"&gt;tried
to "answer hard questions about Agile development"&lt;/a&gt;. One question he didn't really
answer was that of agile and fixed bids :&lt;br&gt;
&lt;blockquote&gt;"I don't really think the Agile answer to a fixed bid is any different
from any other process.&amp;nbsp; I do think that Agile practices and project management
can give you far more control and feedback on the "Iron Triangle" of resources, time,
and features"&lt;br&gt;
&lt;/blockquote&gt;
&lt;br&gt;
Jeremy says that this would enable the team to fail "softly" (i.e with some functionality
etc.). 
&lt;br&gt;
I think (well, actually, I know since I did that) we can do better than just use Agile
and hope for the best. For instance, here are a few&amp;nbsp; strategies I successfully
used:&lt;br&gt;
&lt;br&gt;
1. Pre-budget the whole project with rough milestones and estimates (works best if
you have prior experience in the domain)&lt;br&gt;
2. Coordinate expectations with the client and trade - the single project to many
smaller ones. What I did was to get a blanket purchase order for the estimated amount
and each smaller order/project&amp;nbsp; "ate" some of that budget until it was done.&lt;br&gt;
3. Since the project was for a CMMI level 3/ ISO 90003 we also added a few documents
to the backlog - and let the product owner prioritize them vs. deliverables. For instance
the "Architecture document" was delivered after 6 iterations when the architecture
stabilized 
&lt;br&gt;
4 &lt;b&gt;exchange&lt;/b&gt; requests instead of &lt;b&gt;change&lt;/b&gt; request - new functionality comes
instead of old promised one&lt;br&gt;
&lt;br&gt;
Of course we also did the other SCRUM practices of releasing frequently, demonstrating
progress, retrospective etc.&lt;br&gt;
&lt;br&gt;
I would love to take credit for the ideas above - however, Pascal Van Cauwenberghe
details most of them (and more) in two papers called &lt;a href="http://www.nayima.be/download/fixedpriceprojects.pdf"&gt;"Agile
Fixed Price Projects part 1: The Price is Right"&lt;/a&gt; and&lt;a href="http://www.nayima.be/download/agilefixedprice.pdf"&gt; "Agile
Fixed Price Projects part 2: Do you want agility with that"&lt;/a&gt; (go read them..)&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.rgoarchitects.com/nblog/aggbug.ashx?id=468fc490-ae60-4ba4-88c6-32e0c0488b5e" /&gt;</description>
      <comments>http://www.rgoarchitects.com/nblog/CommentView,guid,468fc490-ae60-4ba4-88c6-32e0c0488b5e.aspx</comments>
      <category>Agile</category>
      <category>Everything</category>
      <category>Project Management</category>
      <category>SCRUM</category>
    </item>
  </channel>
</rss>