<?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>Lean Software Engineering &#187; design</title>
	<atom:link href="http://leansoftwareengineering.com/category/design/feed/" rel="self" type="application/rss+xml" />
	<link>http://leansoftwareengineering.com</link>
	<description>Essays on the Continuous Delivery of High Quality Information Systems</description>
	<lastBuildDate>Fri, 07 Aug 2009 04:07:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Representation of structure</title>
		<link>http://leansoftwareengineering.com/2009/02/09/representation-of-structure/</link>
		<comments>http://leansoftwareengineering.com/2009/02/09/representation-of-structure/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 07:31:16 +0000</pubDate>
		<dc:creator>Corey Ladas</dc:creator>
				<category><![CDATA[design]]></category>
		<category><![CDATA[dependency structure matrix]]></category>
		<category><![CDATA[design structure matrix]]></category>
		<category><![CDATA[dsm]]></category>

		<guid isPermaLink="false">http://leansoftwareengineering.com/?p=994</guid>
		<description><![CDATA[Structure in the design of systems is usually represented by some form of schematic or block diagram.  Block diagrams describe logical relationships between design elements, without getting hung up on physical detail.  UML class diagrams and electronic schematics are examples of such abstract structural models of &#8220;things that are made out of things.&#8221; Graph diagrams [...]]]></description>
			<content:encoded><![CDATA[<div>
<p style="vertical-align: middle">Structure in the design of systems is usually represented by some form of schematic or block diagram.  Block diagrams describe logical relationships between design elements, without getting hung up on physical detail.  <a href="http://en.wikipedia.org/wiki/Class_diagram">UML class diagrams</a> and <a href="http://en.wikipedia.org/wiki/Circuit_diagram">electronic schematics</a> are examples of such abstract structural models of &#8220;things that are made out of things.&#8221;</p>
<p style="vertical-align: middle">Graph diagrams have one big trick for managing scale by collapsing compositional hierarchy into subdiagrams.  Most of the time, I don&#8217;t care how an integrated circuit works, I&#8217;m only interested in the inputs and outputs.  I&#8217;d rather treat it as a unified thing, even if the components on the inside of the thing are of the same type as the components I connect to the outside.</p>
<p style="vertical-align: middle">If our biggest scaling trick is reserved for object composition, then other hierarchical relationships may be described by color, symbolism, or layout.  Color can be tricky because of problems with reproduction and perception (colorblindness is common).  Symbolism works well for simple type relationships, but it&#8217;s difficult to represent taxonomy with nothing but icons.  Edge layout is the first and most expressive tool of block diagramming, but layout quickly runs into problems with scale.  Block diagrams are not the panacea of design modeling.</p>
<p style="vertical-align: middle">Large diagrams can become <a href="http://leansoftwareengineering.com/wp-content/uploads/2007/12/vtigerdbmodel_403.png">incomprehensible</a> as they scale beyond a few 10&#8242;s of nodes. Most block-diagram notations allow an ad-hoc layout. Imposing rules upon the layout of the diagram can preserve comprehension and communicate additional information about structure. Resistance to orderly layout is itself useful information about structure.</p>
<p>There are some wonderful algorithmic <a href="http://www.graphviz.org/">graph layout tools</a> that we can apply to help us make sense of things, but there are also a few simple manual layout tricks we can apply to finding latent structural patterns. It&#8217;s useful to know a few tricks for discovering structure when you are given a set of entities, but you don&#8217;t yet understand the relationships between them. It&#8217;s even more useful if these tricks can be applied at a whiteboard or in a spreadsheet without the need for expensive and/or complicated software tools.</p>
<table border="0">
<tbody>
<tr>
<td><img src="http://leansoftwareengineering.com/wp-content/uploads/2007/12/circle0.jpg" alt="" width="160" /></td>
<td>Radial layouts equalize the significance of nodes and emphasize patterns between edges. They also <a href="http://www.graphviz.org/Gallery/twopi/twopi2.html">scale up nicely</a>.  These can be very useful for discovering relationship patterns in a system that is new to you.  You can make a pretty big circular diagram on a whiteboard with sticky notes for nodes and ink for edges.</td>
<td><img src="http://leansoftwareengineering.com/wp-content/uploads/2007/12/circle1.jpg" alt="" width="160" /></td>
</tr>
</tbody>
</table>
<table border="0">
<tbody>
<tr>
<td>Linear layouts are easy to draw.</td>
<td><img src="http://leansoftwareengineering.com/wp-content/uploads/2007/12/book.png" alt="" /></td>
</tr>
</tbody>
</table>
<p>They <a href="http://benfry.com/linking/">scale up decently</a>, equalize nodes, and emphasize <a href="http://www.turbulence.org/Works/song/gallery/gallery.html">patterns between edges</a>. They can optionally encode sequence along the node axis, but they don&#8217;t have to, and we&#8217;ll see why not encoding sequence is also useful.</p>
<table border="0">
<tbody>
<tr>
<td>Linear layouts are especially useful when we make a rule about the direction of the edges.</td>
<td><img src="http://leansoftwareengineering.com/wp-content/uploads/2007/12/linear_arcs.jpg" alt="" width="160" /></td>
</tr>
</tbody>
</table>
<p>Any leftward edge that we can&#8217;t remove by reordering the nodes is a dependency cycle. Generally, you want to avoid such cycles in your design structure.  A useful consequence of such a linear layout is that it can easily be translated into a matrix of relationships between diagram nodes. The reason becomes more apparent when you orient the graph along a diagonal axis:</p>
<table border="0">
<tbody>
<tr>
<td>The graph</td>
<td><img src="http://leansoftwareengineering.com/wp-content/uploads/2007/12/diagonal0.jpg" alt="" width="160" /></td>
<td>can be represented as the matrix</td>
<td><img src="http://leansoftwareengineering.com/wp-content/uploads/2007/12/diagonal1.jpg" alt="" /></td>
</tr>
</tbody>
</table>
<p>Such an adjacency matrix can be referred to as a <a href="http://www.dsmweb.org">design structure matrix</a>, or dependency structure matrix.  The tabular form of a design structure matrix makes it a useful tool for understanding the relationships of large interconnected systems.  A block diagram with 26 nodes may be simple, or it may be visually unwieldy.  The equivalent DSM always has the same layout:</p>
<p style="text-align: center;"><img class="size-full wp-image-1016 aligncenter" title="dsm" src="http://leansoftwareengineering.com/wp-content/uploads/2009/01/dsm.png" alt="dsm" width="445" height="469" /></p>
<p>With our matrix form, we can apply simple row and column reordering to maximize the number of edges on one side of the diagonal.  The dependency matrix of a decoupled design can be made to have all of its edges under the diagonal.   Any edges above the diagonal that can&#8217;t be removed by row/col reordering are dependency cycles.</p>
<p>In a coming article, we will expand on this matrix technique to further understand and manage the structure of large systems.  We may also discover something in the patterns of relationships that will help us to manage the work of building and maintaining such systems.</p></div>
]]></content:encoded>
			<wfw:commentRss>http://leansoftwareengineering.com/2009/02/09/representation-of-structure/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>My favorite kanban development example</title>
		<link>http://leansoftwareengineering.com/2008/11/11/my-favorite-kanban-development-example/</link>
		<comments>http://leansoftwareengineering.com/2008/11/11/my-favorite-kanban-development-example/#comments</comments>
		<pubDate>Tue, 11 Nov 2008 19:42:00 +0000</pubDate>
		<dc:creator>Corey Ladas</dc:creator>
				<category><![CDATA[design]]></category>
		<category><![CDATA[lean]]></category>
		<category><![CDATA[project]]></category>
		<category><![CDATA[simple spiral]]></category>

		<guid isPermaLink="false">http://leansoftwareengineering.com/?p=470</guid>
		<description><![CDATA[It has been a long time in the works, but Clinton Keith&#8217;s article on kanban systems for game development is finally up. It is an excellent description of the why and the how of organizing a process for content-intensive development. Clint has managed to do something which I previously thought improbable: setting a takt time [...]]]></description>
			<content:encoded><![CDATA[<p>It has been a long time in the works, but Clinton Keith&#8217;s article on <a href="http://www.gamasutra.com/view/feature/3847/beyond_scrum_lean_and_kanban_for_.php" target="_blank">kanban systems for game development</a> is finally up.  It is an excellent description of the why and the how of organizing a process for content-intensive development.  Clint has managed to do something which I previously thought improbable: setting a takt time pace for development activities.</p>
]]></content:encoded>
			<wfw:commentRss>http://leansoftwareengineering.com/2008/11/11/my-favorite-kanban-development-example/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Completion queue as incremental throttle</title>
		<link>http://leansoftwareengineering.com/2008/06/20/completion-queue-as-incremental-throttle/</link>
		<comments>http://leansoftwareengineering.com/2008/06/20/completion-queue-as-incremental-throttle/#comments</comments>
		<pubDate>Fri, 20 Jun 2008 22:29:15 +0000</pubDate>
		<dc:creator>Corey Ladas</dc:creator>
				<category><![CDATA[design]]></category>
		<category><![CDATA[kanban]]></category>
		<category><![CDATA[lean]]></category>
		<category><![CDATA[project management]]></category>

		<guid isPermaLink="false">http://leansoftwareengineering.com/?p=408</guid>
		<description><![CDATA[.limg { width:200px;border:0;float:left;margin-right:1em } .rimg { width:200px;border:0;float:right;margin-left:1em } In the last two posts, we&#8217;ve discussed some useful properties of internal workflow queues: queue states between processes can provide an early warning of process breakdowns local work-in-process limits serve to slow down a malfunctioning workflow and free up resources to fix it queues can sometimes be [...]]]></description>
			<content:encoded><![CDATA[<style type="text/css"> 
.limg { width:200px;border:0;float:left;margin-right:1em } 
.rimg { width:200px;border:0;float:right;margin-left:1em } 
</style>
<p>In the last two posts, we&#8217;ve discussed some useful properties of internal workflow queues:</p>
<ul>
<li>queue states between processes can provide an early warning of process breakdowns</li>
<li>local work-in-process limits serve to slow down a malfunctioning workflow and free up resources to fix it</li>
<li>queues can sometimes be combined to reduce the total work-in-process while still preserving their buffering function</li>
</ul>
<p>I gave an <a href="http://leansoftwareengineering.com/2008/06/12/queue-utilization-is-a-leading-indicator/#example">example</a> of workflow throttling, and suggested there was another configuration of those internal queues that could respond more smoothly and gracefully than the simple, independent queues given in the example.</p>
<p>In order to pull a work item, there has to be a place to pull it from, and there should be some way to distinguish work that is eligible to be pulled from work that is still in process.   At the same time, there has to be a place to put completed work when you are done with it.  A completion queue serves both these functions.  </p>
<p><img src="http://leansoftwareengineering.com/wp-content/uploads/2008/06/completion_queue-001.jpg" class="rimg" />In this case, we can have up to 3 items in the &#8220;specify&#8221; state AND we can have up to 3 items waiting for the next state in the workflow.  The team can pull new work into &#8220;specify&#8221; whenever there are fewer than 3 work items in process.  If there are already 3 work items in process then the team will have to wait until something is moved into the completion queue.  If there is some kind of blockage downstream, first the completion queue will fill up, THEN the specify queue will fill up, THEN the specify process will stall.  And when it stalls, it stalls all at once.  The flow is either on or off, there&#8217;s no middle speed, and it keeps going until it stalls.</p>
<div style="clear:both"></div>
<p><img src="http://leansoftwareengineering.com/wp-content/uploads/2008/06/completion_queue-002.jpg" class="rimg" />In another example, we still have a busy state and a complete state, but the token limit is shared between them.  In this case, we can have 4 items in process OR 4 waiting.  Or we can have (3 busy + 1 waiting) OR (1 busy + 3 waiting).  </p>
<p>In the ideal case of 3 busy and 1 waiting, this queue works just like the first example does.  However, if work starts to accumulate in the &#8220;complete&#8221; state, then the &#8220;specify&#8221; state will incrementally throttle down.  The effective WIP limit for &#8220;specify&#8221; goes from 4->3->2->1->0 as more items are completed ahead of the rate of downstream intake. So, the process slows before it stops, and it slows much sooner than it would have under the independent queues.</p>
<p>What&#8217;s more, even though it operates in the same way in the normal case, it does it with two fewer kanban in the system.  Fewer kanban, with gradual throttling and smoother flow, should result in lower lead times.</p>
<div style="clear:both"></div>
<p>With this in mind, let&#8217;s reconsider our scenario from the previous topic:</p>
<table style="font-style:italic">
<tr>
<td><img src="http://leansoftwareengineering.com/wp-content/uploads/2008/06/completion_queue-009.jpg" class="limg" style="width:360px"/></td>
<td>1. Something is going wrong in the design process, but nobody knows it yet.</td>
</tr>
<tr>
<td><img src="http://leansoftwareengineering.com/wp-content/uploads/2008/06/completion_queue-011.jpg" class="limg" style="width:360px"/></td>
<td>2. The specify-complete queue starts to back up, thereby throttling down the WIP limit for specify.  A resource is freed as a result, who should now inquire into the cause of the backup, which may only be random variation.  The code process continues to complete work and pull from the existing backlog.</td>
</tr>
<tr>
<td><img src="http://leansoftwareengineering.com/wp-content/uploads/2008/06/completion_queue-012.jpg" class="limg" style="width:360px"/></td>
<td>3. Code state begins to starve and specify state throttles down another level.  Two more people are released as a result.  There&#8217;s more than enough free resources now to either fix the problem or shut down the process.</td>
</tr>
<tr>
<td><img src="http://leansoftwareengineering.com/wp-content/uploads/2008/06/completion_queue-013.jpg" class="limg" style="width:360px"/></td>
<td>4. The stall completes by flushing out the specify and code states.</td>
</tr>
</table>
<p>It still takes a while for the system to stall completely.  The difference is that it <em>begins</em> stalling immediately, and when it does stall, it stalls with less WIP.  For equivalent throughput, this pipeline should operate with fewer kanban and less variation in WIP, and therefore should have smoother flow and shorter lead times.  It should respond faster to problems and free up resources earlier to correct those problems.  </p>
<p>These shared completion queues might be the most common type of workflow queue.  There are a couple of other types that we use, and we&#8217;ll take a look at those in a future post.</p>
]]></content:encoded>
			<wfw:commentRss>http://leansoftwareengineering.com/2008/06/20/completion-queue-as-incremental-throttle/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>What is Design for Six Sigma?</title>
		<link>http://leansoftwareengineering.com/2008/01/07/what-is-design-for-six-sigma/</link>
		<comments>http://leansoftwareengineering.com/2008/01/07/what-is-design-for-six-sigma/#comments</comments>
		<pubDate>Tue, 08 Jan 2008 04:00:18 +0000</pubDate>
		<dc:creator>Corey Ladas</dc:creator>
				<category><![CDATA[design]]></category>

		<guid isPermaLink="false">http://leansoftwareengineering.com/2008/01/07/what-is-design-for-six-sigma/</guid>
		<description><![CDATA[Kanban is a mechanism for organizing and operating a process, but it is not the process itself. Kanban must be matched up with a particular value stream or workflow in order to form a complete process. Since we are concerned with the specification and design of new systems, we should evaluate development workflows to find [...]]]></description>
			<content:encoded><![CDATA[<table>
<tr>
<td>
Kanban is a mechanism for organizing and operating a process, but it is not the process itself.  Kanban must be matched up with a particular value stream or workflow in order to form a complete process.  Since we are concerned with the specification and design of new systems, we should evaluate development workflows to find complementary matches.</p>
<p>Kanban directly addresses the lean values of <em>pull</em> and <em>flow</em>, but only indirectly addresses the values of <em>value</em> and <em>perfection</em>.  It would be useful if our workflow directly spoke to those values, so that we might form a complete process that fully embodies lean principles.  There is some tension between <em>value</em> and <em>perfection</em>, so we will need some discipline and understanding in order to bring that tension to a harmonious resolution.  As it turns out, there is a product development methodology that is deeply concerned with these values:  <em>Design for Six Sigma</em> (DFSS).  </p>
<p>I think it&#8217;s important to remind ourselves from time to time that we&#8217;re interested in lean <em>because</em> we&#8217;re interested in pull, value, and perfection, and not vice-versa.  If you don&#8217;t need these things, if &#8220;pretty good and pretty soon&#8221; are good enough for you, then there&#8217;s no need to fuss with all of this lean business, and craft methods will probably suffice.  But if you find yourself in a situation where: </p>
<ul>
<li>You have direct competition in a market.</li>
<li>The consequences of operational failure or poor quality are great.</li>
<li>You have a large user population.</li>
</ul>
<p>&#8230;then you may need a little more than &#8220;pretty good and pretty soon.&#8221;</p>
<p><strong>What is Six Sigma?</strong></p>
<p>The title question might appear a little opaque at first, but we can break it down.  To begin with, what is Six Sigma and why would you want to design for it?  Taken literally, Six Sigma refers to a goal of limiting the frequency of production of defects, defined in terms of variation from a product specification.  If you take a closer look at the components of Six Sigma and ask what the purposes or consequences of those components are, you might come away with a more practical definition:</p>
<p style='margin-left:2em;'><em>A set of principles, practices, and tools for the systematic improvement of business processes.</em></p>
<p>Putting things in more neutral cause-and-effect terms helps us to reason about them more objectively.  Then you can decide how you feel about <em>systematic improvement of business process</em>, independent of any particular terminology.  If you decide that process improvement has value to you, then you may look into the matter and discover that Six Sigma offers one point of view on that topic, as do Lean, Theory of Constraints, and others.  Further, most of these systems have some shared history within the field of quality and process control.  If you view each of them as a collection of ideas, connected by themes, then you may find a particular combination of those ideas that speaks most clearly to your particular situation.  In fact, the cross-pollination of these systems has been a hot topic in recent times.</p>
<p><strong>What is Design for Six Sigma?</strong><br />
<a href="http://www.amazon.com/Design-Six-Sigma-Roadmap-Development/dp/0071412085" target="_blank" ><br />
<img src="http://ecx.images-amazon.com/images/I/414K3eI7k5L.OU01_AA240_SH20_.jpg" style="float:left;border:0;margin-bottom:1em;" /></a>In its original form, Six Sigma is oriented towards repetitive processes like manufacturing.  Further, it&#8217;s oriented towards improving processes that already exist.  But if the underlying design of a product or its process is sufficiently flawed, then it may not be possible to &#8220;improve&#8221; our way to quality.  It is better to &#8220;design quality in&#8221;.  Perhaps we can design the product in such a way that it does not need so much improvement in production.</p>
<p>To the end of designing-in quality, a companion methodology was developed, called <a href="http://www.amazon.com/Design-Six-Sigma-Roadmap-Development/dp/0071412085" target="_blank" >Design for Six Sigma</a>, or DFSS.  The goal of DFSS is the economical development of high-value, high-quality product designs.  Like its complement, DFSS is a collection of theories and practices that work together in service of that end.</p>
<p style="clear:both;">The components of DFSS each have long and illustrious histories in industry in their own right.  They include:</p>
<ul>
<li><strong>Quality Function Deployment:</strong>  A theory of customer value.  Practices for discovery of customer value, analysis of competition, priority of product features.</li>
<li><strong>Theory of Inventive Problem Solving (TRIZ):</strong>  A theory of technology evolution.  Practices for the systematic discovery of high-value design problems and their solutions.</li>
<li><strong>Pugh Concept Methods:</strong>  We don&#8217;t want the first design we think of, we want the best design we think of, and we want options.</li>
<li><strong>Failure Modeling (FMEA):</strong>  Practices for discovering what&#8217;s likely to happen outside of your carefully controlled development environment. </li>
<li><strong>Design of Experiment:</strong>  Design notations like source code describe what we want the system to do.  Now what does it <em>really</em> do?</li>
<li><strong>Taguchi Robust Design:</strong>  The real world is noisy and unpredictable.  Robust systems work well in spite of this.</li>
</ul>
<p>and perhaps most importantly:</p>
<ul>
<li><strong>Axiomatic Design:</strong>  A rigorous theory of design structure.  Practices for evaluating design quality and decomposing design structure.</li>
</ul>
<p>Some versions of DFSS include Axiomatic Design and some don&#8217;t.  For those that do, Axiomatic Design is the conceptual glue that binds all of the other pieces together (like the Force).  For those that don&#8217;t, QFD plays that role.</p>
<p>I wouldn&#8217;t be me if I weren&#8217;t disdainful of tribes, hype, and comprehensive branded methodology frameworks.  Nonetheless, the way that the DFSS practices complement one another is remarkable.  Understanding how they complement each other also illuminates how to fit each practice into your own process.  Is there any value in &#8220;doing DFSS&#8221;?  No.  Is there value in designing robust products?  Yes.</p>
<p><strong>How does Design for Six Sigma relate to software development?</strong></p>
<p>DFSS does not have much to say about writing code.  Neither does it have much to say about drawing circuit schematics or mechanical drawings.  This is because DFSS is about systems engineering and product design, independent of any particular technological domain.  Any system that can be decomposed into parts and is subject to economic calculation in its development is within the scope of the methods of DFSS.  </p>
<p>This has some interesting consequences, not the least of which is that it puts software development on an equal footing with other engineering disciplines within the context of product development.  You do not want to hear: <em>The Boeing 787 is a marvel of modern engineering&#8230;except for these 6.5 million lines of code, which were merely &#8216;developed&#8217;.</em>  DFSS relates all design decisions to all other design decisions, and holds them all to the same quality criteria, regardless of how they are notated or which mathematics they use.</p>
<p>The questions that DFSS addresses are fundamental to software development:  quality, value, reliability, robustness.  DFSS, by its nature, offers the best thinking on these subjects.  If software developers have not caught up with this yet, it is because currently popular software development methodology is deficient.  But this idea is catching on.  Jayaswal and Patton&#8217;s <a href="http://www.amazon.com/Design-Trustworthy-Software-Techniques-Methodology/dp/0131872508" target="_blank" >Design for Trustworthy Software</a> is exactly about DFSS for software development, and I think there will be more books to come on this subject.</p>
<p><strong>How does Design for Six Sigma relate to Lean?</strong></p>
<p>The intersection of Lean and DFSS is the state of the art in product development.  Part of the importance of Axiomatic Design to DFSS is exactly that it provides a theory for incremental, iterative, and evolutionary design.  Suh&#8217;s Independence Axiom shows that the best designs for evolutionary development are simply the best designs.  Conversely, any design that would be considered ideal could have been constructed by an evolutionary process.  That is, the criteria for design ideality and evolution are one and the same.  </p>
<p>Suh&#8217;s design axioms apply directly to software systems.  They unify all other DFSS methods, and they unite DFSS with lean development and evolutionary design.  The intersection of Lean Thinking, DFSS, and Software Engineering is coming, and it is very exciting!  Perhaps we might call it <em>Robust Evolutionary Design</em>.</p>
</td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>http://leansoftwareengineering.com/2008/01/07/what-is-design-for-six-sigma/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>What is Lean Product Development?</title>
		<link>http://leansoftwareengineering.com/2007/12/20/what-is-lean-product-development/</link>
		<comments>http://leansoftwareengineering.com/2007/12/20/what-is-lean-product-development/#comments</comments>
		<pubDate>Fri, 21 Dec 2007 00:58:53 +0000</pubDate>
		<dc:creator>Corey Ladas</dc:creator>
				<category><![CDATA[design]]></category>
		<category><![CDATA[lean]]></category>

		<guid isPermaLink="false">http://leansoftwareengineering.com/2007/12/20/what-is-lean-product-development/</guid>
		<description><![CDATA[Michael Kennedy did his readers a real service by calling his excellent book Product Development for the Lean Enterprise instead of the more obvious Lean Product Development. In that book, Kennedy describes the set-based principles of the Toyota Development System, and how they may be applied to any product development business. TDS is a fascinating [...]]]></description>
			<content:encoded><![CDATA[<p>Michael Kennedy did his readers a real service by calling his excellent book <a href="http://www.amazon.com/Product-Development-Lean-Enterprise-Productive/dp/1892538091" target="_blank" >Product Development for the Lean Enterprise</a> instead of the more obvious Lean Product Development.  In that book, Kennedy describes the set-based principles of the Toyota Development System, and how they may be applied to any product development business.  TDS is a fascinating system, equally as innovative and interesting as the Toyota Production System, but also very different in the mechanism of its operation.</p>
<p><a href="http://www.amazon.com/Managing-Design-Factory-Donald-Reinertsen/dp/0684839911"  target="_blank"><img src="http://ecx.images-amazon.com/images/I/71RHRW8E2KL._PIsitb-dp-500,TopRight,45,-64_OU01_SS100_.gif" style="float:left; border:0;" /></a>On the other hand, my own journey down the road of lean development started with Donald Reinertsen&#8217;s <a href="http://www.amazon.com/Managing-Design-Factory-Donald-Reinertsen/dp/0684839911" target="_blank">Managing the Design Factory</a>.  Don&#8217;s description of Lean Product Development is more like the application of lean production principles to product development, breaking the work into small pieces, managing capacity, measuring flow, and delivering value incrementally.  It is this view of lean that my friend David Anderson expounded upon in his book <a href="http://www.amazon.com/Agile-Management-Software-Engineering-Constraints/dp/0131424602">Agile Management for Software Engineering</a>.</p>
<p>The difference between TDS and TPS creates a lot of confusion in discussions about Lean Product Development.  Does LPD mean product development targeted to lean production systems?  Or does it mean the principles of lean production applied to product development?  These two definitions have very different consequences.</p>
<p>If it wasn&#8217;t already clear, I am decidedly in the camp of <em>lean production principles applied to product development workflows</em>.  Even though I think TDS is ingenious, and I wholeheartedly endorse set-based thinking, I do not consider TDS to be Lean Product Development.  To me, lean development is a means to an end.  That end is evolutionary design, and lean production fits that end in a way that set-based development does not.  Which is not to say that there is not a strong evolutionary interpretation of SBD, as large-scale open source development is exactly that.  But I&#8217;m not really speaking to the open source audience here.  I expect my readers are largely of the enterprise variety, building products or IT systems to spec and for hire.  And evolution with such finite resources means flow.</p>
<p>Observant readers have probably noticed that I don&#8217;t talk much about Mary and Tom Poppendieck here.  I feel a little bit bad about that, because I think they deserve credit and respect.  I think they have done the software profession a tremendous service by popularizing the relevance of lean principles to software development.  But they have also done a couple of things that bother me, including blurring the definition between set-based, time-boxed methods like TDS and continuous workflow methods like TPS.  The consequence of this is that people can (and do) weasel out of lean principles by hiding behind the weakest interpretation.  By conflating these definitions, the Poppendiecks, perhaps unwittingly, encourage their readers to claim to be lean while avoiding actually doing it.  One of the greatest offenses I see again and again is the rationalization of &#8220;craftsmanship&#8221; under the auspices of Lean.</p>
<p>In contrast, Womack and Jones (and Roos) were not at all ambiguous about what is Lean and what is not.  Jim Womack, who coined the expression, &#8220;lean production,&#8221; to describe the principles behind the Toyota Production System, explicitly defined lean production as neither craft production nor mass production.  <em>Not craft production</em> is part of the definition of lean, and he dedicates whole chapters in <a href="http://www.amazon.com/s/ref=nb_ss_gw/103-1933623-8888604?url=search-alias%3Daps&#038;field-keywords=james+womack&#038;x=0&#038;y=0" target="_blank">his books</a> to why craft production is inferior:</p>
<blockquote><p>Our advice to any company practising &#8220;craftsmanship&#8221; of this sort in any manufacturing activity, automotive or otherwise, is simple and emphatic:  Stamp it out.<br />
- <em>The Machine that Changed the World</em>, The Strange Case of the &#8220;Craft&#8221; Producers</p></blockquote>
<p>Now, I realize that development is not manufacturing.  But using that as an excuse to rationalize craft methods is overwhelmingly contrary to philosophy of lean.  I am not saying that you shouldn&#8217;t practice craft development if that&#8217;s what you want to do.  But claiming that it is lean to do so is either ignorant or outrageously dishonest.  Standard Work is not an optional practice.  Craftsmanship means doing it your way, Standard Work means doing it <em>our</em> way.  If you&#8217;re not doing Standard Work, you&#8217;re not doing Lean.  Period.</p>
]]></content:encoded>
			<wfw:commentRss>http://leansoftwareengineering.com/2007/12/20/what-is-lean-product-development/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>The difference between software development and software engineering</title>
		<link>http://leansoftwareengineering.com/2007/11/10/the-difference-between-software-development-and-software-engineering/</link>
		<comments>http://leansoftwareengineering.com/2007/11/10/the-difference-between-software-development-and-software-engineering/#comments</comments>
		<pubDate>Sat, 10 Nov 2007 21:41:01 +0000</pubDate>
		<dc:creator>Corey Ladas</dc:creator>
				<category><![CDATA[design]]></category>
		<category><![CDATA[lean]]></category>

		<guid isPermaLink="false">http://leansoftwareengineering.com/2007/11/10/the-difference-between-software-development-and-software-engineering/</guid>
		<description><![CDATA[Software development: The system performs function A. Software engineering: The system performs function A under operating conditions B with operational performance parameters C with tolerances within the probability distribution D and reliability within the probability distribution E and we are legally responsible if it doesn&#8217;t. As you can probably imagine, one of these problems is [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Software development:</strong></p>
<p><em>The system performs function A.</em></p>
<p><strong>Software engineering:</strong></p>
<p><em>The system performs function A under operating conditions B with operational performance parameters C with tolerances within the probability distribution D and reliability within the probability distribution E and we are legally responsible if it doesn&#8217;t.</em></p>
<p>As you can probably imagine, one of these problems is harder than the other.  My interest is in explaining why it is still possible and even desirable to address the second problem with evolutionary design.  </p>
<p>Agile methods can explain how to manage evolutionary design for the first problem.  They have so little to say about the second problem that they almost appear to deny its existence.  Software engineering methods are largely concerned with the second problem, but they usually apply a simple-minded mass production mentality to management.  I guess &#8220;serious&#8221; software engineering researchers haven&#8217;t considered management to be a sufficiently interesting problem.</p>
<p>Maybe I&#8217;m a dreamer.  I want both.  In fact, I don&#8217;t think Software Engineering can be made to work without evolution.  The best that a phase-gate system can hope to offer is to solve yesterday&#8217;s problem (i.e. the wrong problem) with great precision.  I want the optimum solution to today&#8217;s problem, today.</p>
]]></content:encoded>
			<wfw:commentRss>http://leansoftwareengineering.com/2007/11/10/the-difference-between-software-development-and-software-engineering/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>A good example of autonomation in software engineering</title>
		<link>http://leansoftwareengineering.com/2007/11/09/the-best-example-of-autonomation-in-software-engineering/</link>
		<comments>http://leansoftwareengineering.com/2007/11/09/the-best-example-of-autonomation-in-software-engineering/#comments</comments>
		<pubDate>Sat, 10 Nov 2007 04:05:19 +0000</pubDate>
		<dc:creator>Corey Ladas</dc:creator>
				<category><![CDATA[design]]></category>

		<guid isPermaLink="false">http://leansoftwareengineering.com/2007/11/09/the-best-example-of-autonomation-in-software-engineering/</guid>
		<description><![CDATA[&#8230;is the class invariant. Class invariants and contracts are not about testing. They are about reliability. The purpose of a class invariant is to minimize the state space of the system, both at design time and at run time. A class invariant is an extension to your type system. You will get the most power [...]]]></description>
			<content:encoded><![CDATA[<p>&#8230;is the <em>class invariant</em>.  </p>
<p>Class invariants and contracts are not about testing.  They are about reliability.  The purpose of a class invariant is to minimize the state space of the system, both at design time and at run time.  A class invariant is an extension to your type system.  You will get the most power from them if you think about them and use them in that way.  I love dynamic languages, but the people who bitch the most about type systems probably don&#8217;t understand how to use them correctly.  The compiler is your friend.  Static analysis is your friend.  Class invariants make types smarter.</p>
<p>Reliable systems fail at the earliest opportunity.  Sounds counterintuitive?</p>
<blockquote><p>The loom stopped instantly if any one of the warp or weft threads broke.  Because a device that could distinguish between normal and abnormal conditions was built into the machine, defective products were not produced.</p>
<p>- Taiichi Ohno
</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://leansoftwareengineering.com/2007/11/09/the-best-example-of-autonomation-in-software-engineering/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>The conditions for lean development</title>
		<link>http://leansoftwareengineering.com/2007/09/05/the-conditions-for-lean-development/</link>
		<comments>http://leansoftwareengineering.com/2007/09/05/the-conditions-for-lean-development/#comments</comments>
		<pubDate>Wed, 05 Sep 2007 07:00:38 +0000</pubDate>
		<dc:creator>Corey Ladas</dc:creator>
				<category><![CDATA[design]]></category>
		<category><![CDATA[lean]]></category>

		<guid isPermaLink="false">http://leansoftwareengineering.com/2007/09/05/the-conditions-for-lean-development/</guid>
		<description><![CDATA[We recently explored some of the possibilities for managing software development explicitly around the principles of value, waste, pull, flow, and perfection. Our hypothesis was: If we can divide requirements into small and similarly-sized pieces, then one-piece flow and continuous improvement are possible. Our conclusion is that both analysis and evidence show that it is [...]]]></description>
			<content:encoded><![CDATA[<table>
<tr>
<td>We recently explored some of the possibilities for managing software development explicitly around the principles of <em>value, waste, pull, flow,</em> and <em>perfection</em>.  Our hypothesis was:</p>
<p style="margin-left:2em;"><em>If we can divide requirements into small and similarly-sized pieces, then one-piece flow and continuous improvement are possible.</em></p>
<p>Our conclusion is that both analysis and evidence show that it <em>is</em> possible.  So the next question should be:  <em>under what conditions is it possible?</em>  This leads us to question the premise:</p>
<p style="margin-left:2em;"><em>Under what conditions can we divide requirements into small and similarly-sized pieces?</em></p>
<p>In my mind, that is really the fundamental question of iterative product development.  In order to address that question, we&#8217;re going to have to talk about design.  Clarifying our understanding of the nature of design will lead us to discover what we need to know about the process of design.</p>
</td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>http://leansoftwareengineering.com/2007/09/05/the-conditions-for-lean-development/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Total Design</title>
		<link>http://leansoftwareengineering.com/2007/08/21/total-design/</link>
		<comments>http://leansoftwareengineering.com/2007/08/21/total-design/#comments</comments>
		<pubDate>Tue, 21 Aug 2007 19:01:06 +0000</pubDate>
		<dc:creator>Corey Ladas</dc:creator>
				<category><![CDATA[design]]></category>

		<guid isPermaLink="false">http://leansoftwareengineering.com/2007/08/21/total-design/</guid>
		<description><![CDATA[In the 1970&#8242;s and 80&#8242;s, Stuart Pugh developed a philosophy of product development, which he called Total Design. This philosophy anticipated many of the values of Agile development and Design for Six Sigma, but in some ways is still more advanced than either of those. Pugh is remembered most often for his set-based development method [...]]]></description>
			<content:encoded><![CDATA[<table>
<tr>
<td>
In the 1970&#8242;s and 80&#8242;s, Stuart Pugh developed a philosophy of product development, which he called <a href="http://www.amazon.com/Total-Design-Integrated-Successful-Engineering/dp/0201416395" target="_blank">Total Design</a>.  This philosophy anticipated many of the values of Agile development and Design for Six Sigma, but in some ways is still more advanced than either of those.  Pugh is remembered most often for his set-based development method of <a href="http://leansoftwareengineering.com/2007/05/07/pugh-decision-matrix/" target="_blank">Pugh Concept Selection</a>, but there is much more to his philosophy that just that.</p>
<div style='clear:left'>
<strong>Principles of Total Design</strong></div>
<ol>
<li>The user need/customer requirement/voice of the customer is paramount to the success or failure of the product</li>
<li>All facets of a business need to be involved in (and interact with) the design core in parallel and not sequentially</li>
<li>To satisfy the user need, rigorous systematic working is required throughout the design core using modern methods</li>
<li>A product&#8217;s status needs to be assessed accurately before starting any new design</li>
<li>Within systematic working, a cyclical process of synthesis/analysis/synthesis is necessary, brought to a satisfactory conclusion by the appropriate methods</li>
<li>The most up-to-date elements of engineering, based on sound engineering principles, must be used as appropriate</li>
<li>Total design teams must be multi-disciplinary, with sufficient expertise within the team, and sufficient diversity of experience</li>
<li>Consideration must be given to a wide range of alternatives without prior commitment to any particular alternative</li>
<li>The design team must repeatedly scrutinize and test the information and reasoning on which a design is based</li>
<li>People performance is critical to total design performance</li>
<li>Engineering principles are a vital subset of total design; they influence but do not necessarily relate directly to the user need</li>
<li>To minimize the cycle time for completion of the design core (to minimize process losses), systematic working with modern methods and aids is required</li>
<li><em>Total product quality is only achievable through total design</em></li>
</ol>
<p>
I know of no popular software development methodology that lives up to these ideals.  So, we are trying to define one!</p>
</td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>http://leansoftwareengineering.com/2007/08/21/total-design/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What is coupling, really?</title>
		<link>http://leansoftwareengineering.com/2007/08/08/what-is-coupling-really/</link>
		<comments>http://leansoftwareengineering.com/2007/08/08/what-is-coupling-really/#comments</comments>
		<pubDate>Thu, 09 Aug 2007 04:01:01 +0000</pubDate>
		<dc:creator>Corey Ladas</dc:creator>
				<category><![CDATA[design]]></category>
		<category><![CDATA[lean]]></category>

		<guid isPermaLink="false">http://leansoftwareengineering.com/2007/08/08/what-is-coupling-really/</guid>
		<description><![CDATA[Any software engineer responsible for more than a few tens of thousands of lines of code ought to be required by law to have the words: MINIMIZE COUPLING, MAXIMIZE COHESION &#8230;laser etched onto his or her corneas. Software engineering rightly concerns itself with these two properties as the primary considerations of structural design. And it [...]]]></description>
			<content:encoded><![CDATA[<p>Any software engineer responsible for more than a few tens of thousands of lines of code ought to be required by law to have the words:</p>
<p style="text-align:center;">MINIMIZE COUPLING, MAXIMIZE COHESION</p>
<p>&#8230;laser etched onto his or her corneas.  Software engineering rightly concerns itself with these two properties as the primary considerations of structural design.  And it turns out that proper attention to these things is necessary to the <a href="http://leansoftwareengineering.com/2007/04/22/schedule-is-orthogonal-to-workflow/" target="_blank">effective operation of lean scheduling</a>.</p>
<p>The definitions of cohesion and coupling are interrelated, so that it is a bit difficult to tease one out in isolation, but a simple definition might be:</p>
<p style="margin-left:2em;"><strong>Cohesion</strong> measures the semantic strength of relationships between components within a functional unit</p>
<p style="margin-left:2em;"><strong>Coupling</strong> measures the strength of all relationships between functional units</p>
<p>Cohesion is closely bound to the idea of <em>abstraction</em>.  An information system is ultimately composed of physical devices, themselves layers of abstraction, that are assigned logical meanings and are built up into progressively more abstract constructs in order to finally represent human intentions.  There are different styles of abstraction, from the functional, to the relational, to the object-oriented, but they&#8217;re all after the same goals of modularity, composability, and hierarchy.</p>
<p><img src='http://leansoftwareengineering.com/wp-content/uploads/2007/08/abc.jpg' style='float:left; width:120px;' />Of the two properties, coupling is easier to measure and understand, because it is more mechanical in nature and requires less interpretation.  Suppose there are three components A, B, and C.  A&#8217;s behavior depends upon B in some way (any way), A&#8217;s behavior depends upon C in some way, and the behavior of B and C do not appear to depend upon anything else.  That&#8217;s pretty much it, that&#8217;s the coupling of the system according to our definition, and it&#8217;s the sort of thing that a machine can figure out by simple measurement.</p>
<p>Cohesion is more difficult to measure directly because it is a measure of the meaning of relationships, and not just their mechanical strength.  However, cohesion has a very strong influence on coupling, and systems that feature poor cohesion often feature poor coupling as a consequence.  We usually discover poor cohesion when we are looking for the cause of poor coupling, or through casual inspection, because designs with poor cohesion tend to look like gibberish.  A machine would have to understand the intention of the designer in order to measure cohesion effectively.  I don&#8217;t know about you, but I find some comfort in the fact that machines don&#8217;t have that capability yet.</p>
<p><img src='http://leansoftwareengineering.com/wp-content/uploads/2007/08/dsg.jpg' style='float:left; width:100px;margin-right:1em'/>So, we can take all of this to heart and build a system that would appear to have low coupling and high cohesion.  All of the modules represent clear abstractions with inviolable abstract data types.  All variables and tables have clear types with equally clear labels.  All functions perform the one and only operation that their identifiers suggest that they do.  There is no global state of any kind.  Further, modules communicate with one another in such a way that not only avoids dependency cycles, but forms a perfect tree, the very ideal of low coupling.</p>
<p>Can we thus characterize our system as having low coupling and high cohesion?  The answer is:  <em>it depends</em>.</p>
<p>But&#8230;we followed the rules, how can I say that it depends?  The answer is:  it depends on how the system is used.  The system may have a beautiful internal logic, perfect in its self-consistency, but if the semantics of the system are inconsistent with how the system is used in practice, then it may actually exhibit very strong coupling.</p>
<p><img src='http://leansoftwareengineering.com/wp-content/uploads/2007/08/dg0.jpg' style='float:right; width:150px' /><br />
Let&#8217;s examine why.  It turns out that the classic computer science definition of coupling may be insufficient because the definition of cohesion doesn&#8217;t necessarily relate the structure of the problem domain to the structure of the solution domain.  If there is a direct correspondence between the functional requirements of the system and the design structure of the system, then our original design preserves its status of minimum coupling.  If there is no interaction between the functions themselves, then we say that the system is functionally uncoupled.</p>
<p>Still with me?  I promise that this is of the utmost relevance to lean project scheduling!</p>
<p><img src='http://leansoftwareengineering.com/wp-content/uploads/2007/08/dg1.jpg' style='float:left; width:150px;margin-right:1em' />A functional requirement of the system may have dependencies upon multiple design elements.  Common dependencies mean that functions have an opportunity to interfere with one another, either at design time or at run time.  However, this interference can always be resolved by applying the functions in a certain order.  If the system functions can always be resolved by sequencing, then we would say that the system was decoupled.  The dependency graph of the functions of the system contains no cycles.  Purely uncoupled designs are uncommon, so most workable designs in the world are of the decoupled variety.</p>
<p><img src='http://leansoftwareengineering.com/wp-content/uploads/2007/08/dg2.jpg' style='float:right; height:150px'  />By adding only one more design dependency, we have now added a nasty dependency cycle between functions 2 and 3.  Because each function shares the same common dependencies on the design structure, there is no way to avoid interference between them.  This interference may manifest at design time or run time, but probably both.</p>
<p>What this case means is that a design has been applied to a problem for which it is poorly suited.  The design has good internal structure, but because it is poorly adapted to its purpose, it will perform poorly.  This design would satisfy the classic software definition of low coupling and high cohesion, but it&#8217;s still a badly coupled design.</p>
<p>The importance of functional coupling to lean scheduling is about rework and variation in task duration.  A design that contains functional dependencies will necessarily cause retesting and rework as old design decisions must be revisited to accommodate new dependencies.  Keeping the functional dependency graph acyclic makes this manageable because the refactoring required to complete any particular new functional requirement can be completed in a time that is a function of the number of shared dependencies.  Refactoring of requirements with cyclic dependencies may require more extensive rework and possibly architectural re-engineering.</p>
<p>The lean way to deal with this, of course, is to make satisfaction of global coupling criteria part of the completion of any particular new function, and to allocate a portion of engineering capacity to continuously optimize total system structure.  This is essentially the same approach as the agile practices of continuous integration and refactoring, but we can have criteria that are a little bit more precise than &#8220;bad smells.&#8221;</p>
<p>Some functional coupling is due to factors that are beyond the direct control of the designer.  This often involves shared system resources that you can&#8217;t change.  In these cases, the design may not be amenable to refactoring, and requires the installation of a decoupling device.  Decouplers in software systems usually take the form of semaphores, message queues, virtual memory, processor schedulers, and the like.  They make a shared resource appear to be dedicated to each client, usually according to some kind of time slicing.  It is helpful to see them as a more general example of decouplers, because this perspective makes other design alternatives more apparent.</p>
<p>As it turns out, Extreme Programming addresses the issue of functional coupling, in its typically blurry way, with the idea of Metaphor.  The use of metaphor improves the chances that the design will be well suited to its intended function.  Further, the practice of regular refactoring ensures that the cohesion of the design remains high, and that the integrity of the metaphor is subject to continuing scrutiny.  Feature Driven Development also addresses this issue by construction of a domain model and use of object-oriented design techniques to align the structures of the problem and solution domains.  In the right hands, FDD or XP practices are likely to keep a design within the decoupled realm, although in an informal manner.  Metaphor is a convenient mechanism for managing this issue, but we don&#8217;t have to settle for XP&#8217;s hand-waving explanation, because we can have the real thing.  There is a neat mathematical description of functional coupling relationships and we will get into more detail about that in a future post.</p>
<p>It is nice that one can simply follow these methods and know that they will produce a good result, but it also nice to know why they work and how to measure the results.  Our goal of elevating agile development methods to the level of Software Engineering requires that we do so.  A more rigorous definition of coupling also helps us find hidden interactions that we never intended.  Because at the end of the day, source code can only describe what we want the system to do, and not what the system actually does.</p>
]]></content:encoded>
			<wfw:commentRss>http://leansoftwareengineering.com/2007/08/08/what-is-coupling-really/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.590 seconds -->
