<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Udi Dahan - The Software Simplist &#187; Management</title>
	<atom:link href="http://www.udidahan.com/category/management/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.udidahan.com</link>
	<description>Enterprise Development Expert &#38; SOA Specialist</description>
	<lastBuildDate>Sun, 08 Jan 2012 12:45:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Change is hard</title>
		<link>http://www.udidahan.com/2012/01/08/change-is-hard/</link>
		<comments>http://www.udidahan.com/2012/01/08/change-is-hard/#comments</comments>
		<pubDate>Sun, 08 Jan 2012 12:45:00 +0000</pubDate>
		<dc:creator>udidahan</dc:creator>
				<category><![CDATA[Coaching]]></category>
		<category><![CDATA[Consulting]]></category>
		<category><![CDATA[Life]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[The Team]]></category>

		<guid isPermaLink="false">http://www.udidahan.com/?p=1625</guid>
		<description><![CDATA[Organizational change is hard &#8211; like the way a diamond is hard.
So, don&#8217;t try to change the organization. It&#8217;s too big anyway.
Instead, focus on changing one person at a time &#8211; that&#8217;s hard enough.
Don&#8217;t necessarily take the &#8220;one person as a time&#8221; too literally, though.
You don&#8217;t need to completely and utterly have one person won [...]]]></description>
			<content:encoded><![CDATA[<p><img style="border-right: 0px; border-top: 0px; margin: 0px 0px 10px 10px; border-left: 0px; border-bottom: 0px" height="237" alt="diamond" src="http://www.udidahan.com/wp-content/uploads/diamond.jpg" width="214" align="right" border="0">Organizational change is hard &#8211; like the way a diamond is hard.</p>
<p>So, don&#8217;t try to change the organization. It&#8217;s too big anyway.<br />
Instead, focus on changing one person at a time &#8211; that&#8217;s hard enough.</p>
<p>Don&#8217;t necessarily take the &#8220;one person as a time&#8221; too literally, though.<br />
You don&#8217;t need to completely and utterly have one person won over before starting on the next.</p>
<p>Understand that for someone to change, that may require them admitting (either implicitly or explicitly) that the way they were doing things before was wrong. In some organizations, this can be suicide. Even if it isn&#8217;t, psychologically speaking, there are a huge number of barriers to overcome.</p>
<p>So, if at all possible, massage the situation in such a way that it&#8217;ll sound like they were right all along, and no-one really understood. It&#8217;s easy for someone to play along with the &#8220;misunderstood genius&#8221; story.</p>
<p>Next time &#8211; how to do just that.</p>
<p>Stay tuned.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2012/01/08/change-is-hard/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Enterprise, SaaS, and Platforms</title>
		<link>http://www.udidahan.com/2011/06/19/enterprise-saas-and-platforms/</link>
		<comments>http://www.udidahan.com/2011/06/19/enterprise-saas-and-platforms/#comments</comments>
		<pubDate>Sun, 19 Jun 2011 12:01:01 +0000</pubDate>
		<dc:creator>udidahan</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://www.udidahan.com/?p=1472</guid>
		<description><![CDATA[So it&#8217;s been about a year and a half since my promise to follow up on my Non-Functional Architectural Woes post. Just to give you a short summary, in that post I talked about the fact that many of today&#8217;s &#8220;best practices&#8221; for software design (like layering, ORMs, and web services) don&#8217;t actually provide the [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.udidahan.com/wp-content/uploads/mission_impossible.jpg" alt="mission_impossible" title="mission_impossible" width="250" height="189" style="float:right; margin-left:10px; margin-bottom:10px;" />So it&#8217;s been about a year and a half since my promise to follow up on my <a href="http://www.udidahan.com/2010/01/12/non-functional-architectural-woes/">Non-Functional Architectural Woes</a> post. Just to give you a short summary, in that post I talked about the fact that many of today&#8217;s &#8220;best practices&#8221; for software design (like layering, ORMs, and web services) don&#8217;t actually provide the promised flexibility when requirements end up changing.</p>
<p>Since that post I&#8217;ve blogged about many techniques and approaches to identify better boundaries (like with SOA and DDD) and I&#8217;m seeing more and more developers starting to apply them.</p>
<p>This post will be slightly different.</p>
<p>You see, occasionally we technical people will get requirements that can&#8217;t easily be broken down by functional boundaries. Sometimes the business calls this a &#8220;platform&#8221; &#8211; here&#8217;s an example:</p>
<p>&#8220;We want a flexible, customizable workflow-driven platform that allows end-users to add their own columns to any screen able to support massive datasets for large enterprise customers that will also be intuitive and easy to use for our SaaS push to small and medium-sized businesses (SMBs) &#8211; oh, and then it needs to be multi-tenant too. Did I mention that we promised this would be ready for our most important client by the end of the year?&#8221;</p>
<p>There is only one reasonable answer to the above:</p>
<p>&#8220;I know you want it but, I&#8217;m very sorry, you can&#8217;t have that. It isn&#8217;t possible to do that with one system.&#8221;</p>
<p>It&#8217;s really rare for a technical person to say something like that. The simple reason is that in software, we believe that almost everything is fundamentally possible &#8211; given enough time/money/resources. So, when someone in business comes to us with the requirements above, we say &#8220;It&#8217;s *possible*&#8221;, loosely translated to &#8220;We can&#8217;t prove that that&#8217;s impossible&#8221;.</p>
<p>There are many reasons why you can&#8217;t be SaaS and Enterprise at the same time &#8211; not all of them dealing with software. The marketing, sales, and support stories of each of those markets is VERY different. In the enterprise you&#8217;re usually working with professional services people that customize the generic product &#8211; which then becomes a backwards-compatibility requirement for new development. This will hinder the development team&#8217;s ability to roll out the new shiny features needed to remain competitive in the SaaS space.</p>
<p>In the cases where I&#8217;ve been brought in to help clients with these kinds of systems, I try to work my way up to the person in management who is in charge of the project/product &#8211; often the CEO. Then, in the nicest way possible, I explain that really the only way to have your cake and eat it too is to create 2 companies &#8211; each one focused on its own space &#8211; Saas and Enterprise; each one with its own development team, feature set, release schedule, etc.</p>
<p>There&#8217;s a reason that there&#8217;s an SAP *and* a Salesforce &#8211; it&#8217;s because no one can be all things to all people. It&#8217;s hard enough to become a market leader in just one space. Trying to do both is VERY expensive, and increases the chance of the project failing from the average 60-70% in the industry to probably about 99.9%.</p>
<p>Hope that will save you some grief.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2011/06/19/enterprise-saas-and-platforms/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Server Naming and Configuration Conflicts</title>
		<link>http://www.udidahan.com/2010/06/05/server-naming-and-configuration-conflicts/</link>
		<comments>http://www.udidahan.com/2010/06/05/server-naming-and-configuration-conflicts/#comments</comments>
		<pubDate>Sat, 05 Jun 2010 12:59:13 +0000</pubDate>
		<dc:creator>udidahan</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Simplicity]]></category>

		<guid isPermaLink="false">http://www.udidahan.com/?p=1289</guid>
		<description><![CDATA[In my work with clients the topic of how to handle the movement of software from one environment to another inevitably comes up. Sometimes this is in the context of NServiceBus but the problem is more generic. The faster that an organization is able to get software out the door, the more agile they can [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.udidahan.com/wp-content/uploads/Configuration_icon_by_obsilion.png" alt="Configuration" title="Configuration" width="225" height="221" style="float:right;" />In my work with clients the topic of how to handle the movement of software from one environment to another inevitably comes up. Sometimes this is in the context of NServiceBus but the problem is more generic. The faster that an organization is able to get software out the door, the more agile they can be. </p>
<p>Unfortunately, there is one tiny little mistake that I see almost everywhere that gets in the way, and that&#8217;s going to be the topic of this post.</p>
<h3>The Problem</h3>
<p>Let&#8217;s say you have a standard web app environment &#8211; some web servers, application servers, and a database server. Your web servers need to send messages to the application servers. So far, so good.</p>
<p>In your test environment, you have an application server called AS_01_Test, and your web servers are configured to send it messages. However, in your staging environment the application server fulfilling that same role is called AS_01_Stage. This creates a configuration problem &#8211; you need to change the config of your web servers as you move the web app from Test to Staging.</p>
<p>I&#8217;ve seen companies doing all sorts of creative things to get around this problem &#8211; some of them involve putting all configuration settings in a database so that they can be centrally managed and visualized. I&#8217;d like to suggest an alternative approach.</p>
<h3>What if&#8230;</h3>
<p>What if server names were the same across all environments?</p>
<p>Well, you wouldn&#8217;t need to change configuration as you moved the system between environments. That&#8217;s a good thing.</p>
<p>But how can that be? Wouldn&#8217;t there be a conflict if there were two machines with the same name?</p>
<p>The answer is that there wouldn&#8217;t be a conflict if the machines were on different networks. Not all machines have to be on the same network. We can set up as many networks / virtual networks as we like. And it is clear that we don&#8217;t need machines in one environment / network to talk to machines in another environment. I mean, under no circumstances would we want web servers in our test environment to talk to application servers in the production environment.</p>
<p>These separate networks provide much needed isolation, beyond solving the server naming problem.</p>
<h3>In closing</h3>
<p>It&#8217;s really a tiny thing when you think about &#8211; multiple networks. But that&#8217;s exactly why software developers overlook it so often &#8211; because it&#8217;s not a &#8220;software solution&#8221; to the configuration problem we perceive as a &#8220;software problem&#8221;.</p>
<p>I wrote about related multi-environment configuration issues in this earlier post: <a href="http://www.udidahan.com/2009/08/15/convention-over-configuration-the-next-generation/">Convention over Configuration &#8211; The Next Generation</a></p>
<p>I&#8217;m happy to say that this functionality is now in NServiceBus called &#8220;profiles&#8221; and you can read more about how they work <a href="http://www.nservicebus.com/Profiles.aspx">here</a>.</p>
<p>How are you handling the flow of moving software through to production? Leave your comments below.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2010/06/05/server-naming-and-configuration-conflicts/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>CQRS isn&#8217;t the answer &#8211; it&#8217;s just one of the questions</title>
		<link>http://www.udidahan.com/2010/05/07/cqrs-isnt-the-answer-its-just-one-of-the-questions/</link>
		<comments>http://www.udidahan.com/2010/05/07/cqrs-isnt-the-answer-its-just-one-of-the-questions/#comments</comments>
		<pubDate>Fri, 07 May 2010 09:25:12 +0000</pubDate>
		<dc:creator>udidahan</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[CQRS]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Simplicity]]></category>

		<guid isPermaLink="false">http://www.udidahan.com/?p=1278</guid>
		<description><![CDATA[With the growing interest in Command/Query Responsibility Segregation (CQRS), more people are starting to ask questions about how to apply it to their applications. CQRS is actually in danger of reaching &#8220;best practice&#8221; status at which point in time people will apply it indiscriminately with truly terrible results. 
One of the things that I&#8217;ve been [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.udidahan.com/wp-content/uploads/dont_pan.gif" alt="dont panic" title="dont panic" width="260" height="180" style="float:right;" />With the growing interest in Command/Query Responsibility Segregation (<a href="http://www.udidahan.com/2009/12/09/clarified-cqrs/">CQRS</a>), more people are starting to ask questions about how to apply it to their applications. CQRS is actually in danger of reaching &#8220;best practice&#8221; status at which point in time people will apply it indiscriminately with truly terrible results. </p>
<p>One of the things that I&#8217;ve been trying to do with my presentations around the world on CQRS was to explain the <b>why</b> behind it, just as much as the what. The problem with the format of these presentations is that they&#8217;re designed to communicate a fairly closed message: here&#8217;s the problem, here&#8217;s how that problem manifests itself, here&#8217;s a solution.</p>
<p>In this post, I&#8217;m going to try to go deeper.</p>
<h3>The hitchhiker&#8217;s guide to the galaxy</h3>
<p>In this most excellent book, one of the things that struck me was the theme that made it&#8217;s way through the whole book &#8211; starting with the answer to life, the universe, and everything: 42. By the time you get to the end of the book, you find out that the real <b>question</b> to life, the universe, and everything is &#8220;what do you get when you multiply 6 by 9&#8243;. And that&#8217;s how the book leaves it.</p>
<p>To us engineers, we can&#8217;t just accept the fact that the book would say that 6*9 = 42 when we know it&#8217;s 54. After bashing our heads on the rigid rules of math, we realize that not all math problems are necessarily in base 10, and that if we switch to base 13, the number 42 is 4*13 + 2 = 54. So, the book was right &#8211; but that&#8217;s not the point.</p>
<h3>What&#8217;s the point?</h3>
<p>The hitchhiker&#8217;s guide is an example of a teaching technique which presents an apparent paradox, leaving the student to dig up unspoken and unthought assumptions in order to resolve it. Key to this technique are rigid rules which do not allow any compromise or shortcuts on the student&#8217;s part. </p>
<p>The purpose of this technique is not for the student to learn the answer, but to gain deeper understanding, which in turn changes the way they go about thinking about problems in the future. </p>
<p>So, when given the problem 4*5, we do not just immediately answer 20, instead we clarify in which numeric base the question is being phrased, and only then go to solve the problem. In base 13, the answer would be 17. In hex, the answer would be 14.</p>
<p>The externally visible change is that we know which questions to ask in order to arrive at the right answer &#8211; not that we know the answer ahead of time.</p>
<h3>Making an &#8220;ass&#8221; out of &#8220;u&#8221; and &#8220;me&#8221;</h3>
<p>Let&#8217;s start at the end &#8211; one of the unspoken assumptions that has been causing problems:</p>
<blockquote><p>
All businesses can be treated the same from the perspective of software.
</p></blockquote>
<p>In our previous example, we assumed that all math problems use base 10. It turns out that different bases are useful for different domains (like base 2 for computers). We can say similar things about degrees and radians in geometry. The more we look at the real world, the more we see this repeating itself. There&#8217;s no reason that software should be any different.</p>
<p>Base 10 is not a ubiquitous best practice. We shouldn&#8217;t be surprised that there really aren&#8217;t best practices for software either.</p>
<p>Here&#8217;s another problematic assumption:</p>
<blockquote><p>
&#8220;The business&#8221; can (and do) tell us what they need in a way we can understand.
</p></blockquote>
<p>So many software fads have been built on the quicksand of this assumption. OOAD &#8211; on verbs and nouns. 4GL and other visual tools that &#8220;the business&#8221; will use directly. SOA &#8211; on IT business alignment. I expect we haven&#8217;t seen the end of this.</p>
<p>Some of you may be wondering why this is false, others are sagely nodding their heads in agreement.</p>
<h3>The myth of &#8220;the business&#8221;</h3>
<p>Unless you have a single user, who is also the CEO paying for the development, there is no &#8220;the&#8221;. It&#8217;s an amalgam of people with different backgrounds, skills, and goals &#8211; there is no homogeneity. Even if no software was involved, many business organizations are dysfunctional with conflicting goals, policies, and politics.</p>
<p>To some extent, we technical people have hidden ourselves away in IT to avoid the scary world of business whose rules we don&#8217;t understand. With the rise in importance of information to the world, we&#8217;ve been pulled back &#8211; being forced to talk to people, and not just computers. Luckily, we&#8217;ve been able to create a buffer to insulate ourselves &#8211; we&#8217;ve taken the less successful technical people from our heard and nominated them &#8220;business analysts&#8221;. No, not all companies do it this way, but we do need to take a minute to reflect on how information flows between the business Mars into and out of the IT Venus.</p>
<h3>On human communication</h3>
<p>Even if we made this insulation layer more permeable, allowing and encouraging more technical people and business people to cross its boundary, we still need to deal with the problem of two humans communicating with each other. There are enough books that have been written on this topic, so I won&#8217;t go into that beyond recommending (strongly) to technical people to read (some of) them.</p>
<p>Rather, I&#8217;d like to focus on the environment in which these discussions take place. IT has been around long enough, and users have used computers long enough, that a certain amount of tainting has taken place. If the world was a trial, the evidence would have been thrown out as untrustworthy.</p>
<p>When users tell you what they want, they&#8217;re usually framing that with respect to the current system that they&#8217;re using. &#8220;Like the old system &#8211; but faster, and with better search, and more information on that screen, and&#8230;&#8221; </p>
<p>At this point, business analysts write down and formalize these &#8220;requirements&#8221; into some IT-sanctioned structure (use cases, user stories, whatever), at which point developers are told to build it. Users only know what they <b>didn&#8217;t</b> want when developers deliver exactly what was asked.</p>
<p>How can that be?</p>
<h3>These are not the &#8220;requirements&#8221; you are looking for</h3>
<p>Users ultimately dictate <b>solutions</b> to us, as a delta from the previous set of solutions we&#8217;ve delivered them. That&#8217;s just human psychology &#8211; writer&#8217;s block when looking at a blank page, as compared to the ease with which we provide &#8220;constructive criticism&#8221; on somebody else&#8217;s work.</p>
<p>We need to get the real requirements. We need to probe beyond the veneer:</p>
<ul>
<li>Why do you need this additional screen? </li>
<li>What real-world trigger will cause you to open it? </li>
<li>Is there more than one trigger? </li>
<li>How are they different?</li>
<li>etc, etc, etc&#8230;</li>
</ul>
<p>This is <b>real</b> work &#8211; different work than programming. It requires different skills. And that&#8217;s not even getting into the political navigation between competing organizational forces.</p>
<p>But let&#8217;s say that you don&#8217;t have (enough) people with these skills in your organization. What then?</p>
<h3>Enter CQRS</h3>
<p>CQRS gives us a set of questions to ask, and some rigid rules that our answers must conform to. If our answers don&#8217;t fit, we need to go back to the drawing board and move things around and/or go back to &#8220;the business&#8221; and seek deeper understanding there.</p>
<p>For each screen/task/piece of data:</p>
<blockquote><p>
Will multiple users be collaborating on data related to this task?<br />
Look at every shred of raw data, not just at the entity level.<br />
Are there business consistency requirements around groups of raw data?
</p></blockquote>
<p>If &#8220;the business&#8221; answers no &#8211; ask them if they see that answer changing, and if so, in what time frame, and why. What changing conditions in the business environment would cause that to change &#8211; what other parts of the system would need to be re-examined under those conditions.</p>
<p>After understanding all that and you find a true single-user-only-thing, then you can use standard &#8220;CRUD&#8221; techniques and technologies. There are no inherent time-propagation problems in a single-user environment &#8211; so eventual consistency is beyond pointless, it actually makes matters worse.</p>
<p>On the other hand, if the business-data-space is collaborative, the inherent time-propagation of information between actors means they will be making decisions on data that isn&#8217;t up-to-the-millisecond-accurate anyway. This is physics, gravity &#8211; you can&#8217;t fight it (and win).</p>
<h3>The rule for collaboration</h3>
<blockquote><p>
Actors must be able submit one-way commands that will fail only under exceptional <b>business</b> circumstances.
</p></blockquote>
<p>The challenge we have is how to achieve the real business objectives uncovered in our previous &#8220;requirements excavation&#8221; activities and follow this rule at the same time. This will likely involve a different user-system interaction than those implemented in the past. UI design is part of the solution domain &#8211; it shouldn&#8217;t be dictated by the business (otherwise it&#8217;s like someone asking you to run a marathon, but also dictating how you do so, like by tying your shoelaces together).</p>
<p>Many of the technical patterns I described in my <a href="http://www.udidahan.com/2009/12/09/clarified-cqrs/">previous blog post</a> describe the tools involved. BTW, hackers can be considered &#8220;exceptional actors&#8221; &#8211; the business actually wants their commands to fail.</p>
<h3>In Summary</h3>
<p>The hard and fast rule of CQRS about one-way commands is relevant for collaborative domains only. This domain has inherent eventual consistency &#8211; in the real world. Taking that and baking it into our solution domain is how we align with the business.</p>
<p>The process we go through, until ultimately arriving at one-way-almost-always-successful-commands <b>is business analysis</b>. Rejecting pre-formulated solutions, truly understanding the business drivers, and then representing those as directly as possible in our solution domain &#8211; that&#8217;s our job.</p>
<p>After doing this enough times and/or in more than one business domain, we may gain the insight that there is no cookie-cutter, one-size-fits-all, best-practice solution architecture for everything. Each problem domain is distinct and different &#8211; and we need to understand the details, because they <b>should</b> shape the resulting software structure.</p>
<p>The next time the business tell us to implement 42, we&#8217;ll use CQRS along with other questioning techniques until we can get &#8220;6 x 9&#8243; out of them, learning from the exercise what are the significant and stable parts of the business &#8211; ultimately helping us to &#8220;build the right system, and to build the system right&#8221;.</p>
<p>Don&#8217;t Panic <img src='http://www.udidahan.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2010/05/07/cqrs-isnt-the-answer-its-just-one-of-the-questions/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>On MS, OSS, and Java</title>
		<link>http://www.udidahan.com/2010/05/01/on-ms-oss-and-java/</link>
		<comments>http://www.udidahan.com/2010/05/01/on-ms-oss-and-java/#comments</comments>
		<pubDate>Sat, 01 May 2010 11:14:10 +0000</pubDate>
		<dc:creator>udidahan</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://www.udidahan.com/?p=1272</guid>
		<description><![CDATA[It appears that my last post caught a lot of people&#8217;s attention, with responses online and offline from people in the community as well as inside Microsoft. Some read it as a criticism of Microsoft. Others found it rang true with their experiences, particularly in their interactions with technological decision makers. One thing I&#8217;d like [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.udidahan.com/wp-content/uploads/java-logo-thumb.png" alt="Java" title="Java" width="150" height="150" style="float:right;" />It appears that my last post caught a lot of people&#8217;s attention, with responses online and offline from people in the community as well as inside Microsoft. Some read it as a criticism of Microsoft. Others found it rang true with their experiences, particularly in their interactions with technological decision makers. One thing I&#8217;d like to do in this post is to broaden the scope of the discussion to include the Java side as well, as many in the enterprise space are working in a multi-platform/multi-vendor environment. Let&#8217;s start with some history.</p>
<h3>Java takes the enterprise</h3>
<p>When Java originally came out, it was an interesting language that you could use to write applets &#8211; code that would run the same everywhere, in the browser, on the desktop, etc. SUN was the keeper of Java. And then came this concept of a container &#8211; the thing that would run your Java code, which then grew to handle things like transactions, and became the Enterprise Java Bean &#8211; EJB, and that came out of IBM, with SUN adopting it later.</p>
<p>The adoption of Java at that point was important enough that the specs were opened up, and many EJB technologies blossomed. With backing from big companies already inside the enterprise, the only possible fight came from COBOL around Y2K, but that was a dying gasp. Microsoft wasn&#8217;t in the game as Windows NT wasn&#8217;t competition for UNIX or mainframes.</p>
<h3>Multi-vendor as a way of life</h3>
<p>With multiple big and medium-sized vendors offering similar, competing, and complementary technologies, all tied together by the promise of backwards compatibility in Java and the specs demanding interoperability, customers could safely go for best-of-breed solutions. This forced technological decision makers to truly evaluate the offerings on merits, not just lineage.</p>
<p>Many attribute the rise of OSS in Java to the fact that the existing containers were so heavyweight. I believe that was a secondary effect. As a result of the fact that the industry had embraced and internalized the values of thinking and choosing for itself, it was willing to look at alternatives with much humbler lineage, ultimately using them on their merits. It was the culture.</p>
<h3>The Microsoft ecosystem</h3>
<p>This culture was practically nonexistent on the Microsoft side of the border. As the only vendor, Microsoft was put on a pedestal &#8211; it was the best, period. The industry hungrily looked to Seattle not only for technology, but also for guidance and leadership. If a developer could get a job at Microsoft, they were &#8220;hot stuff&#8221;, the best of the best. This isn&#8217;t a bad thing &#8211; it was just a thing.</p>
<p>This enabled technological decision makers on the Microsoft side to have much shorter thought and decision processes than their counterparts on the Java side.</p>
<p>All of these things got baked into the culture.</p>
<h3>About Microsoft</h3>
<p>Like all that were ever on a pedestal, the fall was a matter of time. Expectations being that high, it was inevitable. You can&#8217;t make all people happy all the time, and the conditions in the industry were changing, and the company had to change to remain competitive.</p>
<p>Let me say this clearly: Microsoft was not at fault.</p>
<p>Sure, it&#8217;s easy to say in retrospect they should have communicated more clearly about this, or built that technology differently. If you haven&#8217;t yet worked in a big company, you may not know this, but big companies aren&#8217;t just bigger small companies. It&#8217;s a hodge-podge of competing agenda, initiatives, politics, people, and power. There&#8217;s a saying that things only get done <b>despite</b> the organization&#8217;s best efforts.</p>
<p>For a company Microsoft&#8217;s size, what they manage to get done is incredible.</p>
<h3>On acquisitions and OSS</h3>
<p>Microsoft has come under fire over the years for offering their own implementations of open source technologies- as if the vendors on the Java side didn&#8217;t do this. The Java world was ultra competitive, the big vendors would eat promising upstarts in order to win back lost contracts to key customers. This made the technological decision makers broaden their thought processes to include risk management as a part of managing their technological portfolio. To a large extent, this actually justifies the existence of a C-level role related to technology &#8211; the CIO.</p>
<h3>Chief Officers of Information and Technology</h3>
<p>I found it interesting to see the difference in age, experience, background, and thought processes between people holding the CIO title at organizations that were Microsoft-centric and those with a more heterogeneous technology investment. This was likely influenced to a large extent by the history of technological evolution, age and size of organizations with the resulting culture and hiring practices, among other things. This pattern continued with the CTO as well.</p>
<p>Obviously one wouldn&#8217;t expect the same thought processes in the CTO of a 20 person IT shop and the CTO of Ford Motor Company (for example). They shouldn&#8217;t be the same.</p>
<p>It appeared that as Microsoft became more focused on innovation they started listening more to the technology leaders of smaller companies, not a bad thing by itself. Choosing A means not choosing B, and in order to stay competitive, a choice must be made.</p>
<h3>Fast forward</h3>
<p>I think that what happened was necessary, and will be good for the industry and Microsoft. Technological decision making in companies that were traditionally Microsoft-centric has evolved. This has clarified Microsoft&#8217;s role as a platform vendor who can be trusted, and whose tools can be used or not used as the situation dictates, with comparable commercial and OSS tooling evaluated on the same criteria.</p>
<p>Just as IBM reinvented itself and now occupies a sustainable role in a combined commercial and OSS ecosystem of platforms, tools, and services, Microsoft appears to have made several big strides partnering with the community in much more productive ways, yet with more strides to be made as well.</p>
<h3>A challenge to OSS on the Microsoft platform</h3>
<p>In this new and more mature environment, OSS can&#8217;t remain the same either. Some code a developer whipped up in their free time and put in an online accessible repository with a decent license just won&#8217;t cut it any more.</p>
<p>In my previous post I called out the Linq2Sql support story &#8211; the same goes for OSS. Active development is required, and so is support, and so is documentation. The commitment needs to be much more serious. </p>
<p>Also, until usage reaches some critical mass, it is unlikely that a single developer or even a small group of committers will be able to do it without the help of the community. Really the only alternative is for there to be some commercial story that can fund it &#8211; support, consulting, training, commercial add-ons, etc. A combination of community (both dev and use) and commercial cash-flow is probably most sustainable.</p>
<p>If you are running an OSS project, understand that these criteria will be used to evaluate it.</p>
<h3>In closing</h3>
<p>I think I&#8217;ve managed to alienate previous supporters from all sides.</p>
<p>I believe we are entering some interesting times, where not only are vendors and OSS projects being evaluated differently than in the past, but that traditional architectural paradigms are changing as well. </p>
<p>Regardless of what the answers are, I&#8217;m happy that more of us are asking more questions. Some questions are the right questions, some are the wrong ones, and sometimes we just ask at the wrong time, but as an industry I think that we&#8217;re getting better.</p>
<p>Thanks for reading.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2010/05/01/on-ms-oss-and-java/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Thoughts on Microsoft History and OSS</title>
		<link>http://www.udidahan.com/2010/04/23/thoughts-on-microsoft-history-and-oss/</link>
		<comments>http://www.udidahan.com/2010/04/23/thoughts-on-microsoft-history-and-oss/#comments</comments>
		<pubDate>Fri, 23 Apr 2010 21:47:22 +0000</pubDate>
		<dc:creator>udidahan</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Integrated Simplicity]]></category>
		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://www.udidahan.com/?p=1253</guid>
		<description><![CDATA[It&#8217;s coming on 4 years now that I&#8217;ve been running NServiceBus. How the time flies. As it has worked its way into the critical infrastructure of many organizations, more and more managers have been asking me questions about how this .NET OSS thing works. In this post, I&#8217;ll try to answer that question based on [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.udidahan.com/wp-content/uploads/open_source_microsoft.png" alt="open source" title="open source" width="250" height="216" style="float:right;" />It&#8217;s coming on 4 years now that I&#8217;ve been running NServiceBus. How the time flies. As it has worked its way into the critical infrastructure of many organizations, more and more managers have been asking me questions about how this .NET OSS thing works. In this post, I&#8217;ll try to answer that question based on the history of .NET.</p>
<p>Although I have been privy over the years to see behind the veil at Redmond, I will be focusing primarily on the externally visible actions of Microsoft and how the industry has reacted on average &#8211; specifically in the enterprise space, where I spend most of my time. </p>
<h3>What managers are concerned about</h3>
<p>When there will be problem with this technology, who will support us?<br />
How will that change when the author of the technology moves on or loses interest?<br />
How long can we expect to be using this technology?<br />
How long will it take to learn it? When will we recoup our investment?</p>
<p>Traditionally, for companies on the Microsoft platform, choosing Microsoft as their primary technology vendor has been the safe bet. As a large company, Microsoft can afford to employ support engineers. These engineers are different from the ones who wrote the technology to begin with. Also, Microsoft has 10 year support guarantees. As a result, companies expected to use the technology for at least that long. With their size, Microsoft also had the ability to create copious amounts of documentation easing learning.</p>
<p>To turn the common phrase, nobody got fired for choosing Microsoft.</p>
<p>Open source seemed like risky business, at the time.</p>
<h3>What changed?</h3>
<p>It started with the Composite Application Block &#8211; CAB.</p>
<p>This technology was put out by the Patterns and Practices (P&#038;P) group at Microsoft. After it came out, the gears of big marketing machines at Microsoft got to work, telling the industry about this great new thing at conferences, and the Microsoft Consulting Services (MCS) folks started using it with clients. CIOs at large companies sent developers to training on CAB by the dozen.</p>
<p>And then CAB was dead. Sorry. Microsoft prefers the word &#8220;done&#8221; to dead.<br />
Just like Don Box said that COM wasn&#8217;t dead, it was done. </p>
<p>&#8220;What about that 10 year support thing?&#8221;, asked the CIOs (among many others).</p>
<p>You don&#8217;t understand, said Microsoft. You see, P&#038;P are not a product group in Microsoft. They don&#8217;t have the resources to provide that kind of support. And the rest of the company isn&#8217;t obliged to support what they put out &#8211; since they&#8217;re not a product group.</p>
<p>You could literally hear the collective jaw of the Microsoft part of the industry drop.</p>
<p>This wasn&#8217;t supposed to happen (like housing prices in the US).</p>
<p>And then came .NET 3.0, and things seemed to go back to normal.</p>
<p>There were lots of wonderful things that came with it &#8211; like LINQ, and&#8230;</p>
<h3>Linq to Sql</h3>
<p>This was BIG.<br />
Finally &#8211; after ObjectSpaces was promised at PDC &#8216;03 and later shelved, then WinFS (same story), it had arrived.<br />
The object-relational mapper (ORM) from Microsoft.</p>
<p>The marketing machine went into high gear &#8211; it was the v3 promise. Linq2Sql (L2S) came from a product group. This was serious. It was shown at conferences and user groups all over the world. Developers were sent to be trained on it.</p>
<p>And then Entity Framework (EF) was announced &#8211; and L2S was done.</p>
<p>CIOs were rubbing their eyes in disbelief. &#8220;But this is from a product group &#8211; you have to support it, right?&#8221;</p>
<p>Well, said Microsoft, yes. We will support it with our support org. It&#8217;s just that we won&#8217;t continue to develop new features for it in the product org. We actually have a different sub-org that will be working on EF and they&#8217;re under a different division (SQL Server) than the sub-org that made L2S.</p>
<p>Jaws were hitting the pavement. All that investment erased. Just like that. It turns out that support without active development doesn&#8217;t mean very much, no matter how many support engineers are involved.</p>
<p>But the industry picked itself back up, and got back to work on the new foundational pieces that came with .NET 3.0. If Microsoft is calling it &#8220;Foundation&#8221;, that must mean they&#8217;re committed to it.</p>
<h3>And then came Workflow Foundation</h3>
<p>Workflow Foundation (WF) was a dream-come-true. At last, Model-Driven Development (MDD) had come to the Microsoft platform. Drag-and-drop on a whole new level. Imagine the reuse. Imagine the maintainability. Programming at higher levels of abstraction. A marketers dream. This was the culmination of previous efforts of Whitehorse in VS2005 and the Software Factories Initiative &#8211; or so we were told.</p>
<p>And then came .NET 3.5 &#8211; and the new WF wasn&#8217;t backwards compatible with the old one.<br />
And then it happened again with .NET 3.5 SP1, and again with 4.0 (no more state machine &#8211; no wait, it&#8217;s back again, but not in the box).</p>
<p>All those companies that had long-running workflows in production needed to manually migrate them each time.</p>
<p>But this had become old news to the folks using Microsoft in the enterprise.<br />
With Microsoft &#8211; you really can&#8217;t be sure any more.</p>
<h3>What about open source?</h3>
<p>Well, it was beginning to look more and more stable in comparison.<br />
Especially the larger, more established projects. Those with active development.<br />
Log4Net. NHibernate. Castle. etc.</p>
<p>There was also the fact that most enterprises were heterogeneous anyway &#8211; doing both Java and .NET development. Open source tools and frameworks were common in the Java space, politically greasing the wheels for .NET OSS in those organization.</p>
<p>Boasting features and capabilities several years ahead of what was coming out of Microsoft, more companies gave them a chance, and were pleasantly surprised. And the virtuous cycle of OSS gained speed. With more use, they become even more stable and got even more features, driving yet more use. Blog posts about them bloomed all over the web. User group presentations were given. At a presentation I gave at TechEd Europe 2006, I used NHibernate in my demo.</p>
<p>OSS had crossed the chasm. No, not everybody used it, or knew of it, but a critical mass of the industry had grown to depend on it.</p>
<p>Microsoft&#8217;s actions over the years had done more for OSS adoption than I think many would have imagined.</p>
<h3>On Pub/Sub, Messaging, and SOA</h3>
<p>Interestingly enough, when the first version of WCF was still in the oven (then called Indigo) there were discussions on whether it would support publish/subscribe messaging. Here we are, 3 versions later, and still no pub/sub, but the discussions continue <img src='http://www.udidahan.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Message brokers were always important for enterprises in the Java space &#8211; IBM MQ; Tibco RV; Sonic; companies were paying millions for this stuff. Microsoft had MSMQ &#8211; finally at v3 with XP and Server 2003, but still with insignificant penetration to the market. BizTalk did have a good run, though, but not so much as a message broker, more as an integration and orchestration engine, unfortunately coming late to the Enterprise Application Integration (EAI) party.</p>
<p>Later, the SQL Server guys came with Service Broker &#8211; messaging in the database. But you could see that their heart wasn&#8217;t in it. The API was clunky. It still didn&#8217;t have pub/sub. There was no binding available for WCF. </p>
<p>After some time making noise in the SOA space with Oslo, that changed as well. Oslo is now Sql Server Modeling.</p>
<p>I imagine that some of the adoption pick-up with NServiceBus can be attributed to the vacuum Microsoft left behind when exiting the messaging/pub-sub/soa space. The way NServiceBus aligns with the principles found in the corresponding Java technologies makes it very palatable to enterprises working with both platforms.</p>
<p>The fact that there&#8217;s active development, a vibrant and growing community, and even <a href="http://www.udidahan.com/training">training</a> available definitely contribute as well.</p>
<h3>In closing</h3>
<p>I don&#8217;t fault Microsoft for any of this. There are a million things that they could have done. Choosing to do one thing means choosing not to do many others. The decisions they made were done with the best intentions. Hindsight is 20/20 of-course.</p>
<p>And that&#8217;s just it &#8211; we do need to take a look back.</p>
<p>If you&#8217;re a manager making a technology related decision, or are working with managers in those positions, knowing the history of today&#8217;s technology can give you a more accurate representation of the risk involved in each choice. Also, understanding the vector that Microsoft has decided to take in various areas is critical, especially if you find out that your architectural choices aren&#8217;t quite aligned with some of those vectors.</p>
<p>In this post, I&#8217;ve tried not to take a stance on whether a certain approach (ORM, Pub/Sub, etc) is good or bad, or even getting into which cases it&#8217;s appropriate or not &#8211; just to describe Microsoft&#8217;s externally visible behavior in that space.</p>
<p>I hope that this short history lesson can help your organization make the right technology decisions in the future for its specific context. Your comments and thoughts are most welcome, as always.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2010/04/23/thoughts-on-microsoft-history-and-oss/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>On Design for Testability</title>
		<link>http://www.udidahan.com/2010/04/18/on-design-for-testability/</link>
		<comments>http://www.udidahan.com/2010/04/18/on-design-for-testability/#comments</comments>
		<pubDate>Sun, 18 Apr 2010 15:43:57 +0000</pubDate>
		<dc:creator>udidahan</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[The Team]]></category>

		<guid isPermaLink="false">http://www.udidahan.com/?p=1221</guid>
		<description><![CDATA[Almost at every conference, event, training, or consulting engagement someone asks for my opinion on the whole design for testability thing. I&#8217;m not quite sure why I haven&#8217;t blogged on this topic, especially at the time that a lot of the other bloggers were weighing in, but better late than never.
Before getting into that, I [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.udidahan.com/wp-content/uploads/elephant_balance.png" style="float:right; margin-left:10px; margin-bottom:10px; " alt="keeping balance" title="keeping balance" width="204" height="203" />Almost at every conference, event, training, or consulting engagement someone asks for my opinion on the whole design for testability thing. I&#8217;m not quite sure why I haven&#8217;t blogged on this topic, especially at the time that a lot of the other bloggers were weighing in, but better late than never.</p>
<p>Before getting into that, I want to start with a slightly broader scope of discussion.</p>
<p>You see, I get asked about &#8220;best practices&#8221; on all sorts of things. And I try not to be the kind of consultant that responds with &#8220;it depends&#8221;, but the context of the question often makes the answer irrelevant. And the unspoken context of a best-practice question is:</p>
<h2>Given infinite time and budget</h2>
<p>The biggest problem that I see with well-intentioned, best-practices-following developers and architects is that they <b>don&#8217;t</b> ask the question &#8220;is this the right thing for us to be focusing on right now?&#8221; Understandably, that is a difficult question to answer &#8211; but it needs to be asked, since you don&#8217;t have infinite time or budget to do everything according to best practices (assuming those even exist).</p>
<h2>About testing</h2>
<p>The biggest issue I have with the &#8220;design for testability&#8221; topic is the extremely narrow view it takes of the word &#8220;testability&#8221;, usually in the form of more code written by a developer which invokes the production code of the system, also known as &#8220;unit tests&#8221;.</p>
<p>There are many different kinds of testing &#8211; unit, integration, functional, load, performance, exploratory, etc&#8230; where some may be automated and others not. Should we not discuss what &#8220;design for testability&#8221; means for not-just-unit-testing?</p>
<h2>And what&#8217;s the point of testing anyway?</h2>
<p>It&#8217;s not to find bugs.</p>
<p>Research has shown that testing (of all kinds) is not the most effective way of finding bugs. I don&#8217;t have the reference handy but I&#8217;m pretty sure that it&#8217;s from <a href="http://alistair.cockburn.us/">Alistair Cockburn&#8217;s work</a>. Code reviews are (on average) about 60% more effective.</p>
<p>Don&#8217;t get me wrong &#8211; testing can provide indications that the software <b>has</b> bugs in it, but not necessarily where in the code those bugs are.</p>
<p>The purpose of testing is to provide quantitative and qualitative information about the system that can help various stakeholders in their decision-making processes. The relevance of that information indicates the quality of the testing. Here are some examples:</p>
<ul>
<li>The system supports 100 concurrent users, with the expected user-type distribution (X% role A, Y% role B, etc), performing expected use-case distributions, and collaboration scenarios.</li>
<li>Time to proficiency for new users in role A is expected to be 3 days</li>
<li>Alternate #2 of use case #12 fails on step #3</li>
</ul>
<p>As you can see, the relevance of the above information is dependent on what decisions the various stakeholders need to make. The bullet on load can help us decide if more machines are needed or if developers need to tune the performance of the systems. The bullet on time to proficiency can help us decide if larger investment in usability is required. Information like the last bullet can be used in conjunction with the first two to decide on the timing and type of a release.</p>
<p>The timeliness of this relevant information is critical to the success of a project.</p>
<p>Choosing which and how much of the various testing activities to perform when is something that needs to be revisited several times throughout the lifetime of a project, taking into account the current risks (threats and probabilities) and time and resource investment to mitigate them.</p>
<p>Let me reiterate &#8211; we&#8217;re not going to have enough time to do everything.</p>
<h2>On iterations</h2>
<p>If the only part of your organization that is doing iterations are your developers, you&#8217;re not agile.</p>
<p>In order to capitalize on the information that testers are providing, you need them in your iterations.</p>
<p>The same goes for the other roles involved in the project &#8211; business analysts, DBAs, sysadmins, etc.</p>
<p>I know that 99% of organizations aren&#8217;t structured in a way to do this.</p>
<p>I never said doing this would be easy.</p>
<h2>On design</h2>
<p>Figuring out what kind of design and how much to do when is just as important, and just as hard. Design for testability is one part of that, but not the only one, or necessarily the most important one at any point of time.</p>
<p>Within that design for testability topic is the &#8220;design for unit-testing&#8221; sub-topic which seems to be the popular one. Before getting into the design aspects of it, let&#8217;s take a closer look at the unit-testing side of things.</p>
<h2>On unit-testing</h2>
<p>The assumption is that having more unit tests will lead to a code-base with less bugs, thus requiring shorter time to get the system into production, which will pay back the time it took to write those unit tests to begin with.</p>
<p>In practice, what tends to happen is that as development progresses, testing code breaks as the structure of the production code changes. Now one of two things happens &#8211; either the testing code is removed or rewritten. In either case, we didn&#8217;t get the return on investment we expected on the first bit of testing code. Unfortunately, rare is the case where the relevant people in the organization understand <b>why</b>, resulting in the same situation repeating itself over and over again.</p>
<p>Those projects would have been better off without unit testing, though the organization as a whole might have used those experiences to learn and improve. It&#8217;s been my experience that if the organization wasn&#8217;t conscious enough in the context of the project to notice the situation, it is unlikely to do so at higher levels.</p>
<h2>On fragile unit tests</h2>
<p>The reason that a unit test ends up being rewritten (or removed) is that its code was coupled to the production code in such a way that it broke when the production code changed. This tendency to break (fragility) is a critical property of a unit test. A fragile unit test will slow down a developer doing work on some existing code &#8211; it actually makes the system less maintainable.</p>
<p>For a unit test code to be stable (not fragile) it needs to be coupled to stable properties of the production code. The question of whether the production code is designed in such a way that it has stable properties &#8211; is a design question. Is it a <b>unit</b>? If not, you will <b>not</b> be able to write a unit-test against it.</p>
<p>And anyway, who said that every class is a unit, or should be a unit? Domain models (when done right) are good examples of a unit, yet the classes that make them up may not be units. Unit-testing should only be attempted with things which are units. </p>
<p>I think too much weight is put on whether a dependency of a class is a concrete or interface type, and not nearly enough on the nature of the dependency. I wouldn&#8217;t blame the hammer for pounding my thumb, and by the same token I think that blame should not be directed towards tools like those from TypeMock.</p>
<h2>On tools</h2>
<p>There is so much more depth to both design and testability that needs to be more broadly understood. No tool has yet been created to handle either design or testing in such a way that humans can give up responsibility for the outcome. </p>
<p>Over the years I&#8217;ve noticed that tools are most significant when used by skilled practitioners, which makes sense in retrospect. Giving a novice carpenter a laser-guided saw probably won&#8217;t significantly change the outcome of their work. Ultimately, the skilled practitioners are the ones that create tools &#8211; not the novices. And no tool, no matter how advanced, will make a novice perform at levels like the skilled practitioner.</p>
<p>In the case of a project too big for a single skilled practitioner to complete in the time required (or at all), the balance of importance shifts away from tools to the project management topics described above.</p>
<h2>In summary</h2>
<p>I hope that this post has shed some light on the context in which decisions with respect to testing need to be made. Design is one activity that can support certain kinds of testing, but not the only one, or even the most important one for the given type of testing necessary at that time in the project.</p>
<p>Design is hard. Project management is hard. Testing is hard.</p>
<p>Getting the right mix of people that together have enough experience and skills in these activities isn&#8217;t easy.</p>
<p>Don&#8217;t expect that sprinkling some interfaces in your code base will be enough.<br />
That doesn&#8217;t count much in the way of design, just as writing code in a testing namespace doesn&#8217;t count much in the way of testability.</p>
<p>Looking forward to hearing your comments.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2010/04/18/on-design-for-testability/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>On Small Applications</title>
		<link>http://www.udidahan.com/2010/03/07/on-small-applications/</link>
		<comments>http://www.udidahan.com/2010/03/07/on-small-applications/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 11:32:34 +0000</pubDate>
		<dc:creator>udidahan</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[The Team]]></category>

		<guid isPermaLink="false">http://www.udidahan.com/?p=1199</guid>
		<description><![CDATA[I hear this too often: &#8220;X sounds like a great pattern, but it&#8217;s overkill for small applications&#8221;. Many patterns have been subjected to this including (but not limited to): SOA, DDD, CQRS, ORM, etc. Often the statement is made by a person without experience in the given pattern (though possibly experienced in other patterns). Let&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.udidahan.com/wp-content/uploads/small_baby.png" style="float:right; margin-left:10px; margin-bottom:10px;" alt="small" title="small" />I hear this too often: &#8220;X sounds like a great pattern, but it&#8217;s overkill for small applications&#8221;. Many patterns have been subjected to this including (but not limited to): SOA, DDD, CQRS, ORM, etc. Often the statement is made by a person without experience in the given pattern (though possibly experienced in other patterns). Let&#8217;s take a look at the second part &#8211; the &#8220;small application&#8221;, and ask:</p>
<h3>What makes an app small?</h3>
<p>Or inversely, what makes an app warrant the &#8220;enterprise&#8221; moniker?</p>
<p>If there&#8217;s one thing that the history of our industry has shown repeatedly, it&#8217;s that developers aren&#8217;t particularly accurate with their estimates. Like, orders-of-magnitude inaccurate. Knowing this, it&#8217;s surprising that the &#8220;small app&#8221; argument seems to win so many arguments. The same goes for justifications in the form of &#8220;we&#8217;ve got to have an X, this is a BIG project&#8221;.</p>
<p>So, what makes an app small? </p>
<p>Is it a small number of lines of code? Well, what if those lines of code are keeping planes in the air?</p>
<p>Is it a small number of developers? Same as above. Actually, history has shown that some of the most valuable bits of code written were done by small numbers of developers. </p>
<p>Is it that it will only be installed on a single machine? </p>
<p>Is it&#8230;</p>
<p>What could it be?</p>
<h3>The real issue</h3>
<p>The small app argument is a diversionary tactic. </p>
<p>Loosely translated, it means &#8220;I&#8217;m comfortable where I am and I don&#8217;t want to change&#8221;.</p>
<p>Moving on&#8230;</p>
<h3>The real story of size</h3>
<p>Once we actually look at the specific context of an app, we tend to see that someone cares a great deal about it, enough to finance its custom development &#8211; rather than buying an off-the-shelf alternative. The expected lifetime of business use is easily 3-5 years, if not 7-10, during which many enhancements will likely be requested. Thus, some non-functional properties of the code matter &#8211; at the very least maintainability.</p>
<p>In which case, if the given pattern or approach does significantly improve the desired non-functional properties of the app, it only makes sense to use it.</p>
<p>There is one class of software that might possibly be treated as &#8220;small&#8221; &#8211; the one-off script that&#8217;s written to automate some IT task. And even then, so many of these scripts end up living longer than the apps themselves that they should be engineered at the same level of quality.</p>
<h3>In closing</h3>
<p>Don&#8217;t counter a &#8220;small app&#8221; argument with psychology.<br />
It will only make matters worse.</p>
<p>Instead, rephrase the issue around the lifetime of business use. </p>
<p>I&#8217;ve found that there are precious few cases where the harsh light of reality doesn&#8217;t help the appropriate decisions be made. If indeed this is a small-lifetime-app, just drag-and-drop until you&#8217;re done. Otherwise, the time it takes to understand and evaluate the applicability of the given patterns will definitely pay itself back many times over the life of the app.</p>
<p>And managers, keep your ears open for it. The technical risks behind that statement are icebergs waiting to sink your project.</p>
<p>* with thanks to <a href="http://devlicious.com/blogs/mike_nichols/archive/2010/03/06/the-biggest-driver-for-domain-modeling-decisions.aspx">Mike Nichols</a> for pushing my buttons.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2010/03/07/on-small-applications/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Unit Testing for Developers and Managers</title>
		<link>http://www.udidahan.com/2008/09/30/unit-testing-for-developers-and-managers/</link>
		<comments>http://www.udidahan.com/2008/09/30/unit-testing-for-developers-and-managers/#comments</comments>
		<pubDate>Tue, 30 Sep 2008 21:03:10 +0000</pubDate>
		<dc:creator>udidahan</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[The Team]]></category>

		<guid isPermaLink="false">http://www.udidahan.com/2008/09/30/unit-testing-for-developers-and-managers/</guid>
		<description><![CDATA[ &#8220;We need to rewrite the system.&#8221;
Thus begins the story of yet another developer trying to convince their manager to adopt test-driven development (or any other methodology or technology). There&#8217;s a good chance this developer&#8217;s been reading all sorts of stuff on blogs (like those linked here) that have convinced him that salvation lies that [...]]]></description>
			<content:encoded><![CDATA[<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 0px 10px 10px; border-right-width: 0px" height="240" alt="image" src="http://www.udidahan.com/wp-content/uploads/image44.png" width="178" align="right" border="0"> &#8220;We need to rewrite the system.&#8221;</p>
<p>Thus begins the story of yet another developer trying to convince their manager to adopt test-driven development (or any other methodology or technology). There&#8217;s a good chance this developer&#8217;s been reading all sorts of stuff on blogs (like those linked <a href="http://weblogs.asp.net/rosherove/archive/2008/09/26/unit-testing-decoupled-from-design-adoption.aspx">here</a>) that have convinced him that salvation lies that way.</p>
<p>Don&#8217;t get me wrong. </p>
<p>There&#8217;s a good chance the developer&#8217;s right. </p>
<p>It&#8217;s just that that&#8217;s besides the point.</p>
<h3>Developers and Managers</h3>
<p>There&#8217;s a difference between how developers view a practice and how a manager (defined for the purposes of this post as someone in charge of delivering something) view that same practice. From a developer perspective, <a href="http://codebetter.com/blogs/ian_cooper/archive/2008/09/23/learning-and-crafstmanship.aspx">Ian&#8217;s point</a> about unit testing is spot on:</p>
<blockquote><p>&#8220;The problem is that the most important step is not doing it right, but doing it at all.&#8221;</p>
</blockquote>
<p>Yet, as Ian himself points out in the title, this is a learning issue. If you want to learn to swim, there&#8217;s no replacement for jumping in the pool. </p>
<p>The manager&#8217;s perspective is a bit different.</p>
<p>Yes, we want our developers to improve their skill set. Yes, we understand that unit testing will <em>ultimately</em> improve quality. Yes, we know developers need to practice these skills as a part of their job. But, and it&#8217;s a big ole&#8217; but, when it comes time to sink or swim, and we&#8217;ve got a deadline, those desires need to be balanced with delivering. <a href="http://weblogs.asp.net/rosherove/archive/2008/09/20/goodbye-mocks-farewell-stubs.aspx">Accounts</a> of unit testing adoption efforts resulting in more (test) code to support with little apparent improvement in quality in the short term, well, they scare us. <a href="http://www.rgoarchitects.com/nblog/2008/09/21/WhatsUpWithUnitTestingPartI.aspx">Arnon&#8217;s post</a> gives more links supporting that feeling.</p>
<h3>What&#8217;s a Unit Test anyway?</h3>
<p>Is it any class that happens to have a TestFixture attribute on it?</p>
<p>If we are to &#8220;decouple&#8221; unit testing from good design, as <a href="http://weblogs.asp.net/rosherove/archive/2008/09/26/unit-testing-decoupled-from-design-adoption.aspx">Roy has described</a>, that&#8217;s a not-improbable outcome. If the design of the system is such as there aren&#8217;t any real &#8220;units&#8221;, what exactly are we testing? Regardless of static or dynamic typing, replaceability of code, and other technological things, does the fact that all TestMethods in that TestFixture complete successfully mean anything? In other words, what did the test test?</p>
<p>It is clear that these tests <em>cost</em> something.</p>
<p>It&#8217;s more code to write. It&#8217;s more code to maintain.</p>
<p>The question is, what value are we getting from these &#8220;unit tests that any developer without design skills can write&#8221;?</p>
<p>The manager in me doesn&#8217;t like this return on investment.</p>
<blockquote><p>By the way, TDD is as much the evolution of unit testing as the screw driver is the evolution of the hammer. But that&#8217;ll have to wait for a different post.</p>
</blockquote>
<h3>What&#8217;s Design Got To Do With It?</h3>
<p>If you&#8217;re looking for the technical ability to write a test fixture and replace calls to other classes, then design has nothing to it.</p>
<p>If tests are to be valuable &#8211; design has everything to do with it.</p>
<p>The difficulty our developer is having unit-testing the system is a symptom of design problems. There&#8217;s a good chance that&#8217;s why he suggested a rewrite. </p>
<blockquote><p>By the way, please do a search &amp; replace in your vocabulary on the word &#8220;rewrite&#8221; with the word &#8220;redesign&#8221;. The code&#8217;s syntax isn&#8217;t the problem &#8211; it&#8217;s not the &#8220;m_&#8221;, camel case, or anything like that. It&#8217;s not that if the code was rewritten under the same design that all problems will go away.</p>
<p>Redesign, or do nothing.</p>
</blockquote>
<p>The community&#8217;s been discussing the issues of coupling, interfaces, mocking, and tools at length in the context of testability. I won&#8217;t reiterate the debate here but I&#8217;ll tell you this:</p>
<p>If logic is duplicated, if the code is tightly coupled, if there is no separation of concerns, the unit tests will be useless &#8211; even if they &#8220;test&#8221; the class in isolation.</p>
<h3>Cut the coverage crap</h3>
<p>Metrics lie.</p>
<p>The fact that there&#8217;s a bunch of other code which calls 100% of the system&#8217;s code and doesn&#8217;t contain false assertions doesn&#8217;t mean that the code is high quality or doesn&#8217;t contain bugs.</p>
<p>In a well designed system, most &#8220;logic&#8221; will be contained in two &#8220;layers&#8221; &#8211; the controllers and the domain model. These classes should be independent of any and all technological concerns. You can and should get high unit test coverage on classes in these layers. Shoot for 100%, it&#8217;s worth it.</p>
<blockquote><p>Testing domain models is all about asserting state. While using setters to get the domain objects into a necessary initial state is OK, setters should not be used beyond that. Testing controllers is primarily about interactions &#8211; mocks will probably be needed for views and service agents. Commands do not need to be mocked out.</p>
</blockquote>
<p>Most other layers have some dependence on technology that makes unit tests relatively less valuable. Coverage on these layers is most meaningless. My guidance is to take the effort that would have been spent on unit testing these other layers and invest it all in automated integration tests. You&#8217;re likely to get a much higher return on investment. Much higher.</p>
<p>Much.</p>
<h3>Everybody&#8217;s Right</h3>
<p>Developers aren&#8217;t just born knowing good design, testing, or anything else. Universities, colleges, and most vendors do little to change that state of affairs. Books help, a bit, but when learning to swim, you&#8217;ve got to get your feet wet, and on the job training is, by and large, all there is. As such, lowering the barrier to entry is important. </p>
<p>Keeping in mind the <a href="http://w3.msi.vxu.se/~per/CP-web/PBDDSKIL.HTM">Dreyfus model of knowledge acquisition</a>, it&#8217;s not about &#8220;<a href="http://ayende.com/Blog/archive/2008/09/23/cuddling-is-consider-harmful.aspx">dumbing down</a>&#8221; software development, it&#8217;s about bringing novices up to speed:</p>
<blockquote><p>&#8220;In the beginning [novices] learn to recognize objective facts and features, relevant to the skill. Characteristic of relevant elements are that they can be recognized context-free, i.e. without reference to the overall situation. The novice acquire basic rules to follow, acting upon those facts and features. The rules are also context-free, i.e. no notice is taken to the surroundings. <strong>On account of this the novice feels very little responsibility for the result</strong>.&#8221; (emphasis mine)</p>
</blockquote>
<p>Managers <strong><em>are</em></strong> ultimately responsible for the result. </p>
<p>Managers shouldn&#8217;t necessarily sacrifice their projects on this altar of learning. Organizations need to find ways for developers to safely practice these techniques as a part of developing their &#8220;human resources&#8221;. First of all, this needs to be communicated to everyone &#8211; that the organization understands the importance of these techniques, the desires of developers to adopt them, and the projects that need to be delivered. </p>
<p>Some projects may be allocated additional non-functional requirements: the software will be developed test-first, there will be at least 80% unit test coverage, etc. It can make sense to have developers spend some time on these projects after finishing one more delivery focused project and before going onto another one. As more developers become proficient with unit testing and design, the delivery focused projects can start to benefit from these skills.</p>
<p>It&#8217;s a gradual process.</p>
<h2>The Important Bit</h2>
<p>No matter how you go about unit testing, do periodic test reviews.</p>
<p>Just like code reviews.</p>
<p>That&#8217;s it.</p>
<p>&nbsp;</p>
<hr size="1">
<h4>Related Posts</h4>
<blockquote><p><a href="http://www.udidahan.com/2008/02/04/sagas-and-unit-testing-business-process-verification-made-easy/">Business Process Verification</a></p>
<p><a href="http://www.udidahan.com/2007/04/16/self-documenting-test-driven-alien-artifacts/">Self documenting and Test-Driven Alien Artifacts</a></p>
<p><a href="http://www.udidahan.com/2006/06/16/soa-testing/">SOA Testing</a></p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2008/09/30/unit-testing-for-developers-and-managers/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Hi. My name&#8217;s Udi, and I write crappy code</title>
		<link>http://www.udidahan.com/2007/10/30/hi-my-names-udi-and-i-write-crappy-code/</link>
		<comments>http://www.udidahan.com/2007/10/30/hi-my-names-udi-and-i-write-crappy-code/#comments</comments>
		<pubDate>Tue, 30 Oct 2007 11:21:01 +0000</pubDate>
		<dc:creator>udidahan</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://udidahan.weblogs.us/2007/10/30/hi-my-names-udi-and-i-write-crappy-code/</guid>
		<description><![CDATA[&#8220;I am human, therefore I make mistakes. If I make mistakes, then I cannot assume that I will write code that has no mistakes. If I cannot write code that has no mistakes, then I must assume that mistakes are rampant within the code. If mistakes are rampant within the code, then I must find [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;I am human, therefore I make mistakes. If I make mistakes, then I cannot assume that I will write code that has no mistakes. If I cannot write code that has no mistakes, then I must assume that mistakes are rampant within the code. If mistakes are rampant within the code, then I must find them. But because I make mistakes, then I must also assume that I make mistakes trying to identify the mistakes in the code. <em>Therefore, I will seek the best support I can find in helping me find the mistakes in my code.</em>&#8221;</p>
<p>Source: <a href="http://blogs.tedneward.com/2007/10/30/Welcome+To+The+Shitty+Code+Support+Group.aspx">Ted Neward&#8217;s post: Welcome To The Shitty Code Support Group</a>.</p>
<p>And I consider myself to be a top 10% kind-of-guy.</p>
<p>Imagine the kind of crap all those other people are putting out. Not you, the reader, of course. The fact that you&#8217;re reading my writing means you&#8217;re a top 10% kind of person too <img src='http://www.udidahan.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </p>
<p>Having good design helps.</p>
<p>Helps decrease the impact mistakes in one part of the system have on other parts.</p>
<p>That way, when I&#8217;m working on one part of the system, I only have to deal with my crap. And that&#8217;s a good thing. Because I&#8217;ve gotten pretty good at fixing my crap over the years.</p>
<p>&#8211;</p>
<p>This movement is definitely a good thing, over all. Moving to a failure-oriented mindset will help us put the appropriate tools and processes in place to making more robust systems, maybe even <a href="http://udidahan.weblogs.us/2007/08/24/make-non-stop-software-simple-make-it-possible/">Non-Stop Software</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2007/10/30/hi-my-names-udi-and-i-write-crappy-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Estimate Individually &#8211; Fail Globally?</title>
		<link>http://www.udidahan.com/2007/09/01/estimate-individually-fail-globally/</link>
		<comments>http://www.udidahan.com/2007/09/01/estimate-individually-fail-globally/#comments</comments>
		<pubDate>Sat, 01 Sep 2007 18:53:31 +0000</pubDate>
		<dc:creator>thesoftwaresimplist</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[The Team]]></category>

		<guid isPermaLink="false">http://udidahan.weblogs.us/2007/09/01/estimate-individually-fail-globally/</guid>
		<description><![CDATA[After reading Derek Hatchard&#8217;s post, The Art and War of Estimating and Scheduling Software, I wanted to follow up on my previous post on the topic, Don&#8217;t Trust Developers with Project Management. The problem lies with individualistic thinking.
Developers, and managers too for that matter, by and large are concerned with &#8220;productivity&#8221;. Developers want the latest [...]]]></description>
			<content:encoded><![CDATA[<p>After reading Derek Hatchard&#8217;s post, <a href="http://www.ardentdev.com/blog/index.php/2007/08/29/the-art-and-war-of-estimating-and-scheduling-software/">The Art and War of Estimating and Scheduling Software</a>, I wanted to follow up on my previous post on the topic, <a href="http://udidahan.weblogs.us/2007/08/06/dont-trust-developers-with-project-management/">Don&#8217;t Trust Developers with Project Management</a>. The problem lies with individualistic thinking.</p>
<p>Developers, and managers too for that matter, by and large are concerned with &#8220;productivity&#8221;. Developers want the latest tools and technologies so that they can churn out more code faster. Managers create schedules trying to get the maximum efficiency out of each one of their developers. They consider resource utilization and other terms that sound manager-ish.</p>
<p>Fact is, on medium to large sized projects, if you look at the studies you&#8217;ll find that developer productivity when measured as total lines of (non-blank) code of the system in production divided by the total number of developer days comes in roughly at 6. Maybe 7.</p>
<p>7 lines of code a day.</p>
<p>Let that sink in for a second.</p>
<p>I can hear the managers screaming already. OMFG, what were they doing all day long?! It takes, what, 10 minutes to put out 7 lines of code? An hour even, if it&#8217;s complicated recursive code and stuff. And they say they don&#8217;t like us micro-managing them?! Now we know why. It&#8217;s because they&#8217;re goofing off all day long.</p>
<p>Well, managers, that&#8217;s not really the way it goes. You see, you have to take into account the time it took to learn the technology, tools, frameworks, etc. Add to that the time of understanding the requirements, which is really sitting through boring meetings that don&#8217;t explain much. Finally, our poor developer actually gets to implement the requirement. Maybe run the system a couple of times, trying out the feature they implemented, and checking the code in.</p>
<p>Well, that&#8217;s actually the easy part. Now comes the part which kills most of the time. After a bunch of features have been developed by the team, the testers start banging away at it and find a bunch of bugs. Now the developer has to reverse-engineer some bizarre system behavior and figure out which part of the system is to blame. That involves usually some educated guessing (unless they&#8217;ve just joined the team and have been put in the bug-fixer role to &#8220;learn the system&#8221;, in which case it is thoroughly <B>UN</B>educated guessing). They change some code, run the system, which looks like its been fixed, check the new code in, and close the bug.</p>
<p>But the bugs keep coming. And as the project progresses towards production, more and more of the developers time is spent looking through code and changing existing code, that actually writing new code.</p>
<p>And the larger the system, the more bugs. And I don&#8217;t mean that the number of bugs linearly increases with lines of code, or number of features. It&#8217;s probably closer to exponential. If it&#8217;s a mission critical system, the performance bugs will be taking an order of magnitude more time to fix than other bugs.</p>
<p>So, as you can see, getting a system into production is a team effort. It includes the developers and testers, of course, but also management, and the customer, and how they manage scope. This is kind of a &#8220;duh&#8221; statement, but we&#8217;re getting to the punch-line.</p>
<p>If getting a system into production involves the entire team, isn&#8217;t that obviously true for each feature too?</p>
<p>In which case, why are we asking just the developers to estimate the time it takes to get a feature &#8220;done&#8221;? Why are we trying so hard to measure their productivity?</p>
<p>I know why. It&#8217;s so we can get rid of the less productive ones and give bonuses to the more productive ones!</p>
<p>Back to the main issue. I don&#8217;t &#8220;trust&#8221; developer estimates because I need to see the <i>team&#8217;s</i> capability to put features in production. The involves all aspects, and often many team members, in some cases multiple developers going through the same code. This involves all overhead and cross team communication, sick days, etc. It&#8217;s also why I try to get multiple data points over time to understand the team&#8217;s velocity.</p>
<p>While I care about the quality of my developers, and testers, and everybody on my team and would like them to be able to estimate their work as best they can, I&#8217;ve got a project to put into production. And the best way I&#8217;ll know when it&#8217;ll go into production is by having data that&#8217;ll enable me to state to my management:</p>
<p>&#8220;Our team is finishing 20 feature-units a month, we&#8217;ve got 200 feature-units to go, so we&#8217;ll be done in around 10 months.&#8221;</p>
<p>If I&#8217;m busy micro-measuring each developers estimates, I won&#8217;t have the time to see the forest. By first taking a harsh look at the reality of what the team can do, I can start looking for ways to make it better. Maybe the bottleneck is between analysts and developers, maybe we&#8217;re seeing the same bugs regressing many times, but until we know where we are, we can&#8217;t run controlled experiments to see what makes us better.</p>
<p>Focusing on the individual developer, getting them the latest and greatest tools may be great for their morale, but it probably won&#8217;t make a bit of difference to their actual productivity.</p>
<p>Next time &#8211; what to do when management asks you what it&#8217;ll take to be done sooner.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2007/09/01/estimate-individually-fail-globally/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Successfully Applying Agile to Fixed-Bid Projects</title>
		<link>http://www.udidahan.com/2007/09/01/successfully-applying-agile-to-fixed-bid-projects/</link>
		<comments>http://www.udidahan.com/2007/09/01/successfully-applying-agile-to-fixed-bid-projects/#comments</comments>
		<pubDate>Sat, 01 Sep 2007 13:06:08 +0000</pubDate>
		<dc:creator>thesoftwaresimplist</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Consulting]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Simplicity]]></category>
		<category><![CDATA[The Team]]></category>

		<guid isPermaLink="false">http://udidahan.weblogs.us/2007/09/01/successfully-applying-agile-to-fixed-bid-projects/</guid>
		<description><![CDATA[Jeremy&#8217;s trying to answer some hard questions about agile. I wanted to tackle the issue of fixed-bids, since most of my clients work on those kinds of projects and I managed those projects full-time before becoming a consultant.
So, here&#8217;s the thing.
The only way to win on fixed-bid projects, is to bid low, and then rack [...]]]></description>
			<content:encoded><![CDATA[<p>Jeremy&#8217;s <a href="http://codebetter.com/blogs/jeremy.miller/archive/2007/08/31/trying-to-answer-hard-questions-about-agile-development.aspx">trying to answer some hard questions about agile</a>. I wanted to tackle the issue of fixed-bids, since most of my clients work on those kinds of projects and I managed those projects full-time before becoming a consultant.</p>
<p>So, here&#8217;s the thing.</p>
<p>The only way to win on fixed-bid projects, is to bid low, and then rack up the change-requests. This is why people spend so much time documenting requirements, and then getting the client to sign off. It&#8217;s so they can prove that something is an actual change request, and thus they don&#8217;t have to do it. So, if the client wants to do whatever, they have to pay more money.</p>
<p>The problem is that it pisses off the client.</p>
<p>There&#8217;s another, subtler problem. It&#8217;s that clients get wise to this game, and front-load every possible requirement requesting total flexibility in everything. </p>
<p>This leads to another problem. We can&#8217;t bid low anymore.</p>
<p>Which leads to another problem. The client doesn&#8217;t have the budget to pay for the longer list of requirements.</p>
<p>Which leads us back to square one.</p>
<p>Fixed bids are a lose-lose proposition.</p>
<p>You see, if you bid rationally, taking into account the fact that some requirements will change, others will appear mid-way through, and so on, you&#8217;re bid will be significantly higher than the other guy who low-balled it. That means that the client will have a very hard time explaining to his management why he wants you to do the project.</p>
<p>So, the only way to win is for the client to realize this and game the system. This is sometimes a fine-line, possibly bordering on illegal when it comes to government contracts.</p>
<p>Once you have a client who understands that the fixed-bid is not in their interest, they will work collaboratively with you to get a reasonable system out the door within the given budget. There will be a lot of give-and-take but it can work. After a system goes into production successfully, it&#8217;s a lot easier to get management buy-in for the next version.</p>
<p>Fact is, upper management doesn&#8217;t really know all the specific requirements. So, if you don&#8217;t do them all, you&#8217;re OK, and so is your client.</p>
<p>In these circumstances, agile development is not only possible, but likely.</p>
<p>I know that it&#8217;s not really fixed-price, fixed-time, fixed-scope this way. But that&#8217;s what makes it successful <img src='http://www.udidahan.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2007/09/01/successfully-applying-agile-to-fixed-bid-projects/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Don&#8217;t trust developers with project management</title>
		<link>http://www.udidahan.com/2007/08/06/dont-trust-developers-with-project-management/</link>
		<comments>http://www.udidahan.com/2007/08/06/dont-trust-developers-with-project-management/#comments</comments>
		<pubDate>Mon, 06 Aug 2007 21:29:01 +0000</pubDate>
		<dc:creator>thesoftwaresimplist</dc:creator>
				<category><![CDATA[Management]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[The Team]]></category>

		<guid isPermaLink="false">http://udidahan.weblogs.us/2007/08/06/dont-trust-developers-with-project-management/</guid>
		<description><![CDATA[What with all the warm and fuzzy feelings around trusting developers (here, here, and here) I just have to tone it down a bit. The title takes it a bit far &#8211; but less than you might think. Just today I had a talk with one of the team leads on the project I&#8217;m consulting [...]]]></description>
			<content:encoded><![CDATA[<p>What with all the warm and fuzzy feelings around trusting developers (<a href="http://feeds.feedburner.com/~r/Commonality/~3/141206718/DevelopersAndTrust.aspx">here</a>, <a href="http://feeds.feedburner.com/~r/AyendeRahien/~3/141094234/Those-untrustworthy-developers.aspx">here</a>, and <a href="http://codebetter.com/blogs/jeremy.miller/archive/2007/08/05/on-software-teams.aspx">here</a>) I just have to tone it down a bit. The title takes it a bit far &#8211; but less than you might think. Just today I had a talk with one of the team leads on the project I&#8217;m consulting on. It boiled down to this:</p>
<p>Developers don&#8217;t know how to estimate.</p>
<p>Or more specifically, the variance in the actual completion time of a feature from the estimate given by a developer increases probably exponentially with time.</p>
<p>For example, if the estimate is a day, you can expect it to be finished in around a day. If the estimate is a week (5 works days), it will probably vary between 4-10 work days. If the estimate is a month, in all actuallity the developer probably doesn&#8217;t know enough to say but will answer when pressed.</p>
<p>This is why Ron (the team lead) asked me if I wasn&#8217;t worried I was putting myself in a lose-lose situation by changing the project structure. There were two &#8220;teams&#8221; when I came in &#8211; developers and testers. All the team leads had &#8220;committed&#8221; to &#8220;finishing&#8221; the project in 6 months. When I originally proposed the change to more feature-driven teams, mixing skilled and newer developers and testers together on the same team, came the cry:</p>
<p>&#8220;It&#8217;ll take us twice as long this way.&#8221;</p>
<p>&#8220;It&#8217;s so much less efficient than before.&#8221;</p>
<p>And on, and on. What was funny to me was that 3 of the &#8220;6&#8243; months were already gone and not a single feature worked. We were half &#8220;gone&#8221;, and nowhere near half done.</p>
<p>The thing is that Ron was sure I was cooking my own goose with upper management. What he, and most other developers don&#8217;t know is that upper management has gotten used to the state of things. If developers say one month, management has seen enough history to know that it&#8217;ll really be 3-4 months. So when I come in and do things different from what developers are used to, upper management is thrilled &#8211; that&#8217;s why they brought me in the first place.</p>
<p>The difference is that by working based on features, and measuring project progress by feature-units completed per iteration, I drive down variability. This creates solid data about progress saying when we&#8217;ll be done (more or less). This is quite different from the &#8220;normal&#8221; course of many projects:</p>
<p>&#8220;OK, so it&#8217;s been 8 months now on your 6 month project. When will you guys be finished already?&#8221;</p>
<p>Without the data, your only strategy is hope: &#8220;Umm, I hope the developers will be done this week(?)&#8221;</p>
<p>Don&#8217;t get me wrong. I trust my developers and testers deeply. But it&#8217;s not their job to know how to estimate and manage projects. PMs who take developers estimates as is and stake the project on that being correct are setting themselves up for failure &#8211; with only themselves to blame.</p>
<p>Now back to your nice warm-and-fuzzy blogging&#8230; <img src='http://www.udidahan.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2007/08/06/dont-trust-developers-with-project-management/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Self-Documenting, Test-Driven Alien Artifacts</title>
		<link>http://www.udidahan.com/2007/04/16/self-documenting-test-driven-alien-artifacts/</link>
		<comments>http://www.udidahan.com/2007/04/16/self-documenting-test-driven-alien-artifacts/#comments</comments>
		<pubDate>Mon, 16 Apr 2007 20:56:38 +0000</pubDate>
		<dc:creator>thesoftwaresimplist</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://udidahan.weblogs.us/2007/04/16/self-documenting-test-driven-alien-artifacts/</guid>
		<description><![CDATA[How much, and what kind of documentation do we need to create even if we have “self-documenting code”? Or is that kind of code enough all by itself? I for one yearn for the day where the code really will be enough, and I think that Scott and Ayende do too. First of all, I [...]]]></description>
			<content:encoded><![CDATA[<p><P class=MsoNormal style="MARGIN: 0cm 0cm 10pt"><SPAN lang=EN-US style="mso-ansi-language: EN-US"><FONT face=Calibri>How much, and what kind of documentation do we need to create even if we have “self-documenting code”? Or is that kind of code enough all by itself? I for one yearn for the day where the code really will be enough, and I think that </FONT><A href="http://codebetter.com/blogs/scott.bellware/archive/2007/04/15/161874.aspx"><FONT face=Calibri>Scott</FONT></A><FONT face=Calibri> and </FONT><A href="http://ayende.com/Blog/archive/2007/04/16/Read-The-Code-is-not-a-valid-answer.aspx"><FONT face=Calibri>Ayende</FONT></A><FONT face=Calibri> do too. First of all, I think that as time progresses, the size of systems that the average developer works on is increasing substantially. And the larger a system is, the more we find a kind of code/design dialect that developers use to talk about that system. I think that these dialects are significantly different between framework/open source code, and application code. So, when a new developer comes in, do we tell them to “just read the code”? Or if the application has gone into production some time ago and now needs to be enhanced but the original team is long gone, what can be done?<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></FONT></SPAN></P><br />
<P class=MsoNormal style="MARGIN: 0cm 0cm 10pt"><SPAN lang=EN-US style="mso-ansi-language: EN-US"><FONT face=Calibri>What I usually suggest (and practice) is to have some kind of documentation explaining “language” of the system – what things go together, how, and why; and just as importantly, what things must be kept apart. This can be a Software Architecture and Design document, or even videos of the design sessions where things were first discussed. The relevant requirements should be a part of this as well. We need to know that the reason asynchronous messaging was used was for the strenuous scalability requirements, otherwise we might start adding the high-productivity Visual Studio Web Services we like so much.<o:p></o:p></FONT></SPAN></P><br />
<P class=MsoNormal style="MARGIN: 0cm 0cm 10pt"><SPAN lang=EN-US style="mso-ansi-language: EN-US"><FONT face=Calibri>Continuous integration is a boon to projects who use them. But developers who are only familiar with building solutions in Visual Studio may not be used to working that way, keeping code checked out for weeks at a time.<o:p></o:p></FONT></SPAN></P><br />
<P class=MsoNormal style="MARGIN: 0cm 0cm 10pt"><SPAN lang=EN-US style="mso-ansi-language: EN-US"><A href="http://codebetter.com/blogs/scott.bellware/archive/2007/04/15/161875.aspx"><FONT face=Calibri>Test-Driven Development and Architecture</FONT></A><FONT face=Calibri> will help those who know about it. We should probably write something up about how the system should be enhanced. Side-effect or not, developers and testers will need to know how we test the system – what tools are used in which way and at which stage of the development lifecycle. We could reference existing methodologies as well as in what ways we deviate from them and why.<o:p></o:p></FONT></SPAN></P><br />
<P class=MsoNormal style="MARGIN: 0cm 0cm 10pt"><SPAN lang=EN-US style="mso-ansi-language: EN-US"><FONT face=Calibri>What <I>sustainable</I> business value do we provide by leaving behind us </FONT><A href="http://www.eaves.org/blog-archive/000071.html"><FONT face=Calibri>alien artifacts and practices</FONT></A><FONT face=Calibri>? I’m not saying not to use state-of-the-art designs, techniques, and practices. On the contrary, I think that they are the key to sustainable business value. Necessary, but not sufficient. Documentation, of whatever flavor you find most suitable to each specific thing you are documenting, should be considered by the team as a whole, and the conclusions presented to stakeholders. The famous Chrysler C3 project’s long-term business value is shaky as the result of those stakeholders decision that documentation wasn’t necessary – in no way was the Agile process faulty in that respect.<o:p></o:p></FONT></SPAN></P><br />
<P class=MsoNormal style="MARGIN: 0cm 0cm 10pt"><SPAN lang=EN-US style="mso-ansi-language: EN-US"><FONT face=Calibri>Finally, you may be surprised the holes you find in your own thinking when forced to write down and explain to someone just coming in “how we do things around here”, I know I was. I can tell you that in the cases where I did that exercise, several stupid, costly mistakes were avoided. Fleshing out your thinking isn’t necessarily big design up front (BDUF), it’s just smart.<o:p></o:p></FONT></SPAN></P></p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2007/04/16/self-documenting-test-driven-alien-artifacts/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Communication, Risk, and Your Career</title>
		<link>http://www.udidahan.com/2007/03/13/communication-risk-and-your-career/</link>
		<comments>http://www.udidahan.com/2007/03/13/communication-risk-and-your-career/#comments</comments>
		<pubDate>Tue, 13 Mar 2007 08:16:59 +0000</pubDate>
		<dc:creator>thesoftwaresimplist</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://udidahan.weblogs.us/archives/391</guid>
		<description><![CDATA[Over on the Real-World Software Architecture blog I just read a great post, “I want what I want when I say I want it”. Does this sound like one of your customers/managers?
I wonder if these people go into Burger King, order a # 5, and finish the order by saying, and I would like that [...]]]></description>
			<content:encoded><![CDATA[<p><span lang="EN-US"><font face="Calibri" size="3">Over on the Real-World Software Architecture blog I just read a great post, </font><a href="http://realworldsa.blogspot.com/2007/03/customer-buttlodgentitus-i-want-what-i.html"><font face="Calibri" size="3">“I want what I want when I say I want it”</font></a><font size="3"><font face="Calibri">. Does this sound like one of your customers/managers?</font></font></span></p>
<p><em><font size="3"><font face="Calibri">I wonder if these people go into Burger King, order a # 5, and finish the order by saying, and I would like that done in 60 seconds. Then do they proceed to ask every 10 seconds if the order is done? When they hit the 60 second mark do they start screaming at the top of their lungs &#8220;I told you I wanted that order in 60 seconds. If you don&#8217;t have it to me in the next 15 seconds I want my money back and the order for free.&#8221;?</font></font></em></p>
<p><font face="Calibri" size="3">I recently had the pleasure of working with a customer who “got it”. First of all, they understood that they couldn’t really set scope, time, and cost. Or rather, if they did, then quality – the main property that they had the least power over, would suffer. This could manifest itself in terms of an ugly or unusable user interface, or poor scalability – resulting in sky-rocketing operations costs. In short, they understood that in order to get what they <em>really</em> wanted, they had to give up “control”, or rather the illusion of control. By working collaboratively with the development team, they were able to get a good looking and workable prototype out in time for a tradeshow, as well as do a load test early in the project to see that the architecture was scalable.</font></p>
<p><font face="Calibri" size="3">Risk is an inherent part of all projects, to a lesser or greater degree. We need to manage risk by including risk-reduction activities (like load tests) into the project schedule. Some customers don’t understand that. It is therefore our responsibility to explain that, although this isn’t a value-creating activity, it is still necessary – or rather what cost could manifest later as a result of ignoring the risk (sky-rocketing operations costs).</font></p>
<p><font face="Calibri" size="3">But at the end of the day, the buck doesn’t stop here, I’m afraid. It’s not the development team’s money. If the customer chooses to make decisions that increase project risk, it is their choice. It is our responsibility to make them aware of the ramifications of their choices. It is good practice to document these decisions so that if (when) they come back to bite us, we can show that we communicated the possible outcomes ahead of time. I can tell you that it is a huge relief when you have an email record to counter “This system is slow. I thought you knew how to make a system that could handle this many users! Now you’re going to tell me that you have to take down the whole system to fix it – do you know how much that costs?!”</font></p>
<p><font face="Calibri" size="3">I don’t know why customers behave these ways, I just know that they do. I also know that I have to protect myself and my team from it. But, so as not to end on a doom-and-gloom note, I have found that by communicating more with my customers, I find out all sorts of interesting things. For instance, it’s not that they don’t want us to load test, it’s just that they don’t want us to do it now – they need to get something ready for the tradeshow. They just didn’t think it was important to tell us that. </font></p>
<p><font face="Calibri" size="3">So, reach out. I know I was surprised by the amount of illogical behaviour that disappeared once I started communicating, despite the customer’s apparent inapproachability. It just might save your project, or your career. </font></p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2007/03/13/communication-risk-and-your-career/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What? You mean, for free?</title>
		<link>http://www.udidahan.com/2007/01/24/what-you-mean-for-free/</link>
		<comments>http://www.udidahan.com/2007/01/24/what-you-mean-for-free/#comments</comments>
		<pubDate>Thu, 25 Jan 2007 00:30:15 +0000</pubDate>
		<dc:creator>thesoftwaresimplist</dc:creator>
				<category><![CDATA[Management]]></category>
		<category><![CDATA[Projects]]></category>

		<guid isPermaLink="false">http://udidahan.weblogs.us/archives/369</guid>
		<description><![CDATA[Responding to change – it’s one of the primary agile values. This topic came up over lunch with Sébastien in a rather round about way. Sébastien mentioned that, in French, when his clients communicate with him (and he with them) using the informal address “tu” he finds himself more obliged to comply with their requests [...]]]></description>
			<content:encoded><![CDATA[<p><font size="3"><font face="Times New Roman"><span lang="EN-US">Responding to change – it’s one of the primary agile values. This topic came up over lunch with </span>Sébastien in a rather round about way. Sébastien mentioned that, in French, when his clients communicate with him (and he with them) using the informal address “tu” he finds himself more obliged to comply with their requests than when using the more formal “vous”. The agilists quickly chimed in on the importance of responding to change but my fixed-price background wouldn’t let that go.</font></font></p>
<p><font face="Times New Roman" size="3"> </font></p>
<p><font face="Times New Roman" size="3">For starters, let me say that I’m all for giving the greatest value possible to a client. However, when I’ve got a schedule that can’t slip and can’t recruit a larger team (for whatever reason) and my client asks me if we could also handle some new XYZ scenario, I sometimes answer “no”. My agile friends were even more astonished when I told them that quite a few of my customers respect me for that answer. Just so you understand, the long version of that “no” is:</font></p>
<p><font face="Times New Roman" size="3"> </font></p>
<p><font face="Times New Roman" size="3">“Since we can’t slip the schedule any, and we’ve already done away with all the features that could have been cut, and we can’t bring in any new people, I really can’t promise you that if we try to do that additional work the project will stay on track.”</font></p>
<p><font face="Times New Roman" size="3"> </font></p>
<p><font face="Times New Roman" size="3">With clients with whom I’ve worked for quite a while, I sometimes use the more glib “what? You mean, for free?”, and we usually have a good laugh over it.</font></p>
<p><font face="Times New Roman" size="3"> </font></p>
<p><font face="Times New Roman" size="3">Anyway, bottom line is that change costs. Somebody has to pay, sometimes a little, sometimes a lot. If you’re a week or two from shipping, dropping a feature to “make room” for the new feature might not help. So much work may have already been done that to take the old feature out might be more work than leaving it in.</font></p>
<p><font face="Times New Roman" size="3"> </font></p>
<p><font face="Times New Roman" size="3">One big thing that I will give to agile over the fixed-price projects is that by forcing customers to define up-front all requirements, and “threatening” with a high cost of subsequent change, customers are made to put in many requirements that they think that they just <em>might</em> need. This is scope creep even before any work’s been done. By allowing the customer to change their mind during the project you are, in one feel swoop, decreasing (often drastically) that scope of the project making it cheaper and easier to give high value.</font></p>
<p><font face="Times New Roman" size="3"> </font></p>
<p><font size="3"><font face="Times New Roman">You’d be surprised by the number of times that clients are just trying to figure out if the cost of additional feature XYZ now is outweighed by its value. Giving an unqualified “yes” short-circuits the necessary discussions around risk that keep the business in the driver’s seat on the project. Sometimes “no” really is the best answer.<span lang="EN-US"><br />
</span></font></font></p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2007/01/24/what-you-mean-for-free/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Money?! Schedule?! But I&#8217;m an architect, not a PM!</title>
		<link>http://www.udidahan.com/2007/01/05/money-schedule-but-im-an-architect-not-a-pm/</link>
		<comments>http://www.udidahan.com/2007/01/05/money-schedule-but-im-an-architect-not-a-pm/#comments</comments>
		<pubDate>Sat, 06 Jan 2007 00:12:18 +0000</pubDate>
		<dc:creator>thesoftwaresimplist</dc:creator>
				<category><![CDATA[Management]]></category>
		<category><![CDATA[Projects]]></category>

		<guid isPermaLink="false">http://udidahan.weblogs.us/archives/363</guid>
		<description><![CDATA[After all contestants presented their solutions in the Iron Architect contest at TechEd Developers in Barcelona, and the judges left the room to deliberate, I put a question to them:
&#8220;When can you have your solution in production and how much would it cost?&#8221;
You could see the shock on their faces. Architects weren&#8217;t supposed to answer [...]]]></description>
			<content:encoded><![CDATA[<p>After all contestants presented their solutions in the Iron Architect contest at TechEd Developers in Barcelona, and the judges left the room to deliberate, I put a question to them:</p>
<p>&#8220;When can you have your solution in production and how much would it cost?&#8221;</p>
<p>You could see the shock on their faces. Architects weren&#8217;t supposed to answer these kinds of questions, were they? That&#8217;s what project managers are for, right? Eventually, they settled on one month for the schedule question, with only one developer. That&#8217;s one month in terms of calendar time. I was shocked by that.</p>
<p>Unless you&#8217;re Superman, in the span of one month you cannot learn an existing system, figure out all the new requirements, design, develop, test, and deploy, debug, etc, etc, and keep stakeholders happy and in the loop throughout the whole process. And it doesn&#8217;t matter how many developers you have.</p>
<p>And on that point, like you&#8217;re really going to be able to find a developer who&#8217;s any good at the drop of a hat, get them to leave whatever they&#8217;re doing for a month, for a short term project like that.</p>
<p>This topic came up in the speaker dinner when I was talking to <a href="http://blogs.msdn.com/pooyad/">Pooya</a> and <a href="https://blogs.msdn.com/juergenp/">Jurgen</a> (one of the judges). Architects need to be the glue that connect everything together &#8211; business, management, technical, test, operations, etc. They need to fully understand project lifecycle issues. When business comes along with a new requirement, the architect is the one who says if it can be just slipped in or needs to be separately budgeted &#8211; not the PM. The PM may have the final call, but the architect is the one who provides the information about the ramifications of changes to the project.</p>
<p>Money? Schedule? All in a day&#8217;s work for an architect.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2007/01/05/money-schedule-but-im-an-architect-not-a-pm/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>One wrong DLL = 3 months gone</title>
		<link>http://www.udidahan.com/2006/06/24/one-wrong-dll-3-months-gone/</link>
		<comments>http://www.udidahan.com/2006/06/24/one-wrong-dll-3-months-gone/#comments</comments>
		<pubDate>Sun, 25 Jun 2006 05:31:43 +0000</pubDate>
		<dc:creator>thesoftwaresimplist</dc:creator>
				<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://wp_630.weblogs.us/archives/291</guid>
		<description><![CDATA[A couple of days ago, one of the programmers on a project I’m consulting on came in to ask me a question. With a puzzled look on his face, Alex asked me “Udi, in your design you have these two tiny interfaces, IEntity and IMapEntity, that together wouldn’t justify belonging in their own DLL, and you gave each of them their very own DLL! Why?!” Right then and there I decided to hold a project-wide standup. I got everyone into the room, from project manager, to tester, to programmer, and spun the following scenario.
<br/><br/>
“Patrick”, I said to the project manager, “you know how we have our iterations set up so that each iteration we work on an entire feature, end to end, and keep the number of features down?” Patrick nodded.
<br/><br/>
“And Daniel”, I said to our test lead, “you know how you report defects on a feature by feature basis, correlated with the version of the system being tested?” Daniel, too, nodded.
<br/><br/>
“And Beth”, I said to our SCM/integrator, “you know how each check-in gets the relevant project’s version number to increase, gets built, unit tests run, and, if everything’s OK, the DLL gets put out?” Beth was quick to jump in, “and don’t forget that the version number is taken from the DLL and applied as a label to the corresponding source files.”
<br/><br/>
“So, what’s the point of all this ceremony?” I asked, turning to the entire group. I got some blank stares. “Why are we doing things like this, and not differently?” Alex spoke up. “This all has to do with the DLL thing I asked you before, doesn’t it?”
<br/><br/>
I won’t draw this story out too much, so let’s just cut to the chase...]]></description>
			<content:encoded><![CDATA[<p>A couple of days ago, one of the programmers on a project I’m consulting on came in to ask me a question. With a puzzled look on his face, Alex asked me “Udi, in your design you have these two tiny interfaces, IEntity and IMapEntity, that together wouldn’t justify belonging in their own DLL, and you gave each of them their very own DLL! Why?!” Right then and there I decided to hold a project-wide standup. I got everyone into the room, from project manager, to tester, to programmer, and spun the following scenario.</p>
<p>“Patrick”, I said to the project manager, “you know how we have our iterations set up so that each iteration we work on an entire feature, end to end, and keep the number of features down?” Patrick nodded.</p>
<p>“And Daniel”, I said to our test lead, “you know how you report defects on a feature by feature basis, correlated with the version of the system being tested?” Daniel, too, nodded.</p>
<p>“And Beth”, I said to our SCM/integrator, “you know how each check-in gets the relevant project’s version number to increase, gets built, unit tests run, and, if everything’s OK, the DLL gets put out?” Beth was quick to jump in, “and don’t forget that the version number is taken from the DLL and applied as a label to the corresponding source files.”</p>
<p>“So, what’s the point of all this ceremony?” I asked, turning to the entire group. I got some blank stares. “Why are we doing things like this, and not differently?” Alex spoke up. “This all has to do with the DLL thing I asked you before, doesn’t it?”</p>
<p>I won’t draw this story out too much, so let’s just cut to the chase.</p>
<p>When a tester logs a defect, that defect is tied to a feature and a system wide version number. From that version number, we can find all the specific version numbers of the DLLs that comprise that system wide version number. We can also see which DLLs have changed from the previous iteration. From there, we can find the tree of DLLs which are somehow dependent on those few that have changed. Only a few change because we keep our iterations small. From the specific version of a DLL, we can go into our source control repository and, from the label, find the exact source which comprised that DLL. Those are the source files that a programmer has to sift through in order to locate the origin of the defect.</p>
<p>Obviously, if there is less source to go through, the programmer will, on average, find the origin of the defect faster. And, as we all know, it usually takes longer to find the bug than to actually fix it.</p>
<p>So, by splitting up different classes and interfaces into different DLLs, we can manage dependencies in the system so that less source needs to be examined. For instance, in the case of the interfaces mentioned above, IMapEntity depends on IEntity. However, there are multiple classes that depend on IEntity (like views and presenters/controllers) which don’t really care above IMapEntity. The opposite isn’t true, though. The renderer and layer classes are dependent both on IEntity and IMapEntity. If these two interfaces were in the same DLL, and for a new feature we needed to add the “AlphaBlend” property to IMapEntity, when a bug would be found in that iteration, all the view and presenter classes would have to be examined as well. This is because the version number of the IEntity/IMapEntity DLL would have increased, and all the dependent DLLs could have been adversely affected by that change. Had these two interfaces been separated into different DLLs, this alpha blend change would have left an entire tree of DLLs uninvolved. This means less source for a programmer to look through, which means less time to get the feature working.</p>
<p>While I’m not sure the statement “1 wrong DLL = 3 months gone” is necessarily true, I can’t say it isn’t either. All these tiny little things add up to either huge productivity gains, or losses. Especially when you consider larger, more complex projects. A good design, by itself, can’t save you from the failure conditions described above. You need all the practices in place, working in harmony, and people paying attention to make the project succeed.</p>
<p>That’s if the politics don’t nail you first <img src='http://www.udidahan.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2006/06/24/one-wrong-dll-3-months-gone/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>CMMI and other processes &#8211; who needs &#8216;em?</title>
		<link>http://www.udidahan.com/2005/08/01/cmmi-and-other-processes-who-needs-em/</link>
		<comments>http://www.udidahan.com/2005/08/01/cmmi-and-other-processes-who-needs-em/#comments</comments>
		<pubDate>Tue, 02 Aug 2005 03:56:28 +0000</pubDate>
		<dc:creator>thesoftwaresimplist</dc:creator>
				<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://wp_630.weblogs.us/archives/213</guid>
		<description><![CDATA[<a href="http://weblogs.asp.net/Jsemeniuk/archive/2005/08/01/421224.aspx">Joel Semeniuk owns up to his secret love - CMMI.</a> So I thought I'd respond with a double counter. CMMI, and its ancestors for that matter, have always leaned toward the "process" side of the People-Process spectrum. The rise of the agile methodologies is something of a collective recoil from process-heavy methodologies. If I had to sum up a lot of the experiences developers have had in process heavy environments I think that this would be it: "Well, finished THAT document, now I get to fill in THIS OTHER form."
<BR/><BR/>
I don't think that I need to get into the advantages of agile methods, there is already so much out there. However, after this somewhat superficial first counter, I thought I'd counter the counter.
<BR/><BR/>
There is method to the madness. No, wait, strike that. There is madness to the method. No, that isn't right either. Screw it.
<BR/><BR/>
Ask a pro golfer to document, in detail, every single step of everything he does to win a golf tournament. Take that huge document, and give it to someone who never played golf before. Chances are...]]></description>
			<content:encoded><![CDATA[<p><a href="http://weblogs.asp.net/Jsemeniuk/archive/2005/08/01/421224.aspx">Joel Semeniuk owns up to his secret love &#8211; CMMI.</a> So I thought I&#8217;d respond with a double counter. CMMI, and its ancestors for that matter, have always leaned toward the &#8220;process&#8221; side of the People-Process spectrum. The rise of the agile methodologies is something of a collective recoil from process-heavy methodologies. If I had to sum up a lot of the experiences developers have had in process heavy environments I think that this would be it: &#8220;Well, finished THAT document, now I get to fill in THIS OTHER form.&#8221;</p>
<p>I don&#8217;t think that I need to get into the advantages of agile methods, there is already so much out there. However, after this somewhat superficial first counter, I thought I&#8217;d counter the counter.</p>
<p>There is method to the madness. No, wait, strike that. There is madness to the method. No, that isn&#8217;t right either. Screw it.</p>
<p>Ask a pro golfer to document, in detail, every single step of everything he does to win a golf tournament. Take that huge document, and give it to someone who never played golf before. Chances are you won&#8217;t get spectacular results. Chances are you&#8217;ll get pretty crappy results. On the other hand, give that document to someone who&#8217;s been golfing for a while, and they&#8217;ll probably pick up a couple of pointers that will improve their game. Over time, that document will become more valuable to that golfer as they begin to understand the intent of what was written.</p>
<p>Same document, different audience, wildly different results. Interesting, isn&#8217;t it?</p>
<p>You see, that &#8220;amateur&#8221; golfer didn&#8217;t follow the document to the letter. Rather, he picked out the practices that he understood and could implement and used those. Over time, and with more practice, our amateur golfer understood more and implemented more. This is the best place of the bell-curve to be on &#8211; ever increasing ROI.</p>
<p>I think that maybe we got this whole process thing backwards from the start. Maybe we shouldn&#8217;t even have tried to do the whole thing from day one. Is it any wonder that some practices were so poorly implemented that they did more harm than good? If someone who never played golf before tried to swing a club, swivel their hips, lift their heel, and follow through all together the very first time, there&#8217;s a good chance the club would smack them in the ass, probably quite painfully.</p>
<p>After you do one minimalist design document, you figure out what things you don&#8217;t have to waste your time on and focus on what&#8217;s important. The second time, maybe you include a sequence diagram or two because they really explain how the messages flow between the servers. The third time, maybe you write down some architectural principles so that new people coming into the project can figure out why one design was used instead of another. As time progresses, you find that &#8211; guess what, you&#8217;re doing most of the things found in the design document template. Only difference is you understand why you need them, and how each part hooks into everything else.</p>
<p>It&#8217;s hard to tell from a cursory glance the difference between a good design document and a poor one. They both follow the same template, they both have class diagrams, sequence diagrams, etc. The difference is what happens to that document after its &#8220;finished&#8221;. One is shoved in the drawer and never seen again. The other keeps popping up in all sorts of discussions &#8211; &#8220;well, that implementation seems alright, but didn&#8217;t we say that we don&#8217;t want this class to depend on that one?&#8221;</p>
<p>I guess all this sounds a little zen, but the journey of a thousand miles&#8230;, well you know the rest.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2005/08/01/cmmi-and-other-processes-who-needs-em/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Failures, Overtime, Management, and Accountability</title>
		<link>http://www.udidahan.com/2005/07/18/failures-overtime-management-and-accountability/</link>
		<comments>http://www.udidahan.com/2005/07/18/failures-overtime-management-and-accountability/#comments</comments>
		<pubDate>Tue, 19 Jul 2005 04:04:26 +0000</pubDate>
		<dc:creator>thesoftwaresimplist</dc:creator>
				<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://wp_630.weblogs.us/archives/211</guid>
		<description><![CDATA[After <a href="http://www.jrothman.com/weblog/2005/07/overtime-is-first-indication-of.html">Johanna's comments</a> on my recent post <a href="http://udidahan.weblogs.us/archives/029895.html">"Programmers don't make projects fail"</a>, I wanted to find out more about what she thought. With all the traffic I've been getting from this post, I think that I'm not the only one. So, I'm going to relate the back-and-forth we had over email...]]></description>
			<content:encoded><![CDATA[<p>After <a href="http://www.jrothman.com/weblog/2005/07/overtime-is-first-indication-of.html">Johanna&#8217;s comments</a> on my recent post <a href="http://udidahan.weblogs.us/archives/029895.html">&#8220;Programmers don&#8217;t make projects fail&#8221;</a>, I wanted to find out more about what she thought. With all the traffic I&#8217;ve been getting from this post, I think that I&#8217;m not the only one. So, I&#8217;m going to relate the back-and-forth we had over email.</p>
<p>&#8211;</p>
<p>Udi:<br />
You said &#8220;I understand the 2 hours of overtime, although I&#8217;m not sure I agree with it. But any more than that, and you&#8217;ve got the first indication of a project in trouble.&#8221; Could you clarify that for me? I&#8217;m not sure I understand.</p>
<p>Johanna:<br />
Sure. Two hours of overtime *could* be slight mis-estimation. But it&#8217;s<br />
more likely to be a symptom of trying to do the minimum necessary to<br />
&#8220;complete&#8221; the task rather than what the task requires. Example: making<br />
sure the code compiles, rather than doing any peer review or testing.<br />
People can do this with &#8220;minimum&#8221; overtime, but still not be completing<br />
the work.</p>
<p>Udi:<br />
I understand now. I wasn&#8217;t using &#8220;2 hours&#8221; as a hard and fast rule that the project is in trouble, rather that I want to know when things are slipping as soon as possible. If it&#8217;s mis-estimation, that&#8217;s also something I want to know &#8211; especially what other estimates we should be revisiting. On the other hand, it could be just a small slip that means nothing.</p>
<p>And finally, I want my programmers to know that they&#8217;re not alone against the bleak realities of project development. That there is someone who will actively fight scope-creep, and look out for their interests. I need my programmers to be happy, creative individuals and I don&#8217;t want them doing overtime if they don&#8217;t have to, especially not to impress me.</p>
<p>I think that this is one aspect of creating a culture of dealing with the real issues on the project. There is so much &#8220;filler&#8221; work and rework done on projects and none of it actually brings the project any closer to completion.<br />
&#8211;</p>
<p>Lasse Koskela <a href="http://radio.javaranch.com/lasse/2005/07/18/1121634739786.html">responds with the flip side of the coin</a>:</p>
<p><i>While it&#8217;s very true that programmers doing overtime is a good indicator of timely delivery being at risk, most projects&#8211;I&#8217;d dare to speculate&#8211;are in fact not aware of the need for overtime until very late in the project when it&#8217;s already {drum roll, please} too late.</i></p>
<p>I apparently have had very different experiences. In the projects I&#8217;ve been involved with, problems usually stemmed from bad management decisions and politics. When these projects got behind schedule, management played the overtime joker-card without ever considering that there could be real issues that need to be resolved. Programmers would toil nights and weekends, but lets face it, the problems couldn&#8217;t be resolved on their level.</p>
<p>On the edge of that very same coin, Digg.com <a href="http://digg.com/programming/Can_programmers_make_a_project_fail?">gave a different interpretation to my post</a>:</p>
<p><i>A rather simplistic approach by the Author but he feels that programmers can contribute only to a certain extent in the project and cannot be held responsible for the failure of a project. Some may agree but some don&#8217;t.</i></p>
<p>As to my simplistic approach, well what else would you expect from The Software Simplist ?</p>
<p>But seriously, programmers can only do so much &#8211; especially with changing requirements, no prioritization, no time for testing or quality, politics, and on and on&#8230; If you look at the underlying principles found in so many of the Agile methodologies you&#8217;ll find: just let the programmers do their job.</p>
<p>When it comes time to hold someone responsible for a project failure, should the poor programmer who was told to work on wildly different things each day take the heat? If we&#8217;re talking about project retrospectives, shouldn&#8217;t we be focusing on what lessons can be learned from one failure to prevent another?</p>
<p>In my opinion, the person that needs to be held accountable (check out Kent Beck&#8217;s discussion on the topic of accountability in <a href="http://www.itconversations.com/download-link.php?id=301">this audio presentation at ITConversations</a>) if a project fails is the project manager. He should be holding the development and testing teams accountable for project progress and quality, up to the point the project fails.</p>
<p>A common saying in the Agile camps says:<br />
<b>People trump process. Politics trumps them both.</b></p>
<p>So true.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2005/07/18/failures-overtime-management-and-accountability/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Method, Process &#8211; and not a class or an EXE to be found</title>
		<link>http://www.udidahan.com/2005/07/15/method-process-and-not-a-class-or-an-exe-to-be-found/</link>
		<comments>http://www.udidahan.com/2005/07/15/method-process-and-not-a-class-or-an-exe-to-be-found/#comments</comments>
		<pubDate>Sat, 16 Jul 2005 04:08:28 +0000</pubDate>
		<dc:creator>thesoftwaresimplist</dc:creator>
				<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://wp_630.weblogs.us/archives/209</guid>
		<description><![CDATA[My man Jimmy's been <a href="http://www.jnsk.se/weblog/posts/whatprocess.htm">bitten by the process bug</a>, but it doesn't seem to be anything major. Although I don't consider myself a methodologist, I thought I'd relate a recent story on the topic.
<BR/><BR/>
I'm spending part of my time these days as chief architect on the development of a mission planning system. Anyway, this project was running into some budgetary constraints for the current fiscal year. The problem was that the impact would be felt like aftershocks in the coming years. There were three critical modules that were hit by these constraints.
<BR/><BR/>
When asked to describe how we were going to develop the system, I began talking in an "implement-by-slice" language and putting dates beside each slice, finally showing what could be completed by the target date (quite a bit less than many stakeholders had in mind). One of the dev leads that was with me wrote it up, and sent it out with the appropriate explanations and commentary.
<BR/>
The next day I was busy in meetings all day long with our local Microsoft branch, who are absolutely amazing, by the way. The following morning I got a call from the project lead: "We've got a green light for all the modules - budget, staff, everything." I didn't connect the dots, I mean, I just wrote up a fairly standard development plan, no reason for that to have any serious effect, right?
<BR/><BR/>
Well, it turns out that this bit of process, implement-by-slice, was new to many of the stakeholders, and when they saw that the system would be stable at numerous points of the project lifecycle, it blew them away. This down-to-earth plan became a framework for concrete discussions about priorities and budgets. It forced everyone to stop daydreaming about what would, someday, be possible, and focus on what needed to be done at every step of the way.
<BR/><BR/>
--
<BR/><BR/>
Anyway, this isn't a commercial for implement-by-slice. Rather, consider it a way to regain focus; while many of us talk about how process doesn't matter much, I think that that may not be so true. While it may be well backed in terms of the development team, in the larger context of the entire project, process - in terms of the kinds of documents that get circulated, can make a big difference. Lets not fall into the <a href="http://www.pyrasun.com/mike/mt/archives/2005/07/13/21.45.29/index.html">"knee-jerk" trap</a> (via <a href="http://pluralsight.com/blogs/dbox/archive/2005/07/14/13346.aspx">Don Box</a>).<BR/>]]></description>
			<content:encoded><![CDATA[<p>My man Jimmy&#8217;s been <a href="http://www.jnsk.se/weblog/posts/whatprocess.htm">bitten by the process bug</a>, but it doesn&#8217;t seem to be anything major. Although I don&#8217;t consider myself a methodologist, I thought I&#8217;d relate a recent story on the topic.</p>
<p>I&#8217;m spending part of my time these days as chief architect on the development of a mission planning system. Anyway, this project was running into some budgetary constraints for the current fiscal year. The problem was that the impact would be felt like aftershocks in the coming years. There were three critical modules that were hit by these constraints.</p>
<p>When asked to describe how we were going to develop the system, I began talking in an &#8220;implement-by-slice&#8221; language and putting dates beside each slice, finally showing what could be completed by the target date (quite a bit less than many stakeholders had in mind). One of the dev leads that was with me wrote it up, and sent it out with the appropriate explanations and commentary.</p>
<p>The next day I was busy in meetings all day long with our local Microsoft branch, who are absolutely amazing, by the way. The following morning I got a call from the project lead: &#8220;We&#8217;ve got a green light for all the modules &#8211; budget, staff, everything.&#8221; I didn&#8217;t connect the dots, I mean, I just wrote up a fairly standard development plan, no reason for that to have any serious effect, right?</p>
<p>Well, it turns out that this bit of process, implement-by-slice, was new to many of the stakeholders, and when they saw that the system would be stable at numerous points of the project lifecycle, it blew them away. This down-to-earth plan became a framework for concrete discussions about priorities and budgets. It forced everyone to stop daydreaming about what would, someday, be possible, and focus on what needed to be done at every step of the way.</p>
<p>&#8211;</p>
<p>Anyway, this isn&#8217;t a commercial for implement-by-slice. Rather, consider it a way to regain focus; while many of us talk about how process doesn&#8217;t matter much, I think that that may not be so true. While it may be well backed in terms of the development team, in the larger context of the entire project, process &#8211; in terms of the kinds of documents that get circulated, can make a big difference. Lets not fall into the <a href="http://www.pyrasun.com/mike/mt/archives/2005/07/13/21.45.29/index.html">&#8220;knee-jerk&#8221; trap</a> (via <a href="http://pluralsight.com/blogs/dbox/archive/2005/07/14/13346.aspx">Don Box</a>).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2005/07/15/method-process-and-not-a-class-or-an-exe-to-be-found/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Programmers don&#8217;t make projects fail</title>
		<link>http://www.udidahan.com/2005/07/08/programmers-dont-make-projects-fail/</link>
		<comments>http://www.udidahan.com/2005/07/08/programmers-dont-make-projects-fail/#comments</comments>
		<pubDate>Sat, 09 Jul 2005 04:50:26 +0000</pubDate>
		<dc:creator>thesoftwaresimplist</dc:creator>
				<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://wp_630.weblogs.us/archives/206</guid>
		<description><![CDATA[The other day I was talking to a friend of mine who is a software project manager. We were talking shop when he told me about his team, and how they saved the project. As he related the story it became clear that the team nearly killed themselves saving this project &#8211; working 6, sometimes [...]]]></description>
			<content:encoded><![CDATA[<p>The other day I was talking to a friend of mine who is a software project manager. We were talking shop when he told me about his team, and how they saved the project. As he related the story it became clear that the team nearly killed themselves saving this project &#8211; working 6, sometimes 7 days a week at over 12 hours a day over a 2 month period. This could be just another anecdote for the Chaos report, but I wanted to give my spin on this all too common scenario.</p>
<p>Whenever I recruit somebody, on their first day I explain to them my project philosophy: Programmers don&#8217;t make projects fail, even if they don&#8217;t work overtime.</p>
<p>If you look at the Chaos report published yearly, I doubt you&#8217;ll ever see the lack of overtime on the top-ten list of reasons projects fail. So why is it that whenever a project looks like its getting into trouble to managers pull the overtime card? Could it just be a case of &#8220;well, what else could I do?&#8221; God, I hope not.</p>
<p>My philosophy is followed with an operative task: If you ever have to do more than 2 hours of overtime in a week, let me know.</p>
<p>Programmers are on the front line. They&#8217;re the first to feel that things are beginning to get off track. Even without talking to their manager, they usually try to get things back on track by working more hours.</p>
<p>Overtime is a symptom of much larger problems. It could be that requirements that appeared simple to implement are much more complex (the most insidious kind of scope-creep). It could be that interfaces to external systems we need to interact with aren&#8217;t stabilizing in time. It could be anything. Once you see overtime on your radar, it means that you need to start looking for exactly that &#8220;anything&#8221;.</p>
<p>I&#8217;ve been through several such projects where all the pressure was put on the programmers to bring the project to completion. In each case, they did not have the power to do so simply because the problems that needed to be dealt with weren&#8217;t technical. The classic saying of &#8220;people trump process, and politics trumps them both&#8221; rings so true. If you&#8217;re the manager, you need to step up and handle the politics or the project&#8217;s doomed.</p>
<p>Don&#8217;t take the cowardly path &#8211; &#8220;I pushed the team as hard as I could, literally 24&#215;7, what else could I do?&#8221; Unfortunately, many programmers-turned-managers really don&#8217;t know any other way &#8211; this is what their managers did when projects got into trouble, so they do the same.</p>
<p>Not to end on a doom-and-gloom note, you&#8217;d be surprised how quickly you can identify real issues by checking overtime. Of course, the faster you identify these issues, the sooner you can resolve them.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2005/07/08/programmers-dont-make-projects-fail/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Declaration of Interdependence</title>
		<link>http://www.udidahan.com/2005/02/04/declaration-of-interdependence/</link>
		<comments>http://www.udidahan.com/2005/02/04/declaration-of-interdependence/#comments</comments>
		<pubDate>Sat, 05 Feb 2005 03:45:53 +0000</pubDate>
		<dc:creator>thesoftwaresimplist</dc:creator>
				<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://wp_630.weblogs.us/archives/170</guid>
		<description><![CDATA[The &#8220;Declaration of Interdependence&#8221; for modern (agile/adaptive) (product/project) management 
]]></description>
			<content:encoded><![CDATA[<p><a href="http://alistair.cockburn.us/crystal/articles/doi/declarationofinterdependence.htm">The &#8220;Declaration of Interdependence&#8221; for modern (agile/adaptive) (product/project) management </a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2005/02/04/declaration-of-interdependence/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rules to break, Rules to keep</title>
		<link>http://www.udidahan.com/2004/06/12/rules-to-break-rules-to-keep/</link>
		<comments>http://www.udidahan.com/2004/06/12/rules-to-break-rules-to-keep/#comments</comments>
		<pubDate>Sat, 12 Jun 2004 21:39:19 +0000</pubDate>
		<dc:creator>thesoftwaresimplist</dc:creator>
				<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://wp_630.weblogs.us/archives/87</guid>
		<description><![CDATA[Now reading:

All I can say is, if you&#8217;re managing people, you should read it.
]]></description>
			<content:encoded><![CDATA[<p><P>Now reading:</P><br />
<P><A href="http://www.amazon.com/exec/obidos/ASIN/0684852861/thesoftwaresi-20/002-0360421-1235276?creative=125581&amp;camp=2321&amp;link_code=as1"><IMG alt="First, Break all the rules" hspace="0" src="http://images.amazon.com/images/P/0684852861.01._PE32_PIdp-schmooS,TopRight,7,-26_SCMZZZZZZZ_.gif" align="baseline" border="0"></A></P><br />
<P>All I can say is, if you&#8217;re managing people, you should <A href="http://www.amazon.com/exec/obidos/ASIN/0684852861/qid=1087050594/sr=2-1/ref=sr_2_1/002-0360421-1235276">read it.</A></P></p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2004/06/12/rules-to-break-rules-to-keep/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

