<?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; Productivity</title>
	<atom:link href="http://softwarecreation.org/category/productivity/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>How to rescue failing software projects: The Toyota Way</title>
		<link>http://softwarecreation.org/2009/how-to-rescue-failing-software-projects-toyota-way/</link>
		<comments>http://softwarecreation.org/2009/how-to-rescue-failing-software-projects-toyota-way/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 05:02:59 +0000</pubDate>
		<dc:creator>Andriy Solovey</dc:creator>
				<category><![CDATA[Concepts]]></category>
		<category><![CDATA[Practices]]></category>
		<category><![CDATA[Process]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Teams]]></category>

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

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

		<guid isPermaLink="false">http://softwarecreation.org/2009/three-dimensions-of-a-software-programmer-how-to-get-things-done/</guid>
		<description><![CDATA[Share    What you are as a person is far more important that what you are as a basketball player. &#8211; John Wooden
People are amazing, surprising and interesting. They change reality with power of thought and make things happen. What is most exciting &#8211; all people are completely different in their attitudes and [...]]]></description>
			<content:encoded><![CDATA[<div class='dd_post_share'><div class='dd_buttons'><div class='dd_button'><iframe src='http://api.tweetmeme.com/button.js?url=http://softwarecreation.org/2009/three-dimensions-of-a-software-programmer-how-to-get-things-done/&source=AndriySolovey&service=&service_api=&style=compact' height='20' width='90' frameborder='0' scrolling='no'></iframe></div><div class='dd_button'><a name='fb_share' type='button_count' share_url='http://softwarecreation.org/2009/three-dimensions-of-a-software-programmer-how-to-get-things-done/' href='http://www.facebook.com/sharer.php'>Share</a><script src='http://static.ak.fbcdn.net/connect.php/js/FB.Share' type='text/javascript'></script></div><div class='dd_button'><script src='http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://softwarecreation.org/2009/three-dimensions-of-a-software-programmer-how-to-get-things-done/'></script></div><div class='dd_button'><a title='Post on Google Buzz' class='google-buzz-button' href='http://www.google.com/buzz/post' data-button-style='small-count' data-url='http://softwarecreation.org/2009/three-dimensions-of-a-software-programmer-how-to-get-things-done/'></a><script type='text/javascript' src='http://www.google.com/buzz/api/button.js'></script></div><div class='dd_button'><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http://softwarecreation.org/2009/three-dimensions-of-a-software-programmer-how-to-get-things-done/&amp;title=Three+Dimensions+of+a+Software+Programmer%3A+How+to+get+things+done+&amp;t=2' height='18' width='120' frameborder='0' scrolling='no'></iframe></div></div></div><div style='clear:both'></div><p>    <em>What you are as a person is far more important that what you are as a basketball player.</em> &#8211; John Wooden</p>
<p>People are amazing, surprising and interesting. They change reality with power of thought and make things happen. What is most exciting &#8211; all people are completely different in their attitudes and behavior. But this comes with price &#8211; it is difficult to understand people and even more difficult to find the best way to deal with them.<br />
Many people, who see programmers as extensions of their computer systems, will be surprised to discover that programmers are amazing individuals too. Programmers exhibit similar to other people behavior, they have different personalities and need individual approach.</p>
<p>I offer in this post a simple theory about <em>Three Dimensions of a Software Programmer</em> that could help to put relations with these individuals on some rational basis.</p>
<p id="fw_e" style="text-align: left"><img src="http://www.softwarecreation.org/images/2009/3DArchetypes.jpg" style="width: 500px; height: 500px" width="500" height="500" /></p>
<h3>Axioms</h3>
<p>There are two basic axioms in foundation of the theory</p>
<ol>
<li><strong>Constancy </strong>- some programmers consistently outperform others under same conditions.</li>
<li><strong>Variability </strong>- performance of a programmer varies under different conditions.</li>
</ol>
<p><span id="more-84"></span></p>
<h3>Talents (constants)</h3>
<p><em>Talents are recurring patterns of thoughts, feelings and behavior that can be productively applied. &#8211; </em><a href="http://www.amazon.com/First-Break-All-Rules-Differently/dp/0684852861" title="First, Break All the Rules: What the World's Greatest Managers Do Differently" id="kq_b">First, Break All the Rules</a><br />
Genes and upbringing form an adult human with specific talents and personality, strengths and weaknesses. These core individual characteristics of a programmer are difficult to change (except some limited success with consumption of large quantities of beer). Programmers are different &#8211; creative, thorough, funny, systematic, laid-back, curious, analytical, spontaneous and so on. Some people cannot be programmers at all.<br />
Each unique programmer has a base performance level that is constant and almost impossible to change.</p>
<h3>Three Dimensions (variables)</h3>
<p>Now we can move to the part of equation that can be changed. Can we make programmers permanently performing above their base level? To answer this question lets review three variables of programmer&#8217;s performance.</p>
<p><img src="http://www.softwarecreation.org/images/2009/energy-icon.gif" style="width: 20px; height: 20px; float: left; margin-left: 0pt; margin-right: 1em" /><strong>X. Energy</strong><br />
<em>measures amount of work and power of ideas that could change and improve reality</em>.<br />
Here I consider a specific kind of energy &#8211; creative positive energy that is directed to build better software and aligned with company and customers goals. Individual&#8217;s desire to act, create and achieve is the source of this energy. As we discussed above, part of this energy is based on character and predetermined. However, there is a big variable component of individual energy that is driven by motivation and environment.</p>
<p><img src="http://www.softwarecreation.org/images/2009/discipline-icon.gif" style="width: 20px; height: 20px; float: left; margin-left: 0pt; margin-right: 1em" /><strong>Y. Discipline</strong><br />
<em>measures ability to focus and follow necessary steps to achieve goals with good quality</em>.<br />
Accountability, self-organization and focus are core elements that keep individuals to perform on a high level. Personality matters here &#8211; some people will promise and forget immediately, give up experiencing first difficulties or become distracted by more interesting tasks. Some will fight until the end and go beyond limits to meet commitments, exceed expectations and bring excellent results. However, significant part of programmer&#8217;s discipline is variable and depends on context and expectations.</p>
<p><img src="http://www.softwarecreation.org/images/2009/expertise-icon.gif" style="width: 20px; height: 20px; float: left; margin-left: 0pt; margin-right: 1em" /><strong>Z. Expertise</strong><br />
<em>measures knowledge and experience in programming, technology and a customer domain.</em><br />
Expertise includes <em>know how</em> to build software, make right decisions and implement good solutions with minimal troubles. There is no doubt that expertise is growing with time, but individual variations are big. Many people consider expertise as the only important characteristic of a programmer. I believe that it has much lower value without two other variables.</p>
<h3>Programmer&#8217;s Archetypes</h3>
<table border="1" bordercolor="#aaaaaa" cellpadding="1" cellspacing="0" width="100%">
<tr>
<td></td>
<td valign="top" width="80"></td>
<td>Energy</td>
<td>Discipline</td>
<td>Expertise</td>
<td>Description</td>
</tr>
<tr>
<td style="font-family: Comic Sans MS; text-align: center; font-size: 14px"><strong>Creator<br />
</strong></td>
<td valign="top">
<p id="ow2o" style="text-align: left"><img src="http://www.softwarecreation.org/images/2009/3D-creator.jpg" style="width: 80px; height: 80px" width="80" height="80" /></p>
</td>
<td style="text-align: center">
<p id="l6jp"><img src="http://www.softwarecreation.org/images/2009/energy-icon.gif" style="width: 20px; height: 20px" /></p>
</td>
<td style="text-align: center">
<p id="yyzo"><img src="http://www.softwarecreation.org/images/2009/discipline-icon.gif" style="width: 20px; height: 20px" /></p>
</td>
<td style="text-align: center">
<p id="ibqr"><img src="http://www.softwarecreation.org/images/2009/expertise-icon.gif" style="width: 20px; height: 20px" /></p>
</td>
<td>Highly productive, creative and successful, know how and what to do; have energy, discipline and desire to accomplish tasks on the highest level</td>
</tr>
<tr>
<td style="font-family: Comic Sans MS; text-align: center; font-size: 14px"><strong> Enthusiast<br />
</strong></td>
<td valign="top">
<p id="xdnc" style="text-align: left"><img src="http://www.softwarecreation.org/images/2009/3D-enthusiast.jpg" style="width: 80px; height: 80px" width="80" height="80" /></p>
</td>
<td style="text-align: center">
<p id="l6jp"><img src="http://www.softwarecreation.org/images/2009/energy-icon.gif" style="width: 20px; height: 20px" /></p>
</td>
<td style="text-align: center">
<p id="yyzo"><img src="http://www.softwarecreation.org/images/2009/discipline-icon.gif" style="width: 20px; height: 20px" /></p>
</td>
<td style="text-align: center">-</td>
<td>Great drive and energy to make things happen; however makes unnecessary mistakes and poor decisions</td>
</tr>
<tr>
<td style="font-family: Comic Sans MS; text-align: center; font-size: 14px"><strong> Artist<br />
</strong></td>
<td valign="top">
<p id="a0t6" style="text-align: left"><img src="http://www.softwarecreation.org/images/2009/3D-artist.jpg" style="width: 80px; height: 80px" width="80" height="80" /></p>
</td>
<td style="text-align: center">
<p id="l6jp"><img src="http://www.softwarecreation.org/images/2009/energy-icon.gif" style="width: 20px; height: 20px" /></p>
</td>
<td style="text-align: center">-</td>
<td style="text-align: center">
<p id="ibqr"><img src="http://www.softwarecreation.org/images/2009/expertise-icon.gif" style="width: 20px; height: 20px" /></p>
</td>
<td>A talented and experienced individual who could create great solutions; however inconsistent and unpredictable</td>
</tr>
<tr>
<td style="font-family: Comic Sans MS; text-align: center; font-size: 14px"><strong> Doer </strong></td>
<td style="text-align: center">
<p id="a0t6" style="text-align: left"><img src="http://www.softwarecreation.org/images/2009/3D-doer.jpg" style="width: 80px; height: 80px" width="80" height="80" /></p>
</td>
<td style="text-align: center">-</td>
<td style="text-align: center">
<p id="yyzo"><img src="http://www.softwarecreation.org/images/2009/discipline-icon.gif" style="width: 20px; height: 20px" /></p>
</td>
<td style="text-align: center">
<p id="ibqr"><img src="http://www.softwarecreation.org/images/2009/expertise-icon.gif" style="width: 20px; height: 20px" /></p>
</td>
<td>A disciplined and knowledgeable programmer, who is strong in implementation, but lacks creativity and drive</td>
</tr>
<tr>
<td style="font-family: Comic Sans MS; text-align: center; font-size: 14px"><strong>Noise Maker </strong></td>
<td valign="top">
<p id="yv.b" style="text-align: left"><img src="http://www.softwarecreation.org/images/2009/3D-noise-maker.jpg" style="width: 80px; height: 80px" width="80" height="80" /></p>
</td>
<td style="text-align: center">
<p id="l6jp"><img src="http://www.softwarecreation.org/images/2009/energy-icon.gif" style="width: 20px; height: 20px" /></p>
</td>
<td style="text-align: center">-</td>
<td style="text-align: center">-</td>
<td>A lot of energy and movement without much useful results</td>
</tr>
<tr>
<td style="font-family: Comic Sans MS; text-align: center; font-size: 14px"><strong> Bureaucrat<br />
</strong></td>
<td valign="top">
<p id="f.um" style="text-align: left"><img src="http://www.softwarecreation.org/images/2009/3D-bureaucrat.jpg" style="width: 80px; height: 80px" width="80" height="80" /></p>
</td>
<td style="text-align: center">-</td>
<td style="text-align: center">
<p id="yyzo"><img src="http://www.softwarecreation.org/images/2009/discipline-icon.gif" style="width: 20px; height: 20px" /></p>
</td>
<td style="text-align: center">-</td>
<td>Consistent and rational, but does not have creative energy and knowledge to be productive</td>
</tr>
<tr>
<td style="font-family: Comic Sans MS; text-align: center; font-size: 14px"><strong> Sage<br />
</strong></td>
<td valign="top">
<p id="ddpc" style="text-align: left"><img src="http://www.softwarecreation.org/images/2009/3D-sage.jpg" style="width: 80px; height: 80px" width="80" height="80" /></p>
</td>
<td style="text-align: center">-</td>
<td style="text-align: center">-</td>
<td style="text-align: center">
<p id="ibqr"><img src="http://www.softwarecreation.org/images/2009/expertise-icon.gif" style="width: 20px; height: 20px" /></p>
</td>
<td>Deep knowledge and vast experience without willigness to perform and change anything</td>
</tr>
<tr>
<td style="font-family: Comic Sans MS; text-align: center; font-size: 14px"><strong> Lost soul<br />
</strong></td>
<td valign="top">
<p id="a3w9" style="text-align: left"><img src="http://www.softwarecreation.org/images/2009/3D-lost-soul.jpg" style="width: 80px; height: 80px" width="80" height="80" /></p>
</td>
<td style="text-align: center">-</td>
<td style="text-align: center">-</td>
<td style="text-align: center">-</td>
<td>Don&#8217;t want to do anything and don&#8217;t know how to do it anyway</td>
</tr>
</table>
<p><a href="http://kael.civfanatics.net/" class="photocredit" title="FfHII" id="g4u5">FfHII</a></p>
<h3>How to Improve</h3>
<p>A programmer can be 10 times more productive than other programmer and 10 times more productive than himself under different conditions. Therefore right people under right conditions could be 100 times more productive than others.</p>
<p>How can you influence programmer&#8217;s performance with these three dimensions? Hopefully, you found right people with right talents. It is a waste of time to change personality and push in direction where talent is absent. However, it is possible to amplify natural strengths and create conditions for super productivity.</p>
<p><img src="http://www.softwarecreation.org/images/2009/energy-icon.gif" style="width: 20px; height: 20px; float: left; margin-left: 0pt; margin-right: 1em" width="20" height="20" /><strong>Energy</strong><br />
goal: <em>make people empowered, motivated, interested and satisfied; engage them to perform above their base level of energy</em></p>
<p><u>job design</u></p>
<ul>
<li>  interesting work &#8211; brings inspiration and motivation</li>
<li>control &#8211; over own work and decisions &#8211; pushes people forward</li>
<li>self-organization &#8211; opportunities to find own ways that bring best results</li>
<li>creative tension &#8211; goals on the edge of capabilities to focus energy and open new energy sources</li>
<li>defined outcomes &#8211; clear direction that reduces anxiety and doubt and increases productivity</li>
</ul>
<p><u>psychology</u></p>
<ul>
<li><a href="http://en.wikipedia.org/wiki/Flow_%28psychology%29" title="flow" id="c9qo">flow</a> &#8211; put mind in a state of energized focus, full involvement, and success</li>
<li>  positive experience &#8211; good emotions and healthy team relations; comfortable and trusted environment</li>
<li>personal interests &#8211; decision making considers and takes care of individual interests</li>
<li>right incentives  &#8211; <a href="http://softwarecreation.org/2007/fair-compensation-for-programmers-is-it-possible/" title="compensation" id="iobi">compensation</a>, rewards, recognition are the great source of energy and motivation</li>
</ul>
<p><u>environment</u></p>
<ul>
<li>  space for mistakes &#8211; tolerance and open ways to fix mistakes make people think about moving forward instead of covering assess</li>
<li>  productive environment &#8211; where people think about work instead of nuisances</li>
<li>fit &#8211; between personal and company goals, culture and views &#8211; amplify people desire to work</li>
<li>reasonable pressure &#8211; normal workload, minimal stress, time slack to avoid energy drains</li>
</ul>
<p><img src="http://www.softwarecreation.org/images/2009/discipline-icon.gif" style="width: 20px; height: 20px; float: left; margin-left: 0pt; margin-right: 1em" /><strong>Discipline<br />
</strong>goal: <em>make people focused, responsible and aligned; make them performing in the right way</em></p>
<p><u>support system</u></p>
<ul>
<li>established process &#8211; align actions with goals and support their execution (Agile is the best way to go)</li>
<li>transparency &#8211; reasons for decisions should be clear, problems should surface quickly</li>
<li>pull system (<a href="http://en.wikipedia.org/wiki/Kanban" title="kanban" id="cggp">kanban</a>) &#8211; signaling system to trigger action based on actual needs</li>
<li>  control mechanisms, check and balances, audit, risk management (e.g. iterations)</li>
</ul>
<p><u>zone of responsibility </u></p>
<ul>
<li>clear areas of responsibility &#8211; what is included and what is not</li>
<li>balance of responsibility and authority &#8211; adequate authority to accomplish goals; restrictions to avoid damage</li>
<li>  <a href="http://en.wikipedia.org/wiki/Rules_of_engagement" title="rules of engagements" id="gyw1">rules of engagements</a>  &#8211; when, where, and how force (bold actions) shall be used</li>
<li>  match confidence with responsibilities &#8211; an individual is prepared and ready for the new responsibilities</li>
</ul>
<p><u>standards</u></p>
<ul>
<li>  safety regulations &#8211; mandatory rules for everyone</li>
<li>professional standards &#8211; recommended parameters of work and products (security, performance, availability, etc.)</li>
<li>best practices &#8211; spread approaches that work</li>
</ul>
<p><img src="http://www.softwarecreation.org/images/2009/expertise-icon.gif" style="width: 20px; height: 20px; float: left; margin-left: 0pt; margin-right: 1em" /><strong>Expertise</strong><br />
goal: <em>make people knowledgeable, experienced and growing based on their talents</em></p>
<p><u>career</u></p>
<ul>
<li><a href="http://softwarecreation.org/2007/how-to-be-happy-at-work-short-tutorial/" title="right career path" id="ypa_">right career path</a> &#8211; built on persons strengths &#8211; enable growth in area of competence and natural strengths without switching into paths that don&#8217;t match talents (e.g. management). Avoid consequences of raising to the level of incompetence (<a href="http://en.wikipedia.org/wiki/Peter_Principle" title="Peter Principle" id="hviz">Peter Principle</a>).</li>
<li>broadbanding &#8211; build levels of achievements and pay schemes that allow to achieve and earn more within the same profession</li>
<li>  match expertise and challenges- keep people always interested and challenged, avoid boring or over complicated tasks</li>
<li>assist self-discovery &#8211; help search for the better career and role</li>
</ul>
<p><u>perspective</u></p>
<ul>
<li>  diversity in tasks and activities &#8211; accelerates growth and understanding</li>
<li>  big picture, direct communication with customer &#8211; informed people make more optimal decisions</li>
<li>exposure to different subject areas &#8211; broader knowledge opens new possibilities and solutions outside the narrow specialization</li>
</ul>
<p><u>learning and practice</u></p>
<ul>
<li>  feedback loop &#8211; continuous evaluation and improvements based on feedback</li>
<li>opportunities for learning &#8211; grow expertise beside direct work tasks</li>
<li>sharing, coaching, communication &#8211; peer and experts access and support for growth</li>
</ul>
<p>There is no standard way to increase performance of an individual programmer. Each individual is unique and requires personal approach. The theory of Three Dimensions of a Software Programmer suggests framework for these approaches.<br />
It takes a huge effort to understand every programmer in your team individually and craft personalized approach, path and conditions. But it makes sense to do. <strong>People will be productive, engaged and happy. The company will grow and succeed.</strong></p>
<p>What could be a better outcome in our civilized hard working world?</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=84&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://softwarecreation.org/2009/three-dimensions-of-a-software-programmer-how-to-get-things-done/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>How to Become an Expert. Top 7 Qualities</title>
		<link>http://softwarecreation.org/2009/how-to-become-an-expert-top-7-qualities/</link>
		<comments>http://softwarecreation.org/2009/how-to-become-an-expert-top-7-qualities/#comments</comments>
		<pubDate>Tue, 07 Apr 2009 04:43:23 +0000</pubDate>
		<dc:creator>Andriy Solovey</dc:creator>
				<category><![CDATA[Expertise]]></category>
		<category><![CDATA[People]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Skills]]></category>

		<guid isPermaLink="false">http://softwarecreation.org/2009/how-to-become-an-expert-top-7-qualities/</guid>
		<description><![CDATA[ShareExperts do not need rules to make decisions. They have qualities that allow them to consistently make good decisions and show high level of performance under different circumstances without any rules. This post discusses these core qualities that turn a novice into an expert.

Definitions
rule: prescribed guide for conduct or action
intuition: instinctive knowing (without the use [...]]]></description>
			<content:encoded><![CDATA[<div class='dd_post_share'><div class='dd_buttons'><div class='dd_button'><iframe src='http://api.tweetmeme.com/button.js?url=http://softwarecreation.org/2009/how-to-become-an-expert-top-7-qualities/&source=AndriySolovey&service=&service_api=&style=compact' height='20' width='90' frameborder='0' scrolling='no'></iframe></div><div class='dd_button'><a name='fb_share' type='button_count' share_url='http://softwarecreation.org/2009/how-to-become-an-expert-top-7-qualities/' href='http://www.facebook.com/sharer.php'>Share</a><script src='http://static.ak.fbcdn.net/connect.php/js/FB.Share' type='text/javascript'></script></div><div class='dd_button'><script src='http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://softwarecreation.org/2009/how-to-become-an-expert-top-7-qualities/'></script></div><div class='dd_button'><a title='Post on Google Buzz' class='google-buzz-button' href='http://www.google.com/buzz/post' data-button-style='small-count' data-url='http://softwarecreation.org/2009/how-to-become-an-expert-top-7-qualities/'></a><script type='text/javascript' src='http://www.google.com/buzz/api/button.js'></script></div><div class='dd_button'><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http://softwarecreation.org/2009/how-to-become-an-expert-top-7-qualities/&amp;title=How+to+Become+an+Expert.+Top+7+Qualities&amp;t=2' height='18' width='120' frameborder='0' scrolling='no'></iframe></div></div></div><div style='clear:both'></div><p>Experts do not need rules to make decisions. They have qualities that allow them to consistently make good decisions and show high level of performance under different circumstances without any rules. This post discusses these core qualities that turn a novice into an expert.</p>
<p><img src="http://softwarecreation.org/images/2009/novice-expert.jpg" /></p>
<p><strong>Definitions</strong><br />
<strong>rule:</strong> prescribed guide for conduct or action<br />
<strong>intuition:</strong> instinctive knowing (without the use of rational processes)<br />
<strong><a href="http://en.wikipedia.org/wiki/Tacit_knowledge" title="tacit knowledge" id="v:.:">tacit knowledge</a>:</strong> automatic, unexpressed knowledge that provides context for people, places, ideas, and experiences. Tacit knowledge is not easily shared. As Polanyi said: &#8220;We know more than we can tell.&#8221;<br />
<strong>context</strong>: the set of circumstances or facts that surround a particular event, situation, etc.</p>
<h3>Problems with rules</h3>
<p>Most rules didn&#8217;t come from heaven. They come from ordinary people. They are product of <strong>practice, theories, traditions and fear</strong>.<br />
Problems:</p>
<ul>
<li><strong>context-free</strong> &#8211; rules reflect standard situations without considering your specific circumstances</li>
<li><strong>limited verification</strong> &#8211; most rules are empirical and do not pass vigorous analysis, strict prove and experiments</li>
<li><strong>time sensitive</strong> &#8211; many rules become outdated quickly in dynamic professions, industries and societies</li>
<li><strong>overcautious</strong> &#8211; fear fuels many rules and seeks to protect from the worst scenario, often imaginable</li>
<li><strong>low skills denominator</strong> &#8211; rules tuned to match capabilities of the majority without accounting for individual strengths and weaknesses</li>
<li><strong>misinterpretation</strong> &#8211; tacit knowledge of experts, which forms base for many rules, is <a href="http://en.wikipedia.org/wiki/Tacit_knowledge" title="difficult to transfer" id="ntk5">difficult to transfer</a> in correct and understandable form</li>
</ul>
<p><span id="more-82"></span></p>
<h3>Core 7 Qualities of the Expert</h3>
<p><strong>1. </strong><strong>Motivation. </strong><strong>Believe in self. Energy. Unsatisfaction</strong><br />
<em>Motivation appears to be a more important factor than innate ability in the development of expertise.</em><em> &#8211; </em><a href="http://www.sciam.com/article.cfm?id=the-expert-mind" id="vu87" title="Scientific American">Scientific American</a></p>
<p>You have to believe in self to become a successful expert. An expert need strength, energy and motivation to go beyond ordinary performance levels.<br />
Top performers in different disciplines do this &#8211; envision own success and prepare their minds to achieve higher levels. Thinking <a href="http://www.amazon.com/gp/product/0345472322?ie=UTF8&amp;tag=softwcreatmys-20&amp;linkCode=xm2&amp;camp=1789&amp;creativeASIN=0345472322" title="can " id="fziu">can &#8220;wire&#8221;</a>  our brains for developing new capabilities and success.<br />
<strong>Questions:</strong> Am I ready? How can I boost my strength, energy and motivation? How will I succeed?</p>
<p><strong> 2. Hard Work. Discipline. Focus.</strong><br />
<em> The differences between expert performers and normal adults reflect a life-long period of deliberate effort to improve performance in a specific domain.</em> &#8211; <a href="http://projects.ict.usc.edu/itw/gel/EricssonDeliberatePracticePR93.pdf" id="pxqg" title="Anders Ericsson">Anders Ericsson</a></p>
<p>Hard work is not as difficult after you start and dive into it. Often the problem is that you cannot start or concentrate. Procrastination ruins your progress. There are many barriers for focused and productive work:</p>
<ul>
<li><strong>pressure and stress</strong> kills productivity</li>
<li><strong>low interest</strong> &#8211; without engaged mind your brain will resist to form knowledge</li>
<li><strong>multitasking</strong> &#8211; takes away precious concentration and mindset needed for productive work</li>
<li><strong>unclear goals</strong> &#8211; disoriented mind cannot focus effectively</li>
<li><strong>no specific time</strong>  &#8211; you will tend to postpone, delay and miss practice without strictly scheduled time</li>
<li><strong>distractions</strong> &#8211; inconvenient  environment and frequent interruptions don&#8217;t help</li>
</ul>
<p>New Scientist had an advice <a href="http://www.newscientist.com/article/mg19926732.000-the-origins-of-willpower.html?page=3" title="how to get a grip on yourself" id="we5g">how to get a grip on yourself</a> and strengthen willpower. The main ideas &#8211; willpower is limited resource, easily depleted; it requires planning, boost and  practice.</p>
<p>Also, keep yourself interested. Switch if you start loosing focus and interest. Reboot. Have prepared practices in different areas to enable fresh start for your mind.<br />
<strong>Questions:  </strong>How do I maintain focus, stay committed and interested? Do I have clear goals, action plan and productive environment?</p>
<p><strong>3. Think critically. Think as a beginner</strong><br />
<em>In the beginner&#8217;s mind there are many possibilities, but int the expert there are few</em> &#8211; Suzuki Roshi</p>
<p>As an expert you cannot go with the flow, believe everything and hide behind authoritative opinions. You cannot stick with your own views forever without changing them. You have to think critically: challenge beliefs, existing theories and dominant ideas. Some of them are completely wrong. Many of them have flaws and can be improved. Most of them are not the best in your specific context.<br />
<a href="http://en.wikipedia.org/wiki/5_Whys" id="dzy-" title="5 Whys">5 Whys</a> is an excellent method to discover reality.<br />
Better unforeseen solutions exist if you look for them. If you don&#8217;t think critically, you will be a follower without much chances to grow your ideas and find better solutions. Keep your mind open and question ideas including your own.<br />
<strong>Questions:</strong>  What are hard facts, assumptions and theories? What should I trust, dismiss or verify?</p>
<p><strong>4. Full brain power. Use right brain </strong>(in addition to left).<br />
<em>The right hemisphere synthesizes over space. The left analyzes over time.</em> &#8211; Jerre Levy</p>
<p>Your right brain (more accurately &#8211; right brain mode) is inherited from our animal ancestors and shaped by millions years of evolution. Right brain mode is much more powerful, reliable and faster than left brain mode. Right brain works in parallel with images, subconscious mind and deep vast memory (even when you sleep). On the contrary, left brain works with symbols and words; it is logical, analytical and linear. It can only work with few ideas in the same time (4-7) and needs focus and conscious effort. We need left brain to formulate, express ideas and communicate them to others.<br />
Experts are using both brains &#8211; <strong>left </strong>for rational thinking, analysis and communication, <strong>right </strong>for intuition, imagination and creative insights. One of the best books how to start using you right brain is <a href="http://www.amazon.com/gp/product/0874774241?ie=UTF8&amp;tag=softwcreatmys-20&amp;linkCode=xm2&amp;camp=1789&amp;creativeASIN=0874774241" title="The New Drawing on the Right Side of the Brain" id="mnuy">The New Drawing on the Right Side of the Brain</a>.<br />
Learn how to expand your brain power with the right brain mode. If you use only left brain mode, you&#8217;ll stay dull, rational and predictable specialist.<br />
<strong>Questions:</strong> How can I engage my both brain modes? (Hint: interest, humor, senses, emotions, surprise.) What puzzles can I feed to my subconscious mind?</p>
<p><strong>5. Continuous learning. Sharing</strong><br />
<em>The real voyage of discovery consists not in seeking new landscapes but in having new eyes.</em> &#8211; Marcel Proust</p>
<p>Experts never stop to learn. The day you believe you know everything is your last day as an expert. Experts learn from new research and existing knowledge, they learn from other people and they learn from own experience. Also they learn from disciplines outside of their professional realm that can provide new ideas.<br />
For a example, a programmer could benefit from learning:</p>
<ul>
<li>  <strong>psychology</strong> &#8211; better understand how users think and perceive, how to engage customers, how to make yourself and team productive and motivated;</li>
<li>  <strong>design, aesthetics, art</strong> &#8211; beautiful systems are more usable and successfu<strong>l<br />
</strong></li>
<li><strong>  management theories and practices</strong> &#8211; learn how to organize people and activities  (for example Agile learned a lot from <a href="http://www.informit.com/articles/article.aspx?p=664147&amp;seqNum=4" title="Toyota Production System" id="m_id">Toyota Production System</a> and <a href="http://jeffsutherland.com/scrum/2009/01/roots-of-scrum-takeuchi-and-nonaka.html" title="Japanese product development" id="dk:o">Japanese product development</a>)</li>
<li>  <strong>system theories</strong> &#8211; understand fundamental principles and laws governing complex systems</li>
<li>  <strong>economics, business</strong> &#8211; why people and business need software, how software fails or succeed on market; how your software fits into company business; how to start your own company</li>
<li>  <strong>culture, social life, demographics</strong> &#8211; trends in behavior, interest and problems of groups of people (by sex, age, education, profession, etc). This knowledge will explain current dynamic and suggest future opportunities.</li>
</ul>
<p>Make learning essential part of your everyday life. If you don&#8217;t learn, you stop your journey to become an expert.<br />
You gain deeper knowledge if you <strong>share </strong>your knowledge with other people &#8211; <strong>discuss, explain, teach, blog, speak, present</strong>. Other people &#8211; with different views and perspective &#8211; will quickly show weaknesses and quality of your knowledge. Sharing with others will push your learning further and deeper than keeping knowledge to yourself.</p>
<p><strong>Questions:</strong> What do I not know? How will I learn it? How will I share it?</p>
<p><strong>6. Self-improvement</strong>.<strong> Know yourself. </strong><br />
<em>Why do you see the speck in your brother&#8217;s eye but fail to notice the beam in your own eye?<span class="body"></span></em><span class="body"> &#8211; </span>Matthew</p>
<p>We protect ourselves from inconvenient truth and often are blind to own mistakes. Our psychological defense systems help to avoid depression and anxiety by protecting our ego, but also distort our view and perception of true reality.<br />
Good experts are capable to see truth, be objective and correct themselves. They try to avoid the trap of groupthink, crowd psychology and self white washing.  They know own strengths, weaknesses and biases.<br />
Seek  the truth about self, know your internal beliefs and motivation and improve yourself. Otherwise, your rosy distorted pictures will hinder your growth and you will become the part of a problem, not the part of a solution.<br />
<strong>Questions:</strong> What can I do better? How can I improve myself? Am I honest with myself?</p>
<p><strong>7. Big picture. Systems Thinking. Creative solutions.</strong><br />
<em><span class="body">Opportunity ideas do not lie around waiting to be discovered. Such ideas need to be produced</span></em><span class="body"><em>.</em> &#8211; </span>Edward de Bono</p>
<p>Experts main advantages are tacit knowledge and experience. They understand big picture, reality, context and how systems work. However, it is not enough. <strong>Experts should solve problems</strong>. And therefore, they should train themselves for problem solving, innovation and changing reality in the novel ways. The outcome, a creative solution,  is quintessence of hard work, deep knowledge and intuition.<br />
<strong>Questions:  </strong>What is the big picture: forces, players and relations? How things can be done better? Do I see new ways?</p>
<h3>Questions to Ask Yourself</h3>
<ol>
<li><strong>Motivation</strong> &#8211; Am I ready? How can I boost my strength, energy and motivation? How will I succeed?</li>
<li><strong>Focus</strong> &#8211; How do I maintain focus, stay committed and interested? Do I have clear goals, action plan and productive environment?</li>
<li><strong>Critical thinking</strong> &#8211; What are hard facts, assumptions and theories? What should I trust, dismiss or verify?</li>
<li><strong>Full </strong><strong>Brain power</strong> &#8211; How can I engage my both brain modes? What puzzles can I feed to my subconscious mind?</li>
<li><strong>Continuous Learning</strong> &#8211; What do I not know? How will I learn it? How will I share it?</li>
<li><strong>Self Improvement</strong> &#8211; What can I do better? How can I improve myself? Am I honest with myself?</li>
<li><strong>Creative solutions</strong> &#8211; What is the big picture: forces, players and relations? How things can be done better? Do I see new ways?</li>
</ol>
<p>If you know answers to these questions, you don&#8217;t need rules to solve problems &#8211; you are ready to make good decisions and become an expert.</p>
<p><strong>References:</strong><br />
<a href="http://en.wikipedia.org/wiki/Dreyfus_model_of_skill_acquisition" title="Dreyfus Model of Skill Acquisition" id="kr4d">Dreyfus Model of Skill Acquisition</a> , Wikipedia<br />
<a href="http://www.time.com/time/health/article/0,8599,1717927-1,00.html" title="The Science of Experience" id="pyn3">The Science of Experience</a>, by John Cloud/Tallahassee, TIME<br />
<a href="http://www.amazon.com/gp/product/1934356050?ie=UTF8&amp;tag=softwcreatmys-20&amp;linkCode=xm2&amp;camp=1789&amp;creativeASIN=1934356050" title="Pragmatic Thinking and Learning: Refactor Your Wetware" id="n9_c">Pragmatic Thinking and Learning: Refactor Your Wetware</a>, by Andy Hunt<br />
<a href="http://www.amazon.com/gp/product/0874774241?ie=UTF8&amp;tag=softwcreatmys-20&amp;linkCode=xm2&amp;camp=1789&amp;creativeASIN=0874774241" title="The New Drawing on the Right Side of the Brain" id="mnuy">The New Drawing on the Right Side of the Brain</a>, by Betty Edwards<br />
<a href="http://www.sciam.com/article.cfm?id=the-expert-mind" title="The Expert Mind">The Expert Mind</a> , Scientific American<br />
<a href="http://projects.ict.usc.edu/itw/gel/EricssonDeliberatePracticePR93.pdf" title="The Role of Deliberate Practice in the Acquisition of Expert Performance">The Role of Deliberate Practice in the Acquisition of Expert Performance</a>, K. Anders Ericsson, Ralf Th. Krampe, and Clemens Tesch-Romer</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=82&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://softwarecreation.org/2009/how-to-become-an-expert-top-7-qualities/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>How to Become an Expert. The Effective Way.</title>
		<link>http://softwarecreation.org/2009/how-to-become-an-expert-the-effective-way/</link>
		<comments>http://softwarecreation.org/2009/how-to-become-an-expert-the-effective-way/#comments</comments>
		<pubDate>Sun, 15 Mar 2009 22:09:28 +0000</pubDate>
		<dc:creator>Andriy Solovey</dc:creator>
				<category><![CDATA[Expertise]]></category>
		<category><![CDATA[Job]]></category>
		<category><![CDATA[Practices]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Skills]]></category>

		<guid isPermaLink="false">http://softwarecreation.org/2009/how-to-become-an-expert-the-effective-way/</guid>
		<description><![CDATA[Shareexperts are made, not born &#8211; Scientific American
  Disclaimer: This post is devoted to a person who wants to become an expert &#8211; the top player in a specific field as programming, soccer or chess. This post will be not interesting for people who are satisfied with their current performance and not interested to [...]]]></description>
			<content:encoded><![CDATA[<div class='dd_post_share'><div class='dd_buttons'><div class='dd_button'><iframe src='http://api.tweetmeme.com/button.js?url=http://softwarecreation.org/2009/how-to-become-an-expert-the-effective-way/&source=AndriySolovey&service=&service_api=&style=compact' height='20' width='90' frameborder='0' scrolling='no'></iframe></div><div class='dd_button'><a name='fb_share' type='button_count' share_url='http://softwarecreation.org/2009/how-to-become-an-expert-the-effective-way/' href='http://www.facebook.com/sharer.php'>Share</a><script src='http://static.ak.fbcdn.net/connect.php/js/FB.Share' type='text/javascript'></script></div><div class='dd_button'><script src='http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://softwarecreation.org/2009/how-to-become-an-expert-the-effective-way/'></script></div><div class='dd_button'><a title='Post on Google Buzz' class='google-buzz-button' href='http://www.google.com/buzz/post' data-button-style='small-count' data-url='http://softwarecreation.org/2009/how-to-become-an-expert-the-effective-way/'></a><script type='text/javascript' src='http://www.google.com/buzz/api/button.js'></script></div><div class='dd_button'><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http://softwarecreation.org/2009/how-to-become-an-expert-the-effective-way/&amp;title=How+to+Become+an+Expert.+The+Effective+Way.&amp;t=2' height='18' width='120' frameborder='0' scrolling='no'></iframe></div></div></div><div style='clear:both'></div><p><em>experts are made, not born &#8211; </em><a href="http://www.sciam.com/article.cfm?id=the-expert-mind" id="vu87" title="Scientific American">Scientific American</a></p>
<p><small>  <strong>Disclaimer:</strong> This post is devoted to a person who wants to become an expert &#8211; the top player in a specific field as programming, soccer or chess. This post will be not interesting for people who are satisfied with their current performance and not interested to be the best. </small></p>
<p><img src="http://softwarecreation.org/images/2009/kasparov.jpg" /></p>
<p>If you want to become an expert, it is not enough to follow your work assignments or occasionally play with interesting stuff at home. You have to push yourself hard in specially designed way.</p>
<p><strong>@Work</strong><br />
Your paid work tasks and projects are not designed to make you an expert. Your company expects results from your work: reliable, with minimal mistakes and focused on the company main goal &#8211; make money. Your employer could provide minimal training to help you with job requirements. However, your growth will be constrained by company needs, timelines, work assignments and acceptable methods. We cannot blame our organizations &#8211; this is part of the deal &#8211; they pay for your work and expect specific results. But&#8230; is this the best way for you to become an expert, acquire new skills and gain knowledge? To become an expert, you have to make many mistakes, learn from them, experiment with alternatives and work hard on your weaknesses. How many organizations do allow this risky, unproductive and unreliable way of working?</p>
<p><strong>@Home</strong><br />
Your play at home with interesting stuff has problems too. To satisfy your programming instincts and curiosity, you will probably select what you enjoy to do and eager to try. You&#8217;ll immense in this activity and find great satisfaction from doing it. But&#8230;  is this the best way to become an expert by doing only what you like? Becoming an expert requires hard, sometimes unpleasant work, specifically designed to improve your performance and push you over comfort zone. <span id="more-81"></span></p>
<h3><strong>Genesis of an expert</strong></h3>
<p><img src="http://softwarecreation.org/images/2009/kasparovyoung.jpg" /></p>
<p>Research shows that experts <a href="http://projects.ict.usc.edu/itw/gel/EricssonDeliberatePracticePR93.pdf">do not have more innate talent</a>, but put more effort and dedication. Newcomers to the field <a href="http://www.time.com/time/health/article/0,8599,1717927,00.html" id="ipzg">need at least 10 years</a> to become an expert. They move through <a href="http://en.wikipedia.org/wiki/Dreyfus_model_of_skill_acquisition" title="several stages" id="ur5d">several stages</a>: from a novice, who blindly follows rules, to an expert, who does not need rules.<br />
Most people will stop on the level of competent specialist acceptable for the majority of jobs in the field. Only few will continue pushing forward to achieve the top level.</p>
<blockquote><p>  <em>We agree that expert performance is qualitatively different from normal performance and even that expert performers have characteristics and abilities that are qualitatively different from or at least outside the range of those of normal adults. However, we deny that these differences are immutable, that is, due to innate talent. Only a few exceptions, most notably height, are genetically prescribed. Instead, we argue that the differences between expert performers and normal adults reflect a life-long period of deliberate effort to improve performance in a specific domain</em>. &#8211; <a href="http://projects.ict.usc.edu/itw/gel/EricssonDeliberatePracticePR93.pdf" id="pxqg" title="Anders Ericsson">Anders Ericsson</a></p></blockquote>
<blockquote><p>  <em>Even the novice engages in effortful study at first, which is why beginners so often improve rapidly in playing golf, say, or in driving a car. But having reached an acceptable performance&#8211;for instance, keeping up with one&#8217;s golf buddies or passing a driver&#8217;s exam&#8211;most people relax. Their performance then becomes automatic and therefore impervious to further improvement. In contrast, experts-in-training keep the lid of their mind&#8217;s box open all the time, so that they can inspect, criticize and augment its contents and thereby approach the standard set by leaders in their fields. </em><em> &#8211; </em><a href="http://www.sciam.com/article.cfm?id=the-expert-mind" id="vu87" title="Scientific American">Scientific American</a></p></blockquote>
<p>Kathy Sierra <a href="http://headrush.typepad.com/creating_passionate_users/2006/03/how_to_be_an_ex.html" id="rwk5" title="wrote">wrote</a> that you, to become an expert who kicks ass, should keep reminding: <em>&#8220;I&#8217;ll keep pushing myself. There&#8217;s always some way to do it better&#8230;&#8221;</em>. How should we push ourselves?</p>
<p>If you do same tasks over and over again, you will not become an expert. If you do what you are good at, you will not improve your overall performance. You should focus on improving skills beyond your present competence. <strong>Outcome of your practice as not as important as developing your capabilities.</strong><br />
You can spend years doing your favorite activities and still stay at amateur level while dedicated novice can quickly leave you behind. <strong>Practice should concentrate around your weaknesses</strong> and areas that are important, but you probably try to avoid. You should repeatedly progress to the higher level through persistent training and overcome your limits.</p>
<p>Anders Ericsson (his research is the most influential in this area) calls this approach <strong>deliberate practice</strong>:</p>
<blockquote><p> &#8220;Deliberate practice is different. It entails considerable, specific, and sustained efforts to do something you can&#8217;t do well-or even at all. Research across domains shows that it is only by working at what you can&#8217;t do that you turn into the expert you want to become.&#8221;</p></blockquote>
<h3>  <strong>Design your practice</strong></h3>
<p><img src="http://softwarecreation.org/images/2009/kasparov1.jpg" /></p>
<p>Follow 7 steps</p>
<p><strong>1. Who is an expert?</strong><br />
You should understand what is the profile of an expert that you want to be &#8211; required capabilities, knowledge, areas of expertise and types of the problems experts work on.<br />
Have a beer with guru and ask for opinion (early enough), study job advertisements for high skilled positions (don&#8217;t be carried away), read about top players &#8211; why they are considered experts, what makes them special (skip part how they spend money) and how they achieved top level.<br />
<strong><br />
2. Find your gaps and weaknesses.</strong><br />
You can identify areas which require improvement once you know the profile of the ideal expert. Put them on the list and assign importance.</p>
<p><strong>3. Build roadmap.</strong><br />
Answer the questions: in what order you want to work on these areas and what are the major steps.<br />
Instead of focusing for a long time on one area, I would recommend to go in spiral &#8211; learn and practice various areas in parallel. Each spiral cycle should add to your experience small, but integral chunk of core expertise. Often developing diverse skills together brings synergy &#8211; deeper perspective, holistic view and increased capabilities for wider range of tasks.</p>
<p><strong>4. Design practice to improve performance </strong><br />
Set specific goals and methods &#8211; how do you improve performance, gain skills and knowledge for each area.<br />
Consider famous <a href="http://en.wikipedia.org/wiki/SMART_%28project_management%29" id="mkny" title="SMART goals">SMART goals</a> for practice: specific, measurable, achievable, relevant, time-boxed. Coach, who can effectively guide you, is very helpful on this stage. However, you can go alone if you are motivated and disciplined enough.<br />
Don&#8217;t burn yourself too much &#8211; your mind and body should be ready and eager to practice. Give yourself time for recovery, life and other favorite activities, otherwise you&#8217;ll soon hate your practice.</p>
<p><strong>5. Everyday practice on the edge of capabilities &#8211; at least 30 minutes</strong><br />
Deliberate practice is highly demanding and requires intensive concentration and focus. The practice should be scheduled, clear and focused &#8211; don&#8217;t give yourself chances to procrastinate. Concentrate on the excellence of execution &#8211; sloppy practice is not acceptable for top players. You should practice challenging tasks on the edge of your capabilities. Compare playing basketball with professional players or beginner kids from the neighborhood. Who will push you more and show how good you are?<br />
Observe and understand how and what you do &#8211; this process will develop intuition and patterns in your brains for future fast automatic decision making. Train yourself to think and act on the higher level &#8211; what is difficult for other people, should be trivial for you.</p>
<p><strong>6. Feedback</strong><br />
Constant feedback loop is the must in deliberate practice. Correct assessment of performance and results with following adjustment of practice will move you much faster. And certainly, interested and qualified coach capable of giving constructive and painful feedback is very important. Each day of practice should move you forward against higher and higher standards.</p>
<p><strong>7. Correct your roadmap and practice.</strong><br />
Feedback, self-evaluation and practical use of your skills will tell if you are on the right track. Be fluid and open for change of direction, new knowledge and unexpected opportunities. Learn and adjust goals, plans and methods on the go. As Eisenhower said: plans are nothing, planning is everything. Your rise as an expert will open for you new horizons that definitely change your plans and original intentions.</p>
<p>Additional Requirements</p>
<ul>
<li> <strong>Discipline, motivation, unsatisfaction</strong> &#8211; top experts are extremely dedicated, disciplined and motivated to grow and improve performance. Without the goal of improving performance, the motivation to engage in practice vanishes, and practice becomes boring routine.</li>
<li> <strong>Support</strong> &#8211; you&#8217;ll have ups and downs, moments of despair and disbelief. You need somebody who can understand, compassionate and encourage &#8211; friends, family, colleagues or a coach.</li>
</ul>
<h3>Deliberate practice in context</h3>
<p><img src="http://softwarecreation.org/images/2009/karpov-kasparov1987.jpg" /></p>
<p><strong>Practice @Work</strong><br />
Deliberate practice methods and work objectives are different. However, it is possible to grow as an expert and work productively.</p>
<ul>
<li> First, your company could have work in target areas of your expertise growth. Position yourself to take advantage of any opportunity to move there.</li>
<li> Second, any company will benefit from motivated and competent player, who wants to grow his capabilities. A smart company will support and encourage your drive&#8230; and use for own benefits.</li>
</ul>
<p>Strategy:</p>
<ol>
<li>  <strong>Job intelligence</strong> &#8211; what are opportunities, potential projects and tasks to assist with your progress as an expert? How can your help your company while upgrading your skills? Invent new opportunities. You have to build case for your advance and show benefits for the company.</li>
<li>  <strong>Call for the job redesign</strong> &#8211; many companies will be flexible for people who wants to progress and contribute more (if no, maybe you are in the wrong place)</li>
<li>  <strong>Productive work and intensive practice</strong> &#8211; work in the best way to help with your goals, but don&#8217;t make a company victim of your practice. Separate prototyping and experiments from production work. Make them open, controllable with a clear statement of benefits. Seek for challenging assignments on the edge of your capabilities.</li>
<li>  <strong>Tap into company pool of talents, expertise and knowledge</strong> &#8211; this is free (actually paid) opportunity to use coaching and valuable resources for growth acceleration. Ask for advises, guidance and feedback.</li>
</ol>
<p>You will find, as your star is rising (expertise growing), that you have more freedom to work in areas that have the most interest for you.</p>
<p><strong>Practice @Home, @Train or @Cafe</strong><br />
This is time for</p>
<ul>
<li>  research, learning, thinking</li>
<li>  crazy experiments</li>
<li>  irrelevant to your work practice</li>
<li>  practice that need special focus, time and conditions, difficult to achieve at work</li>
</ul>
<p><strong>Formal training</strong><br />
Qualified and relevant training can move you much faster. If you decide to invest in education be very specific what you expect and make sure that you&#8217;ll not waste your time.</p>
<p><strong>Sample Road to become Web Development Expert<br />
</strong>You can identify few key areas<strong>:<br />
</strong></p>
<ul>
<li>HTML / CSS</li>
<li>Graphic Design / Art</li>
<li>Usability / Aesthetics</li>
<li>Information Architecture</li>
<li>Client &#8211; side programming / javascript / AJAX</li>
<li>RIA (e.g. Silverlight / Flash)</li>
<li>Server &#8211; side programming and databases</li>
</ul>
<p>And design practice for each of them, for example:</p>
<table border="1" cellpadding="3" cellspacing="0">
<tr>
<td><strong>Area</strong></td>
<td><strong>Strategic Importance<br />
(or why I need this)</strong></td>
<td><strong>Expertise Gaps</strong></td>
<td><strong>Practice / Learning Goals</strong></td>
<td><strong>Actions</strong></td>
</tr>
<tr>
<td>HTML/CSS</td>
<td>core for building web sites</td>
<td>lack of experience with advanced css and layouts</td>
<td>master css, be comfortable with building any complex layouts</td>
<td>phase 1:<br />
<strong>@work</strong>:</p>
<ul>
<li>build myself CSS for assignments at work</li>
<li>seek guidance of senior web designer</li>
<li>learn company&#8217;s best practices</li>
</ul>
<p><strong>@home</strong>:</p>
<ul>
<li>learn advanced online css guides</li>
<li>read CSS Mastery book</li>
<li>absorb leading composition styles</li>
<li>dissect <a href="http://www.csszengarden.com/" title="CSS Zen Garden" id="df5.">CSS Zen Garden</a> designs</li>
<li>find interesting designs and build complex CSS layouts for them, make them better</li>
</ul>
</td>
</tr>
</table>
<h3><strong>Experts: Executive Summary</strong></h3>
<p>Experts are essential for the company/team competitive advantage. They <a href="http://softwarecreation.org/2008/ideas-in-software-development-revolution-vs-evolution-part-1" title="enable revolutions and support evolution" id="fu6g">enable revolutions and support evolution</a>.</p>
<p>Experts are made, not born.<strong> Experts are made by themselves.</strong> It is a long, thorny and hard road. But this road makes their life interesting, positive, meaningful and brings <a href="http://softwarecreation.org/2008/the-happiness-programmers-edition/" title="happiness" id="r8q4">happiness</a> from achieving a rare gift &#8211; mastery in the field they love.</p>
<p>Albert Camus said: <strong id="wn530">But what is happiness except the simple harmony between a man and the life he leads?</strong></p>
<p>For few people the harmony is a journey to become The Master.</p>
<p><img src="http://softwarecreation.org/images/2009/kasparov-happy.jpg" /></p>
<p><strong>Resources:</strong><br />
<a href="http://www.sciam.com/article.cfm?id=the-expert-mind" title="The Expert Mind">The Expert Mind</a> , Scientific American<br />
<a href="http://headrush.typepad.com/creating_passionate_users/2006/03/how_to_be_an_ex.html" title="How to be an expert">How to be an expert</a> , Kathy Sierra<br />
<a href="http://projects.ict.usc.edu/itw/gel/EricssonDeliberatePracticePR93.pdf" title="The Role of Deliberate Practice in the Acquisition of Expert Performance">The Role of Deliberate Practice in the Acquisition of Expert Performance</a>, K. Anders Ericsson, Ralf Th. Krampe, and Clemens Tesch-Romer</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=81&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://softwarecreation.org/2009/how-to-become-an-expert-the-effective-way/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>The Elements of Pragmatic Programming Style. Composition.</title>
		<link>http://softwarecreation.org/2009/the-elements-of-pragmatic-programming-style-composition/</link>
		<comments>http://softwarecreation.org/2009/the-elements-of-pragmatic-programming-style-composition/#comments</comments>
		<pubDate>Mon, 19 Jan 2009 02:25:56 +0000</pubDate>
		<dc:creator>Andriy Solovey</dc:creator>
				<category><![CDATA[Concepts]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Practices]]></category>
		<category><![CDATA[Process]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Skills]]></category>

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

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


Style Components:

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

        {

            SqlCommand cmd = conn.CreateCommand();

            cmd.CommandType = CommandType.StoredProcedure;

            cmd.CommandText = "SearchCustomers";

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

            ... //long list of parameters

            conn.Open();

            try

            {

                using (SqlDataReader reader = cmd.ExecuteReader())

                {

                    foreach (DbDataRecord record in reader)

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

                }

            }

            catch (Exception e)

            {

                //error handling logic here

            }

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

    (SqlCommand cmd) =&gt; {

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

         ...     //long list of parameters

    },

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

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

		<guid isPermaLink="false">http://softwarecreation.org/2008/pair-programming-to-do-or-not-to-do/</guid>
		<description><![CDATA[Share
Pair Programming is a great way to build software systems. When Pair Programming works, it has significant benefits:

better ideas &#8211; continuous brainstorming, larger knowledge pool, less gaps in understanding and more brain power to solve design problems;
better quality &#8211; fewer bugs, instant validation of ideas, consistent approach and stricter adherence to team conventions;
better knowledge &#8211; [...]]]></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/pair-programming-to-do-or-not-to-do/&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/pair-programming-to-do-or-not-to-do/' 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/pair-programming-to-do-or-not-to-do/'></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/pair-programming-to-do-or-not-to-do/'></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/pair-programming-to-do-or-not-to-do/&amp;title=Pair+Programming%3A+To+Do+or+Not+To+Do&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/Cirque_du_Soleil.jpg" /></p>
<p>Pair Programming is a great way to build software systems. When Pair Programming works, it has significant benefits:</p>
<ul>
<li><strong>better ideas</strong> &#8211; continuous brainstorming, larger knowledge pool, less gaps in understanding and more brain power to solve design problems;</li>
<li><strong>better quality</strong> &#8211; fewer bugs, instant validation of ideas, consistent approach and stricter adherence to team conventions;</li>
<li><strong>better knowledge</strong> &#8211; experience and knowledge sharing, deeper understanding of <em>why</em>, <em>how </em>and<em> what </em>was done;</li>
<li><strong>increased productivity</strong> &#8211; better focus and higher intensity, pushing each other and motivating to achieve best results, less procrastination and wasting of time;</li>
<li><strong>more enjoyment</strong> &#8211; most people like to work in groups and solve together interesting problems.</li>
</ul>
<p>Extreme Programming leaders <a href="http://www.xprogramming.com/Practices/PracPairs.html" title="insist" id="kj93">insist</a> that all significant development should be done in pairs. But can we say that Pair Programming is the best method in all situations?</p>
<p><span id="more-78"></span></p>
<p>Programmers can find plausible alternatives to Pair Programming that don&#8217;t require two people sitting together all the time:</p>
<ul>
<li><strong>ideas </strong>- frequent team brainstorming combined with short pair (or team) programming sessions for the most complex tasks;</li>
<li><strong>quality </strong>- dedicated tester closely works with developers, writing together automated tests;</li>
<li><strong>knowledge </strong>- frequent discussions, code reviews, training sessions;</li>
<li><strong>productivity </strong>- clear <a href="http://softwarecreation.org/2008/the-elements-of-pragmatic-programming-style-intention/" title="intent" id="c6-i">intent</a> and pragmatic <a href="http://softwarecreation.org/2008/the-elements-of-pragmatic-programming-style-approach/" title="approach" id="s5h-">approach</a> that bring focus, clarity and efficiency;</li>
<li><strong>enjoyment </strong>- close cooperation and mutual support</li>
</ul>
<p>When Pair Programming is the most effective method?</p>
<p id="vzb0" style="padding: 1em 0pt; text-align: left"><img src="http://softwarecreation.org/images/2008/when-pair-program.jpg" /><br />
The most important factor is match of skills and challenges. In Solo Programming the most productive mode is <a href="http://softwarecreation.org/2007/how-to-be-happy-at-work-short-tutorial/" title="Flow" id="xsil">Flow</a> when skills and challenges are matched. Pair Programming adds one more effective mode &#8211; Coaching that increases overall team productivity for the present and future tasks.</p>
<p id="vzb0" style="padding: 1em 0pt; text-align: left">
<strong>Successful modes</strong><br />
1. <strong>Flow</strong> &#8211; two programmers work on the interesting and challenging problem. They can have different skills and challenges, but both are capable to find good solution. For example, one can be javascript expert, another super backend programmer. They can get in flow working together on complex AJAX task combining their brainpower, knowledge and experience to create the best solution.<br />
2. <strong>Coaching</strong> &#8211; expert programmer have experience and knowledge for solving the problem and shares it with other programmer, who cannot effectively solve problem alone. This more junior programmer has fundamentals to understand the solution and implementation. He learns and grows to become better programmer.</p>
<p><strong>Failure modes</strong><br />
3. <strong>Wasting expert time</strong> &#8211; the problem is too simple that makes involvement of expert ineffective even for coaching<br />
4. <strong>Overwhelmed novice</strong> &#8211; the problem is too complex or requires too much new knowledge that prevents the programmer from learning anything useful</p>
<p><strong>Questionable modes</strong><br />
5. <strong>Two experts for a manageable task</strong> &#8211; pair programming doesn&#8217;t have much benefits if both programmers know how to implement the task and successfully solved similar problems before.<br />
6. <strong>One programmer is in Flow, other is Learning</strong> &#8211; it is difficult to stay in Flow if other programmer frequently interrupts and needs many explanation for basic things that are not directly related to challenging problem.<br />
7. <strong>One programmer is in Flow, other is Coaching</strong> &#8211; to make this mode successful for the growth, the coach should be open minded, avoid directing too much and should give opportunity for another programmer to come up with own (maybe even better) solutions.</p>
<p>In addition, psychological problems could prevent successful pair programming:</p>
<ul>
<li><strong>Intimidation by expert</strong> &#8211; one programmer is intimidated by superior skills of other programmer and afraid to be considered as incapable</li>
<li><strong>Need time to think</strong> &#8211; a programmer needs more time to think over before pair programming, but he is forced to start pair programming session before thinking over his ideas</li>
<li><strong>Prefer to work alone</strong> &#8211; an introvert programmer likes to work alone (<a href="http://weblogs.java.net/blog/kathysierra/archive/2004/03/pair_programmin.html" title="loner" id="by7b">loner</a>).</li>
<li><strong>Personal antipathy</strong> &#8211; programmers don&#8217;t like each other</li>
</ul>
<p><strong>Can we make Pair Programming always effective?</strong><br />
Yes! Match tasks, skills and pairs. Try to find pairs for 2 productive modes  &#8211; Flow and Coaching. A team will be most productive if the programmers pair solves together interesting problems matching their skills and learn from each other.</p>
<p>However, Pair Programming should be <a href="http://weblogs.java.net/blog/kathysierra/archive/2004/03/pair_programmin.html" title="a free choice" id="dvmx">a free choice</a> and preferred method, but it should not be a forced mandatory practice. As you can see from this post, there are some modes and psychological situations when Pair Programming is not working well.</p>
<p>In short, Pair Programming is one of the most useful tools in arsenal of the software team. Know when and how to use it.</p>
<p><strong>Inspiring resource</strong>: <a href="http://www.amazon.com/gp/product/0060920432/104-2883280-1296732?ie=UTF8&amp;tag=softwcreatmys-20&amp;linkCode=xm2&amp;camp=1789&amp;creativeASIN=0060920432" title="Flow" id="lvhs">Flow</a>, Mihaly Csikszentmihal</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=78&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://softwarecreation.org/2008/pair-programming-to-do-or-not-to-do/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The Elements of Pragmatic Programming Style. Approach.</title>
		<link>http://softwarecreation.org/2008/the-elements-of-pragmatic-programming-style-approach/</link>
		<comments>http://softwarecreation.org/2008/the-elements-of-pragmatic-programming-style-approach/#comments</comments>
		<pubDate>Wed, 03 Dec 2008 04:01:38 +0000</pubDate>
		<dc:creator>Andriy Solovey</dc:creator>
				<category><![CDATA[Concepts]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Practices]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Skills]]></category>

		<guid isPermaLink="false">http://softwarecreation.org/2008/the-elements-of-pragmatic-programming-style-approach/</guid>
		<description><![CDATA[SharePerfection is achieved, not when there is nothing more to add, but when there is nothing left to take away. &#8211; Antoine De Saint Exupery
The approach to programming is concerned with finding the best ways to translate programmer&#8217;s intention into the good system design and code.

The programming is communication. The programmer continuously add, change and [...]]]></description>
			<content:encoded><![CDATA[<div class='dd_post_share'><div class='dd_buttons'><div class='dd_button'><iframe src='http://api.tweetmeme.com/button.js?url=http://softwarecreation.org/2008/the-elements-of-pragmatic-programming-style-approach/&source=AndriySolovey&service=&service_api=&style=compact' height='20' width='90' frameborder='0' scrolling='no'></iframe></div><div class='dd_button'><a name='fb_share' type='button_count' share_url='http://softwarecreation.org/2008/the-elements-of-pragmatic-programming-style-approach/' href='http://www.facebook.com/sharer.php'>Share</a><script src='http://static.ak.fbcdn.net/connect.php/js/FB.Share' type='text/javascript'></script></div><div class='dd_button'><script src='http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://softwarecreation.org/2008/the-elements-of-pragmatic-programming-style-approach/'></script></div><div class='dd_button'><a title='Post on Google Buzz' class='google-buzz-button' href='http://www.google.com/buzz/post' data-button-style='small-count' data-url='http://softwarecreation.org/2008/the-elements-of-pragmatic-programming-style-approach/'></a><script type='text/javascript' src='http://www.google.com/buzz/api/button.js'></script></div><div class='dd_button'><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http://softwarecreation.org/2008/the-elements-of-pragmatic-programming-style-approach/&amp;title=The+Elements+of+Pragmatic+Programming+Style.+Approach.&amp;t=2' height='18' width='120' frameborder='0' scrolling='no'></iframe></div></div></div><div style='clear:both'></div><p><em>Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away.</em> &#8211; Antoine De Saint Exupery</p>
<p>The approach to programming is concerned with finding the best ways to translate programmer&#8217;s <a href="http://softwarecreation.org/2008/the-elements-of-pragmatic-programming-style-intention/" title="intention" id="pd51">intention</a> into the good system design and code.</p>
<p><img src="http://softwarecreation.org/images/2008/hemingway.jpg" /></p>
<p>The programming is communication. The programmer continuously add, change and refine ideas in the code. Source code has two important goals: <strong>tell a computer what to do </strong>and<strong> tell people what the computer should do</strong>. The program code is the only true medium for storing and communicating ideas about the software system behavior. Quality of the ideas expression in the code directly affects overall quality of the system.</p>
<p>So, what are characteristics of the good code?</p>
<ol>
<li><strong>clear </strong>- easier to work with ideas;</li>
<li><strong>minimal </strong>- less effort to understand and change ideas;</li>
<li><strong>testable </strong>- easier to validate ideas.</li>
</ol>
<p>These are 6 top reasons for bad design and code:</p>
<ol>
<li>lack of expertise</li>
<li>unrestrained technical curiosity and creativity</li>
<li>missing big picture: system purpose and customer goals</li>
<li>blindly following popular methods and over-using technology</li>
<li>sloppiness; lack of attention to details</li>
<li>over-complicating design to have more work or increase job security</li>
</ol>
<p>The programmer can write better code (and avoid most of these problems) by improving programming style and approach.</p>
<p><span id="more-77"></span><strong>Style Components:</strong></p>
<ul>
<li><a href="http://softwarecreation.org/2008/the-elements-of-pragmatic-programming-style-intention/"><strong>Intention </strong></a>- understand your task and how to get it done</li>
<li><strong>Approach </strong>- basic principles of writing code</li>
<li><strong><a href="http://softwarecreation.org/2009/the-elements-of-pragmatic-programming-style-composition/">Composition</a> </strong>- organization of code</li>
<li><strong>Expression </strong>- expressing ideas in code</li>
<li><strong>Object Oriented Pragmatic Style</strong></li>
</ul>
<h3>Approach</h3>
<p>Two most important rules are</p>
<ul>
<li>work from the simplest design</li>
<li>revise and refactor after each task</li>
</ul>
<p><strong>1. Work from the simplest design</strong><br />
The simplest design that solves business needs is the best design. The simplest design is the product of discipline and mastery. The simplest design requires creative thinking &#8211; it is easier to follow traditional ways than to come up the simple, but clear and powerful solution.</p>
<p>Agile development has famous principle <a href="http://c2.com/xp/DoTheSimplestThingThatCouldPossiblyWork.html" title="DTSTTCPW" id="rjki">DTSTTCPW</a> (Do The Simplest Thing That Could Possibly Work) best explained by <a href="http://www.xprogramming.com/" title="Ron Jeffries" id="oo4_">Ron Jeffries</a>:</p>
<blockquote><p>We&#8217;re saying consider all solutions to your task that could possibly work. Implement the simplest solution. Refactor from there if and when needed&#8230;  And we&#8217;re saying that when you do enhance the simple solution (and you generally will), you will always wind up with a system that is just right for what it does so far. And we&#8217;re saying that that is just where you want to be. Everything just right, nothing added that isn&#8217;t needed.</p></blockquote>
<p>For example, if you love design patterns, MVC and object oriented programming, you may end up with design below for finding orders by customer&#8217;s postal code.</p>
<p><img src="http://softwarecreation.org/images/2008/design-complex.jpg" /></p>
<p>I love these patterns too, but I would still recommend to start with the simpler design.</p>
<p>The simplest design is the most effective way to deliver business value. You spend less time, build more reliable, easier to understand and change solution. You save energy for other tasks and reduce load on your hard-working brains.</p>
<p>Why do people not go for the simplest solution all the time? There are three main reasons:</p>
<ul>
<li><em>unintentional </em>- the programmer didn&#8217;t find simpler solution (lack of experience, pressure and no time to think, relying on traditional ways, compliance with architect&#8217;s grand design and others)</li>
<li><em>intentional </em>- the programmer wants to over-complicate solution for personal benefits (play with interesting technology, build up resume or increase scope of paid work)</li>
<li><em>foretelling </em>- the programmer bets on the future advantage of more complex design</li>
</ul>
<p>The last reason is the most compelling for many programmers. What if your experience and knowledge tells you that you will need this more advanced design and additional code?<br />
Lets do cost-benefit analysis</p>
<p><img src="http://softwarecreation.org/images/2008/simplest-design.jpg" /></p>
<p>What are the chances of mismatch with our initial expectations for a non-trivial project? Big. Mismatch with expectations happens when we learn more from technology, domain and customer feedback while programming. Mismatch happens when we understand the problem deeper and come up with the better solutions. Mismatch happens when the new requirements are coming, priorities are altered and the whole world around is changing (e.g. new company opportunities or credit crunch and economic downturn).</p>
<p>As we can see <strong>the best approach is the simplest design that requires little refactoring in the future and doesn&#8217;t prohibit anticipated design evolution</strong>. Therefore, use you experience and intuition to predict direction of the design evolution. Use this knowledge not for making design more complex to accommodate this prediction, but for ensuring that the simplest solution is not stupid, prohibitive for evolution and will survive coming changes.</p>
<p>However, the level of expertise has significant impact on the choice. The novice programmer should use standard well-described solutions and learn how to simplify them later. The expert programmer should be more comfortable to design simple, sound and easy to evolve solutions from the start.</p>
<p><strong>2. Revise and refactor</strong><br />
Focus on the simplest local design and code for individual features without revisions and design improvements could sometimes create global mess and painful complexity .</p>
<p>For example, it is bad, if after adding several features, your OrderDB contains many methods like LoadForPostalCode, LoadForPostalCodeAndStatus, LoadShippedOrders and web pages are overloaded with domain logic. This kind of code calls for refactoring.</p>
<p>Revise and refactor after completing any programmer tasks.<br />
You should ask yourself 4 questions:</p>
<ul>
<li>Can I reduce code?</li>
<li>Can I make code clearer?</li>
<li>Can I make code more testable?</li>
<li>Can I make the whole system simpler?</li>
</ul>
<p>Refactor, if you answer yes to any of these questions. Learn <a href="http://c2.com/xp/CodeSmell.html" title="code smells" id="sz3_">code smells</a> to identify concrete places that need refactoring. Learn <a href="http://www.refactoring.com/" title="refactoring techniques" id="w_yn">refactoring techniques</a> to improve code.<br />
Main methods:</p>
<ul>
<li>remove duplication and increase code reuse</li>
</ul>
<ul>
<li>create abstractions to generalize individual cases</li>
<li>use design patterns to simplify design</li>
</ul>
<p>Refactoring is one the most important practice for productive software creation. Refactoring allows to keep the system in the good shape all the time &#8211; simple, well designed, ready to change. Implementing the simplest solutions without refactoring and <a href="http://softwarecreation.org/2008/selecting-the-best-strategy-for-software-teams-retreat-evolution-or-revolution/" title="evolutionary approach" id="ye41">evolutionary approach</a> is risky.</p>
<p>Other rules should enhance your approach further.</p>
<p><strong>3. Discover Form and Function in parallel. </strong><br />
<em>Form follows Function</em> is a traditional principle in design. In other words, customers requirements dictate user interface. However, discovery of complex interactions could affect what the customer wants and change understanding of needs. Sometimes starting with UI paper sketches and discussing them with customers could expose missing details, gaps in understanding and suggest better ways to satisfy customer needs.  <em>Therefore, work on discovery of Form and Function</em><em> of the system</em><em> in parallel.</em></p>
<p><strong>4. Avoid using new tools</strong><br />
<em>New Systems Mean New Problems</em> &#8211; The Fundamental Theorem of <a href="http://en.wikipedia.org/wiki/Systemantics" title="Systemantics" id="ztgg">Systemantics</a><br />
Do not use new languages, tools and libraries unless existing are bad and you can tolerate high risk and delays.<br />
Every new programming tool claim to make you more productive and powerful. Few of them really do this. But , it is guaranteed, that every new tool takes time for learning and brings new problems.<br />
I know that it is hard to continue using old tools for a long time and stay competitive in fast moving software development world. But try to limit impact on customer. It is not fair to make them victims of your learning and experiments. <em>Create separate experimental prototypes and <a href="http://en.wikipedia.org/wiki/Greenfield_project" title="greenfield" id="zl:r">greenfield</a> projects to evaluate new tools and approaches.</em> Prefer to be honest and transparent with your client about risks of new technologies, tools and approaches.</p>
<p><strong>5. Use creative ideas sparingly</strong><br />
Creative ideas can bring excellent solutions. However, any creative idea adds element of unexpectedness and departure from established ways to solve similar problems. Programmers will spend more time to understand creative ideas and will have challenges to support them. <em>Therefore, use creative ideas when they bring significant advantages (especially to simplify solution) and avoid them in trivial situations.</em> Don&#8217;t worry, you will always find where to apply your creative energy if you are productive, build good solutions and have more and more customers.</p>
<p><strong>6. Prefer standard solutions to the non-standard</strong><br />
This rule compliments the previous rule. Standard solutions are based on experience of many people. Maybe they are not the best in your particular case, but they often are safe bet if these problems are new for you. You can find many examples, quickly learn how to apply them and understand consequences beforehand. New creative solutions will make life more interesting in expense of productivity and certainty in the final results. <em>Therefore, prefer standard solutions to reinventing the wheel again.</em> Don&#8217;t forget to learn how to make them simpler.</p>
<p><strong>7. Separate production code and experiments</strong><br />
Restrain technical curiosity when writing production code. Many programmers find the joy of programming in solving complex problems. It is so tempting to solve difficult technical puzzles and try out new cool techniques without need. However, the pragmatic programmer solves complex customer problems with simple solutions, instead of creating complex solutions for the simple problems.<br />
Think first about customer requirements and simple design. <em>Experiment and look for the new solutions only if you cannot find simple solutions with familiar methods.</em> Keep your production and experimental code separately. Adopt ideas from experiments without unnecessary complication of the solution.</p>
<p><strong>8. Do not overwrite (or over-eingeneer)</strong><br />
Write minimal code relevant to present customer requests. Surprisingly, complex over-engineered solutions are easier to create &#8211; just follow recent trends and try to anticipate everything that came to mind. The simplest and clear solutions require extra effort.<br />
Over-engineering harms the software system, takes away precious time and project money. <em>Avoid over-engineering if you are motivated to build good system and satisfy your customer.</em></p>
<p><strong>9. Write own code for the core and use external components for supporting functionality.</strong><br />
Concentrate your effort on writing code for the core functions specific to customer domain or code that is bringing competitive advantage. Don&#8217;t waste too much effort on secondary supportive functions. For example, there are many good enough libraries, for solving standard dynamic web user interface needs &#8211; <a href="http://www.prototypejs.org/" title="prototype" id="rr.e">prototype</a>, <a href="http://jquery.com/" title="jQuery" id="h3g5">jQuery</a>, <a href="http://www.asp.net/ajax/" title="Microsoft AJAX" id="nbwt">Microsoft AJAX</a>, <a href="http://developer.yahoo.com/yui/" title="Yahoo user interface library" id="exel">Yahoo user interface library</a> and others &#8211; but many programmers are still building their own solutions. I like to have full control over my software systems and write as much as possible components, but <em>one cannot embrace unembraceable</em> (<a href="http://en.wikipedia.org/wiki/Kozma_Prutkov" title="Kozma Prutkov" id="sz1h">Kozma Prutkov</a>). <em>You have to trust some parts of the system to other libraries that will save time and do better job</em> (but bring new problems).</p>
<p><strong>10. Do not write code for future</strong>.<strong> </strong><br />
The dirty trick of predicting the future is that future is unpredictable. Everything else is fine. Written for the future code adds unnecessary complexity. This code is useless for the present problems. <em>Avoid writing code for the future and strive for the simplest solutions for the present needs.</em></p>
<p><strong>11. Write code for other programmers</strong><br />
Can other programmers understand your code? Do you have clear names, consistent formatting and self-explaining code? <em>Writing code for others will make code better for you.</em></p>
<p><strong>12. Switch between big picture and details</strong><br />
Good programmers can focus on the big picture and still pay attention to details. <em>Clear intention and forward thinking are as important as reliable implementation.</em></p>
<p><strong>13. Pair program for complex problems</strong><br />
Pair programming brings <a href="http://alistair.cockburn.us/Costs+and+benefits+of+pair+programming" title="significant benefits" id="xm9g">significant benefits</a>:</p>
<ul>
<li>better ideas &#8211; two brains solving the problems</li>
<li>better quality &#8211; two pair of eyes validating code</li>
<li>better knowledge &#8211; two programmers understand implementation and ideas behind</li>
<li>better productivity &#8211; problems are solved faster</li>
<li>more enjoyment &#8211; people like to communicate and work together</li>
</ul>
<p>I&#8217;m still not sure about serious benefits of pair programming for simple and routine programming tasks. But many Agile teams <a href="http://www.extremeprogramming.org/rules/pair.html" title="pair program" id="xbve">pair program</a> for all production code and like results.</p>
<p><strong>Putting It All Together</strong></p>
<p><img src="http://softwarecreation.org/images/2008/approach-to-programming.jpg" /></p>
<p><strong>Inspiring reference:</strong> <em>The Elements of Style</em>, W. Strunk Jr. and E.B. White</p>
<!-- Social Buttons Shared Counts Generated by Digg Digg plugin v4.0.9, 
    Author : Yong Mook Kim
    Website : http://www.mkyong.com/blog/digg-digg-wordpress-plugin/ --><img src="http://softwarecreation.org/?ak_action=api_record_view&id=77&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://softwarecreation.org/2008/the-elements-of-pragmatic-programming-style-approach/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>The Programmer&#8217;s Brains At Work: Understanding The Software System</title>
		<link>http://softwarecreation.org/2008/the-programmers-brains-at-work-understanding-the-software-system/</link>
		<comments>http://softwarecreation.org/2008/the-programmers-brains-at-work-understanding-the-software-system/#comments</comments>
		<pubDate>Thu, 17 Apr 2008 03:51:03 +0000</pubDate>
		<dc:creator>Andriy Solovey</dc:creator>
				<category><![CDATA[People]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Skills]]></category>

		<guid isPermaLink="false">http://softwarecreation.org/2008/the-programmers-brains-at-work-understanding-the-software-system/</guid>
		<description><![CDATA[Share&#8220;The important thing is not to stop questioning&#8221; &#8211; Albert Einstein
A typical programmer faces thousands lines of code, huge number of details and millions of situations and states during the software system execution. A programmer should understand the system, know how to modify it and support knowledge about the system with explanations, justifications and answers. [...]]]></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-programmers-brains-at-work-understanding-the-software-system/&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-programmers-brains-at-work-understanding-the-software-system/' 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-programmers-brains-at-work-understanding-the-software-system/'></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-programmers-brains-at-work-understanding-the-software-system/'></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-programmers-brains-at-work-understanding-the-software-system/&amp;title=The+Programmer%27s+Brains+At+Work%3A+Understanding+The+Software+System&amp;t=2' height='18' width='120' frameborder='0' scrolling='no'></iframe></div></div></div><div style='clear:both'></div><p><cite>&#8220;The important thing is not to stop questioning&#8221; &#8211; Albert Einstein</cite></p>
<p>A typical programmer faces thousands lines of code, huge number of details and millions of situations and states during the software system execution. A programmer should understand the system, know how to modify it and support knowledge about the system with explanations, justifications and answers. How can a software developer gain, maintain and operate this knowledge and make sense of these volumes of information and complex logic changing every day?<br id="k5ox" /><br id="jo4f" />The ways how our memory works could give us few hints.<br id="kz6d" /></p>
<h3 id="qmn1">Our Human Memory Architecture</h3>
<p id="ow85" style="padding: 1em 0pt; text-align: left"><img src="http://softwarecreation.org/images/2008/memory.jpg" /></p>
<p><span id="more-60"></span><span id="lvjf"><strong id="x_tz">The Process</strong></span><br id="xid:" /></p>
<ul id="ztjs">
<li id="th-i"><span id="o-n6"><strong id="uorl">Acquisition</strong></span>. New information enters your brain along pathways between neurons in the appropriate area of the brain. The key to encoding information into your memory is attention; unless you focus on information intently, it is immediately forgotten.<br id="st44" /></li>
<li id="p9nq"><span id="r:zo"><strong id="heot">Consolidation.</strong></span> If you&#8217;ve concentrated well enough to encode new information in your brain, the <a href="http://en.wikipedia.org/wiki/Hippocampus" title="hippocampus" id="r7sn">hippocampus</a> sends a signal to store the information as long-term memory. This happens more easily if it&#8217;s related to something you already know, or if it stimulates an emotional response.</li>
<li id="v2mu"><span id="naqg"><strong id="b_kn">Retrieval.</strong></span> When you need to recall information, your brain has to activate the same pattern of nerve cells it used to store it. The more frequently you need the information, the easier it is to retrieve it along healthy nerve cell connections.</li>
</ul>
<p><br id="tpjg" /><span id="n:lr"><strong id="sbsz">Sensory memory</strong></span><br id="kyvp" /><a href="http://en.wikipedia.org/wiki/Sensory_memory" title="Sensory memory" id="zia3">Sensory memory</a> corresponds approximately to the initial 200 &#8211; 500 milliseconds after an item is perceived. The ability to look at an item, and remember what it looked like with just a second of observation, or memorization, is an example of sensory memory. This type of memory cannot be prolonged via rehearsal.<br id="wbai" />We use five sensory channels to perceive the world: sight, hearing, smell, touch, taste<br id="mrty" /><br id="shz1" /><span id="wf69"><strong id="x16_">Short Term Memory</strong></span> (Working memory)<br id="j.tr" />Some of the information in sensory memory is then transferred to <a href="http://en.wikipedia.org/wiki/Short-term_memory" title="short-term memory" id="m5yy">short-term memory</a>. Short-term memory allows us to recall something from several seconds to as long as a minute without rehearsal. Its capacity is also very limited:  4-7 items. But short term memory capacity can be increased through a process called <a href="http://en.wikipedia.org/wiki/Chunking_%28psychology%29" title="chunking" id="hkc4">chunking</a> &#8211; packing information units into small chunks. <br id="qo_e" /><br id="oc06" /></p>
<p id="gwy0"> The Central Executive is the controlling system of working memory and is      more complex than either of the three slave systems. This system controls attention      and it is necessary for cognitively demanding tasks such as problem solving  and comprehension. The Central Executive also has a limited processing capacity, which is related    to the capacity of working memory (4-7 items).</p>
<p><br id="okdj" /><span id="lmmf"><strong id="vwxi">Long Term Memory</strong></span><br id="mv.0" /><a href="http://en.wikipedia.org/wiki/Long-term_memory" title="Long-term memory" id="q16k">Long-term memory</a> extends to hours, days and years. By contrast to sensory and short-term memories, long-term memory can store much larger quantities of information for potentially unlimited duration (sometimes a whole life). <br id="ouk1" />It has two main divisions: declarative (explicit) and non-declarative (implicit) memory.<br id="kc_7" /></p>
<ul id="cdg6">
<li id="gbgd"><a href="http://en.wikipedia.org/wiki/Declarative_memory" title="Declarative Memory" id="quk6">Declarative Memory</a> (the memory of facts) consist of<br id="fjcd" />
<ul id="koi0">
<li id="pwjs"><a href="http://en.wikipedia.org/wiki/Semantic_memory" title="Semantic Memory" id="vw.n">Semantic Memory</a> &#8211; facts and generalized information, contains knowledge about the world; knowing      the meaning and definitions of things</li>
</ul>
<ul id="d0lu">
<li id="dgnr"><a href="http://en.wikipedia.org/wiki/Episodic_memory" title="Episodic Memory" id="adjn">Episodic Memory</a> &#8211; personal experience (information in stories) &#8211; events that occur, whether to you personally or to someone you read about, heard about or watched on televisions</li>
</ul>
</li>
<li id="sob1"><span id="b0uj">Non-declarative </span>(unconscious memory)
<ul id="ko:s">
<li id="cpe3"><span id="qhs1"><a href="http://en.wikipedia.org/wiki/Procedural_memory" title="Procedural memory" id="k__5">Procedural memory</a> </span> is the long-term memory of skills and procedures, or &#8220;how to&#8221; knowledge.</li>
</ul>
</li>
</ul>
<h3 id="jnrd">How to learn the system (or anything else)<br id="tne1" /></h3>
<p><span id="nzhf">Memory is not a muscle and you cannot understand and get much information into your brain with just mechanical effort. You can spend days digging in the code and still barely understand and remember ideas and concepts  behind the system. Recommendations below could help to improve the learning of the system.<br id="ylif" /><img src="http://softwarecreation.org/images/2008/learning-system.jpg" /></span></p>
<h4 id="o.j2">Prepare mind</h4>
<p id="qcvl" style="padding: 1em 0pt; text-align: left"><img src="http://softwarecreation.org/images/2008/hayden.jpg" /></p>
<p>The key for effective learning is open, eager and focused mind. You&#8217;ll understand much better if you are highly interested or even love what you are going to learn. I don&#8217;t know how could you do it &#8211; it is too individual ( meditation? <span id="nzhf">self-hypnosis? </span><span id="nzhf">finding the job you could love?), but without interest you&#8217;ll have much harder time to learn your subject.<br id="z4w." /><br id="a2cb" />There are 3 components for the mind preparation:<br id="q-0-" /></span></p>
<ul id="e9fz">
<li id="rjcj"><span id="nzhf">Intentions</span></li>
<li id="htye"><span id="nzhf">Interest</span><br id="eb5e" /></li>
<li id="zh4."><span id="nzhf">Attention</span></li>
</ul>
<p><span id="nzhf"><br id="ug59" /></span><span id="vhfa"><strong id="ajwn">Intentions </strong><br id="i8an" />Any learning should have a reason and you&#8217;d better know your goals to focus your mind, keep on track and achieve your goals</span><br id="vman" /></p>
<ul id="zt4.">
<li id="t-bp">Why do you want to learn the system?</li>
<li id="vrqc">What and how much do you want to learn?</li>
<li id="vrqc">How are you going to learn?</li>
</ul>
<p><br id="y4w3" /><span id="crgk"><span id="x-2m"><strong id="x3eg">Interest</strong></span><br id="f2kq" />You should enter the right state of mind where interest, emotions and mood support your learning beside rational needs.</span><span id="vm02"> You want to learn, you are eager and passionate about finding meaning and explanations. Your mind will fly and absorb information at the fullest speed if you can achieve this state.</span><br id="ovhp" /><span id="nzhf"><strong id="ky5w"><br id="s6eb" /></strong></span><span id="ci.."><strong id="gln4">Attention</strong></span> <br id="jxtf" />Without attention you&#8217;ll not get information or it will disappear quickly from your brains. Lack of attention prohibits memory formation and encoding of useful information into your brain.<br id="tbpm" /><br id="qlcv" />Attention decreases under<br id="wm7g" /></p>
<ul id="x5.q">
<li id="eq_d">multitasking and distractions: less attention span and more load on working memory</li>
<li id="woya">stress: interferes with ability to perceive and think</li>
<li id="q6vw">boredom: your brains are not stimulated enough for active thinking</li>
<li id="al:o">poor physical readiness: sleepy, poor diet, lack of exercises and oxygen</li>
<li id="al:o">long learning time for the same topic. Switching periodically to other topics helps to sharp and charge your mind again<br id="kd3l" /></li>
</ul>
<p><span id="w40:"></span></p>
<h4 id="q7l6">Planning</h4>
<p><span id="nzhf"></span><span id="w40:">Even prepared mind needs some tools, methods and support<br id="d58q" /></span></p>
<ul id="o-vw">
<li id="mhip"><span id="vm02">Adjust your learning approach to your mental readiness, available time and context</span></li>
</ul>
<ul id="ngqg">
<li id="v8jz">Decide what strategy to use &#8211;  learning concepts, tools, memory devices, visualization, or reciting. More is better.<br id="wm5i" /></li>
<li id="v8jz">Prepare and tune in advance &#8211; review, ask and get more information before actual learning</li>
</ul>
<p><span id="fn9q"></span></p>
<h4 id="f2zf">Immersion</h4>
<p><img src="http://softwarecreation.org/images/2008/jump.jpg" /><br />
<a href="http://flickr.com/photos/haniamir/651043585" class="photocredit">haniamir</a><br />
<br id="u:_b" />When you are prepared and ready, you can immerse into the learning.<br id="ybc_" /><br id="y8wm" />Immersion (<a href="http://www.amazon.com/gp/product/0060920432/104-2883280-1296732?ie=UTF8&amp;tag=softwcreatmys-20&amp;linkCode=xm2&amp;camp=1789&amp;creativeASIN=0060920432" title="Flow" id="fyxy">Flow</a>) &#8211; a state of mental focus so intense that awareness of the real world is lost, generally resulting in a feeling of joy and satisfaction. When learning and tasks are too easy, people become bored. If they are too complex they become stressed and frustrated. Immersion happens when perception and understanding are challenged near capacity without being exceeded.<br id="ikgb" />Flow conditions:<br id="wthy" /></p>
<ul id="j447">
<li id="a9ox">can focus</li>
<li id="a9ox">clear goals</li>
<li id="a9ox">immediate feedback</li>
<li id="a9ox">control over actions, activities and the environment</li>
</ul>
<p><br id="grcm" />You should try to direct your learning to match your current knowledge and cognitive abilities with the depth and complexity of the new information. If it is too easy, go deeper and chose more complex topics. If it is too challenging, slow down and return to the more basic level.<br id="dwx4" />The flow will allow you to become most productive, motivated and satisfied with your learning (and work and life).<br id="vh5e" /></p>
<h4 id="elad">Create knowledge</h4>
<p><img src="http://softwarecreation.org/images/2008/astronomy.jpg" /><br />
<a href="http://flickr.com/photos/iqbalkhatri/330987926" class="photocredit">iqbalkhatri</a><br />
<br id="o_w3" /> Full comprehension is not possible, at least not in one day. Our learning is the series of iterative discoveries and probes, which eventually forms the true knowledge in our heads.<br id="hput" />Don&#8217;t stumble in one place &#8211; switch learning areas often. You will have more comprehensive picture. It is more effective to have short, passionate and focused bursts of learning and letting unconscious mind to sort things out until the next learning session.<br id="yxr3" />And <span id="vm02">in the same time you should be heuristic and ready for discovering the whole new world of knowledge. </span>Be ready for unexpected insights, turns and paradoxes. They could lead for more valuable discoveries and knowledge than you intended.<br id="csof" /><br id="p3_3" />The sources of knowledge:<br id="nzir" /></p>
<ul id="t8nd">
<li id="bmpu">People &#8211; the knowledgeable and articulate people are the best source of the information, others could easily deceive and mislead (often including themselves &#8211; as you can see we don&#8217;t have perfect memories)<br id="vz_:" /></li>
<li id="b42p">Documents &#8211; capture mental effort of other people to explain concepts, ideas and solutions, but documents are often outdated and disconnected from reality.<br id="qvx6" /></li>
<li id="yqs1">Code &#8211; the ultimate source of the system description. It contains the true knowledge , but with too many details (often distracting), which require serious effort to grasp.<br id="e:vj" /></li>
</ul>
<p><br id="m6yn" />The essence of understanding is creation of knowledge by building up your semantic memory with<br id="arwt" /></p>
<ul id="zwyx">
<li id="phwg">Associations</li>
<li id="uj.t">Organization</li>
<li id="piqz">Deep understanding</li>
</ul>
<p><br id="eswf" /><span id="lkn9"><strong id="hzbs">Associate</strong></span><br id="gisp" />Associations make memories much stronger and permanent. Linked memory will create a stronger network in our semantic memory, stay longer and allow easier navigation. It is critical for thinking, problem-solving and creativity. More associations we have, the better we are at thinking.<br id="b9nd" /></p>
<ul id="e6yz">
<li id="kth2">Form right connection and links between your memories. <br id="oq58" /></li>
<li id="k7zb">Relate information to what you already know and define information using familiar concepts.</li>
</ul>
<ul id="gfpr">
<li id="a_7r">Compare and contrast for creating deeper associations.</li>
<li id="a_7r">Use senses and emotions for better encoding memories in brain</li>
<li id="a_7r">Connect information to your and other stories and situations. Episodic memory is very reliable.<br id="x899" /></li>
</ul>
<p><br id="httc" />If you are learning the new programming language, look for similarities and differences with familiar languages.<br id="un7w" />If you are studying the system design, connect your findings to known architecture and design patterns.<br id="wgrj" />If you are exploring the system concepts, search for a metaphor or visual picture explaining the system behavior.<br id="nbtr" /><br id="f2_9" /><span id="g53w"><strong id="t.l1">Organize</strong></span><br id="u:-3" />Most of the differences in people&#8217;s memory abilities are in how they organize memories and less in how well brains can actually remember. Organizing means putting facts in meaningful categories and align with the way how you want to use them.<br id="b8yp" /></p>
<ul id="xeji">
<li id="v0dd">Extract basic concepts instead of the simple memorization of isolated facts <br id="eg4d" /></li>
<li id="v0dd">Use <a href="http://en.wikipedia.org/wiki/Mnemonic" title="Mnemonics" id="hyvt">Mnemonics</a>
<ul id="w_t5">
<li id="v0dd">imaging &#8211; creating a mental picture;</li>
<li id="v0dd">method of loci (locations) &#8211; ideas or things to be remembered are connected to objects located in a familiar location or along a path or journey;</li>
<li id="v0dd">pegword method (number, rhyming schemes) &#8211; ideas or things to be remembered are connected to specific words (e.g., one-bun, two-shoe, three-tree, etc.)</li>
<li id="v0dd"> basic mnemonic like &#8216;initial letter&#8217; &#8211; the first letter of each word in a list is used to make a sentence (the sillier, the better).</li>
</ul>
</li>
</ul>
<ul id="wlny">
<li id="bzvk">Chunk information &#8211; pack informational units together. Working memory could operate with only 4-7 items and chunking helps to increase this capacity.<br id="y:cx" /></li>
</ul>
<p><br id="q70p" />4 types of organization:<br id="f2gl" /></p>
<ul id="km2l">
<li id="d0j:">Component (part/whole)&#8211;classification by category or concept (e.g., overall system architecture &#8211;&gt; major subsystems and layers &#8211;&gt; main classes);</li>
<li id="bv1.">Sequential &#8212; chronological; cause/effect; flow (e.g., the system logic, sequence of events and dynamic execution);</li>
<li id="y7ci">Relevance &#8212; central unifying idea or criteria (e.g., business model, architecture principles, design patterns);</li>
<li id="av-f">Transitional (connective) &#8212; relational words or phrases used to indicate qualitative change over time (e.g., the system state transitions, modes of operation)</li>
</ul>
<p><span id="lwk2"><strong id="p0o4">Deeply Understand</strong></span><br id="yynz" />There are three parts for deep understanding and active high-performance thinking:<br id="bjo1" /></p>
<ul id="afrn">
<li id="shp2">Power of unconscious processing</li>
<li id="u1ph">Depth of processing</li>
<li id="u1ph">Top down and bottom up<br id="d8d2" /></li>
</ul>
<p><br id="ljjt" /><span id="lq_z"><em id="c8n.">Use unconscious memory processing.</em></span><br id="j2e6" />Our automatic, unconscious and ultra fast brain processes are much more powerful than limited <a href="http://softwarecreation.org/2007/the-mind-of-the-programmer-anatomy-and-3-contradictions/" title="conscious controlled thinking" id="t:rm">conscious controlled thinking</a>. Unconscious processes run in parallel and can handle many tasks at once. They are source of our intuition, insights and most decisions (for which we try to find conscious explanations later).<br id="z:3n" />Unconscious thinking could be trained, enhanced and boosted with experience and active thinking, when we stretch and challenge our knowledge<br id="lzoo" /></p>
<ul id="r8w4">
<li id="lm0m">question all facts and assumptions<br id="g8jc" /></li>
<li id="dvh9">explain and teach these ideas to others in the simple terms (including your grandmother &#8211; you&#8217;ll quickly find gaps in your understanding)<br id="dgmr" /></li>
<li id="dvh9">view from different points of view (including various people interests)<br id="qq:." /></li>
<li id="gytr">try to find alternative and new ideas</li>
<li id="gytr">search what we are missing or cannot trust <br id="fwsk" /></li>
</ul>
<p><br id="m180" /><span id="f9lv"><em id="d-3h">Depth of Processing </em></span>- phenomenon of memory in which information that is analyzed deeply is better recalled than information that analyzed superficially. The more deeply learners process information, the better they learn. Therefore, select depth of processing depending on importance of the learning area: dive deep into the most important topics and just barely scan insignificant.<br id="xr1-" /><br id="b2-l" /><span id="x9v8"><em id="d8nd">Combine top down and bottom up approaches</em></span>.<br id="y8po" />We should use both inductive (example/experience &#8211;&gt; concept) and deductive reasoning (concept &#8211;&gt; examples) to better understand the software system. Requirement documents and architecture views are not enough and often far from reality. Code provides too much details that sometimes difficult to translate into meaningful concepts and unifying ideas. Only reconciliation of top down and bottom up knowledge could provide you with the true knowledge in reasonable time.<br id="t1tm" /></p>
<h4 id="cmdb">Strengthen learning</h4>
<p><span id="nzhf"><img src="http://softwarecreation.org/images/2008/arnold.jpg" /><br id="i3tb" /><br id="b7ci" />Important steps for knowledge retention and becoming better learner:<br id="ch2h" /></span></p>
<ul id="kjdj">
<li id="g36k">Experience</li>
<li id="cqrr">Review</li>
<li id="bmnz">Self-correction</li>
</ul>
<p><br id="d:he" /><span id="kd-2"><strong id="k3.-">Experience</strong></span> your learning as soon as you can. The true knowledge emerges only after you tried to apply it in practice. Convert your theoretical knowledge into practical knowledge tested by reality. It is especially important fore software development, because it is mostly <a href="http://softwarecreation.org/2007/is-software-development-empirical-or-rational/" title="empirical activity" id="g38z">empirical activity</a>.<br id="e_js" /></p>
<ul id="c663">
<li id="rp4p">Write code and add / change functionality</li>
<li id="cp5c">Troubleshoot and fix bugs</li>
<li id="lb2n">Create unit testing &#8211; one of the best methods to test reality, understand and experience the system (if the system is testable).</li>
</ul>
<p><br id="yxvx" /><span id="yyav"><strong id="wj72">Review</strong></span><br id="kx.m" /></p>
<ul id="xo2q">
<li id="r9w6">Rehearse and &#8220;over-learn&#8221; information that increases level of attention, utilizes more senses, provides immediate feedback</li>
<li id="xdrf">Review soon in small frequent doses</li>
<li id="i46c">Recall main points</li>
</ul>
<p><br id="d7kk" /><span id="xdkm"><strong id="kmzc">Self-correction.</strong></span> Watch yourself. Are you effective? How could you learn better? Criticize your knowledge and learning methods. Praise yourself for achievements. Become more effective at learning.</p>
<p><img src="http://softwarecreation.org/images/2008/learning-algorithm.jpg" /><br id="wqb7" /><br id="ahkp" />The learning and exploration of the software system could be the most rewarding intellectual experience or it could be your worst nightmare. You have a choice&#8230;<br id="yn_h" />And it is true, sometimes the problem for learning is in the a software system, which is very difficult to understand. The next post will explore how to make the system understandable.<br id="tjh_" /><br id="uzdj" /><br id="ke4i" /><span id="ft9l"><strong id="c3mn">Interesting Resources</strong></span><br id="o.:y" /><a href="http://chiron.valdosta.edu/whuitt/col/cogsys/infoproc.html" title="The Information Processing Approach to Cognition" id="b050">The Information Processing Approach to Cognition</a> <br id="frrt" /><a href="http://en.wikipedia.org/wiki/Memory" title="Memory" id="y39s">Memory</a> and <a href="http://en.wikipedia.org/wiki/Semantic_memory" title="Semantic Memory" id="bkwp">Semantic Memory</a>, Wikipedia<br id="xde7" /><a href="http://www.akri.org/cognition/hummod.htm" title="Human Memory Models" id="hgj9">Human Memory Models</a> <br id="xuqh" /><a href="http://www.aarp.org/learntech/wellbeing/a2004-06-23-tools.html" title="Five Tools for Improving Your Memory" id="c__d">Five Tools for Improving Your Memory</a>, by Barry Gordon, M.D., Ph.D.<br id="rsa4" /><a href="http://www.helpguide.org/life/improving_memory.htm" title="Improving your Memory" id="w38o">Improving your Memory</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=60&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://softwarecreation.org/2008/the-programmers-brains-at-work-understanding-the-software-system/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
