<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.2.3" -->
<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/"
	>

<channel>
	<title>spencegreen.com &#187; Software</title>
	<link>http://www.spencegreen.com</link>
	<description>Software, business, writing, the Arabic language, and travel.</description>
	<pubDate>Sun, 03 Aug 2008 17:10:16 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.2.3</generator>
	<language>en</language>
			<item>
		<title>The Brave New World, Briefly Revisited</title>
		<link>http://www.spencegreen.com/2008/05/16/the-brave-new-world-briefly-revisited/</link>
		<comments>http://www.spencegreen.com/2008/05/16/the-brave-new-world-briefly-revisited/#comments</comments>
		<pubDate>Fri, 16 May 2008 16:18:45 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
		
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.spencegreen.com/2008/05/16/the-brave-new-world-briefly-revisited/</guid>
		<description><![CDATA[The Toyota Production System (TPS) was the progenitor for a variety of change-oriented manufacturing techniques. Six-sigma, Lean, and other such constructs trace their heritage to TPS. Because Agile methodologies were influenced by &#8220;lean&#8221; thinking and an abhorrence of &#8220;Big M&#8221; processes, they too have eastern roots. For me, the allure of Agile methods, regardless of [...]]]></description>
			<content:encoded><![CDATA[<p>The Toyota Production System (TPS) was the progenitor for a variety of change-oriented manufacturing techniques. Six-sigma, Lean, and other such constructs trace their heritage to TPS. Because Agile methodologies were influenced by &#8220;lean&#8221; thinking and an abhorrence of &#8220;Big M&#8221; processes, they too have eastern roots. For me, the allure of Agile methods, regardless of flavor, has always been the recognition of software as a human act: Programmers are not automata on an assembly-line tacking trunk lids to mechanical foetuses. Incidentally, the Japanese reached the same conclusion decades ago, <a target="_blank" href="http://www.toyotageorgetown.com/tps.asp">as described by Teruyuki Minoura</a>, a Toyota executive:</p>
<div style="margin-left: 10px; background-color: #ffffcc">
&#8220;An environment where people have to think brings with it wisdom, and this wisdom brings with it <em>kaizen </em>(continuous improvement),&#8221; notes Minoura. &#8220;If asked to produce only one unit at a time, to produce according to the flow, a typical line worker is likely to be flummoxed. It&#8217;s a basic characteristic of human beings that they develop wisdom from being put under pressure. Perhaps the greatest strength of the Toyota Production System is the way it develops people.&#8221;</p>
<p>There can be no successful <em>monozukuri </em>(making thing) without <em>hito-zukuri </em>(making people). To keep coming up with revolutionary new production techniques, we need to develop unique ideas and knowledge by thinking about problems in terms of <em>genchi genbutsu</em>. This means it&#8217;s necessary to think about how we can develop people who can come up with these ideas. As our operations become increasingly global, there&#8217;s also a need to think how to implant the Toyota DNA in our overseas personnel.&#8221;
</div>
<p><img width="400" src="/pics/posts/tps_house_diagram.jpg" alt="Toyota Production Control System House Diagram" height="290" style="width: 400px; height: 290px" title="Toyota Production Control System House Diagram" /></p>
<p>This is why software development at large, legacy corporations can be so stultifying. In his <a target="_blank" href="http://www.computer.org/portal/site/computer/menuitem.5d61c1d591162e4b0ef1bd108bcd45f3/index.jsp?&amp;pName=computer_level1_article&amp;TheCat=1005&amp;path=computer/homepage/0308&amp;file=cover.xml&amp;xsl=article.xsl&amp;">prescient IEEE Computer article</a>, Barry Boehm labels the &#8220;That&#8217;s How We&#8217;ve Always Done It&#8221; (THWADI) attitude as a paralyzing disability in the rapidly changing software world:</p>
<div style="margin-left: 10px; background-color: #ffffcc">
&#8220;There will be a lot of tensions between people and organizations rapidly adapting to change and those who prefer not to. A good example nowadays is the interaction between software developers trying to be adaptive to change within fixed-price, build-to-specification software contract structures determined by administrators practicing THWADI (That&#8217;s How We&#8217;ve Always Done It).</p>
<p>Of course, some THWADI is good. We will need to separate obsolete practices from enduring principles that need to be conserved.</p>
<p>Some other implications for software engineers&#8217; careers are that learning how to learn will be more important than learning things&#8230;&#8221;
</p></div>
<p>Software teams that grasp this reality and its implications &#8220;look&#8221; and &#8220;feel&#8221; different from the moribund organizations that churn out the same old <a target="_blank" href="http://www.joelonsoftware.com/items/2008/05/01.html">Micro-crap</a>. <a target="_blank" href="http://www.se-radio.net/podcast/2008-05/episode-95-new-guardiancouk-website-matt-wall-and-erik-doernenburg">The Guardian&#8217;s web team</a> is a recent example of the former that comes to mind.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.spencegreen.com/2008/05/16/the-brave-new-world-briefly-revisited/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Knuth on Software</title>
		<link>http://www.spencegreen.com/2008/05/06/knuth-on-software/</link>
		<comments>http://www.spencegreen.com/2008/05/06/knuth-on-software/#comments</comments>
		<pubDate>Tue, 06 May 2008 17:31:41 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
		
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.spencegreen.com/2008/05/06/knuth-on-software/</guid>
		<description><![CDATA[Much attention has been paid to Knuth&#8217;s recent interview on Informit. The Slashdot thread shows all the signs of a flame war, and the blogosphere has evidenced a vigorous response as well. The maelstrom has two focii: Knuth&#8217;s rejection of most eXtreme programming (XP) practices and his admission that he wouldn&#8217;t &#8220;be surprised at all if [...]]]></description>
			<content:encoded><![CDATA[<p>Much attention has been paid to <a target="_blank" href="http://www.informit.com/articles/article.aspx?p=1193856">Knuth&#8217;s recent interview on Informit</a>. The <a target="_blank" href="http://tech.slashdot.org/article.pl?sid=08/04/26/1627248&amp;from=rss">Slashdot thread</a> shows all the signs of a flame war, and the blogosphere has evidenced a vigorous response as well. The maelstrom has two focii: Knuth&#8217;s rejection of most eXtreme programming (XP) practices and his admission that he wouldn&#8217;t &#8220;be surprised at all if the whole multithreading idea turns out to be a flop.&#8221; To him, the emergence of multicore processors &#8221;looks more or less like the hardware designers have run out of ideas, and that they’re trying to pass the blame for the future demise of Moore’s Law to the software writers by giving us machines that work faster only on a few key benchmarks!&#8221; Revisions of TAOCP will not contain parallized versions of his algorithms, nor will he devote significant research time to the subject.</p>
<p>These criticisms are unremarkable. <a target="_blank" href="http://www.codinghorror.com/blog/archives/000655.html">Jeff Atwood</a>, among others, labeled the multicore hype an extension of the clock-speed race in the late 90&#8217;s. 900MHz is better than 700Mhz, so four cores must be better than two. Right? So say the marketing panjandrams. Most consumers lack a rudimentary understanding of computer architecture, so marketers need a comprehensible &#8220;hook.&#8221; Core count, like clock speed, seems analogous to horsepower, torque, and other &#8220;power&#8221; metrics. Consumers need such a gimick.</p>
<p>The criticism of Agile is even less significant. Agile introduces practices that good programmers intuitively follow. Knuth is a good programmer, and he does not need advice.</p>
<p>What the masses seem to have missed was this insight into Knuth&#8217;s working habits:</p>
<div style="margin-left: 10px; background-color: #ffffcc">
My general working style is to <strong>write everything first with pencil and paper</strong>, sitting beside a big wastebasket. Then I use Emacs to enter the text into my machine, using the conventions of TeX. I use tex, dvips, and gv to see the results, which appear on my screen almost instantaneously these days. I check my math with Mathematica.</p>
<p><strong>I program every algorithm that’s discussed</strong> (so that I can thoroughly understand it) using CWEB, which works splendidly with the GDB debugger. I make the illustrations with <a href="http://en.wikipedia.org/wiki/METAPOST">MetaPost</a> (or, in rare cases, on a Mac with Adobe Photoshop or Illustrator). I have some homemade tools, like my own spell-checker for TeX and CWEB within Emacs. <strong>I designed my own bitmap font for use with Emacs, because I hate the way the ASCII apostrophe and the left open quote have morphed into independent symbols that no longer match each other visually.</strong> I have special Emacs modes to help me classify all the tens of thousands of papers and notes in my files, and special Emacs keyboard shortcuts that make bookwriting a little bit like playing an organ. I prefer <a href="http://en.wikipedia.org/wiki/Rxvt">rxvt</a> to xterm for terminal input. Since last December, I’ve been using a file backup system called <a href="http://sourceforge.net/projects/backupfs">backupfs</a>, which meets my need beautifully to archive the daily state of every file.</p>
<p>I currently use <a href="http://www.ubuntu.com/">Ubuntu Linux</a>, on a standalone laptop—<strong>it has no Internet connection</strong>. I occasionally carry flash memory drives between this machine and the Macs that I use for network surfing and graphics; but I trust my family jewels only to Linux.
</div>
<p>This passage reveals the character of genius, which is realized through these disciplines:</p>
<ul>
<li>Real progress comes not from independent ideas, but from the careful accumulation and synthesis of quality information.</li>
<li>Understanding comes through action. Knuth does not jsut write about algorithms. He programs them, dissects them, and then disseminates them.</li>
<li>Distractions must be minimized. Complicating access to the internet during the work day is one of the best ways to start.</li>
<li>Real genius cannot be separated from art, which has much to do with taste. In the 70&#8217;s, Knuth grew tired of visually imprecise electronic typesetting systems. His frustration must not have been unique, but his ability to identify, decompose, and solve it was.</li>
</ul>
<p>Edward Said once wrote that the American university remains the only refuge for those interested in reflection and the refinement of the intellect. What must be considered is that personal habits&#8211;not just talent and environment&#8211;have much to do with the expansion of human knowledge.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.spencegreen.com/2008/05/06/knuth-on-software/feed/</wfw:commentRss>
		</item>
		<item>
		<title>An Exchange</title>
		<link>http://www.spencegreen.com/2008/03/27/an-exchange/</link>
		<comments>http://www.spencegreen.com/2008/03/27/an-exchange/#comments</comments>
		<pubDate>Thu, 27 Mar 2008 19:29:34 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
		
		<category><![CDATA[Management]]></category>

		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.spencegreen.com/2008/03/27/an-exchange/</guid>
		<description><![CDATA[A colleague wrote the following note to me today:
I am trying to fathom what you have against an additional library into the architecture. The AJAX framework provided by MS$ is an additional library we have to use, there are Oracle libraries we have to use…what is the roadblock you have with an IronRuby, IronPython, or [...]]]></description>
			<content:encoded><![CDATA[<p>A colleague wrote the following note to me today:</p>
<p style="margin-left: 10px; background-color: #ffffcc">I am trying to fathom what you have against an additional library into the architecture. The AJAX framework provided by MS$ is an additional library we have to use, there are Oracle libraries we have to use…what is the roadblock you have with an IronRuby, IronPython, or Lua library? Limiting the number of libraries, selective in the process is essential, but if to restrictive, can ignore industry standard flexibility in our system.</p>
<p>My reply follows:<br />
I&#8217;m not limiting the inclusion of other libraries. I prefer to think about the problem first, then select the best method of expression. Language is simply that: a method of expression. It is almost always better to program in the language&#8211;namely, through the use of native syntax&#8211;than to program through it. The latter mode is a common mistake: have you ever seen someone write Java as if it were C?</p>
<p>An ad hoc approach is the alternative. In this case, we choose technologies first and solve problems later. This technique is used often in OSS. Here you must recall the essential difference between commercial software development and experimentation. Read <a href="http://blogs.msdn.com/ericlippert/archive/2003/10/28/53298.aspx">this post</a>.</p>
<p>We don&#8217;t exercise all of those steps here because we don&#8217;t do proper software development. The lesson, however, is this: the decisions that you make as a coder have lifecycle costs associated with them. Think about it: you include library X. We have to learn that technology. I&amp;T has to test it. CM has to integrate it into the nightly builds. Maintenance has to update it, changing custom code as necessary. A whole succession of maintenance programmers for the next 5-10 years must follow this process.</p>
<p>You must also consider the risk of the technology disappearing during the software&#8217;s lifecycle. This is always a risk in software, but it can be approached intelligently. Microsoft has made a significant capital investment in .NET, and they have included AJAX in .NET 3.5. Moreover, other companies have staked their viability on .NET (incidentally, this is the anti-trust argument against Windows in the enterprise space: companies cannot afford to move away from it). Can you say the same for other technologies? Perl was the &#8220;next&#8221; silver bullet in 1995, but we are still waiting on Perl 6. In the meantime, it has been superseded by faster bullets: Python, Ruby, and Scheme.</p>
<p>I recommend that you read the book <a target="_blank" href="http://www.amazon.com/Beyond-Software-Architecture-Sustaining-Addison-Wesley/dp/0201775948/ref=pd_bbs_sr_1?ie=UTF8&amp;s=books&amp;qid=1206646052&amp;sr=8-1">Beyond Software Architecture </a>by Hohmann. Technology decisions cannot be made in isolation because they impact the business. The converse is also true. We must always be thinking not only in terms of &#8220;wow, this is cool&#8221;, but also in light of the question: &#8220;Does this make good, long-term business sense?&#8221;</p>
<p>I&#8217;m not trying to limit your creative freedom. I am trying to show you that we must make considered decisions at this point in the &#8220;<a target="_blank" href="http://www.amazon.com/Software-Estimation-Demystifying-Practices-Microsoft/dp/0735605351/ref=pd_bbs_sr_1?ie=UTF8&amp;s=books&amp;qid=1206646116&amp;sr=1-1">cone of uncertainty</a>.&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.spencegreen.com/2008/03/27/an-exchange/feed/</wfw:commentRss>
		</item>
		<item>
		<title>A Plan for Software Architecture</title>
		<link>http://www.spencegreen.com/2008/02/22/a-plan-for-software-architecture/</link>
		<comments>http://www.spencegreen.com/2008/02/22/a-plan-for-software-architecture/#comments</comments>
		<pubDate>Sat, 23 Feb 2008 00:36:45 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
		
		<category><![CDATA[Design]]></category>

		<guid isPermaLink="false">http://www.spencegreen.com/2008/02/22/a-plan-for-software-architecture/</guid>
		<description><![CDATA[Software engineers do not often have the luxury of designing new systems from first principles. It is frequently the case that they must labor through some dreary chore, such as implementing version 49 of the SuperWhamo! application, or adhering to design constraints imposed not by reason, but by suits. When that rare opportunity to write [...]]]></description>
			<content:encoded><![CDATA[<p>Software engineers do not often have the luxury of designing new systems from first principles. It is frequently the case that they must labor through some dreary chore, such as implementing version 49 of the SuperWhamo! application, or adhering to design constraints imposed not by reason, but by suits. When that rare opportunity to write new code does present itself, two paths are possible. The coder leaps into development, but the architect tries first to solve the problem. This essay contains my observations on the latter approach.</p>
<p><strong>Solve the Problem</strong><br />
Every good system solves a problem, which is often elusive. Think about any famous product and try to describe it with a single sentence or a single image. What does the iPod do? It allows you carry digital audio with you. Google? It lets you find relevant stuff on the Internet. Linux? The world needs a good, free operating system. This is not a pedantic exercise. It took me three months of reading and observation to discover the purpose of a recent project. Not a single person in our organization could articulate the system&#8217;s raison d&#8217;etre clearly, and I found that when I could, my design work took on a new level of coherence. What does the system do and why does it do it? Why is it useful? Answering these questions can go a long way toward unifying the design process. If the questions can&#8217;t be answered, then it might be prudent to <a href="http://gettingreal.37signals.com/toc.php" target="_blank">get real</a> and kill the project.</p>
<p><strong>Write It Down</strong><br />
Once the system concept becomes clear, write a detailed spec. Specs serve several purposes:</p>
<ul>
<li><strong>A reason to think</strong>: Writing is a specific activity whereas conversation and drawing are often unspecific. If you write, &#8220;The system should have a login page,&#8221; and then reflect on that statement, then you immediately realize the need for more detail. What does the page look like? What screen elements does it have? What text does it display? The answers to these questions are all requirements that go into the spec.</li>
<li><strong>A common design decision repository</strong>: The login page&#8217;s design details need a persistent home. Engineers, just like football players, need to operate from a common playbook. This is why email, PowerPoint, and the lauded whiteboard are not suitable design media: they are not permanent.</li>
<li><strong>A context</strong>: Our system has more than a login page. What is the next page in the interface hierarchy? How does authentication work? Where is user information stored? It is impossible to construct software without knowledge of context.</li>
</ul>
<p>Software specs exist in myriad degrees of formality, breadth, and depth. But <a href="http://www.joelonsoftware.com/articles/fog0000000036.html" target="_blank">the most important thing is that they exist</a> at the beginning:</p>
<p style="margin-left: 10px; background-color: #ffffcc"> Writing a spec is a great way to nail down all those irritating design decisions, large and small, that get covered up if you don&#8217;t have a spec. Even small decisions can get nailed down with a spec. For example, if you&#8217;re building a web site with membership, you might all agree that if the user forgets their password, you&#8217;ll mail it to them. Great. But that&#8217;s not enough to write the code. To write the code, you need to know the actual words in that email.</p>
<p>I don&#8217;t advocate Joel&#8217;s informal approach to specs. His method may be sufficient for designing web sites and business systems, but it cannot be used for Space Shuttle avionics or air defense systems. You wouldn&#8217;t use the instructions that came with your Coleman tent to build the Empire State building. The IEEE830-1998 standard is a better reference.</p>
<p><strong>Draw It</strong><br />
Any software architect will quickly learn that it is difficult to model a system in its entirety. The software blueprint will probably never exist, a conclusion reached by the <a href="http://agilemanifesto.org/" target="_blank">Agile crowd</a>  a decade ago. Metaformats suffer from a variety of issues, including:</p>
<ul>
<li><strong>Inability to represent the whole system</strong>: The <a href="http://martinfowler.com/bliki/UmlAsBlueprint.html" target="_blank">UML As Blueprint people</a> have in mind the &#8220;exploded&#8221; view of systems that is so useful to mechanical engineers. Software is not tangible, though, meaning that it can behave strangely. Try to model a recursive function in UML and you&#8217;ll notice the problem.</li>
<li><strong>A certain level of &#8220;OO-ness&#8221;</strong>: The existence of &#8220;Class diagrams&#8221; in UML reveals its intellectual heritage. But system architects shouldn&#8217;t think in terms of classes, which are like cells in a body. We must first decide if the body should have two arms or three, not the number of cells in each arm.</li>
<li><strong>Time to develop</strong>: Drawing diagrams takes time that could be used to actually write the code. This is particularly true of interfaces. A good Interface Control Document (ICD) and an interface definition are infinitely more valuable than a diagram. Once coding begins, diagrams are often discarded. Why were they created at all?</li>
</ul>
<p>A <a href="http://blog.softwarearchitecture.com/2007/07/good-architecture-descriptions-are_03.html" target="_blank">multi-faceted approach</a> to design seems more prudent. I prefer a combination of tables (for data definitions), sequence diagrams (for modeling interactions between systems), flow charts (for designing processes), schemas (for databases and XML formats) and natural language requirements. If done properly, the latter can be remarkably effective. Like a good specification, an <a href="http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?tp=&amp;arnumber=720574&amp;isnumber=15571" target="_blank">effective natural language requirement</a> should be:</p>
<p style="margin-left: 10px; background-color: #ffffcc"> Correct;<br />
Unambiguous;<br />
Complete;<br />
Consistent;<br />
Verifable;<br />
Modifable;<br />
Traceable</p>
<p>Good specs and designs do not guarantee success. As in the entrepreneurial world, good plans do not make rich men. Execution matters.</p>
<p><strong>Build the Organization</strong><br />
This is the most misunderstood diagram in software development:</p>
<p><img src="/pics/posts/sys_soft_ipt_triangle.jpg" title="The Systems/IPT/Software Triangle" alt="The Systems/IPT/Software Triangle" height="273" width="400" /></p>
<p>Systems engineers design the systems that developers implement. Developers should not make judgments about how the user should behave. Likewise, systems engineers should not decide how to implement code. These competing interests need an arbitrator. In this diagram, I have called him an Integrated Product Team (IPT) lead after the Chrysler convention. Microsoft calls him a PM. Whatever his label, he knows enough about systems and software to mediate between the engineering factions. He also understands the business objectives, and can make the difficult distinction between too much schedule pressure, which harms analysis, and too much analysis, which leads to paralysis. He becomes the technical authority, the &#8220;System Solon&#8221;. Most importantly, he is at the top of the triangle. If software engineering dominates, then cross-cutting attributes such as performance may not be properly evaluated. If systems engineering sets the project tone, then code-level technical insights&#8211;&#8221;bottom-up&#8221; analysis&#8211;may be ignored. The Solon is the bulwark against both outcomes.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.spencegreen.com/2008/02/22/a-plan-for-software-architecture/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The Iowa Theory</title>
		<link>http://www.spencegreen.com/2008/02/07/the-iowa-theory/</link>
		<comments>http://www.spencegreen.com/2008/02/07/the-iowa-theory/#comments</comments>
		<pubDate>Thu, 07 Feb 2008 23:24:40 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
		
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.spencegreen.com/2008/02/07/the-iowa-theory/</guid>
		<description><![CDATA[After reading Steve McConnell&#8217;s Software Estimation: Demystifying the Black Art, I called a friend to discuss my newfound insight. Like a child who first learns to write his name, I circled around the central object for no less than 15 minutes. Software is hard in a &#8220;different&#8221; way! We need statistical methods and mountains of [...]]]></description>
			<content:encoded><![CDATA[<p>After reading Steve McConnell&#8217;s <em><a target="_blank" href="http://www.amazon.com/Software-Estimation-Demystifying-Practices-Microsoft/dp/0735605351/ref=pd_bbs_sr_1?ie=UTF8&amp;s=books&amp;qid=1202426020&amp;sr=8-1">Software Estimation: Demystifying the Black Art</a></em>, I called a friend to discuss my newfound insight. Like a child who first learns to write his name, I circled around the central object for no less than 15 minutes. Software is hard in a &#8220;different&#8221; way! We need statistical methods and mountains of historical data to estimate it properly! Heed these commands or perish! Now my friend is an architect, and she was not moved by this euphoria.</p>
<p>&#8220;Are you telling me that your software is more complicated than the Burj Dubai? No one has ever built a building that tall. Moreover, the water table is one meter below the sand, so the whole structure is founded upon a massive concrete pad. Your software has greater complexity?&#8221;</p>
<p><img align="middle" width="300" src="/pics/posts/burj_dubai.jpg" alt="Burj Dubai under construction in Dubai, UAE." height="366" style="width: 300px; height: 366px" title="Burj Dubai under construction in Dubai, UAE." /></p>
<p>Her response stymied me. Some pieces of software exceed that building in complexity by orders of magnitude&#8211;the Space Shuttle software, avionics controllers on the Airbus A380, Windows Vista&#8211;but how many of us work on those systems? Most engineers slave away on J2EE business platforms, or better yet, &#8220;In house&#8221; software [link] that solve mundane problems as inelegantly as possible. Not to be stopped, I posited a second argument: software is free from physical constraints, thereby enlarging the solution space. A bridge&#8217;s incline, for instance, is limited by the coefficient of friction between the road surface and a car tire: vertical bridges may be possible, but they are not useful.</p>
<p>&#8220;Innovation in building has never been more rapid or unbounded,&#8221; she countered, &#8220;Computer modeling makes unprecedented structures possible today. Although inconveniences like gravity do limit design to an extent, they are probably no more limiting than the constraints imposed upon you by APIs and frameworks. Just look at the Walt Disney Opera House in LA.&#8221;</p>
<p><img width="400" src="/pics/posts/disney_concert_hall.jpg" alt="Walt Disney Concert Hall. Los Angeles, CA." height="273" style="width: 400px; height: 273px" title="Walt Disney Concert Hall. Los Angeles, CA." /></p>
<p>The abstract nature of software is therefore not a reasonable excuse for 99.9% of late software projects. Most of us aren&#8217;t &#8220;in technology&#8221;: we use tools and methodologies that academics developed years ago. <strong>You&#8217;re not on the bleeding edge</strong>. <strong>Get over yourself</strong>.</p>
<p>I finally advanced an enervated argument based on estimation: it&#8217;s hard to finish software on time because software design is difficult to estimate. How long will it take you to finish your math homework? How long does it take to solve a Sudoku puzzle? How long does it take to catch three fish? We&#8217;re trying to predict an unpredictable task riddled with risk.</p>
<p>&#8220;How long does it take to design anything new? Architects deal with unreasonable requirements, unreasonable customers, and unreasonable deadlines. How long will it take me to design a building down to its moldings and handrails? I&#8217;ll tell you how long: a lot of sleepless nights. You can only estimate something if you&#8217;ve done it before.&#8221;</p>
<p>And this is precisely McConnell&#8217;s thesis. Unfortunately, expert opinion is not a sufficient resource. Historical data, on the other hand, has been used in study after study to achieve reliably accurate software estimates. Productivity is an organizational thing, so one organization&#8217;s data may not apply to another organization&#8217;s projects. Do you think <em>that</em> expert who has worked at 10 different companies can give you a useful estimate based on judgment?</p>
<p>So why are software projects late? I see three problems:</p>
<p><strong>Bad requirements</strong>&#8211;Ask yourself these questions: does your organization employ a professionally-trained requirements engineer? Hold requirements inspections? Version control requirements at the line-item level? Link those line-items to code? Maintain requirements throughout the entire system lifecycle, including maintenance?</p>
<p><strong>Brooks&#8217;s Law</strong>&#8211;<a target="_blank" href="http://stevemcconnell.com/ieeesoftware/eic08.htm">Adding people to a late project makes it later</a>. Graph theory holds the proof to this axiomatic observation. Adding more nodes to a connected graph makes the edge count increase exponentially, not linearly. This is why the scheduling equation to convert staff months to schedule months&#8211;the most &#8220;agreed-upon&#8221; equation in software&#8211;has a coefficient and an exponent.</p>
<p><strong>The Iowa Theory</strong>&#8211;Software engineers are unwilling to do the book-keeping work necessary to make large projects succeed because their brains are trained to look for optimal solutions. Associating requirements with code is tedious, but necessary. Drawing algorithm diagrams is tedious, but necessary. Managing software change is tedious, but necessary. But as software engineers, we think these tasks should be easier. Tools exist to make them effortless&#8211;the Telelogic Lifecycle suite, for example&#8211;but most organizations don&#8217;t invest money in these solutions. So software engineers gripe about tools, and go back to hacking. When we will admit that we&#8217;re part of the problem?</p>
<p>Consider the <a target="_blank" href="http://en.wikipedia.org/wiki/USS_Iowa_%28BB-61%29">USS Iowa</a>. Her keel was laid down in June 1940 and completed in August 1942. She was 890 feet long, could shoot 1225kg shells over 40km, and could cruise at 30 knots. She was built when the country&#8217;s survival was at stake. Does your project have that kind of schedule pressure? <em>She was designed by hand, using pencils, paper, and slide rules</em>. Think about that. All that complexity was managed with filing cabinets, folders, and blueprints. Are software engineers willing to exert that kind of effort?</p>
<p><img width="400" src="/pics/posts/uss_iowa.jpg" alt="USS Iowa (BB-61)" height="510" style="width: 400px; height: 510px" title="USS Iowa (BB-61)" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.spencegreen.com/2008/02/07/the-iowa-theory/feed/</wfw:commentRss>
		</item>
		<item>
		<title>How to Task Programmers</title>
		<link>http://www.spencegreen.com/2008/01/31/how-to-task-programmers/</link>
		<comments>http://www.spencegreen.com/2008/01/31/how-to-task-programmers/#comments</comments>
		<pubDate>Fri, 01 Feb 2008 03:24:47 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
		
		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://www.spencegreen.com/2008/01/31/how-to-task-programmers/</guid>
		<description><![CDATA[The key to efficient programmer tasking involves telling programmers exactly what to do and then allowing them the space to do it. Practically, this means providing them with specific development tasks in a sequential order. If the project&#8217;s tasking model can achieve these mischievously difficult conditions, then programmers can enter the &#8216;Flow&#8217;, which is impossible [...]]]></description>
			<content:encoded><![CDATA[<p>The key to efficient programmer tasking involves telling programmers exactly what to do and then allowing them the space to do it. Practically, this means providing them with specific development tasks in a <a href="http://www.joelonsoftware.com/articles/fog0000000022.html" target="_blank">sequential order</a>. If the project&#8217;s tasking model can achieve these mischievously difficult conditions, then programmers can enter <a href="http://www.43folders.com/2006/02/09/flow" target="_blank">the &#8216;Flow&#8217;</a>, which is <a href="http://portal.acm.org/citation.cfm?id=1181777" target="_blank">impossible with heavy context-switching</a>.</p>
<p>Below, I describe the task model used in my team&#8217;s software process. An iterative software project has three task types:</p>
<ul>
<li><strong>Non-technical</strong>: Any task not associated with code. Includes most work completed during the Preparation phase. Design schematics, system-level use cases, and whitepapers are all non-technical tasks.</li>
<li><strong>Implementation Request (IR)</strong>: Directly associated with both a Level2 software requirement and the code that implements the requirement.</li>
<li><strong>Change Request (CR)</strong>: Directly associated with a change to an existing requirement and the code that implements that change.</li>
</ul>
<p>An effective tasking model has several key requirements:</p>
<ul>
<li><strong>Unambiguously answers &#8220;What&#8221;</strong>: The task data object should include a title, detailed work instructions, and links to relevant documentation.</li>
<li><strong>Enables Easy Estimate Tracking</strong>: An engineer must be able to enter labor estimates AND evaluate his performance.</li>
<li><strong>Associates Tasks with Exit Criteria</strong>: Each task should be associated with a reviewable work product.</li>
</ul>
<p>Finally, each engineer should have a personalized view of his work assignments that is not cluttered by unrelated tasks. He can immediately determine not only the current day&#8217;s objective, but also his future workload.</p>
<p><strong>Organization </strong><br />
All tasks should appear in centralized container that is <em>collectively owned</em>, ie all programmers have write permissions to it. Most web-based project management tools (FogBugz, Basecamp) and enterprise portal platforms (OpenText Livelink, Microsoft Sharepoint) can satisfy this requirement. Tasks are organized in the &#8220;To do List&#8221; using the following abstractions:</p>
<ul>
<li>Tasks: Each of which is associated with a task group.</li>
<li>Task Groups: A collection of tasks associated with a milestone.</li>
<li>Milestones: Date upon which a specific business objective must be accomplished. A milestone frequently coincides with a Work Product Inspection (WPI).</li>
</ul>
<p>If your project management tool is integrated with both your requirements management system and you change management (CM) tool, then you can use the same organizer for IRs and CRs. Otherwise, you must create a separate tasking model in your CM package.</p>
<p><strong>What to Do Next </strong><br />
Programmers should receive an email notification after a task is assigned to them. They must then provide estimates:</p>
<ul>
<li>Set due dates for each milestones.</li>
<li>Set due dates and durations for each of your tasks relative to the associated milestones.</li>
<li>Add any missing tasks</li>
<li>Provide work estimates.</li>
</ul>
<p><strong>IMPORTANT</strong>: Programmers should not change task due dates if they encounter a delay! The tasking activity has little benefit unless programmers improve their personal estimation skills. When an engineer changes a task status to &#8216;Completed&#8217;, the task manager will record the differential between the estimated &#8216;Due Date&#8217; and the &#8216;Completed Date&#8217;. Programmers should challenge themselves to minimize this interval.</p>
<p><strong>A Daily Regime&#8230;</strong><br />
Programmers start their days with the following process:</p>
<ul>
<li>Review current task assignments.</li>
<li>Set a task&#8217;s status to &#8216;In Process&#8217; when starting work; change the status to &#8216;Completed&#8217; after finishing the task.</li>
<li>Add new tasks as necessary.</li>
<li>Arrive at the morning &#8216;Stand-up&#8217; meeting aware of not only your current work assignments, but also the team&#8217;s current location in the project trajectory.</li>
</ul>
<p><strong>IMPORTANT</strong>: The task list has no purpose unless it actually reflects what the programmers are doing during the day. THEY are the source of project status, for management without data is nothing more than sorcery. Good estimates build credibility, which the team should gather rapaciously.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.spencegreen.com/2008/01/31/how-to-task-programmers/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Re-use, or The Unknown Ideal</title>
		<link>http://www.spencegreen.com/2007/12/17/re-use-or-the-unknown-ideal/</link>
		<comments>http://www.spencegreen.com/2007/12/17/re-use-or-the-unknown-ideal/#comments</comments>
		<pubDate>Mon, 17 Dec 2007 21:41:56 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
		
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.spencegreen.com/2007/12/17/re-use-or-the-unknown-ideal/</guid>
		<description><![CDATA[A recent software presentation that I saw started with an &#8220;architectural discussion.&#8221; One slide listed &#8220;Object/component-based design&#8221; as a feature, which was qualified by the usual platitudes including &#8220;Maximizes software re-use.&#8221; The slide then made the bold leap to &#8220;faster development&#8221; as the principal benefit of this &#8220;design decision.&#8221; I sighed. Two decades after &#8220;re-use&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>A recent software presentation that I saw started with an &#8220;architectural discussion.&#8221; One slide listed &#8220;Object/component-based design&#8221; as a feature, which was qualified by the usual platitudes including &#8220;Maximizes software re-use.&#8221; The slide then made the bold leap to &#8220;faster development&#8221; as the principal benefit of this &#8220;design decision.&#8221; I sighed. Two decades after &#8220;re-use&#8221; entered the technical nomenclature, the term is still misapplied. Re-use remains a misunderstood ideal with more promise than payoff.</p>
<p>Parnas&#8217;s 1979 paper, <a target="_blank" href="http://portal.acm.org/citation.cfm?id=803218">&#8220;Designing Software for Ease of Extension and Contraction&#8221;</a>  responded to four common software objectives:</p>
<ul>
<li>Deliver a subset of a system&#8217;s features</li>
<li>Add a simple feature</li>
<li>Remove an un-needed feature</li>
<li>Tailor the system to meet changing user requirements.</li>
</ul>
<p>The common complaint against software here was that such ostensibly jejune objectives became intractable. Parnas began with the surprising description of programs as &#8220;abstract mathematical objects.&#8221; But mathematicians state and prove theorems, seeking generality. If a mathematician becomes aware of &#8220;a set of closely related theorems, he responds by proving a more general theorem.&#8221; A good theorem is invariant across instances. We would prefer a commutative property that applied to both addition and multiplication, for instance, over one that applied to only one or the other.</p>
<p>Programmers, on the other hand, respond to a minimal requirements set. Generality therefore has necessary design and construction costs, for that principal is de facto &#8220;not minimal&#8221; (A performance cost often exists, too). Further, programmers often associate generality with the absence of local invariants such as magic numbers and tight coupling. Real re-use has system-level implications, though.</p>
<p>Parnas suggests dogmatic use of a &#8220;uses&#8221; relationship between &#8220;components&#8221; during system specification. The &#8220;uses&#8221; relationship is of course the intellectual ancestor of composition, a tenet of OO design. Jacobsen defined composition in 1992 as structuring an object&#8211;which is a number of operations and a state&#8211;by its parts. A family, for example, could be composed of a man, woman, and child (more liberal compositions are of course possible). The &#8220;uses&#8221; relationship still exists in UML and frequently appears in object diagrams. Furthermore, &#8220;real&#8221; object-oriented languages such as Ada and Smalltalk make expression of this concept possible. Why then does re-use remain a novelty?</p>
<p>Two principal problems exist. Within a company, the cost of finding a general component is often high. Basic information management issues such as the absence of a centralized repository and poor internal search capabilities are obvious causes. This argument is unspecific, however. The real problem is an instance of the <a target="_blank" href="http://en.wikipedia.org/wiki/Free_rider_problem">free-rider problem</a> (this is especially true in contracting organizations). Projects are often unwilling to accept the costs associated with generality even in light of the utility realized by both that project and other company groups. &#8220;Re-use&#8221; therefore becomes a topic of much comment and little consequence. It costs too much.</p>
<p>Re-use works if it is the chief end. Four scenarios come to mind:</p>
<ul>
<li>Extensions&#8211;This category includes frameworks (eg, .NET, J2EE) and APIs (eg, Ruby on Rails).</li>
<li>Components&#8211;UNIX-style applications that exist as input/output functions. grep is the obvious example.</li>
<li>Schemas/Ontologies&#8211;Here we find XML schemas and interface standards.</li>
<li>Design patterns*&#8211;Popularized by the GoF, concepts such as the Singleton have become the software equivalents of <a target="_blank" href="http://en.wikipedia.org/wiki/Charles_Sanders_Pierce">Charles Sanders Pierce&#8217;s hobby horse</a>. <a target="_blank" href="http://ieeexplore.ieee.org/iel5/32/4227824/04227827.pdf">One paper</a> has shown, however, that patterns are usually mutilated in the process of instantiation, making them hard to &#8220;recover.&#8221; In other words, patterns do not possess the same order of invariance as mathematical theorems.</li>
</ul>
<p>The OSS community has been the principal beneficiary of re-use&#8217;s promise. An OSS component must exist as an autonomous element on the Internet to gain support, therefore making generality and interoperability key considerations. The absence of formal funding also eliminates the free-riding phenomenon on the developer side.</p>
<p>Re-use has failed as a &#8220;silver bullet&#8221; in the software industry, and it will continue to do so.</p>
<p><img width="516" src="/pics/posts/easy_rider.jpg" alt="The Unknown Ideal" height="360" style="width: 516px; height: 360px" title="The Unknown Ideal" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.spencegreen.com/2007/12/17/re-use-or-the-unknown-ideal/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The Critical Design Review</title>
		<link>http://www.spencegreen.com/2007/12/11/the-critical-design-review/</link>
		<comments>http://www.spencegreen.com/2007/12/11/the-critical-design-review/#comments</comments>
		<pubDate>Tue, 11 Dec 2007 17:44:34 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
		
		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://www.spencegreen.com/2007/12/11/the-critical-design-review/</guid>
		<description><![CDATA[Over the last several days, my project has gone through the Critical Design Review (CDR) process. Although the format differed from the CDR that I had organized in February, the presentation problems, organizational needs, and technical outcomes were similar. CDRs have become a staple in most engineering organizations, and government contractors in particular must hold [...]]]></description>
			<content:encoded><![CDATA[<p>Over the last several days, my project has gone through the Critical Design Review (CDR) process. Although the format differed from the CDR that I had organized in February, the presentation problems, organizational needs, and technical outcomes were similar. CDRs have become a staple in most engineering organizations, and government contractors in particular must hold them.</p>
<p>In my experience, most project teams scramble to meet the CDR deadline, often submitting work that is incomplete or unconsidered. This circumstance harms both the team and the customer. For example, our group tried to meet a program management quota of 30 slides per person. The &#8220;fluff&#8221; did not escape the customer&#8217;s notice, damaging the team&#8217;s credibility.</p>
<p>Instead, I suggest that CDR teams emphasize quality over quantity and use the CDR forum to educate the customer and capture requirements. Think of the CDR in as:</p>
<ul>
<li><strong>A pre-validation meeting</strong>: Demonstrate analytically the design&#8217;s compatibility with the current requirements set. Eventually, the customer will validate the code against the requirements. Show him that you have integrated all of his needs into your current design.</li>
<li><strong>A training exercise</strong>: Have you ever listened to a fellow developer describe a complicated algorithm or component? That guy is working on your system, but you don&#8217;t easily understand his approach because you aren&#8217;t familiar with his area of the code. Now think of the customer. He must digest the entire design with NO experience in any part of the system. Use the CDR to train the educate the customer, not overwhelm him. Other members of the engineering team will benefit as well, for their awareness of the system will increase.</li>
<li><strong>A requirements capture meeting</strong>: Each presenter should identify a list of design issues and requirements questions prior to the presentation. During a CDR, you have the customer&#8217;s undivided attention. Instead of lecturing him, ask him questions and make him think.</li>
<li><strong>A technical design forum</strong>: The team&#8217;s engineers should attend every CDR brief. Require them to take notes and submit evaluations. A CDR exists within the same genre as the Fagan inspection and the requirements review. Treat it with the same formality.</li>
</ul>
<p>Below is a list of guidelines for maximizing the CDR&#8217;s benefits. Both project managers and engineers can use these suggestions, for a well-integrated team blurs the distinction between these two roles.</p>
<p><strong><em>Planning and Preparation</em></strong></p>
<ul>
<li><strong>Don&#8217;t use a </strong><a target="_blank" href="http://sw-assurance.gsfc.nasa.gov/disciplines/quality/checklists/pdf/critical_design_review.pdf"><strong>boilerplate checklist</strong></a>: A CDR&#8217;s main objectives are gathering and disseminating information. Circumstances dictate the best methods for achieving those ends. This is not brain surgery. Develop a considered approach based on the project, avoiding <a target="_blank" href="http://www.dorsethouse.com/books/pw.html">&#8220;Big M&#8221; methodologies</a>.</li>
<li><strong>Emphasize quality over quantity</strong>: Don&#8217;t use slide quotas. Treat slides like money and spend them wisely.</li>
<li><strong>Use the 4-6 rule</strong>: Each slide should have between 4-6 bullets, and each bullet should have between 4-6 words. If a slide requires elaboration, talk through the slide using a whiteboard or create a handout for the audience.</li>
<li><strong>Print the Presentation</strong>: Every participant should have a bound copy of the presentation. In this way, you may include complex drawings and figures that may be difficult to read on the projector.</li>
<li><strong>Plan an internal CDR (iCDR) or &#8220;dress rehearsal&#8221;</strong>: The team should go through the entire CDR sequence together at least a week prior to the real conference. The presenters should speak as if giving the real presentation and the audience should not interrupt the talk unnecessarily. The latter observation brings us to&#8230;</li>
<li><strong>Identify a moderator</strong>: CDRs inevitably stall under the weight of digressions. Identify a moderator keep the meeting moving.</li>
<li><strong>Identify a scribe</strong>: It is too difficult to compile a piebald stack of scribbled notes after the meeting. Identify a scribe, give him a laptop, and require him to enter observations formally into <a target="_blank" href="http://www.telelogic.com/products/doors/doors/index.cfm">Telelogic DOORS</a> or an equivalent tool. Important comments and decisions are often lost immediately after a discussion takes place. Instead, capture all of the comments (annotating them by speaker and slide number) and present them as a &#8220;Minutes of Meeting&#8221; document to the customer.</li>
<li><strong>Assign a Master Reviewer</strong>: Select a technical leader with broad system knowledge to review all of the slides prior to the iCDR. The reviewer should eliminate redundancies, identify major themes, and resolve formatting inconsistences. The body of slides should reflect a coherent picture of the system. A single mind can evaluate the team&#8217;s work with respect to this objective.</li>
<li><strong>Detail = Credibility</strong>: Everyone knows that block diagrams, state charts, and data schemas require time and effort to develop. Include them in the presentation. Together, they show that the team is operating at a satisfactory level of precision. </li>
<li><strong>Think about Food</strong>: Don&#8217;t order the usual corporate garbage: donuts and coffee for breakfast, sandwiches and chips for lunch, Coke in the afternoon. Set the tone for the day with food. Start the day with fresh fruit, toast and French jam, fresh juices, and smoked salmon. Stimulate the body with healthy food, then stimulate the mind with a careful presentation. Impress the customer.</li>
</ul>
<p><strong><em>Execution</em></strong></p>
<ul>
<li><strong>Choose good communicators</strong>: No leaning on furniture. No staring at the projector screen. Use vocal inflection. Discard nervous habits. Dress well. A CDR is not a political rally, but it is also not Thursday night at the pub.</li>
<li><strong>Use amphitheater-style seating</strong>: Ensure that audience members can talk to each other. &#8220;Lecture room&#8221; seating prohibits discussion.</li>
<li><strong>Ban Blackberries</strong>: Place a box at the door and force people to dump their weapons into it. This is a serious discussion that requires undivided attention. Distractions caused by Joe Flowingut and his HIGH PRIORITY ISSUES!!! cannot be tolerated.</li>
<li><strong>Use two projectors</strong>: Display diagrams on one projector and talking points on the other.</li>
</ul>
<p><strong><em>Post-Op</em></strong></p>
<ul>
<li><strong>Debrief</strong>: Hold an engineering meeting immediately after the CDR. Sluggishness usually occurs after such an ordeal. The PM should develop a near-term list of action items and assign them after the last slide is presented. Don&#8217;t wait for the final analysis before you start moving forward.</li>
<li><strong>Requirements changes</strong>: Identify them, analyze them, and present them to the customer.</li>
<li>Design changes: Get the engineers working on these immediately. Impact analysis should be the first step.</li>
<li><strong>Risk assessment</strong>: Develop a risk list and use it to re-evaluate the project schedule.</li>
<li><strong>Action items</strong>: Develop a list of action items for the customer. What do you need from him? What issues must he address? Set a date for follow-up and get your questions answered while the issues still occupy his mind.</li>
</ul>
<p>A CDR comes from the &#8220;Waterfallish&#8221; world, but it works well at the beginning of an Agile project as well. Although design work may be performed during Agile/XP iterations, architecture must necessarily come first. A raw feature set must also be developed to allocate builds and iterations. These work artifacts are obvious candidates for a CDR.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.spencegreen.com/2007/12/11/the-critical-design-review/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
