<?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; Practices</title>
	<atom:link href="http://softwarecreation.org/category/practices/feed/" rel="self" type="application/rss+xml" />
	<link>http://softwarecreation.org</link>
	<description>What are the forces behind software development?</description>
	<lastBuildDate>Mon, 11 Jul 2011 01:12:57 +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>Can Software Team deliver like McDonalds?</title>
		<link>http://softwarecreation.org/2011/can-software-team-deliver-like-mcdonalds/</link>
		<comments>http://softwarecreation.org/2011/can-software-team-deliver-like-mcdonalds/#comments</comments>
		<pubDate>Mon, 11 Jul 2011 01:08:14 +0000</pubDate>
		<dc:creator>Andriy Solovey</dc:creator>
				<category><![CDATA[Practices]]></category>
		<category><![CDATA[Process]]></category>
		<category><![CDATA[Productivity]]></category>

		<guid isPermaLink="false">http://softwarecreation.org/?p=243</guid>
		<description><![CDATA[What does a customer wants? Usually your customer wants to know a simple thing &#8211; when your team will deliver working software based on agreed requirements. They naively want to safely bet on highly uncertain future outcome &#8211; delivery of the complex never created before system that completely fulfil their dreams. The customer wants reliable [...]]]></description>
			<content:encoded><![CDATA[<div>
<h3><img class="alignnone size-full wp-image-257" title="McDonald's" src="http://softwarecreation.org/wp-content/uploads/2011/07/mcdonalds1.jpg" alt="McDonald's" width="600" height="462" /></h3>
<h3><span>What does a customer wants?</span></h3>
<p>Usually your customer wants to know a simple thing &#8211; when your team will deliver working software based on agreed requirements. They naively want to safely bet on highly uncertain future outcome &#8211; delivery of the complex never created before system that completely fulfil their dreams.</p>
<p>The customer wants reliable McDonalds experience, but with a little tweak &#8211; they want to hand in their own exclusive menu, often created by people who don’t have any idea how to cook.</p>
<p>In short, the customer requires creative flexibility of Cooking Master Chef fortified by ability to predictably deliver hamburgers as McDonalds.</p>
<p>But, is it possible in our development reality to chase two opposing goals &#8211; Predictability and Flexibility in the same time?</p>
<p><span id="more-243"></span></p>
<h3 dir="ltr">Predictability vs Flexibility</h3>
<p><img class="alignnone size-full wp-image-248" title="Predictability vs. Flexibility" src="http://softwarecreation.org/wp-content/uploads/2011/07/predictability-flexibility.jpg" alt="Predictability vs. Flexibility" width="621" height="285" /></p>
<p>The best way to achieve predictability is standardization &#8211; formalize process, nail-down rules, follow and optimize them mercilessly. However, standards have negative effects &#8211; lower morale, inhibited creativity, reduced flexibility and slower response to changes.</p>
<p>Rapid adaptation is the best way to to be flexible &#8211; eagerness to quickly regroup and self-organize to address new challenges and creatively solve new problems. However, constant changes and creativity sparks lead to unpredictable and ad-hoc results without much opportunity to stabilize and optimize delivery.</p>
<p>Standardization is a crystallized answer to past events &#8211; how to repeat effectively something that was solved before and proved to work.</p>
<p>Adaptation is the response to current events &#8211; how to embrace unforeseen requests, challenges and events.</p>
<p>Standardization has own cost &#8211; processes and rules should be maintained, reviewed and optimized otherwise they will become source of overhead, rigidity and frustration. But if there is no standardization, lessons and best practices could be lost or not followed.</p>
<p>It is difficult, but possible to chase these two contrary goals in the same time. Build standards to solve repeating problems and optimize recurring activities. Adapt to meet new challenges.</p>
<p><img class="alignnone size-full wp-image-266" title="Predictability vs. Flexibility details" src="http://softwarecreation.org/wp-content/uploads/2011/07/predictability-flexibility-22.jpg" alt="Predictability vs. Flexibility details" width="714" height="366" /></p>
<h3 dir="ltr">Team Maturity Matrix</h3>
<p>Development teams have different capabilities to strike both predictable and flexible delivery.</p>
<p><img class="alignnone size-full wp-image-250" title="Team matrix" src="http://softwarecreation.org/wp-content/uploads/2011/07/team-matrix.jpg" alt="Team matrix" width="413" height="290" /></p>
<ul>
<li><strong>Amateurs</strong> &#8211; do even simple things&#8230; unpredictably</li>
<li><strong>Explorers</strong> &#8211; capable of solving complex non-standard problems, but cannot guarantee time and budget (Ph.D guys)</li>
<li><strong>Mechanics</strong> &#8211; very efficient with standard solutions, but struggle with new stuff (anal-retentive guys)</li>
<li><strong>Regulars</strong> &#8211; predictability of delivery lowers for more challenging problems</li>
<li><strong>Strike Force</strong> &#8211; deliver reliable results for any type of problem</li>
</ul>
<p>Any team should grow from Amateur status, but rare team could become Strike Force that mastered both &#8211; predictable and flexible delivery. Than what direction of growth to choose? It depends on nature of projects and problems the team tackle.</p>
<h3 dir="ltr">Finding sweet spot</h3>
<p><img class="alignnone size-full wp-image-251" title="Growth Focus" src="http://softwarecreation.org/wp-content/uploads/2011/07/growth-focus.jpg" alt="Growth Focus" width="549" height="298" /></p>
<p>Predictable delivery requires reduced variations in development process: uniform, ordered and consistent approach with focus on high efficiency.</p>
<p>Flexible delivery requires increased variations in the process: enabling more options, wider range of responses to improve fitness in changing environment.</p>
<p>These 2 goals could compliment each other. Predictability (with standardization) could bring consistency and stability in volatile and evolving development ecosystem. Adaptation helps to improve and find better standards and ideas for established processes.</p>
<p><img class="alignnone size-full wp-image-252" title="Finding Sweet Spot - Predictability vs. Flexibility" src="http://softwarecreation.org/wp-content/uploads/2011/07/process.jpg" alt="process" width="726" height="377" /></p>
<div dir="ltr">
<table border="0">
<colgroup>
<col width="*"></col>
<col width="*"></col>
</colgroup>
<tbody>
<tr valign="top">
<td><strong>Predictable delivery</strong> &#8211; reduce variations, increase efficiency and productivity<br />
Repeatable, well known steps and technology &#8211; candidates for standardization (concrete rules)</td>
<td><strong>Flexible delivery</strong> &#8211; increase variations and fitness<br />
New, uncertain events, requests and challenges &#8211; adaptation and transformation (principles, patterns)</td>
</tr>
<tr valign="top">
<td>Development</p>
<ul>
<li>Proven solutions</li>
<li>Standard development platforms and tools</li>
</ul>
<ul>
<li>Formalized architecture patterns and design conventions</li>
<li>Approved external libraries and vendors</li>
<li>Code standards</li>
</ul>
<p>Stabilization and control</p>
<ul>
<li>PM software</li>
</ul>
<ul>
<li>Production and Development Environments</li>
<li>Source Control</li>
<li>Iterations and process flows</li>
<li>QA</li>
<li>Development management</li>
</ul>
<p>Checklists</p>
<ul>
<li>Product launch</li>
<li>Security</li>
<li>SEO</li>
</ul>
<p>Templates</p>
<ul>
<li>User Stories</li>
<li>Architecture and Functional specifications</li>
<li>Test cases</li>
</ul>
<p>Procedures</p>
<ul>
<li>Interviews, hiring</li>
<li>New version release</li>
<li>Retrospectives</li>
</ul>
<p>Automation</p>
<ul>
<li>Unit and System Testing</li>
<li>Build and Deployment</li>
<li>System monitoring and validation</li>
</ul>
<p>Elimination and optimization</p>
<ul>
<li>Waste</li>
<li>Stress / overburden</li>
<li>Inconsistency</li>
</ul>
<p>Measurement</p>
<ul>
<li>Defects</li>
<li>Productivity</li>
<li>Time, resources, work-in progress</li>
<li>Deviation from standards</li>
</ul>
</td>
<td>Development</p>
<ul>
<li>Innovative and creative solutions</li>
<li>New platforms and emerging technologies</li>
<li>Experiments, prototypes, pilot projects</li>
<li>Design competitions</li>
<li>Stay on edge &#8211; use of modern libraries, tools and techniques</li>
</ul>
<p>Expansion</p>
<ul>
<li>New business opportunities</li>
<li>New products and features</li>
<li>Market niches and trends</li>
<li>Self-organization and initiative</li>
</ul>
<p>Idea formation</p>
<ul>
<li>Brainstorming</li>
<li>JAD sessions</li>
<li>Research</li>
<li>Analytics</li>
<li>Team suggestions</li>
<li>Customer feedback</li>
</ul>
<p>Challenges and response</p>
<ul>
<li>Competition</li>
<li>System problems</li>
<li>Emergencies</li>
<li>Conflicts</li>
<li>Team / organization changes</li>
<li>Unsatisfied users</li>
<li>Falling sales</li>
</ul>
<p>Measurements</p>
<ul>
<li>Growth</li>
<li>Rate of innovation</li>
<li>New ideas and creativity</li>
</ul>
</td>
</tr>
</tbody>
</table>
</div>
<p>So, can team deliver as McDonalds, but using exclusive menu? Yes, if they not only excel in programming, but also excel in the way they work &#8211; persistently re-evaluating approaches and improving both predictability and flexibility.</p>
<p>There are three simple requirements for the team</p>
<ol>
<li>Follow standards (minimal, adhering to principles)</li>
<li>Challenge standards (not relevant, rigid, impeding, excessive)</li>
<li>Introduce and Improve standards (from lessons learned, best practices, enhancing flexibility and value stream)</li>
</ol>
<p>And you will build powerful development machine that continuously transforming to embrace fluid reality while keeping steadiness and predictability as McDonalds.</p>
<p><img class="alignnone size-full wp-image-254" title="mcdonalds-team" src="http://softwarecreation.org/wp-content/uploads/2011/07/mcdonalds-team.jpg" alt="mcdonalds-team" width="304" height="420" /></div>
<img src="http://softwarecreation.org/?ak_action=api_record_view&id=243&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://softwarecreation.org/2011/can-software-team-deliver-like-mcdonalds/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Stuck on a Big Hard Programming Task? Read this!</title>
		<link>http://softwarecreation.org/2011/stuck-on-a-big-hard-programming-task-read-this/</link>
		<comments>http://softwarecreation.org/2011/stuck-on-a-big-hard-programming-task-read-this/#comments</comments>
		<pubDate>Mon, 25 Apr 2011 00:18:45 +0000</pubDate>
		<dc:creator>Andriy Solovey</dc:creator>
				<category><![CDATA[Practices]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Skills]]></category>

		<guid isPermaLink="false">http://softwarecreation.org/?p=232</guid>
		<description><![CDATA[Sometimes I am stuck on a mind-boggling task. I know this because I found myself fiddling around, giving advises to other people, searching for food, drinking coffee or working on low priority stuff. Clock is ticking but little gets done. After I notice this unfortunate state, I talk with myself seriously &#8211; calling to conscience, [...]]]></description>
			<content:encoded><![CDATA[<div><img class="alignnone" title="Wild Things" src="http://softwarecreation.org/images/2011/wild-things.jpg" alt="" width="640" height="283" /></div>
<div><span id="internal-source-marker_0.06952311238273978">Sometimes I am stuck on a mind-boggling task. I know this because I found myself fiddling around, giving advises to other people, searching for food, drinking coffee or working on low priority stuff. Clock is ticking but little gets done. After I notice this unfortunate state, I talk with myself seriously &#8211; calling to conscience, sense of duty and pride of a man who never fails his mission and the team.</span></div>
<div>
<p>Over the time I have learnt how to return to a productive state and even finish difficult tasks. I want to share my experience here.</p>
<p><strong>Precondition</strong><br />
I assume that you have a good idea what you should build. If not, you have to get back to your notes, client or a drawing board. You definitely will be unproductive if you don&#8217;t have clear understanding of your task. Most probably you will waste your time and client&#8217;s money.</p>
<p>Now, you know what to do but don&#8217;t know how and intellectually overwhelmed by this too big to bite piece!</p>
<p>I recommend 3 phase strategy to conquer your difficult task:</p>
<ol>
<li><strong>Hit the road</strong> &#8211; start moving and build the confidence</li>
<li><strong>Take control</strong> &#8211; conquer uncertainty and map the road</li>
<li><strong>Accelerate</strong> &#8211; drive on full speed while keeping control<span id="more-232"></span></li>
</ol>
</div>
<h3><strong>Hit the road</strong></h3>
<div>
<p><em>&#8220;Writing a novel is like driving a car at night. You can see only as far as your headlights, but you can make the whole trip that way&#8221;</em> &#8211; E. L. Doctorow</p>
<p><strong>25 Minutes Burst</strong><br />
First, you have to physically sit in front of your computer &#8211; ready to write code. If you are not in this well suited for programming position, you should apply your negotiation skills to put your resisting body there. It is not easy to argue with yourself, but you can always ask for firm 25 minutes attempt in exchange for some personal favor. Use these negotiated minutes to hit the road &#8211; start powerful programming burst. What about other 25 minute burst after a short break? And another? You can try <a href="http://www.pomodorotechnique.com/">The Pomodoro Technique</a>.</p>
<p><strong>Pick Low Hanging Fruit by Fruit</strong><br />
The Huge Difficult task will try to kick you out of a saddle (chair) and immobilize. You have to gain confidence and steady mindset to make a real progress. Dive into programming as soon as you can. Start with some necessary piece that you know how to implement. Not everything should be clear &#8211; just couple steps ahead. You will discover next steps while you work on the current. Pick fruit by fruit to gain momentum: move from one small task to another without stops. Hold the chain of these tasks to stubbornly step forward against severe winds and waves of procrastination.</p>
<p><strong>Copy and Paste</strong><br />
Copy and Paste is <a href="http://en.wikipedia.org/wiki/Copy_and_paste_programming">a bad practice</a>. However, it is an excellent starting point if you have huge demoralizing task. Find similar code in your previous projects, help examples or Google / Stackoverflow it. Refine and knead these examples into acceptable for your purpose shape. Certainly, remember to clean and <a href="http://softwarecreation.org/2008/a-few-words-in-defense-of-copy-and-paste-programming/">remove bad effects</a> before you finish.</p>
<p><strong>Offensive Reconnaissance</strong><br />
Survey the territory of your development task for potential paths and roadblocks. Do not engage in open fights until you mentally strong and prepared. Work on discovered tasks only if they are easy, otherwise estimate complexity and mark them for the next phases. In order to have better intelligence you can</p>
<ul>
<li>Search on Internet for implementation ideas</li>
<li>Talk with somebody who can spark a solution (at work, online) or at least with <a href="http://c2.com/cgi/wiki?RubberDucking">Rubber Duck</a></li>
<li>Load information in brain and forget about this problem &#8211; let your subconscious to prepare for the Eureka! moment while you are busy with other stuff.</li>
</ul>
<p><strong>Important question: Are you ready for engagement</strong>?<br />
Tell honestly if you feel you are not ready to tackle the task. Ask for help or take a break to learn. You will put yourself in a bad stressful position continuing struggle and failing at the end. It is not fair to your team, company and clients. Nobody will appreciate it.</p>
<p><strong>Phase Outcome:</strong> you are on the road and can get things done!</p>
<h3>Take control</h3>
<p><em>“Chance favors the prepared mind”</em> &#8211; Louis Pasteur</p>
<p>And your project manager and client stand behind and nervously ask &#8211; &#8220;When are you going to finish this f* task?&#8221;</p>
<p>Long drive in the dark is not fun and not safe &#8211; you can be late and end up in the wrong place. Once your mind stop resisting and become cooperative, you should grasp the control and get better view how to get your task done and what effort is required.</p>
<p>You would ask: “Why do not take a control at the beginning &#8211; plan all operation steps ahead and follow them with discipline?” My answer: You need offensive reconnaissance into task area and prepared mind for planning. Also you need some time to play with the task, align your mind with people, requirements, technology, tools, environment and other moving parts. That is why Hit The Road is an essential stage for programmer’s timid mind scared by The Big Monster Task.</p>
<p><strong>Break down</strong><br />
First, break down the big task on smaller steps to map your road to victory.</p>
<p><strong>Fire </strong><a href="http://c2.com/cgi/wiki?TracerBullets"><strong>Tracer Bullets</strong></a><br />
Build small quick simple end-to-end working prototype that touches all major components. Connecting them together and making them work is a big achievement to find your target solution. This will become your frame for next programming pieces that you discovered during reconnaissance.<br />
Plan deeper <a href="http://c2.com/cgi/wiki?SpikeSolution">spikes</a> for technically risky and unknown areas.</p>
<p><strong>Evade Premature Fights: Grand Re-Design, Refactoring or Optimization</strong><br />
You  will be tempted to apply your outstanding architecture skills and guru expertise to radically improve design of the system, completely refactor a cluster of ugly classes or optimize potentially slow layers. Be careful &#8211; these activities often lead  to a deep pit right before finish. Exercise self-restrain and pragmatism. Focus on a practical solution that solves the client problem, not idealism of the perfect system. If you need a lot of tension &#8211; go to gym or create a separate task from the current to accomplish these amazing feats with the system.</p>
<p>These are sign that you took the control:<br />
1. You know your major steps to finish the task<br />
2. You can estimate time, effort and risks for these steps<br />
3. You know what is unknown and how to deal with this stuff</p>
<p><strong>Phase Outcome:</strong> you have a plan, estimation and a frame for putting things together</p>
<h3>Accelerate</h3>
<p><em>&#8220;A good plan executed today is better than a perfect plan executed at some indefinite point in the future.&#8221; </em>- General George Patton Jr</p>
<p>Once you have clarity and mental control, you can move on a full speed. You just need to keep high motivation, control and quality. Rare developer’s mind will resist to program at this point :)</p>
<p><strong>Small Clear Wins </strong><br />
Keep moving from one small victory to another leaving behind things that you like, work good and well-refactored. Do not leave half-baked pieces that collapse after you step away.</p>
<p><strong>Immersion</strong><br />
Enter <a href="http://en.wikipedia.org/wiki/Flow_(psychology)">Flow</a> &#8211; “mental state of operation in which a person in an activity is fully immersed in a feeling of energized focus, full involvement, and success in the process of the activity”.<br />
Conditions for flow:</p>
<ol>
<li>Clear goals that add direction and structure to the task</li>
<li>Challenges match skills &#8211; you feel capable to wrestle a task, but not easily.</li>
<li>Immediate feedback &#8211; you can quickly adjust based on the results of work and changing demands</li>
</ol>
<p><strong>Anti-perfectionism<br />
</strong>Don’t overthink the problem and spend too much time on polishing of a <a href="http://www.artima.com/intv/goodenough.html">good enough solution</a>. Instead strive for simple design, open for future extensions and delay big decisions for later than you have more information and feedback. Just know when to stop and have confidence that the stuff you claim as done is really <a href="http://www.scrumalliance.org/articles/106-definition-of-done-a-reference">DONE</a>.</p>
<p><strong>Phase Outcome:</strong> your train is moving on the full speed to the final stop on a schedule and nothing could stop you :)</p>
<p><img style="border: 0px initial initial;" title="Conquer Big Hard Task" src="http://softwarecreation.org/images/2011/Big-Hard-Task.png" alt="" width="640" height="450" /></p>
<p>Can you share you own strategies to overcome and conquer difficult tasks?</p></div>
<img src="http://softwarecreation.org/?ak_action=api_record_view&id=232&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://softwarecreation.org/2011/stuck-on-a-big-hard-programming-task-read-this/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>The Toolkit for Increasing Productivity of Software Teams</title>
		<link>http://softwarecreation.org/2010/the-toolkit-for-increasing-productivity-of-software-teams/</link>
		<comments>http://softwarecreation.org/2010/the-toolkit-for-increasing-productivity-of-software-teams/#comments</comments>
		<pubDate>Tue, 14 Sep 2010 03:43:55 +0000</pubDate>
		<dc:creator>Andriy Solovey</dc:creator>
				<category><![CDATA[Concepts]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Practices]]></category>
		<category><![CDATA[Productivity]]></category>

		<guid isPermaLink="false">http://softwarecreation.org/?p=182</guid>
		<description><![CDATA[Seasoned project managers will tell that delivery of software is result of many trade offs. The main trade off is between Time (when project will finish) and Scope (how much will be done). This post will show that using right tools you could gain improvement for both variables. While it is possible to create orderly step-by-step process [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" style="height: 310px; width: 450px;" src="http://softwarecreation.org/images/2010/5letka.jpg" alt="" width="450" height="310" /></p>
<p>Seasoned project managers will tell that delivery of software is result of many trade offs. The main trade off is between <strong>Time </strong>(when project will finish) and <strong>Scope </strong>(how much will be done). This post will show that using right tools you could gain improvement for both variables.</p>
<p>While it is possible to create orderly step-by-step process for increasing productivity of software teams, it will never be ideal &#8211; too many variations and situations will hinder it usefulness. I believe in set of useful tool that could be combined to craft custom optimal solution.</p>
<h3>Strategies</h3>
<p style="margin: 0px;">There are several strategies that lead to increase in productivity &#8211; how many units of scope software team can produce within fixed time.</p>
<ol>
<li><strong>Increase Capacity (Capacity) </strong>- increase capacity by hiring more people or increasing work hours
<ul>
<li>productivity is increased as result of more resources and hours available</li>
</ul>
</li>
<li><strong>Improve Value Stream (Value) </strong>- increase added business value on each step and reduce waste and overhead
<ul>
<li>productivity is increased as result of optimized delivery of value</li>
</ul>
</li>
<li><strong>Adaptat to Reality  (Adaptation)</strong>- learn from practice and mistakes, validation of ideas by reality, adapt to changing situation
<ul>
<li>productivity increased as result of early corrections and improving how things are done</li>
</ul>
</li>
<li><strong>Empower Individuals (Individuals) </strong>- boost people knowledge, skills, morale and focus
<ul>
<li>productivity is increased as result of higher individual performance and motivation</li>
</ul>
</li>
<li><strong>Enhance Communication (Communication) </strong>- improve communication and mutual understanding inside and outside of the team
<ul>
<li>productivity is increased as result of availability of necessary information, clarity of what should be done and exchange of ideas for implementation</li>
</ul>
</li>
<li><strong>Organize Better (Organization)</strong> &#8211;  structure team and assign roles for better coordination and decision making
<ul>
<li>productivity is increased as result of better decisions and focus on important areas</li>
</ul>
</li>
<li><strong>Expand Expertise (Expertise) </strong>- increase range of skills and services offered by team
<ul>
<li>productivity is increased as result of better execution of necessary project activities</li>
</ul>
</li>
<li><strong>Scale Externally (Externality)</strong> &#8211; outsourcing and involvement of external communities
<ul>
<li>productivity is increased as result of involvement of more people outside of team</li>
</ul>
</li>
<li><strong>Tame Complexity (Design)</strong> &#8211; manage complexity and provide simple and well designed solutions
<ul>
<li>productivity is increased as result of reducing complexity burden on software development</li>
</ul>
</li>
<li><strong>Preserve Quality (Quality)</strong> &#8211; use defensive tactics to ensure high quality
<ul>
<li>productivity is increased as result of preventing system flaws and reduced effort to fix bugs</li>
</ul>
</li>
</ol>
<div>I separated tools into three categories:</div>
<ul>
<li><strong>People-oriented</strong> &#8211; people are the creators of software and have major effect on output</li>
<li><strong>Process-oriented</strong> &#8211; the way how people work has significant impact on outcome</li>
<li><strong>Development-oriented</strong> &#8211; development practices and approach to the system implementation matters a lot</li>
</ul>
<p><img class="alignnone" title="Productivity Strategic Areas" src="http://softwarecreation.org/images/2010/Productivity Toolkit.png" alt="" width="798" height="870" /></p>
<p><span id="more-182"></span></p>
<h3 style="font-size: 12pt;">People-oriented tools</h3>
<p><span style="font-weight: normal; line-height: 26px; font-size: 13px; "><img class="alignnone" title="union" src="http://softwarecreation.org/images/2010/union.jpg" alt="" width="450" height="334" /></span></p>
<div id="nuwr" style="margin-top: 0px; margin-bottom: 0px; text-align: left;"><strong>1. Hire New People</strong></div>
<p><em>Strategies: </em>Capacity <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Expertise <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Communication <img class="icon" src="http://softwarecreation.org/images/2010/poor.png" alt="poor" />,  Organization <img class="icon" src="http://softwarecreation.org/images/2010/poor.png" alt="poor" /></p>
<p>New people increase volume of possible work within the same time and new expertise increases range and quality of tasks. However, the increase in output is not linear and quickly diminishes, because more people cause communication and coordination overhead. In addition, compensation increase make this tool expensive and less attractive.</p>
<div><em>Tips: </em>Form few small teams to avoid large group overhead and scale by parallel development of system components and sync within team of teams. Also remember what Fred Brook said: <em>Adding manpower to a late software project makes it later</em>.</div>
<p><em>Resources:</em></p>
<ul>
<li><a id="qhcz" title="Methodology and Team Size" href="http://alistair.cockburn.us/Methodology+per+project">Methodology and Team Size</a>, Alistair Cockburn</li>
<li><a id="l6bz" title="Team Size Matters" href="http://www.shmula.com/181/team-dynamics-size-matters">Team Size Matters</a>, schmula</li>
</ul>
<p><strong>2. Motivate</strong></p>
<div><em>Strategies: </em>Individuals <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Quality <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" /></div>
<p>Happy motivated people are more productive, focused and concerned about quality and end result. While there is no common receipt for each individual, I believe there are some strong motivators: interesting and meaningful work, fair compensation, control over own tasks and outcomes, ability to learn and professionally grow, comfortable workplace and adequate tools, empathetical and caring management and so on.<br />
Daniel H. Pink in <a id="pp90" title="Drive" href="http://www.amazon.com/gp/product/1594488843?ie=UTF8&amp;tag=softwcreatmys-20&amp;linkCode=xm2&amp;camp=1789&amp;creativeASIN=1594488843">Drive</a> thinks that people are motivated by three elements:</p>
<ul>
<li>Autonomy: People want to have control over their work.</li>
<li>Mastery: People want to get better at what they do.</li>
<li>Purpose: People want to be part of something that is bigger than they are.</li>
</ul>
<div><em>See Also: </em></div>
<ul>
<li>Professional Growth</li>
</ul>
<p><em>Tips:</em> Motivate individually, but set also group targets to encourage cooperation</p>
<div><em>Resources:</em></div>
<ul>
<li><a id="pkhw" title="Drive" href="http://www.amazon.com/gp/product/1594488843?ie=UTF8&amp;tag=softwcreatmys-20&amp;linkCode=xm2&amp;camp=1789&amp;creativeASIN=1594488843">Drive</a>, Daniel H. Pink</li>
<li><a title="The Ideal Software Company. Utopia?" href="http://softwarecreation.org/2007/the-ideal-software-company-utopia/">The Ideal Software Company. Utopia?</a></li>
</ul>
<p><strong>3. Professional Growth</strong></p>
<p><em>Strategies: </em>Individuals <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Expertise <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Quality <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Adaptation <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" /></p>
<p>Software professionals should learn a lot to become productive and proficient. People learn in several ways and learning from mistakes is the most memorable, but expensive way. Learning by self-study, formal training and coaching by experienced colleagues are more effective ways. Encourage and direct learning to grow high performance experts and team. And certainly, continue learning as much as possible from mistakes and practice. :)</p>
<div><em>Tips:</em> Give opportunity for people to learn things that are beyond immediate needs of the project. Ability to learn and perspectives of growth are the strongest motivation factors for majority of software professionals.</div>
<div><em>Resources:</em></div>
<ul>
<li><a href="http://softwarecreation.org/2009/how-to-become-an-expert-top-7-qualities/">How to Become an Expert. Top 7 Qualities</a></li>
<li><a href="http://softwarecreation.org/2009/how-to-become-an-expert-the-effective-way/">How to Become an Expert. The Effective Way</a></li>
</ul>
<p><strong>4. Overtime</strong></p>
<div><em>Strategies: </em>Capacity <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Individuals <img class="icon" src="http://softwarecreation.org/images/2010/poor.png" alt="poor" />, Quality <img class="icon" src="http://softwarecreation.org/images/2010/poor.png" alt="poor" /></div>
<p>Nobody recommends involuntary overtime for a long time as benefits will disappear quickly when a stressed team lowers quality and starts breaking apart.</p>
<div><em>Tips: </em>Use overtime as a last resort for very short period.</div>
<div>Resources:</div>
<div>
<ul>
<li><a id="i82t" title="Overtime Considered Harmful" href="http://www.basilv.com/psd/blog/2006/overtime-considered-harmful">Overtime Considered Harmful</a></li>
</ul>
</div>
<p><strong>5. Right leaders</strong></p>
<div><em>Strategies: </em>Communication <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Organization <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" /></div>
<p>Good leaders jell teams, align people with goals, boost energy and remove barriers. Leaders vary from commanders to visionaries and each style has merits under specific circumstances. Right leaders are essential for the project success.</p>
<p><em>Tips:</em> Adjust leadership style to situation</p>
<div><em>Resources:</em></div>
<ul>
<li><a id="j-h0" title="What is The Best Leadership Style for The Software Team?" href="http://softwarecreation.org/2007/what-is-the-best-leader-for-the-software-team/">What is The Best Leadership Style for The Software Team?</a></li>
</ul>
<div><strong>6. Specialize</strong></div>
<p><em>Strategies:</em> Expertise <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Organization <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" /></p>
<p>A software team requires range of skills and involved in different activities to achieve end goal &#8211; implemented software system for customer needs. Beyond software implementation the team deals with a customer domain, company vision, market demands, technologies, operation environments and other project aspects. The team is involved in research, analysis, coordination, design, architecture, usability, testing, deployment, hosting and other activities. Therefore team players should be able to play different roles and have expertise to cover various aspects to ensure good end results.</p>
<div><em>Tips:</em> A high degree of specialization and separation of roles is inevitable for large teams and projects. However specialization can hurt the project as people forget about big picture, holistic solutions and instead focus on what is important for their local area. The team leaders should pay a lot of attention to <em>Alignment </em>to counter-attack sub-optimization and locally focused decisions.</div>
<p><em>Resources:</em></p>
<ul>
<li><a title="Why specialization in Software development is bad for business" href="http://softwaredevelopmenttoday.blogspot.com/2009/06/why-specialization-in-software.html">Why specialization in Software development is bad for business</a></li>
</ul>
<div><strong>7. Outsource</strong></div>
<p><em>Strategies: </em>Capacity <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Expertise <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Externality <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Organization <img class="icon" src="http://softwarecreation.org/images/2010/poor.png" alt="poor" />, Communication <img class="icon" src="http://softwarecreation.org/images/2010/poor.png" alt="poor" /></p>
<p>Tasks and challenges should match skills and experience of team players. It doesn&#8217;t make sense for backend developers to convert Photoshop files into html or conduct marketing research and focus groups. If team cannot afford to hire a permanent specialist, they should try to find professional mercenaries who will do work faster on higher quality level.</p>
<div><em>Tips:</em> It is more difficult to align outsiders, who don&#8217;t have long-term commitment and interest in the end result. Communication and clear understanding are hard to achieve. Preferably, outsiders should be assigned well-defined tasks and sub-projects with clear outcome and frequent validation points.</div>
<div><em>Resources:</em></div>
<div>
<ul>
<li><a title="Using an Agile Software Process with Offshore Development" href="http://martinfowler.com/articles/agileOffshore.html">Using an Agile Software Process with Offshore Development</a></li>
</ul>
</div>
<div><strong>8. Induce Individual Flow</strong></div>
<div><em>Strategies: </em>Individuals <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" /></div>
<p>Flow (or Immersion) is 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. Flow happens when perception and understanding are challenged near capacity without being exceeded.</p>
<div><em>Tips:</em> Flow conditions:</div>
<ul>
<li>ability to focus</li>
<li>clear goals</li>
<li>immediate feedback</li>
<li>control over actions, activities and the environment</li>
</ul>
<div><em>Resources:</em></div>
<ul>
<li>
<p style="margin: 0px;"><a id="fbb6" title="Flow: The Psychology of Optimal Experience" href="http://www.amazon.com/gp/product/0061339202?ie=UTF8&amp;tag=softwcreatmys-20&amp;linkCode=xm2&amp;camp=1789&amp;creativeASIN=0061339202">Flow: The Psychology of Optimal Experience</a>, Mihaly Csikszentmihalyi</p>
</li>
</ul>
<div><strong>9. Discipline</strong></div>
<div><em>Strategies: </em>Quality <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Organization <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Individuals <img class="icon" src="http://softwarecreation.org/images/2010/poor.png" alt="poor" /></div>
<p>Few people will be always disciplined no matter what and few will always violate rules. Majority are context sensitive &#8211; relax than discipline is low and work hard when discipline is enforced. Build a minimal set of rules approved by majority and stick to these rules.</p>
<div><em>Tips:</em> Too much discipline could significantly deprive productivity, motivation and promote compliance instead of dedication.</div>
<p><em>Resources:</em></p>
<ul>
<li><a href="http://softwarecreation.org/2007/lost-personalities-how-our-company-alters-us/">Lost Personalities: How our company alters us</a></li>
</ul>
<h3 style="font-size: 12pt;">Process-oriented tools</h3>
<div><img style="height: 500px; width: 364px;" src="http://softwarecreation.org/images/2010/industry.jpg" alt="" width="364" height="500" /></div>
<p><strong>10. Increase feedback and early practical use of ideas</strong></p>
<div><em>Strategies: </em>Adaptation <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Quality <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Value <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" /></div>
<p>Reality is complex, fluid and unclear. Many assumptions and plans quickly go bust. The process that has built-in mechanism for signaling problems and self-correction is the most effective. Rapid feedback is the core part of such process.</p>
<p><em>Tips:</em> Iterative development is one of the best examples of the process that relies heavily on feedback.</p>
<div><em>Resources:</em></p>
<ul>
<li><a title="How to become an Expert. Embrace Reality." href="http://softwarecreation.org/2009/how-to-become-an-expert-embrace-reality/">How to become an Expert. Embrace Reality.</a></li>
</ul>
</div>
<p><strong>11. Build alignment</strong></p>
<div><em>Strategies:<span style="font-style: normal;"> Communication <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Organization <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" /></span><br />
</em></div>
<p>People jump significant gaps to understand each other &#8211; sometimes without much success. Clear vision, smart priorities and honest evaluation allow team players moving in unison and enforce each other. Good understanding focus people on right goals and reduce wasteful activities. Communication and trust are important for alignment.</p>
<div><em>Tips:</em> Take care about important alignment elements:</div>
<ul>
<li>vision &#8211; project direction and top-level goals</li>
<li>interests &#8211; mix of personal, customer and companies interests (sometimes conflicting)</li>
<li>understanding &#8211; clarity about what others mean</li>
<li>trust &#8211; confidence in other people intentions and promises</li>
</ul>
<div><em>Resources:</em></p>
<ul>
<li><a href="http://softwarecreation.org/2007/software-development-is-the-flow-of-ideas-the-rest-is-secondary/">Software Development is The Flow of Ideas. The Rest is Secondary</a></li>
</ul>
</div>
<p><strong>12. Integrated decision making</strong><br />
<em> </em></p>
<p><em>Strategies:</em> Communication <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Quality <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Adaptation <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" /></p>
<div>Quality of decisions cause projects failure or success. Good decisions are based on correct information, experience, goals, feedback, expert opinions and so on. Decisions could be centralized, consensus based or delegated to lower level. The project should have right mix of these styles, but most effective decisions are made by people who will implement them.<br />
In addition, involvement in decision making empower people and give them sense of control.</div>
<p><em>See Also:</em></p>
<ul>
<li>Self-organization</li>
</ul>
<div>
<div><em>Tips:</em> Decisions often won&#8217;t be perfect, but they more chances on success if</div>
<ul>
<li>underlying causes are understood</li>
<li>decisions are early validated on practice</li>
<li>diverse group of people is involved</li>
<li>goals and background for decision are clearly communicated (preferably on one sheet of paper)</li>
</ul>
<p><em>Resources:</em></p>
<ul>
<li><a title="How to become an Expert. Embrace Reality." href="http://softwarecreation.org/2009/how-to-become-an-expert-embrace-reality/">How to become an Expert. Embrace Reality.</a></li>
<li><a href="http://softwarecreation.org/2007/review-the-wisdom-of-crowds-making-the-best-decisions/">Review: The Wisdom of Crowds. Making the Best Decisions</a></li>
</ul>
<div><strong>13. Verification (QA) and Stopping to Fix Problems</strong></div>
<p><em>Strategies:</em> Quality <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Capacity <img class="icon" src="http://softwarecreation.org/images/2010/poor.png" alt="poor" /></div>
<div>
<div>Good Quality Assurance makes projects solid and expose not only bugs, but serious system flaws &#8211; requirements discrepancies, problems with user experience and system inconsistencies. Low tolerance to quality problems should be a working principle. The team should have mandate to stop and fix root problems immediately and avoid patching that causes painful chronic problems.</div>
<p><em>Tips: </em>Productivity could decrease if QA becoming ceremony and impede efficiency and speed of software team. Automation of routine testing could help.</p>
<div><em>Resources:</em></div>
<ul>
<li><a href="http://softwarecreation.org/2009/how-to-rescue-failing-software-projects-toyota-way/">How to rescue failing software projects: The Toyota Way</a></li>
</ul>
<div><strong>14. Continuous improvements (Kaizen)</strong></div>
<p><em>Strategies:</em> Adaptation <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Quality <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Value <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" /></div>
<p>As project progresses you will find problems, wrong assumptions and challenges. You will have better experience and understanding. Even brightest ideas, best practices and excellent analysis and design could become outdated and ineffective. Continuously look for improvements, eliminate waste and bottlenecks.</p>
<div><em>See Also: </em></div>
<div>
<ul>
<li>Feedback</li>
</ul>
</div>
<p><em>Resources:</em></p>
<ul>
<li><a href="http://softwarecreation.org/2009/how-to-rescue-failing-software-projects-toyota-way/">How to rescue failing software projects: The Toyota Way</a></li>
<li><a id="n59s" title="Theory of Constraints" href="http://en.wikipedia.org/wiki/Theory_of_Constraints">Theory of Constraints</a></li>
<li><a title="Kaizen" href="http://en.wikipedia.org/wiki/Kaizen">Kaizen</a></li>
</ul>
<div><strong>15. Focus on distinctive core</strong></div>
<p><em>Strategies:</em> Individuals <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Quality <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Value <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" /></p>
<p>Highly productive team shouldn&#8217;t waste time on routine or non-core activities. Routine work should be automated and non-core work outsourced or covered by external components. The team should focus on high value-added distinctive work for business and application domain &#8211; this will bring maximum business results with minimal development effort.</p>
<div><em>See also :</em></div>
<div>
<ul>
<li>Outsource</li>
<li>More integration &#8211; less innovation</li>
</ul>
</div>
<div><em>Tips: </em>Qualities that support focus on Core (high value-added distinctive work for business):</div>
<ul>
<li>system thinking</li>
<li>understanding what really matters and what are limitations</li>
<li>broad vision and out-of-the box thinking</li>
<li>knowledge of environment, context and system outside relations</li>
<li>synthesis of concepts, information and experience</li>
</ul>
<div><em>Resources:</em></p>
<ul>
<li> <a href="http://softwarecreation.org/2008/top-5-non-traditional-traits-for-survival-of-in-house-programmers/">Top 5 non-traditional traits for survival of in-house programmers</a></li>
</ul>
</div>
<div><strong>16. Engage developer and user communities</strong></div>
<p><em>Strategies:</em> Capacity <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Expertise <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Externality <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Organization <img class="icon" src="http://softwarecreation.org/images/2010/poor.png" alt="poor" /></p>
<div>Experienced users can support beginners, and provide valuable advices on forums and social applications. They can be co-creators of content and even functionality. Passionate users can promote and market your software better than advertisers. They can generate great ideas and provide valuable feedback about your applications.</div>
<div>Go open-source if your problem is complex, large and interesting for other developers (and is not important part of your market advantage). Contribute to other projects and get value by using it for own needs (examples are Linux, Firefox)</div>
<div>
<p><em>Tips:</em> Community groups could pursue own goals and sometimes are difficult to align.</p>
<div><em>Resources:</em></p>
<ul>
<li><a id="cmxv" title="The next step in open innovation" href="https://www.mckinseyquarterly.com/next_step_in_open_innovation_2155">The next step in open innovation</a></li>
</ul>
</div>
<p><strong>17. Actively work with customer ideas</strong></div>
<p><em>Strategies:</em> Value <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Communication <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" /></p>
<p>You can better understand and change scope of application if you actively work with customers and become partners</p>
<ul>
<li>establish ubiquitous language &#8211; for better understanding of ideas and translation them into code</li>
<li>tap into experience and get better insight for business domain and processes</li>
<li>transform ideas &#8211; simplify and find better alternatives</li>
</ul>
<div><em>Tips:</em> Productivity could be improved by</div>
<ul>
<li>reducing scope</li>
<li>simplifying solutions</li>
<li>finding good enough alternatives</li>
</ul>
<div><em>Resources:</em></div>
<ul>
<li><a id="yeq-" title="Pareto Principle" href="http://en.wikipedia.org/wiki/Pareto_principle">Pareto Principle</a></li>
<li><a id="qvq4" title="Ubiquitous Language" href="http://domaindrivendesign.org/node/132">Ubiquitous Language</a></li>
<li><a href="http://softwarecreation.org/2007/software-development-is-the-flow-of-ideas-the-rest-is-secondary/">Software Development is The Flow of Ideas. The Rest is Secondary</a></li>
</ul>
<p><strong>18. Select Right Process Flow</strong><br />
<em> </em></p>
<p><em>Strategies:</em> Organization <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Value <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" /></p>
<p>Select most optimal process for creating value.</p>
<ul>
<li>real-time flow &#8211;  immediately push tasks for implementation (continuous development flow for highly organized co-located teams)</li>
<li>pull systems (Kanban) &#8211; pull tasks when previous batch is finished and the team is ready to continue (iterations and backlog)</li>
<li>schedule the workload (Heijunka) &#8211; create schedule for contributors with limited availability (outside consultants or shared specialists as designers)</li>
</ul>
<p><em>Tips:</em> Use different flows for distinct stages of software creation. For example, a team process can internally use real-time flow, with external teams &#8211; Kanban and with consultants Heijunka.</p>
<p><em>Resources:</em></p>
<ul>
<li><a id="tkf1" title="The Toyota Way and Development Process" href="http://softwarecreation.org/2009/reliable-software-development-process-the-toyota-way/">The Toyota Way and Development Process</a></li>
</ul>
<p><strong>19. Self-Organization</strong><br />
<em>Strategies:</em> Communication <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Individuals <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Adaptation <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Value <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" /></p>
<div>Connect a software team to a customer and allow them to make most project decisions based on brainstorming, learning and changing situations.</div>
<p><em>Tips:</em> Not every team can self-organize &#8211; it requires maturity. And loss of direct control could be a problem for management if a project departs from company strategy and desired parameters (as budget, standards, resources).</p>
<div><em>Resources:</em></div>
<div>
<ul>
<li><a id="qowd" title="What is The Best Leadership Style for The Software  Team?" href="http://softwarecreation.org/2007/what-is-the-best-leader-for-the-software-team/">What is The Best Leadership Style for The Software Team?</a></li>
<li><a href="http://www.infoq.com/news/2010/04/organizing-selforganizing-teams;jsessionid=7C54FC7F74FDFFC93F8993175A42FF05">Organizing Self-organizing Teams</a></li>
<li><a title="Agile Self-Organizing Teams" href="http://bradapp.blogspot.com/2009/06/agile-self-organizing-teams.html">Agile Self-Organizing Teams</a></li>
</ul>
<div>
<h3 style="font-size: 12pt;">Development-oriented tools</h3>
<div id="n:xe" style="margin-top: 0px; margin-bottom: 0px; text-align: left;">
<div id="v7:x" style="margin-top: 0px; margin-bottom: 0px; text-align: left;"><img style="height: 356px; width: 500px;" src="http://softwarecreation.org/images/2010/traktor.jpg" alt="" width="500" height="356" /></div>
</div>
<p><strong>20. Increase reuse</strong></div>
<p><em>Strategies:</em> Design <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Quality <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Adaptation <img class="icon" src="http://softwarecreation.org/images/2010/poor.png" alt="poor" /></div>
<p>Reuse code  (components, libraries, solutions) as much as possible to speed up development and minimize code base. Reuse will bring familiar tested solutions and prevent frequent re-inventions of the wheel.</p>
<p><em>See Also:</em></p>
<div>
<ul>
<li>Evolution</li>
</ul>
</div>
<p><em>Tips:</em> Design for reuse requires skills and time. It is easy to overly complicate the system by pursuing reusable code. Evolve and refactor code to achieve practically good reusability. Sometimes custome solutions are lighter and better suited for specific purposes than generic and reusable.</p>
<div><em>Resources:</em></p>
<ul>
<li><a id="mhq0" title="Lifecycle and Refactoring Patterns that Support Evolution and Reuse" href="http://www.laputan.org/lifecycle/lifecycle.html">Lifecycle and Refactoring Patterns that Support Evolution and Reuse</a>, Brian Foote</li>
<li><a href="http://softwarecreation.org/2008/the-elements-of-pragmatic-programming-style-approach/">The Elements of Pragmatic Programming Style. Approach.</a></li>
<li><a href="http://softwarecreation.org/2008/the-elements-of-pragmatic-programming-style-approach/"></a><a id="wnue" title="Should An Effective Developer Innovate, Imitate or  just Integrate?" href="http://softwarecreation.org/2010/should-an-effective-developer-innovate-imitate-or-just-integrate/">Should An Effective Developer Innovate, Imitate or just Integrate?</a></li>
</ul>
</div>
<p><strong>21. Generalize and Simplify</strong><br />
<em>Strategies:</em> Design <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Quality <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Communication <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" /></p>
<p>Complexity and poor understanding of the system is one of the worst problems in development. Design, code and concepts should be as simple as possible and clearly understood by the team. Simplicity and clarity are difficult to achieve and require special effort. It is much easier to produce convoluted over-engineered solution for complex problem (Ball of Mud) than simple and elegant solution.</p>
<div><em>See Also:</em></div>
<div>
<ul>
<li>Follow Design Principles</li>
<li>Evolution</li>
<li>Domain Specific Design</li>
</ul>
</div>
<p><em>Tips:</em> Great design achieve simplicity by abstracting numerous details into simple concepts in process of solution evolution and learning from implementation.</p>
<div><em>Resources:</em></div>
<ul>
<li><a title="Big Ball of Mud" href="http://www.laputan.org/mud/">Big Ball of Mud</a>, Brian Foote</li>
<li><a id="g8.g" title="11 Laws of The System Thinking in Software Development" href="http://softwarecreation.org/2007/11-laws-of-the-system-thinking-in-software-development/">11 Laws of The System Thinking in Software Development</a></li>
<li><a href="http://softwarecreation.org/2008/the-elements-of-pragmatic-programming-style-approach/">The Elements of Pragmatic Programming Style. Approach.</a></li>
</ul>
<div>
<div><strong>22. More integration, less innovation </strong></div>
<p><em>Strategies:</em> Value <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Design <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />,  Adaptation <img class="icon" src="http://softwarecreation.org/images/2010/poor.png" alt="poor" /></div>
<div>Innovation is expensive, uncertain and leave you with custom solutions on your own for support and future development. Piggyback on actively involving products, especially for non-core problems where good and proven solutions are available.<em>Tips: </em>Innovate to gain business advantage or solve serious technical challenges if you have an outstanding team and well-defined problems.</p>
<div><em>Resources:</em></div>
<ul>
<li><a id="x39n" title="Should An Effective Developer Innovate, Imitate or just Integrate?" href="http://softwarecreation.org/2010/should-an-effective-developer-innovate-imitate-or-just-integrate/">Should An Effective Developer Innovate, Imitate or just Integrate?</a></li>
<li><a id="racl" title="Selecting The Best Strategy for Software Teams: Retreat, Evolution or Revolution" href="http://softwarecreation.org/2008/selecting-the-best-strategy-for-software-teams-retreat-evolution-or-revolution/">Selecting The Best Strategy for Software Teams: Retreat, Evolution or Revolution</a></li>
</ul>
<div>
<div><strong>23. Domain Specific Design</strong></div>
<p><em>Strategies:</em> Design <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Communication <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" /></div>
<div>Keep technical ideas and code concepts close to the customer domain. You will achieve consistency, better sync between system and business concepts. You can easier translate customer ideas into the system and customers will understand your implementation better.<em>Tips:</em> <a id="q4.q" title="Domain Driven Design" href="http://domaindrivendesign.org/resources/what_is_ddd">Domain Driven Design</a> is one the best approaches to achieve synthesis of technical and business ideas for complex domains.</p>
<div><em>Resources:</em></div>
<ul>
<li><a id="mzc9" title="Domain Driven Design" href="http://www.amazon.com/gp/product/0321125215/102-4895263-8374529?ie=UTF8&amp;tag=softwcreatmys-20&amp;linkCode=xm2&amp;camp=1789&amp;creativeASIN=0321125215">Domain Driven Design</a>, Eric Evans</li>
<li><a id="ldpv" title="The Secret of Building Effective Software Systems" href="http://softwarecreation.org/2008/the-secret-of-building-effective-software-systems/">The Secret of Building Effective Software Systems</a></li>
<li><a href="http://softwarecreation.org/2009/the-elements-of-pragmatic-programming-style-composition/">The Elements of Pragmatic Programming Style. Composition.</a></li>
</ul>
<p><strong>24. Evolution</strong></p>
<div><em>Strategies:</em> Adaptation <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Value <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Design <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" /></div>
<div>Start with the simplest primitive solutions, enforce early use and seek for feedback. Adjust and improve design before continuing adding new features. Look for better ideas and abstractions. Delay fundamental design decisions until you are confident about system development direction and validated ideas on practice. Do not over-engineer and add unnecessary features.</div>
<p><em>Tips: </em>Evolution main deficiency is slowness. Modern businesses often don’t have time for many improvement cycles – they want results now.<span style="font-family: verdana, tahoma, arial, sans-serif;"><span style="color: #333333;"><span style="font-size: x-small;"><br />
</span></span></span></p>
<div><em>Resources:</em></div>
<ul>
<li><a href="http://softwarecreation.org/2008/what-software-development-can-learn-from-biological-evolution/">What can Software Development learn from Biological Evolution?</a></li>
<li><a href="http://softwarecreation.org/2008/ideas-in-software-development-revolution-vs-evolution-part-1/">Ideas in Software Development: Revolution vs. Evolution. Part 1.</a></li>
</ul>
<ul>
<li><a id="cl2i" title="How a beautiful software system becomes Frankenstein" href="http://softwarecreation.org/2008/how-a-beautiful-software-system-becomes-frankenstein/">How a beautiful software system becomes Frankenstein</a></li>
</ul>
<div><strong>25. Open architecture and API</strong></div>
<p><em>Strategies:</em> Externality <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Design<img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" /></div>
<div>
<div>Open your solution for external developers who can extend and add more useful features. If you are lucky, you will get much more functionality than you can build internally while still controlling a core solution (iPhone is a perfect example).</div>
<div>Also Open API (convenient and supported by good documentation) give developers eligible ways to interact with you system without hacking or completely ignoring it.</div>
<p><em>Tips:</em> Once Open API is used it becomes liability &#8211; next design decisions will be affected by compatibility and legacy concerns.<br />
<em>Resources:</em></p>
<ul>
<li><a title="API" href="http://en.wikipedia.org/wiki/Application_programming_interface">API</a></li>
</ul>
<div><strong>26. Follow Design Principles</strong></div>
<p><em>Strategies:</em> Design <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" /></div>
<p>Some of design principles</p>
<ul>
<li>You should be able to extend system without modifying it</li>
<li>A class should have one, and only one, reason to change</li>
<li>Depend on abstractions, not on concretions.</li>
<li>Make fine grained interfaces that are client specific.</li>
</ul>
<div>Famous design patterns are built around these principles. Follow sound design principles to build flexible, easy to expand system.</div>
<p><em>Resources:</em></p>
<ul>
<li><a id="x_:o" title="Principles of OOD" href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod">Principles of OOD</a>, Rob Martin</li>
<li><a href="http://softwarecreation.org/2008/the-elements-of-pragmatic-programming-style-approach/">The Elements of Pragmatic Programming Style. Approach.</a></li>
<li><a href="http://softwarecreation.org/2009/the-elements-of-pragmatic-programming-style-composition/">The Elements of Pragmatic Programming Style. Composition.</a></li>
</ul>
<div><strong>27. Shared Code, Ideas and Standards</strong></div>
<p><em>Strategies:</em> Design <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Expertise <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Communication <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Quality <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" /></p>
<div>The team should collectively own code and pursue consistency and use of best practices. Otherwise the system will become clash of isolated impassible code islands &#8211; scary for people who didn&#8217;t build them. Share code and learn from each other to build outstanding system with high quality and integrity of every component.</div>
<p><em>Tips:</em> Pair Programming is one the best ways to share code, ideas and best practices<br />
<em>Resources:</em></p>
<ul>
<li><a href="http://c2.com/cgi/wiki?CollectiveCodeOwnership">Collective Code Ownership</a></li>
<li><a title="Pair Programming" href="http://c2.com/cgi/wiki?PairProgramming">Pair Programming</a></li>
</ul>
<p><a id="esyk" title="Principles of OOD" href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod"></a></p>
<div><strong>28. Use Better technology and tools</strong></div>
<p><em>Strategies:</em> Individuals <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Design <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" />, Value <img class="icon" src="http://softwarecreation.org/images/2010/good.png" alt="good" /></div>
<div>Technologies and outside world expectations are changing. Shift to better technology and tools allows effective solution of new challenges and meeting new needs without pushing people and old technologies to grinding.</div>
<p><em>Tips: </em>Obsession with new technologies and race to use them is dangerous for project. Keep sanity until new technology is proven to be beneficial :)</p>
<div><em>Resources:</em></div>
<ul>
<li><a href="http://www.sdtimes.com/">http://www.sdtimes.com</a></li>
<li><a href="http://www.computerworld.com/">http://www.computerworld.com</a></li>
</ul>
<h3><strong>Guide for increasing team productivity</strong></h3>
<p style="margin: 0px;">
<div>Consider strategies for implementation if you cannot give positive answer on the following questions</div>
<table id="qt.5" style="font-size: 1em; line-height: inherit; border-collapse: collapse;" border="1" cellspacing="0" cellpadding="3" width="100%" bordercolor="#000000">
<tbody>
<tr style="text-align: left;">
<td style="text-align: center;" width="25%"><strong>Questions</strong></td>
<td width="25%" align="center"><strong>Strategy</strong></td>
<td style="text-align: center;" width="25%"><strong>Tools</strong></td>
<td style="text-align: center;" width="25%"><strong>Side-effects</strong></td>
</tr>
<tr style="text-align: left;">
<td width="25%">Is team clear about what should be done and have necessary information? Do people exchange ideas and help each other?</td>
<td width="25%" align="center"><strong>Enhance Communication</strong></td>
<td width="25%">
<ul>
<li>Leaders</li>
<li>Alignment</li>
<li>Integrated Decisions</li>
<li>Customer Ideas</li>
<li>Self-Organization</li>
<li>Generalize and Simplify</li>
<li>Domain Specific Design</li>
<li>Shared Code and Standards</li>
</ul>
</td>
<td width="25%">
<ul>
<li>Hiring</li>
<li>Outsource</li>
</ul>
</td>
</tr>
<tr style="text-align: left;">
<td width="25%">Does team know how they build value for customer and what is important for the project success? Do you have wasteful activities and overhead?</td>
<td width="25%" align="center"><strong>Improve Value Stream</strong></td>
<td width="25%">
<ul>
<li>Feedback</li>
<li>Continuous Improvement</li>
<li>Focus on Core</li>
<li>Customer Ideas</li>
<li>Process Flow</li>
<li>Self-Organization</li>
<li>More Integration</li>
</ul>
</td>
<td width="25%"></td>
</tr>
<tr style="text-align: left;">
<td width="25%">Is team capable and experienced to implement the project?</td>
<td width="25%" align="center"><strong>Expand Expertise</strong></td>
<td width="25%">
<ul>
<li>Hiring</li>
<li>Professional Growth</li>
<li>Specialize</li>
<li>Outsource</li>
<li>Engage communities</li>
<li>Shared Code and Standards</li>
</ul>
</td>
<td width="25%"></td>
</tr>
<tr style="text-align: left;">
<td width="25%">Do team members effectively make decisions, assign and execute tasks and know their responsibilities?</td>
<td width="25%" align="center"><strong>Organize Better</strong></td>
<td width="25%">
<ul>
<li>Leaders</li>
<li>Alignment</li>
<li>Specialize</li>
<li>Process Flow</li>
<li>Discipline</li>
</ul>
</td>
<td width="25%">
<ul>
<li>Hiring</li>
<li>Outsource</li>
<li>Engage communities</li>
</ul>
</td>
</tr>
<tr style="text-align: left;">
<td width="25%">Does team learn from practical results and mistakes? Do they consistently improve and correct how things are done?</td>
<td width="25%" align="center"><strong>Adapt to Reality</strong></td>
<td width="25%">
<ul>
<li>Feedback</li>
<li>Continuous Improvement</li>
<li>Evolution</li>
<li>Integrated Decisions</li>
<li>Self-Organization</li>
<li>Professional Growth</li>
</ul>
</td>
<td width="25%">
<ul>
<li>Reuse</li>
<li>More Integration</li>
</ul>
</td>
</tr>
<tr style="text-align: left;">
<td width="25%">Are people motivated, productive and focused on outcomes?</td>
<td width="25%" align="center"><strong>Empower Individuals</strong></td>
<td width="25%">
<ul>
<li>Motivate</li>
<li>Professional Growth</li>
<li>Individual Flow</li>
<li>Focus on Core</li>
<li>Self-Organization</li>
</ul>
</td>
<td width="25%">
<ul>
<li>Overtime</li>
<li>Discipline</li>
</ul>
</td>
</tr>
<tr style="text-align: left;">
<td width="25%">Is system design sound and code easy to understand and maintain?</td>
<td width="25%" align="center"><strong>Design: Taming Complexity</strong></td>
<td width="25%">
<ul>
<li>Evolution</li>
<li>Reuse</li>
<li>Generalize and Simplify</li>
<li>Design Principles</li>
<li>Domain Specific Design</li>
<li>More Integration</li>
<li>Open API</li>
<li>Shared Code and Standards</li>
</ul>
</td>
<td width="25%"></td>
</tr>
<tr style="text-align: left;">
<td width="25%">Does system have high quality? Does team solves problem quickly and eliminate root causes?</td>
<td width="25%" align="center"><strong>Preserve Quality</strong></td>
<td width="25%">
<ul>
<li>Quality Assurance</li>
<li>Feedback</li>
<li>Continuous Improvement</li>
<li>Professional Growth</li>
<li>Integrated Decisions</li>
<li>Focus on Core</li>
<li>Motivate</li>
<li>Discipline</li>
<li>Reuse</li>
<li>Generalize and Simplify</li>
<li>Shared Code and Standards</li>
</ul>
</td>
<td width="25%">
<ul>
<li>Overtime</li>
</ul>
</td>
</tr>
<tr style="text-align: left;">
<td width="25%">Do you outsource non-core activities or involve external communities for improving or extending system?</td>
<td width="25%" align="center"><strong>Scale Externally</strong></td>
<td width="25%">
<ul>
<li>Outsource</li>
<li>Engage communities</li>
<li>Open API</li>
</ul>
</td>
<td width="25%"></td>
</tr>
<tr style="text-align: left;">
<td width="25%">Did you try other strategies and still require more people?</td>
<td width="25%" align="center"><strong>Increase Capacity </strong></td>
<td width="25%">
<ul>
<li>Hiring</li>
<li>Overtime</li>
<li>Outsource</li>
<li>Engage communities</li>
</ul>
</td>
<td width="25%">
<ul>
<li>Quality Assurance</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p><img class="alignnone" title="Thanks" src="http://softwarecreation.org/images/2010/cook.jpg" alt="" width="500" height="357" /></p>
<h3><span style="font-size: small;"><strong>Questions</strong></span></h3>
<div>Did I miss any tools? What tools do you know and successfully use?</div>
<img src="http://softwarecreation.org/?ak_action=api_record_view&id=182&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://softwarecreation.org/2010/the-toolkit-for-increasing-productivity-of-software-teams/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>How to Become an Expert: Creative Problem Solving</title>
		<link>http://softwarecreation.org/2010/how-to-become-an-expert-creative-problem-solving/</link>
		<comments>http://softwarecreation.org/2010/how-to-become-an-expert-creative-problem-solving/#comments</comments>
		<pubDate>Sun, 25 Apr 2010 21:11:24 +0000</pubDate>
		<dc:creator>Andriy Solovey</dc:creator>
				<category><![CDATA[Expertise]]></category>
		<category><![CDATA[Practices]]></category>
		<category><![CDATA[Skills]]></category>

		<guid isPermaLink="false">http://softwarecreation.org/?p=144</guid>
		<description><![CDATA[&#8220;Ideas are like rabbits. You get a couple and learn how to handle them, and pretty soon you have a dozen&#8221; &#8211; John Steinbeck Your success in life mostly depends on two things &#8211; luck and ability to solve problems. I would leave luck topic for Irish tales and concentrate on the topic of creative [...]]]></description>
			<content:encoded><![CDATA[<p><em>&#8220;Ideas are like rabbits. You get a couple and learn how to handle them, and pretty soon you have a dozen&#8221;</em> &#8211; John Steinbeck</p>
<div>Your success in life mostly depends on two things &#8211; luck and ability to solve problems. I would leave <a id="por4" title="luck" href="http://en.wikipedia.org/wiki/Luck">luck</a> topic for Irish tales and concentrate on the topic of creative problem solving.</div>
<p><img title="problems" src="http://softwarecreation.org/images/2010/cat-cubic-rubik.jpg" alt="" /></p>
<div>Any active person constantly facing many problems and challenges. For example,</div>
<ul>
<li>Improving relationship</li>
<li>Flying to space to be the first man on Mars</li>
<li>Overweighting and health problems</li>
<li>Winning bodybuilding or beauty contest.</li>
<li>Procrastination</li>
<li>Learning new technology</li>
<li>Making more money</li>
<li>Building next Facebook or Twitter</li>
<li>Raising kids</li>
<li>Boosting career growth</li>
<li>Becoming Olympic champion or billionaire</li>
<li>Making the world a better place</li>
<li>Planning a dream vacation</li>
<li>Seeking for happiness&#8230;</li>
</ul>
<p>We often are inconsistent in solving problems and cannot find a good solution. This post focus on effective and creative problem solving by offering systematic approach and wide range of techniques.</p>
<p><span id="more-144"></span></p>
<p><img class="alignnone" title="problem solving" src="http://softwarecreation.org/images/2010/problem-solving.png" alt="" width="846" height="825" /></p>
<h3>Beginning</h3>
<p>There are<span> </span><strong>four<span> </span></strong>main elements of Creative Problem Solving:</p>
<ol>
<li><strong>Problem</strong><span> </span>- any question or matter involving doubt, uncertainty or difficulty</li>
<li><strong>Solution<span> </span></strong>- set of actions that solves a problem</li>
<li><strong>You</strong> &#8211; your knowledge, beliefs, emotions and abilities</li>
<li><strong>Context </strong>-forces, people and environment</li>
</ol>
<p>And there are<span> </span><strong>seven<span> </span></strong>strategies:</p>
<ol>
<li><strong>Knowing<span> </span></strong>- you know how to solve the problem in practice</li>
<li><strong>Copying</strong> &#8211; copy and adapt working solutions</li>
<li><strong>Logic<span> </span></strong>- follow reasoning and step-by-step approach to find a solution</li>
<li><strong>Lateral thinking </strong>- solving problems through an indirect and creative approach</li>
<li><strong>Psychology </strong>- use intuition and subconscious to pop a solution</li>
<li><strong>Dialogue<span> </span></strong>- engage brains of other people</li>
<li><strong>Trial and errors </strong>- make guess, verify and refine by experiments</li>
</ol>
<p>Before you start finding a solution, you should board the problem &#8211; understand and accept it.</p>
<h4 style="font-size: 10pt;">Boarding a problem in 3 steps</h4>
<div><em>&#8220;A wise man&#8217;s question contains half the answer.&#8221;</em> &#8211; Solomon Ibn Gabirol</div>
<p><strong>Step 1.<span> </span></strong>What is the core of the problem?</p>
<ul>
<li><strong>Essentials</strong><span> </span>- What are symptoms, facts, key points, players, context?</li>
<li><strong>Root Conflict</strong><span> </span>- Why is this a problem? What is the core of a problem? What is not a problem?<span> </span><a id="p.ya" style="color: #551a8b;" title="Ask 5 whys" href="http://en.wikipedia.org/wiki/5_Whys">Ask 5 whys</a></li>
<li><strong>Clarity</strong><span> </span>- What is still unknown and unclear? Do I need more information?</li>
</ul>
<div><strong>Step 2</strong>. Is this a right problem for me?</div>
<ul>
<li><strong>Feasible </strong>- Is the problem real and you can solve it? Continue by asking critical questions about the problem
<ul>
<li>Is it logical? Does the problem make sense for the rational part of my brain?</li>
<li>Is it subjective? Is it possible that problem exist only in my mind?</li>
<li>What are emotions and feelings? How do they contribute to my perception of the problem?</li>
<li>Is the problem based on hard facts and proven information?</li>
</ul>
</li>
<li><strong>Fit</strong><span> </span>- Why is it necessary to solve? Should I really solve this problem based on my
<ul>
<li>needs</li>
<li>priorities</li>
<li>values and principles</li>
<li>resources (time / money)</li>
<li>potential benefits / risks?</li>
</ul>
</li>
</ul>
<div><strong>Step 3.</strong><span> </span>What is my target for solution?</div>
<ul>
<li><strong>Purpose<span> </span></strong>- what is the purpose of solving the problem?</li>
<li><strong>Stretch<span> </span></strong>- should I solve bigger problem?</li>
<li><strong>Squeeze<span> </span></strong>- should I solve only part of the problem?</li>
<li><strong>Model</strong><span> </span>- what are elements and parameters of the problem? What are forces?</li>
<li><strong>Question </strong>- use<span> </span><a id="gshl" style="color: #551a8b;" title="CIA Phoenix checklist" href="http://www.futurelab.net/blogs/marketing-strategy-innovation/2007/01/the_phoenix_checklist.html">CIA Phoenix checklist</a><span> </span>of problem solving questions</li>
</ul>
<h4 style="font-size: 10pt;">Ideal solution</h4>
<div>Next, you should think about the ideal solution (even impossible). This will help you to direct your thoughts and focus on the gap between what is possible and what you want. (<a id="xs8g" style="color: #551a8b;" title="Ideal Final Result" href="http://www.mycoted.com/Ideal_Final_Result">Ideal Final Result</a>)</div>
<ul>
<li>Find<span> </span><strong>contradictions<span> </span></strong>that can be resolved -<span> </span><em>I want more money, but also want to work less</em> and impossible -<span> </span><em>I have to be in two places in the same time</em>. Use them as a creative stimulus to define an ideal solution.</li>
<li>Understand when you can stop, what is<span> </span><strong>good enough outcome</strong><span> </span>and how much time, energy and money you are willing to spend on resolving a problem</li>
<li>What are potential<span> </span><strong>harms and cost</strong><span> </span>of the solution?</li>
</ul>
<div>Now, we can move to the strategies</div>
<h3>Knowing</h3>
<div><em>&#8220;Good judgment comes from experience. Experience comes from bad judgment.&#8221;</em><span> </span>- Will Rogers</div>
<div><img class="alignnone" title="knowing" src="http://softwarecreation.org/images/2010/storyteller.jpg" alt="" width="179" height="200" /></div>
<div>The best option is when you know how to solve the problem and have practical experience. However Indians say that you can never enter the same river twice. Before repeating a solution think</div>
<ol>
<li>Is the situation same?</li>
<li>Should you improve or change something from your previous solution?</li>
<li>Can you come up with better alternatives?</li>
</ol>
<h3>Copying</h3>
<div><em>&#8220;The secret to creativity is knowing how to hide your sources.&#8221;</em> &#8211; Albert Einstein</div>
<div><img class="alignnone" title="copying" src="http://softwarecreation.org/images/2010/konica.jpg" alt="" width="200" height="194" /></div>
<div>Reinvention of wheel is not the best way to apply your energy. Copying of existing solution is one of the most effective options that taps into boundless experience of other people (sometimes learned hard way). However, think</div>
<ol>
<li>Can you trust sources? Do they provide full unbiased information?</li>
<li>Do you pay attention not only to glorious outcomes of the solution, but also to problems?</li>
<li>Can you use this solution for your specific problem, situation and abilities?</li>
</ol>
<h3>Logic</h3>
<div><em>&#8220;No problem can stand the assault of sustained thinking.&#8221; </em>- Voltaire</div>
<div><img class="alignnone" title="spock" src="http://softwarecreation.org/images/2010/spock.jpg" alt="" width="300" height="283" /></div>
<div><a id="mapi" title="Logical thinker" href="http://en.wikipedia.org/wiki/Logic">Logical thinker</a><span> </span>solves a problem by reasoning and following defined steps. Many problems can be successfully attacked by our rational brain, but not all. You can use following techniques.</div>
<p style="margin: 0px;"><strong>Reorganize </strong>-<span> </span><a id="vsqh" style="color: #551a8b;" title="break down" href="http://creatingminds.org/tools/breakdown.htm">break down</a><span> </span>the problem into elements or parameters and manipulate them. You can use<span> </span><a id="cs38" title="SCAMPER" href="http://creatingminds.org/tools/scamper.htm">SCAMPER</a> method defined by Bob Eberle. (Example:<em><span> </span>a problem with failing relationship)</em></p>
<ul>
<li>S -<span> </span><em><strong>Substitute<span> </span></strong></em>- components, materials, people
<ul>
<li><em>substitute something in your behavior or find another partner</em></li>
</ul>
</li>
<li>C -<span> </span><strong>Combine</strong><span> </span>- mix, combine with other assemblies or services, integrate
<ul>
<li><em>start doing some things together</em></li>
</ul>
</li>
<li>A -<span> </span><strong>Adapt<span> </span></strong>- alter, change function, use part of another element
<ul>
<li><em>change your home responsibilities</em></li>
</ul>
</li>
<li>M -<span> </span><strong>Modify<span> </span></strong>- increase or reduce in scale, change shape, modify attributes (e.g. colour)
<ul>
<li><em>communicate more often, change your tone</em></li>
</ul>
</li>
<li>P -<span> </span><strong>Put to another use</strong>
<ul>
<li><em>use your partner as a tennis or chess opponent, engage as an assistant in fishing</em></li>
</ul>
</li>
<li>E -<span> </span><strong>Eliminate<span> </span></strong>- remove elements, simplify, reduce to core functionality
<ul>
<li><em>separate or stop doing things that annoy your partner</em></li>
</ul>
</li>
<li>R -<span> </span><strong>Reverse<span> </span></strong>- turn inside out or upside down
<ul>
<li><em>say opposite to what you said before </em></li>
</ul>
</li>
</ul>
<div><strong>Abstract</strong> &#8211; solve a problem on an abstract level and apply to the specific problem to find a specific solution. (<a id="e6lo" style="color: #551a8b;" title="Abstraction" href="http://www.creativethinking.net/DT05_ToProduceSomethingCreative.htm?Entry=Good">Abstraction</a>) (Example: <em>Start your blog</em>)</div>
<ul>
<li><em>Think about a specific topic you want to cover. Find out how people start blogs in general, what works and what are common pitfalls. Apply to your topic and situation to grow successful blog.</em></li>
</ul>
<p><strong>Analyze Variations<span> </span></strong>(Example:<span> </span><em>Develop and promote new Content Management System</em>)</p>
<ol>
<li><strong>Parameters of a problem</strong><span> </span>- list variations, combine differently
<ul>
<li><em>cost, time, features, people, quality, vendors, etc; time vs features, in-house vs outsourcing, quality vs speed</em></li>
</ul>
</li>
<li><strong>Attributes list</strong><span> </span>- list attributes of the object (or problem) and try to improve them (<a id="zmih" style="color: #551a8b;" title="Attributes analysis" href="http://www.creativethinking.net/DT07_AttributeAnalysis.htm?Entry=Good">Attributes analysis</a>,<span> </span><a id="y_z5" style="color: #551a8b;" title="Morphological Analysis" href="http://www.mycoted.com/Morphological_Analysis">Morphological Analysis</a>)
<ul>
<li><em>architecture, design, performance, scalability, security, reusability, networking</em></li>
</ul>
</li>
<li><strong>Matrix<span> </span></strong>- create related keywords in main areas, mix and match keywords to form new ideas (<a id="horh" style="color: #551a8b;" title="Leonardo da Vinci Ideabox" href="http://www.creativethinking.net/DT08_DaVincisIdeabox.htm?Entry=Good">Leonardo da Vinci Ideabox</a>)
<ul>
<li><em>solutions (blog, company website, e-commerce, news, social connections), needs (inform, advertise, sell, support), markets (individuals, companies, non-profit, schools, small social groups), technologies (web, video, mobile, aggregation), services (hosting, installation, support, training). For example, what could be opportunity in combination: blog + inform + schools + video + hosting</em></li>
</ul>
</li>
</ol>
<p><strong>Change Context / Process / Forces<span> </span></strong>(Example: <em>Career advance</em>)</p>
<ol>
<li><strong>Force field analysis</strong><span> </span>- maximize positive forces, minimize negative (<a id="dtxm" style="color: #551a8b;" title="Force-Field Analysis" href="http://www.mycoted.com/Force-Field_Analysis">Force-Field Analysis</a>)
<ul>
<li><em>find how to use your strengths more and avoid negative impact of weaknesses</em></li>
</ul>
</li>
<li><strong>Substitute<span> </span></strong>rules, principles, people, places
<ul>
<li><em>change job responsibilities or job itself</em></li>
</ul>
</li>
<li><strong>Anti-action</strong><span> </span>- compensate harmful effect by specific action
<ul>
<li><em>minimize overtime or uninteresting work by changing how you accept your tasks</em></li>
</ul>
</li>
<li><strong>Preliminary action</strong><span> </span>- pre-arrange or change problem context in advance
<ul>
<li><em>build consensus with potential opponents before important meeting</em></li>
</ul>
</li>
<li><strong>Theory of Constraints<span> </span></strong>- find the worst bottleneck and improve until it is no longer a bottleneck, continue with the next bottleneck (<a id="ofx3" style="color: #551a8b;" title="Theory of Constraints" href="http://en.wikipedia.org/wiki/Theory_of_Constraints">Theory of Constraints</a>)
<ul>
<li><em>find what are limiting factors of your growth, work on reducing their impact and increase your abilities and potential</em></li>
</ul>
</li>
<li><strong>Eliminate waste</strong>
<ul>
<li><em>eliminate wasteful activities at work to boost your productivity</em></li>
</ul>
</li>
<li><strong>Lemonade from Lemons</strong><span> </span>- use waste or harmful effect to achieve a positive effect
<ul>
<li><em>learn from your mistakes and use them to improve and become better next time</em>. As Friedrich Nietzsche said:<span> </span><em>&#8220;What doesn&#8217;t kill us makes us stronger.&#8221;</em></li>
</ul>
</li>
<li><strong>Feedback<span> </span></strong>- introduce or increase feedback to improve action or process
<ul>
<li><em>seek for feedback and objective evaluation of your performance to advance faster by fixing your shortcomings</em></li>
</ul>
</li>
</ol>
<p><strong>Explore future scenarios</strong><span> </span>- project future scenarios to find unexpected opportunities (<a id="egmq" style="color: #551a8b;" title="Alternative Scenarios" href="http://www.mycoted.com/Alternative_Scenarios">Alternative Scenarios</a>) (Example:<span> </span><em>Deciding where to invest money</em>)<br />
<em>&#8220;The best way to predict the future is to invent it&#8221;</em> &#8211; Alan Kay</p>
<ol>
<li>Identify<strong><span> </span>forces </strong>
<ul>
<li><em>identify current economic forces and your personal situation</em></li>
</ul>
</li>
<li>Come up with 4-5<span> </span><strong>scenarios<span> </span></strong>- good and bad
<ul>
<li><em>what could happen in the future with both economic and you?</em></li>
</ul>
</li>
<li>Search big<span> </span><strong>opportunities<span> </span></strong>in each
<ul>
<li><em>find how you can benefit from investment in each of scenario</em></li>
</ul>
</li>
</ol>
<div><strong><a id="ppjs" style="color: #551a8b;" title="Absence thinking" href="http://creatingminds.org/tools/absense_thinking.htm">Absence thinking</a></strong><span> </span>- think about what is not there or you didn&#8217;t think before</div>
<h3>Lateral thinking (Creative Spark)</h3>
<p><img class="alignnone" title="both brains" src="http://softwarecreation.org/images/2010/both-brains.jpg" alt="" width="300" height="317" /></p>
<div><a id="tp6x" title="Lateral thinker" href="http://en.wikipedia.org/wiki/Lateral_thinking">Lateral thinker</a> abandons logic, use creative tools and changes concepts and perceptions</div>
<p><strong>Challenge assumptions</strong>, break away from obvious perspectives (<a id="rq2c" style="color: #551a8b;" title="Assumption Busting" href="http://creatingminds.org/tools/assumption_busting.htm">Assumption Busting</a>) (Example:<span> </span><em>Raising troubled teenager</em>)<br />
<em>&#8220;The significant problems we face cannot be solved at the same level of thinking we were at when we created them. &#8220;</em> &#8211; Albert Einstein</p>
<ol>
<li><strong>Expose and challenge</strong><span> </span>all assumptions
<ul>
<li><em>challenge your beliefs about role of a parent</em></li>
</ul>
</li>
<li><strong>Reverse problem<span> </span></strong>in some way<span> </span><a id="u3re" style="color: #551a8b;" title="(Reversal" href="http://creatingminds.org/tools/reversal.htm">(Reversal</a>)
<ul>
<li><em>praise for something you was punishing before</em></li>
</ul>
</li>
<li><strong>Paradox<span> </span></strong>- opposites exist simultaneously (<a id="o2u1" style="color: #551a8b;" title="True and False" href="http://www.creativethinking.net/DT13_TrueAndFalse.htm?Entry=Good">True and False</a>)
<ul>
<li><em>accept that you and your teenager are both right about controversial topic. Try to negotiate from this position</em></li>
</ul>
</li>
<li><strong>Provocation </strong>- wishful thinking, thought experiments
<ul>
<li><em>unleash your imagination, go for crazy ideas about solving a problem</em></li>
</ul>
</li>
<li><strong>Changing viewpoint</strong><span> </span>- think from different perspective (<a id="sgno" style="color: #551a8b;" title="Six hats)" href="http://creatingminds.org/tools/six_hats.htm">Six hats)</a>
<ul>
<li><em>imagine that you are a bird or live in another time. How would you resolve your relations with kid?</em></li>
</ul>
</li>
<li>Finally,<span> </span><strong>challenge any part</strong><span> </span>of the problem &#8211; ask why for anything</li>
</ol>
<p><strong>Force Associations</strong><span> </span>(Example:<span> </span><em>Starting your own software business</em>)<br />
<em>&#8220;Creativity is the power to connect the seemingly unconnected&#8221;</em> &#8211; William Plomer</p>
<ol>
<li><strong>Random keywords</strong><span> </span>- select any word from dictionary and try to connect to your problem  (<a id="cjc5" style="color: #551a8b;" title="Random Words" href="http://creatingminds.org/tools/random_words.htm">Random Words</a>)
<ul>
<li><em>For example, how a tree can be related to your new business?</em></li>
</ul>
</li>
<li><strong>Words of great thinkers</strong><span> </span>- use their quotes and wisdom to associate with a problem.
<ul>
<li>
<div><em>For example, how can Oscar Wilde&#8217;s quote: &#8220;Be yourself; everyone else is already taken&#8221; helps with business ideas? </em></div>
</li>
</ul>
</li>
<li><strong>Free associating with common attributes<span> </span></strong>- select 12 attributes, choose random 2, consider separating and combined (<a id="gc4j" style="color: #551a8b;" title="Combinatory Play" href="http://www.creativethinking.net/DT10_CombinatoryPlay.htm?Entry=Good">Combinatory Play</a>)
<ul>
<li><em>break down into areas &#8211; finances, sales, development, clients, technology, usability, etc. Start pairing randomly</em></li>
</ul>
</li>
<li><strong>Metaphors</strong><span> </span>- similarities and connections of your problem with other distant area
<ul>
<li><em>How analogies of railroad or tropical forest can help with business idea</em></li>
</ul>
</li>
<li><strong>Hieroglyphs </strong>- use Egyptian hieroglyphs to associate with your problem
<ul>
<li><em>arrange randomly <a id="e5-q" style="color: #551a8b;" title="hieroglyphs" href="http://www.greatscott.com/hiero/">hieroglyphs</a> from <a id="afp4" style="color: #551a8b;" title="The Book of Dead" href="http://en.wikipedia.org/wiki/Book_of_the_Dead">The Book of Dead</a> to find clues for creating business</em></li>
</ul>
</li>
</ol>
<p><strong>Visual clues</strong><span> </span>(Example:<span> </span><em>Designing web user interface for the new complex domain</em>)</p>
<ol>
<li><strong>Diagram</strong> to explore, organize and analyze (<a id="h8ov" style="color: #551a8b;" title="Lotus Blossom" href="http://www.creativethinking.net/DT06_LotusBlossomApproach.htm?Entry=Good">Lotus Blossom</a>,<span> </span><a id="hqcb" style="color: #551a8b;" title="Mind Map" href="http://en.wikipedia.org/wiki/Mind_map">Mind Map</a>,<span> </span><a id="f:t0" style="color: #551a8b;" title="Concept Fan" href="http://www.mindtools.com/pages/article/newCT_06.htm">Concept Fan</a>)
<ol>
<li>Explore &#8211; search for new areas that can be related to the problem</li>
<li>Organize &#8211; put together as one picture what you know about the problem</li>
<li>Analyze &#8211; go deep into a problem to find missing details and relations</li>
</ol>
<ul>
<li><em>Draw these 3 types of diagram for web site and business domain: put web site purpose in the center, start drawing branches for big ideas and aspects, branch for smaller and so on<br />
</em></li>
</ul>
</li>
<li><strong>Draw and link abstract symbols</strong><span> </span>for attributes
<ul>
<li><em>create symbols for web patterns and business concepts, shuffle and find ideas in random associations</em></li>
</ul>
</li>
<li><strong>Drawing<span> </span></strong>- draw anything that can be related to your problem;<span> </span><span style="font-family: verdana,arial,helvetica,sans-serif;">lets your subconscious drive your hand</span> (<a id="fg1d" title="Doodling" href="http://creatingminds.org/tools/doodling.htm">Doodling</a>)
<ul>
<li><em>just draw any screen ideas</em></li>
</ul>
</li>
</ol>
<h3>Psychological tools</h3>
<p style="margin: 0px;"><em>&#8220;Everything you can imagine is real.&#8221;</em> &#8211; Pablo Picasso</p>
<p style="margin: 0px;"><img class="alignnone" title="dreamcatcher" src="http://softwarecreation.org/images/2010/dreamcatcher.gif" alt="" width="300" height="450" /></p>
<p style="margin: 0px;">
<p style="margin: 0px;">Use intuition and subconscious to find answers. Our subconscious is a large scene where conscious thought is a <a id="s:8-" style="color: #551a8b;" title="spotlight." href="http://www.newscientist.com/article/mg20627541.900-picking-our-brains-how-powerful-is-the-subconscious.html">spotlight.</a><span> </span>Try to elicit ideas from these dark corners of the most powerful part of your mind. <em><span style="font-style: normal;">(Example:<span> </span></span>Finding new kicking-ass website idea<span style="font-style: normal;">)</span></em></p>
<ol>
<li><strong>Intuition<span> </span></strong>- ask and listen to your intuition
<ul>
<li><em>come up with website ideas without thinking</em></li>
</ul>
</li>
<li><strong><a id="pflp" style="color: #551a8b;" title="Incubation" href="http://creatingminds.org/tools/incubation.htm">Incubation</a></strong><span> </span>- best ideas come than you don&#8217;t expect them, just don&#8217;t miss them
<ul>
<li><em>deeply dig into a problem, put into your mind and forget, and probably soon you will jump from the bath and run to the street screaming &#8216;eureka!&#8217;</em></li>
</ul>
</li>
<li><strong>Fantasies<span> </span></strong>- unleash unreal or crazy questions, suspend judgment and answer them (<a id="hk:5" style="color: #551a8b;" title="Crazy Ideas" href="http://www.creativethinking.net/DT03_IsYourIdeaCrazyEnough.htm?Entry=Good">Crazy Ideas</a>)
<ul>
<li><em>what if you build site for aliens? now you can think about usability for complete dummies, space design, navigation as a star system, etc.</em></li>
</ul>
</li>
<li><strong>Dreaming<span> </span></strong>- capture ideas from dreams
<ul>
<li><em>set questions before you sleep, try to recover answers from dreams immediately after you wake up</em></li>
</ul>
</li>
<li><strong>Drink beer</strong><span> </span>- to slip into different mind state. I don&#8217;t suggest becoming drunk or use  something stronger or illegal :)
<ul>
<li><em>drink and start thinking about website, don&#8217;t foget to record your thoughts early enough :)</em></li>
</ul>
</li>
<li><strong>Surrealistic images</strong><span> </span>- find association of hypnogogic imagery with your challenges
<ul>
<li><em>relax, quiet mind and eyes, become almost unconscious- record experiences immediately after they occur</em></li>
</ul>
</li>
<li><strong>Guided imaginary scenarios</strong><span> </span>to find ideas in unexpected places (<a id="w9d2" style="color: #551a8b;" title="Imaginary Excursion" href="http://www.creativethinking.net/DT09_ImaginaryExcursion.htm?Entry=Good">Imaginary Excursion</a>)
<ul>
<li><em>choose scenario (e.g. going to camp and lost in the forest) and while you experience the journey in the head, search for clues </em></li>
</ul>
</li>
<li><strong>Psychosynthesis<span> </span></strong>- spiritual advisers (<a id="e:x1" style="color: #551a8b;" title="Role-playing" href="http://creatingminds.org/tools/role_play.htm">Role-playing</a>)
<ul>
<li><em>invite Bill Gates, Sigmund Freud or Karl Marx to talk with you inside your head about the kicking-ass website</em></li>
</ul>
</li>
<li><strong>Streaming</strong> <em>- </em>writing out what is in your mind to associate later with the problem
<ul>
<li><em>hide in a comfortable place and start writing &#8211; smart thoughts or gibberish. Find how it could be related to the new website later.</em></li>
</ul>
</li>
</ol>
<h3>Dialogue</h3>
<div><em>&#8220;Adults are always asking little kids what they want to be when they grow up because they&#8217;re looking for ideas”</em><span> </span>- Paula Poundstone</div>
<div><img class="alignnone" title="dialogue" src="http://softwarecreation.org/images/2010/dialogue.jpg" alt="" width="350" height="256" /></div>
<div>Surprisingly, most people think differently than you and can introduce many novel ideas and solutions (Example:<span> </span><em>Plan dream vacation</em>)</div>
<div>
<ol>
<li><strong>Talk with strangers</strong>
<ul>
<li><em>ask about vacation ideas people you don&#8217;t communicate often and you&#8217;ll get plenty of new ideas</em></li>
</ul>
</li>
<li><strong>Brainstorming</strong><span> </span>- exchange ideas and suggestions without judgment, evaluate and revise ideas later (<a id="rxok" style="color: #551a8b;" title="KJ Brainstorming" href="http://www.creativethinking.net/DT15_KJBrainstorming.htm?Entry=Good">KJ Brainstorming</a>)
<ul>
<li><em>ask group of people to generate as many as possible vacation ideas without discussion</em></li>
</ul>
</li>
<li><strong>Brainwriting<span> </span></strong>- parallel generation of ideas in silence (index cards); exchange and develop each other ideas in turn (<a id="lyhg" style="color: #551a8b;" title="Brainwriting" href="http://www.creativethinking.net/DT14_Brainwriting.htm?Entry=Good">Brainwriting</a>)
<ul>
<li><em>everybody in group writes vacation idea on card, give to the next in circle who continue refining this idea</em></li>
</ul>
</li>
<li><strong>Survey<span> </span></strong>- collect ideas from large group of people (<span style="font-family: verdana,arial,helvetica,sans-serif;"><span style="font-size: x-small;"><a id="c7fk" title="Crawford Slip Method" href="http://creatingminds.org/tools/crawford.htm">Crawford Slip Method</a>,<span> </span><a id="i4mr" title="Delphi method" href="http://creatingminds.org/tools/delphi.htm">Delphi method</a></span></span>)
<ul>
<li><em>post survey (e.g. Facebook or </em><a style="color: #551a8b;" href="http://www.surveymonkey.com/"><em>surveymonkey.com</em></a><em>) for vacation ideas</em></li>
</ul>
</li>
<li><strong>Storyboarding<span> </span></strong>- put ideas on the wall as a group works out problems
<ul>
<li><em>post vacation ideas on the wall and let anybody to contribute (add or extend idea)</em></li>
</ul>
</li>
<li><em><strong><span style="font-style: normal;">Socratic dialogue -</span></strong><span style="font-style: normal;"> have a conversation with a smart person and probe various dimensions of thinking: purpose, evidence, reasons, data, claims, beliefs, interpretations, deductions, conclusions, the implications and consequences of thought, response to alternative thinking from contrasting points of view, and so on.</span><br />
</em></li>
</ol>
<h3>Trials and Errors</h3>
<div><span style="font-size: small;"><strong><img class="alignnone" title="Edison" src="http://softwarecreation.org/images/2010/edison.jpg" alt="" width="300" height="399" /><br />
</strong></span></div>
<p>Solving a problem by trial and error is an expensive, but reliable way to find a solution. In science it called<span> </span><a id="qutk" style="color: #551a8b;" title="scientific method" href="http://en.wikipedia.org/wiki/Scientific_method">scientific method</a>. Most scientific discoveries are done using this method. (Example:<span> </span><em>Becoming happy</em>)</p>
<ol>
<li><strong>Ask a Question</strong>
<ul>
<li><em>form a problem statement &#8211; what is happiness for you?</em></li>
</ul>
</li>
<li><strong>Do Background Research</strong>
<ul>
<li><em>learn what other people think about happiness</em></li>
</ul>
</li>
<li><strong>Construct a Hypothesis</strong>
<ul>
<li><em>what could make you happy?</em></li>
</ul>
</li>
<li><strong>Test Your Hypothesis by Doing an Experiment</strong>
<ul>
<li><em>try your ideas in practice</em></li>
</ul>
</li>
<li><strong>Analyze Your Data and Draw a Conclusion</strong>
<ul>
<li><em>are you happy now? should you change a hypothesis and start again?<br />
</em></li>
</ul>
</li>
<li><strong>Communicate Your Results</strong>
<ul>
<li><em>share your results &#8211; help other people to become happier</em></li>
</ul>
</li>
</ol>
<h3>Summary</h3>
<div>Your life success depends on your ability to choose right problems and solve them. Do not give up or settle for an ineffective solution. Use the power of your mind to creatively solve problems the best way possible. Control your life.</div>
<div><em>&#8220;He is able who thinks he is able&#8221;</em> -Buddha</p>
<h3>References</h3>
<ul>
<li><a title="Thinkertoys: a handbook of creative-thinking techniques" href="http://www.amazon.com/gp/product/1580087736?ie=UTF8&amp;tag=softwcreatmys-20&amp;linkCode=xm2&amp;camp=1789&amp;creativeASIN=1580087736">Thinkertoys: a handbook of creative-thinking techniques</a>, Michael Michalko</li>
<li><a id="ujso" style="color: #551a8b;" title="http://www.mycoted.com/Category:Creativity_Techniques" href="http://www.mycoted.com/Category:Creativity_Techniques">http://www.mycoted.com/Category:Creativity_Techniques</a></li>
<li><a href="http://creatingminds.org/">http://creatingminds.org/</a></li>
<li><a title="http://www.mindtools.com/pages/main/newMN_CT.htm" href="http://www.mindtools.com/pages/main/newMN_CT.htm">http://www.mindtools.com/pages/main/newMN_CT.htm</a></li>
<li><a href="http://www.creativethinking.net/WP03_Techniques.htm">http://www.creativethinking.net/WP03_Techniques.htm</a></li>
</ul>
</div>
</div>
<img src="http://softwarecreation.org/?ak_action=api_record_view&id=144&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://softwarecreation.org/2010/how-to-become-an-expert-creative-problem-solving/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>When should you Release Early and Often?</title>
		<link>http://softwarecreation.org/2009/when-should-you-release-early-and-often/</link>
		<comments>http://softwarecreation.org/2009/when-should-you-release-early-and-often/#comments</comments>
		<pubDate>Thu, 24 Dec 2009 21:08:06 +0000</pubDate>
		<dc:creator>Andriy Solovey</dc:creator>
				<category><![CDATA[Concepts]]></category>
		<category><![CDATA[Practices]]></category>
		<category><![CDATA[Process]]></category>

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

		<guid isPermaLink="false">http://softwarecreation.org/2009/how-to-rescue-failing-software-projects-toyota-way/</guid>
		<description><![CDATA[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. The manager tells that we are brilliant [...]]]></description>
			<content:encoded><![CDATA[<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>
<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>How to become an Expert. Embrace Reality.</title>
		<link>http://softwarecreation.org/2009/how-to-become-an-expert-embrace-reality/</link>
		<comments>http://softwarecreation.org/2009/how-to-become-an-expert-embrace-reality/#comments</comments>
		<pubDate>Tue, 12 May 2009 04:19:01 +0000</pubDate>
		<dc:creator>Andriy Solovey</dc:creator>
				<category><![CDATA[Concepts]]></category>
		<category><![CDATA[Expertise]]></category>
		<category><![CDATA[People]]></category>
		<category><![CDATA[Practices]]></category>
		<category><![CDATA[Skills]]></category>

		<guid isPermaLink="false">http://softwarecreation.org/2009/how-to-become-an-expert-embrace-reality/</guid>
		<description><![CDATA[Reality is merely an illusion, albeit a very persistent one &#8211; Albert Einstein An expert have much better models of reality and methods to build them than an ordinary specialist. The expert, armed with these models, can quickly put pieces of a problem puzzle together, find explanations and solve the problem. Models can be related [...]]]></description>
			<content:encoded><![CDATA[<p><em>Reality is merely an illusion, albeit a very persistent one</em> &#8211; Albert Einstein</p>
<p>An expert have much better models of reality and methods to build them than an ordinary specialist. The expert, armed with these models, can quickly put pieces of a problem puzzle together, find explanations and solve the problem.</p>
<p id="ejcw" style="text-align: left"><img src="http://softwarecreation.org/images/2009/expert-models.jpg" width="600" height="600" /></p>
<p>Models can be related to anything &#8211; software systems, business domain or your personal relationships. <span id="more-83"></span></p>
<h3><strong>Predictions and </strong><strong>Solutions!</strong></h3>
<blockquote><p><em>A theory is a good theory if it satisfies two requirements: It must accurately describe a large class of observations on the basis of a model that contains only a few arbitrary elements, and it must make definite predictions about the results of future observations.</em></p>
<p align="right">Stephen Hawking, A Brief History of Time</p>
</blockquote>
<p>Any expert as good as he can effectively predict future outcomes and solve new unforeseen problems. Solutions and predictions are not coming out of blue. They stem from good understanding of reality in an expert&#8217;s head. Internal models of reality help to explain problems, find relations and play with future scenarios. These models establish the base for effective thinking and direct expert&#8217;s effort to solve problems. If you have poor models of reality, you will make bad decisions. Good models of reality allow reliable predictions and efficient solutions than vague guesses and ad-hoc spontaneous fixes.</p>
<p>Characteristics of a good model:</p>
<ol>
<li><strong>Explanation </strong>- provides understanding of elements, processes, events, root causes and effects</li>
<li><strong>Testable predictions </strong>- a model that makes no predictions that can be observed is not a useful model.</li>
<li><strong>Simple </strong>- you can remember and use a model without titanic effort</li>
<li><strong>Frameworks </strong>- knowledge how to recognize common patterns and deal with range of similar problems. Frameworks allow to extend and apply existing models to new situations without building new models.</li>
</ol>
<h3>Brains &#8211; the main tool of an expert</h3>
<p><em>I think, therefore I am</em> &#8211; Rene Descartes</p>
<p>An expert&#8217;s brain carry and operates with models of reality. Unfortunately, our brains are not ideal for this task. Models they create are not identical to reality. Here is why.</p>
<p><strong>limitations</strong></p>
<ul>
<li><em>perception </em>- our senses deliver to brain partial and incomplete information</li>
<li><em>memory </em>- our brains can process and memorize only fraction of available information; and even more &#8211; we quickly forget this knowledge without practice</li>
<li><em>imagination </em>- brains automatically filling gaps for missing information, substitute with interpretation based on internal representation of the outside world</li>
</ul>
<p><strong>cognitive biases</strong> (bugs in brain software)</p>
<ul>
<li><em>anchoring or priming</em> &#8211; previous irrelevant experiences prime your consequent thinking and decisions</li>
<li><em>need for closure</em> &#8211; we are uncomfortable with doubt and uncertainty; we have urge to resolve and find convenient explanations quickly without much thinking</li>
<li><em>confirmation bias</em> -  from all facts we unconsciously pick facts that confirm our beliefs and predispositions</li>
<li><em>symbolic reduction</em> &#8211; we are anxious to reduce complexity for better understanding and tend to form simplified generalizations ignoring complex details and relations.</li>
<li>and <a href="http://en.wikipedia.org/wiki/List_of_cognitive_biases" title="many others" id="fa5u">many others</a></li>
</ul>
<p><strong>social behavior</strong></p>
<ul>
<li><em>subconscious models and believes</em> &#8211; our minds carry beliefs and views imposed by our parents, teachers and culture.  These subconscious models deeply influence our models of reality without much awareness.</li>
<li><em>peer pressure, conformity</em> &#8211; our minds are wired to conform and agree with other people making us blind for inconvenient facts, ready to follow crowd and accept conventional views without critical revision</li>
</ul>
<h3><strong>Objective Reality</strong></h3>
<p><em>There are no facts, only interpretations.</em>  &#8211; Friedrich Nietzsche</p>
<p>Even smartest brains will have challenges to understand reality.</p>
<p>We deal with <strong>complex situations</strong>:</p>
<ul>
<li><em>incomplete information</em> &#8211; we rarely have access to full information and even if it is available we don&#8217;t have capacity to collect and absorb all of it</li>
<li><em>perpetual changes</em> &#8211; reality is very fluid and changes every second</li>
<li><em>complex relations and behavior</em> &#8211; complex systems are difficult to understand: causes and effects, correlations, feedback loops, influence of processes in external systems</li>
<li><em>difficult to test</em> &#8211; we often cannot afford large number of experiments, trials and errors to come up with right models and explanations</li>
</ul>
<p>We deal with <strong>people</strong> who make our reality very complicated:</p>
<ul>
<li><em>unpredictable </em>- people are difficult to predict, they are often irrational and inconsistent</li>
<li><em>confusing </em>- people cannot clearly explain their thinking and feelings or even don&#8217;t understand themselves</li>
<li><em>deceiving </em>- sometimes people have difficulty to tell truth or simply lie for own advantage</li>
</ul>
<h3><strong>Building Models</strong></h3>
<p><em>The test of a first-rate intelligence is the ability to hold two opposed ideas in the mind at the same time, and still retain the ability to function.</em> -  F. Scott Fitzgerald</p>
<p>We understand reality different ways &#8211; learning, investigating problems, finding new solutions and practicing. For years we can concentrate on solving immediate problems and do our work without attempts to understand the big picture. Many good specialists have incomplete understanding and fragmented knowledge that still allow to perform well. But it is impossible to become an expert without deep understanding and conscious effort to build good models of reality.</p>
<p>For example, we can stumble for a long time with challenges and failures in building software without understanding its <a href="http://softwarecreation.org/2007/what-is-software-development/" title="essence" id="y:mc">essence</a>  and <a href="http://softwarecreation.org/2007/human-forces-and-software-creators/" title="forces" id="iufv">forces</a>. (By the way, search for this understanding is the reason for this blog existence).</p>
<p>Potentially everything what we do in life could help to build and improve our models of reality. We just need to consciously relate our experience and learning to our understanding of reality. And we can do it on the go without special preparation, when we actively engage our minds &#8211; working, talking, reading, practicing, traveling, thinking and even sleeping. Just focus on reality modeling.</p>
<p>The models of reality could be explicit (<strong>facts and theories</strong>) and implicit (<strong>intuition and tacit knowledge</strong>).<br />
<img src="http://softwarecreation.org/images/2009/models-composition.jpg" width="300" height="300" /></p>
<p>You can use several strategies to build models in your whole mind.<br />
<strong>A. Analytical</strong></p>
<ul>
<li>find what is most important, map and connect main elements, players and subsystems; learn relations; draw Mind Maps</li>
<li>understand influence of context and main forces</li>
<li>create stories, metaphors and patterns &#8211; make your models better suited for your brain</li>
<li>repeat the process for the most important subsystems</li>
</ul>
<p><strong>B. Empirical</strong></p>
<ul>
<li>find most pressing problems, contradictions or real life facts</li>
<li>understand how do they fit into your models of reality</li>
<li>it is great if they don&#8217;t fit &#8211; you have opportunity to improve your models</li>
</ul>
<p><strong>C. Synthesis</strong> &#8211; reconcile your models with existing knowledge and leading models</p>
<ul>
<li>find what are dominating models, views and believes; what other experts think</li>
<li>critically analyze this information and theories behind</li>
<li>find the best opposing theories and try to combine them to form better model</li>
</ul>
<p><strong>D.</strong> <strong><a href="http://en.wikipedia.org/wiki/Scientific_method" title="Scientific method" id="yk9g">Scientific method</a> </strong> &#8211; use it for practical evaluation of models and confirmation of your theories.</p>
<ul>
<li>build hypothesis about reality and outcomes of your actions</li>
<li>test it in practice</li>
<li>learn from results and adjust your models</li>
</ul>
<p><strong>E. People interests and agenda</strong> &#8211; people are often most surprising and unpredictable element of reality. Your models will be much closer to reality if you understand motives, interests and agenda of involved people.<br />
<strong>F. Change perspective</strong> &#8211; switch different perspectives to enrich models &#8211; economic, emotional, social, physical, etc. Try to view from opposite viewpoints and set of principles. Imagine yourself as user of your system, investor of your company, manager, any animal, computer part, etc. (Try to get back without loosing your identity :))  Web developers have interesting concepts of <a href="http://en.wikipedia.org/wiki/Personas" title="Personas" id="dujl">Personas</a> &#8211; imaginary users with distinct behavior on website that help to design a system for various cohesive sets of needs.<br />
<strong>G.</strong> <strong><a href="http://en.wikipedia.org/wiki/Lateral_thinking" title="Lateral thinking" id="u._z">Lateral thinking</a> </strong></p>
<ul>
<li>random association &#8211; associate models with recent books, distant knowledge fields, your favorite characters</li>
<li>provocative thinking &#8211; make unacceptable, funny, stupid ways to explain problems and shock your models</li>
<li>ask &#8220;why?&#8221; &#8211; continue asking &#8216;why&#8217; until your reach questions that nobody could answer on this Earth (or the only answer is <a href="http://en.wikipedia.org/wiki/Phrases_from_The_Hitchhiker%27s_Guide_to_the_Galaxy#Answer_to_Life.2C_the_Universe.2C_and_Everything_.2842.29" title="42" id="pc2c">42</a>).</li>
<li>expand concepts borrowed from other sources to have wider horizon for ideas</li>
</ul>
<p>In overall, you will switch between <a href="http://softwarecreation.org/2008/ideas-in-software-development-revolution-vs-evolution-part-1/" title="two grand strategies" id="xpdh">two grand strategies</a> &#8211; Evolution (discover reality and adopt to it) and Revolution (breakthrough and change reality). The choice depends on models maturity, certainty and your people capabilities.</p>
<h3>Therefore</h3>
<p><em>Few people have the imagination for reality.</em>  &#8211; Johann Wolfgang von Goethe</p>
<p>You can be certain that reality in your head is different from objective reality, which is complex, changing and controversial. Effective experts don&#8217;t have choice and master reality by<br />
1. Accepting own limitations in understanding of elusive reality<br />
2. Building good models of reality applying different strategies<br />
3. Using, testing and improving models in practice</p>
<p>Good models of reality will make your thinking, decisions and solutions much better. They will make you a master of reality instead of a victim of reality. Good luck with embracing reality!<br />
<strong>References:</strong><br />
<a href="http://www.amazon.com/gp/product/1422118924?ie=UTF8&amp;tag=softwcreatmys-20&amp;linkCode=xm2&amp;camp=1789&amp;creativeASIN=1422118924" title="The Opposable Mind: How Successful Leaders Win Through Integrative Thinking" id="ri0p">The Opposable Mind: How Successful Leaders Win Through Integrative Thinking</a> , by Roger L. Martin<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</p>
<img src="http://softwarecreation.org/?ak_action=api_record_view&id=83&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://softwarecreation.org/2009/how-to-become-an-expert-embrace-reality/feed/</wfw:commentRss>
		<slash:comments>6</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[experts 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 be [...]]]></description>
			<content:encoded><![CDATA[<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>
<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[A 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 task [...]]]></description>
			<content:encoded><![CDATA[<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>
<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>A Few Words In Defense of Copy And Paste Programming</title>
		<link>http://softwarecreation.org/2008/a-few-words-in-defense-of-copy-and-paste-programming/</link>
		<comments>http://softwarecreation.org/2008/a-few-words-in-defense-of-copy-and-paste-programming/#comments</comments>
		<pubDate>Tue, 23 Dec 2008 04:48:20 +0000</pubDate>
		<dc:creator>Andriy Solovey</dc:creator>
				<category><![CDATA[Practices]]></category>

		<guid isPermaLink="false">http://softwarecreation.org/2008/a-few-words-in-defense-of-copy-and-paste-programming/</guid>
		<description><![CDATA[I was always against Copy and Paste programming. I condemned people who use this practice as discrediting the honorable profession of The Programmer. This evil activity inflates application code without adding anything useful. This shameful practice causes various complications &#8211; more code, more things to remember, needless complexity, and difficulty to manage and synchronize related [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://softwarecreation.org/images/2007/i-robot.jpg" /></p>
<p>I was always against <a href="http://en.wikipedia.org/wiki/Copy_and_paste_programming" title="Copy and Paste programming" id="ozzc">Copy and Paste programming</a>. I condemned people who use this practice as discrediting the honorable profession of The Programmer. This evil activity inflates application code without adding anything useful. This shameful practice causes various complications &#8211; more code, more things to remember, needless complexity, and difficulty to manage and synchronize related changes in the future. But at some point, I admitted to myself &#8211; things are not so black and white. I do <em>Copy and Paste</em> in my code, it is difficult to resist this seductive activity.</p>
<p>The only indulgence is that I&#8217;m very keen <strong>to eliminate bad effects of Copy and Paste before finishing my task</strong>.</p>
<p>I use two main approaches for writing new code. The first is <strong>Top-Down</strong> &#8211; I have clear design ideas how I should program and I know what classes and components to use. I go ahead and write code from scratch using my memory and power of intellect :). There are few problems with this approach. Unfortunately, my memory is not so great and knowledge is not so vast. Regularly I have new tasks that I don&#8217;t know or don&#8217;t remember how to program. Sometimes I don&#8217;t get immediately what other people programmed without debugging. And often I want to save time and avoid re-implementing the same idea again. And that is why I also use the second approach &#8211; <strong>Bottom-Up</strong>. I copy and paste code first. And after I figure out how this code works, how to use, fit and improve it.<span id="more-79"></span></p>
<h3>When is Copy and Paste approach useful?</h3>
<p>Shamelessly, I can come up with few cases:<br />
1. <strong>Work by example</strong> &#8211; you found new code through <a href="http://softwarecreation.org/2008/how-to-use-search-skills-to-become-effective-programmer/" title="search" id="tbnb">search</a> and want to  use it immediately to solve your problems.<br />
2. <strong>Quick start</strong> &#8211; you copy code (including your old code) to save time.<br />
3. <strong>Test in the new context</strong> &#8211; you want to quickly assess if code will be correctly running in the context of your application<br />
4. <strong>Too hard to reuse</strong> &#8211; if you cannot reuse, just copy code. For example, you don&#8217;t have time to build common framework with separate application or another team owns code and don&#8217;t want you to touch and spoil it.<br />
5. <strong>Series of experiment</strong>s &#8211; you try to find the best way to solve a problem and copy code to try if it solves a problem well.</p>
<h3>How to eliminate bad effects of Copy and Paste</h3>
<p>Now I&#8217;m going to return to canonical view on evilness of <em>Copy and Paste</em>. Even if you have legitimate reason to use <em>Copy and Paste</em>, it is acceptable only on temporary basis before you commit your code or your team granted absolution (probably for very short time) :).<br />
Therefore, after committing <em>Copy and Paste</em> scandalous act, do following:<br />
1. <strong>Understand what have you done </strong>- any code that you don&#8217;t understand is ineffective for future use, and potentially excessive, wasteful and dangerous.<br />
2. <strong>Clean, minimize and shape</strong> &#8211; remove all useless, over-engineered and questionable pieces; consider yourself as a jeweler, who is converting rough crystals in beautiful diamonds that fit well into solid code and concepts in your program.<br />
3. <strong>Refactor and Integrate</strong> &#8211; use refactoring techniques to integrate new cleaned code into existing application: improve design, simplify and increase power of your code.<br />
4. <strong>Learn </strong>- the best outcome of this sinful activity is <a href="http://softwarecreation.org/2008/how-to-use-search-skills-to-become-effective-programmer/" title="gained knowledge and experience" id="vfiy">gained knowledge and experience</a> that will make <em>Copy and Paste</em> unnecessary next time.</p>
<p>With age and experience of harsh programming reality, I&#8217;m becoming less purist and more pragmatic. I have started to accept everything what makes me effective. The only rule &#8211; I shouldn&#8217;t be ashamed of my code after the finish&#8230; even if I did <em>Copy and Paste</em> couple times ;)</p>
<p>What do you think?</p>
<img src="http://softwarecreation.org/?ak_action=api_record_view&id=79&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://softwarecreation.org/2008/a-few-words-in-defense-of-copy-and-paste-programming/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

