<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<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/"
	>

<channel>
	<title>yagni &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://en.wordpress.com/tag/yagni/</link>
	<description>Feed of posts on WordPress.com tagged "yagni"</description>
	<pubDate>Sun, 29 Nov 2009 06:02:39 +0000</pubDate>

	<generator>http://en.wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[YAGNI?]]></title>
<link>http://orastory.wordpress.com/2009/05/14/yagni/</link>
<pubDate>Thu, 14 May 2009 20:47:20 +0000</pubDate>
<dc:creator>dombrooks</dc:creator>
<guid>http://orastory.wordpress.com/2009/05/14/yagni/</guid>
<description><![CDATA[YAGNI, it&#8217;s a very common term in development teams these days. Overused even. However, in tod]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p><a href="http://en.wikipedia.org/wiki/You_Ain%27t_Gonna_Need_It">YAGNI</a>, it&#8217;s a very common term in development teams these days. Overused even.</p>
<p>However, in today&#8217;s more austere and economically challenging times, I have some new acronyms for you.</p>
<p>I&#8217;m not really up on popular acronyms so these may already exist in some form or another, but here are some more appropriate sayings that I&#8217;m saying/seeing more and more, together especially:</p>
<p>I Do Bloody Well Need It (IBLOWENI &#8211; ha ha) &#8230; but &#8230; NO-one&#8217;s Gonna Pay For It (NOGOPAFI).</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[YAGNI, You Ain't Gonna Need It]]></title>
<link>http://davy8.wordpress.com/2009/04/19/yagni-you-aint-gonna-need-it/</link>
<pubDate>Sun, 19 Apr 2009 15:35:25 +0000</pubDate>
<dc:creator>davy803</dc:creator>
<guid>http://davy8.wordpress.com/2009/04/19/yagni-you-aint-gonna-need-it/</guid>
<description><![CDATA[  I want to take a moment to talk about YAGNI.  YAGNI is somewhat of a natural extension to Release ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p> </p>
<p>I want to take a moment to talk about <a href="http://en.wikipedia.org/wiki/You_Ain't_Gonna_Need_It" target="_blank">YAGNI</a>.  YAGNI is somewhat of a natural extension to Release Early, Release Often which I discussed in my <a href="http://davy8.wordpress.com/2009/04/18/functional-design-and-the-importance-of-a-spec/" target="_self">last post</a>.  YAGNI tells you that &#8220;you ain&#8217;t gonna need it&#8221; meaning don&#8217;t over-engineer a problem and don&#8217;t add something until you know you&#8217;re going to need it.  You can find a little more discussion on it <a href="http://www.artima.com/forums/flat.jsp?forum=106&#38;thread=36529">here</a>.  It doesn&#8217;t mean that you should ignore good programming principles and just hack something together as quick as you can.  It implicitly says that you don&#8217;t try to anticipate what&#8217;s need.</p>
<p>Th principle applies to more than just coding, it also applies to actual working functionality.  Programmers (and people in general) are notoriously bad at predicting what they want or will need in the future.  Even if you do have a general idea that you&#8217;ll need it in the future, you probably don&#8217;t have a good understanding of the exact details and the kinds of problems that will come up.  It&#8217;s not a phrase that&#8217;s meant to be taken literally, but more of a something to take into consideration.  It&#8217;s easier to change something that&#8217;s simple than something that&#8217;s complex.  The key here is to be flexible to change.  For the most part you&#8217;re going to have pretty inaccurate idea of what users want.  Get something simple out there an let users tell you what they want instead of trying to do guesswork.</p>
<p>There are some notable times where YAGNI doesn&#8217;t apply, one of which is when there&#8217;s already a well known solution to a well known problem that you are just implementing (maybe in a different language, a different platform, maybe just for your own understanding).  An example is if you&#8217;re creating an <a href="http://en.wikipedia.org/wiki/RSA" target="_blank">RSA encryption</a> program, the algorithm is well known, there&#8217;s been decades of research into it and you can be pretty sure that it&#8217;s not going to change any time soon.  Most of the time this isn&#8217;t the case, and you are dealing with unknowns, and it&#8217;s best not to guess when you don&#8217;t need to.</p>
<p>As far as Chefbook goes, after I defined the <a href="http://davy8.wordpress.com/chefbook-features/">spec for version 1.0</a>, I noticed that some of the data in my database schema I wasn&#8217;t going to be using.  I had anticipated the need for them, but I don&#8217;t need them yet, so I removed them.  I took out the ImagePath of a Recipe, because I&#8217;m not going to have the ability to add a picture to recipes initially.  I also removed the RecipeReview table (and the corresponding class) entirely.  I&#8217;m not even sure anymore why I put that there in the first place, other than the fact the recipe sites online usually have reviews, and I find them useful.  But initial release is a single-user app, and reviewing your own personal recipes doesn&#8217;t seem like a highly requested feature that&#8217;s worth spending time on upfront.  It can always be added later, so away it goes.  You can see the comparison below:</p>
<div id="attachment_13" class="wp-caption aligncenter" style="width: 415px"><img class="size-full wp-image-13    " title="database-schema" src="http://davy8.wordpress.com/files/2009/04/database-schema.png" alt="database-schema" width="405" height="368" /><p class="wp-caption-text">Old Schema</p></div>
<div id="attachment_64" class="wp-caption aligncenter" style="width: 310px"><img class="size-medium wp-image-64   " title="databaseyagni" src="http://davy8.wordpress.com/files/2009/04/databaseyagni.png?w=300" alt="New Schema" width="300" height="275" /><p class="wp-caption-text">New Schema</p></div>
<p>You&#8217;ll also see that I fixed up some stuff as far as primary keys go, because a RecipeIngredient can&#8217;t exist outside of a Recipe, so RecipeId+IngredientId is the <a href="http://databases.about.com/cs/administration/g/primarykey.htm" target="_blank">Primary Key</a>.  Also to ensure that the RecipeId+CategoryId pair are unique, I did away with the artifical 3rd identifier and now recognize the pair as the primary key.  Choosing the right primary keys is important, and it&#8217;s good to get this kind of stuff out of the way early while still the the design stages because they are hard to change later.  Note that this doesn&#8217;t contradict YAGNI, because YAGNI doesn&#8217;t say be sloppy in your design.  Choosing the right keys isn&#8217;t a feature, it&#8217;s good design, and you&#8217;re always gonna need that.</p>
<p>Now there is one thing that I&#8217;m going to add where YAGNI truely doesn&#8217;t apply.  Now that I&#8217;ve already changed the database schema several times, it&#8217;s become quite obvious that I do need a way to transition data from one version of the database schema to another, and that&#8217;s not something that can be done just as easily later as it is upfront.  Even though for a working first version I don&#8217;t technically need a way to migrate data from a previous version to a newer version, not doing so could potentially leave users with the option of either not upgrading or losing their previous data, neither of which are acceptable, so having a way to upgrade from an older to a newer version with data intact is vital to the project and I will be added to the spec.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[YAGNI vs Usability]]></title>
<link>http://agilewarrior.wordpress.com/2009/04/08/yagni-vs-usability/</link>
<pubDate>Wed, 08 Apr 2009 02:34:02 +0000</pubDate>
<dc:creator>JR</dc:creator>
<guid>http://agilewarrior.wordpress.com/2009/04/08/yagni-vs-usability/</guid>
<description><![CDATA[YAGNI (You Aint Gonna Need It) is a reminder to all who write software not to over engineer your des]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p><a href="http://en.wikipedia.org/wiki/You_Ain%27t_Gonna_Need_It">YAGNI</a> (You Aint Gonna Need It) is a reminder to all who write software not to over engineer your designs, keep things simple, and add complexity only when necessary.</p>
<p>Usability, on the other hand, is about improving the users&#8217; experience with the software&#8212;additional architectural complexity be damned!</p>
<p>YAGNI vs. usability are two forces that sometimes bump on agile projects.</p>
<p>This post looks at a simple example of how these forces can conflict, and how teams can help find the right balance for their project.</p>
<p><strong>Keeping it simple</strong></p>
<p>My last project was a web based application that showed users at a construction site which roads were closed on any given day.</p>
<p>One of the stories was called <em>display road closures</em> and the first version of the story looked something like this.</p>
<p><img src="http://agilewarrior.wordpress.com/files/2009/04/yagni.png?w=223" alt="yagni" title="yagni" width="260" height="350" class="alignleft size-medium wp-image-43" /></p>
<p>With a simple date based search at the top of the screen, the user simply enters the day they are interested in seeing road closures.  They hit the search button, and the map refreshes showing which roads are closed, along with the search results at the bottom.</p>
<p><strong>Delighting your customer</strong></p>
<p>During development, my partner came up with a better way to visualize which roads were associated with which permits. Instead of simply displaying road closures in red, why not give each road closure a different color. And while we are at it, why not make the search results selectable&#8212;so that when the user clicks on a road closure at the bottom of the page, the associated road on the map becomes more bold and visible to the user?</p>
<p><img src="http://agilewarrior.wordpress.com/files/2009/04/ux.png?w=223" alt="ux" title="ux" width="260" height="350" class="alignright size-medium wp-image-44" /></p>
<p>I thought his idea was great. It required a fair bit of custom JavaScript, which would add some complexity to the UI.  When asked how long he thought it would take, he said about an hour. Thirty minutes later it was done and integrated into the code base much to the delight of our customer.</p>
<p><strong>Playing the YAGNI card</strong></p>
<p>Deciding whether or not to implement this feature was a no-brainer. My partner had the necessary JavaScript chops, the cost was minimal, and our customers loved it.</p>
<p>But what if the trade-off wasn&#8217;t quite so black and white?</p>
<p>What if we didn&#8217;t know JavaScript?<br />
What if the improvement, compelling as it was, was expensive to implement?<br />
What if making the necessary change did require some heavy architectural lifting?</p>
<p>How should teams balance the desire of keeping things architecturally simple, with a desire to delight their customers?</p>
<p><strong>See how you are tracking</strong></p>
<p>Before getting all hot and bothered about whether to invest in an enhancement, or add a new feature, check and see how your project is tracking.</p>
<p><img src="http://agilewarrior.wordpress.com/files/2009/04/burn-down.png?w=300" alt="burn-down" title="burn-down" width="400" height="274" class="aligncenter size-medium wp-image-46" /></p>
<p>If your team is struggling to deliver stripped down, spartan versions of your customer stories as is, spending additional time on UI improvements is a luxury your project can&#8217;t afford.</p>
<p>On the other hand, if the team is on track, and the customer is happy with what they are getting, there may be a little wiggle room to make a few usability enhancements here or there.</p>
<p>And if your team is delivering ahead of schedule, all options are open. Go ahead and try the 13 shades of blue.</p>
<p><strong>Know your project context</strong></p>
<p><img src="http://agilewarrior.wordpress.com/files/2009/04/tire-swing.png?w=300" alt="tire-swing" title="tire-swing" width="300" height="175" class="alignleft size-medium wp-image-47" /></p>
<p>Every project is different. And not all have the same requirements around things like usability.</p>
<p>For some projects, a few fields and a submit button are more than enough. For others, nothing less than an aspirational experience will do.</p>
<p>Knowing ahead of time what your project requires, and how your customers feel about stories being &#8216;good enough&#8217; will tell you whether you need to spend more or less on usability and the experience of the user. Putting working software into your customers&#8217; hands sooner rather than later will serve you well.</p>
<p><strong>Don&#8217;t be dogmatic</strong></p>
<p>While YAGNI is certainly a sound architectural principle, like any sound principle it can be taken too far. When YAGNI is repeatedly used as a trump card to prevent improvements to user experience, it can upset team members, and cost the team an opportunity to better serve their customers. Not all usability enhancements need to be expensive, and sometimes the smallest of changes can make the biggest of impacts.</p>
<p>Like most things in life, it comes down to striking the right balance. The only way you&#8217;ll find out is if you build something, show your customers, and get some good solid feedback along the way.</p>
<p>Until then, you&#8217;re just guessing.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Reducing Complexity]]></title>
<link>http://practicemakes.wordpress.com/2009/01/07/reducing-complexity/</link>
<pubDate>Wed, 07 Jan 2009 15:50:03 +0000</pubDate>
<dc:creator>practicemakes</dc:creator>
<guid>http://practicemakes.wordpress.com/2009/01/07/reducing-complexity/</guid>
<description><![CDATA[As programmers we tend to love and embrace complexity. Towering class trees and data-driven algorith]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p style="margin-bottom:0;">As programmers we tend to love and embrace complexity. Towering class trees and data-driven algorithms fool us into thinking we&#8217;re doing our jobs. That is, if you think programming is about writing code. I prefer to think of it as creating features. Not all features are the same, however.</p>
<p style="margin-bottom:0;">Let&#8217;s take this method:</p>
<pre>public String printCompanyName()
{
    System.out.println("Welcome to Global Dynamics!");
}</pre>
<p style="margin-bottom:0;">and compare it to this method:</p>
<pre>public String printCompanyName(String name)
{
    System.out.println("Welcome to " + name);
}</pre>
<p style="margin-bottom:0;">It&#8217;s natural to view the second method as better. It has the added feature that the company name can vary. But this feature adds complexity and all complexity costs something. To make a decision about which method to prefer, we need to know how valuable the feature we&#8217;re adding is. Unused features are worthless. In this example, if the company name never varies throughout the program, we should use the simpler method.</p>
<p style="margin-bottom:0;">This is the principle of YAGNI – You Ain&#8217;t Gonna Need It. Complexity always introduces cost so we should struggle to resist our desires to “improve” the system until we have a clear understanding of what the system should do. And even then, we should only do the minimum required to implement those features. YAGNI evolved out of the agile community as one technique for eliminating feature creep in programming. By only implementing the features needed today, programmers defer the cost of introducing complexity as long as possible. This same principle is stated in a different way in Test-Driven Development &#8212; programmers should do the simplest thing possible to get a test to pass. Complexity, when necessary, should evolve out of simplifying code, rather than complexity driving the creation of code.</p>
<p style="margin-bottom:0;">We do this because complex code has several associated costs. Firstly, it&#8217;s a lot harder to change complex code than simple code. The cruft from complex code must be maneuvered around and creates confusion over where to add new code. This directly increases the cost of adding additional features. Secondly, complex code is harder to understand, which increases the cost of training new developers and also the risk of introducing bugs. And simply writing complex code in the first place is error prone.</p>
<p style="margin-bottom:0;">There are some guidelines. If we only ever print the company name once, having a method to do so is probably wrong. Likewise, for classes, those that have only one child or that only have one method are likely introducing unnecessary complexity. Obviously these should be evaluated on a case-by-case basis, but these are pretty good rules of thumb. On the other hand creating methods and classes can reduce the overall complexity in a program by centralizing, encapsulating, and abstracting. The salient point is that these techniques should be used to reduce the overall complexity of the program. Refactoring should always be an attempt to reduce complexity by introducing structure.</p>
<p style="margin-bottom:0;">YAGNI applies even when you&#8217;re looking at old code. There&#8217;s a comparable principle of You Didn&#8217;t Need It. When we speak of refactoring we usually mean the process of extracting generalities and creating structure, but it&#8217;s just as valuable to deconstruct over-complex implementations. It&#8217;s natural to think of the effort invested in creating a rich structure as a sunk cost but it is not. These unnecessary complexes silently intrude on one&#8217;s conceptualization of the program and make it harder to create new code. Often it&#8217;s more efficient to defactor code before extending it.</p>
<p style="margin-bottom:0;">Defactoring is a term that has no clear definition associated with it. By defactoring I mean taking code and reversing the process by which it was refactored in order to return the code into less differentiated state. Defactoring is how I suggest solving the <a title="invisible design antipattern" href="http://practicemakes.wordpress.com/2008/12/16/antipatterns-invisible-design/" target="_blank">invisible design antipattern</a>. Most instances of defactoring are followed by refactoring along different lines, but YAGNI dictates that step is only taken if there&#8217;s some clear need for the extra complexity. You might also think of it as attempting to reduce complexity by reducing structure.</p>
<p style="margin-bottom:0;">While it is true that I view complexity as a necessary evil, I don&#8217;t view it as a villain to be fought at every turn. Rather, I view it much like mechanical engineers view friction. If we tried to build a program with no complexity, that program wouldn&#8217;t do anything interesting. But we must always be mindful of complexity as a force to be addressed and managed in its own right, on par with performance or defects.</p>
<p style="margin-bottom:0;">Until next time,</p>
<p style="margin-bottom:0;">Practice Makes.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Agile documentation : TAGRI]]></title>
<link>http://noostvog.wordpress.com/2008/11/24/agile-documentation-tagri/</link>
<pubDate>Mon, 24 Nov 2008 12:09:41 +0000</pubDate>
<dc:creator>noostvog</dc:creator>
<guid>http://noostvog.wordpress.com/2008/11/24/agile-documentation-tagri/</guid>
<description><![CDATA[A discussion that happens frequently on an agile development project is: “How much documentation do ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p class="MsoNormal" style="margin:0 0 10pt;"><span lang="EN-US"><span style="font-size:small;"></span></span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span lang="EN-US"><span style="font-size:small;"><span style="font-family:Calibri;"><a href="http://noostvog.files.wordpress.com/2008/11/documents.jpg"><img class="alignright size-full wp-image-40" title="documents" src="http://noostvog.wordpress.com/files/2008/11/documents.jpg" alt="documents" width="94" height="101" /></a>A discussion that happens frequently on an agile development project is: “How much documentation do we need to create?”</span></span></span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span lang="EN-US"></span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span lang="EN-US"><span style="font-size:small;"><span style="font-family:Calibri;">One of the 4 values of the agile manifesto is ‘<strong>Working software over comprehensive documentation</strong>’.<span>  </span>Does this mean we have to write no documentation at all?<span>  </span>Most definitively not!<span>  </span>It means that working software has higher value than documentation.</span></span></span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span lang="EN-US"><span style="font-size:small;"><span style="font-family:Calibri;">If we embrace that value, what level of documentation should we maintain?</span></span></span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span lang="EN-US"><span style="font-size:small;"><span style="font-family:Calibri;">When searching the net on this topic, I found an interesting essay on the website of <a href="http://www.agilemodeling.com/essays/tagri.htm">Scott Ambler</a>.<span>  </span>It is called ‘The<strong> TAGRI</strong> (They Aren&#8217;t Gonna Read It) Principle of Software Development’.</span></span></span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span lang="EN-US"><span style="font-size:small;"><span style="font-family:Calibri;">He makes the comparison with <strong>YAGNI</strong>, which says not to add functionality that might be needed in the future. Stick with what is needed to get the current feature running, because the future functionality may never be implemented due to re-prioritization or changing business demands.</span></span></span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span lang="EN-US"><span style="font-size:small;"><span style="font-family:Calibri;">The TAGRI principle says: ‘Only model/document with a purpose and create agile documentation which reflects the true needs of the audience for that documentation’.</span></span></span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span lang="EN-US"><span style="font-size:small;"><span style="font-family:Calibri;">Please read the <a href="http://www.agilemodeling.com/essays/tagri.htm">article</a> to get the detailed explanation about TAGRI.</span></span></span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span lang="EN-US"><span style="font-size:small;"><span style="font-family:Calibri;">At my current project, due to the large set of complex business rules and the expansion of our team, we needed to create more detailed documentation. </span></span></span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span lang="EN-US"><span style="font-size:small;"><span style="font-family:Calibri;">This is why we created a <strong>central definition repository</strong>, which is a structure that more or less reflects the domain model.<span>  </span>Every domain object has a small document describing its properties, relations and behaviors.<span>  </span>All reference data that is used in several domain objects, is extracted and centralize in a reference document.<span>  </span>This makes sure that an update to a single piece of information is only needed in one place.<span>  </span>We refactored to this structure a month ago and will see how this works.</span></span></span></p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Principios Básicos para un Proyecto]]></title>
<link>http://dedalodigital.wordpress.com/2008/10/24/ideas-basicas-para-un-proyecto/</link>
<pubDate>Fri, 24 Oct 2008 22:44:44 +0000</pubDate>
<dc:creator>Paco Valverde</dc:creator>
<guid>http://dedalodigital.wordpress.com/2008/10/24/ideas-basicas-para-un-proyecto/</guid>
<description><![CDATA[Uno tiende a olvidar dos conceptos o principios básicos que siempre se deben tener en cuenta durante]]></description>
<content:encoded><![CDATA[Uno tiende a olvidar dos conceptos o principios básicos que siempre se deben tener en cuenta durante]]></content:encoded>
</item>
<item>
<title><![CDATA[20 Prioritizing Strategies for Pomodoro Technique]]></title>
<link>http://blog.staffannoteberg.com/2008/07/27/20-prioritizing-strategies-for-pomodoro-technique/</link>
<pubDate>Sun, 27 Jul 2008 08:43:06 +0000</pubDate>
<dc:creator>Staffan Nöteberg</dc:creator>
<guid>http://blog.staffannoteberg.com/2008/07/27/20-prioritizing-strategies-for-pomodoro-technique/</guid>
<description><![CDATA[Francesco Cirillo, the inventor of The Pomodoro Technique, writes: &#8220;At the beginning of each d]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Francesco Cirillo, the inventor of <a href="http://blog.staffannoteberg.com/pomodoro-technique-in-5-minutes/">The Pomodoro Technique</a>, writes: &#8220;At the beginning of each day, choose the tasks you want to tackle from the Activity Inventory Sheet, prioritize them, and write them down in the To Do Today Sheet&#8221;. What considerations prioritizing of the activities is based upon, is up to the practitioner.</p>
<p>Stakeholders are the most important animal in the art of prioritizing activities. Who&#8217;s the stakeholder? What would make her happy? How can I fetch her opinion? End users are stakeholders, as well as the paying customer and the in-house product owner. And I can&#8217;t deny that I&#8217;m a stakeholder myself. I prefer activities which are challenging; that grow my mental capability. My pairing pal, my team, my project and my company are other stakeholders. And they don&#8217;t always share the preferred path to abundance. Will all these stakeholders &#8211; and some more not mentioned – put me between a rock and a hard place?</p>
<p>Every morning I pull activities from my Activity Inventory Sheet. The inventory must be short, not more than a week of work load. Stakeholders, including myself, can reorganize and change not yet pulled activities at any time. The pulling of activities, which I estimate to one day of work load, keeps me in sustainable pace.</p>
<p><b><i>MoSCoW is NOT prioritizing</i></b></p>
<p>Prioritizing activities is not the same as categorizing activities in prioritized groups. Prioritizing activities means that I have one single most important activity, and one single second most important activity, and one third most etc.</p>
<p>An example of categorizing activities in prioritized groups is the MoSCoW methodology, described by Jennifer Stapleton in her book DSDM, the method in practice: &#8220;MoSCoW is an acronym for the prioritisation that the requirements are assigned. The &#8216;o&#8217;s in MoSCoW are just there for fun. The rest of the word stands for: Must have, Should have, Could have, Want to have but will not have this time round&#8221;. </p>
<p>Personally I don&#8217;t like MoSCoW or other categorizing strategies. If a bunch of activities are in the must-bag, how can I know which one that is most important? And when I have done all in the must-bag, should the could-bag items be moved to the must-bag, or what? A straight prioritized list is much more crisp and clear.</p>
<p><b><i>Choosing Activities and ROI</i></b></p>
<p>Return of investment (ROI) is the ratio of money earned relative to the money invested. This measurement can only be known afterwards with twenty-twenty hindsight. In order to prioritize I need to second-guess the numbers. Since I don&#8217;t actually see the money I also have to translate money into something else.</p>
<p>Invested money could be translated into expected number of Pomodori needed to complete this activity. It could also be translated into how complex I think this activity is or how much knowledge I have about this problem. I&#8217;m aware of that these measurements are not interchangeable and in reality I weigh and mix different measurement methods.</p>
<p><b><i>Prioritizing Strategies</i></b></p>
<p>Below is a list of prioritizing strategies that I, in a pragmatic way, have to combine:</p>
<ul>
<li><i>Most-Valuableish</i> – If the stakeholder only got one thing from me, this one would be the most valuable.</li>
<li><i>Make-ends-meetish</i> – Some activities are the final piece of a big puzzle. If I complete this activity a whole feature is really done, and not only 90% done. The customer can start collecting the cash. </li>
<li><i>Smallish</i> – Activities that can be completed in less than a Pomodoro can be summed up and done immediately. This will get them out of sight and also give value sooner.</li>
<li><i>Just-In-Timeish</i> – Kiichiro Toyoda´s lean principle reduces waste by producing exactly the quantity that is needed. I choose the activity with the closest due date and that is most asked for today.</li>
<li><i>Pregnancyish</i> &#8211; I need to do some initial work effort just to kick off the fermentation. Then I have to wait for a predictable amount of calendar time before I can convert the dough into donuts. So I better start the initial work effort soon.</li>
<li><i>Empty-Walletish</i> – In some sense this activity is closest to go for free. I won&#8217;t disturb any other person, I don&#8217;t need to introduce any new tools, and I won&#8217;t trouble any existing production code.</li>
<li><i>As-Easy-As-Pieish</i> – This activity is located in the hood where I grew up. I know everyone and everything related to it and all its history. These kinds of activities are good candidates for navigating a pairing driver, to share my knowledge with the team.</li>
<li><i>Digging-Deeperish</i> &#8211; To minimize the number of things in process, I will consider starting brand new activities as maybe harmful. Instead I prefer working on already started ones.</li>
</ul>
<p><b><i>Prioritizing Strategy Anti Patterns</i></b></p>
<p>Then there are many, many anti pattern prioritizing strategies. Most of them are smells of dark hidden agendas:</p>
<ul>
<li><i>Virginish</i> – The activity that contains most new, rare and seldom-heard-of technology is the most exciting one, especially if this particular open source library can add a CV ornament.</li>
<li><i>Avoid-monster-In-The-Closetish</i> – It&#8217;s impossible to start with something that isn&#8217;t investigated in detail &#8211; from seed to harvest. This is actually a denial of the difference between development and manufacturing.</li>
<li><i>No-Pig-In-A-Pokeish</i> – The activity with most approximate How, When and Why is the one to start with. The rationale is that to delay this activity could prove later that I&#8217;m building waste right now. Under evil circumstances, eliminating risks is an anti-pattern that drives me into up-front-guessing instead of preferred evolutionary thinking.</li>
<li><i>Stackish</i> – Last in will go first out to the workbench. To immediately follow-up every single event that expects me to do something will make me stand without any completed result in the end of the day.</li>
<li><i>The-Early-Bird-Catches-The-Wormish</i> – First in goes first out is the same as never re-prioritizing. Always work on the eldest activity is over fair, and it will definitively not maximize the gained value to the customer.</li>
<li><i>Round-Robinish</i> – To do a little here and do a little there and fix a little here and fix a little here is demonstrating decision unawareness. No activity will be completely done, but many will be started.</li>
<li><i>I&#8217;m-No-Spring-Chickenish</i> – Choosing the activity that will impress most on my pals will probably give the application a nice bells-and-whistle user interface, but no functionality.</li>
<li><i>Am-I-My-Brother&#8217;s-Keeperish</i> – Politicians usually have a hidden agenda. Some argument comes from their mouth, but the real purpose to start an activity is to put them self in a better position for the future. Cynical, for sure.</li>
<li><i>Waterfallish</i> – First fill a big barn with appreciated activities to do. Then not only make a prioritizing schedule, carve it in a never changing rock. And finally follow this plan, even if the sky falls down.</li>
<li><i>Arousalish</i> – The activity that feels most fun to start with, is the one to start with – no mater how valuable and how expensive it appears to be.</li>
<li><i>Frameworkish</i> – Activities that does not return one single pfennig now, but are expected to make it easier to earn value in the future are only important if you are the real Oracle of Oz. And not even then, since Judy Garland fond that the truth behind the veil was a small man. Instead: think YAGNI.</li>
<li><i>Lone-Wolfish</i> – No stakeholder asked for this activity to be done. No one even understands what it is and what it will be used for. But, still a troll is sitting in his cubicle and doing this. And surprisingly a lot of people think he&#8217;s so clever, just because they don&#8217;t understand what he&#8217;s doing.</li>
</ul>
<p><b><i>Conclusion</i></b></p>
<p>Many different ideas, assumptions and agendas can control the way I&#8217;m prioritizing my activities. If I want to be decision aware, then I need to recognise the sweet scent of flowers as well as the smell of prioritizing strategy anti patterns.</p>
<p><i>Additional facts:</i></p>
<ul>
<li><i>The DSDM consortium does not seem to wanting its defined wisdoms spread unlimited as they write on their site about the project management framework Atern: &#8220;To sell Atern training, consultancy using Atern as the vehicle, or to be a tool provider for Atern, it is necessary to become a DSDM Licensed Reseller.&#8221;</i></li>
<li><i>Kiichiro Toyoda &#8211; the son of Toyoda Loom Works founder Sakichi Toyoda &#8211; resigned from the company in 1948, at the age of 54.</i></li>
<li><i>The American Heritage Dictionary of the English Language tells that a stakeholder is either &#8220;One who holds the bets in a game or contest&#8221; or &#8220;One who has a share or an interest, as in an enterprise&#8221;.</i></li>
<li><i>The Yerkes-Dodson Law says that there is an optimal level of arousal for doing maximum performance.</i></li>
</ul>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Intressant om YAGNI-designregeln]]></title>
<link>http://olofb.wordpress.com/2008/07/01/intressant-om-yagni-designregeln/</link>
<pubDate>Tue, 01 Jul 2008 08:09:02 +0000</pubDate>
<dc:creator>Olofb</dc:creator>
<guid>http://olofb.wordpress.com/2008/07/01/intressant-om-yagni-designregeln/</guid>
<description><![CDATA[Hittade en intressant bloggartikel om YAGNI-principen för design av mjukvara: You Ain&#8217;t Gonna ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p><img class="alignleft size-medium wp-image-65" src="http://olofb.wordpress.com/files/2008/07/images.jpg?w=115" alt="" width="115" height="112" />Hittade en <a href="http://fishbowl.pastiche.org/2004/03/02/defending_yagni">intressant bloggartikel</a> om YAGNI-principen för design av mjukvara: You Ain&#8217;t Gonna Need It. Det är en princip som jag tagit till mig sedan några år tillbaka och är starkt positiv till, en av mina tre &#8220;programmeringsdygder&#8221;, tillsammans med DRY (Don&#8217;t Repeat Yourself) och KISS (Keep It Simple, Stupid!). Den sista är iof. närbesläktad med YAGNI, kanhända droppar jag den ur listan en dag..</p>
<p>Taggar: <a rel="tag" href="http://bloggar.se/om/programmering">programmering</a>, <a rel="tag" href="http://bloggar.se/om/YAGNI">YAGNI</a></p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[CVDD - Curriculum Vitae Driven Design]]></title>
<link>http://uberto.wordpress.com/2008/03/31/cvdd-curriculum-vitae-driven-design/</link>
<pubDate>Mon, 31 Mar 2008 11:25:37 +0000</pubDate>
<dc:creator>Uberto Barbini</dc:creator>
<guid>http://uberto.wordpress.com/2008/03/31/cvdd-curriculum-vitae-driven-design/</guid>
<description><![CDATA[I&#8217;m in debt to Giovanni Asproni for this new acronim. But the fact behind the term is very wel]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>I&#8217;m in debt to <a href="http://www.giovanniasproni.com/">Giovanni Asproni</a> for this new acronim. But the fact behind the term is very well known here.</p>
<p>Let&#8217;s start saying that it&#8217;s a matter of fact, although a sad one, that a lot of <i>enterprise</i> projects are poor designed.</p>
<p>But, as strange it may seem, in my career I (almost) never saw a simplicistic design, they are all wrong on the over-complicated side.</p>
<p>So why is this happening? If they were all producted by morons, they ought to be equally distributed on both side of the Gaussian. Also I have anectdotical evidence that not everybody in the contractor world is a moron (honestly!).</p>
<p>So, as you may have guessed, the reason behind it is a little more complicated and it has Darwinistic-like reasons.</p>
<p>As contractors&#8217; life goes, you need to keep your resume always updated to the latest hype and keywords in order to be recruited. And simply you don&#8217;t have enought spare time to learn everything, so&#8230;<br />
a solution appears misteriously in front of you: Put whatever is the current buzzword in your next design document.</p>
<p>Add some new fancy framework or library to your current project, and learn it, test it, experiment with it at your usual tariff.  It&#8217;s brilliant and convenient!</p>
<p>I&#8217;m not sure to blame only the contractors, it&#8217;s a response to the market absurd rules. If customers were looking for developers who know how write simple and elegant code, they would get exactly that.<br />
Instead they usually hire developers with the most buzzwords complete CV. And at the end, they will obtain CVDD applications. Unnecessary complicated, with tons of once-popular frameworks, often misused, etc. etc.</p>
<p>Disclaimer: in case you&#8217;re considering to hire me, I would never do anything of this sort! <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Grow as needed + YAGNI]]></title>
<link>http://blpsilva.wordpress.com/2007/12/25/grow-as-needed-yagni/</link>
<pubDate>Tue, 25 Dec 2007 15:18:01 +0000</pubDate>
<dc:creator>blpsilva</dc:creator>
<guid>http://blpsilva.wordpress.com/2007/12/25/grow-as-needed-yagni/</guid>
<description><![CDATA[Atenção, este blog foi migrado para: http://brunopereira.org No meu tempo de experiência com Java EE]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p><strong>Atenção, este blog foi migrado para: <a href="http://brunopereira.org" target="_self">http://brunopereira.org</a></strong></p>
<p>No meu tempo de experiência com Java EE já pude aprender e constatar bastante coisa. Um fenômeno que se repete com freqüência é a escolha de servidores e componentes que contêm muito mais do que se necessita para a resolução de um problema específico.Um exemplo claro disso é em aplicações que não precisariam de absolutamente nada que o Tomcat não ofereça, mas a escolha padrão acaba sendo um servidor de aplicações &#8220;mais parrudo&#8221;, como JBoss, WebSphere ou Weblogic. O curioso é que estes últimos servidores de aplicação suportam uma quantidade bem mais ampla de especificações e oferecem bem mais recursos, mas o que eles realmente oferecem de diferencial não é o que está nas especificações, na maioria dos casos.</p>
<p>Muitas vezes o diferencial destes produtos está em funcionalidades nos quais eles excedem as especificações e oferecem facilidades que não são obrigatórias. O fato de oferecer estas funcionalidades extras é muito bom, pois isto traz mais qualidade aos clientes, e isto possivelmente melhora os processos internos do cliente. Apesar disso, é comum vermos escolhas de tecnologia serem feitas porque a opção A oferece muito mais recursos do que a opção B, sendo que na prática as opções oferecidas pela opção B serão plenamente suficientes para atender a todos os &#8220;problemas reais&#8221; que virão a surgir. Isto quer dizer que é comum a opção A ser escolhida em vez de B sem que se saiba quais recursos de A serão úteis de verdade, mas pela percepção que &#8220;A oferece mais do que B&#8221;.</p>
<p>Talvez a justificativa para este comportamento seja escolher uma opção que &#8220;possua todos os recursos que necessitaremos&#8221;. Consigo entender isso. Porém, isto traz o caso comum de usar uma bazuca para matar uma mosca. Sim, com a poluição e evolução das espécies, podemos no futuro encontrar super moscas mutantes do tamanho de um helicóptero, e neste caso espero que você esteja com sua poderosa bazuca para matar essa mosca monstruosa! <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Entretanto, para as moscas que eu costumo encontrar, um mata-moscas de plástico resolve o problema. Além disso, eu sei usar bem um mata-moscas de plástico, e foi bem mais fácil de aprender a usá-lo do que aprender a usar uma bazuca. Por oferecer bem menos e ser bem mais simples, o modo de operação do mata-moscas de plástico é algo que uma criança consegue aprender. Já para utilizar a poderosa bazuca matadora de moscas mutantes, é bom ler direitinho os manuais de utilização e se possível fazer o curso prático para fixar bem os conceitos. Afinal de contas você não quer correr o risco de se deparar com uma mosca mutante e não saber usar a bazuca né?</p>
<p>Da mesma forma que as moscas, as aplicações corporativas possuem este tipo de fenômeno. Antes de conhecer as necessidades reais da aplicação, já se definiu o uso do Weblogic com Oracle e possivelmente a configuração de um cluster de alta disponibilidade. Talvez fosse uma aplicação pequena ou média que o Tomcat + Derby ou Postgres ou Mysql pudesse dar conta sem problemas.</p>
<p>Eu venho estudando muito sobre web services nos últimos meses. Também nesta área isto ocorre bastante. Sem conhecer bem as necessidades que se quer resolver, já foi escolhida a pilha de componentes que &#8220;oferece tudo de web services&#8221;.</p>
<p>Este fenômeno é global, ocorre no mundo todo. Opiniões interessantes sobre isso foram dadas por <a href="http://www.dehora.net/journal/2007/12/24/honking-great-app-servers/" target="_blank">Bill de hÓra</a> e <a href="http://blog.interface21.com/main/2007/12/24/is-it-a-tomcat-or-the-elephant-in-the-room/" target="_blank">Rod Johnson</a>. Uma abordagem que pode ser tomada é tomar as decisões de tecnologia baseando-se nos requisitos já inicialmente definidos. Pegar os requisitos funcionais e não-funcionais iniciais da aplicação e então decidir as tecnologias a se utilizar parece uma boa escolha. Desta forma, você possivelmente fará boas escolhas sem trazer desde o começo uma complexidade e custo que possivelmente nunca seriam necessários.</p>
<p>Claro, existem casos em que realmente se utilizará extensamente os recursos avançados do Weblogic e do Oracle, e eles são de fato necessários. Da mesma forma, podem existir web services com altos requisitos de segurança e confiabilidade que te façam depender de recursos do stack WS-*. Se este for o caso, escolha mesmo as opções com mais recursos e utilize tudo que precisar para atender aos requisitos críticos que lhe forem apresentados. Porém, saiba que estes casos são a minoria dentre as aplicações corporativas existentes mundialmente.</p>
<p>Se o seu problema for algo mais comum, escolha produtos e componentes que resolvam bem os problemas apresentados, e se algum dia eles deixarem de atender às necessidades, pondere novamente as suas escolhas. Isto sugere o &#8220;Grow as needed&#8221;  do título. Cresça a sua estrutura conforme necessário, não compre inicialmente uma bazuca se ainda não existem moscas mutantes. E se os seus problemas não mostram claramente a necessidade da bazuca, aí provavelmente surge a sigla do título: YAGNI (You aren&#8217;t gonna need it)!</p>
<p>Antes de escolher as opções &#8220;mais ricas e robustas&#8221;  disponíveis, estude se opções mais simples são capazes de resolver os seus problemas, pois se isto for o caso, você provavelmente terá uma configuração mais simples e mais barata e cheia de pessoas capazes de manipulá-la. Isto é melhor do que depender vitalmente de algum fornecedor e precisar contratar o super especialista que é um dos poucos no mundo capazes de resolver seus pepinos.</p>
<p>E claro, se suas decisões puderem ser de componentes open source, você não pagará nada de licença de software e terá uma grande variedade de profissionais disponíveis para te oferecer serviços <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Patterns, Dependency Injection, and Agile Development]]></title>
<link>http://thepursuitofalife.com/2007/12/04/patterns-dependency-injection-and-agile-development/</link>
<pubDate>Tue, 04 Dec 2007 17:37:16 +0000</pubDate>
<dc:creator>Anthony Stevens</dc:creator>
<guid>http://thepursuitofalife.com/2007/12/04/patterns-dependency-injection-and-agile-development/</guid>
<description><![CDATA[Every software developer has heard about the Gang of Four and their classic Design Patterns book. It]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Every software developer has heard about the <a href="http://en.wikipedia.org/wiki/Design_Patterns">Gang of Four</a> and their classic <a href="http://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional/dp/0201633612/ref=pd_bbs_sr_1?ie=UTF8&#38;s=books&#38;qid=1196788817&#38;sr=1-1">Design Patterns</a> book.  It&#8217;s really a must read for any serious OO developer.  Awareness of (and more importantly the judicious use of) design patterns is rapidly becoming a prerequisite for writing code in the first place, like breathing or a high tolerance for caffeine.</p>
<p>However, I personally believe that over-reliance on design patterns leads to bad Agile practice.  Let me give you an example.  There&#8217;s a pattern called Dependency Injection, aka Inversion of Control, which decouples a client from the implementation of a helper class.  Martin Fowler <a href="http://martinfowler.com/articles/injection.html">covers this in mind-numbing detail here</a>, along with a related concept called a <a href="http://java.sun.com/blueprints/patterns/ServiceLocator.html">Service Locator</a>.   The main problem, from an Agile point of view? When you really get down to it, it just moves the dependencies one (or more) levels away from the class in question.  You still have to have that information <em>somewhere</em>.</p>
<p>Dependency injection is an easy concept which rapidly gets out of hand in the endless &#8220;what-if&#8221; brainstorming that happens from time to time when a few smart and excited software geeks get together.   You&#8217;ve heard it before: &#8220;Let&#8217;s just encapsulate this code in an abstract base class that inherits the ILookup interface&#8230;&#8221;</p>
<p>One should assume that this is a prima facie violation of <a href="http://en.wikipedia.org/wiki/You_Ain't_Gonna_Need_It">YAGNI</a> unless there&#8217;s a clear customer requirement that couldn&#8217;t be met in a more direct way.  Extending a bit, most of the patterns that add complexity at the expense of understanding should probably pass the YAGNI test before you jump ahead with them.</p>
<p>You may ask, &#8220;Doesn&#8217;t this lead inevitably to sloppy / spaghetti / cowboy / repetitive code?&#8221;   Remember, Agile is not about <strong>No Design</strong>, it&#8217;s about <a href="http://klimek.box4.net/blog/2007/10/20/big-design-up-front-vs-just-enough-design-initially/"><strong>Just Enough Design</strong></a>.  And testing.  And doing what the customer wants, not what you think they will need X years from now.  And iteration.  And lots of other practices, most of which tie together to help the entire concept work.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Architecture and Coding]]></title>
<link>http://quay.wordpress.com/2007/11/27/architecture-and-coding/</link>
<pubDate>Tue, 27 Nov 2007 20:49:34 +0000</pubDate>
<dc:creator>Josh DeWald</dc:creator>
<guid>http://quay.wordpress.com/2007/11/27/architecture-and-coding/</guid>
<description><![CDATA[I have the word &#8220;architect&#8221; in my title at work, which is cool cause it apparently means]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>I have the word &#8220;architect&#8221; in my title at work, which is cool cause it apparently means I know what I am doing but is bad because it means that people assume that I always know what I am doing.</p>
<p>I consider myself a pretty good software engineer, in that I can generally produce working software against the requirements given to me. I actually do not tend to be up on the latest trends in WS-* or <a href="http://quay.wordpress.com/2007/07/05/what-frameworks-do-you-use/" title="Frameworks">frameworks</a>, etc so most of my code is pretty straightforward (I hope). Thankfully others I work with (both at work and on hobby stuff) keep up with things like Hibernate, Spring, Quartz so it allows me to keep track of what people are actually using, versus what the hype is. I will shamelessly take the skeletons of how those systems are used by other co-workers and friends. However, I always try to figure out how to make using them easier if I find bits that are in any way non-intuitive.</p>
<p>I tend to write in an &#8220;agile&#8221; way. What this really means is that I think about the problem and do some drawings, pseudocode, sketches, pictures, whatever that I need to get something up and running that solves an immediate problem. Then I move on to other components. Realize that I missed a detail. Rinse. Repeat As I move onto other requirements I integrate them with my solution and always try to have a working system that does <strong>something</strong>.</p>
<p>Back to the point of my story&#8230; this is a horrible way to work if you are supposed to &#8220;architect&#8221; (in the sense of &#8220;here is the design, build it&#8221;) a system based on a set of requirements. It is very easy to draw some lines and boxes with cool names and leave the &#8220;details as an exercise for the programmer.&#8221; Bad idea. By the time it has made it to the programmer (unless they work intimately with you on your own team) many of the requirements have been lost, and they are left only with the design. So they implement, or try to implement, what has been given to them. And surprise, surprise, it meets the requirements but does not actually <strong>work</strong>.</p>
<p>This is when I realize that what I really gave was a design for a &#8220;first pass&#8221; that would really be a prototype of the system. If I were implementing, it would be easy to turn around and enhance to go to the next level. But in this case, it has already gone down through two other levels of tech lead and off-shore architect. So not very easy to say &#8220;ok, so that we aren&#8217;t quite there yet, we actually have a million other details to work out&#8221;.</p>
<p>So lesson learned there is that however long you would normally give yourself to &#8220;design&#8221; the system, multiply it by 10 so that you can basically look at every single API and external system being called, and run through every use case you can think of to see if the design <strong>does in fact meet the requirements and produce a working system</strong>. It really is not enough to see that API X has a method that looks like Y and takes parameters A and B and <strong>probably</strong> does Z. What happens if you have 1 million sets of {A,B}?</p>
<p>My real point, I suppose, is that being fairly good at designing and implementing your own systems does not make you an architect. And if you are in that position, do not let someone tell you that you only need &#8220;maybe a day or 2&#8243; to design something if it is of any real complexity (where a good way to measure complexity is how many interfaces exist between various systems). Give yourself at least a couple of days per non-trivial interface.</p>
<p>I  hate the feeling of thinking that if only I had had more time my architecture would have been perfect after the first implementation. I hate even more the feeling that it honestly probably would not have been. It is never right the first time.</p>
<p>Or maybe I just really suck as an architect.</p>
<p>In any case, I am currently getting to do the implementation on a quick-turnaround (aren&#8217;t they always in the corporate world?) implementation and <strong>I am absolutely loving it</strong>. Sure, the deadline is quickly approaching. But you know what, it is my project to succeed or fail at. I am using parts of the system that I &#8220;architected&#8221; and seeing parts where I totally did not think about the problem in low-level enough detail, and trying to fix those oversights. I am getting to play with systems that I have not worked on previously. And most importantly, I am getting to code! Maybe it is the design aspects of the coding I enjoy, but I think not. What I really, truly, absolutely, love is seeing something grow before my eyes into a working system. I love the list of &#8220;//TODO&#8221; items (and love even more removing them as they get done) and bits of stub code. I love when I get surprised that it works even better than I expected. I love making a database query 10,20,30 times faster through simple application of a decent index. I love keeping 10 things in my head as I move from file to file and implement my ever-growing APIs.</p>
<p>I have no doubt that my methods would scare many of the purists out there. At heart, I am a &#8220;just-in-time&#8221; developer. For my emulator, I did not implement an instruction until I ran into my &#8220;not yet implemented!&#8221; exception. Same goes often for other things that I implement. It is a bit of an extreme example of YAGNE, I suppose.</p>
<p><strong>Update (11/30/2007)</strong>: Added some words I have left out.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[YAGNI, a Bit of Agile Humor...]]></title>
<link>http://blog.davidohara.net/2006/06/20/yagni-a-bit-of-agile-humor/</link>
<pubDate>Tue, 20 Jun 2006 12:56:34 +0000</pubDate>
<dc:creator>David O'Hara</dc:creator>
<guid>http://blog.davidohara.net/2006/06/20/yagni-a-bit-of-agile-humor/</guid>
<description><![CDATA[Ran across this post and had to preserve it for later reference. I wonder if I could get a T-Shirt m]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Ran across <a href="http://bunkandrambling.com/blog/articles/2006/05/24/ide-feature-request-the-yagni-development-assistant" title="YAGNI, the new Paperclip">this post</a> and had to preserve it for later reference. I wonder if I could get a T-Shirt made&#8230;<br />
(Nod to <a href="http://codebetter.com/blogs/scott.bellware/archive/2006/05/26/145514.aspx" title="Scott Belware">Scott Belware</a> for the link)&#160;</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[pants]]></title>
<link>http://silkandspinach.net/2004/08/18/pants/</link>
<pubDate>Wed, 18 Aug 2004 21:24:24 +0000</pubDate>
<dc:creator>Kevin Rutherford</dc:creator>
<guid>http://silkandspinach.net/2004/08/18/pants/</guid>
<description><![CDATA[Donna and I have very different approaches to hanging out the washing. I like to take each piece of ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Donna and I have very different approaches to hanging out the washing.  I like to take each piece of clothing individually and make sure it&#8217;s straightened, right-side-out and hung so as to minimise ironing etc.  Donna likes to get the job over with as quickly as possible, and leaves the straightening and right-siding until the moment before wear.</p>
<p>We&#8217;re both right, of course, and we can both defend our approach as &#8216;agile&#8217;:  Donna &#8220;decides as late as possible&#8221;, whereas I &#8220;refactor&#8221; as I go.  We can each also see the problems inherent in the other&#8217;s approach:  I waste time folding just-washed underwear, and Donna wastes time later unravelling it in order to get into it.</p>
<p>We&#8217;ve each been doing it that way for years.  Probably neither of us will ever change, and there&#8217;s probably no reason to.  These are simply old habits, and they do no harm.  But hanging out the washing tonight made me think again about trying to persuade a HeriocProgrammer or a WaterfallManager to TestFirst or IntegrateOften&#8230;</p>
</div>]]></content:encoded>
</item>

</channel>
</rss>
