<?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; System</title>
	<atom:link href="http://softwarecreation.org/category/system/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>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>Comparing Intelligent Software Evolution to Chaotic Biological Evolution</title>
		<link>http://softwarecreation.org/2008/comparing-intelligent-software-evolution-to-chaotic-biological-evolution/</link>
		<comments>http://softwarecreation.org/2008/comparing-intelligent-software-evolution-to-chaotic-biological-evolution/#comments</comments>
		<pubDate>Wed, 18 Jun 2008 03:47:57 +0000</pubDate>
		<dc:creator>Andriy Solovey</dc:creator>
				<category><![CDATA[Concepts]]></category>
		<category><![CDATA[Practices]]></category>
		<category><![CDATA[System]]></category>

		<guid isPermaLink="false">http://softwarecreation.org/2008/comparing-intelligent-software-evolution-to-chaotic-biological-evolution/</guid>
		<description><![CDATA[ShareSoftware Evolution is similar to a Bible Story: we, software creators, have a plan and goals and pursue them to create the perfect solution. We carefully select and add new features according to our grand design. We try to keep design clean and optimal. Things sometimes go wrong and the software system goes berserk, but [...]]]></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/comparing-intelligent-software-evolution-to-chaotic-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/comparing-intelligent-software-evolution-to-chaotic-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/comparing-intelligent-software-evolution-to-chaotic-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/comparing-intelligent-software-evolution-to-chaotic-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/comparing-intelligent-software-evolution-to-chaotic-biological-evolution/&amp;title=Comparing+Intelligent+Software+Evolution+to+Chaotic+Biological+Evolution&amp;t=2' height='18' width='120' frameborder='0' scrolling='no'></iframe></div></div></div><div style='clear:both'></div><p>Software Evolution is similar to a Bible Story: we, software creators, have a plan and goals and pursue them to create the perfect solution. We carefully select and add new features according to our grand design. We try to keep design clean and optimal. Things sometimes go wrong and the software system goes berserk, but we intentionally intervene and fix the problems to continue fruitful functioning of the system. <br id="uo_20" /> <br id="uo_21" /> Biological Evolution is a different story: chaotic raise and fall of different species, without any plan and goals. New traits and variations appear all the time and many are useless or even harmful. Small modifications accumulate over time, cause significant changes and emergence of new species, better adapted for the evolving world. Survival of individual organisms and species is the matter of chance, pressure from environment and competition with other organisms.<br id="r4510" /> <br id="r4511" /> Intentional growth of software versus chaotic evolution of organisms&#8230; Do they have anything in common?</p>
<h3 id="jcga0">Biological Evolution</h3>
<p><img src="http://softwarecreation.org/images/2008/evolution1.jpg" /></p>
<p>In biology, <a href="http://en.wikipedia.org/wiki/Evolution" title="evolution" id="geto">evolution</a> is the process of change in the inherited traits of a population of organisms from one generation to the next.<br id="q.iw0" /> <br id="hel70" /> <strong id="vlps0">Species </strong>- a group of organisms that can reproduce with one another and produce fertile offspring. <br id="nmv10" /> <strong id="nmv11">Population</strong> &#8211; a localized group of individuals belonging to the same species.<br id="g_h_0" /> <strong id="ce.-0">Traits</strong> &#8211; particular characteristics of an organism. <br id="dp3p0" /> <strong id="udg:0">Genes</strong> -portions of DNA molecule, which control inherited traits.<strong id="udg:0"><br id="mgbk0" /> Genotype </strong>- complete set of genes within an organism&#8217;s genome.<br id="t7qa0" /> <strong id="udg:1">Phenotype </strong>- the complete set of observable traits that make up the structure and behavior of an organism. These traits come from the interaction of its genotype with the environment.<br id="hel73" /> <strong id="jm8g0">Variations</strong> &#8211; the variation in phenotypes in a population reflects the variation in these organisms&#8217; genotypes. <br id="j3xc0" /> <br id="eedp0" /> Most of the genome of a species is identical in all individuals of that species. However, even relatively small changes in genotype can lead to dramatic changes in phenotype: chimpanzees and humans differ in only about 5% of their genomes.</p>
<p><img src="http://softwarecreation.org/images/2008/evolution-species.jpg" /></p>
<p><span id="more-64"></span></p>
<h4 id="vcb90">Mechanisms of increasing gene variations<br id="b0yn" /></h4>
<ul id="e.nh1">
<li id="e.nh2"><strong id="j3xc1">Mutations</strong> &#8211; mistakes that occur during DNA replication, which alternate version of a gene (<strong id="xidp0">alleles</strong>). Mutations give the new characteristics to the organism and can have positive and negative effects.</li>
<li id="e.nh5"><strong id="j3xc3">Reshuffling</strong> of genes through sexual reproduction with random mixtures of their parents&#8217; chromosomes.</li>
<li id="e.nh5"><strong id="j3xc2">Gene flow &#8211; </strong>genes from one population enter the gene pool of another, e.g. migration between distant populations.</li>
</ul>
<h4 id="vcb90">Mechanisms of decreasing gene variations</h4>
<h4 id="vcb90"></h4>
<ul id="vcb92">
<li id="vcb93"><strong id="vlps2">Natural selection </strong>- a process causing heritable traits that are helpful for survival and reproduction to become more common in a population, and harmful traits to become more rare. Natural selection is the result of pressure from environment and competition between organisms.<br id="bvvk" /></li>
</ul>
<ul id="nnpz1">
<li id="nnpz2"><strong id="vlps3">Genetic drift</strong> &#8211; 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. <br id="lcaq0" /></li>
</ul>
<p><br id="t3oe0" /> Though the changes produced in any one generation by drift and selection are small, differences accumulate with each subsequent generation and can, over time, cause substantial changes in the organisms.<br id="t3oe1" /> <br id="t3oe2" /> Natural selection usually predominates in large populations, while genetic drift dominates in small populations. Some <a href="http://en.wikipedia.org/wiki/Neutral_theory_of_molecular_evolution" title="theories" id="gasd">theories</a> suggest that genetic drift and mutation play much larger role than natural selection in evolution.<br id="e8_s" /></p>
<p id="g1we7"><br id="e8_s0" /></p>
<p id="g1we7">Fitness is the central concept of natural selection. Fit does not necessarily mean biggest, fastest, strongest or having more children. Instead fitness measures the organism&#8217;s genetic contribution to the next generations &#8211; the proportion of subsequent generations that carry an organism&#8217;s genes.</p>
<blockquote id="axod"><p> Now we can provide another definition of <strong id="rw540">evolution</strong>: the change in the gene pool of a population over time.</p></blockquote>
<h4 id="rldn0">Outcomes</h4>
<ul id="uoa:0">
<li id="uoa:1"><strong id="rldn1">Adaptation</strong> &#8211; structures or behaviors that enhance a specific function, causing organisms to become better at surviving and reproducing</li>
</ul>
<ul id="r_8v0">
<li id="r_8v1"><strong id="rldn2">Co-evolution</strong> &#8211; the evolution of one species causes adaptations in a second species, such as a conflict between predator and its pray.</li>
</ul>
<ul id="uoa:2">
<li id="uoa:4"><strong id="rldn3">Co-operation</strong> &#8211; mutually beneficial interactions. Can be found in social insects, such as bees, termites and ants, where sterile insects feed and guard the small number of organisms in a colony that are able to reproduce. <br id="r4t_0" /></li>
</ul>
<ul id="r_8v2">
<li id="r_8v3"><strong id="r4t_1"> Speciation</strong> &#8211; the process where a species diverges into two or more descendant species, mostly occurs in populations isolated geographically. It caused by gradual accumulation of small genetic changes.</li>
<li id="r_8v4"><strong id="r4t_2"> Extinction</strong> &#8211; the disappearance of an entire species. Indeed, virtually all animal and plant species that have lived on earth are now extinct.<br id="e2k10" /></li>
</ul>
<h3 id="a5410">Software Development Ecosystem<br id="kyzl0" /></h3>
<p>The first question: what is the object of evolution in Software Development?<br id="e8-y0" /> <br id="e8-y1" /> <strong id="e65q0">People?</strong> <br id="e65q1" /> I don&#8217;t have guts to suggest interbreeding most successful programmers and receive new generations of the best programmers. Very impractical, too long to wait and modern people are not an easy target for experiments&#8230;<br id="e65q2" /> <br id="e65q3" /> <strong id="t6mk0"> Code?</strong> <br id="e65q4" /> Code is a good candidate. We constantly evolve and change code. But individual code doesn&#8217;t have comparable set of genes and variations (unless  it is a genetic algorithm or you create mutants with intensive copy and paste) and don&#8217;t compete with other code for survival (only at level of products where code is one factor from many). We could apply only limited evolutionary principles to code and they are mostly related to ideas behind the software systems.<br id="q8g7" /> <br id="cwfv0" /> Can we find a better candidate? <br id="w4r_" /></p>
<blockquote id="jj16"><p> I believe that <strong id="mein0">genome of software development is the knowledge about how to build software systems</strong>.</p></blockquote>
<p><br id="w4r_1" /> <strong id="ouhz">Knowledge, DNA of Software Development</strong>, has two components<br id="cfvy0" /></p>
<ul id="anwy0">
<li id="anwy1"><strong id="x-uk0">process</strong>: principles, activities, roles and flow (Agile, Extreme programming, Scrum, CMM, RUP, Waterfall, Cleanroom, Crystal Clear, SWE-BOK, Context Driven Testing, etc.)<br id="m-x-0" /></li>
<li id="anwy2"><strong id="x-uk1">expertise</strong>: design, programming and domain (Algorithms, Object Oriented Design and Programming, Design and Enterprise Architecture Patterns, Refactoring, Domain Driven Design, Behavior Driven Design, Relational Databases, Web Design, Information Architecture, Usability, etc.)<br id="anwy3" /></li>
</ul>
<p><br id="oe-0" /> In essence, this is the knowledge about what software team members do at any given time to create the system: understanding requirements, design and build, verification. Humans are the best carriers of this knowledge, but it is possible to transfer it with less effective documents, books and other media. People carry huge amount of intrinsic knowledge that comes with experience, which is difficult to extract, describe and transfer to other people. Our methodologies are created to represent software development knowledge (genome) in the formal way convinient to carry between people heads and projects. However, this genome immediately meets the harsh reality of environment pressure.<br id="yyva1" /> <br id="cfvy1" /> <strong id="y9-i">Software Development</strong><strong id="oapf0"> Environment:</strong><br id="i.0p0" /></p>
<ul id="i.0p1">
<li id="i.0p2"><strong id="k9:0">people</strong>: experience, capabilities, skills, motivation, <a href="http://softwarecreation.org/2008/five-big-personality-traits-of-a-programmer-do-they-matter/" title="personalities" id="s.gh">personalities</a></li>
<li id="i.0p2"><strong id="k.36">requirements:</strong> software needs, expectations, constraints, regulations<br id="u63g" /></li>
<li id="i.0p4"><strong id="k9:00">customer</strong>: knowledgeability, relations and attitude</li>
<li id="i.0p4"><strong id="d20:">market</strong>: trends, competition, standards<br id="d20:0" /></li>
<li id="i.0p6"><strong id="k9:01">technology</strong>: development platforms and tools, technical infrastructure</li>
<li id="i.0p7"><strong id="k9:02">organization</strong>: goals, plans, management, culture, leadership style, resources, finances<br id="i.0p8" /></li>
</ul>
<p><img src="http://softwarecreation.org/images/2008/software-phenotype.jpg" /><br id="gh9g" /> <strong id="k9:03">Software Development Ecosystem Characteristics:</strong><br id="pt16" /></p>
<ul id="xc3j0">
<li id="xc3j1"><strong id="o6dc">Populations </strong>- there are different kinds of software development (web, desktop, embedded devices; system, productivity, games; business, military, science; commercial, in-house, open source; for fun, business-critical or life-critical, etc.)</li>
<li id="xc3j1"><strong id="s2hz">Traits</strong> &#8211; characteristics of approaches used in software development<br id="pt160" /></li>
<li id="xc3j1"> <strong id="il680">Genotype </strong>- software knowledge carried by individual team and used in the project to build software system
<ul id="sosg">
<li id="xc3j1"><strong id="sosg0">Encoding of information</strong> &#8211; contains enough information to build an individual software system<br id="pgtv" /></li>
<li id="xc3j2"><strong id="sosg1">Inheritance </strong>- knowledge can be passed to the next project iterations, other projects or to the whole development community<br id="vjwo" /></li>
</ul>
</li>
<li id="xc3j1"><strong id="il680">Phenotype</strong> &#8211; all the activities in software project that are outcome of interaction between this knowledge and project environment.</li>
<li id="xc3j3"><strong id="w.3t">Co-evolution</strong> &#8211; ideas compete (Waterfall vs. Agile, Procedural vs. Object-Oriented vs. Functional Programming), cooperate and enhance each other (Extreme Programming and Scrum, Refactoring and Design Patterns)<br id="kswr0" /></li>
<li id="xc3j3"><strong id="h:ne">Mechanisms</strong>:
<ul id="xc3j4">
<li id="xc3j5"><strong id="h:ne0">Mutations </strong>- continious invention and modification of the new approaches</li>
<li id="xc3j7"><strong id="h:ne1">Reshuffling </strong>- frequent recombination of various ideas</li>
<li id="xc3j7"><strong id="h:ne2">Gene flow</strong> &#8211; exchange of ideas with other populations and industries (e.g. NASA, Lean Manufacturing)</li>
</ul>
<ul id="t1bc">
<li id="xc3j7"><strong id="h:ne3">Natural Selection</strong> &#8211; software development knowledge is often under the pressure to achieve success, better meet customers needs and be effecient. Better methods have more chances to survive and become more common (e.g. adoption of Iterative approach that successfully solves challenge of changing requirements)<br id="k1wa" /></li>
</ul>
<ul id="t1bc0">
<li id="xc3j7"><strong id="h:ne4">Genetic drift</strong> &#8211; some ideas and approaches become popular by chance, some great ideas disappear without wide acceptance. Management and leadership change, politics, better sponsors, strong opinion of less qualified people, lack of knowledge about alternative approaches could play significant role in establishing far from optimal development knowledge for the project.<br id="jrh6" /></li>
</ul>
</li>
</ul>
<p><br id="axod0" /></p>
<blockquote id="axod1"><p><strong id="axod2"> Software Development Evolution</strong> is change over time in the essential knowledge about how to build software systems.</p></blockquote>
<p><br id="q6i6" /></p>
<p id="hi6_">Examples of software development evolutionary genes (views, ideas and activities):</p>
<table border="1" cellpadding="3" cellspacing="0">
<tr>
<td></td>
<td><strong>main ideas<br />
</strong></td>
<td><strong>understand requirements<br />
</strong></td>
<td><strong>design and build<br />
</strong></td>
<td><strong>verify<br />
</strong></td>
</tr>
<tr>
<td><strong><a href="http://www.extremeprogramming.org/" title="Extreme Programming">Extreme<br />
Programming</a></strong></td>
<td>iterations, emergent design, customer can change mind</td>
<td>write user stories, customer prioritize,<br />
developers estimate</td>
<td>write unit test, make it work, refactor; work in pairs</td>
<td>build automated acceptance tests</td>
</tr>
<tr>
<td><strong><a href="http://www.sei.cmu.edu/pub/documents/06.reports/pdf/06tr008.pdf" title="CMMI"><br />
CMMI</a></strong></td>
<td>process improvement framework, five levels of maturity based on practice areas that<br />
define goals, practices and work products</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong><a href="http://www.swebok.org/swebokcontents.html" title="SWE-BOK">SWE-BOK</a></strong></td>
<td>guide to the Software Engineering Body of Knowledge: characterizes and organizes<br />
contents of the software engineering discipline in ten knowledge areas</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>Traditional SDLC<br />
</strong></td>
<td>sequential process separated into distinct phases: analysis, design, implementation,<br />
maintenance</td>
<td>analyze, prepare functional and technical specifications</td>
<td>design and build according to specifications</td>
<td>test according to specifications; security,  performance and user acceptance<br />
testing</td>
</tr>
<tr>
<td><strong><a href="http://www.amazon.com/gp/product/0471081124/103-6394984-7369422?ie=UTF8&amp;tag=softwcreatmys-20&amp;linkCode=xm2&amp;camp=1789&amp;creativeASIN=0471081124" title="Context Driven Testing"><br />
Context Driven Testing</a> </strong></td>
<td>testing is driven by an understanding of the environment, culture, and intended<br />
use of software</td>
<td></td>
<td></td>
<td>exploratory testing: concurrent test design and test execution; adapt testing plans<br />
based on test results</td>
</tr>
<tr>
<td><strong><a href="http://www.amazon.com/gp/product/0321125215/103-6394984-7369422?ie=UTF8&amp;tag=softwcreatmys-20&amp;linkCode=xm2&amp;camp=1789&amp;creativeASIN=0321125215" title="Domain Driven Design"><br />
Domain Driven Design</a> </strong></td>
<td>the system design should be based on domain model</td>
<td>form common language between business and developers</td>
<td>build code that represents domain model and concepts</td>
<td>use automated tests for domain model assertions</td>
</tr>
<tr>
<td><strong>Object Oriented Design</strong></td>
<td>a software program is the system of interacting objects</td>
<td>create object model for the problem space: base classes, responsibilities, collaboration;<br />
UML diagrams</td>
<td>find abstractions, inherit, delegate, encapsulate, package; use design patterns</td>
<td></td>
</tr>
<tr>
<td><strong><a href="http://www.stcsig.org/usability/topics/articles/ucd%20_web_devel.html" title="User Centered Design"><br />
User Centered Design</a> </strong></td>
<td>active participation of real users on all stages; iterations of design solutions</td>
<td>focus groups, interviews</td>
<td>participatory design</td>
<td>frequent usability testing</td>
</tr>
<tr>
<td><strong><a href="http://www.steptwo.com.au/papers/kmc_whatisinfoarch/" title="Information Architecture"><br />
Information Architecture</a> </strong></td>
<td>organization of information and functionality to increase web site usability, intuitive<br />
navigation and findability</td>
<td>understand business context, content and users</td>
<td>build site map, wireframes, personas, user interaction scenarios</td>
<td></td>
</tr>
<tr>
<td><strong>Web Design<br />
</strong></td>
<td>web based user interface and content delivered via Internet</td>
<td>understanding content, visual appearance</td>
<td>build web pages with CSS, HTML and JavaScript; implement server side functionality<br />
for dynamic pages</td>
<td>browsers and standards compatibility</td>
</tr>
<tr>
<td><strong>Database Design<br />
</strong></td>
<td>data storage and retrieval</td>
<td>analyze data elements and relationship; build logical data model</td>
<td>relational databases: design and normalize tables, build views, stored procedures<br />
and functions</td>
<td></td>
</tr>
</table>
<p><br id="egzh" /> There is no best set of ideas. Success of the every software creation gene depends on interaction with a project environment. Biological evolution can teach us few lessons of selecting and evolving most advantageous genes for our projects. The next post will explore these lessons.<br id="pu_q" /> <br id="e0r61" /> <strong id="blcs0"> Resources:</strong><br id="wo7l0" /> <a href="http://en.wikipedia.org/wiki/Evolution" title="Evolution" id="f5uo">Evolution</a>, Wikipedia<br id="zukd" /> <a href="http://www.talkorigins.org/faqs/faq-intro-to-biology.html" title="Introduction to Evolutionary Biology" id="jaqc">Introduction to Evolutionary Biology</a></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=64&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://softwarecreation.org/2008/comparing-intelligent-software-evolution-to-chaotic-biological-evolution/feed/</wfw:commentRss>
		<slash:comments>2</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>
		<item>
		<title>How a beautiful software system becomes Frankenstein</title>
		<link>http://softwarecreation.org/2008/how-a-beautiful-software-system-becomes-frankenstein/</link>
		<comments>http://softwarecreation.org/2008/how-a-beautiful-software-system-becomes-frankenstein/#comments</comments>
		<pubDate>Wed, 27 Feb 2008 04:26:05 +0000</pubDate>
		<dc:creator>Andriy Solovey</dc:creator>
				<category><![CDATA[Concepts]]></category>
		<category><![CDATA[People]]></category>
		<category><![CDATA[Process]]></category>
		<category><![CDATA[System]]></category>

		<guid isPermaLink="false">http://softwarecreation.org/2008/how-a-beautiful-software-system-becomes-frankenstein/</guid>
		<description><![CDATA[Share
&#8220;Ruin in community is not caused by witches with broomstick but it&#8217;s something that starts in people&#8217;s heads.&#8221; &#8211; Prof. Preobrazhensky (Michail Bulgakov&#8217;s &#8220;The heart of a dog&#8221;)
The newborn software system looks beautiful inside after the few weeks of development. Several talented programmers put their souls together into this amazing software idea. But week after [...]]]></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/how-a-beautiful-software-system-becomes-frankenstein/&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/how-a-beautiful-software-system-becomes-frankenstein/' 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/how-a-beautiful-software-system-becomes-frankenstein/'></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/how-a-beautiful-software-system-becomes-frankenstein/'></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/how-a-beautiful-software-system-becomes-frankenstein/&amp;title=How+a+beautiful+software+system+becomes+Frankenstein&amp;t=2' height='18' width='120' frameborder='0' scrolling='no'></iframe></div></div></div><div style='clear:both'></div><h1></h1>
<p><cite>&#8220;Ruin in community is not caused by witches with broomstick but it&#8217;s something that starts in people&#8217;s heads.&#8221;</cite> &#8211; Prof. Preobrazhensky (Michail Bulgakov&#8217;s &#8220;The heart of a dog&#8221;)</p>
<p>The newborn software system looks beautiful inside after the few weeks of development. Several talented programmers put their souls together into this amazing software idea. But week after week the system become older and uglier. It could still look exciting for users, but the system rots inside. It is much more difficult to modify, it breaks often, development time and cost soars. Programmers become scared to work with it. The system becomes Frankenstein. Why could it happen?</p>
<p><img src="http://softwarecreation.org/images/2008/frankenstein.jpg" width="600" height="400" /></p>
<h3>Three reasons</h3>
<p>There are hundred objective reasons why it could happen &#8211; complex technology, changing customer needs, management pressure, time to market and many more. But some teams still deliver a good system under these conditions. And some teams cannot deliver even in the most favorable conditions. Why?</p>
<p>Degradation of the system starts in the people heads and there are three main reasons:</p>
<ol>
<li>Incomprehension &#8211; developers don&#8217;t understand the purpose, ideas, design or technology behind the system</li>
<li>Inarticulateness &#8211; developers unable to express ideas through clear and effective architecture, design and code</li>
<li>Inconsistency &#8211; developers cannot act consistently or don&#8217;t care about the system</li>
</ol>
<p><span id="more-58"></span><br />
<strong>Incomprehension &#8211; don&#8217;t understand</strong></p>
<p><cite>&#8220;I am so clever that sometimes I don&#8217;t understand a single word of what I am saying.&#8221;</cite> &#8211; Oscar Wilde<br />
Every person has limits for understanding:</p>
<ul>
<li>We have limited memory and perception, which are <a href="http://softwarecreation.org/2007/software-requirements-are-elusive-6-reasons-why-customers-cannot-get-them-right/" title="far from perfection" id="v6--">far from perfection</a> and distort reality.</li>
<li>Team members as any individuals have different background, mindset and expertise. It is not a surprise that they could easily misunderstand each other.</li>
<li>It is even more difficult to understand outsiders as clients coming from completely another world.</li>
<li>Separated teams, make situation more complicated. <a href="http://en.wikipedia.org/wiki/Conway%27s_Law" target="_blank" title="External link to http://en.wikipedia.org/wiki/Conway's_Law" class="externalLink">Conway&#8217;s Law</a> says
<ul>
<li> Organizations which design systems are constrained to produce designs which are copies of the communication structures of these organizations.</li>
<li>Corollary: If you have four groups working on a compiler, you&#8217;ll get a 4-pass compiler. It is easier to implement this way than to understand what other groups are doing.</li>
</ul>
</li>
</ul>
<p>It is hard job to reach good understanding. But if you and your team don&#8217;t understand the purpose, ideas, design and technology behind the system &#8211; you cannot effectively build the system.</p>
<p><strong>Inarticulateness &#8211; cannot express</strong></p>
<p><cite>&#8220;I didn&#8217;t have time to write a short letter, so I wrote a long one instead.&#8221;</cite> &#8211; Mark Twain<br />
Understanding is not enough. The crucial step is to actually write a program. And programming requires special style of thinking: logical, abstract and creative in the same time. Ability to clearly and effectively express oneself is a precious skill for any speaker and writer. Programming requires a similar talent multiplied on complexity of technological means for expression &#8211; software platforms, languages and tools. Every programmer is unique &#8211; our innate and learned skills determine our potential, our experience shapes our capabilities, and our <a href="http://softwarecreation.org/2008/how-tools-frame-programmers-mindset/" title="tools frame our mind" id="pvqu">tools frame our mind</a>. After all, every mortal programmer has limits for the problem he could solve. Many programmers could write programs only for straightforward, defined and standard problems (and some have unique skills to create chaos even with simple programs). Few programmers could tackle complex, wicked and open-ended problems in the elegant, clear and effective way.</p>
<p>The system is doomed if you or your team cannot express ideas through clear and effective code, design and architecture.</p>
<p><strong>Inconsistency &#8211; cannot act consistently or don&#8217;t care<br />
</strong></p>
<p><cite>&#8220;Of course, if people could just act consistently, they could keep their desks clean, avoid cavities, lose weight, give up smoking, play a musical instrument, and possibly even produce software on a regular and timely basis.&#8221;</cite> &#8211; Alistair Cockburn<br />
Having full understanding and expertise to create the software system is still not enough. People are not completely rational beings and there are many difficult to explain factors that affect productivity, quality of work and the level of responsibility:</p>
<ul>
<li>how <a href="http://softwarecreation.org/2007/how-to-be-happy-at-work-short-tutorial/" title="happy" id="hec8">happy</a>, motivated and satisfied they are &#8211; unmotivated, uncaring or stressed programmers will usually produce bad software.</li>
<li><a href="http://softwarecreation.org/2007/lost-personalities-how-our-company-alters-us/" title="peer pressure" id="vcre">peer pressure</a>, conformity and groupthink could substantially <a href="http://softwarecreation.org/2007/lost-personalities-how-our-company-alters-us/" title="alter our behavior and thinking" id="efn3">alter our behavior and thinking</a>. The group could detach from reality and start believing in wrong ideas.</li>
<li>environment, structure of work and <a href="http://softwarecreation.org/2008/the-programmers-mind-gut-instinct-focus-and-procrastination/" title="ability to focus" id="i7ks">ability to focus</a> are important. Distractions, inconvenient environment and confusing tasks will have negative influence.</li>
<li>team dynamics, <a href="http://softwarecreation.org/2007/what-is-the-best-leader-for-the-software-team/" title="leadership style" id="h1u3">leadership style</a> and established processes affect team efficiency</li>
</ul>
<p>We cannot simply tell people: &#8220;please, care and be responsible&#8221; and they will immediately become responsible, concerned and motivated to keep the system in the good shape. It is very difficult and often against our nature. People should make effort and need right conditions to behave rationally, consistently and meet expectations (which are imposed by other imperfect people :)).</p>
<h3>Further complications</h3>
<p><img src="http://softwarecreation.org/images/2007/tower-of-babel.jpg" /></p>
<p><strong>Technology Tower of Babel</strong><br />
<cite>&#8220;Go to, let us go down, and there confound their language, that they may not understand one another&#8217;s speech.&#8221;</cite> &#8211; Genesis 11:6-7</p>
<p>Complex technology, levels of abstractions and various components of the system require different perspectives, layers and approaches even for simple applications. Nonetheless, all these different representations create seams between subsystems and components. Mess and rot are often starting to appear around these places without proper care and mastery.</p>
<p>Consider, for example, representation levels and languages in the traditional web application:</p>
<ul>
<li>HTML &#8211; markup language for layout of web pages</li>
<li>CSS &#8211; stylesheet rule-based language for describing presentation of web pages</li>
<li>JavaScript &#8211; dynamically-typed language for web page functionality on browser</li>
<li>ASP.NET / JSP / PHP &#8211; server-side declarative languages for web pages generation on the web server</li>
<li>C#, Java &#8211; object-oriented languages for domain and middle-tier logic</li>
<li>SQL &#8211; declarative query and data manipulation language</li>
</ul>
<p>Few web developers master all these levels, because of  time, experience and volume of knowledge involved. Web and graphic design, information architecture, usability, database programming, networking, server and infrastructure administration add additional perspectives to the system. This mixture significantly contribute to the complexity and effort to understand , evolve and maintain the system.</p>
<p><strong>Increase in complexity and entropy</strong><br />
<cite>&#8220;The law that entropy always increases &#8211; the second law of thermodynamics &#8211; holds I think, the supreme position among the laws of Nature.&#8221;</cite> &#8211; Sir Arthur Stanley Eddington</p>
<p>Entropy affects all the complex systems in the Universe. Amount of disorder in these systems tends toward maximum. Any system degrades and collapses unless external or internal forces keep integrity of structure and adapt it to changing conditions.<br />
The development team is this external force that evolves and maintains the software system. It is tough job, considering limited human ability for mental control over vast and complex information. In addition, more complex systems are less predictable and more difficult to change. There is essential complexity related to complexity of the problem and wasteful caused by inability to deeply understand the problem, find optimal solution or over-engineering. The effective development team should control essential complexity and avoid wasteful.</p>
<h3>How to save the software system?</h3>
<p>Any complex problem has the perfect software solution that meets two criteria:</p>
<ul>
<li>customer is completely satisfied, the system is simple and user friendly</li>
<li>programmers can easily understand, support and modify the system for the future changes</li>
</ul>
<p>Unfortunately, we don&#8217;t have now any formal methods how to reach such solution. Software development is <a href="http://softwarecreation.org/2007/is-software-development-empirical-or-rational/" title="empirical" id="m_rp">empirical</a> process and the best we can do is to assemble good team, equip and prepare ourselves for the journey. However, if the team rigorously tries to meet these two criteria from the first day of development &#8211; the chances are high that the system will be good at the finish. If the team temporarily abandon these  criteria in hope to achieve them on later stages &#8211; the chances are high that the system will have serious problems at the finish.</p>
<h4>Before start</h4>
<p><img src="http://softwarecreation.org/images/2008/right-people.jpg" /></p>
<ol>
<li><strong>Find right and diverse people</strong> &#8211; they are the most important factor of success. Experience and skills should match the problem, but there is more. Team should be diverse and members should supplement each other:
<ul>
<li>diverse people will better handle different system representations and knowledge: system architecture, domain expertise, web design, object oriented and database programming.</li>
<li>less risk for <a href="http://softwarecreation.org/2007/lost-personalities-how-our-company-alters-us/" title="conformity, groupthink and distortion of reality" id="ups8">conformity, groupthink and distortion of reality</a> by the whole group.</li>
<li>they could select from wider range of strategies for achieving results and be effective in execution of all tasks, from routine to creative.</li>
<li>finally, ideas, brainstorming and solutions will be more balanced, broad and have higher quality</li>
</ul>
</li>
<li><strong>Match people, problems and compensation</strong> &#8211; people will be happy, motivated and dedicated if they have interesting work &#8211; <a href="http://softwarecreation.org/2007/how-to-be-happy-at-work-short-tutorial/" title="not overwhelmingly complex and not too simple" id="mh7y">not overwhelmingly complex and not too simple</a>. It will boost growth, motivation and productivity. Compensation is another important factor &#8211; it should be <a href="http://softwarecreation.org/2007/fair-compensation-for-programmers-is-it-possible/" title="fair and linked to the end results of the whole project" id="g:n8">fair and linked to the end results of the whole project</a>.</li>
<li><strong>Give control to the team, define clear goals and set criteria of success</strong> &#8211; software team members are the best people to make project related decisions. They will make right decision if they understand project vision and what is important for success. The empowered team will <a href="http://softwarecreation.org/2007/what-is-the-best-leader-for-the-software-team/" title="take full responsibility, self-organize and really care" id="uytb">take full responsibility, self-organize and really care</a>.</li>
</ol>
<h4>After start</h4>
<p><img src="http://softwarecreation.org/images/2008/lotr-journey.jpg" /></p>
<ol>
<li> <strong>Establish excellent information flow</strong> &#8211; it is the basis of the development team understanding, judgment and decisions. A team will be the most effective in processing project related information if the team is
<ul>
<li>diverse &#8211;  people will understand information differently and reconciliation of this knowledge will create much better understanding for the whole team</li>
<li>small &#8211; people will avoid communication overhead and high number of interactions</li>
<li>self-organized &#8211; people will know what is important and ask what is needed. They will strive for the better information instead of relying on external help and guidance.</li>
<li>facing customers directly, understand their ideas and feel their pain. It helps to avoid incorrect information caused by misinterpretation and distortion of information through people chains.</li>
<li>understanding and solving problems in the same time with all necessary information available</li>
</ul>
</li>
<li> <strong>Fight complexity</strong>, which is the main reason for the project degradation. Too complex solutions cause poor understanding, fear of change and inefficiency in the development. The software code is the key indicator for the amount of entropy and health of the system. The best systems have easy to understand, clear and well-structured code even for the complex problems. Code is good when
<ul>
<li>it is minimal, readable and relevant
<ul>
<li>no duplication and dead code</li>
<li>no over-engineering</li>
<li>developers understand each other ideas behind the code</li>
</ul>
</li>
<li>achieve optimal representation with
<ul>
<li>constant refactoring to improve design and understanding</li>
<li>balance between <a href="http://www.laputan.org/lifecycle/lifecycle.html" title="expansion and consolidation" id="v_jb">expansion and consolidation</a> phases, which allow rapid evolution of the system while keeping structural integrity</li>
<li>frequent synchronization with design ideas: architecture, design and code evolve and reconcile against reality together. It is two way &#8211; architecture and design provide meaning, direction and high level explanation, while code is ultimate and true description of the system behavior. Good code will enable, enhance and provide feedback for the future architecture and design ideas. Bad code will kill even genius ideas.</li>
</ul>
</li>
<li>support abstractions and decoupling between subsystems and layers
<ul>
<li>big picture is easy to keep in mind</li>
<li>clear boundaries, isolated behavior and minimal dependencies reduce complexity of each subsystem. Poor implementation in some places will have minimal impact on other components.</li>
<li>solution overall complexity grows while allowing human brains relatively easy understanding of the individual pieces.</li>
</ul>
</li>
</ul>
</li>
<li> <strong>Adopt and learn</strong> &#8211; every project has unique requirements, people and context. It is almost impossible to make right decisions from the beginning. Therefore, the process should have built-in adaptation and correction mechanism as one of the most important components.:
<ul>
<li>Different opinions and alternatives provide more chances for selecting the best strategy</li>
<li>Short problem solving cycles (a.k.a iterations) allow fast sync with reality, reconcile mistakes and boost learning</li>
<li>People are encouraged to learn, listen to others and change</li>
</ul>
</li>
</ol>
<p><a href="http://softwarecreation.org/images/2008/why-frankenstein.png"><img src="http://softwarecreation.org/images/2008/why-frankenstein.png" /></a></p>
<p>It is a titanic work to keep the system away from Frankenstanization, disorganization and degradation. But it is possible if we realize &#8211; our success depends on struggle with complexity and&#8230; ourselves, human programmers.</p>
<p>[UPDATE: As few readers correctly pointed out, the post compares software systems to Frankenstein's monster. The confusion with Frankenstein is a <a href="http://en.wikipedia.org/wiki/Frankenstein%27s_monster">common mistake</a>. Anyway, we are still a bit far from creation of creators of the monsters as Dr. Frankenstein :). ]</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=58&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://softwarecreation.org/2008/how-a-beautiful-software-system-becomes-frankenstein/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Can Computers Beat Human Programmers? Part 4. Building useful programs</title>
		<link>http://softwarecreation.org/2007/can-computers-beat-human-programmers-part-4-building-useful-programs/</link>
		<comments>http://softwarecreation.org/2007/can-computers-beat-human-programmers-part-4-building-useful-programs/#comments</comments>
		<pubDate>Mon, 05 Nov 2007 03:55:23 +0000</pubDate>
		<dc:creator>Andriy Solovey</dc:creator>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[Concepts]]></category>
		<category><![CDATA[People]]></category>
		<category><![CDATA[Skills]]></category>
		<category><![CDATA[System]]></category>

		<guid isPermaLink="false">http://softwarecreation.org/2007/can-computers-beat-human-programmers-part-4-building-useful-programs/</guid>
		<description><![CDATA[SharePart 1. Gaining processing power
Part 2. Becoming intelligent
Part 3. Interacting with humans
 Part 4. Building useful programs
 Part 5. Future of human programmers
Is it easy to build useful programs for humans? Failure rates and dissatisfaction with the software projects (more than 50% still fails or challenged) show that it is not quite easy task. Can [...]]]></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/2007/can-computers-beat-human-programmers-part-4-building-useful-programs/&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/2007/can-computers-beat-human-programmers-part-4-building-useful-programs/' 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/2007/can-computers-beat-human-programmers-part-4-building-useful-programs/'></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/2007/can-computers-beat-human-programmers-part-4-building-useful-programs/'></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/2007/can-computers-beat-human-programmers-part-4-building-useful-programs/&amp;title=+Can+Computers+Beat+Human+Programmers%3F+Part+4.+Building+useful+programs&amp;t=2' height='18' width='120' frameborder='0' scrolling='no'></iframe></div></div></div><div style='clear:both'></div><p><a href="http://softwarecreation.org/2007/can-computers-beat-human-programmers-part1-gaining-processing-power/" title="Part 1. Gaining processing power" id="squr">Part 1. Gaining processing power</a><br />
<a href="http://softwarecreation.org/2007/can-computers-beat-human-programmers-part-2-becoming-intelligent/" title="Part 2. Becoming intelligent" id="prn5">Part 2. Becoming intelligent</a><br />
<a href="http://softwarecreation.org/2007/can-computers-beat-human-programmers-part-3-interacting-with-humans/" title="Part 3. Interacting with humans" id="n455">Part 3. Interacting with humans</a><br />
<span style="font-weight: bold"> Part 4. Building useful programs</span><br />
<a href="http://softwarecreation.org/2007/can-computers-beat-human-programmers-future-of-human-programmers/"> Part 5. Future of human programmers</a></p>
<p>Is it easy to build useful programs for humans? <a href="http://www.it-cortex.com/Stat_Failure_Rate.htm" title="Failure rates" id="qtnj">Failure rates</a> and <a href="http://www.sdtimes.com/article/story-20070301-01.html" title="dissatisfaction" id="wdc-">dissatisfaction</a> with the software projects (more than 50% still fails or challenged) show that it is not quite easy task. Can AI help to build more successful projects, compete and eventually replace human programmers?</p>
<h3>From ideas to specifications</h3>
<p><img src="http://softwarecreation.org/images/2007/zhukov.jpg" /></p>
<p>Human programmers face objective challenges in building software systems, which AI will face in the future:</p>
<ol>
<li>It is difficult to <a href="http://softwarecreation.org/2007/how-to-communicate-effectively-and-still-get-things-done/" title="understand" id="cwd:">understand</a> what people need.</li>
<li>Customer&#8217;s ideas are shifting, once they start using the real system and experience all the consequences and effects for interacting with it in the context of their problems.</li>
<li>Customer&#8217;s needs are changing constantly reflecting outside business and company trends, situation and problems.</li>
</ol>
<p><span id="more-46"></span>There are 4 stages to build a software system:</p>
<ol>
<li>Understand unclear human needs and overcome communication barriers</li>
<li>Translate these needs into specification or the system model</li>
<li>Implement these specifications within constraints and required system qualities</li>
<li>Verify that the system meets expectations.</li>
</ol>
<p>Two first stages need strong AI with human like <a href="http://softwarecreation.org/2007/can-computers-beat-human-programmers-part-2-becoming-intelligent/" title="intelligence and comprehension" id="xv_t">intelligence and comprehension</a>, two last stages could be achieved with weaker AI. The key is <strong>translation of human needs into specifications that machine could understand</strong>. Stronger AI will need less defined specification and could handle ambiguous messages and human language, weaker AI will need more details, which at the extreme means writing a program as almost we do now.</p>
<p>As a part of the system specifications we should provide to AI expected input, output and required system qualities (performance, reliability, security, etc.). Even today some trends and approaches reduce gap in translation customer needs to computer specifications:</p>
<ul>
<li><a href="http://martinfowler.com/bliki/DomainSpecificLanguage.html" title="Domain Specific Languages" id="nc1k">Domain Specific Languages</a> &#8211; expressing programming logic in language, better suited for specific domains and problems; domain experts can use this language and define the logic. <a href="http://www.intentsoft.com/" title="Intentional Software" id="k9ge">Intentional Software</a> could offer even <a href="http://www.technologyreview.com/Infotech/18047/page13/" title="more interesting approach" id="ogxv">more interesting approach</a> in the near future.</li>
<li>Automated Acceptance and Unit Tests &#8211; <a href="http://martinfowler.com/bliki/Xunit.html" title="xUnit" id="e_4s">xUnit</a>, <a href="http://fit.c2.com/" title="Fit" id="ohoi">Fit</a> and similar frameworks allow to write specifications as tests in declarative or programmatic style.</li>
<li><a href="http://www.testdriven.com/" title="Test Driven Development" id="jfu0">Test Driven Development</a>, <a href="http://behaviour-driven.org/" title="Behaviour Driven Development" id="r0x8">Behaviour Driven Development</a> and <a href="http://domaindrivendesign.org/" title="Domain Driven Design" id="j6d0">Domain Driven Design</a> provide approaches for evolving and programming a software system primarily from customer perspective as oppose to traditional views for building the system with distinct technological perspective, often disconnected from customer needs.</li>
</ul>
<p>These approaches put more stress and effort to specify WHAT is expected from the system and less stress on HOW these result could be achieved. It is similar to <a href="http://en.wikipedia.org/wiki/Declarative_programming" title="declarative paradigm of programming" id="xqh4">declarative paradigm of programming</a> (HTML, SQL), where a programmer specify what he expects and the underlying system comes up with optimal algorithms to satisfy this request.</p>
<p>Going forward application programmers and domain experts will focus on describing needs and specifications for the system and AI will increase contribution to implementation of these requests. As AI becomes stronger it will need less and less formalized description and could start comprehend human language directly.</p>
<h3>Implementation and Delivery</h3>
<p><img src="http://softwarecreation.org/images/2007/munchausen.jpg" /><br />
<span class="photocredit">Baron Munchhausen escaping from a swamp by pulling himself up by his own hair</span></p>
<p>AI could deliver a system in several ways depending on our level of trust:</p>
<ol>
<li><strong>Transparent System</strong> &#8211; computer generates code and human software professionals review, modify, integrate and accept it. It is similar to vendor model to speed up the main development.</li>
<li><strong>Black Box</strong> &#8211; human provide specification, integrate and test the system without much understanding what AI has built inside.</li>
<li><strong>Key-turn System</strong> &#8211; we trust computer to specify, build and integrate the system without human involvement and verification.</li>
</ol>
<p>The first option seems safer and easier, but it requires a computer to <strong>generate software code in a human-readable format</strong>, which adds complexity and double translation: customer -&gt; computer -&gt; programmer. The Black Box and Key-turn System options doesn&#8217;t require this complex translation and could be easier to implement.</p>
<p>Based on today approaches AI could build system in <a href="http://softwarecreation.org/2007/can-computers-beat-human-programmers-part-2-becoming-intelligent/" title="few ways" id="c_-0">few ways</a>:</p>
<ul>
<li><span style="font-weight: bold">Brute force</span>: <a href="http://en.wikipedia.org/wiki/Genetic_algorithm" title="genetic algorithms" id="hdq8">genetic algorithms</a> or <a href="http://en.wikipedia.org/wiki/Swarm_intelligence" title="swarm intelligence" id="nqte">swarm intelligence</a>, where computer try to find the fittest solution evolving behavior of the system based on selections, mutations, recombinations or emergent behavior of individual agents, competing and cooperating with each other.</li>
<li><span style="font-weight: bold">Trained neural networks</span>: interconnected <a href="http://en.wikipedia.org/wiki/Artificial_neural_network" title="groups of artificial neurons" id="au-c">groups of artificial neurons</a>, imitating how our brains are working.</li>
<li><span style="font-weight: bold">Symbol processor</span>: similar to the way how a human operates with knowledge based on <a href="http://plato.stanford.edu/entries/computational-mind/" title="classic theory of mind" id="g:yc">classic theory of mind</a>: semantic, logic, reasoning, abstractions, etc.</li>
</ul>
<p>We have been already successfully using AI software solutions in many areas, e.g. manufacturing, finances, medicine, science, air traffic control. Computers even <a href="http://uanews.org/node/16426" title="analyze" id="tbcu">analyze</a> volatile political and military situations and predict unpredictable. It is matter of time when these approaches will be applied to software development and computers will be able to program themselves.</p>
<h3>Silver Bullet?</h3>
<p><img src="http://softwarecreation.org/images/2007/silver-bullet.jpg" /><br />
<a href="http://flickr.com/photos/steffe/303544263/" class="photocredit">Steffe</a><br />
AI indeed could solve problems that  Frederick Brooks indicated as essential complexity in software development (<a href="http://info.computer.org/portal/site/computer/menuitem.eb7d70008ce52e4b0ef1bd108bcd45f3/index.jsp?&amp;pName=computer_level1&amp;path=computer/homepage/misc/Brooks&amp;file=index.xml&amp;xsl=article.xsl&amp;;jsessionid=HnyGxkPQ2GsKlblRl6VDJ2h28QQLpfhKqKW9RNDttHsdT8NFTLhb%211017941068" title="No Silver Bullet">No Silver Bullet</a>):</p>
<ul>
<li>     <strong>Complexity</strong> &#8211; computers could handle much more information then our individual brains, carry knowledge about all possible states of the system and effectively manipulate it.</li>
<li>     <strong>Conformity </strong>- computers could seamlessly conform to interfaces of the other system and support rules of interactions with brothers computers.</li>
<li>     <strong>Changeability </strong>- computers will have full intellectual control over the system code and can quickly understand what should be modified and effectively support change requests.</li>
<li>     <strong>Invisibility </strong>- our brains are specialized on particular processing of information influenced by our biological origin. Computer don&#8217;t have this problem and could naturally manipulate information without need to visualize and limit scope for better comprehension.</li>
</ul>
<p>Can we assume now that a computer-programmer could be superior to a human-programmer and become a silver bullet?</p>
<h3>Competing with human programmers</h3>
<p><img src="http://softwarecreation.org/images/2007/klichko-lewis.jpg" /></p>
<p>AI definitely will have some advantage over humans. The computer-programmer will show higher productivity, consistency, reliability and will not be affected by mood swings, personal problems or lack of recognition (unless computer intelligence will make twist in their evolution). However there are several human characteristics that will be difficult to beat.</p>
<p><strong>Creativity and Innovation</strong><br />
<cite>Creativity is a mental process involving the generation of new ideas or concepts, or new associations between existing ideas or concepts. &#8211; </cite><a href="http://en.wikipedia.org/wiki/Creativity" title="Wikipedia" id="jxng">Wikipedia</a><br />
<a href="http://en.wikipedia.org/wiki/G%C3%B6del%27s_incompleteness_theorem" title="Gödel incompleteness theorem" id="jdbs">Gödel incompleteness theorem</a>  shows that a computer should go beyond rules and algorithms embedded by humans to become creative and innovative. It is still not clear if computer could go over initial set of rules, generate new ideas, extend and connect existing.</p>
<p><strong>Adaptability and Learning</strong><br />
Humans have unique ability to adapt to changing environment and quickly learn new things. It doesn&#8217;t take much time to adjust thinking, learn new rules and concepts and start programming effectively. Human programmers can successfully shift to the new domains, still keeping their mastery, apply previous experience enhanced by new knowledge. Could computers become so flexible in emerging new domains, shift in knowledge, perspectives and needs?</p>
<p><strong>Aesthetics and Usability</strong><br />
Human designers can naturally grasp and implement subtle aesthetic and usability needs enhancing user experience for dealing with the systems. This knowledge is ingrained in our psychology and it will be difficult to formalize it enough for computer to allow building easy-to-use and pleasant programs.</p>
<p><strong>Problem solving and Diversity</strong><br />
Human rational mind combined with experience and intuition effectively deals with <a href="http://www.poppendieck.com/wicked.htm" title="wicked problems" id="et-x">wicked problems</a>, which involve uncertainty, trade-offs and multiple options. Our brain machine is specialized on solving this kind of problems and it will be challenge for computer to match these capabilities. AI could use brute force at some extent as with chess, but it has limits when number of variables and things to consider increases rapidly.<br />
Diverse talents, broad range of views and different opinions often lead to surprisingly effective solutions, sometimes impossible to predict beforehand.</p>
<p><strong>Generalization and Theorizing</strong><br />
Human ability to generalize, create abstractions and theories based on experience, experiments, many observations and individual cases are very valuable in the software development.<br />
We can substantially reduce complexity of the system logic and even anticipate future needs by creating abstract models and solutions, which could be applied for wide range of different situations and encapsulate theories behind our knowledge and understanding of the problem domain.</p>
<p><strong>Understanding and Shared Experience</strong><br />
Humans will understand other humans much better than computer unless computers tap into our minds and start reading our thoughts. However, it could be scary and still not clear if AI could filter productive thought from the non sense our brains produce.<br />
Human build together shared experience &#8211; less and less information is required to understand each other and people become more effective as a team &#8211; at the end, ideas and their flow is the <a href="http://softwarecreation.org/2007/software-development-is-the-flow-of-ideas-the-rest-is-secondary/" id="zb4f" title="most important part">most important part</a> in software development.</p>
<p><strong>Seeing The Big Picture and Thirst for Knowledge and Achievements</strong><br />
Many programmers have diverse background, education and knowledge &#8211; far more than required to build programs. Many solutions require to go outside of the problem context and understand broader picture. Some solutions could emerge from different problem domains and unexpected areas of human knowledge.<br />
Human strength is irrational curiosity, thirst for knowledge and irresistible drive for achievements, which move our progress forward, open new areas of knowledge and make impossible possible. Can computers inherit this drive and motivation?</p>
<p>Can even super <a href="http://softwarecreation.org/2007/can-computers-beat-human-programmers-part-2-becoming-intelligent/" title="intelligent" id="bphb">intelligent</a> and <a href="http://softwarecreation.org/2007/can-computers-beat-human-programmers-part1-gaining-processing-power/" title="powerful" id="l1b-">powerful</a> computers replicate human strengths that make us so effective programmers? There are definitely some areas that human programmers will rule for a long time. Does it mean that we could relax? I doubt it &#8211; computers are taking over more and more human programmer responsibilities and soon they will affect our jobs and replace us in some programming areas. What should modern developer do to stay competitive with gaining strength and power computer AI? This is the topic of 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=46&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://softwarecreation.org/2007/can-computers-beat-human-programmers-part-4-building-useful-programs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Can Computers Beat Human Programmers? Part 2. Becoming intelligent</title>
		<link>http://softwarecreation.org/2007/can-computers-beat-human-programmers-part-2-becoming-intelligent/</link>
		<comments>http://softwarecreation.org/2007/can-computers-beat-human-programmers-part-2-becoming-intelligent/#comments</comments>
		<pubDate>Wed, 26 Sep 2007 04:24:43 +0000</pubDate>
		<dc:creator>Andriy Solovey</dc:creator>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[People]]></category>
		<category><![CDATA[System]]></category>

		<guid isPermaLink="false">http://softwarecreation.org/2007/can-computers-beat-human-programmers-part-2-becoming-intelligent/</guid>
		<description><![CDATA[ShareIntelligence is what you use when you don&#8217;t know what to do. &#8211; Jean Piaget
Part 1. Gaining processing power
 Part 2. Becoming intelligent
 Part 3. Interacting with humans
 Part 4. Building useful programs
 Part 5. Future of human programmers
Computers blindly follow our instructions. They are much faster than humans, but still computers are stupid things [...]]]></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/2007/can-computers-beat-human-programmers-part-2-becoming-intelligent/&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/2007/can-computers-beat-human-programmers-part-2-becoming-intelligent/' 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/2007/can-computers-beat-human-programmers-part-2-becoming-intelligent/'></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/2007/can-computers-beat-human-programmers-part-2-becoming-intelligent/'></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/2007/can-computers-beat-human-programmers-part-2-becoming-intelligent/&amp;title=+Can+Computers+Beat+Human+Programmers%3F+Part+2.+Becoming+intelligent&amp;t=2' height='18' width='120' frameborder='0' scrolling='no'></iframe></div></div></div><div style='clear:both'></div><p><cite>Intelligence is what you use when you don&#8217;t know what to do.</cite> &#8211; Jean Piaget</p>
<p><a href="http://softwarecreation.org/2007/can-computers-beat-human-programmers-part1-gaining-processing-power/" id="f:xm" title="Part 1. Gaining processing power">Part 1. Gaining processing power</a><br />
<strong> Part 2. Becoming intelligent</strong><br />
<a href="http://softwarecreation.org/2007/can-computers-beat-human-programmers-part-3-interacting-with-humans/"> Part 3. Interacting with humans</a><br />
<a href="http://softwarecreation.org/2007/can-computers-beat-human-programmers-part-4-building-useful-programs/"> Part 4. Building useful programs</a><br />
<a href="http://softwarecreation.org/2007/can-computers-beat-human-programmers-future-of-human-programmers/"> Part 5. Future of human programmers</a></p>
<p>Computers blindly follow our instructions. They are much faster than humans, but still computers are stupid things dependent on our algorithms and knowledge how to solve problems.<br />
Even <a href="http://softwarecreation.org/2007/can-computers-beat-human-programmers-part1-gaining-processing-power/" id="dr96" title="huge processing power">huge processing power</a> is not enough to start programming. Non-trivial solutions require understanding of ideas, problem solving, learning from experience and much more &#8211; everything what we can define as intelligence. Can computers become smarter than human programmers?</p>
<h3>   What intelligence is required for building programs?</h3>
<p><img src="http://softwarecreation.org/images/2007/program-intelligence.jpg" /></p>
<p><span id="more-36"></span></p>
<h3>   What is human intelligence?</h3>
<p>We have pre-wired capabilities: large and effective brains, genetic development of specialized functional areas (vision, speech, reasoning, etc.). However, we gain our intelligence mostly through learning and experience.<br />
<a href="http://en.wikipedia.org/wiki/Jean_Piaget" id="p7lo" title="Jean Piaget">Jean Piaget</a> defined four stages for human intellectual development:<br />
1. Sensorimotor stage: from birth to age 2 years (children experience the world through movement and senses and learn object permanence)<br />
2. Preoperational stage: from ages 2 to 7 (acquisition of motor skills)<br />
3. Concrete operational stage: from ages 7 to 11 (children begin to think logically about concrete events)<br />
4. Formal operational stage: after age 11 (development of abstract reasoning).</p>
<p>Nobody directly puts intellect in our heads. We construct our own intellect through complex interactions with the world and other people all our life long.</p>
<p>Highlights:</p>
<ul>
<li>     Memory is the basis for all intellectual activities. Memory mostly encodes     the relationships between things than the details of the things     themselves.  It maybe exists only to make good predictions about future</li>
<li>     We are not only using senses and react on external stimulus (keeping car on     the road), but constantly constructing an internal model of the outside     world and predicting how things behave (our and other cars dynamic).</li>
<li>     Our emotions are important as they are brain states that quickly assign     value to outcomes and provide a simple plan of action. Therefore, emotion     can be viewed as a type of computation, a rapid, automatic summary that     initiates appropriate actions.</li>
<li>     Other species are hardwired to solve particular problems, while our ability     to abstract allows us to solve an open-ended series of problems.</li>
</ul>
<ul>
<li>     Interaction between senses and memory allows us to construct     a <a href="http://en.wikipedia.org/wiki/Qualia" id="uv3z" title="qualia">qualia</a>     (properties of sensory experiences). We could create a scene in our mind and     make connections with past scenes.</li>
<li>     With ability to narrate and long-term memory we connect conceptual systems     and develop     <a href="http://en.wikipedia.org/wiki/Semantic" id="medu" title="semantics">semantics</a>     (meaning) and true language. Now we can become conscious of being conscious.</li>
</ul>
<h3>   Building intelligent computers.</h3>
<p>Computers could become intelligent in several distinct ways:</p>
<ol>
<li>Simulation &#8211; <a href="http://lifeboat.com/ex/law.of.accelerating.returns" id="mkgt" title="scan and copy">scan and copy</a> brain structure and emulate with computer how brain functions.</li>
<li><a href="http://www-rohan.sdsu.edu/faculty/vinge/misc/singularity.html" id="bbl_" title="Singularity">Singularity</a> &#8211; in a system complex enough, consciousness and intelligence could simply pop into existence without our participation. Star systems emerged from simple particles, biological life emerged from simple chemical elements, and new intelligence could emerge from huge number of computers and their networks.</li>
<li>Symbiosis &#8211; extension of human capabilities with machine intellect (<a href="http://www.transhumanism.org/resources/faq.html" id="mj0o" title="transhuman and posthuman">transhuman and posthuman</a>) using nano-, bio- and information technology advances.</li>
<li><a href="http://en.wikipedia.org/wiki/Artifical_Intelligence" id="s-8j" title="Artificial Intelligence">Artificial Intelligence</a> built by humans.</li>
</ol>
<p>AI is the most realistic way. History of AI had <a href="http://en.wikipedia.org/wiki/AI_Winter" id="rq6q" title="few winters">few winters</a>, one of each still continues. Despite failed grand expectations, AI brought many practical results and applications:</p>
<ul>
<li>     <a href="http://economist.com/business/displaystory.cfm?story_id=9795140&amp;CFID=20125975&amp;CFTOKEN=96234049" title="Postal Services" id="na5c">Postal Services</a> use AI to help deliver the     millions of packages that pass through its transportation network every day     in the most efficient way possible.</li>
<li>     Telecoms operators use AI to establish the quickest connections for phone     calls through their networks or to retrieve web pages speedily from the     Internet.</li>
<li>     Manufacturers and retailers use AI for optimization of their supply chains.</li>
<li>Financial organization use AI to organize operations, invest in stocks, prevent fraud, and     manage properties. Algorithms carry     <a href="http://softwarecreation.org/2007/computers-vs-humans-thoughts-remember-or-forget/" id="tx--" title="70 % of foreign currency trades">70     % of foreign currency trades</a>.</li>
<li>     A medical clinic can use AI systems to organize bed schedules, make a staff     rotation, and provide medical information.</li>
<li>     Neural networks are used in homeland security, speech     and text recognition, medical diagnosis, data mining, and e-mail spam     filtering.</li>
<li><a href="http://en.wikipedia.org/wiki/Robot" title="Robots" id="obyq">Robots</a> have become common in many industries. They are often given jobs that     are considered dangerous and exhausting to humans. General Motors uses     around 16,000 robots for tasks such as painting, welding, and assembly.</li>
</ul>
<p><span lang="EN-GB"><br />
</span></p>
<p>There are 2 main school of thoughts for building AI: <a href="http://plato.stanford.edu/entries/mental-representation/" id="h11h" title="Classical Theory of Mind">Classical Theory of Mind</a> and <a href="http://plato.stanford.edu/entries/connectionism/" id="nstn" title="Connectionism">Connectionism</a>.</p>
<ul>
<li>     The classicist believes that mind is a symbolic processor, where strings are     produced in sequence according to the instructions of a (symbolic) program.     The mind operates by performing purely formal operations on symbols.</li>
<li> The connectionist views mental processing as the dynamic, bottom up and graded evolution of activity in a neural net. It models mind as the emergent processes of interconnected networks of simple units, usually neural networks.</li>
</ul>
<p><strong> Conventional AI</strong> (based on classic theory)</p>
<ul>
<li><a href="http://en.wikipedia.org/wiki/Expert_systems" title="Expert systems" id="j-0t">Expert systems</a> (knowledge based): apply reasoning capabilities to reach a conclusion. Expert system contains some of the subject-specific knowledge, and contains the knowledge and analytical skills of one or more human experts.</li>
<li><a href="http://en.wikipedia.org/wiki/Case_based_reasoning" title="Case based reasoning" id="x8cm">Case based reasoning</a>: stores a set of problems and answers in an organized data structure called cases. A case based reasoning system upon being presented with a problem finds a case in its knowledge base that is most closely related to the new problem and presents its solutions as an output with suitable modifications. It is used in Recommendation and Decision Support Systems, Help Desk, medicine.</li>
<li><a href="http://en.wikipedia.org/wiki/Bayesian_networks" title="Bayesian networks" id="i1yn">Bayesian networks</a>: used for modelling knowledge in bioinformatics, medicine, engineering, document classification, image processing, data fusion, and decision support systems.</li>
<li><a href="http://en.wikipedia.org/wiki/Behavior_based_AI" title="Behavior based AI" id="bw8v">Behavior based AI</a>: a modular method of building AI systems by hand.</li>
</ul>
<p><strong> Computational AI</strong> (based on connectionism)</p>
<ul>
<li><a href="http://en.wikipedia.org/wiki/Artificial_neural_network" title="Neural networks" id="wcew">Neural networks</a>: trainable systems with very strong pattern recognition capabilities. Neural net contains simple units, each unit&#8217;s activation     depending on the connection strengths and activity of its neighbors,     according to the activation function.</li>
<li><a href="http://en.wikipedia.org/wiki/Fuzzy_control_system" title="Fuzzy systems" id="lc5h">Fuzzy systems</a>: techniques for reasoning under uncertainty, have been widely used in modern industrial and consumer product control systems; capable of working with concepts such as &#8216;hot&#8217;, &#8216;cold&#8217;, &#8216;warm&#8217; and &#8216;boiling&#8217;.</li>
<li><a href="http://en.wikipedia.org/wiki/Evolutionary_computation" title="Evolutionary computation" id="bc_y">Evolutionary computation</a>: applies biologically inspired concepts such as populations, mutation and survival of the fittest to generate increasingly better solutions to the problem. These methods include evolutionary algorithms (e.g., genetic algorithms) and swarm intelligence (e.g., ant algorithms).</li>
</ul>
<p><strong>Learning</strong><br />
Computers can quickly replicate and copy their intelligence as oppose to human individual learning. However, unique intelligence of each human is a strength as it adds diversity, different strategies and wide range of solutions if applied properly (<a href="http://softwarecreation.org/2007/review-the-wisdom-of-crowds-making-the-best-decisions/" id="v26t" title="Wisdom of Crowds">Wisdom of Crowds</a>).</p>
<h3>   The Grand Challenge: Can a computer understand?</h3>
<p><img src="http://softwarecreation.org/images/2007/mturk.jpg" /></p>
<p><a href="http://plato.stanford.edu/entries/mental-representation/#Computation" id="fmv." title="The Computational Theory of Mind">The Computational Theory of Mind</a> claims that the brain is a kind of computer and that mental processes are computations. If it is true we can build AI, which can match human mind (<a href="http://en.wikipedia.org/wiki/Synthetic_intelligence" id="glel" title="strong AI">strong AI</a>), have intelligence and can <em>understand</em> meaning. Otherwise, we will struggle to build better and smarter algorithms (weak AI), which will never achieve true intelligence in the human sense.</p>
<p>There are three serious objections to possibility of building strong AI.</p>
<ul>
<li>     Gödel Incompleteness Theorem</li>
<li>     Searle&#8217;s Chinese Room Argument</li>
<li>     Wittgenstein&#8217;s Beetle and The Box</li>
</ul>
<p><strong>1. G</strong><strong>ö</strong><strong>del incompleteness theorem</strong><br />
<em>Any effectively generated theory capable of expressing elementary arithmetic cannot be both consistent and complete. </em>(For more explanation see <a href="http://en.wikipedia.org/wiki/G%C3%B6del%27s_incompleteness_theorem" id="b0ln" title="here">here</a> and <a href="http://www.miskatonic.org/godel.html" id="s7w3" title="here">here</a>.)<br />
Any mathematical or logical theory should have effective ways to validate proofs. However, each of them has some initial propositions (axioms), which assumed to be true and cannot be proved within the system. To prove them you can go outside the system and come up with new rules and axioms, but by doing so you&#8217;ll only create a larger system with its own unprovable statements. The implication is that <em>all</em> logical systems of any complexity are incomplete, i.e. have true statements without prove.<br />
Modern computer is a logical system. <strong>Therefore, computer cannot have true human intelligence as it will be always limited by fixed axioms and initial rules programmed by humans, while humans can discover new axioms and rules. </strong>In other words, a computer can play chess, regulate air traffic, trade stocks based on initial programmed rules, but it cannot define new rules which are not derived from initial set.<br />
Another interesting outcome is that we will never be able to understand ourselves, since our mind is closed system, which can only be sure of what it knows about itself by relying on what it knows about itself.</p>
<p><strong>2. </strong><strong>Chinese</strong><strong> room argument </strong><br />
In his argument Searle   <a href="http://members.aol.com/NeoNoetics/MindsBrainsPrograms.html" id="l3ul" title="argued">argued</a>   against a position that computer can have strong AI, think and understand.</p>
<p>Suppose a human is locked in the room. He takes Chinese symbols as input,   follows thick rule book on English and returns Chinese symbols as output. But   the person doesn&#8217;t understand even a word of Chinese! If you replace human in   Chinese room with a computer following these instructions, it can easily pass   the   <a href="http://en.wikipedia.org/wiki/Turing_test" title="Turing test">Turing   test</a> and convince a human Chinese speaker that the program is itself a   human Chinese speaker.<br />
But computer is the mindless operator of symbols with zero understanding of   language and meaning (as your dishwasher doesn&#8217;t understand what it is   washing). <strong>Therefore, we can simulate mind in computer, but we cannot create   computer mind that understands meaning. </strong>Computers are   missing <a href="http://en.wikipedia.org/wiki/Intentionality" id="rs:a" title="intentionality">intentionality</a>   (relationship between mental acts and the external world). A computer points   to other data while human intentionality points outside the brain (e.g. to   real flowers).</p>
<p>There are interesting   <a href="http://plato.stanford.edu/entries/chinese-room/" id="cpck" title="counter-arguments">counter-arguments</a>   like the System Reply, which debates that in Searle&#8217;s thought experiment a   human is a processor and don&#8217;t understand Chinese, but the whole system can   understand. However, the Chinese room argument still holds position against   strong AI from 1980.</p>
<p><strong>3. Wittgenstein</strong><strong>&#8217;s Beetle and The Box </strong>(<a href="http://en.wikipedia.org/wiki/Private_language_argument" id="s4.8" title="private language argument">Private Language Argument</a>)<br />
Wittgenstein shows that the idea of a language understandable by only a single individual is incoherent. Imagine, he says, that everyone has a small box in which they keep a beetle. However, no one is allowed to look in anyone else box, only in their own. Over time, people talk about what is in their boxes and the word “beetle” comes to stand for what is in everyone box.<br />
Wittgenstein is trying to point out that the beetle is an analogy to an individual mind. No one can know exactly what it is like to be another person or experience things from another perspective (look in someone else box), but it is generally assumed that the mental workings of other people’s mind are very similar to our own (everyone has a beetle which is more or less similar to everyone else).<br />
<strong>Therefore, computers should be part of our life, social interactions and cultural context to really understand us and construct similar meaning.</strong></p>
<h3>   Summary</h3>
<p><img src="http://softwarecreation.org/images/2007/deep-thought.jpg" /><br />
<a href="http://en.wikipedia.org/wiki/Minor_characters_from_The_Hitchhiker%27s_Guide_to_the_Galaxy#Deep_Thought" class="photocredit">Deep Thought</a></p>
<p>Human intellectual capabilities are amazing and unique and human programmer will be superior comparing to AI for a long time. However, our modern civilization cannot progress without computers &#8211; we continue building better computers and require more and more from them. It is inevitable that computers will become intelligent whether it happens with our help or not. There are serious objections to possibility of building human-like &#8220;strong AI&#8221;; however, &#8220;weak AI&#8221; even today stepped in the territory previously believed to be human only. A computer needs programs and it is matter of time before they learn to program themselves and who knows what happened after this. But if computers continue to serve humans, even intelligent computer should effectively interact and understand us to write useful programs. This is a topic for the <a href="http://softwarecreation.org/2007/can-computers-beat-human-programmers-part-3-interacting-with-humans/">next post</a>.</p>
<p><strong>Useful Resources:</strong><br />
<a href="http://plato.stanford.edu/contents.html" id="o__4" title="Standford Encyclopedia of Philosophy">Standford Encyclopedia of Philosophy</a><br />
<a href="http://economist.com/business/displaystory.cfm?story_id=9795140&amp;CFID=20125975&amp;CFTOKEN=96234049" id="m7gl" title="Business By Numbers">Business By Numbers</a>, The Economist<br />
<a href="http://www.teach12.com/ttcx/coursedesclong2.aspx?cid=660&amp;pc=Science%20and%20Mathematics" id="lhdr" title="Great Ideas of Psychology">Great Ideas of Psychology</a>, Teaching Company, Professor Daniel N. Robinson<br />
<a href="http://loebner.net/Prizef/TuringArticle.html" id="cc4q" title="Computing machinery and intelligence">Computing machinery and intelligence</a>, Turing, A.M. (1950).<br />
<a href="http://members.aol.com/NeoNoetics/MindsBrainsPrograms.html" id="zaa4" title="Mind, Brains, and Programs">Mind, Brains, and Programs</a>, by John R. Searle<br />
<a href="http://discovermagazine.com/2007/aug/unsolved-brain-mysteries/article_view" id="xx7i" title="10 Unsolved Mysteries Of The Brain">10 Unsolved Mysteries Of The Brain</a>, Discovery Magazine<br />
<a href="http://www.google.ca/bookmarks/url?url=http://discovermagazine.com/2007/brain/cogitator/%3Fsearchterm%3Devolution%2520in%2520your%2520brain&amp;ei=_nn4Rv3TGLzakwGOiK3IDA&amp;sig2=QfQ6VmVK4iZAppTJwbhqEA&amp;zx=eB6w52AfcQU&amp;ct=h" id="affj" title="Evolution in Your Brain">Evolution in Your Brain</a>, Discovery Magazine</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=36&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://softwarecreation.org/2007/can-computers-beat-human-programmers-part-2-becoming-intelligent/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Evolutionary Software Architecture or Why Developers Are Not Janitors</title>
		<link>http://softwarecreation.org/2007/evolutionary-software-architecture-or-why-developers-are-not-janitors/</link>
		<comments>http://softwarecreation.org/2007/evolutionary-software-architecture-or-why-developers-are-not-janitors/#comments</comments>
		<pubDate>Tue, 04 Sep 2007 03:01:08 +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/2007/evolutionary-software-architecture-or-why-developers-are-not-janitors-or-prima-donnas/</guid>
		<description><![CDATA[ShareOpinions about developers varied from janitors to &#8220;prima donnas&#8221; in comments to my previous post Do We Need Software Architects? 10 Reasons Why Not .
Beside discussion about the role of the software architects, the underlying philosophical problem is whether software development is primarily top down (centralized and planned) or bottom up (emergent and adaptive) 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/2007/evolutionary-software-architecture-or-why-developers-are-not-janitors/&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/2007/evolutionary-software-architecture-or-why-developers-are-not-janitors/' 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/2007/evolutionary-software-architecture-or-why-developers-are-not-janitors/'></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/2007/evolutionary-software-architecture-or-why-developers-are-not-janitors/'></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/2007/evolutionary-software-architecture-or-why-developers-are-not-janitors/&amp;title=+Evolutionary+Software+Architecture+or+Why+Developers+Are+Not+Janitors&amp;t=2' height='18' width='120' frameborder='0' scrolling='no'></iframe></div></div></div><div style='clear:both'></div><p>Opinions about developers varied from janitors to &#8220;prima donnas&#8221; in comments to my previous post <a href="http://softwarecreation.org/2007/do-we-need-software-architects-10-reasons-why-not/" id="qv.1" title="Do We Need Software Architects? 10 Reasons Why Not">Do We Need Software Architects? 10 Reasons Why Not</a> .<br />
Beside discussion about the role of the software architects, the underlying philosophical problem is whether software development is primarily <span style="font-weight: bold">top down</span> (centralized and planned) or <span style="font-weight: bold">bottom up</span> (emergent and adaptive) process. If software development is top down, the architects are essential and crucial people on the project, who concentrate knowledge, establish technical leadership and guide development teams. If software development is bottom up, the developers become primary force for evolving the system, make key technical decisions and care about the architecture; architects (if they still needed) play coordination and mediation roles.</p>
<p>As Goethe said &#8211; between two opposite opinions you’ll find not the truth, but the problem. I incline to consider software development as a bottom up process, which occasionally (often in time of changing direction or crisis) needs centralized effort and top down approach.</p>
<p>Evolutionary, adaptive and emergent development of the software system leads to the most optimal solution. However, any software project usually has specific business goal, constraints and cannot evolve forever as natural systems do. Therefore, the main architecture concern is how to balance these two approaches.</p>
<h3>   Dynamic of the Complex Systems</h3>
<p><img src="http://softwarecreation.org/images/2007/complex-adaptive-system.jpg" title="Complex Adaptive System" alt="Complex Adaptive System" /><br />
<a href="http://en.wikipedia.org/wiki/Complex_adaptive_system" class="photocredit" title="Complex Adaptive System">Complex Adaptive System</a></p>
<p>Many complex systems show organization &#8211; galaxies, biological, market, society, etc. These systems can be explained and studied by referencing their parts, properties and laws (gravitational, supply / demand, etc.). Another approach is to look for the system as a whole, studying dynamic of the elements interaction and system properties &#8211; the science of self-organization.</p>
<p>Can we say that the development of the software system has features of self-organization? Mostly yes, as we have</p>
<ul>
<li>     <span style="font-weight: bold">Fluctuations </span>- optimal solution is not     obvious and needs search; many useful vs. noise factors affect this search</li>
<li>     <span style="font-weight: bold">Local interactions </span>- the software solution     emerge from local interactions between involved people, business needs,     technical platform and IT environment</li>
<li>     <span style="font-weight: bold">Dissipation </span>- a software project     consumes energy to keep going, mostly in the form of money :)</li>
<li>     <span style="font-weight: bold">Instability </span>- software development     deals with constantly changing situations</li>
<li>     <span style="font-weight: bold"> Multiple equilibria</span> &#8211; there are many     possible satisfying solutions</li>
<li>     <span style="font-weight: bold">Complexity </span>- any non-trivial software     project has complexity</li>
<li>     <span style="font-weight: bold">Hierarchies </span>- there are many     perspectives and levels &#8211; organizational, technological and solution domain</li>
</ul>
<p>The only fundamental property, which sometimes is missing for true self-organization &#8211; <strong>autonomy</strong> or absence of external control. Traditional corporation will always exercise some form of the control over software projects. And this is important to resolve &#8211; self-organized systems (evolving bottom up) achieve better solutions than rigid controlled systems. But why self-organized systems can produce better solutions? And what is the best way to control them?</p>
<p><span id="more-33"></span></p>
<h3>   Why self-organized systems are better?</h3>
<ol>
<li>     <span style="font-weight: bold">Distributed control</span> &#8211; &#8220;control&#8221; of the     system organization is typically distributed over the whole of the system.     All parts contribute evenly to the resulting arrangement. The free market is     a good example. There are many independent market agents &#8211; companies and     individuals. Problems with individual company or even market segment doesn&#8217;t     effect economy much as there are always players who will use this     opportunity and take over the vacant niche. The brain is another example.     Its organization is distributed over a network of interacting neurons.     Although different brain regions are specialized for different tasks, no     neuron or group of neurons has overall control. This is shown by the fact     that minor brain lesions because of accidents, surgery or tumors normally do     not disturb overall functioning, whatever the region that is destroyed.
<p style="font-style: italic">Therefore, in effective software projects       any skilled and experienced developer with tacit and specialized knowledge       should have control over architecture decisions in his area as oppose to       giving this control to few architects (or what even worse managers). Global       order should emerge from these local development decisions.</p>
</li>
<li>     <span style="font-weight: bold">Robustness</span> &#8211; self-organized systems     are relatively insensitive to perturbations or errors, and can restore     themselves, unlike most human designed systems. One reason for this     fault-tolerance is the redundant, distributed organization. Another reason     for this intrinsic robustness is that self-organization thrives on     randomness, fluctuations or “noise”, which could bring unexpected and better     solutions. And third reason is stabilizing effect of feedback loops.</li>
<li>     <span style="font-weight: bold">Feedback </span>- the dynamics of a     self-organizing system is typically non-linear, because of circular or     feedback relations between the components.     <a href="http://en.wikipedia.org/wiki/Positive_feedback" id="nn5w" title="Positive feedback">Positive     feedback</a> leads to an explosive growth, which ends when all components     have been absorbed into the new configuration, leaving the system in a     stable,     <a href="http://en.wikipedia.org/wiki/Negative_feedback" id="c9m2" title="negative feedback">negative     feedback</a> state.
<p style="font-style: italic">Effective feedback loops could be       established only with open, adaptive and distributed approach contrary to       closed, rigid and centralized traditional approach to software       development.</p>
</li>
<li>     <span style="font-weight: bold">Emergence </span>- property or feature not     previously observed as a functional characteristic of the system. Self     organization turns a collection of interacting elements into an individual,     coherent whole. Elements produce their own emergent properties and form the     next level of structure in the system, which in turn form the building     blocks for the next higher level of organization, with different emergent     properties, and so on.
<p style="font-style: italic"> Therefore, it is almost impossible to come up with these properties and decisions on the preliminary software design stage. The key for building great software systems is to learn how to tame and use emergence effectively instead of fighting against it.</p>
</li>
<li>     <span style="font-weight: bold">Bifurcations </span>- which of the possible     configurations the system will settle in depends on a chance. A system may settle in a range of stable     configurations. Since small fluctuations are amplified by positive feedback,     this means that even small and impossible to observe fluctuation can lead to     the to completely different project outcome.
<p style="font-style: italic">       Therefore, even if we know business needs, environment and system       specifications at the beginning of the process, the outcome is still       unpredictable. It is waste of effort trying to predict and plan it &#8211; it is better to prepare for changes and adaptation.</p>
</li>
<li>     <span style="font-weight: bold">Adaptation </span>- a configuration of a     system may be called “fit” if it is able to maintain or grow given the     specific configuration of its environment. An &#8220;unfit&#8221; configuration is one     that will disintegrate the system under the given boundary conditions.     Different configurations can be compared as to their degree of fitness, or     probability to survive under the given conditions imposed by the     environment. Thus, adaptation can be defined as achieving a fit between the     system and environment. Systems may be called adaptive if they can adjust to     such changes while keeping their organization as much as possible intact.
<p style="font-style: italic">Considering above points, adaptation is very important for survival and success of the software project.</p>
</li>
<li>     <span style="font-weight: bold">Self Regulation </span>- adaptation can be     considered as a problem of regulation or control: minimizing deviations from     a goal configuration by counteracting perturbations before they become large     enough to endanger the system.
<p style="font-style: italic">Therefore, the software development process should be able to produce variety of actions to cope with each of the possible perturbations and select the best action for the given problem. How it is possible without developers, creators of the software system? They should be empowered, trained and encouraged to do this.</p>
</li>
</ol>
<h3>   How to control a self-organized system?</h3>
<ol>
<li>     <span style="font-weight: bold">Establish attractors</span> (state of     equilibrium, a preferred and stable position for the system). It is better     to establish vision, goals for expected system, good motivation and  <a href="http://softwarecreation.org/2007/fair-compensation-for-programmers-is-it-possible/" title="compensation" id="davx">compensation</a> for the team     instead of telling what to do to and how to achieve this state.</li>
<li>     <span style="font-weight: bold">Establish principles</span> (or fitness     criteria) for choosing the best action for the given circumstances.
<ul>
<li>       The most straightforward method is to let the environment itself determine       what is fit by trial and errors. This can be dangerous for the company since       it may lead to the failure of the software project.</li>
<li>       Another approach is to create internal models of the environment. This       allows to try out a potential action “virtually”, in the model, and       use the model to decide on its fitness. Theoretically, this is the most effective approach and many architect are       trying to follow it, but it is very difficult in reality as this approach should take in consideration huge number of variables and create credible simulation.</li>
<li>       Use simple rules, empirical patterns and best practices &#8211; considering the       current state of the software development it is the best       approach.</li>
</ul>
</li>
<li>     <span style="font-weight: bold">Create effective     </span><a href="http://softwarecreation.org/2007/what-is-the-best-leader-for-the-software-team/" id="crsh" style="font-weight: bold" title="self-organized">self-organized</a><span style="font-weight: bold">     teams.</span></li>
</ol>
<p>Developers are not janitors and prima donnas, because they are the most important people to maintain healthy self organization in the development of the software system, avoid system degradation and lead to the project success. Architects should help developers to establish better attractors, fitness criteria and internal models (or patterns) for selection of the optimal solutions, but they are not the best people to make decisions about these solutions. Certainly it is valid statement,  if we agree that evolution, adaptivity and self-organization are important (bottom up approach). Please notice, in this post I even didn&#8217;t touch <a href="http://softwarecreation.org/2007/human-forces-and-software-creators/" title="people" id="xpxe">people</a>, <a href="http://softwarecreation.org/2007/software-development-is-the-flow-of-ideas-the-rest-is-secondary/" title="idea flow" id="z3i7">idea flow</a> and <a href="http://softwarecreation.org/2007/testosterone-irrational-choices-and-programmers/" title="psychology" id="djvu">psychology</a> factors &#8211; I considered software development only from perspective of the theory of complex systems and self-organization.</p>
<p><span style="font-weight: bold">Useful Resources:</span><br />
<a href="http://www.calresco.org/sos/sosfaq.htm" id="v9b_" title="Self-Organizing Systems FAQ">Self-Organizing Systems FAQ</a><br />
<a href="http://pespmc1.vub.ac.be/Papers/EOLSS-Self-Organiz.pdf" id="iq-e" title="The Science of Self-Organization and Adaptivity">The Science of Self-Organization and Adaptivity</a>, Francis Heylighen<br />
<strong style="font-weight: normal"> <a href="http://www.amazon.com/gp/product/0553343637/104-2883280-1296732?tag=softwcreatmys-20" title="Order Out of Chaos">Order Out of Chaos</a></strong>, Ilya Prigogine</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=33&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://softwarecreation.org/2007/evolutionary-software-architecture-or-why-developers-are-not-janitors/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Do We Need Software Architects? 10 Reasons Why Not</title>
		<link>http://softwarecreation.org/2007/do-we-need-software-architects-10-reasons-why-not/</link>
		<comments>http://softwarecreation.org/2007/do-we-need-software-architects-10-reasons-why-not/#comments</comments>
		<pubDate>Thu, 30 Aug 2007 04:45:22 +0000</pubDate>
		<dc:creator>Andriy Solovey</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Process]]></category>
		<category><![CDATA[System]]></category>
		<category><![CDATA[Teams]]></category>

		<guid isPermaLink="false">http://softwarecreation.org/2007/do-we-need-software-architects-10-reasons-why-not/</guid>
		<description><![CDATA[Share
Recently I was reviewing requirements for Microsoft Architect Certification and had found description for architect roles. After reading I had a question: do we need this kind of architects in a software team? Can they really help with building successful software?
The summary of architect responsibilities (as per Microsoft):

     Enterprise architects: set [...]]]></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/2007/do-we-need-software-architects-10-reasons-why-not/&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/2007/do-we-need-software-architects-10-reasons-why-not/' 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/2007/do-we-need-software-architects-10-reasons-why-not/'></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/2007/do-we-need-software-architects-10-reasons-why-not/'></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/2007/do-we-need-software-architects-10-reasons-why-not/&amp;title=+Do+We+Need+Software+Architects%3F+10+Reasons+Why+Not&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/2007/superman.jpg" /></p>
<p>Recently I was reviewing requirements for <a href="http://www.microsoft.com/learning/mcp/architect/default.mspx" title="Microsoft Architect Certification">Microsoft Architect Certification</a> and had found description for <a href="http://www.microsoft.com/learning/mcp/architect/specialties/default.mspx" title="architect roles">architect roles</a>. After reading I had a question: do we need this kind of architects in a software team? Can they really help with building successful software?</p>
<p>The summary of architect responsibilities (as per Microsoft):</p>
<ul>
<li>     <span style="font-weight: bold">Enterprise architects:</span> set the overall vision and framework for the IT environment from a strategic business perspective.</li>
<li>     <span style="font-weight: bold">Solutions architects</span>: design the solution to take advantage of the existing assets, integrate them into the existing environment, follow the enterprise architecture, and solve the business problems of the business owner or unit.</li>
<li>     <span style="font-weight: bold">Infrastructure architects</span>: responsible for creating an architecture that meets the business and service level agreement requirements of the business owners and supports the applications and solutions that are required to operate their day-to-day businesses.</li>
</ul>
<p>The bottom line is that company hires expensive and canny software architects before start of the project. They talk with the business, come up with solutions and make bright key decisions about architecture. <span style="font-weight: bold">But they don&#8217;t program</span>. During the course of the project they ensure that developers don&#8217;t spoil this great architecture.<br />
<span style="font-weight: bold"></span></p>
<p>Now business owners can hire not so bright programmers, who should just follow directives and implement this great architecture. There is even correspondence with <a href="http://softwarecreation.org/2007/programmers-are-lazy-capricious-pseudo-intellectuals-really/" title="theories">theories</a> of some management consultants that programmers are just house painters.</p>
<p>Completely irrelevant questions: Can you trust advise of your friend about Paris, if he saw the city only on TV? Can you trust battle plans if battle didn&#8217;t begin and your commander knows little about enemy? How many chess moves ahead can you predict with high certainty before start of the game?</p>
<p>I don&#8217;t reject a need in architecture, but I don&#8217;t agree <span style="font-weight: bold">who</span>, <span style="font-weight: bold">when </span>and <span style="font-weight: bold">how </span>should make architecture decisions in a software project.</p>
<p><span id="more-32"></span></p>
<h3>Top 10 reasons why you don&#8217;t need Software Architect</h3>
<p>The Architect (dedicated non-programming technical decision maker and problem solver for business):</p>
<ol>
<li>     Has outdated programming knowledge and experience, loss of touch with modern development approaches and practices.</li>
<li>     Don&#8217;t program and don&#8217;t know much about evolving system internals, but makes key technical decisions. Often has completely irrelevant and unreal picture what is happening with the system.</li>
<li>     Tends to complex, premature and generic solutions when the system is still in infancy and nothing is clear. Applies latest modern buzzword technologies as SOA, MDA, SaaS, Software Factories, etc. which look so beautiful in technical magazines, conferences and CV, but cause unnecessary headache for developers.</li>
<li>     Plays role of the middleman introducing complexity in coordination and project responsibilities. Represents software team in interactions with business customers reducing communication value for the rest of the team and <a href="http://softwarecreation.org/2007/software-development-is-the-flow-of-ideas-the-rest-is-secondary/" title="impacting idea flow">impacting idea flow</a>.</li>
<li>     Reduces quality of decisions, which become limited to one perspective; decision making starts lacking diversity, independence and decentralization, which are essential attributes of <a href="http://softwarecreation.org/2007/review-the-wisdom-of-crowds-making-the-best-decisions/" id="mxv." title="collective intelligence">collective intelligence</a>.</li>
<li>     Creates tension with developers who experience mismatch between grand design and reality. Often continues pushing design decisions until the system becomes overly complex, difficult to change and becomes completely unusable.</li>
<li>     Secures job and justifies high salary &#8211; becomes authoritative center for solving business problems without much input from the team.</li>
<li>     Causes loss of sense of ownership, motivation and accountability in developers by detaching them from the key architecture decisions.</li>
<li>     Concentrates project knowledge and the big picture in one head, limiting (and sometimes preventing) complete understanding for others.</li>
<li>     Contributes to creation of specialized IT verticals that <a href="http://softwarecreation.org/2007/it-business-gap-widens-is-this-a-problem/" id="jx_6" title="hurt relations">hurt relations</a> with the business.</li>
</ol>
<p>I&#8217;m sure that some architects bring strong technical leadership, excellent solutions and overall project success. However, the architect role itself, as described by Microsoft and employed by other companies, doesn&#8217;t encourage productive development and effective solutions.</p>
<h3> What is effective architecture? Who is effective architect?</h3>
<p><a href="http://www.laputan.org/metamorphosis/metamorphosis.html" id="hdid" title="Emerging">Emerging</a> and <a href="http://martinfowler.com/articles/designDead.html" id="d5sw" title="evolutionary">evolutionary</a> architecture is a core for a successful agile (and not only) software system, emerging from the implementation of business needs, learning from working code, problems and interactions with people, other systems and operational environment.</p>
<p>Effective architecture:</p>
<ol>
<li>     Provides stable foundation and integrity for the growing software system, enabling desired system qualities for the business solutions.</li>
<li>     Ensures seamless and consistent integration, well defined interfaces and interaction between subsystems, external systems and operational environment.</li>
<li>     Supports emerging abstractions, key system elements and frameworks for conceptual integrity, efficiency and reuse.</li>
</ol>
<p>Effective architect:</p>
<ol>
<li>     Guards a system against failure, sensing worrying changes in the project dynamic, system code and business requests.</li>
<li>     Keeps the <a href="http://en.wikipedia.org/wiki/Vitruvius" id="dg5h" title="trinity of system qualities">trinity of system qualities</a> (known from time of Roman empire) in a balance and prevent degradation and entropy:
<ul>
<li>       <span style="font-weight: bold">Firmitas </span>(Strength) &#8211; the system is reliable, secure, has good performance and easy to support</li>
<li>       <span style="font-weight: bold">Utilitas </span>(Utility) &#8211; the system is usable, meets business business needs and add business value every day instead of drifting into technology trenches</li>
<li>       <span style="font-weight: bold">Venustas </span>(Beauty) &#8211; code and system structure are clean, easy to understand, minimal</li>
</ul>
</li>
<li>     Encourages constant improving of the code design, enhancing system abstractions and structure, removing duplication, defining boundaries and interfaces of the subsystems.</li>
<li>     Keeps solutions as simple as possible, maintains intellectual control over system and avoids over-engineering.</li>
<li>     Most important &#8211; grows and coaches other developers to become architects</li>
</ol>
<p>If your company can afford dedicated non-programming technical person, hire an expert for complex technical areas, a <a href="http://softwarecreation.org/2007/what-is-the-best-leader-for-the-software-team/" id="pydp" title="coach">coach</a> to share best practices and experience or a technical supporter to coordinate with different external groups and help to resolve problems and make them all part of the team.</p>
<p><span style="font-weight: bold">But don&#8217;t take technical decisions and concern about architecture from the development team.</span></p>
<p>The ultimate solution &#8211; every developer covers these architect responsibilities. Hire few experienced, motivated and capable developers and start project with them. Developers will constantly evolve the system based on real needs and shape effective architecture. You can trust that system will be healthy, meet business needs and bring success. Often only few important architecture decisions should be made before start of the project &#8211; trust them to the developers, who will implement the system.</p>
<p>So, here is the answer regarding who, when and how should make architecture decisions:</p>
<p><span style="font-weight: bold">Who</span> &#8211; every developer timely makes architecture decisions and constantly improves evolving architecture<br />
<span style="font-weight: bold">When</span> &#8211; mostly after start of implementation, when system becomes more complex and need design improvements to maintain system qualities, intellectual control and conceptual integrity.<br />
<span style="font-weight: bold">How</span> &#8211; preventing degradation and entropy by making design changes and refactoring; learning from the project dynamic, working code and business requests and adjusting a way how the development team works.</p>
<p>Do you still think that software projects need The Architect?</p>
<p><strong>Useful resources:</strong></p>
<p><a href="http://www.microsoft.com/learning/mcp/architect/default.mspx" title="Microsoft Architect Certification">Microsoft Architect Certification</a></p>
<p><a href="http://martinfowler.com/articles/designDead.html" title="Is Design Dead?">Is Design Dead?</a>, Martin Fowler</p>
<p><a href="http://www.laputan.org/mud/" title="Big Ball of Mud">Big Ball of Mud</a>, Brian Foote and Joseph Yoder</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=32&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://softwarecreation.org/2007/do-we-need-software-architects-10-reasons-why-not/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
		<item>
		<title>11 Laws of The System Thinking in Software Development</title>
		<link>http://softwarecreation.org/2007/11-laws-of-the-system-thinking-in-software-development/</link>
		<comments>http://softwarecreation.org/2007/11-laws-of-the-system-thinking-in-software-development/#comments</comments>
		<pubDate>Fri, 27 Jul 2007 01:53:36 +0000</pubDate>
		<dc:creator>Andriy Solovey</dc:creator>
				<category><![CDATA[Process]]></category>
		<category><![CDATA[System]]></category>

		<guid isPermaLink="false">http://softwarecreation.org/2007/11-laws-of-the-system-thinking-in-software-development/</guid>
		<description><![CDATA[Share&#8220;I will work harder&#8221; &#8211; the horse Boxer (from George Orwell&#8217;s Animal Farm)

bichuas
The System Thinking Laws from Peter Senge&#8217;s book “The Fifth Discipline” applied to Software Development.
      1.  Today&#8217;s problems come from yesterday&#8217;s solutions.
We, humans, are happy when we solve problems. We often don&#8217;t think much about consequences. Surprisingly, [...]]]></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/2007/11-laws-of-the-system-thinking-in-software-development/&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/2007/11-laws-of-the-system-thinking-in-software-development/' 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/2007/11-laws-of-the-system-thinking-in-software-development/'></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/2007/11-laws-of-the-system-thinking-in-software-development/'></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/2007/11-laws-of-the-system-thinking-in-software-development/&amp;title=+11+Laws+of+The+System+Thinking+in+Software+Development&amp;t=2' height='18' width='120' frameborder='0' scrolling='no'></iframe></div></div></div><div style='clear:both'></div><p class="right"><cite>&#8220;I will work harder&#8221;</cite> &#8211; the horse Boxer (from George Orwell&#8217;s Animal Farm)</p>
<p><img src="http://softwarecreation.org/images/2007/horse.jpg" alt="Boxer" /><br />
<a href="http://www.flickr.com/photos/bichuas/" class="photocredit" title=" bichuas">bichuas</a></p>
<p>The System Thinking Laws from Peter Senge&#8217;s book “<a href="http://www.amazon.com/gp/product/0385517254/102-4895263-8374529?ie=UTF8&amp;tag=softwcreatmys-20&amp;linkCode=xm2&amp;camp=1789&amp;creativeASIN=0385517254" title="The Fifth Discipline.">The Fifth Discipline</a>” applied to Software Development.</p>
<h3>      1.  Today&#8217;s problems come from yesterday&#8217;s solutions.</h3>
<p>We, humans, are happy when we solve problems. We often don&#8217;t think much about consequences. Surprisingly, our solutions could strike back and create new problems.</p>
<ul>
<li>A company decides to reward few key members of the very successful team with bonuses and promotions. The rest of the team feel unfairness and loss of motivation. Eventually tension between members is increased. The following projects are no longer successful.</li>
<li>A project manager frequently asks developers to fix a new bug or work on urgent requests from customers. Developers do their best to fulfil these requests. Frequent distractions prevent them from finishing their main tasks for the iterations. Project shows only little progress.</li>
</ul>
<p><span id="more-23"></span></p>
<h3>      2. The harder you push, the harder the system pushes back.</h3>
<p>We have this stubborn reaction to push our way through when things are not working out as we want.  We charge without time to stop, think and find better alternatives. Sometimes we solve problems, but often we find ourselves up to ears in the swamp of other problems.</p>
<ul>
<li>     Managers keep pushing people to work overtime and meet deadline when a     system is far from completion. The number of bugs is increasing and overall     quality is rapidly dropping causing more delays. More and more effort is     required to launch the software system.</li>
<li>     Developers heroically stretch the same architecture for the new system     requirements, which don&#8217;t fit into the old rigid way. They are so busy doing     it that don&#8217;t have time to stop, analyze and change approach. The system     degrades.</li>
</ul>
<h3>      3. Behavior grows better before it grows worse.</h3>
<p>Short-term solutions give us a short break and temporary improvement, but don&#8217;t eliminate fundamental problems. These problems will make situation worse in the long run.</p>
<ul>
<li>     A company gives customers hefty discounts and run expensive advertisement &#8211; many people buy the software.     Customers are unhappy after purchase, because software is unusable and     unreliable.</li>
</ul>
<ul>
<li>Management promises development team big bonuses if they finish system in time. A team work hard, but soon realize that it is impossible. Developers becomes cynical and unmotivated.</li>
</ul>
<h3>      4. The easy way out usually leads back in.</h3>
<p>We learn few solutions in our life, which brought easy success earlier. We try to vigorously apply them in any situation disregarding particular context and people.</p>
<ul>
<li>     Agile coach is forcing full Extreme Programming implementation when     developers are not ready to accept some practices as pair programming or     TDD. It creates stress, conflicts and allergy to any Agile approach.</li>
<li>     Developers apply design patterns everywhere unnecessarily complicating the     system.</li>
</ul>
<h3>      5. The cure can be worse than the disease.</h3>
<p>Some familiar solutions could be even dangerous like drinking beer while programming to reduce stress for unreal deadlines.</p>
<ul>
<li>     A company hires various contractors to work on core features, because     doesn&#8217;t trust full-time developers. As a result, the system doesn&#8217;t have     conceptual integrity, in-house developers don&#8217;t understand and cannot change     it. Domain knowledge, interpretation and concepts are missing from the     brains of company employees.</li>
<li>Developers make many shortcuts, copy and paste code for similar functionality to please management and deliver first version fast. They do quick progress at the beginning, but code eventually becomes <a href="http://en.wikipedia.org/wiki/Big_ball_of_mud" title="Big Ball of Mud">Big     Ball of Mud</a>.</li>
</ul>
<h3>      6. Faster is slower.</h3>
<p>When we feel smell of success we start advance at the full speed without much caution. However, the optimal rate of growth usually is much slower than the fastest growth possible.</p>
<ul>
<li>     Managers add many people to already successful project. The overall progress     becomes slower, because of communication overhead and loss of team     coherence.</li>
<li>     Developers quickly add new features to the system without proper refactoring and     improving existing code. System becomes difficult to understand and modify.</li>
</ul>
<h3>      7. Cause and effect are not closely related in time and space.</h3>
<p>We are good at finding causes to our problems, even if they are just symptoms and far from real root causes.</p>
<ul>
<li>     Development team stops accepting requirement changes from customers to     finish a system in time. Customers are unhappy with delivered software.</li>
<li>     After few incidents with a live system, management compel developers to get     approval and write detailed technical specification before implementing any     change in the system. Developers lose motivation for any improvements in the     system and start procrastinating.</li>
</ul>
<h3>      8. Small changes can produce big results-but the areas of highest   leverage are often the least obvious.</h3>
<p>Most obvious grand solutions like changing company policy, vision or tag line often don&#8217;t work. Small ordinary, but consistent changes could make a huge difference.</p>
<ul>
<li>     Developers have everyday interactions with customer and make most decisions.     As a result, customer needs are well understood, decisions are  better     and solutions are optimal.</li>
<li>     Developers build automated unit tests for each function in the system. As a     result, design is flexible, people are confident, the system is     fully tested after each change.</li>
</ul>
<h3>      9. You can have your cake and eat it too &#8211; but not at once.</h3>
<p>We often face rigid &#8220;either-or&#8221; choices. Sometimes they are not dilemmas if we change our perspective and rules of the system.</p>
<ul>
<li>     Experience managers know that we cannot increase the number of features and     reduce time and cost simultaneously. However, it could be possible to     achieve if we just improve     <a href="http://softwarecreation.org/2007/software-development-is-the-flow-of-ideas-the-rest-is-secondary/" title="flow of ideas">flow     of ideas</a>, find right people and avoid over-engineering.</li>
<li>     Developers believe that they should follow either     <a href="http://www.martinfowler.com/eaaCatalog/transactionScript.html" title="Transaction Script">Transaction     Script</a> or     <a href="http://www.martinfowler.com/eaaCatalog/domainModel.html" title="Domain Model">Domain     Model</a> architecture patterns. However high performance solution in the     complex domain can combine both for the best effect.</li>
</ul>
<h3>     10. Dividing an elephant in half does not produce two small elephants.</h3>
<p>Inability to see the system as a whole could often lead to suboptimal decisions.</p>
<ul>
<li>     A manger evaluates developers based on the number of lines of codes they produce or points     they implemented during iteration. Developers produce a lot of useless code.</li>
<li>Management promises testers $5 dollars for any found bug in the system. Testers are no longer interested in cooperating with developers and prevent root causes of the bugs. Good and productive relations between teams disappear.</li>
</ul>
<h3>     11. There is no blame.</h3>
<p>We like to blame and point fingers to other people or circumstances, sometimes we even believe in this. But we and cause of our problems are part of the System.</p>
<ul>
<li>     It is Joe fault that the team didn&#8217;t release system this morning. He     didn&#8217;t fix all the bugs overnight even though PM kindly gave him free pack     of beer, T-shirt and pizza.</li>
<li>     People don&#8217;t use a company&#8217;s excellent Web 2.0 social application. Users are     simply stupid and don&#8217;t appreciate hard work.</li>
</ul>
<h3>So what?</h3>
<p>These 11 laws of The System Thinking show that all our solutions have consequences, sometimes bad and unexpected. Systems around us are what they are, and we shouldn&#8217;t blame, but learn them. To master The System Thinking and control these systems we should</p>
<ol>
<li>     understand what are the systems we are dealing with, either     <a href="http://softwarecreation.org/2007/system-forces-and-software-evolution/" title="human or software">human     or software</a>.</li>
<li><a href="http://softwarecreation.org/2007/do-we-have-conscious-control-over-our-actions/" title="consciously">consciously</a>          learn relations, cause and effect chains</li>
<li>perceive the systems as a whole and as the part of other     systems</li>
</ol>
<p>There are many challenges to the system thinking. Many we can defeat with gaining and using knowledge how systems work. But the most serious challenge is our own <a href="http://softwarecreation.org/2007/the-mind-of-the-programmer-anatomy-and-3-contradictions/" title="contradictory">contradictory</a> human nature. Our passions, emotions and instincts could easily defy the rational and systematic way of thinking. First step to master the system thinking is to learn how to <a href="http://softwarecreation.org/2007/5-steps-to-cooperate-with-you-unconscious-mind/" title="cooperate with ourselves">cooperate with ourselves</a>.</p>
<p><strong>Question:</strong> What is your experience with the system thinking (or absence) in software development?</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=23&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://softwarecreation.org/2007/11-laws-of-the-system-thinking-in-software-development/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>System Forces and Software Evolution</title>
		<link>http://softwarecreation.org/2007/system-forces-and-software-evolution/</link>
		<comments>http://softwarecreation.org/2007/system-forces-and-software-evolution/#comments</comments>
		<pubDate>Sat, 23 Jun 2007 23:15:48 +0000</pubDate>
		<dc:creator>Andriy Solovey</dc:creator>
				<category><![CDATA[System]]></category>

		<guid isPermaLink="false">http://softwarecreation.org/2007/system-forces-and-software-evolution/</guid>
		<description><![CDATA[ShareOnly entropy comes easy. &#8211; Anton Chekhov


   What are the systems in software creation?
System is a group of interacting, interrelated, or interdependent elements forming a complex whole. &#8211; The American Heritage Dictionary
There are some powerful forces in our Universe that lead systems to more complex organization &#8211; from elementary particles to molecules, from [...]]]></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/2007/system-forces-and-software-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/2007/system-forces-and-software-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/2007/system-forces-and-software-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/2007/system-forces-and-software-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/2007/system-forces-and-software-evolution/&amp;title=System+Forces+and+Software+Evolution&amp;t=2' height='18' width='120' frameborder='0' scrolling='no'></iframe></div></div></div><div style='clear:both'></div><p class="right"><cite>Only entropy comes easy.</cite> &#8211; <strong>Anton Chekhov</strong></p>
<p><br class="clear" /><br />
<img src="/images/2007/Flammarion.jpg" alt="Flammarion" /></p>
<h3>   What are the systems in software creation?</h3>
<p><cite>System is a group of interacting, interrelated, or interdependent elements forming a complex whole.</cite> &#8211; The American Heritage Dictionary</p>
<p>There are some powerful forces in our Universe that lead systems to more complex organization &#8211; from elementary particles to molecules, from space dust to stars and planets, from chemical elements to biological organisms and from early tribes to advanced civilization. Even more powerful forces lead systems to destruction or degradation back to primitive forms or complete mess.</p>
<p><span style="font-weight: bold">System evolution is the constant fight between order (or more complex organization) and entropy (or degradation) of the systems.</span></p>
<p>System forces are working on 2 levels of the software creation:</p>
<ul>
<li>     People, how they organized and the way they build software</li>
<li>     The software system itself</li>
</ul>
<p>Both these levels intervene and affect each other to deliver desired result &#8211; a working software system. These levels are different &#8211; people systems are the product of biological, social and economic forces. Software systems are the product of technology, mental concepts and theories. But both of them share common challenges related to the system forces.</p>
<p><span id="more-7"></span><br />
<span style="font-weight: bold"></span></p>
<h3>   What are the system forces and challenges?</h3>
<h4>   Structural</h4>
<ul>
<li>     <span style="font-weight: bold">Centralization vs. Self-Organization </span>- which systems are more effective &#8211; directed (e.g. traditional corporation) or self-organized (e.g. classical market). Compare large centralized development of <a href="http://en.wikipedia.org/wiki/Microsoft_Windows" title="Windows">Windows</a> with the effort of independent developers to build     open-source <a href="http://en.wikipedia.org/wiki/Linux" title="Linux">Linux</a>.</li>
<li>     <span style="font-weight: bold">Complexity vs. Simplicity</span> &#8211; what should be a degree of internal complexity which enables complex behavior while maintaining consistency and integrity in the system. Compare collaboration software: simplicity and elegance of <a href="http://www.basecamphq.com/" title="Basecamp">Basecamp</a> and complexity and power of <a href="http://www.microsoft.com/sharepoint/default.mspx" title="Sharepoint">Sharepoint</a>.</li>
<li>     <span style="font-weight: bold">Abstraction vs. Concrete </span>- what should be the levels of abstraction in the system to allow most effective perspectives on structure, interactions and relations. Compare multi-layer perspective on <a href="http://java.sun.com/j2ee/reference/whitepapers/j2ee_guide.pdf" title="enterprise Java">enterprise Java</a> system with the flat <a href="http://www.php.net/manual/en/introduction.php" title="PHP">PHP</a> solution containing all the logic     in template files.</li>
<li>     <span style="font-weight: bold">Diversity vs. Similarity </span>- how different should be elements to allow rich behavior while avoiding conflicts and maintaining the same direction and progress. Compare diverse team with different skills, backgrounds and opinions with single-minded and compliant team.</li>
</ul>
<h4>   Behavioral</h4>
<ul>
<li>     <span style="font-weight: bold">Adaptation vs. Stability</span> &#8211; how to     balance <span style="font-style: italic">adaptation</span> to the new     unexpected changes and <span style="font-style: italic">stability </span>to sustain disturbances and keep working what is good. Compare changing existing system for the new requirements with the need to stabilize it for reliability and safety.</li>
<li>     <span style="font-weight: bold">Planning vs. Emergence</span> &#8211; what strategy provides better results &#8211; relying on planned system changes or anticipating new properties and behavior emerged from unpredicted interactions within the system and with external environment. Compare <a href="http://en.wikipedia.org/wiki/Waterfall_model" title="Waterfall">Waterfall</a> and <a href="http://www.martinfowler.com/articles/newMethodology.html" title="Agile">Agile</a> processes.</li>
<li>     <span style="font-weight: bold">Feedback vs. Isolation </span>- what should be a level of feedback to enable system self-correction and adaptation and avoid information overflow, noise and destabilization. Compare hour release cycles of <a href="http://www.plasticbag.org/archives/2005/06/cal_henderson_on_how_we_built_flickr/" title="Flickr">Flickr</a> with years of <a href="http://en.wikipedia.org/wiki/Development_of_Windows_Vista" title="Windows Vista">Windows Vista</a> development.</li>
<li>     <span style="font-weight: bold">Expansion vs. Consolidation</span> &#8211; what is the best way to combine two main types of the system evolution &#8211; adding new functions and improving internal organization. Compare adding new features to <a href="http://refactoring.com/" title="refactoring">refactoring</a>.</li>
</ul>
<p>And the main fight is between <span style="font-weight: bold">Order vs. Entropy </span>- how to avoid system degradation and maintain order. Compare well organized and messy systems (<a href="http://www.laputan.org/mud/" title="Ball of Mud">Ball of Mud</a>).</p>
<h3>   How can we resolve and tame System Forces?</h3>
<ol>
<li>     Favor what supports business needs and goals:
<ul>
<li>       for life critical systems (medical, space shuttle): Stability, Planning,       Centralization</li>
<li>       for competitive and rapidly changing systems (most businesses and web) :       Adaptation, Self-Organization, Emergence.</li>
</ul>
</li>
<li>     Favor what is most effective for the <a href="/2007/human-forces-and-software-creators/" title="human">human</a> way of thinking and working: Simplicity, Self-Organization, Abstraction (for many people Concrete approach is more effective).</li>
<li> Favor what keeps more options open for evolution and better fit for changes in environment: Adaptation, Feedback, Diversity.</li>
<li>     Consider positioning and life stage of the system
<ul>
<li>       expanding into the new markets: Adaptation, Expansion, Feedback</li>
<li>       retaining and satisfying large user base: Stability, Consolidation, Centralization</li>
</ul>
</li>
</ol>
<p><span style="font-weight: bold"></span>Taming complex systems is difficult &#8211; it needs constant skillful effort to avoid Entropy and keep Order. <a href="/2007/economic-forces-and-software-genesis/" title="Economic">Economic</a> and <a href="/2007/human-forces-and-software-creators/" title="Human">Human</a> forces add more challenges and nuances.</p>
<p><span style="font-weight: bold">The art and mystery of the software creation is how the system of interacting imperfect people can build useful, reliable and complex software systems in time and within budget</span>.</p>
<p><span style="font-weight: bold">Question</span>: Is it possible that computer systems will evolve in the future without human intervention?</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=7&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://softwarecreation.org/2007/system-forces-and-software-evolution/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
