<?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; The Team</title>
	<atom:link href="http://www.udidahan.com/category/the-team/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>High Availability Presentation</title>
		<link>http://www.udidahan.com/2010/06/21/high-availability-presentation/</link>
		<comments>http://www.udidahan.com/2010/06/21/high-availability-presentation/#comments</comments>
		<pubDate>Mon, 21 Jun 2010 06:36:34 +0000</pubDate>
		<dc:creator>udidahan</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Availability]]></category>
		<category><![CDATA[Presentations]]></category>
		<category><![CDATA[Reliability]]></category>
		<category><![CDATA[The Team]]></category>

		<guid isPermaLink="false">http://www.udidahan.com/?p=1308</guid>
		<description><![CDATA[OK &#8211; this is the last one, I promise. Well, for now, anyway.
Earlier this month at TechEd North America I gave a fairly new presentation that was only delivered once before (at the Connected Systems User Group in London) and I&#8217;m happy to say is now online for your viewing pleasure.
High Availability &#8211; A Contrarian [...]]]></description>
			<content:encoded><![CDATA[<p>OK &#8211; this is the last one, I promise. Well, for now, anyway.</p>
<p>Earlier this month at TechEd North America I gave a fairly new presentation that was only delivered once before (at the Connected Systems User Group in London) and I&#8217;m happy to say is now online for your viewing pleasure.</p>
<p><a href="http://www.msteched.com/2010/NorthAmerica/ARC308">High Availability &#8211; A Contrarian View</a></p>
<p>Comments? Thoughts? Let me know.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2010/06/21/high-availability-presentation/feed/</wfw:commentRss>
		<slash:comments>4</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>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>Commitment to my craft</title>
		<link>http://www.udidahan.com/2007/08/09/commitment-to-my-craft/</link>
		<comments>http://www.udidahan.com/2007/08/09/commitment-to-my-craft/#comments</comments>
		<pubDate>Thu, 09 Aug 2007 21:40:15 +0000</pubDate>
		<dc:creator>thesoftwaresimplist</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[The Team]]></category>

		<guid isPermaLink="false">http://udidahan.weblogs.us/2007/08/09/commitment-to-my-craft/</guid>
		<description><![CDATA[I am this committed to my craft:

How about you?
]]></description>
			<content:encoded><![CDATA[<p>I am this committed to my craft:</p>
<p><object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/QjA5faZF1A8"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/QjA5faZF1A8" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"></embed></object></p>
<p>How about you?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2007/08/09/commitment-to-my-craft/feed/</wfw:commentRss>
		<slash:comments>3</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>Sketch a little design for me</title>
		<link>http://www.udidahan.com/2007/05/14/sketch-a-little-design-for-me/</link>
		<comments>http://www.udidahan.com/2007/05/14/sketch-a-little-design-for-me/#comments</comments>
		<pubDate>Mon, 14 May 2007 06:56:25 +0000</pubDate>
		<dc:creator>thesoftwaresimplist</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Simplicity]]></category>
		<category><![CDATA[The Team]]></category>

		<guid isPermaLink="false">http://udidahan.weblogs.us/2007/05/14/sketch-a-little-design-for-me/</guid>
		<description><![CDATA[So it’s my first visit with this client, and we’re discussing how the current system works and in what ways they want to expand it, what the new requirements are, etc. I ask Isaac, the development manager, if they have any diagrams or documents with this information and he proudly answered that they do. After [...]]]></description>
			<content:encoded><![CDATA[<p>So it’s my first visit with this client, and we’re discussing how the current system works and in what ways they want to expand it, what the new requirements are, etc. I ask Isaac, the development manager, if they have any diagrams or documents with this information and he proudly answered that they do. After going through the powerpoints, visios, and word documents describing everything but what I was looking for, I had a few more questions.</p>
<p>&#8220;I appear to have missed the architecture diagrams. Can you show me where they are?&#8221;</p>
<p>&#8220;Of course. Here it is.&#8221;, Isaac proclaimed pointing to something that looked like a deployment diagram.</p>
<p>&#8220;I see, but which logical pieces talk to each other? I couldn’t find very much information about the software itself.&#8221;, I asked.</p>
<p>Isaac went into an hour long monologue where each of the little boxes ornamenting the servers, clients, and databases was described. A couple of times, he corrected himself mid-way through:</p>
<p>&#8220;Um, no. Strike that. I wanted it to work that way, but it can’t because of the XYZ. I think that the team implemented it like this…&#8221;</p>
<p>After thoroughly soaking things up, I went and talked to the team about the new requirements. Five minutes into our conversation, they stopped me and Daniel, the technical lead said:</p>
<p>&#8220;Yah, I know that’s what Isaac thought, but we couldn’t get that working either. Here’s what we did…&#8221;</p>
<p>And not two minutes into that did Jackie, the UI lead cut in. &#8220;There were threading problems with that. We did something else…&#8221;</p>
<p>And, of course, a few minutes after that, Simon, one of the UI developers spoke up sheepishly. &#8220;Well… The product catalog doesn’t work like that. I reused quite a lot of code from (company they merged with) which worked a bit different. It was practically done, all I had to do was fiddle with the interfaces a bit.&#8221;</p>
<p>The first thing I suggested we do on that project was to sketch up some diagrams explaining the way things really worked. And not just one single diagram with everything in it, but a bunch of smaller diagrams each describing one perspective of the system; one showing how it would scale out, another showing basic messaging patterns, and another showing dependencies between packages, etc. After we finished that exercise (took a little under a week all things considered), the result was a little (or a lot) different from what each of the team thought. After that we were able to have very productive conversations about how to expand on the system.</p>
<p>Here’s the bottom line: you don’t need to invest an enormous amount of resources on &#8220;Architecture&#8221; and &#8220;Design&#8221;. Just sketch up what you think the solution should look like. Don’t let the tools dictate too much – you’re not going to be generating code from this. These drawings are just a platform on which you can have design discussions. Keep the sketches as simple as possible without hurting their ability to communicate your design intent.</p>
<p>The purpose of these exercises is to get everyone pulling in the same direction. It’s hard enough making progress without having people coding to conflicting design objectives.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2007/05/14/sketch-a-little-design-for-me/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Podcast] How to structure .NET Solutions and Components</title>
		<link>http://www.udidahan.com/2007/04/18/podcast-how-to-structure-net-solutions-and-components/</link>
		<comments>http://www.udidahan.com/2007/04/18/podcast-how-to-structure-net-solutions-and-components/#comments</comments>
		<pubDate>Wed, 18 Apr 2007 20:41:14 +0000</pubDate>
		<dc:creator>thesoftwaresimplist</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Ask Udi Podcast]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[The Team]]></category>

		<guid isPermaLink="false">http://udidahan.weblogs.us/2007/04/18/podcast-how-to-structure-net-solutions-and-components/</guid>
		<description><![CDATA[This week&#8217;s question comes from Mike who asks:

Hi Udi,
I was wondering if you could help me out or point me in the right direction.  I&#8217;ve been programming on the .Net framework for several years now and want to move towards an architecture role.  Additionally, I have been reading up on WCF and related [...]]]></description>
			<content:encoded><![CDATA[<p>This week&#8217;s question comes from Mike who asks:</p>
<blockquote><p>
Hi Udi,</p>
<p>I was wondering if you could help me out or point me in the right direction.  I&#8217;ve been programming on the .Net framework for several years now and want to move towards an architecture role.  Additionally, I have been reading up on WCF and related .Net 3.0 technologies, but have more questions than answers.</p>
<p>1. Do you have guidelines/best-practices for how to structure a .Net solution and related assemblies?  Also, guidelines as to how to factor the various namespaces and what goes where would be helpful.</p>
<p>2. How should components be factored, i.e. one component to an assembly or multiple components to an assembly?  I&#8217;ve read several different articles that go back and forth, but never really got a straight answer.</p>
<p>3. How do components relate to services from an SOA perspective?</p>
<p>4. Does application scope/size impact the decision to use SOA? And,</p>
<p>5. Do you have any resources that I could use to learn more about SOA and .Net?</p>
<p>I appreciate the help and any answers that you can provide.</p>
<p>Mike
</p>
</blockquote>
<p>Get it via the Dr. Dobb&#8217;s site<a href="http://ddj.com/dept/webservices/199100693">here</a>.</p>
<p>Or download directly <a href="http://www.dobbsprojects.com/media/newengine/dynamp.php/070418ud01.mp3?podcast=070418ud01.mp3">here</a>.</p>
<p><u>Additional References</u></p>
<ul>
<li><A href="http://udidahan.weblogs.us/2006/06/24/one-wrong-dll-3-months-gone/">On the importance of splitting up projects and DLLs </A></li>
<li><A href="http://www.martinfowler.com/articles/injection.html">Inversion of Control Containers and the Dependency Injection pattern&nbsp;</A></li>
</ul>
<p>Dependency Injection Tools:</p>
<ul>
<li>[.NET] <A href="http://www.springframework.net/">Spring Framework </A></li>
<li>[.NET] <A href="http://structuremap.sourceforge.net/Default.htm">StructureMap</A></li>
<li>[Java] <A href="http://www.springframework.org/">Spring Framework </A></li>
</ul>
<p>Podcasts:</p>
<ul>
<li><A href="http://udidahan.weblogs.us/2006/09/05/podcast-autonomous-services-and-pubsub/">Podcast on Autonomous Services and Pub/Sub </A></li>
<li><A href="http://udidahan.weblogs.us/2006/08/28/podcast-business-and-autonomous-components-in-soa/">Podcast on Business and Autonomous Components in SOA </A></li>
</ul>
<p>Want more? Go to the <a href="/ask-udi">&#8220;Ask Udi&#8221; archives</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2007/04/18/podcast-how-to-structure-net-solutions-and-components/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
<enclosure url="http://www.dobbsprojects.com/media/newengine/dynamp.php/070418ud01.mp3?podcast=070418ud01.mp3" length="18471057" type="audio/mp3" />
		</item>
		<item>
		<title>Put me and him in the same room and you get&#8230;</title>
		<link>http://www.udidahan.com/2006/09/19/put-me-and-him-in-the-same-room-and-you-get/</link>
		<comments>http://www.udidahan.com/2006/09/19/put-me-and-him-in-the-same-room-and-you-get/#comments</comments>
		<pubDate>Wed, 20 Sep 2006 03:16:51 +0000</pubDate>
		<dc:creator>thesoftwaresimplist</dc:creator>
				<category><![CDATA[The Team]]></category>

		<guid isPermaLink="false">http://wp_630.weblogs.us/archives/318</guid>
		<description><![CDATA[<img src="http://upload.wikimedia.org/wikipedia/en/8/8b/StatlerAndWaldorf.jpg" width="300" height="203" border="0" />
<br/><br/>
If I'm Statler, the one on the right, can you guess who's Waldorf?]]></description>
			<content:encoded><![CDATA[<p><img src="http://upload.wikimedia.org/wikipedia/en/8/8b/StatlerAndWaldorf.jpg" width="300" height="203" border="0" /></p>
<p>If I&#8217;m Statler, the one on the right, can you guess who&#8217;s Waldorf?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2006/09/19/put-me-and-him-in-the-same-room-and-you-get/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>University Syndrome</title>
		<link>http://www.udidahan.com/2004/12/04/university-syndrome/</link>
		<comments>http://www.udidahan.com/2004/12/04/university-syndrome/#comments</comments>
		<pubDate>Sat, 04 Dec 2004 18:42:22 +0000</pubDate>
		<dc:creator>thesoftwaresimplist</dc:creator>
				<category><![CDATA[The Team]]></category>

		<guid isPermaLink="false">http://wp_630.weblogs.us/archives/134</guid>
		<description><![CDATA[The other day I got to catch up with my brother, who is a predominantly Java guy, but has been doing quite a bit of C++ recently. Anyway, we were sharing our war stories when he started telling me about a recent hire afflicted with what he called &#8220;University Syndrome&#8221;. When I asked him about [...]]]></description>
			<content:encoded><![CDATA[<p>The other day I got to catch up with my brother, who is a predominantly Java guy, but has been doing quite a bit of C++ recently. Anyway, we were sharing our war stories when he started telling me about a recent hire afflicted with what he called &#8220;University Syndrome&#8221;. When I asked him about it, the dams just burst and the flood came.</p>
<p>To make a long story short, University Syndrome is found primarily in recent graduates and is characterized by finishing any work assigned as quickly as possible without any thought to maintenance, readability, or good design. Once the code &#8220;works&#8221; it is &#8220;handed in&#8221;, and the programmer doesn&#8217;t want to hear any more about it. Should the work be returned to the programmer to be fixed (made more maintainable, etc), they resent it citing the fact that the code works.</p>
<p>I&#8217;ve seen the symptoms at varying levels of severity in different programmers over the years, but I haven&#8217;t ever realized that all the symptoms are part of the same syndrome. After thinking about it a bit, I realized that the universities do, in fact, encourage this kind of behavior, without even realizing it. Assignments to write code that solves a specific problem are given, with a deadline for handing working code in. Combine this with the &#8220;Student Syndrome&#8221; <a href="http://www.jrothman.com/weblog/htpblogger.html">Johanna Rothman</a> writes about (where students leave everything to the last possible second), and you have prime conditions for the University Syndrome to take root. By and large, students aren&#8217;t graded on the quality of their code. Rather, automated tests are used to verify that the code will produce the appropriate set of outputs for a known given set of inputs. Only in cases where the tests don&#8217;t all pass, will the teaching assistants <i>possibly</i> take the time out to look at the code.</p>
<p>I know that this is something of a generalization about universities and their curriculum, however, this does match what I&#8217;ve heard from graduates from many institutions around the world.</p>
<p>So, should someone on your team exhibit some of the symptoms above, you need to understand what the cause is, and that this person has been &#8220;brainwashed&#8221; for 3-4 years that this is how software is developed. Be patient, with time they can grow out of these old habits and become quite productive. In my brother&#8217;s case, he used shock therapy. He did a code walkthrough of several parts of the system showing the programmer how things were supposed to be done. The programmer was shocked out of their unproductive behavior and they all lived happily ever after.</p>
<p>The end.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2004/12/04/university-syndrome/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Specialists bring special problems</title>
		<link>http://www.udidahan.com/2003/11/09/specialists-bring-special-problems/</link>
		<comments>http://www.udidahan.com/2003/11/09/specialists-bring-special-problems/#comments</comments>
		<pubDate>Mon, 10 Nov 2003 04:35:26 +0000</pubDate>
		<dc:creator>thesoftwaresimplist</dc:creator>
				<category><![CDATA[The Team]]></category>

		<guid isPermaLink="false">http://wp_630.weblogs.us/archives/7</guid>
		<description><![CDATA[I was going to start getting into architecture, requirements, users and all that, but I have to bring up a more important topic first. Its specialists. You know them, architects, programmers, UI designers, requirements engineers, managers, the whole lot of them. In order to be called a specialist, these people have to totally devote themselves to their field, work at it religiously, and have no clue about anything else. Add to that a healthy dose of ego and an inate ability to speak without communicating, and it really is wonderous when the project actually is a "success". Mind you, I've run into seriously questionable successes in my time. Over-budget, late, and pisses off its users, a project is still labeled a success, god only knows how. I guess that none of the stakeholders can really afford to own up to the failure glaring them in the face.

Are specialists bad for a project ? No. You need some specialists to take care of the special stuff that you run into in every project. But this special stuff really amounts to less than 10% of the total project.

The major problem that specialists cause a project is decision-making. Any non-trivial decision requires your DBA, Data Access team leader, Infrastructure manager, Sysadmin, etc... Why ? Because none of them have the skills/knowledge to make a decision by themselves. Anyone ever try to reach a consensus between 5+ people on any non-trivial issue ? How about when they each come from different backgrounds and, in many cases, trivialize each others fields and contribution to the project ?

What I'm trying to get at is something quite fundamental - the team makes the project. Or breaks it. Teams of specialists have a hard time becoming a team. A cohesive unit. Of course, organizationally speaking, we are usually thrust into these "teams" with little or no say as to how decisions should be made. 

The only viable, cohesive, simple solution is to have a technical, project wide, lead. The lead must be all things - manager, architect, designer, tester, developer, DBA - everything. This doesn't mean that they are a specialist in each one of those fields. Rather, they understand all the interdependancies, the project-wide implications a decision will have, and call upon the specialists when needed. One would imagine that such a person be hard to find. And that's true. But, what if you cultivated them ? What if you rotated developers, testers, sysadmins, dba's, and yes, even the team leaders and block managers ( those in charge of a specific, domain part of the system - think Aero, Indigo ) ? The good ones would bubble to the top every time. People would have to be quick on their feet. They couldn't take forever making decisions. Low level decisions would be made by people more knowledgable about the project-wide affects of local changes.

Although this lead becomes the bottleneck of the system from a strictly theoretical view, they really alleviate the practical bottleneck - the cumbersome decision making process.

In large multi-year projects, teams of specialists roam the terrain, like dinosaurs, preying on each other. Each with their own agenda and hierarchy. I think its time for evolution. Don't you ?

Tell me about your experiences with decision-making processes. What are the symptoms of a bad process ? What are the roots ? What can be done ?]]></description>
			<content:encoded><![CDATA[<p>I was going to start getting into architecture, requirements, users and all that, but I have to bring up a more important topic first. Its specialists. You know them, architects, programmers, UI designers, requirements engineers, managers, the whole lot of them. In order to be called a specialist, these people have to totally devote themselves to their field, work at it religiously, and have no clue about anything else. Add to that a healthy dose of ego and an inate ability to speak without communicating, and it really is wonderous when the project actually is a &#8220;success&#8221;. Mind you, I&#8217;ve run into seriously questionable successes in my time. Over-budget, late, and pisses off its users, a project is still labeled a success, god only knows how. I guess that none of the stakeholders can really afford to own up to the failure glaring them in the face. Are specialists bad for a project ? No. You need some specialists to take care of the special stuff that you run into in every project. But this special stuff really amounts to less than 10% of the total project. The major problem that specialists cause a project is decision-making. Any non-trivial decision requires your DBA, Data Access team leader, Infrastructure manager, Sysadmin, etc&#8230; Why ? Because none of them have the skills/knowledge to make a decision by themselves. Anyone ever try to reach a consensus between 5+ people on any non-trivial issue ? How about when they each come from different backgrounds and, in many cases, trivialize each others fields and contribution to the project ? What I&#8217;m trying to get at is something quite fundamental &#8211; the team makes the project. Or breaks it. Teams of specialists have a hard time becoming a team. A cohesive unit. Of course, organizationally speaking, we are usually thrust into these &#8220;teams&#8221; with little or no say as to how decisions should be made. The only viable, cohesive, simple solution is to have a technical, project wide, lead. The lead must be all things &#8211; manager, architect, designer, tester, developer, DBA &#8211; everything. This doesn&#8217;t mean that they are a specialist in each one of those fields. Rather, they understand all the interdependancies, the project-wide implications a decision will have, and call upon the specialists when needed. One would imagine that such a person be hard to find. And that&#8217;s true. But, what if you cultivated them ? What if you rotated developers, testers, sysadmins, dba&#8217;s, and yes, even the team leaders and block managers ( those in charge of a specific, domain part of the system &#8211; think Aero, Indigo ) ? The good ones would bubble to the top every time. People would have to be quick on their feet. They couldn&#8217;t take forever making decisions. Low level decisions would be made by people more knowledgable about the project-wide affects of local changes. Although this lead becomes the bottleneck of the system from a strictly theoretical view, they really alleviate the practical bottleneck &#8211; the cumbersome decision making process. In large multi-year projects, teams of specialists roam the terrain, like dinosaurs, preying on each other. Each with their own agenda and hierarchy. I think its time for evolution. Don&#8217;t you ? Tell me about your experiences with decision-making processes. What are the symptoms of a bad process ? What are the roots ? What can be done ?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.udidahan.com/2003/11/09/specialists-bring-special-problems/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

