<?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:creativeCommons="http://backend.userland.com/creativeCommonsRssModule">

<channel>
	<title>Thinking Inside a Bigger Box &#187; Software Development</title>
	<atom:link href="http://johannesbrodwall.com/category/software-development/feed/" rel="self" type="application/rss+xml" />
	<link>http://johannesbrodwall.com</link>
	<description>Johannes Brodwall&#039;s Musings on Software Architecture and Programming</description>
	<lastBuildDate>Thu, 22 Dec 2011 13:28:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<creativeCommons:license>http://creativecommons.org/licenses/by/3.0/</creativeCommons:license>		<item>
		<title>The Architecture Spike Kata</title>
		<link>http://johannesbrodwall.com/2011/12/22/the-architecture-spike-kata/</link>
		<comments>http://johannesbrodwall.com/2011/12/22/the-architecture-spike-kata/#comments</comments>
		<pubDate>Thu, 22 Dec 2011 13:28:09 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://johannesbrodwall.com/?p=842</guid>
		<description><![CDATA[Do you know how to apply coding practices the technology stack that you use on a daily basis? Do you know how the technology stack works? For many programmers, it&#8217;s easy enough to use test-driven development with a trivial example, but it can be very hard to know how to apply it to the problems [...]]]></description>
			<content:encoded><![CDATA[<p>Do you know how to apply coding practices the technology stack that you use on a daily basis? Do you know how the technology stack works? For many programmers, it&#8217;s easy enough to use test-driven development with a trivial example, but it can be very hard to know how to apply it to the problems you face every day in your job.</p>
<p>Java web+database applications are usually filled to the brim with technologies. Many of these are hard to test and many of these may not add value. In order to explore TDD and Java applications, I practiced the Java EE Spike Kata in 2010. <a href="http://streaming.java.no/tcs/?id=9BE4BB66-1FD9-4497-966C-91FFAC728CC1">Here&#8217;s a video of me and Anders Karlsen doing this kata at JavaZone 2010</a>.</p>
<p>A similar approach is likely useful for programmers using any technology. Therefore, I give you: The rules of the Architecture Spike Kata.</p>
<h3>The problem</h3>
<p>Create a web application that lets users register a Person with names and search for people. The Person objects should be saved in a data store that is similar to the technology you use daily (probably a relational database). The goal is to get a spike working as quickly as possible, so in the first iteration, the Person entity should probably only contain one field. You can add more fields and refactor the application later.</p>
<h3>The rules</h3>
<p>The most important rules are <a href="http://butunclebob.com/ArticleS.UncleBob.TheThreeRulesOfTdd">Robert Martin</a>&#8216;s three rules of Test-driven development:</p>
<ul>
<li>No code without test (that is, the code should never do something that isn&#8217;t required in order to get a test to pass)</li>
<li>Only enough test to get to red (that is, the tests should <i>run</i>, give an error message and that error message should correct)</li>
<li>Only enough code to get to green (that is, the tests should run and not give an error)</li>
<li>(My addition: Refactor on green without adding functionality)</li>
</ul>
<p>Secondly, application should be driven from the outside in. That is, your first test should be a top-level acceptance test that tests through http and html. It&#8217;s okay to comment out or @Ignore this test after it has run red for the first time.</p>
<p>Lastly, you should not introduce any technology before the pain of not doing so is blinding. The first time you do the kata in a language, don&#8217;t use a web framework beyond the language minimum (in Java, this means Servlets, in node.js it&#8217;s <code>require('http')</code>, in Ruby it means Rack). Don&#8217;t use a Object-Relational Mapping framework. Don&#8217;t use a dependency injection framework. Most definitely don&#8217;t use an application generator like Rails scaffold, Spring Roo or Lift. These frameworks can be real time savers, but this kata is about understanding how the underlying technology works.</p>
<p>As a second iteration, use the technologies you use on a daily basis, but this time set up from scratch. For example, if your project uses Hibernate, try configuring the session factory by hand. By using frameworks in simplest way possible, you&#8217;ll both learn more about what they bring to the table and how to use them properly. For complex technology like Hibernate, there&#8217;s no substitute for deeper understanding.</p>
<h3>What to expect</h3>
<p>So far, I&#8217;ve only done the Architecture Spike Kata in Java. But on the other hand, I&#8217;ve done it around 50 times together with more than ten other developers. <a href="http://johannesbrodwall.com/2009/12/02/trene-pa-java-ee/">I&#8217;ve written about how to get started with the Java EE Spike Kata (in Norwegian) on my blog before</a>.</p>
<p>This is what I&#8217;ve learned about working with web applications in Java:</p>
<ul>
<li>Most Java web frameworks seem to harm more than they help</li>
<li>Hibernate is a bitch to set up, but once it&#8217;s working, it saves a lot of hassle</li>
<li>Using TDD with Hibernate helped me understand how to use Hibernate more effectively</li>
<li>I&#8217;ve stopped using dependency injection frameworks (but kept on using dependency injection as a pattern)</li>
<li>I have learned several ways to test web applications and database access independently and integrated</li>
<li>I no longer have to expend mental energy to write tests for full stack application</li>
</ul>
<p>The first time I write this kata with another developer, it takes around 3 to 5 hours, depending on the experience level of my pair. After running through it a few times, most developers can complete the task in less than an hour.</p>
<p>We get better through practice, and the Architecture Spike Kata is a way to practice TDD with the technologies that you use daily and get a better understanding of what&#8217;s going on.</p>
]]></content:encoded>
			<wfw:commentRss>http://johannesbrodwall.com/2011/12/22/the-architecture-spike-kata/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>What&#8217;s your MyScrum?</title>
		<link>http://johannesbrodwall.com/2011/11/28/whats-your-myscrum/</link>
		<comments>http://johannesbrodwall.com/2011/11/28/whats-your-myscrum/#comments</comments>
		<pubDate>Sun, 27 Nov 2011 22:46:35 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://johannesbrodwall.com/?p=824</guid>
		<description><![CDATA[Instead of using Scrum, maybe we should use MyScrum. It&#8217;s like Scrum, with the stuff added that you think will super charge your MyScrum. This is my MyScrum: I want to measure velocity every week I want to demostrate the product with a cadence that makes sure users show up to the demo I don&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p>Instead of using Scrum, maybe we should use MyScrum. It&#8217;s like Scrum, with the stuff added that you think will super charge your MyScrum.</p>
<p>This is <em>my</em> MyScrum:</p>
<ul>
<li>I want to measure velocity every week</li>
<li> I want to demostrate the product with a cadence that makes sure users show up to the demo</li>
<li>I don&#8217;t want to have story point estimates, I want to have story point budgets</li>
<li>I want the product owner, not the team, to own the budget/estimate (but they team may veto)</li>
<li>I don&#8217;t want commitments or forecasts from the team, I want measured historical progress</li>
<li>I want to plan per story, not per sprint</li>
<li>I want the developers who will develop a story to follow it  (or pass the baton to other developers) from detailing to deployment.</li>
</ul>
<p>What does <em>your</em> MyScrum look like?</p>
]]></content:encoded>
			<wfw:commentRss>http://johannesbrodwall.com/2011/11/28/whats-your-myscrum/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Can we replace requirement specification with better understanding?</title>
		<link>http://johannesbrodwall.com/2011/09/23/better-understanding/</link>
		<comments>http://johannesbrodwall.com/2011/09/23/better-understanding/#comments</comments>
		<pubDate>Fri, 23 Sep 2011 16:39:30 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://johannesbrodwall.com/?p=820</guid>
		<description><![CDATA[On larger projects, I&#8217;ve always ended up resorting to writing down a lot of detailed specifications, many of which are wrong, irrelevant or we might not be ready to answer them yet. On small projects, the dialogue between the customer and the developers can flow easy, and good things happen. The quick analysis Developer: &#8230; [...]]]></description>
			<content:encoded><![CDATA[<p>On larger projects, I&#8217;ve always ended up resorting to writing down a lot of detailed specifications, many of which are wrong, irrelevant or we might not be ready to answer them yet. On small projects, the dialogue between the customer and the developers can flow easy, and good things happen.</p>
<h3>The quick analysis</h3>
<blockquote>
<p><strong>Developer:</strong> &#8230; so we&#8217;re going to complete the current task tomorrow or the day after. Could we discuss what to do next before you&#8217;re off to your next meeting?</p>
<p><strong>Customer:</strong> Sure. The next task on the backlog is to send the payment request to the accounting system</p>
<p><strong>Developer:</strong> Yeah. Um&#8230; well, we&#8217;re not really ready for the integration tasks yet. I was thinking that we might perhaps pick another user interface task. Would that be okay?</p>
<p><strong>Customer:</strong> No problem. Let&#8217;s see&#8230;. how about &#8220;road project submits funding request&#8221;?</p>
<p><strong>Developer:</strong> Great. What&#8217;s that?</p>
<p><strong>Customer:</strong> Well, today, the owner of the road project sends in a paper form. Let&#8217;s see, the form is available as a PDF on our web site. Let&#8217;s take a look.</p>
<p><strong>Developer:</strong> Let&#8217;s see&#8230;. We know how to deal with social security number, names, addresses. This field &#8220;municipality,&#8221; that&#8217;s the usual stuff, right? (customer nods) What about &#8220;request id&#8221;? What&#8217;s that?</p>
<p><strong>Customer:</strong> It&#8217;s just a sequence number per municipality. It would be really nice if you could suggest a request number and then let the user override.</p>
<p><strong>Developer:</strong> That should be doable.</p>
<p>They work out a few more details and get on their way. Total time, 30 minutes</p>
</blockquote>
<h3>The low ambition implementation</h3>
<blockquote>
<p><strong>Developer:</strong> So, we worked on the funding request UI for the last two days. I think we&#8217;ve got something that looks pretty good.</p>
<p><strong>Customer:</strong> Great, let&#8217;s see it! Let&#8217;s see&#8230; There&#8217;s a new &#8220;apply for funding request&#8221; menu item. Nice. But it should be &#8220;Fund road project&#8221; (developer notes feedback). Let me try and press it&#8230; Hmm&#8230; &#8220;select municipality&#8221;? Why do I get that?</p>
<p><strong>Developer:</strong> Well, we&#8217;re still a bit shaky on AJAX. So in order to find the next sequence number, we would like to have the user select municipality first.</p>
<p><strong>Customer:</strong> Oh, AJAX. That&#8217;s interactive web pages, right? Yeah, I guess that&#8217;s fine, but we need to fix up the text a little. So, what happens when I select one&#8230;? Nice, it sort of looks like the paper form. That will help us get learn it. But let&#8217;s move the fields around a little (he sketches a few change on a piece of paper).</p>
<p><strong>Developer:</strong> We were a bit uncertain about this &#8220;sum&#8221; field. Does the user have to fill in the sum himself? He&#8217;s already filled in all the numbers.</p>
<p><strong>Customer:</strong> That doesn&#8217;t make too much sense. How about if the web pages updates the sum field dynamically? Oh, you&#8217;ve got that &#8216;don&#8217;t make me do dynamic webpages&#8217; face again.</p>
<p><strong>Developer:</strong> Yeah, sorry. The last time it was a big mess. Can we hold off on that for now? Do you really need it?</p>
<p><strong>Customer:</strong> (laughs) No, that&#8217;s okay. I guess we can just remove the field. That should be fine.</p>
<p><strong>Developer:</strong> Yay! What about validating the bank account number? We left that out, because the documentation is&#8230;. well, insane. That alone will take at least another day.</p>
<p><strong>Customer:</strong> No, we really need that. People often type it wrong, and then it&#8217;s a nightmare to fix all the errors that follow. You just have to fight though it.</p>
<p><strong>Developer:</strong> (sigh) I guess it can&#8217;t be helped. We&#8217;re on it.</p>
<p><strong>Customer:</strong> All in all, it looks pretty good. I&#8217;ll go over it by myself after lunch and bring you back some issues tomorrow.</p>
</blockquote>
<h3>The quick completion</h3>
<blockquote>
<p><strong>Customer:</strong> Here&#8217;s a list of corrections. Nothing major, just a few misplaced fields and a few extra validation rules.</p>
<p><strong>Developer:</strong> Great. We spent all of yesterday doing the bank account number validation. Man, that&#8217;s some bad doc! But we should be done before lunch.</p>
<p><strong>Customer:</strong> I have an opening in my calendar at the end of the day, let&#8217;s take a look then and call it done. Great work, guys!</p>
</blockquote>
<h3>The contrast</h3>
<p>Have you ever been on a small project where everyone has a pretty good understand of what&#8217;s going on and the communication works well? Developers can make a pretty good guess at the details and develop a pretty good first version. There may be some more work that&#8217;s needed, but these can be negotiated when the developers have a better idea of what&#8217;s going to be easy and what&#8217;s going to be hard.</p>
<p>When I&#8217;ve been on larger projects, this communication seems to break down. Instead the developers require a detailed specification in writing. And if something is missing from the specification, they reject it and ask for further details. And they won&#8217;t show the product to the customer before all the kinks are worked out.</p>
<p>When we do it well it&#8217;s not so bad, getting a detailed specification and finishing the task before we get real feedback. But it requires the customer to decide on things that may not be important, but that may impact cost substantially. It requires back and forth to get the specification written, reviewed, amended etc.</p>
<p>On a small project, a developer can understand the purpose, build something quickly and adjust it based on feedback. Is the reality of larger projects that this will just remain a pipe dream? If so, why? If not, how do you get the quick and informal feedback?</p>
]]></content:encoded>
			<wfw:commentRss>http://johannesbrodwall.com/2011/09/23/better-understanding/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>The value my system delivers: Keeping my beer cool</title>
		<link>http://johannesbrodwall.com/2011/04/26/the-other-you/</link>
		<comments>http://johannesbrodwall.com/2011/04/26/the-other-you/#comments</comments>
		<pubDate>Tue, 26 Apr 2011 20:07:21 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[Non-technical]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://johannesbrodwall.com/?p=761</guid>
		<description><![CDATA[This blogpost is a summary of my ScanDev 2011 talk: &#8220;Fearless Improvement&#8221; What is the goal of your current project? I currently work on a project for the transmission system operator for the Norwegian electrical grid. The value of the system we&#8217;re building is that my beer stays cool. Skill If you&#8217;re not skilled at [...]]]></description>
			<content:encoded><![CDATA[<p><em>This blogpost is a summary of my ScanDev 2011 talk: &#8220;Fearless Improvement&#8221;</em></p>
<p>What is the goal of your current project? I currently work on a project for the transmission system operator for the Norwegian electrical grid. The value of the system we&#8217;re building is that my beer stays cool.</p>
<h3>Skill</h3>
<p>If you&#8217;re not skilled at what you&#8217;re doing, you may put in a lot of hours and end up having nothing to show for it. Maybe you ended up writing code that didn&#8217;t compile and you had to throw it away. Maybe you ended up staring at an empty screen for hours waiting for inspiration to strike. Maybe you ended up writing a long document, only to forget to save it and then your computer crashed.</p>
<p>The first trick to making sure that your work is worthwhile is to make sure that the effort you put in actually transforms to some effect. In order to achieve this, you need experience and practice with your craft.</p>
<h3>Purpose</h3>
<p>If you don&#8217;t know why you&#8217;re doing what you&#8217;re doing, you may produce a lot, but it ends up not being valuable to anyone. Maybe the code you write solved the wrong problem. Maybe your long document didn&#8217;t answer the questions of you readers.</p>
<p>The second trick to making sure that your work is worthwhile is to make sure that the effect you have actually produces value. In order to achieve this, you need to move in the right direction.</p>
<p><img src="http://johannesbrodwall.com/wp-content/uploads/2011/04/industry-300x123.png" alt="skill transforms effort into effect; purpose transforms effect into value" title="The secret to human industry" width="450" height="185" class="alignnone size-medium wp-image-762" /></p>
<p>This is the model of all human industry, whether you&#8217;re making cars, books, food, presentations or software.</p>
<p>In software development, effort is the time you put in, skill is your skill as a developer, effect is the working software, purpose is the architecture and value is the business goal.</p>
<p>The fast track to success is to understand the last step: Value.</p>
<h3>&#8220;The other me&#8221;</h3>
<p>Here&#8217;s an example. Find the value:</p>
<p>My current project creates a system which presents in user interface electricity reserves and planned electricity production that it has received from a message gateway, as well as measurements that it has received from an electricity management system.</p>
<p><img src="http://johannesbrodwall.com/wp-content/uploads/2011/04/Regulation-context-300x188.png" alt="" title="System context" width="450" height="282" class="alignnone size-medium wp-image-763" /></p>
<p>This is gobbledygook. If this is how I see the system, I will fail.</p>
<p>In order to see the value, we have to take a step back. The system receives planned production and available reserve capacity from power producers. It presents this, along with measurements of the current balance between consumption and production on the electricity grid to an operator. The operator uses the reserves to regulate production to match consumption.</p>
<p><img src="http://johannesbrodwall.com/wp-content/uploads/2011/04/regulation-users-300x223.png" alt="" title="System users" width="450" height="335" class="alignnone size-medium wp-image-764" /></p>
<p>Hopefully, this is much more understandable. You&#8217;re probably aware that there are companies that produce electrical power, and you probably understand that electricity consumption should match production.</p>
<p>But why?</p>
<p>The ultimate value of the system is to the consumer who want to plug his appliances into the grid and have them work. They should neither blow up (too much production) or lose power (too little production).</p>
<p><img src="http://johannesbrodwall.com/wp-content/uploads/2011/04/Regulation-consumer-300x225.png" alt="" title="System consumer" width="450" height="338" class="alignnone size-medium wp-image-765" /></p>
<p>Who is this mysterious &#8220;consumer&#8221;, then. Why, it&#8217;s me! It&#8217;s not Johannes-the-software-developer, it&#8217;s the other me. The &#8220;me&#8221; who has his fridge connected to the power grid so I can keep my beer cool.</p>
<p><img src="http://johannesbrodwall.com/wp-content/uploads/2011/04/regulation-the-other-you-300x222.png" alt="" title="System - you are the consumer" width="450" height="333" class="alignnone size-medium wp-image-766" /></p>
<p>The purpose of my project is to keep my beer cool.</p>
<h3>The other you</h3>
<p>To understand the purpose of your system, you should try and see how it contributes to your own life. Not the life of the &#8220;you&#8221; who develops software, but the &#8220;you&#8221; who uses electricity, the &#8220;you&#8221; who drives a car, the &#8220;you&#8221; who breathes fresh air, the &#8220;you&#8221; who wants to retire at some point in the future.</p>
<p>If you can&#8217;t see &#8220;the other you&#8221; in your system &#8211; take a step back and look again. If you still can&#8217;t see &#8220;the other you&#8221;, maybe you should be working on a different project.</p>
]]></content:encoded>
			<wfw:commentRss>http://johannesbrodwall.com/2011/04/26/the-other-you/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Waterfall explained in terms of agile</title>
		<link>http://johannesbrodwall.com/2011/02/08/waterfall-explained-in-terms-of-agile/</link>
		<comments>http://johannesbrodwall.com/2011/02/08/waterfall-explained-in-terms-of-agile/#comments</comments>
		<pubDate>Tue, 08 Feb 2011 05:21:15 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://johannesbrodwall.com/?p=742</guid>
		<description><![CDATA[I&#8217;m getting a little fed up with descriptions of project development lifecycles starting with waterfall, and then describing iterative and agile development in waterfall terms. What happens if we start on the other side? Project development lifecycles Agile: The project creates a roadmap for a year or two, commits to the scope a delivery in [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m getting a little fed up with descriptions of project development lifecycles starting with waterfall, and then describing iterative and agile development in waterfall terms. What happens if we start on the other side?</p>
<h3>Project development lifecycles</h3>
<ul>
<li><strong>Agile</strong>: The project creates a roadmap for a year or two, commits to the scope a delivery in a few weeks to a few months, adapts their commitment as they learn more and irons out the details of each task just prior to when it&#8217;s performed.</li>
<li><strong>Incremental</strong>: The project commits to the scope the whole roadmap at the beginning of the project and delivers bits every few months according to this plan. The details of a task are ironed a few months ahead of time. Changes to the full project scope are handled as exceptions.</li>
<li><strong>Waterfall</strong>: The project commits to the whole scope of the roadmap at the beginning of the project and postpones delivery of all functionality until the end of the project. The project avoids spending time to verify details after any implementation has started. Learning is handled as exceptions.</li>
</ul>
<p>Agile described in terms of waterfall (&#8220;do a full project every few weeks&#8221;) sounds chaotic. Waterfall explained in terms of agile sounds insane.</p>
]]></content:encoded>
			<wfw:commentRss>http://johannesbrodwall.com/2011/02/08/waterfall-explained-in-terms-of-agile/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Pair programming = project reliability</title>
		<link>http://johannesbrodwall.com/2011/02/04/pair-programming-project-reliability/</link>
		<comments>http://johannesbrodwall.com/2011/02/04/pair-programming-project-reliability/#comments</comments>
		<pubDate>Fri, 04 Feb 2011 08:20:46 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://johannesbrodwall.com/?p=739</guid>
		<description><![CDATA[What do you do if you want to have a reliable system? You make sure you have redundancy: More than one component can do a certain job. You back up you valuable data to a separate system. You have two servers to provide your critical service, in case on fails. Yet, many projects have no [...]]]></description>
			<content:encoded><![CDATA[<p>What do you do if you want to have a reliable system? You make sure you have redundancy: More than one component can do a certain job. You back up you valuable data to a separate system. You have two servers to provide your critical service, in case on fails. Yet, many projects have no plan for the inevitable absence of people with critical knowledge.</p>
<p>We practice pair programming to get redundancy. This manifests itself in many ways:</p>
<ul>
<li>When someone is sick, on vacation or leaves the project (to become a doctor, say), the project doesn&#8217;t suffer. Or rather, it doesn&#8217;t suffer as much. We do get less work done if fewer people are present, of course. And many of our developers have areas where everyone loves to get their help.</li>
<li>We can add new people to the team. Learning how the system works is just a matter of pair programming as part of the normal rotation.</li>
<li>We are very adaptive to varying focus at different times in the project. If we had someone who could only work with, say, databases, he wouldn&#8217;t have much to do at some times, and too much to do at other times. With pair programming, we still have people who&#8217;re especially good in some areas, but everyone can help out with whatever needs doing.</li>
<li>No parts of the code are off-limits. As every commit of the code is written by two people, no one person has the right to block changes to &#8220;his&#8221; code. Anyone can make the changes that they need to complete their current task as good as they can.</li>
<li>The team is working with fewer tasks at a time. As teams grow in size, there can be a lot of different things happening at the same time. This both increases the chances that people will step on each other&#8217;s toes (that is, work on the same source code files) and increases the amount of &#8220;Work in progress&#8221; at any one time. Pair programming effectively halves the amount of work in progress.</li>
<li>Everyone has a understanding of the whole system. During planning and design discussions, everyone can contribute. Instead of focusing on technical components and subsystems, the discussion is about how to solve the user story as a whole.</li>
</ul>
<p>Some studies focuses on the impact of pair programming on efficiency, quality, progress, or even focus. I think it&#8217;s much more interesting to see how pair programming changes the dynamic of the team. From a group of individuals, we form teams where everyone is appreciated as a contributor. Everyone has their individual strengths, but more importantly, everyone has the same goal in mind: The success of the team.</p>
]]></content:encoded>
			<wfw:commentRss>http://johannesbrodwall.com/2011/02/04/pair-programming-project-reliability/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Pair programming research misses the most important point</title>
		<link>http://johannesbrodwall.com/2011/02/02/pair-programming-research-misses-the-most-important-point/</link>
		<comments>http://johannesbrodwall.com/2011/02/02/pair-programming-research-misses-the-most-important-point/#comments</comments>
		<pubDate>Wed, 02 Feb 2011 06:56:56 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://johannesbrodwall.com/?p=735</guid>
		<description><![CDATA[When I started pair programming daily, it changed my life and my projects for the better. I often point to pair programming as one of the most influential possible interventions on any projects. Very often, an audience member with a healthy degree skepticism will inquire about the research into pair programming. Sadly, the practice of [...]]]></description>
			<content:encoded><![CDATA[<p>When I started pair programming daily, it changed my life and my projects for the better. I often point to pair programming as one of the most influential possible interventions on any projects. Very often, an audience member with a healthy degree skepticism will inquire about the research into pair programming.</p>
<p>Sadly, the practice of software engineering research has not come very far in this area, so the questioner is left unsatisfied. In this blogpost, I will summarize the current state of research into pair programming, and describe my hopes for the future.</p>
<p>Lately, I&#8217;ve been talking with researchers at SINTEF about project in-situ studies into different aspects of agile development, including pair programming. As we have several teams that practice pair programming on a daily basis in Steria, I&#8217;m hoping that this may finally shine some scientific light on what I believe to be a really good practice.</p>
<p>The current situation is not satisfactory. The body of research into Pair Programming is summarized in the meta-study <a href="http://portal.acm.org/citation.cfm?id=1309094">Are Two Heads Better than One? On the effectiveness of pair programming</a> by Dybå, Arisholm, Sjøberg, Hannay, and Shull in IEEE Software November, 2007.</p>
<p>The meta-analysis looks at twelve papers on pair programming in their assessment of pair programming on three project metrics: Quality, Duration and Effort.</p>
<p>The studies are mostly pointing to the same results: Pair programming seems to improve quality significantly, decrease duration slightly, and increase effort slightly. That is: Pair programming will make your project ship a little earlier, with significantly better quality, but at a higher cost.</p>
<p>Sadly, all the research so far miss some significant factors:</p>
<ul>
<li>First: Better quality in the short term may transform into lower cost in the long term. As the studies are all short term, this effect cannot be assessed.</li>
<li>Second: One of the main reasons we do pair programming is to decrease the effect of absence (vacations, illness, turnover) and suboptimization due to over-specialization. As far as I know, there are no studies that include these effects.</li>
<li>Third: I&#8217;ve found that pair programming is a skill in itself. It takes up to a few months to learn it. All studies of pair programming have been with people who are inexperienced in the practice.</li>
</ul>
<p>Finally, studies on pair programming seem to conclude that pair programming may be appropriate for juniors or mid-level developers, but that it seldom makes sense for senior developers. I don&#8217;t know if I should take that as an insult or not, as I practice pair programming in almost all my programming time. And I would like to consider myself a senior developer. Feel free to disagree.</p>
]]></content:encoded>
			<wfw:commentRss>http://johannesbrodwall.com/2011/02/02/pair-programming-research-misses-the-most-important-point/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Refactoring: The Good, The Sad and The Ugly</title>
		<link>http://johannesbrodwall.com/2011/01/30/refactoring-the-good-the-sad-and-the-ugly/</link>
		<comments>http://johannesbrodwall.com/2011/01/30/refactoring-the-good-the-sad-and-the-ugly/#comments</comments>
		<pubDate>Sun, 30 Jan 2011 21:56:31 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://johannesbrodwall.com/?p=733</guid>
		<description><![CDATA[&#8220;Refactoring&#8221; is the practice of &#8220;improving the design of existing code without changing its behavior&#8221;. It&#8217;s an essential part of software maintenance. Done well, refactoring will make sure your code base is easy to maintain. Done poorly, refactoring will lead you into a dangerous swamp where you&#8217;ll be stuck forever. Good: In order to really [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;Refactoring&#8221; is the practice of &#8220;improving the design of existing code without changing its behavior&#8221;. It&#8217;s an essential part of software maintenance. Done well, refactoring will make sure your code base is easy to maintain. Done poorly, refactoring will lead you into a dangerous swamp where you&#8217;ll be stuck forever.</p>
<p><strong>Good</strong>: In order to really get the benefit from refactoring, I think we have to do it <em>all the time</em>. I resolve to always leave a code file in a state where I could be satisfied if I never got to improve it in the future. This works best on the micro-level: Before I jump to a different file, I check the naming, method lengths and formatting of my code. When done well, making the code better is part of writing the code in the first place.</p>
<p><strong>Sad</strong>: When I forget to follow this practice, or follow it poorly, I end up with codes in need of constant cleaning up. Creating new functionality feels like a drag, because there&#8217;s a lot of old junk I want to clean up before going on. It&#8217;s a sad day when I find myself cleaning up code that I really shouldn&#8217;t have to touch.</p>
<p><strong>Ugly</strong>: But if I skirt the sadness of improving code that I come across on my journeys, after a while, I&#8217;ll have a mess on my hands. If I&#8217;m lucky, I can fix this with a few checkins. Some projects seem to close down for weeks to &#8220;deal with technical debt&#8221;. In the worst situations, the code will be in a non-functioning state in the meantime. Or you may hear those dreaded words: &#8220;Rewrite from scratch&#8221;.</p>
<p>If there&#8217;s one think I&#8217;ve learned, it&#8217;s to never leave the code in a non-functioning state. Once I depart from what I know work, getting back on track is many times harder than I ever imagined.</p>
<p>When a project schedules &#8220;refactoring tasks&#8221;, I find myself sad. The need for scheduled refactorings is a symptom that we don&#8217;t do the necessary good or even sad refactorings as we should. And scheduling refactoring tasks is an excuse to perpetuate our bad habits.</p>
]]></content:encoded>
			<wfw:commentRss>http://johannesbrodwall.com/2011/01/30/refactoring-the-good-the-sad-and-the-ugly/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The effective product owner</title>
		<link>http://johannesbrodwall.com/2010/11/14/the-effective-product-owner/</link>
		<comments>http://johannesbrodwall.com/2010/11/14/the-effective-product-owner/#comments</comments>
		<pubDate>Sun, 14 Nov 2010 20:04:54 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[Norsk]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://johannesbrodwall.com/?p=724</guid>
		<description><![CDATA[I&#8217;ve published a Norwegian language article titled: &#8220;Min supre produkteier&#8221; (&#8220;My excellent product owner&#8221;) at the company blog for Steria Norway. Go check it out if you understand Norwegian!]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve published a Norwegian language article titled: &#8220;<a href="http://sterkblanding.no/blog/2010/11/14/min-supre-produkteier/">Min supre produkteier</a>&#8221; (&#8220;My excellent product owner&#8221;) at the company blog for Steria Norway. <a href="http://sterkblanding.no/blog/2010/11/14/min-supre-produkteier/">Go check it out</a> if you understand Norwegian!</p>
]]></content:encoded>
			<wfw:commentRss>http://johannesbrodwall.com/2010/11/14/the-effective-product-owner/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Video: No-red refactoring</title>
		<link>http://johannesbrodwall.com/2010/11/05/no-red-refactoring/</link>
		<comments>http://johannesbrodwall.com/2010/11/05/no-red-refactoring/#comments</comments>
		<pubDate>Fri, 05 Nov 2010 05:54:20 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://johannesbrodwall.com/?p=714</guid>
		<description><![CDATA[The more I code, the more I&#8217;ve learned to appreciate keeping the code clean even during complex refactorings. By &#8220;clean&#8221;, I mean that the code always compiles and the test always run. I often find myself in a situation where I have a method call that&#8217;s starting to accumulate parameters. Something like this: showPersonCreateForm&#40;writer, firstName, [...]]]></description>
			<content:encoded><![CDATA[<p>The more I code, the more I&#8217;ve learned to appreciate keeping the code clean even during complex refactorings. By &#8220;clean&#8221;, I mean that the code always compiles and the test always run.</p>
<p>I often find myself in a situation where I have a method call that&#8217;s starting to accumulate parameters. Something like this:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">showPersonCreateForm<span style="color: #009900;">&#40;</span>writer, firstName, firstNameErrorMessage, lastName, lastNameErrorMessage,....<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>After three or four parameters, the need to refactor is starting to become evident. I would rather have something like this:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">CreatePersonForm form <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> CreatePersonForm<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
form.<span style="color: #006633;">setFirstName</span><span style="color: #009900;">&#40;</span>firstName<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
form.<span style="color: #006633;">setFirstNameErrorMessage</span><span style="color: #009900;">&#40;</span>firstName<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
form.<span style="color: #006633;">setLastName</span><span style="color: #009900;">&#40;</span>firstName<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
form.<span style="color: #006633;">setLastNameErrorMessage</span><span style="color: #009900;">&#40;</span>firstName<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
form.<span style="color: #006633;">show</span><span style="color: #009900;">&#40;</span>writer<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>This is one of the more complex simple refactorings you can make, and it requires several steps. In this five minute video, I show how to perform such a refactoring without any steps that break my code:</p>
<p><embed src="http://blip.tv/play/AYKKglwC" type="application/x-shockwave-flash" width="480" height="306" allowscriptaccess="always" allowfullscreen="true"></embed></p>
<p>The screencast was created using the free BB FlashBack Express on Windows. All the magic you see happening while I program is either <code>ctrl-space</code> (complete) or <code>ctrl-1</code> (quick fix).</p>
<p>Can you modify your code without going thought long stages of nothing working? I think you can!</p>
]]></content:encoded>
			<wfw:commentRss>http://johannesbrodwall.com/2010/11/05/no-red-refactoring/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

