<?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>Software Creation Mystery &#187; Process</title>
	<atom:link href="http://softwarecreation.org/category/process/feed/" rel="self" type="application/rss+xml" />
	<link>http://softwarecreation.org</link>
	<description>What are the forces behind software development?</description>
	<lastBuildDate>Wed, 07 Jul 2010 04:34:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>When should you Release Early and Often?</title>
		<link>http://softwarecreation.org/2009/when-should-you-release-early-and-often/</link>
		<comments>http://softwarecreation.org/2009/when-should-you-release-early-and-often/#comments</comments>
		<pubDate>Thu, 24 Dec 2009 21:08:06 +0000</pubDate>
		<dc:creator>Andriy Solovey</dc:creator>
				<category><![CDATA[Concepts]]></category>
		<category><![CDATA[Practices]]></category>
		<category><![CDATA[Process]]></category>

		<guid isPermaLink="false">http://softwarecreation.org/?p=88</guid>
		<description><![CDATA[ShareJason Cohen posted an interesting and provocative argument against Release Early, Release Often principle followed by many agile teams.
His main points:

Ideas. The best ideas are not coming from users and they are bad in providing feedback (iPod). So, there is no point to release early to get their opinion and ideas.
Features. Minimal early set of features could [...]]]></description>
			<content:encoded><![CDATA[<div class='dd_post_share'><div class='dd_buttons'><div class='dd_button'><iframe src='http://api.tweetmeme.com/button.js?url=http://softwarecreation.org/2009/when-should-you-release-early-and-often/&source=AndriySolovey&service=&service_api=&style=compact' height='20' width='90' frameborder='0' scrolling='no'></iframe></div><div class='dd_button'><a name='fb_share' type='button_count' share_url='http://softwarecreation.org/2009/when-should-you-release-early-and-often/' href='http://www.facebook.com/sharer.php'>Share</a><script src='http://static.ak.fbcdn.net/connect.php/js/FB.Share' type='text/javascript'></script></div><div class='dd_button'><script src='http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://softwarecreation.org/2009/when-should-you-release-early-and-often/'></script></div><div class='dd_button'><a title='Post on Google Buzz' class='google-buzz-button' href='http://www.google.com/buzz/post' data-button-style='small-count' data-url='http://softwarecreation.org/2009/when-should-you-release-early-and-often/'></a><script type='text/javascript' src='http://www.google.com/buzz/api/button.js'></script></div><div class='dd_button'><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http://softwarecreation.org/2009/when-should-you-release-early-and-often/&amp;title=When+should+you+Release+Early+and+Often%3F&amp;t=2' height='18' width='120' frameborder='0' scrolling='no'></iframe></div></div></div><div style='clear:both'></div><p>Jason Cohen posted an interesting and provocative <a href="http://onstartups.com/tabid/3339/bid/11416/Releasing-Early-Is-Not-Always-Good-Heresy.aspx">argument</a><span> </span>against <em>Release Early, Release Often</em> principle followed by many agile teams.</p>
<p>His main points:</p>
<ul>
<li><strong>Ideas.<span> </span></strong>The best ideas are not coming from users and they are bad in providing feedback (iPod). So, there is no point to release early to get their opinion and ideas.</li>
<li><strong>Features.<span> </span></strong>Minimal early set of features could be unattractive for majority of users and will turn them down for future use (Apple <a href="http://en.wikipedia.org/wiki/Apple_Newton">Newton</a>)</li>
<li><strong>Quality.<span> </span></strong>A buggy and unpolished product could ruin your reputations</li>
<li><strong>Architecture.</strong><span> </span>An incorrect initial architecture creates waste and serious problems down the road (Netscape, Twitter)</li>
</ul>
<p>Therefore, Jason against releasing early and often. I don&#8217;t agree.</p>
<h3 style="font-size: 1.17em;">My answer: it depends!</h3>
<blockquote><p>Evolution is the process of small frequent changes to improve and adapt to environment.</p></blockquote>
<p><span id="more-88"></span></p>
<p>One of my <a href="http://softwarecreation.org/2008/selecting-the-best-strategy-for-software-teams-retreat-evolution-or-revolution/">posts</a><span> </span>reviewed how software team should select the best strategy: evolution, revolution or retreat. Another<span> </span><a href="http://softwarecreation.org/2008/ideas-in-software-development-revolution-vs-evolution-part-1/">post</a><span> </span>compared evolution to revolution.<span> </span><strong>Evolution</strong><strong><span style="font-weight: normal;"><span> </span>(and aligned core Agile principles) requires early and frequent releases</span>.</strong><span> </span><strong>Revolution</strong><span> </span>pushes innovative product that should disrupt market. Requirements for a revolutionary product ideas are much higher, because it should overcome resistance, create new niche and gain acceptance of the new paradigm. Therefore, revolutionary product should be well thought and prepared to hit the mark. I should note that revolution often becomes evolution after initial release.</p>
<p>Decision factors for selecting strategy<span> </span><em>Release Early, Release Often</em><span> </span>(evolutionary):</p>
<ol>
<li><strong>People.</strong><span> </span>Are they highly talented and capable to come up with great ideas from the beginning ? Or should they learn and understand better the problem space, release incrementally and get more feedback from the users for initial assumptions?</li>
<li><a href="http://softwarecreation.org/2008/ideas-in-software-development-the-game/"><strong>The Game</strong></a>. Is the problem (software requirements and business domain) unclear, complex, challenging and require a lot of trials and feedback? Or is the problem space well known and team already have good experience with it and can release a great product from the first attempt?</li>
<li><strong>The Dynamic</strong>. Is the team under a pressure to release a product early, catch at the market opportunity or help a company to survive? Or do they have luxury to take a time for designing properly and release a polished product?</li>
</ol>
<p><img style="border: 0px initial initial;" title="strategy selection" src="http://softwarecreation.org/images/2008/strategy-selection.jpg" alt="" width="600" height="600" /></p>
<p>There are some cases where long release cycles make sense for the company:</p>
<ol>
<li>A company has deep expertise and hired highly talented and experienced people who know how to build successful product.</li>
<li>A company have enough funds and time to sustain long development and tolerant to inefficiency because incorrect assumptions or lack of feedback.</li>
<li>Customers have low tolerance for risk and the software is mission- or life-critical.</li>
</ol>
<p>However, I expect that for many software teams the most optimal strategy will be evolutionary -<span> </span><em>Release Early, Release Often</em>.</p>
<p>I partially agree with Jason that most users will not help with ideas or provide meaningful feedback. Also it is a bad idea to ship buggy, unfinished and useless product. But a team could get more than user feedback from early and frequent releases:</p>
<ul>
<li><strong>release!</strong><span> </span>This is a huge and most important criteria of development success &#8211; the product is releasable and working</li>
<li><strong>integrate</strong> and put the product pieces together, which is almost impossible to replicate in the test environment</li>
<li><strong>practically experience</strong><span> </span>work of the live product - infrastructure and production problems, performance, scalability and user interactions in their environment. These problems can radically change the view on architecture</li>
<li><strong>reality check</strong><span> </span>- learn from how people use the product: validate initial assumptions, collect praises and complains, real usage patterns, statistics and maybe even some ideas from users :)</li>
<li><strong>emergence of the new ideas</strong><span> </span>and process improvement after experiencing product in the wild live environment</li>
</ul>
<p>A software company should avoid treating users as guinea pigs for their early experiments, but nothing can beat practical benefits of releasing code and learning from it.</p>
<p><em>&#8220;In theory there is no difference between theory and practice. In practice there is.&#8221;</em> &#8212; Yogi Berra</p>
<p>Referenced post: <a href="http://onstartups.com/tabid/3339/bid/11416/Releasing-Early-Is-Not-Always-Good-Heresy.aspx">Releasing Early Is Not Always Good? Heresy!</a> by Jason Cohen @onstartups.com</p>
<!-- Social Buttons Shared Counts Generated by Digg Digg plugin v4.0.9, 
    Author : Yong Mook Kim
    Website : http://www.mkyong.com/blog/digg-digg-wordpress-plugin/ --><img src="http://softwarecreation.org/?ak_action=api_record_view&id=88&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://softwarecreation.org/2009/when-should-you-release-early-and-often/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>How to rescue failing software projects: The Toyota Way</title>
		<link>http://softwarecreation.org/2009/how-to-rescue-failing-software-projects-toyota-way/</link>
		<comments>http://softwarecreation.org/2009/how-to-rescue-failing-software-projects-toyota-way/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 05:02:59 +0000</pubDate>
		<dc:creator>Andriy Solovey</dc:creator>
				<category><![CDATA[Concepts]]></category>
		<category><![CDATA[Practices]]></category>
		<category><![CDATA[Process]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Teams]]></category>

		<guid isPermaLink="false">http://softwarecreation.org/2009/how-to-rescue-failing-software-projects-toyota-way/</guid>
		<description><![CDATA[ShareThe manager slams a door and tells us that we are in a big trouble. Our old customers complain about many bugs and bad performance, new customers complain about delays and lack of dedication. And, top management considers our department financially unsustainable and wants to deeply cut expenses.
The manager tells that we are brilliant programmers, [...]]]></description>
			<content:encoded><![CDATA[<div class='dd_post_share'><div class='dd_buttons'><div class='dd_button'><iframe src='http://api.tweetmeme.com/button.js?url=http://softwarecreation.org/2009/how-to-rescue-failing-software-projects-toyota-way/&source=AndriySolovey&service=&service_api=&style=compact' height='20' width='90' frameborder='0' scrolling='no'></iframe></div><div class='dd_button'><a name='fb_share' type='button_count' share_url='http://softwarecreation.org/2009/how-to-rescue-failing-software-projects-toyota-way/' href='http://www.facebook.com/sharer.php'>Share</a><script src='http://static.ak.fbcdn.net/connect.php/js/FB.Share' type='text/javascript'></script></div><div class='dd_button'><script src='http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://softwarecreation.org/2009/how-to-rescue-failing-software-projects-toyota-way/'></script></div><div class='dd_button'><a title='Post on Google Buzz' class='google-buzz-button' href='http://www.google.com/buzz/post' data-button-style='small-count' data-url='http://softwarecreation.org/2009/how-to-rescue-failing-software-projects-toyota-way/'></a><script type='text/javascript' src='http://www.google.com/buzz/api/button.js'></script></div><div class='dd_button'><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http://softwarecreation.org/2009/how-to-rescue-failing-software-projects-toyota-way/&amp;title=How+to+rescue+failing+software+projects%3A+The+Toyota+Way&amp;t=2' height='18' width='120' frameborder='0' scrolling='no'></iframe></div></div></div><div style='clear:both'></div><p>The manager slams a door and tells us that we are in a big trouble. Our old customers complain about many bugs and bad performance, new customers complain about delays and lack of dedication. And, top management considers our department financially unsustainable and wants to deeply cut expenses.<br />
The manager tells that we are brilliant programmers, work very hard and create cool software solutions. But there is something wrong and we cannot work this way anymore.</p>
<p>Anxiety started to penetrate our souls. We know what is wrong: our team is short of people, we have too many commitments, our code is becoming a big mess, new technology and our new software version makes something bad with servers. A snowball of different problems makes us stressed, distracted and incapable of productive work.</p>
<p>What could our manager do next?</p>
<ol>
<li><strong>Distrust</strong>. Become a dictator, make own decisions including hiring external consultants to recommend what to do or even replace us. However,
<ul>
<li>we are good programmers and know our business well &#8211; the problem is <strong>not in lack of skill and knowledge</strong></li>
<li>external people will take a lot of time to understand the system and <strong>they will have different motivation</strong> and won&#8217;t care about the long-term success</li>
<li>people will be<strong> demotivated</strong> and the manager cannot make effective decisions <strong>without active team involvement</strong></li>
</ul>
</li>
<li><strong>Faith</strong>. Give to team the full power to fix a problems and make own decisions in hope that smart people, motivation and technical expertise will do magic. However,
<ul>
<li>fresh outlook and thinking out of box are hard when a team <strong>immersed for a long time</strong> into difficult situation</li>
<li>a team possibly doesn&#8217;t have understanding and <strong>control over external forces</strong> &#8211; management, customers, finances</li>
<li><strong>changing of reality is tough</strong> (especially in people heads) and requires more than technical experience</li>
</ul>
</li>
</ol>
<p>There is a third way. Place improvement practices in the core of development process. Make self-improvement inevitable and required for any activity. Do it every day.</p>
<p><img src="http://softwarecreation.org/images/2009/process-improvement.jpg" /></p>
<p><strong>Toyota Way</strong> is the best example of large-scale reliable self-improvement process. It focuses on eliminating waste, solving problems at root cause and making right decisions. Toyota Way reduces problems, increases internal efficiency and makes a company successful. This is the best receipt for coming out of crisis.</p>
<p id="f2g8" style="text-align: left"><img src="http://softwarecreation.org/images/2009/inglorious1.jpg" style="width: 450px; height: 300px" height="300" width="450" /></p>
<p><strong style="color: #000000">Targets:</strong></p>
<ul>
<li><strong><span style="color: #ff0000">Problems</span> </strong>- emergencies, fires that require immediate fix: bugs, server crushes, deadline slips</li>
</ul>
<ul>
<li><strong><span style="color: #ff0000">Waste</span> </strong>- inefficient and non-value adding activities: waiting, misinformation, stress</li>
</ul>
<ul>
<li><strong>Challenges </strong>- adaptation to external forces (market, competitors, customers, society): new trends and technologies, changes in users expectations for user interface and functionality</li>
</ul>
<p><span id="more-87"></span></p>
<h3>Practices to see waste and stop to fix problems</h3>
<p id="fqz3" style="text-align: left"> <img src="http://softwarecreation.org/images/2009/inglorious2.jpg" style="width: 316px; height: 499px" height="499" width="316" /></p>
<h4><strong>1. Seeing waste</strong></h4>
<p id="rjed" style="text-align: left">The team and managers should learn to see targets &#8211; real problems and waste. Otherwise improvements will be wild shots in the dark.</p>
<p>There are many targets in software development:</p>
<ul>
<li>stressed people &#8211; reduced energy, less productivity, more mistakes</li>
<li>waiting &#8211; delays, tools / system problems and downtime, capacity bottlenecks (waiting for results of other people work)</li>
<li>over-engineering &#8211; producing features and complicate design without real need</li>
<li>unfinished work &#8211; functionality not used in a live system, probably still in design or under development or simply discarded (but not removed)</li>
<li>defects &#8211; complete waste of time and money</li>
<li>unused creativity &#8211; loosing time, ideas, skills, improvements and learning by not engaging or listening to your employees</li>
<li>inadequate information &#8211; unclear, misleading or simply wrong information that causes useless activity and leads to rework at the end</li>
</ul>
<ul>
<li>over-processing &#8211; taking unneeded steps to build software because of poor process and system design, overhead, bureaucracy, compliance, cumbersome tools</li>
<li>motion &#8211; how much effort to get necessary information, access systems or use tools</li>
<li>multi-tasking &#8211; losing time to switch between projects, tasks or different activities</li>
</ul>
<h4><strong>2. Jidoka </strong>- stop to fix the problem to get quality right the first time</h4>
<p>It is not enough to see your targets. The Team should carry commandment to shoot targets immediately. Otherwise the best intentions will be buried under growing avalanche of problems.</p>
<p>How to stop:</p>
<ul>
<li>quality for the customer drives all the processes &#8211; prevents temporary patches and bad for quality decisions</li>
<li>low tolerance for quality problems and immediate detection are core work principle</li>
<li>use <a href="http://en.wikipedia.org/wiki/Andon_%28manufacturing%29" title="Andon" id="uk-6">Andon</a> &#8211; a system to signal for help, notify about a problem and stop the process</li>
</ul>
<ul>
<li>build in tools and process capabilities of detecting problems and stopping itself</li>
<li>use all modern QA methods available</li>
<li>managers encourage stops to fix problems and support implementation of counter measures</li>
</ul>
<h3>Making Decisions</h3>
<p><em>&#8220;Make decisions slowly by consensus and thoroughly considering all options, implement rapidly.</em><em>&#8220;</em> &#8211; Toyota Way</p>
<p>Even knowing problems and committed to solve them, the Team should make right decisions how to do it.</p>
<p><strong>Make decisions slowly</strong></p>
<ol>
<li>Go and See (Genchi Genbutsu)</li>
<li>Understand underlying causes (Kaizen)</li>
<li>Broadly consider alternative solutions and develop a detailed rationale for preferred solution delaying certain decision as long as possible (<a href="http://6sigma.mty.itesm.mx/Toyotas.pdf" title="Set-based concurrent engineering" id="t_q_">Set-Based concurrent engineering</a>)</li>
<li>Build consensus within a team and partners where group decision is preferred (while management can step in if consensus is not achieved)</li>
<li>Use very efficient communication devices &#8211; preferably one side of one sheet of paper</li>
</ol>
<p><strong>Implement rapidly</strong></p>
<ol>
<li>Put in place solutions and counter measures.</li>
<li>Evaluate the results</li>
<li>Standardize if solution is effective.</li>
</ol>
<h3>Practices to Eliminate Waste and Solve Problems</h3>
<p id="eigf" style="text-align: left"><img src="http://softwarecreation.org/images/2009/inglorious3.jpg" style="width: 450px; height: 300px" height="300" width="450" /></p>
<h4><strong>3. Genchi Genbutsu</strong> &#8211; go and see for yourself to thoroughly understand situation</h4>
<p>How often do we jump to conclusion based on partial information, vague assumptions and what other people say? Information creates reality in your mind. This reality is a base for your decisions. So, you and the Team should get right information to make right decisions:</p>
<ul>
<li>observe situation with blank mind</li>
<li>avoid assumptions and preconceptions</li>
<li>use personally verified information</li>
</ul>
<p>In short, base decisions on what really is going on</p>
<h4><strong>4. Kaizen (5 why&#8217;s)</strong> -continuous learning and improvement</h4>
<p><em>&#8220;We view errors as opportunities for learning&#8221;</em> &#8211; Toyota Way<br />
The Team should find the root causes of the problems. Kaizen helps to find the root cause by repeatedly asking why the problem occurs.</p>
<p>Example of Kaizen<br />
Problem: there are persistent javascript errors on a live site</p>
<ol>
<li>Why? A developer didn&#8217;t build correct logic for complex web UI components interaction</li>
<li>Why? A developer built own solution without guidance and enough experience in this area</li>
<li>Why? A team expert didn&#8217;t tell about existing proven solutions, didn&#8217;t help and didn&#8217;t share knowledge</li>
<li>Why? The team is under stress, over-committed and don&#8217;t have time to communicate</li>
<li>Why? Managers accept too much work without consulting with development team</li>
<li>Why? you can continue&#8230;</li>
</ol>
<p>Kaizen forces us to overcome desire to find a first convenient explanation and patch problems without fixing root causes. By ruthlessly applying this practice, we get deeper insight into reality and better learn our product, processes, people, environment and tools. Kaizen is a core practice to see waste, solve problems and improve process.</p>
<p>To avoid forgetting learning from Kaizen, it is important to standardize the improved process and make it a base for further improvements.</p>
<h3><strong>Practices to Support Flow</strong></h3>
<p id="l36f" style="text-align: left"><img src="http://softwarecreation.org/images/2009/inglorious4.jpg" style="width: 480px; height: 318px" height="318" width="480" /></p>
<h4><strong>5. Standards</strong> &#8211; best you know today which is to be improved tomorrow</h4>
<p>Standardized work is easier, cheaper and faster &#8211; stable repeatable methods can maintain predictability, high productivity and support quality.<br />
Effective standards are not coming from theories, they come from</p>
<ul>
<li>best practices</li>
<li>accumulated learnings and individual experience</li>
<li>lessons from applying existing standards</li>
</ul>
<p>The Team should try to use standards in many areas: project phases and activities; development practices; architecture and design approaches; code conventions; tools; programming techniques; libraries and third-party code; reuse of components and solutions; testing and so on.<br />
Standardization in software development is a controversial topic &#8211; some <a href="http://en.wikipedia.org/wiki/A_Guide_to_the_Project_Management_Body_of_Knowledge" title="theorists" id="kyqe">theorists</a> want to bring programming closer to standard-dominated engineering, practitioners are keen to reduce standardization to minimum promoting creativity and self-organization. In the rigid interpretation, standards are &#8220;must to follow&#8221; rules for any situation, in other interpretation standards are well defined steps and guidelines highly recommended for specific context. I support the latter definition. A productive team should have standards in place to focus on customer needs instead of fighting with the same puzzles and problems over and over again.</p>
<p>The system of standards shouldn&#8217;t be a heavy bureaucratic conduit, but a light and fluid book of knowledge. The book that contains most helpful and important rules and checklists. Standards will be effective if they are minimal, reviewed often (Kaizen) and followed by every team member.</p>
<h4><strong>6. Reliable thoroughly tested technology </strong></h4>
<p>The Team should be conservative with new technologies. Software development and IT thrive on change and innovation. However, Toyota Way suggests to be conservative in adapting technology and considers stability and reliability of operations as much more important goal than keeping on the cutting edge of technology.</p>
<p>Considerations for using technology</p>
<ul>
<li>primary goal is to improve flow and support people, process and values.</li>
<li>process is driven by business, not technology concerns; software and tools do not eliminate themselves waste</li>
<li>technology is visual and intuitive &#8211; people can use it correctly and effectively</li>
</ul>
<ul>
<li>process manually before adapting technology to support the process &#8211; understand what problems it solves and how technology could help</li>
<li>important: people / processes are easy to Kaizen, machines are difficult</li>
</ul>
<p>Adopting new technology:</p>
<ul>
<li>new technology is unreliable and difficult to standardize, therefore it endangers flow</li>
<li>proven process takes precedence over new and untested technology</li>
<li>conduct actual tests before adapting new technology</li>
<li>reject technology if it conflicts with culture or might disrupt stability, reliability and predictability</li>
</ul>
<p>In the same time <strong>encourage people to consider new technologies</strong> while looking into new approaches. If technology improves process and flow &#8211; quickly implement after thorough testing.</p>
<h4>7. <strong>Visual Controls</strong></h4>
<p id="df5i" style="text-align: left"><img src="http://softwarecreation.org/images/2009/inglorious5.jpg" style="width: 450px; height: 302px" height="302" width="450" /></p>
<p>The Team should have clear status of information. Visual controls can convey complex information in fast and efficient for our brains way. We can use controls as a user story board; status of projects, servers or code build; burn down charts and others.<br />
Simple visual indicators help people determine immediately whether they are deviating from the standards, provide quick gist of situation and direction for solving problems.</p>
<ul>
<li>use simple and most important indicators</li>
</ul>
<ul>
<li>than provide clear picture for decisions and what to do next</li>
<li>reduce reports to one screen / piece of paper even for the most important decisions</li>
</ul>
<h3>People, leaders and teams</h3>
<p id="w7ez" style="text-align: left"><img src="http://softwarecreation.org/images/2009/inglorious6.jpg" style="width: 500px; height: 497px" height="497" width="500" /></p>
<h4><strong>8. People</strong></h4>
<p>People who build software are the people who should improve the process. They are directly involved and have first-hand experience of problems and waste.</p>
<p>Toyota Way expects that each team member is a problem solver and values job experience more than theoretical knowledge. The Team will beat any external consultants and find better way to work if people are open about problems and eager to find good solutions.</p>
<h4><strong>9. Leaders</strong></h4>
<p>The Team desperately needs strong leaders to build great products to overcome problems. Toyota grows leaders within who thoroughly understand the work, live the philosophy and must understand the daily work in great details</p>
<p><strong>Chief Engineer</strong> is a key person in Toyota projects.:</p>
<ul>
<li>blessed by top management</li>
<li>has control over project</li>
<li>exceptional engineer</li>
<li>critical link: between engineers and customer satisfaction</li>
<li>coach for other engineers</li>
<li>focus on concepts first, technicalities later</li>
</ul>
<p>Chief Engineer concept is an excellent example for software technical leadership. A software team leader often lacks authority or makes too technical decisions without good understanding of customer needs.</p>
<h4><strong>10. Teams</strong></h4>
<p>The Team should be diverse and capable of solving wide range of problems. Toyota builds cross functional product teams, which</p>
<ul>
<li>use integrative decision making</li>
<li>fast and accurate in implementation</li>
<li>enhance process and flow by solving difficult technological problems</li>
</ul>
<p>Software developers and their leaders are foundation of success in any project. Management, process and technology can only support them. And anyway, the process is as good as people follow it. Therefore, it is important to make software teams a key player in process improvements &#8211; they know problems, they understand work and they are capable to find good solutions.</p>
<h3>Using Toyota Way</h3>
<p id="n667" style="text-align: left"><img src="http://softwarecreation.org/images/2009/inglorious7.jpg" style="width: 450px; height: 450px" height="450" width="450" /></p>
<p>Can The Team revert a situation and win? Can it build the optimal process and expertise for fast development of high quality and low cost solutions?</p>
<p>This post shows the most effective option &#8211; build continuously improving process into the heart of development. The process that focuses on quality, eliminates waste and fixes problems at root cause. I believe this approach is a foundation of long term success. Your managers and company would love it!</p>
<!-- Social Buttons Shared Counts Generated by Digg Digg plugin v4.0.9, 
    Author : Yong Mook Kim
    Website : http://www.mkyong.com/blog/digg-digg-wordpress-plugin/ --><img src="http://softwarecreation.org/?ak_action=api_record_view&id=87&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://softwarecreation.org/2009/how-to-rescue-failing-software-projects-toyota-way/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Reliable Software Development Process: The Toyota Way</title>
		<link>http://softwarecreation.org/2009/reliable-software-development-process-the-toyota-way/</link>
		<comments>http://softwarecreation.org/2009/reliable-software-development-process-the-toyota-way/#comments</comments>
		<pubDate>Wed, 07 Oct 2009 03:06:33 +0000</pubDate>
		<dc:creator>Andriy Solovey</dc:creator>
				<category><![CDATA[Concepts]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Process]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Teams]]></category>

		<guid isPermaLink="false">http://softwarecreation.org/2009/reliable-software-development-process-the-toyota-way/</guid>
		<description><![CDATA[Share
A software project is a creative, unique and therefore unpredictable endeavor. We are not building the same thing over and over again, but solve new problems, address increasing demands and use perpetually changing technologies. Under these conditions, people &#8211; smart, creative and productive &#8211; are the most important factor of success . Software development process [...]]]></description>
			<content:encoded><![CDATA[<div class='dd_post_share'><div class='dd_buttons'><div class='dd_button'><iframe src='http://api.tweetmeme.com/button.js?url=http://softwarecreation.org/2009/reliable-software-development-process-the-toyota-way/&source=AndriySolovey&service=&service_api=&style=compact' height='20' width='90' frameborder='0' scrolling='no'></iframe></div><div class='dd_button'><a name='fb_share' type='button_count' share_url='http://softwarecreation.org/2009/reliable-software-development-process-the-toyota-way/' href='http://www.facebook.com/sharer.php'>Share</a><script src='http://static.ak.fbcdn.net/connect.php/js/FB.Share' type='text/javascript'></script></div><div class='dd_button'><script src='http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://softwarecreation.org/2009/reliable-software-development-process-the-toyota-way/'></script></div><div class='dd_button'><a title='Post on Google Buzz' class='google-buzz-button' href='http://www.google.com/buzz/post' data-button-style='small-count' data-url='http://softwarecreation.org/2009/reliable-software-development-process-the-toyota-way/'></a><script type='text/javascript' src='http://www.google.com/buzz/api/button.js'></script></div><div class='dd_button'><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http://softwarecreation.org/2009/reliable-software-development-process-the-toyota-way/&amp;title=Reliable+Software+Development+Process%3A+The+Toyota+Way&amp;t=2' height='18' width='120' frameborder='0' scrolling='no'></iframe></div></div></div><div style='clear:both'></div><p><img src="http://softwarecreation.org/images/2009/toyota-factory.jpg" /></p>
<p>A software project is a creative, unique and therefore unpredictable endeavor. We are not building the same thing over and over again, but solve new problems, address increasing demands and use perpetually changing technologies. Under these conditions, people &#8211; smart, creative and productive &#8211; are the most important factor of success . Software development process can only support and compliment these people, but it cannot guarantee success alone and make the factor of people negligible.</p>
<p><strong>But</strong>, business wants predictable, reliable and successful results. I bet they don&#8217;t want to be at mercy how cards are shuffled in their talented development team. The answer is in establishing a process that increases chances of success and aligned with present nature of software development (unpredictable, empirical and heavily dependent on people).</p>
<p>The Toyota Way can be a great example that worth to learn. Toyota evolved from a small looming equipment shop to the largest car manufacturing company. The main foundation of successful growth is the system of few core principles that enables <strong>best quality, high productivity, lowest cost, shortest time and long-term success</strong>.<br />
<span id="more-86"></span><br />
Agile and Lean Software Development adopted some practices from Toyota. <em><a href="http://www.amazon.com/gp/product/0321150783?ie=UTF8&amp;tag=softwcreatmys-20&amp;linkCode=xm2&amp;camp=1789&amp;creativeASIN=0321150783" title="Lean Software Development: An Agile Toolkit" id="ix_v">Lean Software Development: An Agile Toolkit</a></em>  (by Mary Poppendieck, Tom Poppendieck) is an excellent book that review Lean practices and principles in details. This post focuses more on philosophy and the system of practices as a whole that can turn software development team into<strong> a smart reliable machine.</strong></p>
<h3>1. Value</h3>
<p><strong>Why customer will pay money for your product? How does your company creates value?</strong></p>
<blockquote><p>All we are doing is looking at the time line from the moment the customer give us an order to the point when we collect the cash. And we are reducing that time line by removing the non-value-added wastes.</p>
<p style="text-align: right">- Taiichi Ohno, founder of TPS</p>
</blockquote>
<p>The only thing that adds value in software development is transformation of information and code into what customer wants. It is very important for software team to know how does it create value for customers. Or simply, decrypt the formula:<br />
<em>Customer </em>(needs) -&gt; <em>Cash </em>(delivered software)</p>
<p><strong>Software Development Value Stream</strong><br />
Problems, needs and ideas are translated into <strong>units of development</strong> &#8211; functionality, user experience (interface, interactions, usability) and system qualities (performance, reliability, security, etc). A software development team transforms these pieces of requirements into a computer system using value-added and many not-so-value-added actions.</p>
<p><img src="http://softwarecreation.org/images/2009/value-stream.jpg" /></p>
<p><strong>The ultimate goal</strong> of Toyota Way is to eliminate non-value-added activities while keeping the best quality of the product.</p>
<h3>2. Flow</h3>
<p><strong>What is the process of creating value in your company?</strong></p>
<p>Properties of the optimal flow for software development:</p>
<ul>
<li>cut back to zero the amount of time that any unit of work is sitting idle or waiting for somebody to work on it</li>
<li>move design, code and information fast, link processes and people together that problems surface right away</li>
</ul>
<p><strong>One-piece flow</strong><br />
The most effective flow is one-piece flow &#8211; a customer need is immediately converted into a delivered software solution. In the same time this is the most demanding flow: a customer, designers, developers, testers and system administrators should be dedicated to the project, immediately available and work as one team together until the need is implemented in a live system.</p>
<p>One-piece flow has significant benefits (if it is implemented right):</p>
<ul>
<li><strong>Quality </strong>- defects detected quickly; close proximity and connections ensure that necessary information is available immediately and important details are not missing; problems are solved quickly</li>
<li><strong>Flexibility </strong>- flexibility to respond and do what customer really wants in real time</li>
<li><strong>Productivity </strong>- the team engaged in high value added continuous work</li>
<li><strong>Morale </strong>- immediate results of work bring sense of accomplishment and job satisfaction</li>
<li><strong>Cost </strong>- lean production with minimal waste</li>
</ul>
<p>However, in reality one-piece flow is difficult to achieve in many projects:</p>
<ul>
<li>a customer is not engaged all the time</li>
<li>complex business domain requires analysis and preparation before development can start</li>
<li>project activities involve people with different skills that are not available immediately</li>
<li>deployment of mission-critical systems demands intensive testing and scheduling</li>
</ul>
<ul>
<li>management, marketing, end-user expect specific time-lines, features and support</li>
</ul>
<ul>
<li>and so on</li>
</ul>
<p>Toyota uses two additional principles to overcome challenges of one-piece flow: <strong>pull systems and leveling out the workload</strong>.<br />
However, Toyota Way says: <em>&#8220;Flow where you can, pull where you must</em>&#8220;. The big challenging goal is to turn eventually all the processes into one-piece flow.</p>
<p><strong>Pull system (Kanban)</strong><br />
<a href="http://en.wikipedia.org/wiki/Kanban" title="Kanban" id="z:4a">Kanban</a> is a signaling system to trigger action. It adds to flow small buffers pulled by customer demand. Kanban allows optimal use of people and natural breaks in processes.</p>
<p>Agile iterations and Scrum sprints are close to Kanban ideas. A team pulls new user stories every time-boxed iteration from the backlog to design, implement, test and deploy within the same iteration.</p>
<p>However, it is not classical Kanban. An original idea would be to pull small batches of user stories for development after a team has finished a current batch (not at the end of fixed time iteration). In parallel, QA pulls implemented user stories for testing and so on. A customer can continue preparing next batches of work based on their priority of needs.</p>
<p>Main ideas</p>
<ul>
<li>provide dependent down stream teams with what they want, when they want and in amount they want</li>
<li>just-in-time &#8211; started by high priority needs</li>
<li>minimize work-in-progress and untested code</li>
<li>frequently push what a customer can use right away</li>
<li>be responsive to day-by-day shifts in demand instead of relaying on long-term schedules</li>
</ul>
<p>Kanban is effective way to synchronize people and teams work without bringing them into continuous flow, where they should be always ready for the next unit of work.</p>
<p><strong>Level Out the Workload (Heijunka)</strong><br />
The main idea of Heijunka is to <a href="http://en.wikipedia.org/wiki/Production_leveling" title="level production" id="ixiy">level production</a> by volume and activities mix.</p>
<ul>
<li>it is not built around actual flow of customer orders</li>
<li>workload is leveled for the period considering previous history and scheduled projects</li>
</ul>
<p>In software development workload could be leveled and scheduled when people could make reliable guess for what is expected. It is different from Kanban that works as just-in-time system adapting to the current workload.</p>
<p>Good candidates for Heijunka are</p>
<ul>
<li>standard procedures (automated testing, performance testing, deployment)</li>
<li>recurring events (meetings, planning, demo, code reviews)</li>
</ul>
<ul>
<li>scheduled tasks for people with limited availability (external consultants, customers, management)</li>
</ul>
<ul>
<li>tasks with high confidence in estimation, usually done many times before (initial requirement exploration, design mockups, security audit, training new team members, reusing components and solutions)</li>
</ul>
<p>Benefits:</p>
<ul>
<li>predictability and active planning</li>
</ul>
<ul>
<li>balanced use of people, ability to schedule their involvement</li>
</ul>
<ul>
<li>smoother demand on customers, shared resources and contractors</li>
</ul>
<p>Toyota Way is focused on eliminating waste of non-value added work (Muda). Heijunka eliminates two additional types of waste:</p>
<ul>
<li>unevenness in project schedule (Mura)</li>
<li>overburden of people and systems (Muri)</li>
</ul>
<p><img src="http://softwarecreation.org/images/2009/development-flow.jpg" /></p>
<h3>Building your own flow</h3>
<p>These three approaches can help you to build most optimal flow. Consider cons and pros:</p>
<p><strong>One-piece flow (push)</strong><br />
pros: minimal waste, fast implementation, low cost, quick problems resolution<br />
cons: uneven workload, requires full availability and high level of engagement<br />
when to use: for one collocated team work that is dedicated to one project</p>
<p><strong>Kanban (pull)</strong><br />
pros: dynamic adaptation to load; synchronization of different teams and disconnected processes<br />
cons: low predictability for completion; buffers hide waste<br />
when to use: disconnected or involved in the multiple projects teams; activities that need people with limited availability</p>
<p><strong>Heijunka (level)</strong><br />
pros: good predictability, ability to plan, balanced use of people: avoid overburden and uneven workload<br />
cons: non-adaptive, inefficient for tasks with unpredictable effort (a lot in traditional software development)<br />
when to use: activities that are standardized, highly predictable or have to be scheduled</p>
<p><img src="http://softwarecreation.org/images/2009/flow-scenario.jpg" /></p>
<p>You cannot build reliable and optimal flow from the scratch based on a theory only. The best process for your projects will emerge as result of evolution, problem solving and eliminating waste. This is a topic of the next post.</p>
<blockquote><p>If some problem occurs in one-piece flow manufacturing then the whole production line stops. In this sense it is a very bad system of manufacturing. But when production stops everyone is forced to solve the problem immediately. So team members have to think, and through thinking team members grow and become better team members and people.</p>
<p style="text-align: right">- Teruyuki Minoura</p>
</blockquote>
<p><strong><br />
References:</strong><br />
<a href="http://www.amazon.com/gp/product/0071392319?ie=UTF8&amp;tag=softwcreatmys-20&amp;linkCode=xm2&amp;camp=1789&amp;creativeASIN=0071392319" title="The Toyota Way" id="lzhs">The Toyota Way</a> by Jeffrey Liker<br />
<a href="http://www.amazon.com/gp/product/0321150783?ie=UTF8&amp;tag=softwcreatmys-20&amp;linkCode=xm2&amp;camp=1789&amp;creativeASIN=0321150783" title="Lean Software Development: An Agile Toolkit" id="ytmp">Lean Software Development: An Agile Toolkit</a><em> </em> by Mary Poppendieck, Tom Poppendieck</p>
<!-- Social Buttons Shared Counts Generated by Digg Digg plugin v4.0.9, 
    Author : Yong Mook Kim
    Website : http://www.mkyong.com/blog/digg-digg-wordpress-plugin/ --><img src="http://softwarecreation.org/?ak_action=api_record_view&id=86&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://softwarecreation.org/2009/reliable-software-development-process-the-toyota-way/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>The Elements of Pragmatic Programming Style. Composition.</title>
		<link>http://softwarecreation.org/2009/the-elements-of-pragmatic-programming-style-composition/</link>
		<comments>http://softwarecreation.org/2009/the-elements-of-pragmatic-programming-style-composition/#comments</comments>
		<pubDate>Mon, 19 Jan 2009 02:25:56 +0000</pubDate>
		<dc:creator>Andriy Solovey</dc:creator>
				<category><![CDATA[Concepts]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Practices]]></category>
		<category><![CDATA[Process]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Skills]]></category>

		<guid isPermaLink="false">http://softwarecreation.org/2009/the-elements-of-pragmatic-programming-style-composition/</guid>
		<description><![CDATA[ShareA really great talent finds its happiness in execution. &#8211; Johann Wolfgang von Goethe
 
source
Qualities of well composed code:

  Quick discovery and understanding of programming logic and components
  Clear organization (for human brains)
  Ease of reuse, modification and evolution
  Close connection between customer ideas and system implementation


Style Components:

Intention - understand your [...]]]></description>
			<content:encoded><![CDATA[<div class='dd_post_share'><div class='dd_buttons'><div class='dd_button'><iframe src='http://api.tweetmeme.com/button.js?url=http://softwarecreation.org/2009/the-elements-of-pragmatic-programming-style-composition/&source=AndriySolovey&service=&service_api=&style=compact' height='20' width='90' frameborder='0' scrolling='no'></iframe></div><div class='dd_button'><a name='fb_share' type='button_count' share_url='http://softwarecreation.org/2009/the-elements-of-pragmatic-programming-style-composition/' href='http://www.facebook.com/sharer.php'>Share</a><script src='http://static.ak.fbcdn.net/connect.php/js/FB.Share' type='text/javascript'></script></div><div class='dd_button'><script src='http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://softwarecreation.org/2009/the-elements-of-pragmatic-programming-style-composition/'></script></div><div class='dd_button'><a title='Post on Google Buzz' class='google-buzz-button' href='http://www.google.com/buzz/post' data-button-style='small-count' data-url='http://softwarecreation.org/2009/the-elements-of-pragmatic-programming-style-composition/'></a><script type='text/javascript' src='http://www.google.com/buzz/api/button.js'></script></div><div class='dd_button'><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http://softwarecreation.org/2009/the-elements-of-pragmatic-programming-style-composition/&amp;title=The+Elements+of+Pragmatic+Programming+Style.+Composition.&amp;t=2' height='18' width='120' frameborder='0' scrolling='no'></iframe></div></div></div><div style='clear:both'></div><p id="ua_7" style="padding: 1em 0pt; text-align: left"><em><span class="huge">A really great talent finds its happiness in execution.</span></em> &#8211; <span class="bodybold">Johann Wolfgang von Goethe</span></p>
<p id="ua_7" style="padding: 1em 0pt; text-align: left"> <img src="http://softwarecreation.org/images/2009/architect.png" /></p>
<p><a href="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Architect.png/485px-Architect.png" class="photocredit">source</a></p>
<p>Qualities of well composed code:</p>
<ol>
<li>  Quick discovery and understanding of programming logic and components</li>
<li>  Clear organization (for human brains)</li>
<li>  Ease of reuse, modification and evolution</li>
<li>  Close connection between customer ideas and system implementation</li>
</ol>
<p><span id="more-80"></span></p>
<p>Style Components:</p>
<ul>
<li><strong><a href="http://softwarecreation.org/2008/the-elements-of-pragmatic-programming-style-intention/">Intention</a> </strong>- understand your task and how to get it done</li>
<li><strong><a href="http://softwarecreation.org/2008/the-elements-of-pragmatic-programming-style-approach">Approach</a> </strong>- basic principles of writing code</li>
<li><strong>Composition </strong>- organization of code</li>
<li><strong>Expression </strong>- expressing ideas in code</li>
<li><strong>Object Oriented Pragmatic Style</strong></li>
</ul>
<p style="margin-top: 30px; margin-bottom: 0px">  <strong>1. Design for customer problems<br />
</strong>Make the customer problem space a core for the software system design. Make every line of code accountable for solving customer needs. It is true that any software system requires a lot of plumbing beyond pure implementation of customer needs. However, technology concerns shouldn&#8217;t prevail. High-level languages and modern programming platforms give us a power to concentrate on customer problems more than on solving technical problems.</p>
<p style="margin-top: 0px; margin-bottom: 0px"> Code could be divided into two categories:</p>
<ul>
<li>  <strong>customer oriented</strong> &#8211; solves customer problems directly, e.g. implementing domain logic, UI interactions and display of information;</li>
<li>  <strong>system oriented</strong> &#8211; solves technical and application specific problems &#8211; data access, event handling, interfaces between subsystem, utilities and other code required for using libraries, systems and platforms.</li>
</ul>
<p style="margin-top: 0px; margin-bottom: 0px">Customer-oriented code brings most value and should be primary design concern.  System-oriented code puts in place infrastructure and support for running customer oriented code.</p>
<p style="margin-top: 0px; margin-bottom: 0px"> <em>Therefore, start with design of customer-oriented code and support it with minimal system-oriented code.</em> This doesn&#8217;t mean that system-oriented code is not important. Complex system environments, sophisticated user interfaces and challenging non-functional requirements (performance, availability, reliability, etc.) could demand major system-oriented development effort. But still customers needs should pull and direct this effort and the whole implementation.<br />
There are many ways to make technical problems dominant over customer problems:</p>
<ol>
<li> Making predetermined technical decisions (databases, programming platforms, messaging systems, expensive middle tier etc.) without considering simpler alternatives.</li>
<li>  Coming up with complex up-front design instead of evolving a simple design into optimal design.</li>
<li>  Starting programming around interesting technical problems forgetting what is important for a customer.</li>
<li>  Building frameworks and system-oriented code before writing code for immediate customer problems.</li>
</ol>
<p>For a example, some teams could start with this picture in mind stretching customer requirements to fit it (even for relatively simple applications).</p>
<p id="faph" style="padding: 1em 0pt; text-align: left"><img src="http://softwarecreation.org/images/2009/microsoft-esb.png" width="60%" height="60%" /></p>
<p> <a href="http://msdn.microsoft.com/en-us/library/bb264584.aspx" class="photocredit">source</a><br />
<strong>2. </strong><strong>Organize and evolve code around domain concepts and customer ideas</strong><br />
Make system design reflecting customer domain and problem space. Keep customer ideas and system implementation connected and synchronized all the time. This is as important as refactoring practice for effective creation of the software system.<br />
<a href="http://domaindrivendesign.org/" title="Domain-driven design" id="myqk">Domain-driven design</a> is an excellent way to build software systems. It puts emphasis on ubiquitous language, distilled domain knowledge and shared domain models that drive software development.</p>
<p><strong>3. Think as a customer<br />
</strong><em>What we see depends mainly on what we look for</em> &#8211; John Lubbock<br />
A programmer often considers programming as an opportunity for solving interesting technical problems. Often a programmer even doesn&#8217;t understand what customers really want. There are 2 consequences. First, the programmer is not interested in simpler solutions focused on the customer problem. Second, the programmer is missing coherent view on the customer problems and purpose of the software system. Over-engineered, complex and misaligned code is one of the most serious problems in software development. An army of business analysts, stressed project managers and smart customer proxies will not force indifferent and ignorant programmers to write code in the best interest of customer.<br />
The programmer should constantly ask himself: &#8220;Will this solution work for my customer?&#8221;. To give correct answer on this simple question the programmer should understand a lot &#8211; customer language, needs, problems, a big picture and business purpose.</p>
<p>Certainly, it is difficult to think as a customer if you are at the bottom of software creation chain:</p>
<ul>
<li> separated from a customer by project and product managers, architects, designers, consultants, experts and panels of stakeholders</li>
<li>  pressed by the heavy process, rigid organization structure and inability to make decisions</li>
<li>  fed with over-processed, distorted and disjointed doses of information coming down through long chain</li>
</ul>
<p>Beautiful software ideas <a href="http://softwarecreation.org/2008/how-a-beautiful-software-system-becomes-frankenstein/" title="can turn into monster applications" id="b2hi">can turn into monster applications</a> &#8211; unusable and disconnected from real needs. Did you feel (as a user) frustrated by complex confusing and irrational program screens and logic? Yes, we, programmers, can easily produce bad stuff if we cannot think as people who need our systems.</p>
<p><strong>4. Sketch programming ideas with unit tests.</strong><br />
Write unit tests first. Any programmer should understand what he is trying to solve with the new code and how it will be used &#8211; possible input, expected output and public interface. A programmer should think about behavior in isolation, under border conditions or within context of existing code. An unit test is an excellent place to sketch nonexistent code, play with it without compilation and see if it is convenient and makes sense. Once the programmer likes sketched ideas in unit tests, he just need to build simple implementation to satisfy these unit tests. The process of writing unit tests focuses a programmer on solving customer problems, understanding code intent and making optimal design decisions. As an additional side effect, the programmer receives comprehensive suite of automated regression tests and executable specifications.</p>
<p>For a example,<br />
<code><br />
CustomerDB.Save(TEST_USER, TEST_PWD)<br />
Customer customer = CustomerDB.Login(TEST_USER, TEST_PWD);<br />
Assert.IsNotNull(customer, "customer should be logged in");<br />
customer.Purchase(TEST_PRODUCT);<br />
List&lt;Order&gt; orders = OrderDB.LoadFor(customer) or maybe... customer.Orders //what is better?<br />
Assert.AreEqual(1, orders.Count, "count");<br />
</code><br />
There are many design decision are made in this unit test without writing any production code. And now programmer can concentrate on implemention without throes of creation.</p>
<p><strong>5. Eliminate duplication</strong><br />
<em>Simplification is ultimate sophistication</em> &#8211; da Vinci<br />
Elimination of duplication is the moving force of evolutionary design. This is straightforward and powerful method to grow an optimal system. Duplication in the code tells that you need better design. Many interesting design ideas are born from the simple need to eliminate duplication in the growing system. These ideas are based on deeper understanding and gained experience as oppose to speculative up-front design ideas.<br />
The main goals of removing duplication are</p>
<ul>
<li>  reduce code</li>
<li>  simplify solution</li>
<li>  make the system more manageable for programmers&#8217; minds.</li>
</ul>
<p>Some sources of duplication:</p>
<ul>
<li>  copy and paste &#8211; <a href="http://softwarecreation.org/2008/a-few-words-in-defense-of-copy-and-paste-programming/" title="acceptable only temporary" id="ml24">acceptable only temporary</a></li>
<li>  similar logic different in details &#8211; generalization is required</li>
<li>  another implementation for the same problem &#8211; better team communication and reuse are required</li>
</ul>
<p><em>Master the core skill of good evolutionary designers &#8211; how to detect and eliminate duplication.</em><br />
The knowledge of design patterns is the most useful on this step. The <a href="http://softwarecreation.org/2008/the-elements-of-pragmatic-programming-style-approach/" id="ucd5" title="initial simple solution">initial simple solution</a> rarely requires design patterns. But as a system grows, design patterns can effectively and elegantly solve new complex design problems.<br />
Example of elimination of high level duplication with Template method design pattern<br />
This code was used in many data access classes almost the same way, but with different inner steps</p>
<pre>
        using (SqlConnection conn = NewSqlConnection())

        {

            SqlCommand cmd = conn.CreateCommand();

            cmd.CommandType = CommandType.StoredProcedure;

            cmd.CommandText = "SearchCustomers";

            cmd.Parameters.Add(new SqlParameter("@city", city));

            ... //long list of parameters

            conn.Open();

            try

            {

                using (SqlDataReader reader = cmd.ExecuteReader())

                {

                    foreach (DbDataRecord record in reader)

                        customers.Add(new Customer(record["id"], record["name"]))

                }

            }

            catch (Exception e)

            {

                //error handling logic here

            }

        }</pre>
<p>The common logic could be moved into one template method with placeholders for different steps:</p>
<pre>
List&lt;Customer&gt; customers =  LoadRecordsFromSP&lt;Customer&gt;("SearchCustomers",

    (SqlCommand cmd) =&gt; {

         cmd.Parameters.Add(new SqlParameter("@city", city));

         ...     //long list of parameters

    },

    (DbDataRecord record) =&gt; { new Customer(record["id"], record["name"]); }

);</pre>
<p><strong>6. Reduce code smells</strong><br />
Write code that doesn&#8217;t smell. Train your sense of smell for code and design problems. They will provide hints where code is probably bad.<br />
These are common bad smells<span class="mw-headline"></span> from <a href="http://wiki.java.net/bin/view/People/SmellsToRefactorings" id="e9im" title="a long list">a long list</a></p>
<ul>
<li>  Duplicated code</li>
<li>  Large method</li>
<li>  Large class</li>
<li>  Long parameter list</li>
<li>  Dead Code</li>
<li>  Over-generalized code</li>
<li>  Lazy class</li>
</ul>
<p><strong>7. Use design patterns and abstractions to make code simpler</strong><br />
Learn <a href="http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29" title="design patterns" id="j72i">design patterns</a>. At some level of complexity they will provide excellent solutions and simplify design.<br />
However, wrong abstractions and over used design patterns will make code more complex and less manageable. So, apply them carefully.</p>
<p><strong>8. Decouple and isolate components</strong><br />
<em>Only talk to your immediate friends; Don&#8217;t talk to strangers</em> &#8211; <a href="http://www.ccs.neu.edu/research/demeter/demeter-method/LawOfDemeter/general-formulation.html" title="Law of Demeter" id="z1sj">Law of Demeter</a>.<br />
Reduce connections between programming units &#8211; subsystems, modules and objects &#8211; as much as possible. More relations between components make software system more complex and rigid. Decoupled and isolated system components have significant benefits:</p>
<ul>
<li><strong>better understanding</strong> &#8211; easier to keep in memory and make sense for less states and relations</li>
<li><strong>increased reuse</strong> &#8211; components with minimal well-defined public interface and relations less dependent on context and can be used in many scenarios</li>
<li><strong>decreased breakdowns</strong> &#8211; caused by unpredictable run-time combination of relations</li>
<li><strong>effective testing</strong> &#8211; highly connected system require much more testing beyond isolated testing of components</li>
</ul>
<p id="e0-1" style="padding: 1em 0pt; text-align: left"><img src="http://softwarecreation.org/images/2009/predictability.gif" /></p>
<p><strong>9. Keep related code together</strong><br />
Put related code to the same package. It will enhance</p>
<ul>
<li>  <strong>discovery </strong>- easier to find and reuse</li>
<li>  <strong>design </strong>- allows isolation, minimal interactions and consistent structure for related components</li>
<li>  <strong>maintenance and testing </strong>- reduce effect of new changes to fewer packages and system components.</li>
</ul>
<p>There are two package approaches: <strong><br />
</strong></p>
<ul>
<li>  <strong>Feature</strong> &#8211; code related to the same problem placed together</li>
<li>  <strong>Application layers</strong> &#8211; code for similar programming concepts</li>
</ul>
<p>Benefits of packaging:</p>
<ul>
<li>  Feature: related code in one place, changes together and form self-sufficient granule for reuse and release</li>
<li>  Application: separation of concerns, logical layering and reduced dependencies,  consistent global structure</li>
</ul>
<p id="f-z:" style="padding: 1em 0pt; text-align: left"><img src="http://softwarecreation.org/images/2009/packaging.jpg" width="500" height="500" /></p>
<h3>  Composing the program &#8211; Putting Things Together</h3>
<ol>
<li>Understand what customer wants and form <a href="http://softwarecreation.org/2008/the-elements-of-pragmatic-programming-style-intention/" id="i2c6" title="intent">intent</a>.</li>
<li>Translate customer ideas into programming concepts (technology, platform and language, UI, libraries, components)</li>
<li>Make them simple, minimal and clear with pragmatic <a href="http://softwarecreation.org/2008/the-elements-of-pragmatic-programming-style-approach/" id="v-gg" title="approach">approach</a>.</li>
<li>Organize code around domain concepts and customer needs; use domain-driven design.</li>
<li>Describe UI ideas with paper sketches</li>
<li>Specify program ideas with automated unit tests.</li>
<li>Merge UI and program ideas</li>
<li>Package related ideas together, isolate subsystems and components</li>
<li>Express ideas in code and UI screens</li>
<li>Remove duplication and bad code smells; improve design; consider using design patterns</li>
<li>Evolve and refactor common code into framework; emerge layers and abstractions for similar concepts</li>
</ol>
<!-- Social Buttons Shared Counts Generated by Digg Digg plugin v4.0.9, 
    Author : Yong Mook Kim
    Website : http://www.mkyong.com/blog/digg-digg-wordpress-plugin/ --><img src="http://softwarecreation.org/?ak_action=api_record_view&id=80&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://softwarecreation.org/2009/the-elements-of-pragmatic-programming-style-composition/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The Elements of Pragmatic Programming Style. Intention.</title>
		<link>http://softwarecreation.org/2008/the-elements-of-pragmatic-programming-style-intention/</link>
		<comments>http://softwarecreation.org/2008/the-elements-of-pragmatic-programming-style-intention/#comments</comments>
		<pubDate>Wed, 12 Nov 2008 05:36:26 +0000</pubDate>
		<dc:creator>Andriy Solovey</dc:creator>
				<category><![CDATA[Job]]></category>
		<category><![CDATA[Practices]]></category>
		<category><![CDATA[Process]]></category>
		<category><![CDATA[Skills]]></category>

		<guid isPermaLink="false">http://softwarecreation.org/2008/the-elements-of-pragmatic-programming-style-intention/</guid>
		<description><![CDATA[Share&#8220;I made this program longer than usual because I lack the time to make it shorter.&#8221; &#8211; paraphrasing Blaise Pascal

The Elements of Pragmatic Programming Style is the collection of rules for pragmatic programmers. This collection doesn&#8217;t pretend to be comprehensive guide how to program. Rather it concentrates on fundamentals: how any programmer can build better [...]]]></description>
			<content:encoded><![CDATA[<div class='dd_post_share'><div class='dd_buttons'><div class='dd_button'><iframe src='http://api.tweetmeme.com/button.js?url=http://softwarecreation.org/2008/the-elements-of-pragmatic-programming-style-intention/&source=AndriySolovey&service=&service_api=&style=compact' height='20' width='90' frameborder='0' scrolling='no'></iframe></div><div class='dd_button'><a name='fb_share' type='button_count' share_url='http://softwarecreation.org/2008/the-elements-of-pragmatic-programming-style-intention/' href='http://www.facebook.com/sharer.php'>Share</a><script src='http://static.ak.fbcdn.net/connect.php/js/FB.Share' type='text/javascript'></script></div><div class='dd_button'><script src='http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://softwarecreation.org/2008/the-elements-of-pragmatic-programming-style-intention/'></script></div><div class='dd_button'><a title='Post on Google Buzz' class='google-buzz-button' href='http://www.google.com/buzz/post' data-button-style='small-count' data-url='http://softwarecreation.org/2008/the-elements-of-pragmatic-programming-style-intention/'></a><script type='text/javascript' src='http://www.google.com/buzz/api/button.js'></script></div><div class='dd_button'><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http://softwarecreation.org/2008/the-elements-of-pragmatic-programming-style-intention/&amp;title=The+Elements+of+Pragmatic+Programming+Style.+Intention.&amp;t=2' height='18' width='120' frameborder='0' scrolling='no'></iframe></div></div></div><div style='clear:both'></div><p><cite>&#8220;I made this program longer than usual because I lack the time to make it shorter.&#8221;</cite> &#8211; paraphrasing Blaise Pascal</p>
<p><img src="http://softwarecreation.org/images/2008/pascal.gif" /></p>
<p>The Elements of Pragmatic Programming Style is the collection of rules for pragmatic programmers. This collection doesn&#8217;t pretend to be comprehensive guide how to program. Rather it concentrates on fundamentals: how any programmer can build better software for the customer. Some of the rules are obvious, but, surprisingly, many programmers don&#8217;t even think about them. They make same mistakes over and over again. I hope this post will inject a healthy dose of pragmatism into your programming style and make it a bit better .</p>
<p>Style Components:</p>
<ul>
<li><strong>Intention </strong>- understand your task and how to get it done</li>
<li><strong><a href="http://softwarecreation.org/2008/the-elements-of-pragmatic-programming-style-approach">Approach</a> </strong>- basic principles of writing code</li>
<li><strong><a href="http://softwarecreation.org/2009/the-elements-of-pragmatic-programming-style-composition/">Composition</a> </strong>- organization of code</li>
<li><strong>Expression </strong>- expressing ideas in code</li>
<li><strong>Object Oriented Pragmatic Style</strong></li>
</ul>
<p>The goals of Pragmatic Programming Style are</p>
<ol>
<li>Building reliable software fast.</li>
<li>Delivering maximum value for the customer.</li>
<li>Writing code that is easy to understand, change and share.</li>
</ol>
<h3><strong>Intention</strong></h3>
<p><cite id="ypkf4"></cite><em>&#8220;Everyone hears only what he understands.&#8221;</em> &#8211; Johann Wolfgang von Goethe</p>
<p>Understand your task and how to get it done</p>
<p><img src="http://softwarecreation.org/images/2008/thinker.jpg" /><br />
<a href="http://flickr.com/photos/sidereal/349496270/" class="photocredit">Sidereal</a><br />
<span id="more-76"></span></p>
<p><strong>1. Know your programming task beforehand.</strong></p>
<p>Understand clearly your programming task before start. You will be focused, productive and efficient if you know exactly what to do. Vague tasks breed confusion, indecision and sluggishness. Misunderstanding leads to wrong code, dissatisfaction and conflicts. <em>Therefore, ask questions, listen and pursue until you have good enough understanding of the task and your customer needs.</em> Sometimes, of course, even your customer does not clearly understand what she wants. Most probably you&#8217;ll discover together what is needed on the go. And still, effort to understand your task beforehand will increase satisfaction and efficiency.</p>
<p>Don&#8217;t overuse this rule &#8211; first practical results in the first weeks will do more for understanding than months of conversations and drawing diagrams.</p>
<p><strong>2. Understand what is important.</strong></p>
<p>You have to make many decision on your own while programming. Customers cannot always prompt what options are better or how to overcome technical hurdles. They will rely on your technical expertise and common sense. <em>Therefore, understand what is important to make the best decisions for the customer. </em>For example, customers can be interested in easy to learn and responsive user interface. Or they can be interested in minimal cost and time. Or they can ask for highly secure solution. Better you know what is important, better decisions you will make.</p>
<p><strong>3. Think how to implement task before programming.</strong></p>
<p>Think how to implement your task before writing the first line of code. Many adventurous programmers don&#8217;t like to think ahead and prefer to immediately dive into programming. Often they find themselves lost in programming jungles with sad choice to continue struggle until code is a complete mess or start over again. <em>Don&#8217;t be lost. Think ahead about how you will implement your task, what is missing and what is not clear.</em> Use search, read help and ask other programmers. Quick sketches and notes on the paper will summon up your thoughts to find better solution.</p>
<p><strong>4. Define when task is &#8216;DONE&#8217;.</strong></p>
<p>You should know when your task is done, be it user interface, algorithm or database code. Sometimes, the programmer thinks that task is done without careful testing and consideration of alternative cases. Sometimes the programmer spends huge effort on polishing already good enough solution. Unfinished code or wasted time are both bad for your customer. <em>Therefore, know when your task is &#8216;DONE&#8217; and when you should stop.</em></p>
<p><strong>5. Share your ideas with your team</strong></p>
<p>Discuss your ideas with your fellow programmers. Even the smartest programmer will benefit from explaining her ideas to a team. Other programmers can help to find flaws, challenge ideas or suggest a better way. In addition, they will learn how you solve problems, gain better experience and knowledge about the system. <em>Therefore, don&#8217;t conceal your ideas, but share and improve them with your team.</em> Learn and grow together.</p>
<p><strong>6. Communicate required effort, risks and alternatives.</strong></p>
<p><span style="font-weight: normal">Inform your customer about required effort, risks, possible alternatives for the task. The customer will appreciate honest and full information before you spend time on programming. Yes, the customer could cancel some requests or select cheaper alternative if effort seems too large. But your customer will have comfortable and powerful feeling (that is so fragile) of control over the project that brings trust and desire to cooperate. <em>See your customer rather as a long-term partner than a quick source of revenue. </em>It will pay with more satisfaction from work, better reputation and more customers.</span></p>
<p><strong>7. Plan steps to get strength to start</strong></p>
<p><em>&#8220;The first and the best victory is to conquer self.&#8221;</em> &#8211; Plato</p>
<p><span style="font-weight: normal">You can be the biggest obstacle to get the task done &#8211; your procrastination, your indecision and your unproductive mood. Try to plan your steps, once you have clear ideas what should be done. Plan how these steps will fit into your working schedule, a release cycle and the customer availability for questions and feedback.<em> Create concrete actions &#8211; more detailed for more complex parts. Visualize your steps to assure yourself that your task can be accomplished. </em></span>While it is possible that your plan will be useless, it will provide <span style="font-weight: normal">confidence and energy to embrace the most challenging tasks.</span></p>
<p><span style="font-weight: normal">Now you are ready to start programming.</span></p>
<p>Next posts will bring rules and examples for Approach, Composition, Expression and Object Oriented Pragmatic style.</p>
<p><strong>Inspiring reference:</strong> <em>The Elements of Style</em>, W. Strunk Jr. and E.B. White</p>
<!-- Social Buttons Shared Counts Generated by Digg Digg plugin v4.0.9, 
    Author : Yong Mook Kim
    Website : http://www.mkyong.com/blog/digg-digg-wordpress-plugin/ --><img src="http://softwarecreation.org/?ak_action=api_record_view&id=76&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://softwarecreation.org/2008/the-elements-of-pragmatic-programming-style-intention/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Selecting The Best Strategy for Software Teams: Retreat, Evolution or Revolution</title>
		<link>http://softwarecreation.org/2008/selecting-the-best-strategy-for-software-teams-retreat-evolution-or-revolution/</link>
		<comments>http://softwarecreation.org/2008/selecting-the-best-strategy-for-software-teams-retreat-evolution-or-revolution/#comments</comments>
		<pubDate>Wed, 29 Oct 2008 03:27:21 +0000</pubDate>
		<dc:creator>Andriy Solovey</dc:creator>
				<category><![CDATA[Concepts]]></category>
		<category><![CDATA[Process]]></category>
		<category><![CDATA[Teams]]></category>

		<guid isPermaLink="false">http://softwarecreation.org/2008/selecting-the-best-strategy-for-software-teams-retreat-evolution-or-revolution/</guid>
		<description><![CDATA[Share&#8220;If you do not change direction, you may end up where you are heading.&#8221; &#8211; Lao Tzu
Software teams have three main strategies to achieve success: retreat, evolution or revolution.

Retreat &#8211; refusal to act or the art of knowing when to say NO. 
Evolution &#8211; continuous improvement and generation of ideas stemmed from existing set of ideas.
Revolution [...]]]></description>
			<content:encoded><![CDATA[<div class='dd_post_share'><div class='dd_buttons'><div class='dd_button'><iframe src='http://api.tweetmeme.com/button.js?url=http://softwarecreation.org/2008/selecting-the-best-strategy-for-software-teams-retreat-evolution-or-revolution/&source=AndriySolovey&service=&service_api=&style=compact' height='20' width='90' frameborder='0' scrolling='no'></iframe></div><div class='dd_button'><a name='fb_share' type='button_count' share_url='http://softwarecreation.org/2008/selecting-the-best-strategy-for-software-teams-retreat-evolution-or-revolution/' href='http://www.facebook.com/sharer.php'>Share</a><script src='http://static.ak.fbcdn.net/connect.php/js/FB.Share' type='text/javascript'></script></div><div class='dd_button'><script src='http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://softwarecreation.org/2008/selecting-the-best-strategy-for-software-teams-retreat-evolution-or-revolution/'></script></div><div class='dd_button'><a title='Post on Google Buzz' class='google-buzz-button' href='http://www.google.com/buzz/post' data-button-style='small-count' data-url='http://softwarecreation.org/2008/selecting-the-best-strategy-for-software-teams-retreat-evolution-or-revolution/'></a><script type='text/javascript' src='http://www.google.com/buzz/api/button.js'></script></div><div class='dd_button'><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http://softwarecreation.org/2008/selecting-the-best-strategy-for-software-teams-retreat-evolution-or-revolution/&amp;title=Selecting+The+Best+Strategy+for+Software+Teams%3A+Retreat%2C+Evolution+or+Revolution&amp;t=2' height='18' width='120' frameborder='0' scrolling='no'></iframe></div></div></div><div style='clear:both'></div><p><img src="http://softwarecreation.org/images/2008/taoism.gif" align="bottom" /><em>&#8220;If you do not change direction, you may end up where you are heading.&#8221;</em> &#8211; Lao Tzu</p>
<p>Software teams have three main strategies to achieve success: retreat, evolution or revolution.</p>
<ul style="margin-top: 0px; margin-bottom: 0px">
<li style="margin-top: 0px; margin-bottom: 0px">Retreat &#8211; refusal to act or the art of knowing when to say NO.<span class="Apple-converted-space"> </span></li>
<li style="margin-top: 0px; margin-bottom: 0px">Evolution &#8211; continuous improvement and generation of ideas stemmed from existing set of ideas.</li>
<li style="margin-top: 0px; margin-bottom: 0px">Revolution &#8211; rapid advance with radical and disruptive ideas, overhaul of existing core ideas.</li>
</ul>
<p>How can software teams choose the best strategy? They should consider three components:</p>
<ol style="margin-top: 0px; margin-bottom: 0px">
<li style="margin-top: 0px; margin-bottom: 0px">The Players</li>
<li style="margin-top: 0px; margin-bottom: 0px">The Game</li>
<li style="margin-top: 0px; margin-bottom: 0px">The Dynamics</li>
</ol>
<p id="jr26" style="padding: 1em 0pt; text-align: left; margin-top: 0px; margin-bottom: 0px"><img src="http://softwarecreation.org/images/2008/strategy-selection.jpg" /></p>
<p><span id="more-75"></span> <strong>1. The Players</strong><br />
A software team includes programmers, designers, domain experts, system administrators, testers and other active contributors. Each players has 2 main characteristics</p>
<ul style="margin-top: 0px; margin-bottom: 0px">
<li style="margin-top: 0px; margin-bottom: 0px">motivation to achieve success</li>
<li style="margin-top: 0px; margin-bottom: 0px">capabilities (experience, knowledge, skills, ability to learn)</li>
</ul>
<p id="ieqk" style="padding: 1em 0pt; text-align: left; margin-top: 0px; margin-bottom: 0px"><img src="http://softwarecreation.org/images/2008/the-players.jpg" /></p>
<p><strong>2. The Game</strong><br />
Each project could be considered as<span class="Apple-converted-space"> </span><a href="http://softwarecreation.org/2008/ideas-in-software-development-the-game" title="The Game" id="ot1b">The Game</a><span class="Apple-converted-space"> </span>where the main goal is successful delivery of software. The game represents various factors: client&#8217;s needs and goals, technology, project context, constraints and environment. The game has two main variables:</p>
<ul style="margin-top: 0px; margin-bottom: 0px">
<li style="margin-top: 0px; margin-bottom: 0px">novelty &#8211; how much players know and understand about The Game, and their ability to make intelligent moves</li>
<li style="margin-top: 0px; margin-bottom: 0px">complexity &#8211; how complex, predictable and controllable is The Game</li>
</ul>
<p id="obs." style="padding: 1em 0pt; text-align: left; margin-top: 0px; margin-bottom: 0px"><img src="http://softwarecreation.org/images/2008/the-game2.jpg" /></p>
<p><strong>3. Dynamics</strong><br />
Interaction of a software team with external and internal forces. Characteristics:</p>
<ul style="margin-top: 0px; margin-bottom: 0px">
<li style="margin-top: 0px; margin-bottom: 0px">pressure &#8211; customers, users, competitors, market, environment</li>
<li style="margin-top: 0px; margin-bottom: 0px">trend &#8211; positive or negative dynamic of the project and software product</li>
</ul>
<p style="margin-top: 0px; margin-bottom: 0px">&nbsp;</p>
<p id="e-07" style="padding: 1em 0pt; text-align: left; margin-top: 0px; margin-bottom: 0px"><img src="http://softwarecreation.org/images/2008/the-dynamics.jpg" /></p>
<h3 style="font-size: 12pt">Strategies overview</h3>
<p><strong>1. Retreat</strong></p>
<p style="margin-top: 0px; margin-bottom: 0px"><em>&#8220;A good retreat is better than a bad stand&#8221; - </em><span style="font-style: normal">Irish sayings</span></p>
<p style="margin-top: 0px; margin-bottom: 0px">&nbsp;</p>
<p style="margin-top: 0px; margin-bottom: 0px">Pros</p>
<ul style="margin-top: 0px; margin-bottom: 0px">
<li style="margin-top: 0px; margin-bottom: 0px">saving energy, time and money</li>
<li style="margin-top: 0px; margin-bottom: 0px">maintain capacity to join the game later under more favourable conditions or move to another game</li>
</ul>
<p>Cons</p>
<ul style="margin-top: 0px; margin-bottom: 0px">
<li style="margin-top: 0px; margin-bottom: 0px">no chances to succeed</li>
</ul>
<p>How?</p>
<ul style="margin-top: 0px; margin-bottom: 0px">
<li style="margin-top: 0px; margin-bottom: 0px">Don&#8217;t do anything</li>
</ul>
<p>When?<span class="Apple-converted-space"> </span></p>
<ul style="margin-top: 0px; margin-bottom: 0px">
<li style="margin-top: 0px; margin-bottom: 0px">poor players &#8211; lack of expertise, skills or low morale</li>
<li style="margin-top: 0px; margin-bottom: 0px">too complex, uncertain and overwhelming game</li>
<li style="margin-top: 0px; margin-bottom: 0px">a project is collapsing or hopelessly loosing positions in a highly competitive environment</li>
</ul>
<p><strong>2. Evolution</strong></p>
<p style="margin-top: 0px; margin-bottom: 0px"><em>&#8220;Evolution is not a force but a process. Not a cause but a law.&#8221;</em><span class="Apple-converted-space"> </span>- John Morley</p>
<p style="margin-top: 0px; margin-bottom: 0px">&nbsp;</p>
<p style="margin-top: 0px; margin-bottom: 0px">Pros</p>
<ul style="margin-top: 0px; margin-bottom: 0px">
<li style="margin-top: 0px; margin-bottom: 0px">Reliable mechanism</li>
<li style="margin-top: 0px; margin-bottom: 0px">Continuous improvement, adaptation to changes and complex environment</li>
<li style="margin-top: 0px; margin-bottom: 0px">Emergence of unforeseen advantageous traits</li>
<li style="margin-top: 0px; margin-bottom: 0px">Supports stability and full functioning of the project</li>
<li style="margin-top: 0px; margin-bottom: 0px">Enables productive focus, collaboration and harmony; keeps morale high</li>
</ul>
<p>Cons</p>
<ul style="margin-top: 0px; margin-bottom: 0px">
<li style="margin-top: 0px; margin-bottom: 0px">Slow, requires many improvement cycles</li>
<li style="margin-top: 0px; margin-bottom: 0px">Reliance on existing fundamentals and core ideas</li>
<li style="margin-top: 0px; margin-bottom: 0px">Low chances of emergence of disruptive ideas and breakthroughs</li>
</ul>
<p>How?<br />
Select working existing ideas and improve them, dump harmful ideas</p>
<p>When?<span class="Apple-converted-space"> </span></p>
<ul style="margin-top: 0px; margin-bottom: 0px">
<li style="margin-top: 0px; margin-bottom: 0px">interested and learning players</li>
<li style="margin-top: 0px; margin-bottom: 0px">complex, unpredictable, but promising game</li>
<li style="margin-top: 0px; margin-bottom: 0px">moderate pressure, positive dynamic, absence of serious fundamental problems</li>
</ul>
<p><strong>3. Revolution</strong></p>
<p style="margin-top: 0px; margin-bottom: 0px">&nbsp;</p>
<p style="margin-top: 0px; margin-bottom: 0px"> <em>&#8220;It is impossible to predict the time and progress of revolution. It is governed by its own more or less mysterious laws.&#8221;<span class="Apple-converted-space"> </span></em><span style="font-style: normal">- Vladimir Lenin </span></p>
<p style="margin-top: 0px; margin-bottom: 0px">&nbsp;</p>
<p style="margin-top: 0px; margin-bottom: 0px">Pros<span class="Apple-converted-space"> </span></p>
<ul style="margin-top: 0px; margin-bottom: 0px">
<li style="margin-top: 0px; margin-bottom: 0px">Fast leap forward, rapid advance</li>
<li style="margin-top: 0px; margin-bottom: 0px">Quick removal of barriers, fundamental problems and weaknesses</li>
<li style="margin-top: 0px; margin-bottom: 0px">Overcoming people inertia and group thinking</li>
</ul>
<p>Cons</p>
<ul style="margin-top: 0px; margin-bottom: 0px">
<li style="margin-top: 0px; margin-bottom: 0px">Sporadic, discontinuous, unreliable, risky</li>
<li style="margin-top: 0px; margin-bottom: 0px">Possible resistance and fear of change</li>
<li style="margin-top: 0px; margin-bottom: 0px">Provides little time for adaptation and ignores complex environment interactions and feedback loops</li>
<li style="margin-top: 0px; margin-bottom: 0px">Causes destabilization, temporary chaos in the project</li>
</ul>
<p>How?<br />
Come up with new crazy ideas, close your eyes and jump to implement them</p>
<p>When?</p>
<ul style="margin-top: 0px; margin-bottom: 0px">
<li style="margin-top: 0px; margin-bottom: 0px">the best and highly motivated players</li>
<li style="margin-top: 0px; margin-bottom: 0px">manageable and well understood game</li>
<li style="margin-top: 0px; margin-bottom: 0px">radical shift is required to sustain pressure and overcome limits to growth or fundamental problems</li>
</ul>
<h3 style="font-size: 12pt">The Road to The Best Strategy</h3>
<p>As you can see, there is no best strategy for every situation.</p>
<p id="yy7q" style="padding: 1em 0pt; text-align: left; margin-top: 0px; margin-bottom: 0px">Evolution is the most preferable, comfortable and reliable strategy in the complex uncertain world. Few revolutionary ideas will be very successful, come at right time and have significant impact, but most will fail and fade. Most of our achievements are result of evolution than revolution. However, revolution could promote new disruptive ideas, solve fundamental problems and achieve radical shift and advantage. Retreat is a conservative and disaster preventing strategy. A software team can apply these strategies on different stages for different levels of the project.</p>
<p>Software team should think about two goals:</p>
<ol style="margin-top: 0px; margin-bottom: 0px">
<li style="margin-top: 0px; margin-bottom: 0px">The best strategy for the present moment (criteria are discussed above)</li>
<li style="margin-top: 0px; margin-bottom: 0px">Actions to enable better strategy in the future</li>
</ol>
<p>What can a team do to prepare for the better<span class="Apple-converted-space"> </span>strategy?</p>
<p style="margin-top: 0px; margin-bottom: 0px"><img src="http://softwarecreation.org/images/2008/road-to-strategy.jpg" /></p>
<ol style="margin-top: 0px; margin-bottom: 0px">
<li style="margin-top: 0px; margin-bottom: 0px"><strong>Grow</strong><span class="Apple-converted-space"> </span>- increase capabilities and motivation of players:
<ul style="margin-top: 0px; margin-bottom: 0px">
<li style="margin-top: 0px; margin-bottom: 0px">Experiment, make mistakes, acquire knowledge and shape skills.<span class="Apple-converted-space"> </span></li>
<li style="margin-top: 0px; margin-bottom: 0px">Consider<span class="Apple-converted-space"> </span><a href="http://softwarecreation.org/2008/five-big-personality-traits-of-a-programmer-do-they-matter/" title="personalities" id="s6ge" style="color: #551a8b">personalities</a>,<span class="Apple-converted-space"> </span><a href="http://softwarecreation.org/2007/lost-personalities-how-our-company-alters-us/" title="group psychology" id="u4i1">group psychology</a>,<span class="Apple-converted-space"> </span><a href="http://softwarecreation.org/2007/how-to-be-happy-at-work-short-tutorial/" title="interests" id="snor" style="color: #551a8b">interests</a><span class="Apple-converted-space"> </span>to make people energized and motivated to achieve success.</li>
<li style="margin-top: 0px; margin-bottom: 0px">Create stimulus for growth</li>
</ul>
</li>
<li style="margin-top: 0px; margin-bottom: 0px"><strong>Learn</strong><span class="Apple-converted-space"> </span>- you cannot actively change the game, but you can learn the game and make it more predictable and manageable.<span class="Apple-converted-space"> </span>
<ul style="margin-top: 0px; margin-bottom: 0px">
<li style="margin-top: 0px; margin-bottom: 0px">Apply<span class="Apple-converted-space"> </span><a href="http://softwarecreation.org/2007/11-laws-of-the-system-thinking-in-software-development/" title="system thinking" id="fpps" style="color: #551a8b">system thinking</a><span class="Apple-converted-space"> </span>to understand core principles, relations and forces.</li>
<li style="margin-top: 0px; margin-bottom: 0px">Become an expert, whose knowledge and intuition could suggest the best moves</li>
</ul>
</li>
<li style="margin-top: 0px; margin-bottom: 0px"><strong>Watch</strong><span class="Apple-converted-space"> </span>- you should watch the internal and external changes
<ul style="margin-top: 0px; margin-bottom: 0px">
<li style="margin-top: 0px; margin-bottom: 0px">Set up feedback loops (e.g. retrospectives) and intelligence that serve as early warning and prevention system</li>
<li style="margin-top: 0px; margin-bottom: 0px">Honestly evaluate existing situation without<span class="Apple-converted-space"> </span><a href="http://softwarecreation.org/2008/dealing-with-programmers-who-are-different-and-disagree/" title="self-deception and blaming others" id="ofso" style="color: #551a8b">self-deception and blaming others</a>.</li>
</ul>
</li>
<li style="margin-top: 0px; margin-bottom: 0px"><strong>Adapt</strong><span class="Apple-converted-space"> </span>- constantly improve, adjust and respond to become fit for the changing environment, people minds and new opportunities
<ul style="margin-top: 0px; margin-bottom: 0px">
<li style="margin-top: 0px; margin-bottom: 0px">Be Agile</li>
</ul>
</li>
<li style="margin-top: 0px; margin-bottom: 0px"><strong>Innovate</strong><span class="Apple-converted-space"> </span>- strive for the new revolutionary ideas that could change the game or at least give you advantage (within tight project budget :)) Maybe new ideas will fail, but they will provide you with invaluable experience and increased capabilities of the team.</li>
<li style="margin-top: 0px; margin-bottom: 0px"><strong>Remove limits to growth</strong><span class="Apple-converted-space"> </span>- every process have some bottlenecks that slow growth. Removal of these barriers allow to move faster with better results.
<ul style="margin-top: 0px; margin-bottom: 0px">
<li style="margin-top: 0px; margin-bottom: 0px">Find your<span class="Apple-converted-space"> </span>limits for growth<span class="Apple-converted-space"> </span>and start eliminating them.</li>
</ul>
</li>
</ol>
<p><strong><a href="http://www.amazon.com/gp/product/0385517254?ie=UTF8&amp;tag=softwcreatmys-20&amp;linkCode=xm2&amp;camp=1789&amp;creativeASIN=0385517254" id="bpmd" title="Limits to growth">Limits to growth</a>:</strong><span class="Apple-converted-space"> </span>reinforcing process is set in motion to produce a desired results. It creates a spiral of success but also creates secondary effects which eventually slow down the success.</p>
<p style="margin-top: 0px; margin-bottom: 0px"><img src="http://softwarecreation.org/images/2008/limits-to-growth.jpg" /></p>
<p>Another method of finding fundamental problems is<span class="Apple-converted-space"> </span><a href="http://en.wikipedia.org/wiki/5_Whys" title="5 Whys" id="pbfi">5 Whys</a>. The 5 Whys is a question-asking method used to explore the cause/effect relationships underlying a particular problem. Ultimately, the goal of applying the 5 Whys method is to determine a root cause of a defect or problem.</p>
<p style="margin-top: 0px; margin-bottom: 0px">&nbsp;</p>
<h3 style="font-size: 12pt">External Forces<span class="Apple-converted-space"> </span></h3>
<p>A software team has power to change things, but external forces are very strong.</p>
<ul style="margin-top: 0px; margin-bottom: 0px">
<li style="margin-top: 0px; margin-bottom: 0px">environment can change</li>
<li style="margin-top: 0px; margin-bottom: 0px">opponents become stronger</li>
<li style="margin-top: 0px; margin-bottom: 0px">product idea become useless</li>
</ul>
<p>Three small case studies show dialectic of evolution and revolution.</p>
<p><strong>Cambrian period</strong><span class="Apple-converted-space"> </span>- environment triggers revolution within evolution.<br />
<a href="http://en.wikipedia.org/wiki/Cambrian_explosion" title="The Cambrian explosion" id="h340">The Cambrian explosion</a><span class="Apple-converted-space"> </span>was the seemingly rapid appearance of most major groups of complex animals around 530 million years ago. Before about 580 million years ago, most organisms were simple, composed of individual cells occasionally organised into colonies. Over the following 70 or 80 million years the rate of evolution accelerated by an order of magnitude and the diversity of life began to resemble today&#8217;s.</p>
<p>Relatively small changes in the environment are considered one of the main reason for the explosion. One of them is increase in oxygen levels. Shortage of oxygen prevented the rise of large, complex animals. An increase in the concentration of oxygen in air or water increase the size to which an organism could grow without its tissues becoming starved of oxygen.<span class="Apple-converted-space"> </span><br />
Raise of complex animals triggered arms races between predators and prey that caused explosion of huge variety of animals shaped by natural selection. Many species become extinct that could be considered as an extreme version of retreat.</p>
<p><strong>Auto industry -<span class="Apple-converted-space"> </span></strong>winning opponents stop revolution<br />
100 years ago<span class="Apple-converted-space"> </span><a href="http://en.wikipedia.org/wiki/History_of_the_automobile" title="hundreds of automobile companies" id="p_la">hundreds of automobile companies</a><span class="Apple-converted-space"> </span>competed and produced many revolutionary ideas &#8211; from steamed cars to battery powered vehicles. Innovation was rapid and rampant, with no clear standards for basic vehicle architectures, body styles, construction materials, or controls. Development of automotive technology was rapid, due in part to a huge number of small manufacturers all competing to gain the world&#8217;s attention.</p>
<p>Revolution continued until gasoline-powered cars makers won with a cost effective design, standardized components and better mass production techniques such as an assembly line. After 1930, the number of auto manufacturers declined sharply as the industry consolidated and matured. Starting from 1960 nearly all modern passenger cars are front wheel drive<span class="Apple-converted-space"> </span>unibody<span class="Apple-converted-space"> </span>designs with transversely-mounted engine running on oil products.</p>
<p>Fundamental changes in the game (ecology, fuel cost) seem to trigger a new revolution with gas-electrig<span class="Apple-converted-space"> </span>hybrids, electric, fuel cells, biomass powered automobiles, but this is much smaller revolution than 100 years ago.</p>
<p><strong>Search engines -</strong><span class="Apple-converted-space"> </span>a simple algorithm and profitable business model renders evolution pointless<strong><br />
</strong>From creation of the Internet in 1993 multiple<span class="Apple-converted-space"> </span><a href="http://www.wiley.com/legacy/compbooks/sonnenreich/history.html" title="search engines" id="y8ap">search engines</a><span class="Apple-converted-space"> </span>appeared and become popular and faded &#8211; Archie, Excite, Yahoo,<span class="Apple-converted-space"> </span>Lycos,<span class="Apple-converted-space"> </span>Infoseek, Alta Vista and many others.<br />
Search engines revolution produced many ideas. Yahoo created manual directory. Wanderer deployed web spiders. Excite brought statistical analysis of words. Alta Vista introduced natural language processing and Boolean operators.<span class="Apple-converted-space"> </span>Inktomi<span class="Apple-converted-space"> </span>popularized the paid-per-click model.</p>
<p style="margin-top: 0px; margin-bottom: 0px">However, Google won this revolution with Page Rank algorithm counting incoming links as votes with different degree of authority. After adding profitable business model based on pay-per-click AdWords service, Google become unstoppable -<span class="Apple-converted-space"> </span><a href="http://news.cnet.com/8301-1023_3-9991866-93.html" title="70% of searches in United States" id="glq_">70% of searches in United States</a><span class="Apple-converted-space"> </span>with constantly increasing share.<br />
Can anybody beat Google in search? Evolution won&#8217;t help here &#8211; revolutionary ideas are needed.</p>
<h3 style="font-size: 12pt">Afterword</h3>
<p>I don&#8217;t know what is the best strategy for your team &#8211; there are so many factors to consider. But I know, your team will win if players honestly recognize reality, pragmatically select present strategies and move to enable the best strategies for achieving success in this complex world.<br class="Apple-interchange-newline" /></p>
<!-- Social Buttons Shared Counts Generated by Digg Digg plugin v4.0.9, 
    Author : Yong Mook Kim
    Website : http://www.mkyong.com/blog/digg-digg-wordpress-plugin/ --><img src="http://softwarecreation.org/?ak_action=api_record_view&id=75&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://softwarecreation.org/2008/selecting-the-best-strategy-for-software-teams-retreat-evolution-or-revolution/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ideas in Software Development: Revolution vs. Evolution. Part 1.</title>
		<link>http://softwarecreation.org/2008/ideas-in-software-development-revolution-vs-evolution-part-1/</link>
		<comments>http://softwarecreation.org/2008/ideas-in-software-development-revolution-vs-evolution-part-1/#comments</comments>
		<pubDate>Tue, 23 Sep 2008 04:08:33 +0000</pubDate>
		<dc:creator>Andriy Solovey</dc:creator>
				<category><![CDATA[Concepts]]></category>
		<category><![CDATA[Process]]></category>

		<guid isPermaLink="false">http://softwarecreation.org/2008/ideas-in-software-development-revolution-vs-evolution-part-1/</guid>
		<description><![CDATA[ShareWhat does produce better ideas in software development &#8211; revolution or evolution? Revolution is a rapid triumph of the new ideas and breaking open of the old concepts. Evolution is the process of small frequent changes to improve and adapt to environment. The main difference &#8211; revolution replaces old ideas with the new promising unproven [...]]]></description>
			<content:encoded><![CDATA[<div class='dd_post_share'><div class='dd_buttons'><div class='dd_button'><iframe src='http://api.tweetmeme.com/button.js?url=http://softwarecreation.org/2008/ideas-in-software-development-revolution-vs-evolution-part-1/&source=AndriySolovey&service=&service_api=&style=compact' height='20' width='90' frameborder='0' scrolling='no'></iframe></div><div class='dd_button'><a name='fb_share' type='button_count' share_url='http://softwarecreation.org/2008/ideas-in-software-development-revolution-vs-evolution-part-1/' href='http://www.facebook.com/sharer.php'>Share</a><script src='http://static.ak.fbcdn.net/connect.php/js/FB.Share' type='text/javascript'></script></div><div class='dd_button'><script src='http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://softwarecreation.org/2008/ideas-in-software-development-revolution-vs-evolution-part-1/'></script></div><div class='dd_button'><a title='Post on Google Buzz' class='google-buzz-button' href='http://www.google.com/buzz/post' data-button-style='small-count' data-url='http://softwarecreation.org/2008/ideas-in-software-development-revolution-vs-evolution-part-1/'></a><script type='text/javascript' src='http://www.google.com/buzz/api/button.js'></script></div><div class='dd_button'><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http://softwarecreation.org/2008/ideas-in-software-development-revolution-vs-evolution-part-1/&amp;title=Ideas+in+Software+Development%3A+Revolution+vs.+Evolution.+Part+1.&amp;t=2' height='18' width='120' frameborder='0' scrolling='no'></iframe></div></div></div><div style='clear:both'></div><p>What does produce better ideas in software development &#8211; revolution or evolution? Revolution is a rapid triumph of the new ideas and breaking open of the old concepts. Evolution is the process of small frequent changes to improve and adapt to environment. The main difference &#8211; <strong>revolution </strong>replaces old ideas with the new promising unproven ideas, <strong>evolution </strong>gradually and continuously improves existing working ideas.</p>
<p><img src="http://softwarecreation.org/images/2008/revolution-vs-evolution.jpg" /></p>
<p>We often face this dilemma in software development &#8211; should we enhance existing features and improve the ways we work or should we instead come up with something radical and revolutionary.</p>
<p><span id="more-73"></span></p>
<h3 id="p8jf0">Revolution!</h3>
<p><img src="http://softwarecreation.org/images/2008/revolution.jpg" /></p>
<p>Could we have our modern cars if people concentrated on improving horses only? Jet planes, Apple iPhone and Quantum Mechanics are products of revolutionary ideas, not improvements of old. Our intellectual creativity and brilliant unexpected ideas are the spark plug for our progress and domination on this planet. This is unique and most beneficial human trait.  Probably computers will never become truly intelligent, because they cannot create new revolutionary ideas and can only use logical reasoning based on initial programmed set of ideas (see <a href="http://softwarecreation.org/2007/can-computers-beat-human-programmers-part-2-becoming-intelligent/" title="Gödel Incompleteness Theorem" id="mh:j">Gödel Incompleteness Theorem</a>). <br id="wpae" /><br id="r5uz" />The best revolutionary (disruptive) ideas give you enormous advantage over competitors. You move to the new unsettled territory with the new framework of ideas, leaving far behind people with old ideas . Incremental evolutionary changes will not allow you to change situation fast and overhaul hindering ideas.</p>
<p><a href="http://en.wikipedia.org/wiki/Mouse_%28computing%29" title="Computer mouse" id="f3ik">Computer mouse</a>, <a href="http://en.wikipedia.org/wiki/World_Wide_Web" title="World Wide Web" id="a9b_">World Wide Web</a> and <a href="http://labs.google.com/papers/mapreduce.html" title="MapReduce" id="yncl">MapReduce</a> are the outcomes of revolutionary ideas. Google innovative ideas enable it domination in search.</p>
<p><strong id="u37g">Revolution is the fastest way to move forward, but outcome is very dependent on the quality of ideas</strong>.</p>
<p>Revolutions could be risky and even dangerous. Great revolutionary ideas will move us to a much better place, bad revolutionary ideas will throw us to the hell. Revolutionary ideas could be just unreal fantasies. The big leap forward doesn&#8217;t use invaluable feedback from the environment and learning from own results &#8211; there is no much time to correct something in the jump. These ideas are pushed by strong individuals, whose energy and conviction could blind rational and objective minds and lead to authoritarianism and destruction.</p>
<p>Finally, revolution cause instability, resistance and uncertainty that have negative impact on the system and team dynamic for some time.</p>
<p>Revolution is the matter of chance, there are so many things should come together right for successful revolution even if it is based on the great ideas. And it is really difficult to constantly and reliably come up with revolutionary ideas.<br id="dyq4" /></p>
<h3 id="p8jf2">Or Evolution?</h3>
<p><img src="http://softwarecreation.org/images/2008/human-evolution.gif" /></p>
<p>We, humans, are the product of evolution and I think it is a strong enough evidence that evolution works. Evolution introduce small incremental changes, improve beneficial and weed out harmful traits in interaction with the environment. Highly fit, adaptive and efficient solutions come as a result. <br id="cwm3" /><br id="puju" /><strong id="v-.y">Evolution&#8217;s strength is reliable, systematic and effective mechanism to improve and advance in the complex and unpredictable world</strong>.<br id="puju0" /><br id="xbqx" />Retrospectve is evolutionary mechanism for improving agile teams work. Refactoring and eliminating of code smells is mechanism for improving the code. User focus groups and marketing research are the mechanisms for improving product ideas.</p>
<p>We cannot decline the fact that evolution is creative too, but in another way than revolution. Evolution could create completely new solutions in the long run by selecting, improving, and optimizing existing traits.  <a href="http://softwarecreation.org/2008/comparing-intelligent-software-evolution-to-chaotic-biological-evolution/" title="Biological evolution" id="xrb4">Biological evolution</a> provides some examples:</p>
<ol>
<li><strong>Creating global solutions from optimization of local.</strong> The first hard mineralised structures to evolve in our ancestors were the teeth of early fishes known as conodonts. Once the ability to form hard hydroxyapatite had evolved, it could be exploited elsewhere in the body and have been the basis of the bony skeletons of all vertebrates [link].</li>
<li><strong>Emergence of the new features</strong>. Our mind is emergent result of the mammals neocortex development for better <a href="http://reverendbayes.wordpress.com/2008/05/29/bayesian-theory-in-new-scientist/" id="rejt" title="evaluation of probabilities">evaluation of probabilities</a> and predicting the future. The <a href="http://en.wikipedia.org/wiki/Sarcopterygii" title="lobed fins of early fish" id="keza">lobed fins of early fish</a> have turned into structures as diverse as wings, fins, hoofs and hands.</li>
<li><strong>Repurposing </strong>- Reptilian jaw bones turned into mammalian ear bones, without the loss of the jaw. The neural circuitry that allows us to make fine limb movements have been adapted to produce speech as well.</li>
</ol>
<p>It is similar in software &#8211; new ideas come up when we fight for optimization, refactoring produces new better components and we reuse well crafted libraries for the new unforeseen tasks.<br />
There is a limit for evolution creativity - solutions should have immediate practical purpose. Some ideas could be never reached with incremental improvements. For example, two-way radio won&#8217;t be developed evolutionary as one-way radio is useless, improvements of the best horse breeds will never lead to the powerful cars and improvements of propeller planes will not lead to the jet planes. These breakthroughs need revolutionary ideas.<br id="xbqx0" /><br id="h5bg" />Evolution main deficiency is slowness. Modern businesses often don&#8217;t have time for many improvement cycles &#8211; they want results now. They are willing to risk, speculate and go with revolutionary ideas than patiently wait for evolution. <br id="f.e1" /></p>
<p>Another reason for preferring revolution over evolution is the scale of necessary changes and seriousness of the problem &#8211; sometimes it is more effective to implement new ideas than evolve old ones.</p>
<h3>What is better?</h3>
<p>Dear readers, what do you think is better &#8211; revolution or evolution? Is it possible to combine both? Microsoft, Google, Yahoo, Facebook, Apple &#8211; which companies are revolutionary and which are evolutionary? I&#8217;ll continue topic about revolutionary and evolutionary ideas in the next post.</p>
<!-- Social Buttons Shared Counts Generated by Digg Digg plugin v4.0.9, 
    Author : Yong Mook Kim
    Website : http://www.mkyong.com/blog/digg-digg-wordpress-plugin/ --><img src="http://softwarecreation.org/?ak_action=api_record_view&id=73&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://softwarecreation.org/2008/ideas-in-software-development-revolution-vs-evolution-part-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ideas in Software Development: The Game</title>
		<link>http://softwarecreation.org/2008/ideas-in-software-development-the-game/</link>
		<comments>http://softwarecreation.org/2008/ideas-in-software-development-the-game/#comments</comments>
		<pubDate>Wed, 10 Sep 2008 03:58:41 +0000</pubDate>
		<dc:creator>Andriy Solovey</dc:creator>
				<category><![CDATA[Concepts]]></category>
		<category><![CDATA[Process]]></category>

		<guid isPermaLink="false">http://softwarecreation.org/2008/ideas-in-software-development-the-game/</guid>
		<description><![CDATA[Share 
Recently I&#8217;ve been thinking that Software Development is a game. The goal of this game is to discover and implement the best solution for customer&#8217;s needs. There are other important goals as making money, empowering business or keeping people happy, but they matter less for the purpose of the game.

 

External Elements of The Game 
These elements [...]]]></description>
			<content:encoded><![CDATA[<div class='dd_post_share'><div class='dd_buttons'><div class='dd_button'><iframe src='http://api.tweetmeme.com/button.js?url=http://softwarecreation.org/2008/ideas-in-software-development-the-game/&source=AndriySolovey&service=&service_api=&style=compact' height='20' width='90' frameborder='0' scrolling='no'></iframe></div><div class='dd_button'><a name='fb_share' type='button_count' share_url='http://softwarecreation.org/2008/ideas-in-software-development-the-game/' href='http://www.facebook.com/sharer.php'>Share</a><script src='http://static.ak.fbcdn.net/connect.php/js/FB.Share' type='text/javascript'></script></div><div class='dd_button'><script src='http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://softwarecreation.org/2008/ideas-in-software-development-the-game/'></script></div><div class='dd_button'><a title='Post on Google Buzz' class='google-buzz-button' href='http://www.google.com/buzz/post' data-button-style='small-count' data-url='http://softwarecreation.org/2008/ideas-in-software-development-the-game/'></a><script type='text/javascript' src='http://www.google.com/buzz/api/button.js'></script></div><div class='dd_button'><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http://softwarecreation.org/2008/ideas-in-software-development-the-game/&amp;title=Ideas+in+Software+Development%3A+The+Game&amp;t=2' height='18' width='120' frameborder='0' scrolling='no'></iframe></div></div></div><div style='clear:both'></div><p><span class="Apple-style-span" style="font-family: Verdana; font-size: 13px; line-height: 26px"> </span>
<p id="s7ve0" style="margin: 0px">Recently I&#8217;ve been thinking that Software Development is a game. The goal of this game is to <em id="kbq.">discover and implement the best solution for customer&#8217;s needs</em>. There are other important goals as making money, empowering business or keeping people happy, but they matter less for the purpose of the game.</p>
<p id="s7ve0" style="margin: 0px"><img src="http://softwarecreation.org/images/2008/the-game.jpg" alt="undefined" title="undefined" width="600" height="600" style="width: 600px; height: 600px" /></p>
<p id="snsl" style="margin: 0px"> </p>
<p><span id="more-72"></span><br />
<h3 id="otcq" style="font-size: 13pt">External Elements of The Game </h3>
<p id="ueon2" style="margin: 0px">These elements are external and players don&#8217;t have much control over them: Needs, Context, Constraints </p>
<h4>Needs</h4>
<p id="i6od" style="margin-top: 0px; margin-bottom: 0px">Any solution should satisfy some needs. These needs could be satisfied differently &#8211; from using beaten tracks to finding absolutely new ways. Discovering the best solution is a challenging goal as needs are unclear at the beginning and change during the game.<br id="ilg-0" /></p>
<p id="tpiw" style="margin: 0px">Characteristics of typical needs:</p>
<p id="gu5y0" style="margin: 0px"> </p>
<ul id="gu5y1" style="margin-top: 0px; margin-bottom: 0px">
<li id="gu5y2" style="margin-top: 0px; margin-bottom: 0px"><em id="u7b4">inaccurate </em>- people often <a href="http://softwarecreation.org/2007/software-requirements-are-elusive-6-reasons-why-customers-cannot-get-them-right/" id="o5gr" title="cannot come up" style="color: #551a8b">cannot come up</a> with correct needs; people have <a href="http://softwarecreation.org/2007/how-to-communicate-effectively-and-still-get-things-done/" id="banh" title="communication gaps" style="color: #551a8b">communication gaps</a>, misunderstanding, lack of <a href="http://softwarecreation.org/2008/the-secret-of-building-effective-software-systems/" title="knowledge" id="ey7y" style="color: #551a8b">knowledge</a> and experience.</li>
<li id="gu5y3" style="margin-top: 0px; margin-bottom: 0px"><em id="u7b40">moving </em>- needs are constantly changing because people, organizations, business and markets are changing; also people better understand their problems, real needs and experience solution as the game unfolds.</li>
<li id="j:s9" style="margin-top: 0px; margin-bottom: 0px"><em id="u7b41">contradictionary </em>- needs often represent conflicting people interests (customer groups, various stakeholders, politics) and incompatible system goals (functionality, performance, usability)</li>
<li id="j:s90" style="margin-top: 0px; margin-bottom: 0px"><em id="u7b42">complex </em>- our civilization, society and business advance forward, face more challenges and bring more and more sophisticated needs and requirements</li>
</ul>
<p id="g:-p0" style="margin-top: 0px; margin-bottom: 0px"><br id="t8ns" /></p>
<p id="t8ns0" style="margin-top: 0px; margin-bottom: 0px">A good solution requires well understood and stable needs, which are very difficult to achieve in the non-trivial instance of The Game. Therefore, seemingly the best solution can easily turn to be useless by the end. This is the greatest challenge of the game.<br id="lfoi" /></p>
<p id="h8301" style="margin-top: 0px; margin-bottom: 0px"> </p>
<h4>Context</h4>
<p id="i6od" style="margin-top: 0px; margin-bottom: 0px">The game is played in a specific context: organization, market and technology. Even the best solution could conflict with organization culture, fail on market or become technologically unreliable and costly. Context greatly influence a solution and make each game very unique and unpredictable.<br id="d3cr" /></p>
<p id="h8304" style="margin-top: 0px; margin-bottom: 0px"> </p>
<h4>Constraints</h4>
<p id="qxge" style="margin-top: 0px; margin-bottom: 0px">Discovery of the best solution will always have some limitations. The most famous are money and time. Constraints limit what is possible and bring down to land fantasies and plans of the players.<br id="cw8e" /></p>
<h3 id="fjcd" style="font-size: 13pt">Players and Core Elements of The Game</h3>
<p>Players have control over 3 core elements &#8211; Ideas, Actions and The Solution. <br />
<h4>Players</h4>
<p id="o8jk0" style="margin-top: 0px; margin-bottom: 0px">Software team members cooperatively try to discover and implement the best solution. They have<br id="a2mw" /></p>
<p id="o8jk1" style="margin-top: 0px; margin-bottom: 0px"> </p>
<ul id="xek:" style="margin-top: 0px; margin-bottom: 0px">
<li id="xek:0" style="margin-top: 0px; margin-bottom: 0px"><em id="v7:-">knowledge </em>- domain, design, programming, methodology, theoretical and practical</li>
<li id="xek:1" style="margin-top: 0px; margin-bottom: 0px"><em id="v7:-0">experience </em>- intuition and tacit knowledge formed by years and many projects, successes and failures</li>
<li id="xek:2" style="margin-top: 0px; margin-bottom: 0px"><em id="v7:-1">capabilities </em>- skills, intellect, motivation and discipline</li>
</ul>
<p id="my:r4" style="margin-top: 0px; margin-bottom: 0px"><br id="lfy1" /></p>
<p id="lfy10" style="margin-top: 0px; margin-bottom: 0px">Players have two most important responsibilites: generate ideas and execute actions. <a href="http://softwarecreation.org/2008/five-big-personality-traits-of-a-programmer-do-they-matter/" id="m4qc" title="Players are very different" style="color: #551a8b">Players are very different</a> - some players are more creative and can come up with great ideas, some are better in execution and making sure that things are done. </p>
<h4>Ideas</h4>
<p id="my:r7" style="margin-top: 0px; margin-bottom: 0px">Ideas are <a href="http://softwarecreation.org/2007/software-development-is-the-flow-of-ideas-the-rest-is-secondary/" id="d6es" title="the moving force" style="color: #551a8b">the moving force</a> of The Game. Their quality directly impacts quality of The Solution. Players come up with ideas concerning<br id="mixn" /></p>
<p id="ix3q2" style="margin-top: 0px; margin-bottom: 0px"> </p>
<ul id="cuyx" style="margin-top: 0px; margin-bottom: 0px">
<li id="cuyx0" style="margin-top: 0px; margin-bottom: 0px">How do we understand needs?</li>
<li id="cuyx1" style="margin-top: 0px; margin-bottom: 0px">How do we translate them into a solution?</li>
<li id="cuyx2" style="margin-top: 0px; margin-bottom: 0px">How do we meet constraints?</li>
<li id="cuyx3" style="margin-top: 0px; margin-bottom: 0px">How do we ensure the solution success in the given context?</li>
</ul>
<p id="o8jk5" style="margin-top: 0px; margin-bottom: 0px"><br id="o8jk6" /></p>
<p id="v:7r" style="margin-top: 0px; margin-bottom: 0px">Ideas come from 3 main sources:</p>
<p id="v:7r0" style="margin-top: 0px; margin-bottom: 0px"> </p>
<ul id="wnv2" style="margin-top: 0px; margin-bottom: 0px">
<li id="wnv20" style="margin-top: 0px; margin-bottom: 0px"><em id="v7:-2">innovation </em>- new ideas coming from research, brainstorming and creative insights</li>
<li id="wnv21" style="margin-top: 0px; margin-bottom: 0px"><em id="v7:-3">improvement </em>- enhancements and optimization of existing ideas</li>
<li id="wnv22" style="margin-top: 0px; margin-bottom: 0px"><em id="v7:-4">adoptation </em>- borrowing and reuse of external ideas from competitors, experts and other domains</li>
</ul>
<p id="v:7r1" style="margin-top: 0px; margin-bottom: 0px"><br id="v:7r2" /></p>
<p id="uzcp" style="margin-top: 0px; margin-bottom: 0px"><strong id="bikn">Software ideas dimensions with examples<span class="Apple-style-span" style="font-weight: normal"> </span></strong></p>
<p id="lmmc0" style="margin-top: 0px; margin-bottom: 0px"> </p>
<table border="1" bordercolor="#CCCCCC" cellpadding="3" cellspacing="0" width="100%">
<tr>
<td><em>Level \ Area</em></td>
<td><b">Features</b"></td>
<td><strong>System</strong></td>
<td><b">Process</b"></td>
</tr>
<tr>
<td><strong>Philosophy</strong></td>
<td>Usability, Simplicity, 80/20 rule</td>
<td>Object Oriented Programming and Design</td>
<td>Agile</td>
</tr>
<tr>
<td><strong id="ccqy5">Strategy</strong></td>
<td>Roadmap, Vision, Market Analysis</td>
<td>Platform, Architecture</td>
<td>Iterations, Planning, Self-Organization</td>
</tr>
<tr>
<td><strong>Implementation</strong></td>
<td>User Stories / Requirements</td>
<td>Code, Web Design, Database</td>
<td>Unit Testing, Pair Programming, Refactoring</td>
</tr>
</table>
<p id="uzcp1" style="margin-top: 0px; margin-bottom: 0px"> </p>
<h4>Actions</h4>
<p id="o8jk7" style="margin-top: 0px; margin-bottom: 0px">Players should find the best set of actions to translate ideas into the solution. Actions are outcome and execution of ideas. Quality of execution matters &#8211; even the best ideas could fail because of bad implementation. Actions and getting things done are practical and very important part of the game.<br id="wl60" /></p>
<p id="wkxt" style="margin-top: 0px; margin-bottom: 0px"> </p>
<h4>The Solution</h4>
<p id="wkxt0" style="margin-top: 0px; margin-bottom: 0px">The Solution is the ultimate goal of the game. Players deliver the solution to customers and users and make them happy or unhappy. Players win if they discovered and implemented the solution that satisfy client needs, succeed in specific context and meet all constraints.<br id="vv3_" /></p>
<h3 id="obn3" style="font-size: 13pt">Afterword and Foreword</h3>
<p id="efxz3" style="margin-top: 0px; margin-bottom: 0px">Why am I doing this seemingly impractical brain exercise in this post? The goal is creation of a simple mental model for thinking about software development and for my future posts. I want to avoid all the noise that come from different factors and specifics of individual software projects. People like to make things complicated (see <a href="http://www.sei.cmu.edu/cmmi/general/" id="xxma" title="CMMI" style="color: #551a8b">CMMI</a>  or <a href="http://www.pmi.org/Resources/Pages/Current-PMI-Standards-Projects.aspx" id="vzpd" title="PMBOK" style="color: #551a8b">PMBOK</a>). I want to focus on the simple and pure mechanics of software creation (or The Game). I like to play and win :)<br id="y-gn" /><br id="y-gn0" />Does this simple model makes any sense for you?</p>
<p> </p>
<!-- Social Buttons Shared Counts Generated by Digg Digg plugin v4.0.9, 
    Author : Yong Mook Kim
    Website : http://www.mkyong.com/blog/digg-digg-wordpress-plugin/ --><img src="http://softwarecreation.org/?ak_action=api_record_view&id=72&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://softwarecreation.org/2008/ideas-in-software-development-the-game/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>What can Software Development learn from Biological Evolution?</title>
		<link>http://softwarecreation.org/2008/what-software-development-can-learn-from-biological-evolution/</link>
		<comments>http://softwarecreation.org/2008/what-software-development-can-learn-from-biological-evolution/#comments</comments>
		<pubDate>Fri, 11 Jul 2008 17:39:07 +0000</pubDate>
		<dc:creator>Andriy Solovey</dc:creator>
				<category><![CDATA[Concepts]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Process]]></category>
		<category><![CDATA[System]]></category>

		<guid isPermaLink="false">http://softwarecreation.org/2008/what-software-development-can-learn-from-biological-evolution/</guid>
		<description><![CDATA[ShareFrom the first sight biological evolution looks too unpredictable to have any value for the constrained software development. We just don&#8217;t have time, money and resources for these wild experiment, unlimited trials and errors. It really seems that Nature could learn from us how to make things fast and effectively.   However, there are [...]]]></description>
			<content:encoded><![CDATA[<div class='dd_post_share'><div class='dd_buttons'><div class='dd_button'><iframe src='http://api.tweetmeme.com/button.js?url=http://softwarecreation.org/2008/what-software-development-can-learn-from-biological-evolution/&source=AndriySolovey&service=&service_api=&style=compact' height='20' width='90' frameborder='0' scrolling='no'></iframe></div><div class='dd_button'><a name='fb_share' type='button_count' share_url='http://softwarecreation.org/2008/what-software-development-can-learn-from-biological-evolution/' href='http://www.facebook.com/sharer.php'>Share</a><script src='http://static.ak.fbcdn.net/connect.php/js/FB.Share' type='text/javascript'></script></div><div class='dd_button'><script src='http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://softwarecreation.org/2008/what-software-development-can-learn-from-biological-evolution/'></script></div><div class='dd_button'><a title='Post on Google Buzz' class='google-buzz-button' href='http://www.google.com/buzz/post' data-button-style='small-count' data-url='http://softwarecreation.org/2008/what-software-development-can-learn-from-biological-evolution/'></a><script type='text/javascript' src='http://www.google.com/buzz/api/button.js'></script></div><div class='dd_button'><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http://softwarecreation.org/2008/what-software-development-can-learn-from-biological-evolution/&amp;title=What+can+Software+Development+learn+from+Biological+Evolution%3F&amp;t=2' height='18' width='120' frameborder='0' scrolling='no'></iframe></div></div></div><div style='clear:both'></div><p>From the first sight biological evolution looks too unpredictable to have any value for the constrained software development. We just don&#8217;t have time, money and resources for these wild experiment, unlimited trials and errors. It really seems that Nature could learn from us how to make things fast and effectively. <br id="p0h40" /> <br id="e5.s" /> However, there are some principles that helped evolution to come up with amazing and efficient designs that made life flourishing on the Earth. This post will explore what software development could learn from biological evolution. See my <a href="http://softwarecreation.org/2008/comparing-intelligent-software-evolution-to-chaotic-biological-evolution/" title="previous post" id="qpz4">previous post</a> for the review of evolution concepts and mechanisms and how they could be applied to software development.</p>
<p><img src="http://softwarecreation.org/images/2008/software-evolution.jpg" /></p>
<p><span id="more-66"></span></p>
<h3 id="e0yy0"><strong id="gz5c">1. </strong><strong id="x5we0">Evolution works</strong></h3>
<p>The evidence is richness of our flora and fauna which adapted to almost all possible conditions on our planet. <a href="http://www.astrobiology.com/extreme.html" title="Organisms live" id="a-sp">Organisms live</a> in <a href="http://www.dac.neu.edu/biology/k.bergman/WebsiteBarney/matt/psychrophiles.htm" title="polar ice" id="johi">polar ice</a>, in <a href="http://en.wikipedia.org/wiki/Hypolith" title="desert rocks" id="vhzx">desert rocks</a>, in the <a href="http://ijs.sgmjournals.org/cgi/reprint/53/2/533.pdf" title="bottom of Pacific ocean Mariana Trench" id="w-o7">bottom of Pacific ocean Mariana Trench</a> (11 km deep) and even <a href="http://www.panspermia.org/bacteria.htm" title="on the Moon" id="xau9">on the Moon</a>.</p>
<p><img src="http://softwarecreation.org/images/2008/human-evolution.gif" width="548" height="354" /></p>
<blockquote id="xi66"><p>Evolutionary approach is one of the most powerful and proven methods known to us for designing effective systems under complex uncertain conditions. There are no reasons why software teams should ignore this approach &#8211; they indeed often deal with complex <a href="http://softwarecreation.org/2007/software-requirements-are-elusive-6-reasons-why-customers-cannot-get-them-right/" title="uncertain requirements" id="qqov">uncertain requirements</a> and environment.<br id="xo_b" /></p></blockquote>
<p>There are 2 areas where evolutionary approach could be used:<br id="p245" /></p>
<ol id="p2450">
<li id="p2451">project management &#8211; enhance the way people work and interact for building a system</li>
<li id="wlgk">design and build &#8211; the growth of this software system itself.<br id="g0s3" /></li>
</ol>
<p><br id="m1_i" /> Simple Steps:<br id="uil2" /></p>
<ol id="uil20">
<li id="uil21">Generate new and modify existing ideas (increase variations).</li>
<li id="du2t">Select potentially best ideas for building software better in a specific environment (form project genotype)<br id="du2t0" /></li>
<li id="wlgk0">Make this generation of ideas work for some time (interact with environment).<br id="d6.u" /></li>
<li id="wlgk1">Learn from results &#8211; keep useful and dump harmful ideas (natural selection &#8211; improve fitness).<br id="q6k8" /></li>
<li id="wlgk2">Go to the first step and produce the new generation of ideas<br id="k6jc" /></li>
</ol>
<p><br id="kmh1" /> We can make this process more intelligent and less random and still learn a lot from biological evolution.<br id="gz5c0" /></p>
<h3 id="e0yy1"><strong id="db2n">2. Increase beneficial variations or how to generate good ideas.</strong></h3>
<p><img src="http://softwarecreation.org/images/2008/round-table.jpg" /><br id="x01c" />Organisms will not evolve without getting new variations of traits. Some new variations in a gene pool could lead to better survival and fitness, but most of them are harmful. Software development genotype is a pool of ideas applied for building a specific software system.<br id="q360" /> <br id="gb:80" /> How could we generate many good ideas and avoid harmful?<br id="qb4e" /> <br id="sxk93" /> <strong id="dxgb">Mechanisms</strong><strong id="vggg"> of idea&#8217;s evolution</strong><br id="odn2" /></p>
<ul id="xc3j4">
<li id="xc3j5"><strong id="h:ne0">Mutations </strong>- continuous invention and modification of the new approaches based on individual creative insights and team brainstorming<br id="y1x3" /></li>
<li id="xc3j7"><strong id="h:ne1">Reshuffling </strong>- recombination of existing ideas</li>
<li id="odn20"><strong id="h:ne2">Gene flow</strong> &#8211; outside expert opinions and borrowed ideas from other disciplines (engineering, art, architecture, manufacturing, etc.) and study of complex systems (physical, biological, markets, societies, etc.)<br id="u_29" /></li>
</ul>
<h4 id="fzr2">Prerequisites for generating many quality ideas:</h4>
<p><strong id="fi1z">Powerful software teams with diverse range of</strong><br id="kohz0" /></p>
<ul id="goni">
<li id="goni0"><strong id="ywwz">skills / specialization</strong> &#8211; they cover broad knowledge areas of software development: customer domain and needs, project management, UI design, development, testing<br id="goni1" /></li>
<li id="goni2"><strong id="ywwz0">expertise / experience</strong> &#8211; combination of different approaches, insights and methods of experienced professionals with fresh ideas of newcomers.<br id="goni3" /></li>
<li id="goni4"><strong id="ywwz1">personalities</strong> &#8211; various traits that complement the whole team: creativity, discipline, pragmatism, attention to details , imagination, focus and leadership.</li>
</ul>
<p><br id="q329" /> <strong id="eqyo">Decentralized control / self-organization</strong><br id="eqyo0" /> Centralized control reduces ability to come up with new ideas, which are not compliant with imposed top views. People from bottom, who implement the system, could generate better ideas, because they know environment deeply, experience it closely and receive immediate feedback from it. Independent people, who have control over project decisions and responsible for results will strive to make the best decisions.<br id="eqyo1" /> <br id="eqyo2" /> <strong id="eqyo3">Idea incubator</strong><br id="rn:x" /></p>
<ul id="q3290">
<li id="q3292">Free flow of ideas, sharing of knowledge and expertise.<br id="s28d" /></li>
<li id="q3293">Encouragement for innovative and creative thoughts and tolerance to failures.</li>
<li id="rt55">Opportunity for every team member to express ideas, be heard and respected.<br id="rt550" /></li>
</ul>
<blockquote id="xe-e"><p>Good ideas in a software project are necessary foundation of success, lack of them is disaster. Do whatever is possible to generate many good ideas.<br id="gz5c2" /></p></blockquote>
<h3 id="e0yy2"><strong id="db2n1">3. Improve Fitness &#8211; keep useful and dump harmful ideas<br id="f95t" /> </strong></h3>
<p><img src="http://softwarecreation.org/images/2008/natural-selection.png" /><br id="wx8v" /></p>
<p>Genes passed to the next generation are result of two factors: Fitness (natural selection) and Chance (genetic drift).<br id="o5_v3" /> <br id="o5_v4" /> How could we improve blind process of selecting best ideas and avoid high failure rate? <br id="o5_v5" /> <br id="kfz8" /> <strong id="t_gz0">Establish clear fitness criteria</strong><br id="x5we1" /> Every organism have clear short-term goals &#8211; survive and reproduce to accomplish the long term goal &#8211; passing and increasing share of their genes in the next generations.<br id="kfz80" /> Software projects should have clear fitness criteria, which aligns team members, guide their decisions and actions. Criteria should be relevant to the most important goals of the project. It could reflect the purpose of the system, time to market, quality or cost. It should be clear, short and really important for survival and success.<br id="r_gm" /> <br id="l1t41" /> <strong id="pl9m0">Maintain selection pressure and increase role of Fitness vs. Chance</strong><br id="pl9m1" /> Low natural selection leads to more complex solutions. Most mutations which don&#8217;t increase fitness will be eliminated in a large population with fierce competition and strong selection pressure. This process could lead to a greater simplicity keeping only useful for fitness traits. In populations without much selection pressure, genetic drift increase chances of new genes survival (even disadvantageous). So population could have increased genes complexity without much advantage for fitness.<br id="nj_8" /> <br id="s5j90" /> <strong id="y3a71">Avoid genetic drift</strong><br id="cylh0" /> Genetic drift produces random changes in the frequency of traits in a population, which results from the role chance plays in whether a given individual will survive and reproduce. Chance play enormous role in biological evolution (maybe even more important than natural selection) and a great source of inefficiency. We can do better in software development. Transparent and independent decision making, self organization and power of diverse opinions will substantially decrease the role of the Blind Chance.<br id="loi_0" /></p>
<blockquote id="xe-e0"><p>Therefore, a team with many good ideas shaped by selection pressure and fitness criteria will produce the best results.</p></blockquote>
<h3 id="yhyc">4. Pragmatic implementation</h3>
<p><img src="http://softwarecreation.org/images/2008/fins-to-limbs.jpg" /><br id="awzn" /> <strong id="vu9q0">Good enough working solutions</strong><br id="vu9q1" /> Animals shouldn&#8217;t be perfectly adapted, they just need to be in par with their competitors. Natural selection requires only requires something to work, not perfectly but work. Evolution is more likely reshape existing structures than invent new ones.<br id="z4ji0" />  The classic example is the <a href="http://pandasthumb.org/about.html" id="z4ji1" target="ns">panda&#8217;s thumb</a>, which it uses to grasp bamboo. The panda&#8217;s true thumb is committed to another role. The <a href="http://en.wikipedia.org/wiki/Sarcopterygii" title="lobed fins of early fish" id="keza">lobed fins of early fish</a> have turned into structures as diverse as wings, fins, hoofs and hands. <br id="cesb0" /></p>
<blockquote id="p7z-"><p>In software we could be satisfied with solutions which are not perfect at the beginning. We can live with them knowing that evolution forces and pressure will shape ideas behind and we will make these solutions better with more experience.<br id="ag7i" /></p></blockquote>
<p><strong id="tefk0">Practical and immediate purpose</strong><br id="om5h0" /></p>
<blockquote id="s.i.1"><p> Every new feature in the system should have some immediate purpose &#8211; evolution invented only something that has purpose.<br id="jjun0" /></p></blockquote>
<p><strong id="b1y2">Exaptation</strong> &#8211; structures and behaviors that evolved for one purpose but take on a wholly new one, while remaining useful at every intermediate stage. It means that some features cannot evolve if they are not completely useful immediately. Two way radio could be useful for animal communication, but it didn&#8217;t evolve, because half-way radio is useless &#8211; it doesn&#8217;t tell anything useful for animals about their environment. Visible light is different &#8211; any small improvement in vision can provide big advantage in many environments.<br id="ph:s" /> There is an interesting question: could we miss great design ideas if we only develop for immediate purpose? There are many useful inventions that came as a result of fundamental science curiosity without much practical need at the beginning. However, I&#8217;m inclined to believe that software development is <a href="http://softwarecreation.org/2007/is-software-development-empirical-or-rational/" title="empirical discipline" id="z4rp">empirical discipline</a> and more effective with developing for immediate purpose only.<br id="afgq" /> <strong id="wppf2"><br id="wppf3" /> </strong><strong id="a33g">Repurposing</strong><br id="a33g0" /> Repurposing a structure does not have to involve the loss of the original structure. Reptilian jaw bones turned into mammalian ear bones, without the loss of the jaw. The neural circuitry that allows us to make fine limb movements may have been adapted to produce speech as well.</p>
<p>Sometimes just one aspect of a feature can be co-opted for another use. The first hard mineralised structures to evolve in our ancestors were the teeth of early fishes known as conodonts. Once the ability to form hard hydroxyapatite had evolved, it could be exploited elsewhere in the body and may have been the basis of the bony skeletons of all vertebrates.</p>
<p>Repurposing is an interesting lesson for the software development &#8211; successful reuse of existing structures for the new functions. At the first glance, it goes against main principles of good software design &#8211; single responsibility, isolation and decoupling of components. Biological organisms don&#8217;t have much choice with mutations- which could add only small changes. But efficient and economical designs of many organisms suggest that repurposing could be a good strategy. We could maximize reuse of the components for different purposes while keeping smaller inner parts isolated. Relentless refactoring, removal of duplication and creating abstractions are the main methods. The ultimate condition is <a href="http://softwarecreation.org/2008/the-secret-of-building-effective-software-systems/" title="good understanding and mental control over the system" id="a7bp">good understanding and mental control over the system</a>.<br id="j:lf" /> <br id="afgq0" /> <strong id="wppf4">No refactoring (or elimination of unused traits)</strong><br id="tefk1" /> Lack of refactoring seems as a serious flaw of biological evolution. New organisms repurpose what exists and build new structures on top of old without cleaning and eliminating unnecessary stuff. DNA has a lot of junk. These structures are not needed<br id="sat31" /></p>
<ul id="sat32">
<li id="sat33">wings of ostriches</li>
<li id="sat34">appendix<br id="sat35" /></li>
<li id="sat36">male nipples</li>
</ul>
<p>Software team can use refactoring as an essential part of effective and pragmatic implementation and improvement of evolutionary approach.</p>
<h3 id="cs_8"><strong id="juoa">5. Making impossible possible with small continuous changes.</strong></h3>
<p><img src="http://softwarecreation.org/images/2008/making-possible.jpg" /><br id="ty1r" /> Small changes accumulated over time cause substantial changes in organisms. Continuous improvement of the genotype and small frequent changes work for all living organisms in this unpredictable and very complex world. They lead to highly fit, adapted and efficient solutions.<br id="juoa0" /> <br id="xl2v2" /> By weeding out harmful mutations and assembling beneficial ones, natural selection acts like an <strong id="z1_b">&#8220;improbability drive&#8221;</strong> that can, given enough time, produce results that appear completely impossible at first glance.<br id="ok:n" /></p>
<blockquote id="z1_b0"><p>One of the most important lessons for Software Development is possibility to arrive with great solutions without planning and predicting them in advance. It is one of the best strategies in the complex, uncertain and changing environment. <br id="z1_b1" /></p></blockquote>
<p>Agile approach is successful because it strikes the balance between adaptation to changing environment and predictability required for business. <br id="c:gf" /> <br id="b4wg" /> <strong id="b4wg0">Principles:</strong><br id="mnvc" /></p>
<ul id="b4wg1">
<li id="b4wg2">Be open and ready to changes</li>
<li id="b4wg3">Frequently get feedback, change and adjust in small steps</li>
<li id="b4wg4">Continuously learn and reflect what works and what doesn&#8217;t</li>
<li id="b4wg5">Often evaluate if your project and systems are fit for their purpose and environment.</li>
</ul>
<h3 id="c6f10">Summary</h3>
<p>Evolutionary approach works if software team<br id="x3ea" /></p>
<ul id="osa5">
<li id="osa50">can generate many good ideas <br id="sg-2" /></li>
<li id="sg-20">can select most useful ideas how to build the system</li>
<li id="osa51">works under healthy pressure to meet fitness criteria</li>
<li id="rg3e">pragmatic in implementation</li>
<li id="w4.i">learn from results, continuously adapt to needs and environment <br id="w4.i0" /></li>
</ul>
<p><br id="e0r61" /> <strong id="blcs0"> Resources:</strong><br id="wo7l0" /> <a href="http://softwarecreation.org/2008/comparing-intelligent-software-evolution-to-chaotic-biological-evolution/" title="Comparing Intelligent Software Evolution to Chaotic Biological Evolution" id="ep1r">Comparing Intelligent Software Evolution to Chaotic Biological Evolution</a> <br id="nb5p" /> <a href="http://www.newscientist.com/channel/life/dn13620-evolution-24-myths-and-misconceptions.html" title="Evolution: 24 myths and misconceptions" id="z0t3">Evolution: 24 myths and misconceptions</a>, Newscientist (requires subscription)<br id="p-0m0" /> <a href="http://en.wikipedia.org/wiki/Evolution" title="Evolution" id="f5uo">Evolution</a>, Wikipedia</p>
<!-- Social Buttons Shared Counts Generated by Digg Digg plugin v4.0.9, 
    Author : Yong Mook Kim
    Website : http://www.mkyong.com/blog/digg-digg-wordpress-plugin/ --><img src="http://softwarecreation.org/?ak_action=api_record_view&id=66&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://softwarecreation.org/2008/what-software-development-can-learn-from-biological-evolution/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Secret of Building Effective Software Systems</title>
		<link>http://softwarecreation.org/2008/the-secret-of-building-effective-software-systems/</link>
		<comments>http://softwarecreation.org/2008/the-secret-of-building-effective-software-systems/#comments</comments>
		<pubDate>Mon, 19 May 2008 20:55:50 +0000</pubDate>
		<dc:creator>Andriy Solovey</dc:creator>
				<category><![CDATA[Concepts]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[People]]></category>
		<category><![CDATA[Practices]]></category>
		<category><![CDATA[Process]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Skills]]></category>
		<category><![CDATA[System]]></category>

		<guid isPermaLink="false">http://softwarecreation.org/2008/the-secret-of-building-effective-software-systems/</guid>
		<description><![CDATA[Share
I can&#8217;t wait to share this simple secret with you right now.  The Secret: Effective Software Systems are the systems that easy to understand and operate with human brains.  Programmers are more productive with effective software systems. Programmers can better learn and grow these system. Programmers have less problems, work faster and make [...]]]></description>
			<content:encoded><![CDATA[<div class='dd_post_share'><div class='dd_buttons'><div class='dd_button'><iframe src='http://api.tweetmeme.com/button.js?url=http://softwarecreation.org/2008/the-secret-of-building-effective-software-systems/&source=AndriySolovey&service=&service_api=&style=compact' height='20' width='90' frameborder='0' scrolling='no'></iframe></div><div class='dd_button'><a name='fb_share' type='button_count' share_url='http://softwarecreation.org/2008/the-secret-of-building-effective-software-systems/' href='http://www.facebook.com/sharer.php'>Share</a><script src='http://static.ak.fbcdn.net/connect.php/js/FB.Share' type='text/javascript'></script></div><div class='dd_button'><script src='http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://softwarecreation.org/2008/the-secret-of-building-effective-software-systems/'></script></div><div class='dd_button'><a title='Post on Google Buzz' class='google-buzz-button' href='http://www.google.com/buzz/post' data-button-style='small-count' data-url='http://softwarecreation.org/2008/the-secret-of-building-effective-software-systems/'></a><script type='text/javascript' src='http://www.google.com/buzz/api/button.js'></script></div><div class='dd_button'><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http://softwarecreation.org/2008/the-secret-of-building-effective-software-systems/&amp;title=The+Secret+of+Building+Effective+Software+Systems&amp;t=2' height='18' width='120' frameborder='0' scrolling='no'></iframe></div></div></div><div style='clear:both'></div><p><img src="http://softwarecreation.org/images/2008/software-unknown.jpg" /></p>
<p>I can&#8217;t wait to share this simple secret with you right now.<br id="bcz60" /> <br id="icww1" /> <span id="yb4h0"><em id="rzm80">The Secret</em></span>: <span id="tmg00"><strong id="lh4q0">Effective Software Systems are the systems that easy to understand and operate with human brains.</strong></span><br id="jwyk0" /> <br id="lfgv0" /> Programmers are more productive with effective software systems. Programmers can better learn and grow these system. Programmers have less problems, work faster and make better decision with them.<br id="lfgv1" /> <br id="jwyk1" /> Now, you can avoid spending time reading this post if you already know this secret and you know how to avoid building the software system that:<br id="jwyk2" /></p>
<ul id="jwyk3">
<li id="jwyk4">almost impossible to understand in reasonable time<br id="cskb0" /></li>
<li id="jwyk4">has confusing and convoluted swamp of logic and structure</li>
<li id="jwyk4">scary to change as nobody has any clue what will be broken, but sure that it will be broken<br id="ys3i0" /></li>
</ul>
<p><br id="df:u0" /> If you are still interested, lets find out what makes software systems effective.<br id="i1br0" /> <br id="fj_60" /> Software Development is a pure mental endeavor (except typing on keyboard) that includes 3 main activities:<br id="q2o50" /></p>
<ul id="ky5w0">
<li id="ky5w1"><span id="qo7g0" style="font-weight: bold">Understand </span>- learn and know system concepts and implementation</li>
<li id="ky5w2"><span id="qo7g1" style="font-weight: bold">Evolve </span>- build, modify and support growth of the system ideas in the code<br id="n51v0" /></li>
<li id="ky5w3"><span id="qo7g2" style="font-weight: bold">Share </span>- communicate and exchange ideas about the system</li>
</ul>
<p><br id="y-gl2" /> Programmers should care about 7 areas to make the system better suited for our brains:<br id="ky5w4" /></p>
<ol id="attr0">
<li id="attr1"><span id="ccgy0"><strong id="pyx80">Knowledge Creation and Retention</strong></span> &#8211; parsing, memorization and comprehension of the system ideas<br id="v1n_0" /></li>
<li id="attr1"><span id="zvyt0"><strong id="pyx81">System Organization</strong></span> &#8211; elements, relations and structure in the system<br id="e:xy0" /></li>
<li id="attr1"><span id="urez0"><strong id="pyx82">Sustaining Emerging Order</strong></span> &#8211; support evolution of the system and gain control over chaos<br id="fwyu0" /></li>
<li id="attr1"><span id="hg-z0"><strong id="pyx83">Minimize Noise</strong></span><span id="r4tk0" style="font-weight: bold"> and Purify</span> &#8211; avoid adding unnecessary stuff to the system<br id="hg-z1" /></li>
<li id="attr1"><span id="mc1a0"><strong id="pyx84">System Discovery and Learning</strong></span> &#8211; making sense of the system<br id="mc1a1" /></li>
<li id="attr1"><span id="mc1a2"><strong id="pyx85">Mental Models</strong></span> &#8211; our internal explanations for how things are working in the real system<br id="j:8d0" /></li>
<li id="attr1"><span id="mc1a3"><strong id="pyx86">Shared Knowledge</strong></span> &#8211; ideas exchange, reconciliation of opinions and creation of mutually enhanced knowledge.</li>
</ol>
<p><span id="more-62"></span></p>
<h3 id="jbhv1">1. Knowledge Creation and Retention<br id="cth80" /></h3>
<p><cite id="ypkf0">Information is not knowledge.</cite> &#8211; Albert Einstein</p>
<p><img src="http://softwarecreation.org/images/2008/knowledge.jpg" /><br id="hapl0" /> <br id="hapl1" /> Programmers should keep as less as possible things in the mind when work with the system. Less information, simpler and more logical ideas behind the code cause less brain damage and more understanding.<br id="cth81" /> Main principles:<br id="cth82" /></p>
<ul id="nrz20">
<li id="nrz21"><span id="ur9t0"><strong id="pyx87">Chunking</strong></span> &#8211; combining many units of information into a limited number of units and chunks, so that information is easier to process and remember. Logical groups (subsystems -&gt; modules -&gt; classes) should contain only few elements. These groups should emerge with growth of the system functionality and complexity. They should replace large clusters of difficult to remember similar and unstructured elements.<br id="m-210" /></li>
</ul>
<ul id="q5os">
<li id="c1yo"><span id="ur9t1"><strong id="pyx88">Abstraction </strong></span>- generalize, find common meaning and remove redundancy in the similar concepts across the system. You can substantially reduce number of ideas required for understanding the system.</li>
<li id="vlkd"><span id="ur9t2"><strong id="pyx89">Simplicity </strong></span>- simpler ideas make understanding (and programmers life) much easier.</li>
<li id="vlkd"><span id="ur9t3"><strong id="pyx810">Isolation </strong></span>- reduce relations and dependencies between elements. These relations add significant complexity to the system and therefore effort to understand and remember them. The volume of knowledge about relations could easily exceed the knowledge about individual elements.</li>
</ul>
<p><br id="j90r0" /> Examples of useful tools for supporting knowledge formation:<br id="j90r1" /></p>
<ul id="f:nj1">
<li id="f:nj2"><span id="g2oc0"><strong id="pyx811">Unit tests</strong></span> &#8211; capture knowledge about the system correct behavior. They evolve with the system and become a parallel verification system. Good unit tests reduce our effort and limit necessary for understanding scope as they focus on the system behavior in isolated components and functions.<br id="f:nj3" /></li>
<li id="f:nj4"><span id="rikw0"><strong id="pyx812">Visuals </strong></span>- take advantage of diagrams, <a href="http://en.wikipedia.org/wiki/Mind_map" title="mind maps" id="j::n">mind maps</a> and pictures to simplify, distill and integrate important knowledge and ideas about the system<br id="d8s50" /></li>
<li id="f:nj5"><span id="e2nd0"><strong id="pyx813">Storytelling </strong></span>- create imagery, emotions and understanding of the system behavior through stories (our <a href="http://softwarecreation.org/2008/the-programmers-brains-at-work-understanding-the-software-system/" title="episodic memory" id="os4o">episodic memory</a> is very powerful). For example, create narratives how users accomplish tasks with your system. Or share dramatic stories how programmers doomed the system with ignoring important practices. <br id="ku0v0" /></li>
</ul>
<h3 id="jbhv5">2. System Organization</h3>
<p><cite id="ypkf1">Be regular and orderly in your <span style="font-weight: bold" id="gqbw0">system organization</span>, so that you may be violent and original in your <span style="font-weight: bold" id="gqbw1">software solutions</span>.</cite>  (paraphrasing Flaubert)</p>
<p><img src="http://softwarecreation.org/images/2008/organization.jpg" /><br id="t0q40" /> <br id="t0q41" /> Human programmers shouldn&#8217;t have hard time to memorize and comprehend a software system. Computers don&#8217;t care much about the organization as long as the logic is correct, but we, human programmers, do. Clear, logical and consistent organization make us much more productive.<br id="ian90" /> Main principles:<br id="ian91" /></p>
<ul id="lxye">
<li id="nfbk"><span id="ib_l0"><strong id="pyx814">Modularity </strong></span>- managing system complexity by dividing large subsystems into multiple, smaller self-contained systems</li>
<li id="n8ng"><span id="ib_l1"><strong id="pyx815">Layering </strong></span>- process of organizing information into related groupings in order to manage complexity and reinforce relationships in the information</li>
<li id="u48h"><span id="ib_l2"><strong id="pyx816">Hierarchy </strong></span>- hierarchical organization is the simplest structure for visualizing and understanding complexity<br id="j90r2" /></li>
</ul>
<h3 id="jbhv6">3. Sustaining Emerging Order</h3>
<p><cite id="ypkf2">Evolution is not a force but a process. Not a cause but a law.</cite> &#8211; John Morley</p>
<p><img src="http://softwarecreation.org/images/2008/evolution.jpg" /><br id="a3or0" /> <br id="a3or1" /> The main challenge for effective system organization is the fact that a system is constantly changing during active development. Good organization today doesn&#8217;t mean good organization tomorrow with many new added features. New customer needs, contribution of fellow developers and growing complexity push a software system to chaos.<br id="jxp-" /> Therefore, we have to keep organization optimal for today needs and still ready for tomorrow changes with<br id="cth83" /></p>
<ul id="br8f0" style="margin-top: 0in" type="disc">
<li id="br8f1" class="MsoNormal"><span id="gy6r0"><strong id="pyx818">Refactoring      </strong></span>– constant effort to improve the system internal      structure and making it effective for recent changes to prevent system degradation and rule of chaos</li>
<li id="br8f2" class="MsoNormal"><span id="uh2c0"><strong id="pyx819">Simple      principles and rules</strong></span> (that everybody follows) help to keep consistency and      integrity of the system in time of intensive growth and modifications.</li>
<li id="br8f4" class="MsoNormal"><span id="i4rm0"><strong id="pyx820">Small independent,      single-purpose components</strong></span> – enable rich behavior with minimum number of      elements, which could participate in various and often unforeseen scenarios. Bigger      components are less reusable, more specialized and lead to more code,      complexity and duplication.</li>
<li id="br8f4" class="MsoNormal"><a href="http://softwarecreation.org/2007/evolutionary-software-architecture-or-why-developers-are-not-janitors/" style="font-weight: bold" title="Building adaptive system" id="lon8">Building adaptive system</a> using agile approach</li>
</ul>
<h3 id="jbhv7">4. Minimize Noise and Purify<br id="omaq0" /></h3>
<p><cite id="p0rn0">Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away.</cite> -Antoine de Saint-Exupery</p>
<p><img src="http://softwarecreation.org/images/2008/noise.jpg" /><br id="tw.y0" /> <br id="wnlj0" /> Complexity is one of the biggest problem for the programmers brains. While good organization and representation of the system ideas help to fight it, the ultimate challenge is to avoid adding unnecessary stuff to the system.<br id="n7:a0" /> <br id="p0rn1" /> Principals for Complexity Reduction:<br id="p0rn2" /></p>
<ul id="bf-b0">
<li id="bf-b1"><span id="p0rn3"><strong id="pyx821">Increase Signal-to-Noise Ratio</strong></span> &#8211; ratio of relevant to irrelevant information in the system. Minimize noise by removing unnecessary elements and minimize the expression of necessary elements.</li>
</ul>
<ul id="bf-b2">
<li id="bf-b3"><span id="bf-b4"><strong id="pyx822">Follow 80/20 Rule (</strong><a href="http://en.wikipedia.org/wiki/Pareto_principle" title="Pareto's Principle" id="obe5"><strong id="pyx823">Pareto&#8217;s Principle</strong></a><strong id="pyx824"> )</strong></span> &#8211; a high percentage of effects in any large system are caused by a low percentage of variables. In other words, 80% of requested functionality will be used rarely or not used at all, while substantially increasing system complexity.<br id="vb9m0" /></li>
<li id="bf-b5"><span id="q03r0"><strong id="pyx825">Consider Good Enough Alternatives</strong></span> &#8211; don&#8217;t dash against the rock implementing exactly what customer asks. Slight modifications and alternatives could often cover need with less effort and complexity.<br id="awte2" /></li>
</ul>
<h3 id="jbhv8">5. System Discovery and Learning<br id="k7nz0" /></h3>
<p><cite id="ypkf3">The real voyage of discovery consists not in seeking new lands, but in seeing with new eyes.</cite> &#8211; Marcel Proust</p>
<p><img src="http://softwarecreation.org/images/2008/discovery.jpg" /><br id="j7y40" /> <br id="o-2g0" /> Learning and navigating the complex software system is a difficult task. Usually developers read code, documentation and debug the system. These methods take time and often are not efficient.<br id="ub::0" /> <br id="q:g80" /> A better way to discover the system and make it discoverable with:<br id="rvyw0" /></p>
<ul id="ufr.0">
<li id="ufr.1"><span id="ufr.2"><strong id="pyx826"> Entry Point</strong></span><span id="ydut0"><strong id="pyx827">s</strong></span> &#8211; points of attentional entry into the system. There are points in the system that doesn&#8217;t require much knowledge about the rest of the system. They could be starting points to understand other elements. For a example, UI screens or the system input / output. Other parts could start making sense and uncover their purpose in relation to these entry points. Discover these points and help newcomers to find them.</li>
<li id="ufr.3"><span id="dc7f0"><strong id="pyx828"> Progressive Disclosure</strong></span> &#8211; a strategy for managing information complexity in which only necessary information is visible at any given time. Good design and coding style allow understanding of intent and logic of the studied system area without deeply diving into boundless waters of implementation details.</li>
</ul>
<p>Code example:<br id="msj:0" /> <code id="ikca0"> Criteria criteria = Criteria.AddPriceRange(10, 100).AddDateRange(Period.LastMonth);<br id="l8j.0" /> IList orders = Database.Orders.LoadBy(criteria);<br id="n9760" /> decimal totalTaxes = orders.Sum(order =&gt; order.Tax)</code>    <br id="tglh0" /></p>
<ul id="ufr.0">
<li id="ufr.4"><span id="mg-x0"><strong id="pyx829"> Recognition over Recall</strong></span> &#8211; memory for recognizing things is better than memory for recalling things. (e.g. multiple choice questions with possible answers vs. fill-in-the-blank questions). Minimize the need to recall information from memory whenever possible. Use tools to make available options clearly visible. For example, <a href="http://msdn.microsoft.com/en-us/library/hcw1s69b%28vs.71%29.aspx" title="Visual Studio Intellisense" id="ryvo">Visual Studio Intellisense</a> and <a href="http://www.jetbrains.com/resharper/" title="Resharper" id="f2wi">Resharper</a> remove need in memorizing members, purpose and syntax of .Net library classes and methods. Build tools or extend a development environment to construct code without memorizing all details.<br id="fw6v0" /></li>
<li id="ufr.5"><span id="lpkt0"><strong id="pyx830"> Inverted pyramid</strong></span> &#8211; method of presentation in which information is presented in descending order of importance. Discover first what is most important and make it easily accessible  following by less and less important information.</li>
<li id="ufr.6"><span id="lpkt1"><strong id="pyx831"> Performance load</strong></span> &#8211; the greater the effort to accomplish a task, the less likely the task will be accomplished successfully. Most important tasks should be easy to accomplish and most valuable information should be easiest to access (including direct access to the people who has the best knowledge).<br id="z61v0" /></li>
<li id="ufr.7"><span id="lpkt2"><strong id="pyx832"> Picture superiority effect</strong></span> &#8211; pictures are remembered better than words. Use pictures and words together to reinforce the learning.</li>
<li id="ufr.8"><span id="ydut1"><strong id="pyx833"> Associations with familiar</strong></span> &#8211; link new information to already familiar concepts. Build on this knowledge by comparing and contrasting to reach deep understanding.<br id="ydut2" /></li>
<li id="ufr.8"><span id="ydut3"><strong id="pyx834">Examples</strong></span> &#8211; learning examples is always one of the best method to understand how to use the system (including best practices, how-to, and tutorials).<br id="ydut4" /></li>
</ul>
<h3 id="jbhv9">6. Mental Models</h3>
<p><cite id="ch7i0">A mental model is an explanation in someone&#8217;s thought process for how something works in the real world.</cite> &#8211; <a href="http://en.wikipedia.org/wiki/Mental_model" title="Wikipedia" id="k4sl">Wikipedia</a></p>
<p><img src="http://softwarecreation.org/images/2008/mental-models.jpg" /><br id="yd.o0" /> <br id="ch7i1" /> People understand systems and environments and interact with them by comparing the outcomes of their mental models with the system and real-world domain concepts. Good mental models bring better understanding and optimal decision making.<br id="fc_n2" /> <br id="mqqf0" /> <span id="x5tm0"><strong id="pyx835"> Schema</strong></span><span id="tt9c0"><strong id="pyx836">ta</strong></span> &#8211; networks of connected ideas or relationships that help to organize experience and information into a meaningful system. Conversation between individuals is most effective if both share common schemata. <br id="eu9j0" /> Examples:<br id="eu9j1" /></p>
<ul id="eu9j2">
<li id="eu9j3"><a href="http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29" title="design and architecture patterns" id="fm5t">Design and architecture patterns</a> &#8211; general reusable solutions to a commonly occurring problems in software design.</li>
<li id="eu9j4"><a href="http://xp123.com/xplor/xp0004/index.shtml" title="system metaphors" id="qtkr">System metaphors</a> &#8211; a simple story of how the system works. A system metaphor provides common vision and shared vocabulary.<br id="iweu0" /></li>
<li id="eu9j4">Conventions &#8211; standard and well known approaches in architecture, design, code and user interface. They make intuitive and common sense and save mental energy for present and future developers. Custom and novel approaches should be used only if they have serious advantage.<br id="fc_n4" /></li>
</ul>
<h3 id="j:8d3">7. Shared Knowledge</h3>
<p><cite id="ypkf4">I know that you believe you understand what you think I said, but I&#8217;m not sure you realize that what you heard is not what I meant.</cite> &#8211; Robert McCloskey</p>
<p><img src="http://softwarecreation.org/images/2008/shared.jpg" /><br id="bjfn0" /> <br id="t_8r0" /> The system is rarely envisioned, built and used by the same person. A successful system is a result of people interactions &#8211; intensive ideas exchange, reconciliation of opinions and creation of mutually enhanced knowledge. It is not easy for people to properly <a href="http://softwarecreation.org/2007/software-development-is-the-flow-of-ideas-the-rest-is-secondary/" title="translate, communicate and understand" id="ta6o">translate, communicate and understand</a> each other ideas. Complex knowledge, different background and experience increase the gap that people should jump to completely understand each other.<br id="c6sz0" /> Main principles:<br id="szrf0" /></p>
<ul id="s6zq0">
<li id="s6zq1"><span id="j8y80"><a href="http://www.domaindrivendesign.org/discussion/messageboardarchive/UbiquitousLanguage.html" title="Ubiquitous language" id="c3_x"><strong id="pyx837">Ubiquitous language</strong></a></span> &#8211; the shared language that people with different perspectives use to exchange ideas about the system. The same meaning of the words is very important for understanding, but <a href="http://softwarecreation.org/2007/can-computers-beat-human-programmers-part-2-becoming-intelligent/" title="very difficult to achieve" id="hurk">very difficult to achieve</a>.<br id="keiw0" /></li>
<li id="s6zq2"><span id="j8y81"><strong id="pyx838"> Clear goals and intention</strong></span> &#8211; help to align people thinking and actions, and avoid wasteful effort caused by misunderstanding or confusion.<br id="tl400" /></li>
<li id="s6zq4"><span id="j8y82"><strong id="pyx839">Express business domain concepts in the code</strong></span> &#8211; represent business concepts in the code. Developers will better understand domain, synchronize implementation with customer ideas and align the system with relevant business concepts. As a result, the system can effectively grow with the refinement and expansion of business needs.<br id="wz6o0" /></li>
<li id="s6zq5"><span id="j8y83"><strong id="pyx840">Code readability</strong></span> &#8211; good naming and readable code enables better understanding by fellow programmers, reduce chances of errors and lead to correct future modifications.<br id="rsgb0" /></li>
<li id="s6zq6"><span id="j8y84"><strong id="pyx841">Shared mental models</strong></span> &#8211; frequent face-to-face discussions, pair programming and direct conversations with customers bring shared understanding, effective exchange of knowledge and most optimal solutions.<br id="mb.v0" /></li>
</ul>
<p><img src="http://softwarecreation.org/images/2008/software-knowledge.jpg" /></p>
<p>Evolution didn&#8217;t consider adaptation of human brains for software development. But our brains is the most important tool for programming. You cannot change brains (and human nature), so make software development compatible with them. Build effective software systems.<br id="zy4m1" /> <br id="pp8j" /> <span id="s6zq9"><strong id="pyx842">Resources:</strong></span><br />
<a href="http://softwarecreation.org/2008/the-programmers-brains-at-work-understanding-the-software-system/">The Programmer&#8217;s Brains At Work: Understanding The Software System</a><br />
<a href="http://www.amazon.com/gp/product/1592530079/104-3570359-3820730?ie=UTF8&amp;tag=softwcreatmys-20&amp;linkCode=xm2&amp;camp=1789&amp;creativeASIN=1592530079" title="Universal Principles of Design" id="zgk1">Universal Principles of Design</a>, William Lidwell , Kritina Holden, Jill Butler</p>
<!-- Social Buttons Shared Counts Generated by Digg Digg plugin v4.0.9, 
    Author : Yong Mook Kim
    Website : http://www.mkyong.com/blog/digg-digg-wordpress-plugin/ --><img src="http://softwarecreation.org/?ak_action=api_record_view&id=62&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://softwarecreation.org/2008/the-secret-of-building-effective-software-systems/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
