<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Making the Complex Simple &#187; Paired Programming</title>
	<atom:link href="http://simpleprogrammer.com/category/paired-programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://simpleprogrammer.com</link>
	<description>Software Development from John Sonmez&#039;s Perspective</description>
	<lastBuildDate>Tue, 29 May 2012 17:32:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='simpleprogrammer.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Making the Complex Simple &#187; Paired Programming</title>
		<link>http://simpleprogrammer.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://simpleprogrammer.com/osd.xml" title="Making the Complex Simple" />
	<atom:link rel='hub' href='http://simpleprogrammer.com/?pushpress=hub'/>
		<item>
		<title>Switching Gears is Grinding Gears</title>
		<link>http://simpleprogrammer.com/2012/03/10/switching-gears-is-grinding-gears/</link>
		<comments>http://simpleprogrammer.com/2012/03/10/switching-gears-is-grinding-gears/#comments</comments>
		<pubDate>Sat, 10 Mar 2012 18:06:56 +0000</pubDate>
		<dc:creator>jsonmez</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Paired Programming]]></category>
		<category><![CDATA[Process Improvement]]></category>
		<category><![CDATA[Psychology]]></category>
		<category><![CDATA[Teams]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[context switching]]></category>
		<category><![CDATA[productivity]]></category>
		<category><![CDATA[psychology]]></category>

		<guid isPermaLink="false">https://complextosimple.wordpress.com/?p=1489</guid>
		<description><![CDATA[Pay attention young programmers, this is the most important piece of programming advice you will ever hear. Well perhaps not, but it might be the most important piece of programming advice you hear today. “Switching gears is grinding gears.” I’ve been doing this programming thing for quite a while now, and I have come to [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=simpleprogrammer.com&#038;blog=10597120&#038;post=1489&#038;subd=complextosimple&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Pay attention young programmers, this is the most important piece of programming advice you will ever hear.</p>
<p>Well perhaps not, but it might be the most important piece of programming advice you hear today.</p>
<blockquote><p>“Switching gears is grinding gears.”</p>
</blockquote>
<p><a href="http://complextosimple.files.wordpress.com/2012/03/gear-intro.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:block;float:none;margin-left:auto;margin-right:auto;padding-top:0;border-width:0;" title="gear-intro" border="0" alt="gear-intro" src="http://complextosimple.files.wordpress.com/2012/03/gear-intro_thumb.jpg?w=285&h=361" width="285" height="361" /></a></p>
<p>I’ve been doing this programming thing for quite a while now, and I have come to realize that the biggest thing that saps my productivity is switching gears.</p>
<p>What do I mean by switching gears?</p>
<h2></h2>
<h2>Many different contexts</h2>
<p>Switching gears can apply to a variety of different contexts, but it is basically whenever you are working on some task or technology and have to stop what you are doing and either do something else or change the type of thing you are doing.</p>
<p>This is really a bit different than multi-tasking.&#160; Multi-tasking is really trying to do more than one thing at once.&#160; It usually involves a large amount of rapid context switches, but for this post I am more concerned about the general idea of breaking rhythm.</p>
<p>I think it is easier to speak about this subject if we talk about some specific applications of the idea and why they are harmful.</p>
<h2></h2>
<h2>Switching problems</h2>
<p>In the Agile world of software development today, we often are required to switch from problem domain to problem domain as many of our iterations contain mixes of different features on different parts of the system and bugs to be fixed.</p>
<p>Have you ever been in the situation where you were just beginning to understand how some area of the code base worked, or how to work with a particular customer on a particular problem space and then had to switch to something else and start all over again?</p>
<p>Even when you switch back to the original context you were working with, if enough time goes by, it becomes new again.&#160; You have to relearn much of what you had learned the last time and just when you begin to hit your groove, the cycle begins again.</p>
<p>This form of switching gears is at the very least frustrating, and at the most a complete demotivator and productivity sapper.</p>
<p>Unfortunately for most developers, this problem is out of your immediate control.&#160; But, take note product owners and project managers, there is a reason why iterations should have a goal.</p>
<p>If you are in the precarious position of being a developer pinned against the ropes, try to make some noise and let your management and product owners know that your team will be much more efficient when you aren’t switching gears all the time.</p>
<p>In my experience, the results of replacing this constant context switching with the synergy of a common goal and related features in a segment of time has an astounding effect on productivity that is hard for any serious businessperson to ignore.&#160; So speak up!</p>
<p><a href="http://complextosimple.files.wordpress.com/2012/03/clss_065.gif"><img style="background-image:none;padding-left:0;padding-right:0;display:block;float:none;margin-left:auto;margin-right:auto;padding-top:0;border-width:0;" title="Clss_065" border="0" alt="Clss_065" src="http://complextosimple.files.wordpress.com/2012/03/clss_065_thumb.gif?w=198&h=294" width="198" height="294" /></a></p>
<h2>Switching technology</h2>
<p>This is the primary reason why I have a distaste for JavaScript.&#160; It is why even in this abundance of web development, I would still rather program a client application.</p>
<p>Switching technology is painful!</p>
<p>This is one of those things that is unavoidable in todays development environment.&#160; If you are a web developer, you are going to be working with HTML, JavaScript, probably some sort of server side language, and most likely some form of SQL.</p>
<p>It really isn’t worth trying to fight this because you are going to be going against the technology grain to do so.&#160; Although, I do suppose this may be one of the reasons for the recent popularity of Node.js.</p>
<p>What we can try to do is to minimize the context switch as much as possible.&#160; We do this by sticking with a particular way of doing things and not chasing after each new technology of JavaScript framework that comes out each week.</p>
<p>I’m not saying to not learn new things.&#160; It is very important to always be learning.</p>
<p>What I am saying, is to try to find some kind of rhythm with the technology stack you are working with and try not to switch that up.</p>
<p>Technology specific training can really help here as well.&#160; I for one, need to learn JQuery better.&#160; The problem is that when I am working on a web based feature, I am not forced to learn JQuery because I am not in that context long enough.</p>
<p>So what do I do instead?</p>
<p>I waste time Googling for answers.&#160; I know that I have a short coming here and I need to just bite the bullet and spend some dedicated time to really thoroughly learn JQuery, because by Googling for little pieces of it at a time, I am not really making much headway and the context switch ends up stealing what I do learn from my memory.</p>
<p>One more aspect of this is the idea of focused teams.&#160; Many software development groups do not like to specialize their developers onto one focus area.&#160; I agree whole-heartily with the idea of non-specialization.&#160; </p>
<p>But!&#160; There is huge benefit to be gained by keeping the same group of developers working on a specific set of technology or part of the code base for a set period of time.&#160; I’ll talk about this a bit more, towards the end of this post, but the basic idea is that it takes time for people to find their groove.</p>
<p>I think it is optimal to break any large team up into smaller technology area focused teams that regularly rotate every 3 months or so.&#160; The idea here is that you give those teams enough time to get good at what they are doing and actually commit what they have learned to memory, but you rotate them often enough that they don’t end up becoming specialists which are unable to see the whole picture.</p>
<h2>Switching teams</h2>
<p>This one typically isn’t an issue, but it can be depending on the environment that you are working in.</p>
<p>Teams need enough time to go through that forming, storming, and norming set of phases.&#160; If you are constantly interrupting this process by switching around team members, you are never going to get the team to act as an entity of its own.</p>
<p>Teams are generally more efficient than individuals, because they benefit from synergy, when 1 + 1 = more than 2.</p>
<p>But just like a big truck taking some time to get up speed, a team takes time to get going.&#160; Also like a big truck, a team can gain momentum that individual developers seldom can achieve.</p>
<p>A smaller aspect of this is pair programming.&#160; I suppose that many have been successful switching up programming pairs once a day or so, but I suppose that more teams have been successful switching up pairs at longer intervals.</p>
<p>For me, this interval varies.&#160; Sometimes, I feel like I need to stay paired with a teammate for longer than 2 weeks, which is our regular interval, sometimes 2 weeks is fine.&#160; It depends on what you are working on and how much momentum you have.</p>
<p>They key here is to make sure that you are giving teams enough time to take up their own flag and stake their territory.&#160; <a href="http://simpleprogrammer.com/2011/08/01/what-is-a-team/">Teams can take some time to find their common goal.</a>&#160; Self-direction can really help with this.</p>
<h2></h2>
<h2>The groove</h2>
<p>Ever tried to turn a flat head screw with a screwdriver, but it doesn’t quite turn, because you can’t seem to get the head of the screwdriver into the groove of the screw?</p>
<p><a href="http://complextosimple.files.wordpress.com/2012/03/screwdriver-1.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;" title="This Shutterstock image #2798630 was downloaded on 3-13-07 for HSW: QUICK FIXES FOR YOUR HOME, 730175. " border="0" alt="This Shutterstock image #2798630 was downloaded on 3-13-07 for HSW: QUICK FIXES FOR YOUR HOME, 730175. " src="http://complextosimple.files.wordpress.com/2012/03/screwdriver-1_thumb.jpg?w=484&h=347" width="484" height="347" /></a></p>
<p>You twist that screwdriver around a bit until finally it slips into the groove.&#160; Then when you turn the screwdriver the screw turns with it.</p>
<p><strong>As humans, we tend to be like screwdrivers, we have to find our groove.&#160; We all have this adjustment period where we are fumbling through things.</strong>&#160;</p>
<p>It is very important to make sure that we aren’t switching gears so often that we are not actually turning any screws once we are in the groove.</p>
<p>Regardless of what kind of context switching you are doing—whether it is problem domain, technology or teams—it is important to make sure that you are not spending 90% of your time finding the groove and only 10% of your time “in the groove.”</p>
<p>Depending on what you are doing and what the context switch is, the proper amount of time before switching contexts is going to vary, but I think it is very important be aware of this phenomenon and plan around it.&#160; If you don’t you are going to end up spinning your wheels, which is unfulfilling to say the least.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/complextosimple.wordpress.com/1489/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/complextosimple.wordpress.com/1489/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/complextosimple.wordpress.com/1489/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/complextosimple.wordpress.com/1489/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/complextosimple.wordpress.com/1489/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/complextosimple.wordpress.com/1489/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/complextosimple.wordpress.com/1489/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/complextosimple.wordpress.com/1489/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/complextosimple.wordpress.com/1489/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/complextosimple.wordpress.com/1489/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/complextosimple.wordpress.com/1489/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/complextosimple.wordpress.com/1489/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/complextosimple.wordpress.com/1489/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/complextosimple.wordpress.com/1489/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=simpleprogrammer.com&#038;blog=10597120&#038;post=1489&#038;subd=complextosimple&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://simpleprogrammer.com/2012/03/10/switching-gears-is-grinding-gears/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/695e2a956b2dcb5ac45a7095b6ee338a?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">jsonmez</media:title>
		</media:content>

		<media:content url="http://complextosimple.files.wordpress.com/2012/03/gear-intro_thumb.jpg" medium="image">
			<media:title type="html">gear-intro</media:title>
		</media:content>

		<media:content url="http://complextosimple.files.wordpress.com/2012/03/clss_065_thumb.gif" medium="image">
			<media:title type="html">Clss_065</media:title>
		</media:content>

		<media:content url="http://complextosimple.files.wordpress.com/2012/03/screwdriver-1_thumb.jpg" medium="image">
			<media:title type="html">This Shutterstock image #2798630 was downloaded on 3-13-07 for HSW: QUICK FIXES FOR YOUR HOME, 730175. </media:title>
		</media:content>
	</item>
		<item>
		<title>Don&#8217;t Snub the Code Review</title>
		<link>http://simpleprogrammer.com/2010/06/09/dont-snub-the-code-review/</link>
		<comments>http://simpleprogrammer.com/2010/06/09/dont-snub-the-code-review/#comments</comments>
		<pubDate>Wed, 09 Jun 2010 15:37:54 +0000</pubDate>
		<dc:creator>jsonmez</dc:creator>
				<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[Code Reviews]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Paired Programming]]></category>
		<category><![CDATA[Process Improvement]]></category>
		<category><![CDATA[Self Improvement]]></category>

		<guid isPermaLink="false">https://complextosimple.wordpress.com/?p=921</guid>
		<description><![CDATA[The topic of code reviews has always caused much debate in many software shops where I have worked. I am often asked what my opinion of doing code reviews is.  My answer might surprise you. I don’t like them.  I prefer not to do them. What? Let me be more specific.  I don’t like code [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=simpleprogrammer.com&#038;blog=10597120&#038;post=921&#038;subd=complextosimple&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>The topic of code reviews has always caused much debate in many software shops where I have worked.</p>
<p>I am often asked what my opinion of doing code reviews is.  My answer might surprise you.</p>
<p><a href="http://complextosimple.files.wordpress.com/2010/06/wtfs_per_minute.jpg"><img style="display:inline;border:0;" title="wtfs_per_minute" src="http://complextosimple.files.wordpress.com/2010/06/wtfs_per_minute_thumb.jpg?w=484&h=438" border="0" alt="wtfs_per_minute" width="484" height="438" /></a></p>
<p>I don’t like them.  I prefer not to do them.</p>
<p>What?</p>
<p>Let me be more specific.  I don’t like code reviews that happen after the work is already done.</p>
<p>I do like code reviews that happen continuously as the work is being done.  This is called <a href="http://simpleprogrammer.com/2009/12/11/pair-programming-why/">paired programming</a>.  (This <a href="http://prezi.com/7syjl9hdcxga/pair-programming/">prezi presentation</a> might also be helpful.)</p>
<h2>Paired programming = continuous code review?</h2>
<p>Yes.  That is exactly what I am saying.</p>
<p>Think about it for a second.  Can you really have a better, more honest and more interactive code review than paired programming provides?  If two developers are working jointly on a portion of code, it is being reviewed as it is being written.</p>
<p>I’m going to divert a bit to talk about some of the common problems that happen in code reviews, then I’m going to talk about how paired programming solves them.</p>
<h2>Code review problems</h2>
<p><strong>#1.  Not telling the truth</strong></p>
<p>There really is no value in a code review where no one says what they really think is wrong with the code, and instead picks out some little non-offensive thing like a naming convention that wasn’t followed.</p>
<p>All too often, code reviews are dominated by a fear of insulting the person’s code that is being reviewed.  This kind of weak code review provides no benefit.  I would go so far as to say it is reinforcing the practice of writing bad code, because bad code is rubber stamped.</p>
<p><strong>#2.  Ego</strong></p>
<p>To have a successful code review everyone has to check their ego at the door.  This rarely happens.  Code is something that has been creatively designed, not too many people can take a critique of their labor, even fewer of their art.</p>
<p>Without a spirit of humility and openness, code reviews don’t provide any value.  It is one thing to point out a problem, it is another thing to do something about it.</p>
<p><strong>#3.  Wrong focus</strong></p>
<p>One of the most common errors of code reviews is paying attention to formatting, coding style, or naming conventions.  Those topics don’t belong in a code review at all.</p>
<p>Tools can automatically format the code and statically analyze problems with coding style or naming conventions.  <strong>It is a complete and total waste of time to have a human reviewer review any of those things.</strong></p>
<p>Seriously, if someone comes into a code review and they haven’t run the auto code formatter on their code, and they haven’t run the static analysis tools and fixed the problems found there, don’t be rude, just tell them nicely that their code is not ready for review.</p>
<p><em>Side note here: There is often debate on whether we should enforce code formatting,or enforce coding style, or enforce naming conventions.  YES! YES! YES!  Consistency is hugely important!  Code is read more than written, and consistent code is easier to read.  Have this discussion once, put together the automated tools to automatically format the code and automatically check the requirements. </em></p>
<p><em>Don’t spend months making up your special coding standards document.  Use some rule sets from any number of static analysis tools and start enforcing them.  Make them part of your build, make check-ins fail for formatting problems, make your IDE auto-format on save.  Deciding the perfect placement of curly brackets and whitespace is not nearly as important as being consistent.  Just pick something and enforce it.</em></p>
<p>Code reviews should focus on design, structure, and understandability of the code.  <strong>Code reviews should never ever ever ever ever ever ever focus on anything that can be automatically checked or enforced… ever!</strong></p>
<p><strong>#4.  Rush &amp; Inconsistency</strong></p>
<p>Teams rarely have or make time for code reviews.  If they do, it is inconsistent and not applied to all code, which causes the value to be lost.  If you have a huge fence around a perimeter, yet a large hole where people can just crawl in, the fence is worthless.</p>
<p>There is no point doing a code review where the code is not reviewed in depth.  Just scanning over the code and picking on a few variable names here and there does no good.  If you&#8217;re not prepared to fully immerse yourself into the code being reviewed, and dive deep down into understanding exactly what it is doing, don’t bother.</p>
<h2>Paired programming to the rescue</h2>
<p>Paired programming is like just-in-time code reviews.  It solves many of these issues by having a common goal and creating a joint ownership in the code.</p>
<p>As you pair up with different members of your team, you are likely to be more honest, be less egotistical, focus on the problem not the conventions, and delve deeply into the code.</p>
<p>It is no secret that my preferred <em>modus operandi </em>is no code review, instead paired programming, with everyone monitoring commits to source control, and can flag something and have a discussion if they see something troubling.</p>
<h2>What if paired programming is not an option?</h2>
<p>Well, try to make it one.  Paired programming is a great investment.</p>
<p><strong>But, if you are not doing paired programming, you absolutely should be doing code reviews. </strong>I might have extolled some of the problem with code reviews, and I advocate paired programming, but let’s not mince words here.</p>
<p><strong>Pair programming is a better way of doing continuous or just-in-time code reviews.  Not doing any form of code reviews is just plain stupid.</strong></p>
<p>If you had a construction team building your house, or your 20 million dollar sky scraper, and they told you that they were not doing engineering reviews of the work that was done, you would probably fire that construction company on the spot.  Building software is several levels of complexity higher than that of most physical construction projects.  <strong>If you call yourself an engineer and you are not subjecting your work to regular review, you are just an amateur playing “engineer”.</strong></p>
<p>So, if you must do the old-fashioned code review, here are some tips I found useful:</p>
<ul>
<li>Encourage people to be honest by doing some exercises where everyone reviews some code that wasn’t written by anyone on your team.  Encourage people to be as prejudice as possible when reviewing the code.</li>
<li>Set your expectations.  Code reviews are not an approval process, they are an improvement process.  Make sure the team is aware of this.  Code reviews are a place you take your code to make it better, and to better your skills.  Foster that kind of thinking.</li>
<li>Automate all of the nit-picky stuff and set coding standards, formatting standards, and style standards.  Decide what they will be together, or have your experienced people do it, but get it done, make conformance non-optional and make it automated.</li>
<li>Develop consistent standards and practice about doing code reviews.  Set aside enough time to delve deeply into the code.  Set and enforce standards of when and how code is reviewed.</li>
<li>Lead by example.  Proactively ask members of your team to look at your code and tell you how to improve it.  Ask if this can be done a better way.  Show a genuine interest in feedback and improvement, this attitude will catch on.</li>
</ul>
<p><strong>As always, you can subscribe to this </strong><a href="http://feeds.feedburner.com/MakingTheComplexSimple"><strong>RSS feed</strong></a><strong> to follow my posts on Making the Complex Simple.  Feel free to check out </strong><a href="http://elegantcode.com/"><strong>ElegantCode.com</strong></a><strong> where I post about the topic of writing elegant code about once a week.  Also, you can follow me on twitter </strong><a href="http://twitter.com/jsonmez"><strong>here</strong></a><strong>.</strong></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/complextosimple.wordpress.com/921/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/complextosimple.wordpress.com/921/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/complextosimple.wordpress.com/921/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/complextosimple.wordpress.com/921/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/complextosimple.wordpress.com/921/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/complextosimple.wordpress.com/921/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/complextosimple.wordpress.com/921/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/complextosimple.wordpress.com/921/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/complextosimple.wordpress.com/921/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/complextosimple.wordpress.com/921/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/complextosimple.wordpress.com/921/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/complextosimple.wordpress.com/921/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/complextosimple.wordpress.com/921/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/complextosimple.wordpress.com/921/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=simpleprogrammer.com&#038;blog=10597120&#038;post=921&#038;subd=complextosimple&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://simpleprogrammer.com/2010/06/09/dont-snub-the-code-review/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/695e2a956b2dcb5ac45a7095b6ee338a?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">jsonmez</media:title>
		</media:content>

		<media:content url="http://complextosimple.files.wordpress.com/2010/06/wtfs_per_minute_thumb.jpg" medium="image">
			<media:title type="html">wtfs_per_minute</media:title>
		</media:content>
	</item>
		<item>
		<title>The Kanbanand Guide</title>
		<link>http://simpleprogrammer.com/2010/04/28/the-kanbandand-guide/</link>
		<comments>http://simpleprogrammer.com/2010/04/28/the-kanbandand-guide/#comments</comments>
		<pubDate>Wed, 28 Apr 2010 16:21:24 +0000</pubDate>
		<dc:creator>jsonmez</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[Kanban]]></category>
		<category><![CDATA[Kanbanand]]></category>
		<category><![CDATA[Paired Programming]]></category>
		<category><![CDATA[Process Improvement]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[User Stories]]></category>

		<guid isPermaLink="false">http://simpleprogrammer.com/?p=783</guid>
		<description><![CDATA[In my last post, I talked about some of the problems of Agile processes and suggested the introduction of a new process which takes some of the best parts of each of the popular processes and condenses them into the Kanban lean- style-thinking of limiting the work in progress. For this post I want to [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=simpleprogrammer.com&#038;blog=10597120&#038;post=783&#038;subd=complextosimple&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>In my <a href="http://simpleprogrammer.com/2010/04/26/kanbanand-the-new-agile-process-you-have-already-been-following/">last post</a>, I talked about some of the problems of Agile processes and suggested the introduction of a new process which takes some of the best parts of each of the popular processes and condenses them into the Kanban lean- style-thinking of limiting the work in progress.</p>
<p>For this post I want to clearly define what I am calling &#8220;Kanbanand&#8221; with two primary goals in mind.</p>
<ol>
<li>Allow someone who is interested in doing a Kanban like process to find enough information to be successful.</li>
<li>Create a common thread for people who are already basically doing what I am suggesting.</li>
</ol>
<p><a href="http://complextosimple.files.wordpress.com/2010/04/ajh-redtail-taking-off.jpg"><img class="alignnone size-full wp-image-786" title="AJH-redtail taking off" src="http://complextosimple.files.wordpress.com/2010/04/ajh-redtail-taking-off.jpg?w=500&h=493" alt="" width="500" height="493" /></a></p>
<h2>Three Pronged Fork</h2>
<p>I want to present Kanbanand as a three pronged fork.  In my mind there are 3 distinct areas of a successful Agile process which must be addressed.</p>
<ul>
<li>Business and overall encompassing project process.</li>
<li>Development practices, including standards and best practices.</li>
<li>Infrastructure: build systems, deployment, source control.</li>
</ul>
<p>We must know how to run our day to day process, how we physically construct our product, and how we actually build and deliver the product.</p>
<p><a href="http://complextosimple.files.wordpress.com/2010/04/fork.jpg"><img class="alignnone size-full wp-image-788" title="fork" src="http://complextosimple.files.wordpress.com/2010/04/fork.jpg?w=500" alt=""   /></a></p>
<h2>Process</h2>
<p><strong>Rules:</strong></p>
<ol>
<li>Project is broken into stories which are small vertical slices through the system which are prioritized.</li>
<li>A Kanban board is used to make the progress of a team visible and has limits to control the Work In Progress (WIP).</li>
<li>At least once a day team members meet around the Kanban board in a stand up meeting to talk about the progress of the board.</li>
<li>The team meets on a regular basis to have a retrospective to discuss how to better improve their process.</li>
<li>Teams always pull in work, work is never &#8220;pushed&#8221; in.</li>
<li>Once work has been approved as &#8220;done&#8221; it can never be &#8220;not done&#8221;.</li>
<li>Find something to measure and measure it.</li>
<li>The team is responsible for, and empowered to determine how the team accomplishes its goals.</li>
</ol>
<p><strong>Values:</strong></p>
<ul>
<li>Roughly same sized stories over irregular sized stories.</li>
<li>Stories specifying what, over stories specifying how.</li>
<li>Stories that are one sentence over stories that are one page.</li>
<li>Talking about how to move the board forward over talking about what I did or someone else did.</li>
<li>Cross functional teams over specialized teams.</li>
</ul>
<h2>Development</h2>
<p><strong>Rules:</strong></p>
<ol>
<li>All code is unit tested.</li>
<li>Static code analysis tools are used to set code standards, all code must meet those standards.</li>
<li>Any code that is done, is completely done.  It is refactored, it is unit tested, it meets the quality standards.</li>
<li>Code is never commented out.  Anyone is allowed to delete any commented out code at any time.</li>
<li>Determining code is meeting the quality standards must be done in an automated way.</li>
<li>No one owns code, anyone can work on any code.</li>
<li>Documentation is ONLY created when it will serve a known purpose and has an immediate value.  (Code should document itself with good names and simple flow, unit tests document the low level requirements of the system.  Automated tests document the behavior of the system.)</li>
<li>Testing requirements come from the customer, not from the developer.</li>
</ol>
<p><strong>Values:</strong></p>
<ul>
<li>Test driven development over writing unit tests after the code is done.</li>
<li>Pair programming over working alone.</li>
<li>Readable code over smaller sized code.</li>
<li>Doing things right over doing things fast.</li>
<li>Showing the customer over asking the customer.</li>
<li>Impromptu discussions at white-boards over scheduled meetings.</li>
<li>Building tools that will help make completing ten things faster, than completing one thing faster.</li>
<li>Writing automated tests over manual testing</li>
</ul>
<h2>Infrastructure</h2>
<p><strong>Rules:</strong></p>
<ol>
<li>Code is continuously built and integrated as soon as it is checked in.</li>
<li>Builds build code, run unit tests, run quality checks, produce deployable bits.</li>
<li>Builds fail if any unit test fails, or any quality check fails.</li>
<li>Code is only deployed from the exact bits that were produced by the build machine.</li>
<li>Code can be deployed to any environment with the push of a button.</li>
<li>Production data never goes to any other environment.</li>
<li>Developers can always run a local build which is the same as what will be built on the build server.</li>
</ol>
<p><strong>Values:</strong></p>
<ul>
<li><strong>﻿</strong>Moving forward to fix problems over rolling back.</li>
<li>Integrating soon over merging later.</li>
<li>Quick builds over slow builds.</li>
<li>Deploying on demand over deploying on a schedule.</li>
</ul>
<h2>Feedback?</h2>
<p>That is my first crack at it.  I have tried to keep the process as simple as possible, but still include as rules the things that I think are most important to be successful.  I tried to keep the things that involved judgment calls as values.  I believe this provides enough information to allow an organization to create a custom process that will work for them, but will still have enough controls to be consistent in the things that I feel make Agile practices valuable.</p>
<p>Let me know what you think, or if you have any suggestions.  I will update this post as this list evolves.  I am sure there is something I missed or could state in a better way.</p>
<p>Like I said before, if you are doing some form of Kanban, you probably are already doing Kanbanand.  If you are doing Scrum, your major change would be to drop the planning and instead try to get same sized stories while limiting your WIP.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/complextosimple.wordpress.com/783/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/complextosimple.wordpress.com/783/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/complextosimple.wordpress.com/783/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/complextosimple.wordpress.com/783/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/complextosimple.wordpress.com/783/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/complextosimple.wordpress.com/783/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/complextosimple.wordpress.com/783/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/complextosimple.wordpress.com/783/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/complextosimple.wordpress.com/783/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/complextosimple.wordpress.com/783/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/complextosimple.wordpress.com/783/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/complextosimple.wordpress.com/783/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/complextosimple.wordpress.com/783/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/complextosimple.wordpress.com/783/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=simpleprogrammer.com&#038;blog=10597120&#038;post=783&#038;subd=complextosimple&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://simpleprogrammer.com/2010/04/28/the-kanbandand-guide/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/695e2a956b2dcb5ac45a7095b6ee338a?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">jsonmez</media:title>
		</media:content>

		<media:content url="http://complextosimple.files.wordpress.com/2010/04/ajh-redtail-taking-off.jpg" medium="image">
			<media:title type="html">AJH-redtail taking off</media:title>
		</media:content>

		<media:content url="http://complextosimple.files.wordpress.com/2010/04/fork.jpg" medium="image">
			<media:title type="html">fork</media:title>
		</media:content>
	</item>
		<item>
		<title>Boise Code Camp 2010 Presentations</title>
		<link>http://simpleprogrammer.com/2010/03/29/boise-code-camp-2010-presentations/</link>
		<comments>http://simpleprogrammer.com/2010/03/29/boise-code-camp-2010-presentations/#comments</comments>
		<pubDate>Mon, 29 Mar 2010 17:24:08 +0000</pubDate>
		<dc:creator>jsonmez</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Automation]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Functional]]></category>
		<category><![CDATA[Paired Programming]]></category>
		<category><![CDATA[Presentations]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[Watij]]></category>

		<guid isPermaLink="false">http://simpleprogrammer.com/?p=568</guid>
		<description><![CDATA[Went to Boise Code Camp this weekend and it was great! There were some really good sessions and good discussions on Agile, Scrum and domain specific languages. I think events like these are important because they help us to zoom out a little and see what kinds of things other people are doing in our [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=simpleprogrammer.com&#038;blog=10597120&#038;post=568&#038;subd=complextosimple&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Went to <a href="http://boisecodecamp.com/">Boise Code Camp</a> this weekend and it was great!</p>
<p>There were some really good sessions and good discussions on Agile, Scrum and domain specific languages.</p>
<p>I think events like these are important because they help us to zoom out a little and see what kinds of things other people are doing in our field and what companies around us are interested in high quality software.</p>
<p>Code camps are also a great place to get some experience doing presentations and share what you are working on.  Networking opportunities abound.</p>
<p>I presented two talks this weekend.  I am posting the links to those here.</p>
<p><strong>The first presentation I did was on Pair Programming.</strong></p>
<p>You can find the presentation on Prezi <a href="http://prezi.com/7syjl9hdcxga/">here</a>.</p>
<p>We also did a live pair programming session, which I thought went pretty well.  We ran into some of the issues that often come up with pair programming, like being afraid to tell someone you don&#8217;t like their method name.</p>
<p><strong>The second presentation I did was on Creating an Internal DSL for Automated Functional Testing.</strong></p>
<p>You can find the presentation on Slideshare <a href="http://www.slideshare.net/jsonmez/internal-ds-ls-for-automated-functional-testing">here</a>.</p>
<p>We went over how to go about creating a good automation framework which fills in the gaps between the business language and technical language.</p>
<p>Thanks to everyone who attended.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/complextosimple.wordpress.com/568/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/complextosimple.wordpress.com/568/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/complextosimple.wordpress.com/568/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/complextosimple.wordpress.com/568/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/complextosimple.wordpress.com/568/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/complextosimple.wordpress.com/568/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/complextosimple.wordpress.com/568/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/complextosimple.wordpress.com/568/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/complextosimple.wordpress.com/568/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/complextosimple.wordpress.com/568/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/complextosimple.wordpress.com/568/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/complextosimple.wordpress.com/568/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/complextosimple.wordpress.com/568/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/complextosimple.wordpress.com/568/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=simpleprogrammer.com&#038;blog=10597120&#038;post=568&#038;subd=complextosimple&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://simpleprogrammer.com/2010/03/29/boise-code-camp-2010-presentations/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/695e2a956b2dcb5ac45a7095b6ee338a?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">jsonmez</media:title>
		</media:content>
	</item>
		<item>
		<title>Pair Programming? Why?</title>
		<link>http://simpleprogrammer.com/2009/12/11/pair-programming-why/</link>
		<comments>http://simpleprogrammer.com/2009/12/11/pair-programming-why/#comments</comments>
		<pubDate>Fri, 11 Dec 2009 22:31:17 +0000</pubDate>
		<dc:creator>jsonmez</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Paired Programming]]></category>
		<category><![CDATA[Process Improvement]]></category>
		<category><![CDATA[Self Improvement]]></category>

		<guid isPermaLink="false">http://simpleprogrammer.com/?p=76</guid>
		<description><![CDATA[What is paired programming? The best example is one I&#8217;ll steal from Uncle Bob.  If you haven&#8217;t read this little dialog before, take a moment to do it now.   Paired programming is essentially two developers sharing one keyboard and mouse.  Both developers work together to write the unit tests and code to make them [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=simpleprogrammer.com&#038;blog=10597120&#038;post=76&#038;subd=complextosimple&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>What is paired programming?</strong></p>
<p>The best <a href="http://www.objectmentor.com/resources/articles/xpepisode.htm">example</a> is one I&#8217;ll steal from Uncle Bob.  If you haven&#8217;t read this little dialog before, take a moment to do it now.   Paired programming is essentially two developers sharing one keyboard and mouse.  Both developers work together to write the unit tests and code to make them pass.  Often you will switch who has control of the keyboard and mouse.  I intricately tie together this practice with Test Driven Development (TDD), because a large amount of the benefit is in the ability for one developer to say, &#8220;Hey let me see the keyboard&#8221;, and write a unit test which will make the code fail.</p>
<p><strong>Why paired programming?</strong></p>
<p>There are many benefits some obvious and direct others as a side effect.  When you have two developers looking at the same code, you have two sets of eyes looking at the code as it is being written.  You have a much bigger coverage area of the problem domain, and are less likely to write bugs or miss something.  At the same time you are also having a live code review in the context of the code.  Also you are getting two developers familiar with the same piece of code, rather than &#8220;the dude who wrote all the DAO code.&#8221;  These benefits alone make paired programming worth it, but there are a few more.  Often one developer would get stuck on a difficult problem where two can easily push through.</p>
<p>Some of the indirect benefits are that when someone works alone they are less likely to be working.  Honestly, in an 8 hour programming day you might get 4 hours of work.  Now a good amount of this is due to distractions, like email, instant messages, random questions, not just slacking off (although some of it is.)  When you have two developers sitting at the same computer, it takes a larger amount of force to cause a distraction.  If someone is sitting at my desk, I am less likely to look at my email or be drawn away from the work I am working on.  You are more likely to get 6 hours or more out of two developers at the same computer with paired programming.</p>
<p>On the job training and cross training is another large benefit.  When you pair up a weak developer with a strong developer you will get the weak developer picking up the good practices of the strong developer.  Pair up two strong developers, they teach each other the little tricks that make them so effective and they both become more effective.  Pair up two weak developers, and you&#8230; get a mess for someone to clean up&#8230; Don&#8217;t do that!  Have a tester who should learn some development, pair them up with a developer or vice versa.  Even a product owner or business person can benefit from paired programming to better understand how the application is being developed.</p>
<p><strong>Does it really work?</strong></p>
<p>In my opinion yes.  I have personally seen the benefits over years of doing development work, practicing paired programming whenever possible.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/complextosimple.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/complextosimple.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/complextosimple.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/complextosimple.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/complextosimple.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/complextosimple.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/complextosimple.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/complextosimple.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/complextosimple.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/complextosimple.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/complextosimple.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/complextosimple.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/complextosimple.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/complextosimple.wordpress.com/76/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=simpleprogrammer.com&#038;blog=10597120&#038;post=76&#038;subd=complextosimple&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://simpleprogrammer.com/2009/12/11/pair-programming-why/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/695e2a956b2dcb5ac45a7095b6ee338a?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">jsonmez</media:title>
		</media:content>
	</item>
	</channel>
</rss>
