<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3135147504759270815</id><updated>2011-07-29T01:12:54.690-07:00</updated><title type='text'>Arrizza</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://arrizza.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://arrizza.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>JohnA</name><uri>http://www.blogger.com/profile/11085021851534428823</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3135147504759270815.post-2582814086263233317</id><published>2011-05-09T01:07:00.000-07:00</published><updated>2011-05-09T01:08:15.159-07:00</updated><title type='text'>Adopting XP/Agile</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: arial; font-size: small; "&gt;&lt;div&gt;Can I recommend an approach to you? Use the XP practices as solutions for problems you are already having. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For example, someone checks in some code that causes the build to break =&amp;gt; install Hudson &lt;a href="http://hudson-ci.org/"&gt;http://hudson-ci.org/&lt;/a&gt; and add everyone on your team in the email list. Too heavy handed? Install Hudson anyway and just send the emails to yourself, then notify the person who broke the build (face-to-face, nicely).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now the marketing: call it the "broken build early warning system" or something similar; use your current team's vocabulary or draw from your project's domain. The idea is you advertise the XP principle's benefit without necessarily mentioning XP or Agile or even a process change at all --  this takes the my-process-is-better-than-your-process argument out of the discussion. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Just added code which caused a regression error =&amp;gt; see if you can add an automated test or xTest unit test that would catch it. Then show it off as almost-zero impact ("literally took me 2 minutes to write that test") with high impact ("never see that bug again!") activity.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Found it too hard to predict 6 months into the future =&amp;gt; break it down into two week chunks. Call them "mini-milestones" or something similar from the PM's vocabulary.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;etc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Your adoption of the practices will be naturally guided by the failure modes your team is experiencing. These failure modes exist in your specific team because of specific underlying weaknesses in the team dynamics, team members, development environment, management, etc. As you address them one by one, it's easier to deal with the new ones that crop up. Fixing them in one large changeset is difficult and will commonly fail (see "Leading Change" by Kotter).&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;Note James Grenning mentions a similar approach in his reply. Perhaps this is similar to his -- with a slight twist?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;The top benefits of this approach are :&lt;/div&gt;&lt;blockquote class="webkit-indent-blockquote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 40px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;You are helping to fix concrete, real, live problems your team is immediately facing. It gives a large amount of credibility to the practice. It isn't just "fluff" or some "guru" or some "fad" or you "just padding your resume", the XP practice is a real solution to a real problem. The adoption is not "too hard" or "too much work" simply because it needs to be done.  It is very hard for someone to argue against adopting it because it solves a big problem kicking your team in the head. &lt;/li&gt;&lt;li&gt;You only introduce the Agile practices that your team really needs. This addresses the "if it ain't broke, don't fix it" argument. And again it adds credibility to the practices you adopt. There is no "extra baggage" or "fluff", everything you do is direct and concentrated on problems your team is actually facing. BTW all of the objections like "fluff", "fad", "too hard", "extra baggage", etc were actual arguments used from time to time on projects I've worked on.&lt;/li&gt;&lt;li&gt;Fixing one problem will expose or highlight the next problem in turn. The benefit here is that later, in retrospect, the adoption of the practices will seem natural and unforced. This addresses some individuals balking at authoritarian approaches. Also there is credibility added yet again. Changes were done not for the "fun of it" or because "some book said to", you added them only when those practices were absolutely necessary. The post-fact review of XP adoption is much easier to describe and justify.&lt;/li&gt;&lt;li&gt;The practices are introduced one at a time. This gives time for the team to adjust -- and there is always an adjustment that happens. Changing a software development process requires a "complex system" perspective on your part. In any complex system, changing one part of that system will have an impact on another part and that impact is generally unpredictable in magnitude and unpredictable in location. Read Gerald Weinberg and you'll see this is a common thread in many of his books (check the bibliography, Beck lists Weinberg). Also pick up "The Logic of Failure" by Dorner and again you'll see this theme is in his book as well. You need to give your team time, and yourself time too, to figure out what the full set of effects the change you just made will have on your project. &lt;/li&gt;&lt;li&gt;It gives time for the team to intellectually absorb the impact of the change. This will take longer than you think it will and in some individuals the reverberations of a change may take years to quieten. Also the changes are evolutionary rather than revolutionary. This addresses the tendency for some folks to dig in their heels whenever a large change is introduced.&lt;/li&gt;&lt;li&gt;The practices are introduced in priority order (roughly speaking of course). The more common process problems you face will occur more often and so you will get to address those by the first XP principles you introduce. This gets you big, visible benefits early which makes it easier to introduce other more subtle principles later (again see "Leading Change").&lt;/li&gt;&lt;li&gt;It prevents "process wars" from starting up. Changing the development process should be rooted in reality, not from a staunch dogma that X is better than Y. And it should be rooted in *your* team's reality not some hypothetical "average team" working on an equally hypothetical "average project".&lt;/li&gt;&lt;/ul&gt;The cons here are:&lt;div&gt;&lt;ul&gt;&lt;li&gt;You will not get the full benefits of the entire XP development process. There is synergy among the practices and skipping a practice means you lose out.&lt;/li&gt;&lt;li&gt;It may take a very long time to get all of XP in place, if ever. On the other hand, your team may have a natural immunity to some problems that a given principle addresses. &lt;/li&gt;&lt;li&gt;You can't claim you are doing XP, you can only claim you are "just using some Agile principles". This causes some individuals some anxiety. They want a name for the development process. Also you won't be able to call it XP because if you do you will incite the "we aren't doing XP because we aren't doing principle ABC so why do XP at all?" argument.&lt;/li&gt;&lt;li&gt;There can be a backlash at some point in time. Some folks do not like the "stealth" approach; it seems "sneaky". And even though you have actually fixed real problems in your development process, just the accusation of "sneakiness" itself will be damaging. So simply don't claim you are doing XP, you are just using some Agile principles that seem to work really well in your shop. Imagine that, who knew?!&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3135147504759270815-2582814086263233317?l=arrizza.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arrizza.blogspot.com/feeds/2582814086263233317/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://arrizza.blogspot.com/2011/05/adopting-xpagile.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/2582814086263233317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/2582814086263233317'/><link rel='alternate' type='text/html' href='http://arrizza.blogspot.com/2011/05/adopting-xpagile.html' title='Adopting XP/Agile'/><author><name>JohnA</name><uri>http://www.blogger.com/profile/11085021851534428823</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3135147504759270815.post-96146864446460207</id><published>2010-02-22T21:27:00.000-08:00</published><updated>2010-02-22T21:35:20.423-08:00</updated><title type='text'>Refactoring Legacy Code</title><content type='html'>&lt;div&gt;Check out:  &lt;a href="http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052"&gt;http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052&lt;/a&gt;. The Feathers book is very good. Here are some additional strategies to consider.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You will use two basic refactorings: Extract Method and Extract Class. You will use Extract Method most of the time, but that's just a stepping stone to the real big-bang-for-buck workhorse, Extract Class. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The basic thing to realize is that a very large class is a set of smaller classes intertwined together. And that a class is a cohesive set of methods that associate strongly with each other and associate (very) strongly with a small set of variables. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1) The primary strategy to use is:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;a) isolate one member variable of the large class and extract it into a private class as a public variable&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;old:  private int mVar;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;div&gt;new: &lt;/div&gt;&lt;div&gt;   private class SomeThingClass&lt;/div&gt;&lt;div&gt;    {&lt;/div&gt;&lt;div&gt;    public int mVar;&lt;/div&gt;&lt;div&gt;    }&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;b) instantiate the new class in the large class &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;      &lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;SomeThingClass mNewClass = new SomeThingClass();&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;c) search for all lines in the class that use or modify that member variable and replace them with calls into the new private class:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;      &lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;old:    mVar++;&lt;/div&gt;&lt;div&gt;      new:   mNewClass.mVar++;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;d) start extracting lines of code that use or modify that member variable into the new private class:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;      &lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;old : mVar++;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;      new:  mNewClass.Bump();&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;      and in SomeThingClass:&lt;/div&gt;&lt;div&gt;      void Bump()&lt;/div&gt;&lt;div&gt;    {&lt;/div&gt;&lt;div&gt;    mVar++;&lt;/div&gt;&lt;div&gt;    }&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;e) after a few extractions, you will probably need to rename the class since it's purpose should become clearer as you extract more lines.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;f) check for member variables in the Large Class that are not standalone but are attributes of other member variables (for an analogy think "Third Normal Form"). Eg.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;     &lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;string[] mAppleTypes;          // holds data&lt;/div&gt;&lt;div&gt;     int mNumberOfAppleTypes;  // it's an attribute of mAppleTypes&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;These two variables should be extracted out together.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2) You probably don't have unit tests in place. So add some -- any -- testing, whatever you can manage, it doesn't have to be pretty. They must be automated but they don't have to test at the unit level.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3) No unit tests mean high risk. So minimize the risk by looking for ways to simplify the large class by doing very small, very simple extractions. Typically look for 2 - 5 lines of code you can extract out into a void-void method:&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;...&lt;/div&gt;&lt;div&gt;     stmt1;&lt;/div&gt;&lt;div&gt;     stmt2;&lt;/div&gt;&lt;div&gt;     stmt3;&lt;/div&gt;&lt;div&gt;     ...&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;replaced by:&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;     &lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;...&lt;/div&gt;&lt;div&gt;     SomeGoodFunctionName();&lt;/div&gt;&lt;div&gt;     ...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;     private void SomeGoodFunctionName()&lt;/div&gt;&lt;div&gt;   {&lt;/div&gt;&lt;div&gt;   stmt1;&lt;/div&gt;&lt;div&gt;   stmt2;&lt;/div&gt;&lt;div&gt;   stmt3;&lt;/div&gt;&lt;div&gt;   }&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;The key is to find statements that are tightly coupled for some reason, e.g. they all act on a single member variable, they perform a very simple, but atomic (can't be reduced any further) kind of action, etc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;By the way, most programmers consciously or sub-consciously use the "white space" around statements to set them off (and some even put a comment or two above them). This is a coarse way to look for void-void sets of statements, but believe it or not, does work well since you are piggybacking on top of previous developer's understanding of "cohesion".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Once you have a whole set of these smaller functions, look for commonality amongst them. If two or more functions all act on a single member variable or they all modify/use a small number of member variables, extract them out into their own class.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4) Look for methods in the Large Class that repeat the same formal variables in their signatures. Extract these out into their own class. The methods of the new class are the old methods without the formal variables, the member variables are the old formal variables.  E.g.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;old:&lt;/div&gt;&lt;div&gt;    &lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;void fnA(int val1, int val2, int val3);&lt;/div&gt;&lt;div&gt;    void fnB(int val1, int val2, int val3);&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;new:&lt;/div&gt;&lt;div&gt;     &lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;private class SomeNewClass&lt;/div&gt;&lt;div&gt;   {&lt;/div&gt;&lt;div&gt;   private int val1;&lt;/div&gt;&lt;div&gt;   private int val2;&lt;/div&gt;&lt;div&gt;   private int val3;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;   public SomeNewClass(int v1, int v2, int v3)&lt;/div&gt;&lt;div&gt;       {&lt;/div&gt;&lt;div&gt;       val1 = v1;&lt;/div&gt;&lt;div&gt;       val2 = v2;&lt;/div&gt;&lt;div&gt;       val3 = v3;&lt;/div&gt;&lt;div&gt;       }&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;   public void fnA()  { ... }&lt;/div&gt;&lt;div&gt;   public void fnB()  { ... }&lt;/div&gt;&lt;div&gt;   }&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Why? because formal variables are tightly coupled to the method that uses them. If several methods use the same formal variables, then those methods are most likely tightly coupled to each other (i.e. they form a class). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;5) Repeat 1 - 4 as often as you can. My experience has been that the original Large Class pretty much disappears leaving only a vestige of itself (just like the Chesire Cat).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;6) As the primary purpose of the extracted classes becomes clearer, start adding Unit Tests for them that reinforces the intent of the new class. That actually helps clarify their purpose much further and may lead to a splitting of that class again (this is a good thing!).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;7) Checkpoint the source files often. You will probably have to backtrack when you go down the wrong rabbit hole and so you'll need a quick way of going back to a known good point. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Not glamorous work, but does pay off. I had one chunk of code that started off as 60,000 lines of VB and C++ code, boiled it down to 12,000 over several months. Lot of duplicate code disappeared, a lot of dead code was deleted, and my personal favorite, useless code was deleted. Useless code is code that is executed, but never actually changes the state of the system (yes it can change variables but those variables aren't significant to the system's purpose, so they can be deleted along with all the code that acted on them).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3135147504759270815-96146864446460207?l=arrizza.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arrizza.blogspot.com/feeds/96146864446460207/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://arrizza.blogspot.com/2010/02/refactoring-legacy-code.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/96146864446460207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/96146864446460207'/><link rel='alternate' type='text/html' href='http://arrizza.blogspot.com/2010/02/refactoring-legacy-code.html' title='Refactoring Legacy Code'/><author><name>JohnA</name><uri>http://www.blogger.com/profile/11085021851534428823</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3135147504759270815.post-3054574543407000142</id><published>2009-03-17T23:51:00.000-07:00</published><updated>2009-03-17T23:53:31.133-07:00</updated><title type='text'>Refactoring tools, an analogy</title><content type='html'>Refactoring has nothing to do with tools (although they help speed things up). And refactoring has little to do with renaming variables (although that is one technique used).&lt;br /&gt;&lt;br /&gt;Take a polynomial x**2 -1 and it factors out to (x-1)(x+1). Clearly you can evaluate x**2-1, just as easily as you can evaluate (x-1)(x+1). But from one perspective, "(x-1)" is an easier component to deal with and therefore "(x-1)(x+1)" is a "better design" because it communicates the intent of the polynomial better to humans.&lt;br /&gt;&lt;br /&gt;If I had a tool that could automatically factor x**2-1 into it's constituent parts, that'd be great but it may not do it in the way that best communicates what the polynomial is trying to do. The audience for the factorization is the next mathematician who is going to be looking at my solution. So I want to help him/her out by formatting the polynomial to show my understanding of how it works.&lt;br /&gt;&lt;br /&gt;If I renamed 'x' to 'y', that doesn't really help them. But if I renamed it to "nuclear_core_temperature", perhaps it &lt;span style="font-weight: bold; font-style: italic;"&gt;would &lt;/span&gt;help them out, so I go ahead and rename it.&lt;br /&gt;&lt;br /&gt;Refactoring is just like that, but for software.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3135147504759270815-3054574543407000142?l=arrizza.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arrizza.blogspot.com/feeds/3054574543407000142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://arrizza.blogspot.com/2009/03/refactoring-tools-analogy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/3054574543407000142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/3054574543407000142'/><link rel='alternate' type='text/html' href='http://arrizza.blogspot.com/2009/03/refactoring-tools-analogy.html' title='Refactoring tools, an analogy'/><author><name>JohnA</name><uri>http://www.blogger.com/profile/11085021851534428823</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3135147504759270815.post-4363014145073344784</id><published>2009-03-17T23:34:00.000-07:00</published><updated>2009-03-18T00:02:17.549-07:00</updated><title type='text'>Refactoring, OO and tools</title><content type='html'>The refactoring yahoo group recently had a series of posts regarding OO and tools.&lt;br /&gt;&lt;br /&gt;As originally defined, refactoring is not an isolated activity. It fits into an overall development sequence to allow good, fast and flexible solutions, followed by a slow, deliberate, reasoned task to clean up the design and implementation. More specifically:&lt;br /&gt;&lt;br /&gt;1) get a tiny bit of your task implemented any way you can, writing the tests first.&lt;br /&gt;2) refactor the bit of code you just wrote, paying a lot of attention to the current design and to the potential design your code could or should fit in to. Use the tests to confirm you haven't broken anything along the way.&lt;br /&gt;&lt;br /&gt;#1 is the good, fast and flexible solution. Get it to work, get some proof it's working via the tests. Don't worry about the design at this point.&lt;br /&gt;&lt;br /&gt;#2 is the post-fact, deliberate, reasoned approach to clean up the "mini-mess" you just made. This is where the design emerges (yes, "emergent design" is a by-product of refactoring).&lt;br /&gt;&lt;br /&gt;Why do it in this order? Because #1 gets work done fast, very fast and #2 gets code that is clean, very clean. If you do #1 without #2, you get slop. If you do #2 without #1, after a period of time you bog down in a lousy code and you can't do #1 very quickly at all.&lt;br /&gt;&lt;br /&gt;OO is a very nice way to structure code, to clearly specify a design "in the small". So refactoring with OO programming/design is a natural fit, but OO is not a prerequisite for refactoring. You can refactor procedural languages, OO languages, assembler, whatever. Each language has it's own set of idioms that are supported via it's syntax and/or supported via de facto idioms (read "patterns") accumulated over time. You refactor your quick and dirty code to these idioms, patterns and design so that it communicates your intent to the next developer.&lt;br /&gt;&lt;br /&gt;And it should be clear now that refactoring tools are not necessary viewed from this perspective. They help you do the cleanup quicker, that's all. Design and architecture is and will most likely remain a very human exercise simply because it is for humans.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3135147504759270815-4363014145073344784?l=arrizza.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arrizza.blogspot.com/feeds/4363014145073344784/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://arrizza.blogspot.com/2009/03/refactoring-oo-and-tools.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/4363014145073344784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/4363014145073344784'/><link rel='alternate' type='text/html' href='http://arrizza.blogspot.com/2009/03/refactoring-oo-and-tools.html' title='Refactoring, OO and tools'/><author><name>JohnA</name><uri>http://www.blogger.com/profile/11085021851534428823</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3135147504759270815.post-6972780746703851279</id><published>2009-01-26T21:01:00.000-08:00</published><updated>2009-01-26T21:04:01.396-08:00</updated><title type='text'>Moved my weblog here...</title><content type='html'>I had started my weblog at http://www.arrizza.com/cgi-bin/pub?WebLog. Moved all the posts to here. The dates on the previous pages are when I originally posted.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3135147504759270815-6972780746703851279?l=arrizza.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arrizza.blogspot.com/feeds/6972780746703851279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://arrizza.blogspot.com/2009/01/moved-my-weblog-to-here.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/6972780746703851279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/6972780746703851279'/><link rel='alternate' type='text/html' href='http://arrizza.blogspot.com/2009/01/moved-my-weblog-to-here.html' title='Moved my weblog here...'/><author><name>JohnA</name><uri>http://www.blogger.com/profile/11085021851534428823</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3135147504759270815.post-9218441166624352260</id><published>2009-01-26T20:58:00.001-08:00</published><updated>2009-01-26T20:58:27.074-08:00</updated><title type='text'>Using the XP Planning Game in a non-XP site</title><content type='html'>-- Jan 20, 2009 Using the XP Planning Game in a non-XP site&lt;br /&gt;&lt;br /&gt;The Planning Game is probably one of the best parts of XP and it is loved by the Customers. They very much like the ability to control the project on an on-going basis and the visibility it gives them into the software development cycle. It clarifies the delineation between the business folks and the development folks and who makes what decisions.&lt;br /&gt;&lt;br /&gt;To use it in a non-XP development environment, do the following:&lt;br /&gt;&lt;br /&gt;&lt;ol compact="compact" type="1"&gt;&lt;li&gt; Call them anything but "Stories". Call them Features, Enhancements, Change Requests, Thingies, or whatever.  &lt;/li&gt;&lt;li&gt; Call it anything but "Planning Game". Call it Kick off, Pre-development Review, Feature Review, or whatever. &lt;/li&gt;&lt;li&gt; Do the entire project at once. Have all the Stories... err... Features laid out at the beginning of the project. This is no small task, you will probably have to help the Customers do it. &lt;/li&gt;&lt;li&gt; Calculate the Capacity (aka "Velocity") for the entire project in "man-weeks". &lt;/li&gt;&lt;li&gt; Use Excel, not index cards. Dunno why, just makes them more comfortable. One row per Feature. &lt;/li&gt;&lt;li&gt; Get the Customer to assign a priority number 1-10 to each Feature as a column in the spreadsheet. &lt;/li&gt;&lt;li&gt; Add a ballpark "work effort" for each Feature in "man-weeks". &lt;/li&gt;&lt;li&gt; If any Feature is greater than two weeks (your secret Iteration length), break it into multiple "phases" and rename them to Feature-Phase1, Feature-Phase2, etc. Explain it as an "internal thing for the development team". &lt;/li&gt;&lt;li&gt; Calculate the sum of all the Features. Mark the total in red, if it's over the Capacity, or green if under or equal. &lt;/li&gt;&lt;li&gt; Do the "Verify the Feature" step offline away from the Customers. For any questions, call a meeting. &lt;/li&gt;&lt;li&gt; Do the Feature to Task breakdown offline. Re-calculate the cost of the total project. Call a meeting if there's a significant discrepancy. &lt;/li&gt;&lt;li&gt; Add columns to calculate the status done/not done, the remaining Capacity in man-weeks, and the Features remaining all in man-weeks. &lt;/li&gt;&lt;li&gt; Meet every two weeks to "review the remainder of the project". Change any work-effort estimates. Negotiate any scope changes based on the fact that the remaining Capacity is less than the Features remaining total. &lt;/li&gt;&lt;li&gt; Make sure you do an "Engineering Build" every two weeks. Offer to show the Customers the completed Features at that time.  &lt;/li&gt;&lt;li&gt; Make sure you have a Test Site or Test Station ready for them to play with the last Engineering Build at all times. &lt;/li&gt;&lt;li&gt; Make sure you do the Tasks and Features in priority order! &lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3135147504759270815-9218441166624352260?l=arrizza.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arrizza.blogspot.com/feeds/9218441166624352260/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://arrizza.blogspot.com/2009/01/using-xp-planning-game-in-non-xp-site.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/9218441166624352260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/9218441166624352260'/><link rel='alternate' type='text/html' href='http://arrizza.blogspot.com/2009/01/using-xp-planning-game-in-non-xp-site.html' title='Using the XP Planning Game in a non-XP site'/><author><name>JohnA</name><uri>http://www.blogger.com/profile/11085021851534428823</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3135147504759270815.post-2527747892736679576</id><published>2009-01-26T20:57:00.004-08:00</published><updated>2009-01-26T20:58:05.574-08:00</updated><title type='text'>The XP Planning Game</title><content type='html'>-- Jan 18, 2009 The XP Planning Game&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Customers start with a set of Stories already written up.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Customers will initially need help writing up the Stories. Once they've gone through several iterations and are comfortable with the process, they usually "get it" and can do this work on their own.&lt;br /&gt;&lt;br /&gt;Any partially done Stories from previous iterations are also brought into the set of Story cards.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Developers announce their Velocity from the previous iteration&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The Velocity sets how much capacity the current iteration has. Using the previous iteration's Velocity for this iteration is a simple scheme to accommodate changes in how fast the team is completing Stories. Note that a previous iteration's Story count is added only if the Story was completed -- no partials allowed.&lt;br /&gt;&lt;br /&gt;&lt;b&gt; Customers read the Stories out loud one by one&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Having the Customers read the Stories aloud gets the ball going and seems to have the psychological effect of making their request more real. The tone and speed with which they read seems to impart the urgency, importance, or not to the Story.&lt;br /&gt;&lt;br /&gt;Customers usually ad lib something during the reading, filling in the gaps present in the raw sentences on the index card. Sometimes the ad lib verbiage, again, gives a tone of urgency or importance to the Story.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Developers ask questions to clarify what the Story means.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The Story is meant to impart a deeper understanding of what is intended by the Customer. Now is not the time to be shy. On some teams it makes sense to have the Coach act as a facilitator to make sure questions are asked and that everyone on the team is participating. It is important that Developers have their skin in the Story.&lt;br /&gt;&lt;br /&gt;If any new information is found, notes are made on the Story card. This serves as a mnemonic during the Iteration to help guide the development.&lt;br /&gt;&lt;br /&gt;Sometimes just the telling of a Story will suggest a new Story to the Customer. It should be written up immediately. Do not wait till after the Planning Game, it will be forgotten.&lt;br /&gt;&lt;br /&gt;&lt;b&gt; Verify the Story&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Have the Development team have a discussion around the potential development - 1 to 3 minutes tops. It will feel like a whiteboard session without the whiteboard. Usually any significant questions will pop out of this discussion.&lt;br /&gt;&lt;br /&gt;Does the Story fit into the iteration? If not, split it into two or more Stories.&lt;br /&gt;&lt;br /&gt;Is the Story testable? Have a quick discussion as to how the Story would be tested in the Acceptance Tests. &lt;br /&gt;&lt;br /&gt;If the Development team is unsure of whether or not it can be done, a Spike is announced. &lt;br /&gt;&lt;br /&gt;An estimate for the Story is given by the Development team. This is a fairly accurate estimate by this time because of the discussions and questions raised so far.&lt;br /&gt;&lt;br /&gt;Have someone keep track of the total Story Estimates so far. If it goes over the Iteration length, stop.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Customers choose the Stories they want to do for the iteration based on the Story estimates and Velocity.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Developers can take a break at this point if they want. The Coach should not. Sometimes during these discussions, the Customer will again indicate why a Story has a particular priority.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Developers go through the Stories one by one&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The Developers now have a set of Stories that the Customers want done next. Customers can take a break at this point if they want.&lt;br /&gt;&lt;br /&gt;The Developers break down the Story into Tasks. This usually only takes a few minutes.&lt;br /&gt;&lt;br /&gt;The Tasks are estimated. Keep the estimates fairly coarse, around a 1/2 or 1/4 day minimum. &lt;br /&gt;&lt;br /&gt;Re-evaluate the Story estimate based on the sum of the Task estimates. If the total Tasks take significantly more or less than the original Story value, set that Story aside so it can be brought up to the Customer.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Customers and Developers re-convene&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Any substantial changes to Estimates are reported to the Customers. This gives the Customers a chance to swap out a Story if it's cost has become greater than it's value.&lt;br /&gt;&lt;br /&gt;Stories for the current Iteration are laid out and the Customers arrange the Stories in priority order. The Priority is marked on each Story index card.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The planning game is over.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The developers begin work on the Tasks based on Story priority. Tasks are done such that priority is given to completing a Story (versus just completing a task).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3135147504759270815-2527747892736679576?l=arrizza.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arrizza.blogspot.com/feeds/2527747892736679576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://arrizza.blogspot.com/2009/01/xp-planning-game.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/2527747892736679576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/2527747892736679576'/><link rel='alternate' type='text/html' href='http://arrizza.blogspot.com/2009/01/xp-planning-game.html' title='The XP Planning Game'/><author><name>JohnA</name><uri>http://www.blogger.com/profile/11085021851534428823</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3135147504759270815.post-3528515200829841838</id><published>2009-01-26T20:57:00.003-08:00</published><updated>2009-01-26T20:57:42.178-08:00</updated><title type='text'>The End of the Middlegame, reprise...</title><content type='html'>-- Jan 17, 2009 The End of the Middlegame, reprise...&lt;br /&gt;&lt;br /&gt;I want to reiterate why I'm wading through all the pixie dust. A software development process or methodology exists to deliver something to your customers. So start there and work backwards. Nearly all of the practices you need will fall out of that analysis.&lt;br /&gt;&lt;br /&gt;I say "nearly all" of the practices, because there are going to be practices that you do just to keep yourself sane. One of the things about non-trivial software development is that it quickly becomes chaotic and extraordinarily complex in the face of extraordinary pressures to generate perfect code. To keep that all under control, you need some confidence that certain activities are being done at the right time and in the right way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3135147504759270815-3528515200829841838?l=arrizza.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arrizza.blogspot.com/feeds/3528515200829841838/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://arrizza.blogspot.com/2009/01/end-of-middlegame-reprise.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/3528515200829841838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/3528515200829841838'/><link rel='alternate' type='text/html' href='http://arrizza.blogspot.com/2009/01/end-of-middlegame-reprise.html' title='The End of the Middlegame, reprise...'/><author><name>JohnA</name><uri>http://www.blogger.com/profile/11085021851534428823</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3135147504759270815.post-4919301825759406100</id><published>2009-01-26T20:57:00.001-08:00</published><updated>2009-01-26T20:57:27.291-08:00</updated><title type='text'>The End of the Middlegame</title><content type='html'>-- Jan 17, 2009 The End of the Middlegame&lt;br /&gt;&lt;br /&gt;Un-sprinkle some more of that pixie dust.&lt;br /&gt;&lt;br /&gt;We are now back to a point we are gathering up the deliverables ready for the final release, so we can create the DVD's from them.&lt;br /&gt;&lt;br /&gt;Usually you've got to now compile the code. You may be delivering an interpreted language, i.e. the source itself, but that is only slightly simpler.&lt;br /&gt;&lt;br /&gt;Let's start again. You've got to compile the code. But what code? You need a way to clearly identify the source code you want to compile. Is it a particular branch in your source control tree? Is it a label or tag in your source control? Is it another kind of identifier in your source control (e.g. Perforce changelist, Subversion revision number, etc.)? You &lt;i&gt;are&lt;/i&gt; using source control... right?&lt;br /&gt;&lt;br /&gt;You've identified the right code to compile. Now you perform the compilation. But you know that the compiler, and the environment on the computer doing the compilation is crucial. So you've carefully placed controls around the toolset and around the computer. You may have even assigned a specialized configuration management team to ensure it is a stable, well-controlled configuration.&lt;br /&gt;&lt;br /&gt;You've identified the right code and the right toolset. Now you perform the compilation, using one or more commands to invoke the build. For any sizable project, this generally will be make, nmake, omake, rake, etc., or Ant, scons, or any of the other alternative build systems. Even MSDEV can be invoked from the command line.&lt;br /&gt;&lt;br /&gt;The nagging thing about everything so far is that it is &lt;i&gt;manual&lt;/i&gt;. Someone has to know a bunch of things. Someone has to be sure to type it all in correctly. But I will stick to my premise: when something is not exciting, people make errors and when something is too exciting, people make errors. The range of tasks that people can repeatedly do well without making errors is very small. So my solution again is automation.&lt;br /&gt;&lt;br /&gt;A continuous build system (CBS) that correctly identifies the source version to compile, that has a known and stable configuration and that will invoke the correct commands repeatedly without fail, without error is best. The "Continuous" part of CBS is important, because, again practice makes predictable. The automation ensures there is no deviation from the build process and so as long as it's not garbage in, you won't get garbage out.&lt;br /&gt;&lt;br /&gt;"Continuous" means that it is integrated with your source control. For example, have the build system periodically, and often, check if any code has been submitted to your source control. If it has, it should automatically submit a build.&lt;br /&gt;&lt;br /&gt;One very large benefit to this, is if someone has "broken the build", you will know about it very quickly and can take steps to fix it very quickly too. One strong recommendation: send both successful and failing build notification emails to &lt;b&gt;&lt;i&gt;everyone&lt;/i&gt;&lt;/b&gt; on the development team. &lt;br /&gt;&lt;br /&gt;Do not just send failing notifications, send both success and failures. There is a positive psychological effect to seeing the steady stream of successful notifications and, less subtly, it lets everyone on the team know that a change has just occurred to the common source branch.&lt;br /&gt;&lt;br /&gt;Do not try to send failure notification emails to the responsible party only. The software development team, is a team. If one member makes a mistake, everyone needs to know about it. You are already sharing successes, let everyone share in the failures too.&lt;br /&gt;&lt;br /&gt;One extension is to add build documentation to it. Let it analyze the build environment and report any deviations from expectations. Let it keep a log of what it did for every build. Is there anything else you need to generate, then do it!&lt;br /&gt;&lt;br /&gt;Another great extension is to get the CBS to automatically generate a unique build identifier. Any software image emitting from the CBS machine can then be identified back to build time. Add, as part of the deliverables, the source control identifier and you can trace back any software image to the source files that generated it.&lt;br /&gt;&lt;br /&gt;Another beneficial extension is to get the CBS to publish the deliverables, ready to burn onto the DVD. Not every build is an important release build, but it's good practice to pretend it is.&lt;br /&gt;&lt;br /&gt;Do you have a special process for release builds? Then encapsulate the special process in a special machine machine, and you will never have to worry if someone "got it right". You've been generating builds from that build machine continuously...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3135147504759270815-4919301825759406100?l=arrizza.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arrizza.blogspot.com/feeds/4919301825759406100/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://arrizza.blogspot.com/2009/01/end-of-middlegame.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/4919301825759406100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/4919301825759406100'/><link rel='alternate' type='text/html' href='http://arrizza.blogspot.com/2009/01/end-of-middlegame.html' title='The End of the Middlegame'/><author><name>JohnA</name><uri>http://www.blogger.com/profile/11085021851534428823</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3135147504759270815.post-3087618945285543272</id><published>2009-01-26T20:56:00.005-08:00</published><updated>2009-01-26T20:57:00.009-08:00</updated><title type='text'>More books</title><content type='html'>-- Jan 14, 2009 More books&lt;br /&gt;&lt;br /&gt;More about design than software engineering, but still of invaluable service when it comes to the core of the human side of software:&lt;br /&gt;&lt;br /&gt;&lt;ul compact="compact"&gt;&lt;li&gt; &lt;b&gt;The Design of Everyday Things&lt;/b&gt;, Donald Norman, &lt;a target="_top" href="http://www.amazon.com/Design-Everyday-Things-Donald-Norman/dp/0465067107/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1231987133&amp;amp;sr=8-1"&gt;http://www.amazon.com/Design-Everyday-Things-Donald-Norman/dp/0465067107/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1231987133&amp;amp;sr=8-1&lt;/a&gt; &lt;/li&gt;&lt;li&gt; &lt;b&gt;The Visual Display of Quantitative Information, 2nd edition&lt;/b&gt;, Edward Tufte, &lt;a target="_top" href="http://www.amazon.com/Visual-Display-Quantitative-Information-2nd/dp/0961392142/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1232005637&amp;amp;sr=1-1"&gt;http://www.amazon.com/Visual-Display-Quantitative-Information-2nd/dp/0961392142/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1232005637&amp;amp;sr=1-1&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3135147504759270815-3087618945285543272?l=arrizza.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arrizza.blogspot.com/feeds/3087618945285543272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://arrizza.blogspot.com/2009/01/more-books.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/3087618945285543272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/3087618945285543272'/><link rel='alternate' type='text/html' href='http://arrizza.blogspot.com/2009/01/more-books.html' title='More books'/><author><name>JohnA</name><uri>http://www.blogger.com/profile/11085021851534428823</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3135147504759270815.post-4790709540361187519</id><published>2009-01-26T20:56:00.003-08:00</published><updated>2009-01-26T20:56:45.263-08:00</updated><title type='text'>Predictable vs. Repeatable</title><content type='html'>-- Jan 9, 2009 Predictable vs. Repeatable&lt;br /&gt;&lt;br /&gt;I've often been told that the purpose of a software development process is to ensure repeatability. I think there's a bit of a muddle in there.&lt;br /&gt;&lt;br /&gt;I think we really want predictability, not repeatability. But something repeatable is predictable. They're synonyms right?&lt;br /&gt;&lt;br /&gt;Hmmm. How about this: I sure don't want to repeat a past nightmare project, but I sure would like a predictable outcome for any given steps I need to take in my current projects. If I take stepA, followed by stepB, all the way to stepZ then I predictably get outcome1, and I sleep well at night.&lt;br /&gt;&lt;br /&gt;I want predictability in outcome given the steps I take, but I don't want to necessarily repeat the steps I took in the last project. Repeating the steps I took in the last project might not be applicable in the current project and so I may not get the same outcome.&lt;br /&gt;&lt;br /&gt;Unfortunately, to most people the use of the word "repeatable" implies repeating the same steps. So the idea of writing down a prescribed set of steps to be followed verbatim for each and every project is what tends to happen, but I don't think it's a very successful strategy. Yes you can repeat the project, but the outcome of those steps may not be predictable.&lt;br /&gt;&lt;br /&gt;I teased my cat 3 days ago, and it ran away. I teased my cat 2 days ago, and it ran away. I teased my cat yesterday, and it ran away. I teased it today, and it scratched the hell out of me. Same repeatable steps, different outcome. Yes, a strangely satisfying, predictable outcome. Why did the cat fight back? Because it's not the same cat today as it was three days ago.&lt;br /&gt;&lt;br /&gt;Now you could argue that three out of four times we got the outcome we wanted, i.e. a 75% success rate! Gotta love statistics sometimes.&lt;br /&gt;&lt;br /&gt;So let's keep going: tomorrow I tease the cat, it scratches me again. The day after that, I tease the cat, it bites me. The day after that, I tease the cat, it bites me again. The day after that, I tease the cat, the neighbors call the SPCA and I'm thrown in jail. And so on. Now what do the statistics look like?&lt;br /&gt;&lt;br /&gt;Compare all that to: &lt;br /&gt;&lt;br /&gt;I teased my cat 2 days ago, I predicted it would run away, and it did. I teased my cat yesterday, I predicted it would run away, and it did. I teased my cat today, I predicted it was going to scratch me and it did. The difference is a window of opportunity has opened. I can use my predictions to change my actions in anticipation of expected outcomes, i.e. I'll stop teasing the cat.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;BTW I don't own a cat, nor do I tease other people's.&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3135147504759270815-4790709540361187519?l=arrizza.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arrizza.blogspot.com/feeds/4790709540361187519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://arrizza.blogspot.com/2009/01/predictable-vs-repeatable.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/4790709540361187519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/4790709540361187519'/><link rel='alternate' type='text/html' href='http://arrizza.blogspot.com/2009/01/predictable-vs-repeatable.html' title='Predictable vs. Repeatable'/><author><name>JohnA</name><uri>http://www.blogger.com/profile/11085021851534428823</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3135147504759270815.post-2906471844931228094</id><published>2009-01-26T20:56:00.001-08:00</published><updated>2009-01-26T20:56:25.742-08:00</updated><title type='text'>Automation Makes Predictable</title><content type='html'>-- Jan 9, 2009 Automation Makes Predictable.&lt;br /&gt;&lt;br /&gt;You've heard the expression "Practice makes perfect"? Well it's wrong. &lt;br /&gt;&lt;br /&gt;Practice the same imperfect steps over and over again and you will surely get imperfection. Sometimes this is called "If you always do what you've done, you'll always get what you've gotten!" Practicing a given set of steps just ensures we can repeat those steps absolutely the same. They may be the wrong steps or they may be right, but all you can do by practicing them is ensure they are the same steps.&lt;br /&gt;&lt;br /&gt;To get perfection, you must use intelligence and insight to understand the steps you want to follow... and then practice them. If you practice perfect steps, you will get predictable perfection.&lt;br /&gt;&lt;br /&gt;Ok. Great. So practice makes predictable, but once it's predictable, it's kind of boring, and once it's boring it becomes error-prone if you have to do it manually. All of which points to automation as the right direction to enforcing a predictable process. Automation makes predictable.&lt;br /&gt;&lt;br /&gt;Some caveats:&lt;br /&gt;&lt;br /&gt;&lt;ul compact="compact"&gt;&lt;li&gt; Do we want boring? Yes, we do. Good. Just checking. We don't want surprises, especially last minute surprises. We want predictability. &lt;/li&gt;&lt;li&gt; don't start automation too early. You miss out learning some very valuable things about the process. You need a motivated, intelligent person initially running through those steps to ensure there is a deep understanding of what is going on and why it needs to be done. &lt;/li&gt;&lt;li&gt; Automation makes predictable, which is it's strength. But it's strength is it's weakness. The predictability of it's outcome is had from the rigid adherence of the scripts to their contents. When the scripts follow their algorithm down into oblivion, you won't necessarily know why. It pays to have a trace of what exactly happened. &lt;/li&gt;&lt;li&gt; Automation is great for those parts of the software development process that are fairly inflexible. If there is a lot of complexity, it may still call out for manual processing or perhaps a blend of automation assisting a manual process. &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3135147504759270815-2906471844931228094?l=arrizza.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arrizza.blogspot.com/feeds/2906471844931228094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://arrizza.blogspot.com/2009/01/automation-makes-predictable.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/2906471844931228094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/2906471844931228094'/><link rel='alternate' type='text/html' href='http://arrizza.blogspot.com/2009/01/automation-makes-predictable.html' title='Automation Makes Predictable'/><author><name>JohnA</name><uri>http://www.blogger.com/profile/11085021851534428823</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3135147504759270815.post-8213993311903435392</id><published>2009-01-26T20:55:00.003-08:00</published><updated>2009-01-26T20:55:54.969-08:00</updated><title type='text'>The Penultimate Endgame</title><content type='html'>-- Jan 9, 2009 The Penultimate Endgame&lt;br /&gt;&lt;br /&gt;Un-sprinkle some of that pixie dust.&lt;br /&gt;&lt;br /&gt;We are now back to a point where we are creating the DVD's. How do we do that? Simple: burn the DVD from the software images.&lt;br /&gt;&lt;br /&gt;The main question is how do we ensure that the image on the DVD is the one we want? In short the software image has to have some identifying mark that we can detect on the image in the DVD.&lt;br /&gt;&lt;br /&gt;One part of this is to designate a build machine that is used only for the creation of final released images. This is the only machine that creates the image and creates the DVD. If the total process is automated, the image on the DVD is the image that was created on the build machine. Even still there is a need to uniquely identify an image on a DVD. I have two DVD's, both with my_software.exe on it. How do I tell which exe is the latest?&lt;br /&gt;&lt;br /&gt;One way is to embed a version string. The version string is not a no-brainer. As it turns out the versioning of a software release has become part of marketing. Since the they have been talking about v2.0 for the last 8 months to the customers, you can't rename the image "v2.001" at the last minute. One way around this is to have a rather long version string of which only the first few characters are "v2.0", the rest are for our benefit.&lt;br /&gt;&lt;br /&gt;The build machine will automatically (or manually) increment the version string for every build coming off of it. So unique builds have unique strings.&lt;br /&gt;&lt;br /&gt;A better way is to use add a build info string into the image. But this isn't a no-brainer either. It only works if every build on every machine is unique in some way. This can be done if every developer's machine has a unique name and a counter. That counter is incremented each and every time a build is kicked off. The counter and the developer's machine name is stamped into the image via the linker (or some language appropriate method) and maybe add some other data for convenience, say the date time stamp of the final link. This way, every machine, every build is unique and it is easy to tell the pedigree of the build from my developer machine vs your developer machine vs the release build machine.&lt;br /&gt;&lt;br /&gt;One little twist that is quite appealing is the use of the version control numbering. Some version control systems (e.g. Perforce and Subversion) have a unique number for every submitted change. If that number could be embedded in the image then you have a direct link from the image on a DVD to the source that was used to create it. (Note we always assume there are no errors in the makefiles/Ant/scons/rake scripts!)&lt;br /&gt;&lt;br /&gt;And finally, the creation of the installation scrips and the transfer of those scripts and software images to the DVD. In this, practice does make predictable, and once predictable, boring. So automation is the right direction to follow.&lt;br /&gt;&lt;br /&gt;I've been using "DVD" as if this is the only way to deliver software. Not true of course. You will have to replace your delivery mechanism as appropriate.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3135147504759270815-8213993311903435392?l=arrizza.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arrizza.blogspot.com/feeds/8213993311903435392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://arrizza.blogspot.com/2009/01/penultimate-endgame.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/8213993311903435392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/8213993311903435392'/><link rel='alternate' type='text/html' href='http://arrizza.blogspot.com/2009/01/penultimate-endgame.html' title='The Penultimate Endgame'/><author><name>JohnA</name><uri>http://www.blogger.com/profile/11085021851534428823</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3135147504759270815.post-3060895808540160072</id><published>2009-01-26T20:55:00.001-08:00</published><updated>2009-01-26T20:55:33.655-08:00</updated><title type='text'>Books</title><content type='html'>-- Jan 6, 2009 Books&lt;br /&gt;&lt;br /&gt;Quick go out and buy these books immediately:&lt;br /&gt;&lt;br /&gt;&lt;ul compact="compact"&gt;&lt;li&gt; &lt;b&gt;Waltzing with Bears: Managing Risk on Software Projects&lt;/b&gt;, Tom DeMarco, Timothy Lister &lt;a target="_top" href="http://www.amazon.com/Waltzing-Bears-Managing-Software-Projects/dp/0932633609/ref=sr_1_12?ie=UTF8&amp;amp;s=books&amp;amp;qid=1231309159&amp;amp;sr=8-12"&gt;http://www.amazon.com/Waltzing-Bears-Managing-Software-Projects/dp/0932633609/ref=sr_1_12?ie=UTF8&amp;amp;s=books&amp;amp;qid=1231309159&amp;amp;sr=8-12&lt;/a&gt; &lt;/li&gt;&lt;li&gt; &lt;b&gt;Are Your Lights On?: How to Figure Out What the Problem Really Is&lt;/b&gt;, Gerald Weinberg, &lt;a target="_top" href="http://www.amazon.com/Are-Your-Lights-Figure-Problem/dp/0932633161/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1231309355&amp;amp;sr=1-1"&gt;http://www.amazon.com/Are-Your-Lights-Figure-Problem/dp/0932633161/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1231309355&amp;amp;sr=1-1&lt;/a&gt; &lt;/li&gt;&lt;li&gt; &lt;b&gt;Sources of Power: How People Make Decisions&lt;/b&gt;, Gary Klein, &lt;a target="_top" href="http://www.amazon.com/Sources-Power-People-Make-Decisions/dp/0262611465/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1231309472&amp;amp;sr=1-1"&gt;http://www.amazon.com/Sources-Power-People-Make-Decisions/dp/0262611465/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1231309472&amp;amp;sr=1-1&lt;/a&gt; &lt;/li&gt;&lt;li&gt; &lt;b&gt;The Logic Of Failure: Recognizing And Avoiding Error In Complex Situations&lt;/b&gt;, Dietrich Dorner, &lt;a target="_top" href="http://www.amazon.com/Logic-Failure-Recognizing-Avoiding-Situations/dp/0201479486/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1231309520&amp;amp;sr=1-1"&gt;http://www.amazon.com/Logic-Failure-Recognizing-Avoiding-Situations/dp/0201479486/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1231309520&amp;amp;sr=1-1&lt;/a&gt; &lt;/li&gt;&lt;li&gt; &lt;b&gt;Managing Humans&lt;/b&gt;, Michael Lopp, &lt;a target="_top" href="http://www.amazon.com/Managing-Humans-Humorous-Software-Engineering/dp/159059844X/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1231309280&amp;amp;sr=1-1"&gt;http://www.amazon.com/Managing-Humans-Humorous-Software-Engineering/dp/159059844X/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1231309280&amp;amp;sr=1-1&lt;/a&gt; &lt;/li&gt;&lt;li&gt; &lt;b&gt;Made to Stick: Why Some Ideas Survive and Others Die&lt;/b&gt;, Chip &amp;amp; Dan Heath, &lt;a target="_top" href="http://www.amazon.com/Made-Stick-Ideas-Survive-Others/dp/1400064287/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1231310167&amp;amp;sr=1-1"&gt;http://www.amazon.com/Made-Stick-Ideas-Survive-Others/dp/1400064287/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1231310167&amp;amp;sr=1-1&lt;/a&gt; &lt;/li&gt;&lt;li&gt; &lt;b&gt;How to Win Friends &amp;amp; Influence People&lt;/b&gt;, Dale Carnegie, &lt;a target="_top" href="http://www.amazon.com/How-Win-Friends-Influence-People/dp/0671027034/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1231310218&amp;amp;sr=1-1"&gt;http://www.amazon.com/How-Win-Friends-Influence-People/dp/0671027034/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1231310218&amp;amp;sr=1-1&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;That was close. No one should go into battle without them.&lt;br /&gt;&lt;br /&gt;These books are rich. Read them once, you come away with insight. Read them again, and your insight is deepened. Read them again, and it's deeper still. Repeat.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3135147504759270815-3060895808540160072?l=arrizza.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arrizza.blogspot.com/feeds/3060895808540160072/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://arrizza.blogspot.com/2009/01/books.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/3060895808540160072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/3060895808540160072'/><link rel='alternate' type='text/html' href='http://arrizza.blogspot.com/2009/01/books.html' title='Books'/><author><name>JohnA</name><uri>http://www.blogger.com/profile/11085021851534428823</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3135147504759270815.post-2458694709617002695</id><published>2009-01-26T20:54:00.002-08:00</published><updated>2009-01-26T20:55:07.940-08:00</updated><title type='text'>The Endgame</title><content type='html'>-- Jan 6, 2009 The Endgame&lt;br /&gt;&lt;br /&gt;Why are we doing all of this? Why the angst over this process or that? Why have a Software Development Process at all? Why don't we just start coding until we're done?&lt;br /&gt;&lt;br /&gt;It's all in the endgame. &lt;br /&gt;&lt;br /&gt;Let's start there, start at the end of the endgame. You're at the customer's site. Sprinkle some of IBM's magic pixie dust and the DVD's are in your hand and you are ready to install! That was easy.&lt;br /&gt;&lt;br /&gt;This is the moment that you've been working so hard for during the last 8 - 12 months. Everything on that DVD is a great big neon sign about your company. It screams at your customer whether you're a professional, seasoned company or "just a couple of guys in a garage" kind of operation. The installation software and the ease of installation is the first concrete clue you are giving to your customer that you've done all of your homework and your software is worth the bazillion dollars they just paid for it. &lt;b&gt;&lt;i&gt;It is your face.&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;If you do the installation for them, if better be foolproof. You do not want your installation software making fools of your installers. They are your face. If they are embarrassed, your company is embarrassed. If they look like idiots, your company looks like an idiot.&lt;br /&gt;&lt;br /&gt;If your customers do the installation themselves, the installation software better be even more foolproof. The customers don't know and don't care about your installation. You can't trust the customer to not screw it up, so your installation has to be even smarter. If it's stupid, your company looks stupid.&lt;br /&gt;&lt;br /&gt;Ok, let's try it. Slip the DVD into the drive and whirrrr... bump.&lt;br /&gt;&lt;br /&gt;Wait a minute. You tested your installation software right?! You &lt;b&gt;know&lt;/b&gt; it runs on the customer's equipment sitting in front of you... right? It runs on that OS, right? It needs how much disk space? Is it an upgrade or a fresh install? Doesn't the software figure that out for you?&lt;br /&gt;&lt;br /&gt;So when &lt;i&gt;should&lt;/i&gt; you test the installation software? Good rule of thumb is "Practice makes predictable". So practice the installation on every development build. If there's a glitch on an upgrade or a new installation, you'll know that whatever development occurred during the previous build and the current one is most likely the culprit.&lt;br /&gt;&lt;br /&gt;You'll need a full set of target machines that you can reset to an original state quickly and easily (kind of screams for a VM solution doesn't it?). After doing it a few hundred times, you'll most likely want to automate the installations. Hey and that's a nice feature for your larger customers too.&lt;br /&gt;&lt;br /&gt;And you'll most likely want a developer dedicated (targeted?) to maintain the installation software. Oh and a good mitigation is to have code reviews of the installation software by a couple of other folks. If your main developer leaves, you have some scrambling to do but at least they'll have seen the code a few times before they're thrown in the fire.&lt;br /&gt;&lt;br /&gt;At this point, you'll have very, very few surprises. If there is one, you have a whole bunch of data and a few tools at your disposal to fix it quickly.&lt;br /&gt;&lt;br /&gt;That's why we have a Software Development Process, to give us the data and tools we need to fix problems quickly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3135147504759270815-2458694709617002695?l=arrizza.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arrizza.blogspot.com/feeds/2458694709617002695/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://arrizza.blogspot.com/2009/01/endgame.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/2458694709617002695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/2458694709617002695'/><link rel='alternate' type='text/html' href='http://arrizza.blogspot.com/2009/01/endgame.html' title='The Endgame'/><author><name>JohnA</name><uri>http://www.blogger.com/profile/11085021851534428823</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3135147504759270815.post-2884231808217214506</id><published>2009-01-26T20:54:00.001-08:00</published><updated>2009-01-26T20:54:42.135-08:00</updated><title type='text'>Adoption of XP (Extreme Programming)</title><content type='html'>--Jan 5, 2009 Adoption of XP (Extreme Programming)&lt;br /&gt;&lt;br /&gt;The question was: &lt;br /&gt;&lt;br /&gt; &lt;b&gt;Is it better to adopt a gradual transition to agile development or commit to full XP, for example, and adjust later?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;My answer was, and is: &lt;b&gt;Gradual transition&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;The Big Bang approach does not work unless:&lt;br /&gt;&lt;br /&gt;&lt;ul compact="compact"&gt;&lt;li&gt; your team is already working well together. They are sincere about trying XP, they are technically and emotionally competent. e.g. if there is a weak member on the team or a passive-aggressive on the team, his/her attitude will show up in with a big loud bang and you will blame XP for it. &lt;/li&gt;&lt;li&gt; your development team is &lt;b&gt;&lt;i&gt;really&lt;/i&gt;&lt;/b&gt; on board with XP. They must not have a "say-yes-to-management-because-I'm-scared-to-get-fired" attitude. XP requires capital-P Participation from everyone. Especially when it is being initially rolled-out. e.g. They can't say "I'll refactor" and then pull out 2 lines out of their 150 line function and claim "I refactor!" &lt;/li&gt;&lt;li&gt; your development environment is already up to snuff. XP stresses development environments. e.g. if you don't have your source control under control it will show up with a big loud bang and you will blame XP for it. In my experience, there is a tremendous amount of political and technical inertia in the build system. I guess the difficulty in getting the thing to work at all and the criticalness of it causes the inertia. You might not be able to change it because too many people refuse to allow you to. &lt;/li&gt;&lt;li&gt; management is &lt;b&gt;&lt;i&gt;really&lt;/i&gt;&lt;/b&gt; on board with XP. They must not be doing "airplane-magazine" management. e.g. they say yes we want emergent design, no BDUF, etc. and then call week-long design sessions with "the boys". They can't say "1 week iterations except this week and next week and that week" &lt;/li&gt;&lt;li&gt; management is patient. They must recognize that your development environment and your development team are tightly integrated as a symbiotic whole, changing an aspect of one will affect the other. Those changes perturb other aspects of the whole and so on. It is a dynamic system that is held in equilibrium by a lot of effort by a lot of people, changing any part of it requires those people to understand at a fine level what is required for them to do in the new setup. Your management has to recognize that it will take time to change all these things &lt;b&gt;&lt;i&gt;and&lt;/i&gt;&lt;/b&gt; have it run as smoothly or better than it did before. &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Now assuming you have all of these things in place, why do you want to convert to XP? &lt;br /&gt;&lt;br /&gt;You have a well-run shop with intelligent, coherent management and developers! :) My point here is that chances are you are considering XP because you are having problems not because things are going well. Because of that you will face a lot of political, technical and personnel problems. I suggest, then, going slowly, i.e. gradual transition.&lt;br /&gt;&lt;br /&gt;Here are some guidelines to achieve this gradual transition.&lt;br /&gt;&lt;br /&gt;First step, analyze the company's context. What are they currently doing? what are they competent at? what are they most amenable to changing?&lt;br /&gt;&lt;br /&gt;Second step, determine which one of the XP practices is most likely to be acceptable to them. Which one requires the least amount of change for the company? Which one are they already doing or almost doing?&lt;br /&gt;&lt;br /&gt;Third step, introduce the practice to them and then "predict" where there will be failure points. For example, say 1 week iterations are the most likely to be accepted. Some failure points with 1 week iterations are:&lt;br /&gt;&lt;br /&gt;&lt;ul compact="compact"&gt;&lt;li&gt; a task can take longer than a week, how do we merge that task in? &lt;/li&gt;&lt;li&gt; the integration time for only a week's worth of work is pretty small, but as a percentage it can be fairly high. How can we reduce that integration time? &lt;/li&gt;&lt;li&gt; it seems that Fred likes to claim he's "done" but every week we have to go back and "fix" his stuff. What can we do about that? &lt;/li&gt;&lt;li&gt; etc. &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;If this step is done well you should have a bagful of credibility at this point. You have to sell this to developers and managers alike. If the developers don't buy-in, they will sabotage your efforts. If the managers don't buy in, they will override your efforts of just cancel them altogether. Beware of the manager who wants a complete process revamp "yesterday", this stuff takes time.&lt;br /&gt;&lt;br /&gt;Fourth step, use that credibility to introduce the other practices to fix the failure points that you "predicted".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3135147504759270815-2884231808217214506?l=arrizza.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arrizza.blogspot.com/feeds/2884231808217214506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://arrizza.blogspot.com/2009/01/adoption-of-xp-extreme-programming.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/2884231808217214506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/2884231808217214506'/><link rel='alternate' type='text/html' href='http://arrizza.blogspot.com/2009/01/adoption-of-xp-extreme-programming.html' title='Adoption of XP (Extreme Programming)'/><author><name>JohnA</name><uri>http://www.blogger.com/profile/11085021851534428823</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3135147504759270815.post-2678416791684574646</id><published>2009-01-26T20:52:00.000-08:00</published><updated>2009-01-26T20:54:09.571-08:00</updated><title type='text'>Einstein and Thought Experiments</title><content type='html'>-- Jan 5, 2009 Einstein and Thought Experiments. &lt;br /&gt;&lt;br /&gt;Started this Weblog today.&lt;br /&gt;&lt;br /&gt;Einstein used thought experiments. &lt;br /&gt;&lt;br /&gt;When I was in school, one of my professors said "Think the unthinkable!" How do you think something unthinkable? Perhaps he was just saying it for the managementese of it. Often management-speak can have some interesting weirdness on the outside, with a soft melty center on the inside. In this case, it may have been a rehash of "Think out of the box", but knowing the professor, the person himself, I don't think so. I think he meant it as a sort of dare, as a challenge. A challenge which is also a conundrum makes it pretty odd.&lt;br /&gt;&lt;br /&gt;But back to Einstein. He thought the unthinkable. But in this case it was a different connotation of "thinkable". He used thought experiments to imagine semi-real scenarios. Take a train and run it at near the speed of light ("Relativity: The Special and the General Theory" by Einstein himself). It's clearly possible, although highly improbable. But he used the questions it raises to his advantage. He could explore an unknowable (unthinkable?) scenario and use it to flesh out what he wanted to study. What would it be like? What would happen? Why would this or that happen and not &lt;i&gt;that&lt;/i&gt;?&lt;br /&gt;&lt;br /&gt;Strangely enough, I read in "Sources of Power: How People Make Decisions" (Gary Klein) this is exactly what normal everyday people do. Although perhaps not in an analytical or methodical way as Einstein did. They run simulations in their head of what could happen if they made this decision or that. They do informal thought experiments to themselves.&lt;br /&gt;&lt;br /&gt;But out loud, this freaks people out. I've tried it out in conversations with people, and it makes them uncomfortable. It's like imagining something which isn't quite "every day real" makes the analysis and results just not quite right. It's suspect. And besides, how can you trust someone who makes up a story about trains going the speed of light?&lt;br /&gt;&lt;br /&gt;But I'm not sure why. A thought experiment is like an Analogy on Steroids. People are ok with analogies, although they do spend a lot of time picking apart the analogy rather than understanding the principle the analogy is trying to reveal. In a thought experiment the analogy is there but it isn't one thing &lt;i&gt;like&lt;/i&gt; another, it is reality, but perhaps just a rare edge case of it. Einstein didn't really make up a story, he laid out a very possible, realistic scenario. Not something he (or anyone else) could realistically achieve, but the scenario is not fantasy, everything he said could possibly occur. On the other hand, analogies aren't &lt;b&gt;that&lt;/b&gt; realistic.&lt;br /&gt;&lt;br /&gt;In any case, I'm going to reverse engineer Einstein and use thought experiments.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3135147504759270815-2678416791684574646?l=arrizza.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arrizza.blogspot.com/feeds/2678416791684574646/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://arrizza.blogspot.com/2009/01/einstein-and-thought-experiments.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/2678416791684574646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3135147504759270815/posts/default/2678416791684574646'/><link rel='alternate' type='text/html' href='http://arrizza.blogspot.com/2009/01/einstein-and-thought-experiments.html' title='Einstein and Thought Experiments'/><author><name>JohnA</name><uri>http://www.blogger.com/profile/11085021851534428823</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
