<?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>The Turning Point &#187; Development</title>
	<atom:link href="http://blog.franktrindade.com/category/development/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.franktrindade.com</link>
	<description>Agile, software and some nonsense</description>
	<lastBuildDate>Tue, 31 Jan 2012 21:30:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Beyond Budgeting at LESS 2011</title>
		<link>http://blog.franktrindade.com/2012/01/20/beyond-budgeting-at-less-2011/</link>
		<comments>http://blog.franktrindade.com/2012/01/20/beyond-budgeting-at-less-2011/#comments</comments>
		<pubDate>Thu, 19 Jan 2012 21:00:16 +0000</pubDate>
		<dc:creator>franktrindade</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Lean]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Presentations]]></category>
		<category><![CDATA[beyond_budgeting]]></category>
		<category><![CDATA[leadership]]></category>
		<category><![CDATA[less2011]]></category>

		<guid isPermaLink="false">http://blog.franktrindade.com/?p=730</guid>
		<description><![CDATA[One of the things that attracted my interest to LESS 2011 was the Beyond Budgeting track. Having read the book a couple of years ago, it is definitely a topic that catches my interest. And it was even better that the first keynote was presented by Bjarte Bogsnes, talking about how beyond budgeting is used at [...]]]></description>
			<content:encoded><![CDATA[<p>One of the things that attracted my interest to <a href="http://less2011.leanssc.org/">LESS 2011</a> was the Beyond Budgeting track. Having read the <a href="http://www.amazon.com/Beyond-Budgeting-Managers-Annual-Performance/dp/1578518660">book</a> a couple of years ago, it is definitely a topic that catches my interest. And it was even better that the first keynote was presented by <a href="http://no.linkedin.com/pub/bjarte-bogsnes/10/579/415">Bjarte Bogsnes</a>, talking about how beyond budgeting is used at <a href="http://en.wikipedia.org/wiki/Statoil">StatOil</a></p>
<p>As any presentation write-up, this is just my understanding about what was presented, so please don&#8217;t hold the presenter on to what I&#8217;m writing here :)</p>
<h2>Why ?</h2>
<p>The first question Bjarte addressed was why the need for something different. And I believe this sentence explains it all</p>
<blockquote><p>January-December is artificial for business and just works for accounting. But this is not accounting</p></blockquote>
<p>He followed by explaining that StatOil is always trying to get the best performance they can (who isn&#8217;t!), and coupling everything they do to an accounting mechanism (the budget) doesn&#8217;t make sense for them. He illustrated it with a comparison between the use of traffic lights and roundabouts. While the first is easier to use and provides more control, the latter actually provides better results because it relies more in the current situation than on statistical analysis.</p>
<blockquote><p>We need to find more self regulating ways to manage a business, and beyond budgeting is one of them.</p></blockquote>
<p>Bjarte used Douglas McGregor&#8217;s <a href="http://en.wikipedia.org/wiki/Theory_X_and_theory_Y">Theories X and Y</a> to explain how we traditional management doesn&#8217;t usually trust people and relies on a stable environment to succeed, but in a dynamic environment in which most companies are inserted today, we need to start trusting our employees much more, and that is where beyond budgeting stands.</p>
<p>He had a nice example to show the lack of trust some companies impose, about a friend who is a SAS pilot, and even when he is trusted to fly planes full of people around, if he wants to change his shirt more often than it&#8217;s stated in the company&#8217;s policy, he needs a written authorization for it.</p>
<h2>How does it work ?</h2>
<p>According to Bjartes, the problem with budget is that it&#8217;s a single tool used for three separate purposes: <strong>Setting targets, creating forecats and allocating resources</strong>. Since these results are usually different from each other (targets are what we want, forecasts are what we expect to get), we won&#8217;t get an optimal result from using it.</p>
<p>In StatOil they have developed an alternative format of planning called Ambition to Action. These are a few principles that are used when cdefining it:</p>
<blockquote>
<ul>
<li>Good performance is being better than those we compare ourselves with</li>
<ul>
<li>It could be external companies or even ourselves, which means we are learning.</li>
</ul>
<li>Do the right thing</li>
<ul>
<li>Every new joiner receives a StatOil book (a thin one!) with some of the principles that guide the company, so they can all use their business judgement and make decisions when needed.</li>
</ul>
<li>Resources are made available and allocated on a case by case basis</li>
<ul>
<li>Bjartes compared having an yearly budget to having a bank that opens for only a month throughout the year. How can anyone make timely decisions with that ?</li>
</ul>
<li>Business is forward looking and action oriented</li>
<li>Performance measurement is holistic, and composed by 50% results and 50% behaviour</li>
</ul>
</blockquote>
<p>These principles are used to define what to do in the company, in a process that goes like this:</p>
<blockquote><p>1. Strategic Objectives -&gt; 2. KPI&#8217;s -&gt; 3. Action &amp; Forecast -&gt; 4.Individual goals</p></blockquote>
<p>So the company is going to set strategic objectives which are then converted in KPI&#8217;s. These are used to define the things that need to be done (Ambition to action), which reflect on how performance is measured for everyone in the company.</p>
<p>Some interesting thoughts he shared when explaining the process were:</p>
<blockquote>
<ul>
<li>The perfect KPI doesn&#8217;t exist, since not everything that counts can be counted.</li>
<li>StatOil creates around 1100 Ambition to action plans, and these are not a reporting tool, but more a guidance on how you as an employee should manage him/herself. Apart from that, everything is open, so everyone can see everyone&#8217;s else goals.</li>
<li>Performance measurement is usually based on teams and, as said before, divided between results and behaviour. Assuming that the environment very often changes, how someone behaved in that occasion is as important as the results he/she delivered.</li>
</ul>
</blockquote>
<p>The last point that was made during the presentation is how StatOil is moving from a calendar-driven model to a business-driven one. There are no more annual versions of Ambition to Action being created, and they can be changed at any time. The performance review is still happening annually, but Bjartes mentioned they are currently revisiting it now.</p>
<p>Overall it was a great introduction to Beyond Budgeting and how it is applied at StatOil. If you are interested, there is more information <a href="http://www.bbrt.org/beyond-budgeting/beybud.html">here</a> and <a href="http://www.youtube.com/watch?v=bRak-FJsLpA">here</a>.</p>
<blockquote><p>Bjartes is speaking in the <a href="http://live.thoughtworks.com/australia">Thoughtworks Live Australia</a> event. If you have a chance to go, don&#8217;t miss it.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.franktrindade.com/2012/01/20/beyond-budgeting-at-less-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Managing Dependencies &#8211; The Simple Way</title>
		<link>http://blog.franktrindade.com/2011/07/20/managing-dependencies-the-simple-way/</link>
		<comments>http://blog.franktrindade.com/2011/07/20/managing-dependencies-the-simple-way/#comments</comments>
		<pubDate>Wed, 20 Jul 2011 13:49:56 +0000</pubDate>
		<dc:creator>franktrindade</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Lean]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[coordination]]></category>
		<category><![CDATA[dependencies]]></category>

		<guid isPermaLink="false">http://blog.franktrindade.com/?p=641</guid>
		<description><![CDATA[One of the common problems software teams face is that they are not alone in the world, and usually depend on other teams to deliver functionality to the end customer. When the two projects are happening at the same time, it gives both teams the advantage that they can communicate with  and adapt more often [...]]]></description>
			<content:encoded><![CDATA[<p>One of the common problems software teams face is that they are not alone in the world, and usually depend on other teams to deliver functionality to the end customer.</p>
<p>When the two projects are happening at the same time, it gives both teams the advantage that they can communicate with  and adapt more often to each other&#8217;s needs. It does bring a question on how to synchronise two independent streams of work, since not doing it might bring a lot of headache in terms of stories being blocked because dependencies haven&#8217;t been met, which ends up being a lot of waste.</p>
<p><img class="alignright" style="border-width: 2px; border-color: black; border-style: solid; margin: 2px;" title="post" src="http://blog.franktrindade.com/wp-content/uploads/2011/07/post-300x179.jpg" alt="" width="243" height="145" /></p>
<p>In my current project, we have been using a visual technique to managedependencies which has been proven successful in terms of identifying dependent stories with minimal overwork.</p>
<ul>
<li>All stories that rely on external teams receive a red dot, which represents they can&#8217;t be played before the dependency is verified.</li>
<li>Once the external team finishes their part of the work, a blue dot is written on the card, specifying the dependency can be tested by our team</li>
<li>An integration test gets written against that feature, and if everything works as expected, the story received a green dot, showing that it is ready to be played</li>
</ul>
<p>So far, the technique has reduced the feedback cycle between us and the external team on which we depend. Testing the stories just after they have been developed means that we can give early feedback about if they are working or not, and avoid starting to work in tasks that cannot be completed.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.franktrindade.com/2011/07/20/managing-dependencies-the-simple-way/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Page Model with Cucumber and Capybara</title>
		<link>http://blog.franktrindade.com/2011/03/04/page-model-with-cucumber-and-capybara/</link>
		<comments>http://blog.franktrindade.com/2011/03/04/page-model-with-cucumber-and-capybara/#comments</comments>
		<pubDate>Fri, 04 Mar 2011 20:59:31 +0000</pubDate>
		<dc:creator>franktrindade</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[Tests]]></category>
		<category><![CDATA[capybara]]></category>
		<category><![CDATA[cucumber]]></category>

		<guid isPermaLink="false">http://blog.franktrindade.com/?p=516</guid>
		<description><![CDATA[I&#8217;ve spent some time today changing the Cucumber/Capybara tests in one of my pet projects to use a page model. Since I didn&#8217;t find much stuff on the interwebs about it, why not write it here ? The idea behind having a page model is to keep steps related to a specific page on your [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve spent some time today changing the Cucumber/Capybara tests in one of my pet projects to use a page model. Since I didn&#8217;t find much stuff on the interwebs about it, why not write it here ?</p>
<p>The idea behind having a page model is to keep steps related to a specific page on your app in the same place, so you can reduce the repetition of steps in different tests. Is definitely not a complicated practice, and setting Capybara for it is a simple step.</p>
<p>Setting the context, Im using Cucumber 0.10 with Capybara 0.4.1.2 and Rails 3.0.1. Have done the standard installation steps recommended by the <a href="https://github.com/aslakhellesoy/cucumber-rails">cucumber-rails github page</a>.</p>
<p>The only modification I&#8217;ve made with the created structure is adding a folder for the page objects, so the final structure is this:</p>
<p><a rel="attachment wp-att-519" href="http://blog.franktrindade.com/2011/03/04/page-model-with-cucumber-and-capybara/screen-shot-2011-03-05-at-2-00-31-am/"><img class="alignnone size-full wp-image-519" title="Screen shot 2011-03-05 at 2.00.31 AM" src="http://blog.franktrindade.com/wp-content/uploads/2011/03/Screen-shot-2011-03-05-at-2.00.31-AM.png" alt="" width="219" height="162" /></a></p>
<p>As you can see, inside the pages folder there is a home page file, which is responsible for every action/assertion related to the home page.</p>
<p>Nothing new with the cucumber features, which keep having it&#8217;s standard style</p>
<p><code>Feature: Manage tasks<br />
In order to manage my tasks,<br />
a user<br />
wants to create tasks in different categories</p>
<p>Scenario: Create a new task<br />
Given I am in the Do Me home page<br />
When I create an urgent and important task with description "my task"<br />
Then I should see "my task" in the "Urgent and Important" section<br />
</code></p>
<p>However, in order to create our page object, we need to inject the test driver on it, which in Capybara&#8217;s case, is the session object.</p>
<p><code>Given /^I am in the home page$/ do<br />
@home_page = HomePage.new(Capybara.current_session)<br />
@home_page.visit<br />
end</p>
<p>When /^I create an urgent and important task with description "([^"]*)"$/ do |task_description|<br />
@home_page.fill_task_description(task_description)<br />
@home_page.check_important<br />
@home_page.check_urgent<br />
@home_page.create_task<br />
end</code></p>
<p>And from there is just the trouble of creating the page class (or do like me, who shamelessly copied the style from <a href="http://watirmelon.com/2011/01/21/my-simple-cucumber-watir-page-object-pattern-framework/">here</a>).</p>
<p><code><br />
class HomePage<br />
</code</p>
<p><code><br />
URL = "/"</p>
<p>def initialize(session)<br />
@session = session<br />
end</p>
<p>def visit<br />
@session.visit URL<br />
end</p>
<p>def fill_task_description(description)<br />
@session.fill_in("Description", :with =&gt; description)<br />
end</p>
<p>def check_urgent<br />
check("Urgent")<br />
end</p>
<p>def check_important<br />
check("Important")<br />
end</p>
<p>def create_task<br />
@session.click_button("Create Task")<br />
end<br />
</code></p>
<p>And that&#8217;s pretty much it, now is just choosing your preferred driver and run the tests. As you can see, not much effort for a nice improvement.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.franktrindade.com/2011/03/04/page-model-with-cucumber-and-capybara/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Can I just throw it over the wall ?</title>
		<link>http://blog.franktrindade.com/2011/02/15/can-i-just-throw-it-over-the-wall/</link>
		<comments>http://blog.franktrindade.com/2011/02/15/can-i-just-throw-it-over-the-wall/#comments</comments>
		<pubDate>Tue, 15 Feb 2011 12:19:29 +0000</pubDate>
		<dc:creator>franktrindade</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[collaboration]]></category>
		<category><![CDATA[handover]]></category>
		<category><![CDATA[qa]]></category>
		<category><![CDATA[quality]]></category>

		<guid isPermaLink="false">http://blog.franktrindade.com/?p=445</guid>
		<description><![CDATA[One of the good things I&#8217;ve took from one of the recent projects I&#8217;ve been in was the way the handover of stories from Dev to QA was done. I mean, the handover topic is something that Im usually asked about, and I&#8217;ve never had a decent answer for it, since in my experience it [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">One of the good things I&#8217;ve took from one of the recent projects I&#8217;ve been in was the way the handover of stories from Dev to QA was done.</p>
<p style="text-align: justify;">I mean, the handover topic is something that Im usually asked about, and I&#8217;ve never had a decent answer for it, since in my experience it has always been something like this&#8230;</p>
<p><strong><em>Is this story ready to Qa ? Well, I think so,  it must be !</em></strong></p>
<p><img class="size-medium wp-image-450 alignright" style="margin-left: 10px; margin-right: 10px; border: 5px solid black;" title="Developer Checklist" src="http://blog.franktrindade.com/wp-content/uploads/2011/02/Screen-shot-2011-02-15-at-10.32.18-AM-258x300.png" alt="" width="258" height="300" /></p>
<p style="text-align: justify;">However, in the project mentioned above, at some point we had lot of bugs. Not really serious ones that would make us worry about the quality of the code we were writing, but a great number of small and annoying things that showed us we weren&#8217;t being really careful when developing a story.</p>
<p style="text-align: justify;">Most of the stories that we &#8220;delivered&#8221; (yeah, right&#8230;) came back with a considerable number of small fixes to be done. Needless to say, we were losing a lot of time reworking things that should have been caught before finishing it, and not getting much code across the line because of it.</p>
<p style="text-align: justify;">So we had some discussions about the problem and what we came up with was an amazing&#8230; <strong><em>checklist</em></strong>.</p>
<blockquote>
<p style="text-align: justify;">If we, as developers, were being sloppy when finishing the stories, why didn&#8217;t we have a list of what we had to do before considering it ready ?</p>
</blockquote>
<p>As you can see above, there is nothing incredible about it,  just the fact that it made us remember what to do, something that is a lot of times easier said than done. Looking at this simple list I can make sure I always test the story against all the browsers we support, as well as verifying that the acceptance criteria were really met.</p>
<p>Talking about acceptance criteria, another goodness that came with it and facilitated the whole process was having mind maps describing what QA&#8217;s were going to be testing in every story.</p>
<p>Having this information available and easy to understand was miles ahead from the traditional <em>&#8220;I&#8217;m going to find bugs in your story&#8221;</em> mentality that dominates some teams. As usual, cross-role collaboration was a huge win for productivity.</p>
<p><a rel="attachment wp-att-490" href="http://blog.franktrindade.com/2011/02/15/can-i-just-throw-it-over-the-wall/screen-shot-2011-02-15-at-11-16-41-pm/"><img class="alignnone size-full wp-image-490" style="border: 5px solid black;" title="mindmap" src="http://blog.franktrindade.com/wp-content/uploads/2011/02/Screen-shot-2011-02-15-at-11.16.41-PM.png" alt="mindmap" width="736" height="390" /></a></p>
<p style="text-align: justify;">
<p style="text-align: justify;">Knowing what was going to be tested enabled developers to take a look at the story with different eyes, verifying if all cases were accounted for before actually handing it over. As expected, we delivered more.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.franktrindade.com/2011/02/15/can-i-just-throw-it-over-the-wall/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What&#8217;s the Tech Lead Doing Anyway ?</title>
		<link>http://blog.franktrindade.com/2009/08/11/whats-the-tech-lead-doing-anyway/</link>
		<comments>http://blog.franktrindade.com/2009/08/11/whats-the-tech-lead-doing-anyway/#comments</comments>
		<pubDate>Tue, 11 Aug 2009 08:30:38 +0000</pubDate>
		<dc:creator>franktrindade</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[leadership]]></category>
		<category><![CDATA[tech lead]]></category>

		<guid isPermaLink="false">http://blog.franktrindade.com/?p=328</guid>
		<description><![CDATA[Some days ago when having a discussion at work about the responsibility of the tech lead in an agile team, I&#8217;ve realized that this is not a so simple subject as I thought it was. Therefore, good subject for a post : ) But before being dictatorial and just writing my opinion, I ran a [...]]]></description>
			<content:encoded><![CDATA[<p>Some days ago when having a discussion at work about the responsibility of the tech lead in an agile team, I&#8217;ve realized that this is not a so simple subject as I thought it was. Therefore, good subject for a post : )</p>
<p>But before being dictatorial and just writing my opinion, I ran a small twitter poll asking about this subject. Fortunately, most of the answers matched what I think in some level, so hopefully I will be able to cover it all here.</p>
<p>Before starting, a last note. I was reminded that the term tech lead might not be so used and known as I think it is, so if you don&#8217;t use this term at all, sorry : ). You can replace tech lead for architect, technical manager, master jedi, whatever you feel like&#8230;</p>
<p>Giving an introduction, the tech lead (TL)  term is defined here as a person who has the technical overview over a specific project. Some people disagree about the need for a tech lead at all, but that&#8217;s the topic for another post, and here we will assume that the tech lead exists and is a single person. Ok, that was the easy part.</p>
<p>Now the more subtle (and polemic) part comes here, so I will give my opinion on it (with the help from <a href="http://twitter.com/dtsato">@dtsato</a> and <a href="http://twitter.com/flessa">@flessa</a>).</p>
<p><em><strong>What a tech lead should be doing:</strong></em></p>
<p><strong>Have a technical overview over the whole project</strong> &#8211; As a developer doing everyday work, it is easy to lose the long term perspective about where the project is going and make decisions that will be better in the short term, but harm the project in the long way. It&#8217;s the job of the TL to keep that in the mind of the development team.</p>
<p><strong>Make sure the project has a common face</strong> &#8211; <a href="http://blog.franktrindade.com/2008/10/17/we-need-standards/">Standards are important IMO</a>, and making sure the project still makes sense as a whole, avoiding knowledge silos it&#8217;s the job of the TL. He shouldn&#8217;t have to enforce standards or ways to develop code, but facilitate the discussion within the team.</p>
<p><strong>Remove technical impediments</strong> &#8211; As the most experienced person in the project, its natural that sometimes the TL will be the person in the best position to remove technical blockages that the team might have.</p>
<p><strong>Bring people to a good technical level</strong> &#8211; If the team has different levels of experience, the TL should work to help people achieve a good work quality by sharing his knowledge and incentive others to do the same.</p>
<p><strong>Write code. Write a lot of code</strong> &#8211; The TL is not a superior being that gives directions from the top of a mountain. Don&#8217;t know about your opinion, but if I can&#8217;t rely on the TL to sit down and pair with me when I have a problem I can&#8217;t solve, it&#8217;s no good to me.</p>
<p>I think that is enough for now. Now, for <strong><em>what the tech lead should not be doing:</em></strong></p>
<p><strong>Be the person responsible for the code &#8211; </strong>Being the tech lead doesn&#8217;t mean being the owner of the code, or the team&#8217;s boss. It&#8217;s everyone&#8217;s job to create high quality software, and the TL should only expose problems to the team and lead them in the right direction (emphasis on <em>lead</em>, not <em>mandate</em>).</p>
<p><strong>Making all the difficult decisions alone </strong>- During a project, the team will be exposed to different technical decisions that will have to be made. Allowing the TL to take them alone just expose the team to more risk, since they won&#8217;t understand/care about what was decided. What we want to achieve is that Paulo exemplified <a href="http://agiletips.blogspot.com/2009/08/agile-pm-and-architect-dialog.html">here</a>.</p>
<p><strong>Impose his opinion</strong> &#8211; This is probably the most important point. Remember <a href="http://www.extremeprogramming.org/rules/collective.html">collective code ownership</a> ? It is still very important. No matter how brilliant a TL can be, if he can&#8217;t share his knowledge/decisions and specially the responsability with the rest of the team, things will go bad.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.franktrindade.com/2009/08/11/whats-the-tech-lead-doing-anyway/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Dev Complete? No!</title>
		<link>http://blog.franktrindade.com/2009/05/12/dev-complete-no/</link>
		<comments>http://blog.franktrindade.com/2009/05/12/dev-complete-no/#comments</comments>
		<pubDate>Tue, 12 May 2009 12:00:07 +0000</pubDate>
		<dc:creator>franktrindade</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Add new tag]]></category>
		<category><![CDATA[dev complete]]></category>
		<category><![CDATA[measurement]]></category>
		<category><![CDATA[measures]]></category>
		<category><![CDATA[qa complete]]></category>
		<category><![CDATA[qa ready]]></category>
		<category><![CDATA[wall]]></category>

		<guid isPermaLink="false">http://blog.franktrindade.com/?p=291</guid>
		<description><![CDATA[Recently we&#8217;ve had a discussion in a project I was working on about the concepts behind dev complete and qa complete stories, which are normally in a lot of agile wall&#8217;s swim lanes, and how they affect the project&#8217;s flow. The point here is not to discuss how to measure your goals, since this was [...]]]></description>
			<content:encoded><![CDATA[<p>Recently we&#8217;ve had a discussion in a project I was working on about the concepts behind <em>dev complete</em> and <em>qa complete</em> stories, which are normally in a lot of agile wall&#8217;s swim lanes, and how they affect the project&#8217;s flow.</p>
<p>The point here is not to discuss how to measure your <a href="http://blog.franktrindade.com/2009/04/21/what-is-your-goal/">goals</a>, since this was discussed in previous posts, but what I wanted to explain is how (what I&#8217;ve realized during that discussion) I don&#8217;t like the term <em>dev complete</em>, and why it can affect your team.</p>
<p>First of all, <em><strong>development</strong> complete</em> implies the idea that we don&#8217;t need any more development in one specific story, and as anyone who has been in an agile project might have noticed, this is less true than we wanted it to be.</p>
<p>What frequently happens is that stories which are in the <em>dev complete</em> lane come back to development when they don&#8217;t meet the QA criteria, and suddenly development has to be done again for something that didn&#8217;t need any more development.</p>
<p>And what I find most annoying is that <em>development <strong>complete</strong></em><strong> </strong>has the word complete on it, which has an underlying meaning that someone (the devs, in this case) have completed their job, and that they could feel good about it at this point.</p>
<p>What goes away when this assumption enters someone&#8217;s mind is the fact that <strong>the objective (for all the team, including those devs), is after the <em>qa complete</em></strong> <strong>stage</strong>, when the story is actually delivered. And this situation just gives another motive to the always disturbing <a href="http://www.thekua.com/atwork/">separation between developers and qa&#8217;s</a>.</p>
<p>So if you believe in how measures affect the results of a team as I do (more info on that <a href="http://blog.franktrindade.com/2009/04/21/what-is-your-goal/">here</a>, <a href="http://blog.franktrindade.com/2009/04/06/more/">here</a>, <a href="http://blog.franktrindade.com/2008/07/27/student-syndrome/">here</a>, <a href="http://blog.franktrindade.com/2008/05/20/uncertainty/">here</a>, <a href="http://blog.franktrindade.com/2008/05/13/velocity-capacity-and-productivity/">here</a>, <a href="http://blog.franktrindade.com/2008/04/01/%E2%80%9Ctell-me-how-you%E2%80%99ll-measure-me%E2%80%A6%E2%80%9D-2/">here</a> and <a href="http://blog.franktrindade.com/2008/04/01/tell-me-how-youll-measure-me/">here</a>), change all your <em>dev complete</em> stories to <em>qa ready</em>, or something similar, and enjoy a little bit more peace of mind.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.franktrindade.com/2009/05/12/dev-complete-no/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>What is Your Goal?</title>
		<link>http://blog.franktrindade.com/2009/04/21/what-is-your-goal/</link>
		<comments>http://blog.franktrindade.com/2009/04/21/what-is-your-goal/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 12:30:39 +0000</pubDate>
		<dc:creator>franktrindade</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[deming]]></category>
		<category><![CDATA[drucker]]></category>
		<category><![CDATA[goldratt]]></category>
		<category><![CDATA[Lean]]></category>
		<category><![CDATA[measures]]></category>
		<category><![CDATA[poppendieck]]></category>

		<guid isPermaLink="false">http://blog.franktrindade.com/?p=250</guid>
		<description><![CDATA[One of the best things about Agile is the introduction of software development as a system. Software stopped being treated as a sequence of separated steps to be seen as people with different competences working together to achieve one goal: deliver software. This is not new in any sense, and it was exemplified by Deming [...]]]></description>
			<content:encoded><![CDATA[<p>One of the best things about Agile is the introduction of software development as a system. Software stopped being treated as a sequence of separated steps to be seen as people with different competences working together to achieve one goal: deliver software.</p>
<p>This is not new in any sense, and it was exemplified by Deming on one of his <a href="http://www.amazon.co.uk/New-Economics-Industry-Government-Education/dp/0262541165/ref=pd_sim_b_3" target="_blank">books</a>:</p>
<blockquote><p>I could do a much better job (fewer mistakes) if I knew what the program is to be used for. The specifications don&#8217;t tell me what I need to know.</p></blockquote>
<p>Despite this advance, most software development teams fail in really understanding this concept, and still normally don&#8217;t see the power of using one unique measure to manage the project, not getting the idea that the effort of the system should be only measured once, in what is its goal.</p>
<p>You must be asking what is the problem of having different measures to verify the sanity of the project. And that is what Peter Drucker explains in his <a href="http://www.amazon.com/Post-Capitalist-Society-Peter-F-Drucker/dp/0887306616">Post-Capitalist Society</a> book:</p>
<blockquote><p>In knowledge work&#8230; the task is not given, it has to be determined. &#8216;What are the expected results from this work?&#8217; is the key question in making knowledge workers productive. And it is a question that demands risky decisions. <strong>There is usually no right answer; there are choices instead</strong>. And results have to be clearly specified, if productivity is to be achieved.</p></blockquote>
<p>What it means is that tasks cannot be fully specified anymore, the workers have to make decisions every time about how to proceed in certain situations, and they <em><strong>can just do it correctly if they have a clear vision of what is to be obtained, and what is the final goal of the work they are doing</strong></em>.</p>
<p>This concept is also illustrated in the draft version of Mary and Tom Poppendieck&#8217;s latest book (still in the draft version), when they are explaining the case of Southwest Airlines, which has as main advantage against the competition, the fact that its planes stay less time in the ground, thus generating more revenue.</p>
<blockquote><p>Southwest maintains a systems perspective; it doesn&#8217;t let individual department measurements or increased revenue opportunities distract it from the primary objective of maintaining profitability. Southwest makes it clear to every employee &#8211; from the agent closing the gate to the baggage handler transferring luggage &#8211; what is important from an overall perspective. <strong>Everyone at Southwest knows the mantra: &#8220;Airplanes don&#8217;t make money sitting on the ground.&#8221;</strong> So everyone works together to get each plane in the air as fast as possible.</p></blockquote>
<p>The important here is that we have <strong>one</strong> measure. One variable that everyone can rely on to make decisions during their work, and the ability to do it makes a whole difference in the overall performance of a team,  fact that often not considered in software development, where different measures distract people from the main goal.</p>
<p>As an example, a common situation I&#8217;ve seen in project is to track bugs within the iteration, and use it as a measure of code quality. <em>Well, the goal of a software team is to deliver software without bugs, but it doesn&#8217;t matter at all if in the process of creating software bugs are found and solved prior to the software being released</em>. If that is the way the team works best, so be it.</p>
<p>Another example is a case where a project had a problem with bugs creeping (this time, after iteration was finished and software delivered), and when discussing the fact we&#8217;ve realized that because of the pressure to deliver, we were delivering development complete, and not QA complete stories, so QA was actually done after the iteration finished, and yes, the team&#8217;s velocity was based on development complete points.</p>
<p>Well&#8230; if the goal you set to the team is to deliver dev complete stories, guess what you&#8217;re receiving in the end&#8230; dev complete stories!, it doesn&#8217;t matter how many times you repeat &#8220;<em>Let&#8217;s focus on delivering quality software</em>&#8220;. As Goldratt said, &#8220;<em><em>Tell me</em> how you <em>measure me</em> and I will <em>tell</em> you how I will behave</em>.&#8221;</p>
<p>So, <strong>what is your goal?</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.franktrindade.com/2009/04/21/what-is-your-goal/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Distributed Source Control and Set-Based Design</title>
		<link>http://blog.franktrindade.com/2009/03/10/distributed-source-control-and-set-based-design/</link>
		<comments>http://blog.franktrindade.com/2009/03/10/distributed-source-control-and-set-based-design/#comments</comments>
		<pubDate>Tue, 10 Mar 2009 08:30:22 +0000</pubDate>
		<dc:creator>franktrindade</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[cvs]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[set-based design]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[version control]]></category>

		<guid isPermaLink="false">http://blog.franktrindade.com/?p=226</guid>
		<description><![CDATA[That distributed version control systems are the current flavour of the moment, everybody already knows, so I&#8217;m not here to talk about the N reasons why you should not use svn/cvs anymore. But what I hadn&#8217;t notice until recently is that git (or any other DVCS) actually allow you to do one very important thing [...]]]></description>
			<content:encoded><![CDATA[<p>That distributed version control systems are the current flavour of the moment, everybody already knows, so I&#8217;m not here to talk about the N reasons why you should not use svn/cvs anymore.</p>
<p>But what I hadn&#8217;t notice until recently is that git (or any other DVCS) actually allow you to do one very important thing in software development: set-based design</p>
<p>As Mary Poppendieck <a href="http://www.poppendieck.com/development.htm">pointed out</a>:</p>
<blockquote><p>Toyota and 3M use the same concept for product design.  They explore the entire solution space and find intersections that everyone finds acceptable, gradually adding detail and converging on a solution.  This approach is called <strong>set-based design</strong>, and contrasts sharply with point-based designs which start with a single solution that undergoes a series of optimizations.  In most cases, set-based design produces the best design in the shortest amount of time with the least amount of communication.  It’s strange that this principle, so obvious when you are scheduling meetings, seems counterintuitive in the development environment</p></blockquote>
<p>The eureka moment came to me in my latest project (in which i&#8217;m using svn), when I was thinking about exploring an alternative path to some code that was already implemented, but I thought it could be redone in a better way. How to do it with svn?</p>
<p>I could enter the obscure world of svn branches and merges, where I would have to fight hard to get my code back in one piece, but that didn&#8217;t sound inviting at all, and that&#8217;s why I haven&#8217;t actually implemented the second option, waiting to be more certain about it.</p>
<p>The interesting thing is that since I&#8217;ve been using git for the last year, I always took it for granted, and didn&#8217;t actually realize this benefit from DVC systems.</p>
<p>So, if you are thinking about why change from cvs/svn to a distributed system, add this point to your list.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.franktrindade.com/2009/03/10/distributed-source-control-and-set-based-design/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Does it Really Work?</title>
		<link>http://blog.franktrindade.com/2009/03/05/does-it-really-work/</link>
		<comments>http://blog.franktrindade.com/2009/03/05/does-it-really-work/#comments</comments>
		<pubDate>Thu, 05 Mar 2009 08:30:54 +0000</pubDate>
		<dc:creator>franktrindade</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[usability]]></category>
		<category><![CDATA[ux]]></category>

		<guid isPermaLink="false">http://blog.franktrindade.com/?p=206</guid>
		<description><![CDATA[Last week during TW London Last Thursday event, I had the pleasure to see this presentation from Dave Robertson and John Johnston (or at least part of it), about how Agile and User Centered design are more a match, sharing goals and values, than different approaches to software development. If you have some time you [...]]]></description>
			<content:encoded><![CDATA[<p>Last week during TW London Last Thursday event, I had the pleasure to see <a href="http://www.infoq.com/presentations/Agile-UCD-Robertson-Johnston;jsessionid=B558A1920338BD28C73E3D2E5FD6B062" target="_self">this</a> presentation from Dave Robertson and John Johnston (or at least part of it), about how Agile and User Centered design are more a match, sharing goals and values, than different approaches to software development.</p>
<p>If you have some time you should really watch it, it is worth the time.</p>
<p>The overall presentation is really good, but the reason I&#8217;m posting here is one specific point that was mentioned, which I believe really hit the spot, and that&#8217;s when they say we should rethink the word <strong>work</strong> in the <em><strong>&#8220;the simplest thing that could possibly work&#8221;</strong> </em>sentence.</p>
<p>This point goes back to the <a href="http://blog.franktrindade.com/2008/11/25/agile-vs-usability/" target="_blank">Agile Vs Usability</a> discussion and it is very correct IMO, because it reiterates that development teams should not deliver any code just because it was quick to develop it and the client is happy (although he shouldn&#8217;t be at all) since it didn&#8217;t cost a fortune.</p>
<p>And what is interesting about this subject is how agile teams <em><strong>don&#8217;t usually accept low quality code standards</strong></em> (code without tests, lots of hacks, etc..), <em><strong>but easily accept low usability standards</strong></em>, not understanding that is also their responsibility to define what a good user experience is.</p>
<p>What I&#8217;m NOT trying to say is that the user should be left outside from the application design. He should definitely have his opinion (and a strong one), but should also receive advice in UX standards as much as he should in code quality, making sure that he understands what he loses when is trying to save money on each particular feature.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.franktrindade.com/2009/03/05/does-it-really-work/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Rails 2.3 New Features</title>
		<link>http://blog.franktrindade.com/2009/02/02/rails-23-new-features/</link>
		<comments>http://blog.franktrindade.com/2009/02/02/rails-23-new-features/#comments</comments>
		<pubDate>Mon, 02 Feb 2009 12:21:18 +0000</pubDate>
		<dc:creator>franktrindade</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[rails 2.3]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://blog.franktrindade.com/?p=199</guid>
		<description><![CDATA[In the set of new features from Rails 2.3, I was quite pleased by two of them: nested attributes and nested forms. Both allow the creation of forms containing information about more than just one model, and may solve a recurrent problem I had in past projects, which has lead to some painful headaches&#8230; Can&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p>In the set of new features from <a href="http://guides.rubyonrails.org/2_3_release_notes.html" target="_blank">Rails 2.3</a>, I was quite pleased by two of them: nested attributes and nested forms.</p>
<p>Both allow the creation of forms containing information about more than just one model, and may solve a recurrent problem I had in past projects, which has lead to some painful headaches&#8230;</p>
<p>Can&#8217;t wait to try it!</p>
<p>More information (<a href="http://guides.rubyonrails.org/2_3_release_notes.html">source</a>):</p>
<h3 id="_nested_attributes">3.1. Nested Attributes</h3>
<div class="paragraph">
<p>Active Record can now update the attributes on nested models directly, provided you tell it to do so:</p></div>
<div class="listingblock">
<div class="content"><!-- Generator: GNU source-highlight 2.9 by Lorenzo Bettini http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite --></p>
<pre><tt><span style="font-weight: bold;"><span style="color: #0000ff;">class</span></span> Book <span style="color: #990000;">&lt;</span> ActiveRecord<span style="color: #990000;">::</span>Base
  has_one <span style="color: #990000;">:</span>author
  has_many <span style="color: #990000;">:</span>pages

  accepts_nested_attributes_for <span style="color: #990000;">:</span>author<span style="color: #990000;">,</span> <span style="color: #990000;">:</span>pages
<span style="font-weight: bold;"><span style="color: #0000ff;">end

</span></span></tt></pre>
<h3 id="_nested_object_forms">5.1. Nested Object Forms</h3>
<div class="paragraph">
<p>Provided the parent model accepts nested attributes for the child objects (as discussed in the Active Record section), you can create nested forms using <tt>form_for</tt> and <tt>field_for</tt>. These forms can be nested arbitrarily deep, allowing you to edit complex object hierarchies on a single view without excessive code. For example, given this model:</div>
<div class="listingblock">
<div class="content"><!-- Generator: GNU source-highlight 2.9 by Lorenzo Bettini http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite --></p>
<pre><tt><span style="font-weight: bold;"><span style="color: #0000ff;">class</span></span> Customer <span style="color: #990000;">&lt;</span> ActiveRecord<span style="color: #990000;">::</span>Base
  has_many <span style="color: #990000;">:</span>orders

  accepts_nested_attributes_for <span style="color: #990000;">:</span>orders<span style="color: #990000;">,</span> <span style="color: #990000;">:</span>allow_destroy <span style="color: #990000;">=&gt;</span> <span style="font-weight: bold;"><span style="color: #0000ff;">true</span></span>
<span style="font-weight: bold;"><span style="color: #0000ff;">end</span></span></tt></pre>
</div>
</div>
<div class="paragraph">
<p>You can write this view in Rails 2.3:</p></div>
<div class="listingblock">
<div class="content"><!-- Generator: GNU source-highlight 2.9 by Lorenzo Bettini http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite --></p>
<pre><tt><span style="color: #ff0000;">&lt;% form_for @customer do |customer_form| %&gt;</span>
  <span style="color: #ff0000;">&lt;div&gt;</span>
    <span style="color: #ff0000;">&lt;%= customer_form.label :name, 'Customer Name:' %&gt;</span>
    <span style="color: #ff0000;">&lt;%= customer_form.text_field :name %&gt;</span>
  <span style="color: #ff0000;">&lt;/div&gt;</span>

  <span style="color: #990000;">&lt;!--</span> Here we call fields_for on the customer_form
       builder instance<span style="color: #990000;">.</span> The block is called <span style="font-weight: bold;"><span style="color: #0000ff;">for</span></span> each
       member of the orders collection<span style="color: #990000;">.</span> <span style="color: #990000;">--&gt;</span>
  <span style="color: #ff0000;">&lt;% customer_form.fields_for :orders do |order_form| %&gt;</span>
      <span style="color: #ff0000;">&lt;p&gt;</span>
        <span style="color: #ff0000;">&lt;div&gt;</span>
          <span style="color: #ff0000;">&lt;%= order_form.label :number, 'Order Number:' %&gt;</span>
          <span style="color: #ff0000;">&lt;%= order_form.text_field :number %&gt;</span>
        <span style="color: #ff0000;">&lt;/div&gt;</span>

  <span style="color: #990000;">&lt;!--</span> The allow_destroy option <span style="font-weight: bold;"><span style="color: #0000ff;">in</span></span> the model
       enables deletion of child records<span style="color: #990000;">.</span> <span style="color: #990000;">--&gt;</span>
        <span style="color: #ff0000;">&lt;% unless order_form.object.new_record? %&gt;</span>
          <span style="color: #ff0000;">&lt;div&gt;</span>
            <span style="color: #ff0000;">&lt;%= order_form.label :_delete, 'Remove:' %&gt;</span>
            <span style="color: #ff0000;">&lt;%= order_form.check_box :_delete %&gt;</span>
          <span style="color: #ff0000;">&lt;/div&gt;</span>
        <span style="color: #ff0000;">&lt;% end %&gt;</span>
      <span style="color: #ff0000;">&lt;/p&gt;</span>
    <span style="color: #ff0000;">&lt;% end %&gt;</span>
  <span style="color: #ff0000;">&lt;% end %&gt;</span>

  <span style="color: #ff0000;">&lt;%= customer_form.submit %&gt;</span>
<span style="color: #ff0000;">&lt;% end %&gt;</span></tt></pre>
</div>
</div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.franktrindade.com/2009/02/02/rails-23-new-features/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

