<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>8th Light Blog: Category Craftsmanship</title>
    <link>http://blog.8thlight.com/articles/category/craftsmanship</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>In the minds of the craftsmen...</description>
    <item>
      <title>No Tag Backs</title>
      <description>&lt;p&gt;Well Micah tagged me, and if I look at these XML request/responses for another hour without a break I&amp;#8217;m going to pass out into my keyboard.  Here goes.&lt;/p&gt;

&lt;h3&gt;How old were you when you started programming.&lt;/h3&gt;

&lt;p&gt;I had a Texas Instruments computer thingy that I got for my 6th or 7th birthday, somewhere in there.  It played these educational games, but I noticed one day that if I didn&amp;#8217;t put a cartridge in it a blue screen came up with a cursor.  It had an instruction book and I would basically type in the programs verbatim, then do little things with it like change a color or a line.  Later I had an Atari XE and it did the same thing, so I made the same little guessing game in it just like the one I made on the TI.  Realistically I didn&amp;#8217;t write anything of use until high school though.&lt;/p&gt;

&lt;p&gt;Interestingly, perhaps only to me, my version of Hello World for the iPhone SDK was a guessing game.&lt;/p&gt;

&lt;h3&gt; How did you get started programming. &lt;/h3&gt;

&lt;p&gt;I guess that was the real answer.  I played with my dad&amp;#8217;s computers all the time but didn&amp;#8217;t consider it as a career until I was about 16 or 17, when I realized I could probably get paid for it.  Up until then I wanted to be a sports journalist.  So I went to school so I could found my own game company.&lt;/p&gt;

&lt;h3&gt;What was the first real program you wrote?&lt;/h3&gt;

&lt;p&gt;What counts as &amp;#8220;real&amp;#8221;?  The guessing game?  Making horizontal lines appear on the screen?  I wrote a bunch in Basic and Pascal for homework assignments, and like Micah had one of those TI calculators.  The first specific one I can recall was a text-based adventure game I made for a homework assignment my freshman year.  It was based on the Haymarket Bombing &lt;/p&gt;

&lt;h3&gt;What languages have you used since you started programming?&lt;/h3&gt;

&lt;p&gt;Pascal, C, C++, C#, COBOL, Assembly, Perl (but I won&amp;#8217;t admit it), Java, Objective-C, Ruby, Javascript, Lisp, VB, Erlang, and I just wrote Hello World in Smalltalk (Squeak).&lt;/p&gt;

&lt;p&gt;I too doubt I could write Hello World in most of those languages, and wouldn&amp;#8217;t put them all on my resume.  It&amp;#8217;s funny because I probably would have when I came out of school, since I didn&amp;#8217;t know the difference between &amp;#8220;familiar with&amp;#8221; and &amp;#8220;able to write some code with&amp;#8221;.&lt;/p&gt;

&lt;h3&gt;What was your first professional programming gig?&lt;/h3&gt;

&lt;p&gt;I started a web design company in college, which employed me and myself.  I had two clients, one of whom paid me in Kung Fu lessons.&lt;/p&gt;

&lt;h3&gt;If there is one thing you learned along the way that you would tell new developers, what would it be?&lt;/h3&gt;

&lt;p&gt;Find great people to work with.  If you&amp;#8217;re the smartest person in the room, you need a new room, because if you&amp;#8217;re not growing you&amp;#8217;re dying.  This is tricky when you&amp;#8217;re new, since you don&amp;#8217;t know a great developer from a tree stump, but take a look at Micah&amp;#8217;s tag list.  It looks like the list of authors in my library.&lt;/p&gt;

&lt;p&gt;I would also tell them they should come to work for me as my apprentice, unless they weren&amp;#8217;t any good.  Then they can work for Jim.&lt;/p&gt;

&lt;h3&gt;What&#8217;s the most fun you&#8217;ve ever had programming?&lt;/h3&gt;

&lt;p&gt;Working with the team I work with now is fantastic.  I also had a great time working Agile 2007 as part of RailsFest, and I&amp;#8217;m looking forward to doing the same thing on the Live Aid stage this year.&lt;/p&gt;

&lt;h3&gt;Up Next&lt;/h3&gt;

&lt;p&gt;Sadly I don&amp;#8217;t know many developer&amp;#8217;s who keep blogs, so I&amp;#8217;ll just echo Micah&amp;#8217;s list and tell Paul, Jim, Doug and Matt they&amp;#8217;re next.&lt;/p&gt;</description>
      <pubDate>Thu, 03 Jul 2008 21:17:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:ef64d0a1-1a95-41fd-8d66-b9601cdf3ba0</guid>
      <author>Eric</author>
      <link>http://blog.8thlight.com/articles/2008/07/03/no-tag-backs</link>
      <category>Craftsmanship</category>
      <category>Fun</category>
      <category>Eric</category>
    </item>
    <item>
      <title>Apprenticeship month one report</title>
      <description>&lt;p&gt;8th Light has an apprenticeship program whereby an 8th Light craftsman will mentor an individual for three months.  During that time, the craftsperson becomes responsible for a single apprentice.  I am one month into a mentorship with an apprentice.  This blog is about observations I have made about myself as a mentor.&lt;/p&gt;

&lt;h3&gt;Curiosity&lt;/h3&gt;

&lt;p&gt;He asks me questions that I wouldn&amp;#8217;t ask myself.  I had him do an exercise about &lt;a href="http://en.wikipedia.org/wiki/Law_Of_Demeter"&gt;Law of Demeter&lt;/a&gt; , to find Law of Demeter violations in my code base.  He found something like:&lt;/p&gt;

&lt;p&gt;Law of Demeter&lt;/p&gt;

&lt;p&gt;&amp;#8220;Ted Williams&amp;#8221;.to_s.strip.upcase&lt;/p&gt;

&lt;p&gt;He was counting the periods, which is what I explained is often good measurement of Law of Demeter violations.  Yet this is not a Law of Demeter violation.  Each one of those methods returns itself (a string) in a changed state.  It is not a string of implementation details- this example is just changing a single object.  The pivotal piece of information is that all of these methods on string return the string itself.  Also, is anything inside of Ruby core language capable of Law of Demeter?  It is unlikely to change, and is there a problem being coupled tightly to your language?&lt;/p&gt;

&lt;p&gt;I sometimes get desensitized to the original premises of good development.  When I first learn something, I remember the example of the rule more than the value of the rule.  The value of learning about Demeter is rooted in encapsulating logic in such a way to hide implementations from an object&amp;#8217;s clients.  When I first learned about Demeter, all I could do was point out violations.  The more I developed, the more it was internalized as a guide for a higher development idea.  I want to keep my modules as decoupled as possible.  However, that notion only came with development experience.  Now I don&amp;#8217;t think in terms of violations or non-violations of Demeter when I read a piece of code.  It is just ingrained in my developmental context that I should develop my modules in such a way that they are autonomous.  This weeds out most Law of Demeter violations by itself.  Bringing these premises back up in my development as a craftsman gets my curiosity started.  Like a good song or piece of writing, every time I come back to it, I take something different from it, because I am in a state of constant change.&lt;/p&gt;

&lt;h3&gt;Teaching&lt;/h3&gt;

&lt;p&gt;Sometimes I forget how important teaching is to the craftsmanship model, because I am still an extreme novice at it.  It is one of the steps involved with internalizing development skills.  When I pair with my mentor, I am constantly amazed at how he skips steps in the development rational process.  Instead of following a linear thought pattern to a solution, it seems there is a giant shortcut in the rational processes I go through.  That gap is a lookup table of solutions in his head.  It appears so easy and effortless.  Teaching is part of a formula that has given him a development context that is superior to mine.  The more I am able to teach, the more I internalize the ideas about development.  &lt;/p&gt;

&lt;p&gt;There is a &lt;a href="http://sports.espn.go.com/espnmag/story?id=3336514&amp;amp;campaign=rss&amp;amp;source=MLBHeadlines"&gt;baseball story&lt;/a&gt; from about a year ago.  Greg Maddux was warming up before a game and his catcher exclaimed to the pitching coach, &amp;#8220;I bet I could catch him with my eyes closed.&amp;#8221;  Well, after much effort, they convinced Maddux to give it a shot.  The catcher was going to call his pitch, then close his eyes.  When the ball was about to hit his mitt, the pitching coach with his eyes open was going to yell &amp;#8220;now&amp;#8221;, whereupon the catcher would squeeze his glove on the ball.  Well, on the third try, the catcher caught the ball.  The degree of difficulty of the exercise is incredible, but Greg Maddux had spent so many years internalizing the mechanics of his craft that he could effortlessly hit the catcher&amp;#8217;s mitt.  There probably are only a few pitchers in the long history of baseball who could match that exercise.  I am not anywhere near that kind of skill in development, but that is my goal.  When you get the mechanics of your craft to be intuition, it frees your mind to think about and solve larger problems.  I have been fortunate to spend time with enough great developers to see this mastery in action.&lt;/p&gt;

&lt;h3&gt;Communication&lt;/h3&gt;

&lt;p&gt;For me, what is special about teaching is the commitment of thoughts to sound.  Forcing something outside of my internal monologue always changes it, even if it is a small change.  When I explain something, I often have to explain it multiple ways (this is telling of my communication skills, not of my apprentice&amp;#8217;s learning skills).  So, the more I am forced to answer questions on the spot, the better I get at quickly thinking through a question and giving a good answer.  This dialogue is another one of the mental exercises which translates into my everyday development.  It makes me a better pair programmer, better presenter, and better writer.  Being able to accurately explain a problem and a solution using the language of software development is a very important tool in being a successful craftsman, and a tool that I fight uphill to improve upon.  When I go to a talk at a conference and the presenter hits the problem and solution perfectly, it is a wonderful experience.  The same is true when a team member can explain a solution in such intuitive terms that everyone gets it immediately.&lt;/p&gt;

&lt;p&gt;Apprenticeship for me is as much about internalizing and expanding my own skill set as it is about expanding my apprentice&amp;#8217;s.  &lt;/p&gt;</description>
      <pubDate>Tue, 01 Jul 2008 01:14:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:29809293-4427-4262-bc2c-eeda47e56d81</guid>
      <author>Paul Pagel</author>
      <link>http://blog.8thlight.com/articles/2008/07/01/apprenticeship-month-one-report</link>
      <category>Craftsmanship</category>
      <category>Coding</category>
      <category>Paul</category>
      <category>Apprenticeship</category>
    </item>
    <item>
      <title>Some Thoughts On Software Defects</title>
      <description>&lt;p&gt;Software defects are a part of software.  This is a negative subject, but I don&amp;#8217;t want to seem like the software I write is full of defects and bugs.  This blog is addressing how I have seen teams turn a roadblock into a success.  I have read and heard at conferences about teams who take small failures and create a culture of failure around it.  Following are some examples of small failures I have seen and great successes built around them.  Sometimes I see small failures as a path to larger positive culture changes.   &lt;/p&gt;

&lt;p&gt;I think it is safe to say all software that is used and sufficiently complex has defects.  There are many reasons for the defects.  Here are a few of the defect situations I have been in and how our team solved them.  &lt;/p&gt;

&lt;p&gt;I think the important part I learned after evaluating these is that resolution of these situation needs to be fast and high quality.  They need to make the project better off at the end of their resolution.  Success for the customer is the only true result of a project, and defects may not be the most ideal path, but they must lead there.&lt;/p&gt;

&lt;p&gt;The speed is important, but it doesn&amp;#8217;t mean I should rush a solution and throw it in as soon as possible.  To me it means giving the defect the red carpet treatment.  I am trying to capture craftsmanship in the face of adversity.  Every project has its ups and its downs, and a craftsman will take pride in success through any obstacles.  Instead of making defects a slippery slope downhill, they are one step back and we take two steps forward.  &lt;/p&gt;

&lt;h3&gt;Bugs&lt;/h3&gt;

&lt;p&gt;Bugs are a part of every piece of software I have written.  That statement sounds a lot worse than it is.  I have worked on systems where the requirements are dramatically changed week to week (which can be pretty exciting).  There are situations I didn&amp;#8217;t take into account, or some behavior I didn&amp;#8217;t imagine until a real user started hitting the system.  Now, as a developer, I do more mental exercises and think thoroughly through my solutions as I get more experience. This has never made my code bug free.  For that reason, my team needs to know how to deal with bugs (I am fairly certain I am not the only creator of bugs).&lt;/p&gt;

&lt;p&gt;Here is a line from the Pragmatic Programmer  book, &amp;#8220;It doesn&amp;#8217;t matter whether the bug is your fault or someone else&amp;#8217;s.  It is still your problem.&amp;#8221; &lt;/p&gt;

&lt;p&gt;So, the team has a bug list.  We list out the bugs as a todo list in basecamp, so they are not so formal they can be forgotten about.  Then we try to address them and work on new stories.  This worked well enough until there was a big release coming up and our customer came back to us with a big list of bugs.  We put them on the list and continued to fix them, as well as work on stories.  They were getting completed, but there was never an empty bug list.  Then, the customer (who can directly add/edit the bug list) started writing priorities to the bugs.  This one is HIGH priority.  This one is CRITICAL.  This one is IMMEDIATE.  I make the suggestion &amp;#8220;We need some real tool to manage our bug list,&amp;#8221; because I can&amp;#8217;t fit all this in my head.  There isn&amp;#8217;t that much room up there and I need to use it wisely.  One of my team members suggested maybe it wasn&amp;#8217;t the craftsmanship way to have ANY bugs shipped.  I was trying to solve the wrong end of the equation.  So, the team lead put forth a no bugs policy that we all agreed with.&lt;/p&gt;

&lt;p&gt;You can not pick up a new story unless the bug list is empty.&lt;/p&gt;

&lt;p&gt;This made sense to me, but I had reservations about a small/insignificant bug taking priority over a story that is important.  To date, this has not happened, and the bug list has stayed near no bugs.  That doesn&amp;#8217;t mean less bugs are found, it just means they are fixed, and the code is refactored to prevent a future occurrence.  Most importantly, some tool to track bugs never made it into our system.  That was an idea which would have desensitized the team mentality to bugs, whereas with our policy now we are very sensitive to the issue of bugs.  Challenging the craftsmanship of the team members that buggy code is something you should take personally was the right choice.  Bugs got a first class ticket to termination in our system.&lt;/p&gt;

&lt;p&gt;Now, the definition of a bug versus a small feature enhancement is a fine line.  I know I have failed to define it well, and that might contribute to what gets called a &amp;#8220;bug&amp;#8221;.  Often times, the urgency in the customer takes up more mental space than me thinking through it, looking up the acceptance criteria for the story where it was implemented, and going back to  the customer and saying, &amp;#8220;No, that was clearly not a defined scenario, we are going to need a story to turn that button green.&amp;#8221;  Now the next time, it is more than turning a button green, but the precedent has already been set.  All I have been able to do is to strike a balance based upon how much effort it would take to make the bug/feature enhancement work.  If it is a lot of effort, I will double check the bug to make sure it is a bug.  If it is, I fix it.  If not, I will push back to the customer to write a story card.&lt;/p&gt;

&lt;h3&gt;Production Support&lt;/h3&gt;

&lt;p&gt;Once a system goes into production, support begins.  Following along with one of Paul Graham&amp;#8217;s ideas, we have the developers doing the production support.  We are the ones who wrote the system and know the system the best.  When I look at a production support request, I can not only solve it, but make sure it doesn&amp;#8217;t happen again.  Or if it does, make sure it is easy to correct.&lt;/p&gt;

&lt;p&gt;So, during our first deployment of a system, a single team member stepped up as the &amp;#8220;production support&amp;#8221; developer.  I don&amp;#8217;t know if he embraced it or was cornered to it, but as a craftsman, he took the responsibility and ran with it.  As further systems were released, he would sometimes be doing an entire day of production support.  Production support can be a lot of debugging and fixing data, which can be fun, but more times than not is tedious and rhythmic.  Often times when I saw a production support email, I would look to the &amp;#8220;production support guy,&amp;#8221; who could fix it in about half the time I could.  This seems a lot like a silo to me.  Everyone should be able to do production support on any system.  I should have to, because it is a perspective of the system that is important to have.&lt;/p&gt;

&lt;p&gt;In response to this, we came up with a system of triage.  Each day of the week is assigned to a specific developer.  If a support item comes up, it is the job of the triage developer to respond to the client/customer we are working on it.  If it addressed to a specific person, they will inform them. Otherwise it is on the triage developer&amp;#8217;s shoulders to fix the support request before they continue their work for the day.  This ensures the client always has an open line of communication with a developer.  An email never slips through and doesn&amp;#8217;t get addressed.  There is clear responsibility to who should be addressing the support item.  I know the &amp;#8220;production support&amp;#8221; developer is in favor of this system.  As well as the customer, they ask who the triage is for the day and have no qualms about interrupting their work, as they should.&lt;/p&gt;

&lt;h3&gt;Communication and Managing Expectations&lt;/h3&gt;

&lt;p&gt;Recently, I did some integration work with a third party vendor.  They were developing their side of the integration at the same time as us. Not wanting to slow development and wait for their functionality, we decided to write a mock server and integrate with the host according to the spec from the third party vendor.  We received a story from the customer for that and proceeded to make the client for the third party system calls.  We finished our story.  In the demo portion of the iteration planning meeting, we could only demo against our mock server.  This caused some nervousness in the customer (rightly so). I replied, &amp;#8220;Once their side of the system is done, we should be able to send our calls across.&amp;#8221;  Then we received three more similar stories, but different system calls.  We did them, removed the duplication and felt really good about the job we did.  The came their test server.&lt;/p&gt;

&lt;p&gt;Nothing worked!  There were all sorts of communication problems, questions about who implemented the system to what spec, and political questions.  Despite us thinking we were in the right, the stories were signed and the customer said, &amp;#8220;Well, you said this would work.&amp;#8221;  At first, I tried to communicate the reason why it didn&amp;#8217;t work, and how we can move forward.  We came to spend a lot of time on this, and the team felt the integration should be its own story.  The customer pushed back, &amp;#8220;Well, you said this would work.&amp;#8221;  There was some tension, because both sides were right.  We didn&amp;#8217;t believe it was our fault it didn&amp;#8217;t work (neither did the customer), but we told them it would.  Rather than let out the righteous indignation I was feeling, one of the team members mentioned.&lt;/p&gt;

&lt;p&gt;&amp;#8220;We should not have assured you it would work.&amp;#8221;&lt;/p&gt;

&lt;p&gt;That one line brought the real problem to the front for both sides.  We didn&amp;#8217;t know whether it would work or not, just that we wrote the right code to the specification we had at the time.  That code by itself has no value to the customer without it working, though.  Once that line was said, everyone in the room sat for a second, then understood.  The expectation over defect versus behavior was out of sync.  A little ownership over the defect was all we needed to ease the tension and move forward.  It is unproductive to get stuck in a stalemate of expectations.  When in doubt, the customer is always right.&lt;/p&gt;</description>
      <pubDate>Tue, 24 Jun 2008 06:13:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:cb09b310-eb94-4da9-9200-f289d8416d74</guid>
      <author>Paul Pagel</author>
      <link>http://blog.8thlight.com/articles/2008/06/24/some-thoughts-on-software-defects</link>
      <category>Craftsmanship</category>
      <category>Process</category>
      <category>Paul</category>
      <category>Bugs</category>
    </item>
    <item>
      <title>Promises Promises</title>
      <description>&lt;p&gt;&lt;em&gt;&amp;#8220;Under Promise, Over Deliver&amp;#8221;&lt;/em&gt; (origin unknown)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&amp;#8220;How are you going to get a reputation as a miracle worker if you tell the Captain the actual amount of time it will take?!?!&amp;#8221;&lt;/em&gt; Scotty on Star Trek&lt;/p&gt;

&lt;p&gt;I used to think the first statement was a just a more cynical restatement of the second, which is just a con job.  Tell the boss you can&amp;#8217;t have it done until Tuesday, finish on Friday, play golf Monday morning and deliver Monday afternoon.  Everybody wins right?  Except it&amp;#8217;s fundamentally dishonest.  Lately I&amp;#8217;ve come to realize I do the first one every day, and I hope never do the second.&lt;/p&gt;

&lt;p&gt;I have three step-children and I rarely promise them anything.  It&amp;#8217;s not because I&amp;#8217;m a horrible father, but because a promise is a fundamentally special thing.  I promised my wife I&amp;#8217;d stay with her until the end of time, now that&amp;#8217;s a promise.  If I promise I know damn well I will do what I said, and I can&amp;#8217;t have excuses.  Now I&amp;#8217;m naturally a very busy and easily distracted person so I know that if I promise too much, I&amp;#8217;ll deliver a lot of disappointment.  Instead I say &amp;#8220;maybe&amp;#8221; because it&amp;#8217;s the honest answer.  There is a huge difference between &amp;#8220;I promise&amp;#8221; and &amp;#8220;I&amp;#8217;ll try&amp;#8221;, and I doubt &amp;#8220;I&amp;#8217;ll do my best&amp;#8221; would have been an acceptable answer on my wedding day.&lt;/p&gt;

&lt;p&gt;So what the heck does this have to do with development?  I was thinking about iterations, and how the stories taken on are really a &lt;em&gt;promise&lt;/em&gt; to the customer, but we don&amp;#8217;t always treat them that way.  A lot of teams, including at times our  own unfortunately, instead Over Promise and Under Deliver.  It&amp;#8217;s usually done with the best of intentions because the customer wants more stuff done.  You know what?  My kids want to go to Dunkin Dounuts tomorrow, but I don&amp;#8217;t know if I can take them so I won&amp;#8217;t make a &lt;em&gt;promise&lt;/em&gt;.  We should look at our iterations the same way.  I&amp;#8217;m not talking about padding estimates like Scotty does, but what I&amp;#8217;m talking about is avoid the traps of wishful-thinking when estimating stories.  Specifically three things I see all the time.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Talk Down&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The talk down usually happens when one or two team-members are out of sync with the rest of the group on the high side, but can also happen when the team&amp;#8217;s points cover a range from small to large.  Higher estimates mean higher risk and yet the lower estimates usually win this &amp;#8220;battle.&amp;#8221;  There are two kinds of ways team members (and sometimes customers) encourage other developers down from their estimates, one good and one bad.  I&amp;#8217;ll illustrate with two stories where I was out of step with the group.&lt;/p&gt;

&lt;p&gt;Right after I joined 8th Light we had a store that involved converting text to base64.  I was inexperienced with Ruby and hadn&amp;#8217;t done this before, so my estimate was higher than the others.  At some point somebody said, &amp;#8220;Eric that&amp;#8217;s a method that&amp;#8217;s built into ruby, it&amp;#8217;s one method&amp;#8221; and I sheepishly shrank my estimate.  Hey I used to be a C++ programmer, cut me some slack!  The point is this time being talked down made perfect sense.  I didn&amp;#8217;t know something, somebody told me the answer, and we fixed it.&lt;/p&gt;

&lt;p&gt;Much more recently we had a story that involved showing the difference between two objects in the database.  In this case I was again much higher than the group.  I explained I had no idea how we would do this in a way that would satisfy the customer, but the team thought using the Unix diff tool on the already existing XML Output would be fine.  With something feeling wrong in my gut I reluctantly brought down my estimate.  A few minutes later Micah and I started on development, and discovered the problem.  A few small changes to a product resulted in four pages of indecipherable XML differences.  The story was scrapped, fortunately quickly before any time was invested in it.&lt;/p&gt;

&lt;p&gt;Now what was different between the two times?  In the first there was a concrete and clear way that my estimate was wrong.  Yea!  In the second there was still an icky feeling in my gut, yet I budged.  Why?  Because I don&amp;#8217;t want to hold up my team, I don&amp;#8217;t want to look stupid, and most importantly I failed to articulate my concerns with the approach given.  You see for years I worked with InstallShield Developer, and for a while now they&amp;#8217;ve saved their file format for projects as XML.  But when two people attempted to work on the same file, then merge, it was almost always a nightmare, and this was with tools that just did diffing like Araxis Merge.  Our quickly done tool to solve an immediate business need had little chance of success, but I was uncomfortable saying so.  The moral:  Don&amp;#8217;t let yourself be talked down unless you really feel talked down.  The team wasn&amp;#8217;t wrong for stating how they felt, I was wrong for failing to articulate the issues I had.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The extra points&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Occasionally as a team you really want to impress the customer, and they&amp;#8217;re in a hurry.  So maybe you take on a few extra points.  I don&amp;#8217;t feel this needs much explanation, don&amp;#8217;t &amp;#8220;hope&amp;#8221; you can get it all done.  Use your velocity, trust your estimates, and KNOW you&amp;#8217;ll get it all done.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &amp;#8220;Ambitious&amp;#8221; Iteration  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sometimes your iteration feels just&amp;#8230;off.  You&amp;#8217;ve taken on the same number of points as the previous iteration, but it feels in your gut like it&amp;#8217;s too much.  Now this is where the &lt;em&gt;promise&lt;/em&gt; kicks in.  Would you promise your loved ones something that in your gut you just didn&amp;#8217;t feel like you could deilver?  Than don&amp;#8217;t do it to your customer.  When the iteration feels ambitious try to put it in concrete terms, maybe you&amp;#8217;ve been the victim of the &amp;#8220;talk down.&amp;#8221;&lt;/p&gt;

&lt;p&gt;Remember a promise is a very important, even sacred, thing.  It should not be taken on unless you are absolutely sure you can do it.  Try saying to yourself before an iteration, &amp;#8220;We promise to get all this done.&amp;#8221;  If that causes a shiver to go down your spine there&amp;#8217;s a good chance you really hope you&amp;#8217;ll get it all done, and maybe should take a bit off the board rather than be proven right later.&lt;/p&gt;</description>
      <pubDate>Sun, 18 May 2008 01:31:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:748f5a9c-483e-4ed8-9ae7-2d6fb6cace3f</guid>
      <author>Eric</author>
      <link>http://blog.8thlight.com/articles/2008/05/18/promises-promises</link>
      <category>Craftsmanship</category>
      <category>Eric</category>
    </item>
    <item>
      <title>Agile Production Support: Final brush strokes</title>
      <description>&lt;p&gt;There is no perfect software.  At least I have never seen it.  Bugs and minor feature changes are indications people are using your software.  Real users hit a system in ways that no control group can, and on non-critical applications, this is the best way to test your software.  Let people use it and see what happens.  This is goes in line with the agile philosophy of release early and often.  Get your application out there as fast as you can, so you can mold the finishing touches around the real users experience rather than a faux-environment.&lt;/p&gt;

&lt;p&gt;There is some conversation about what is and what is not a &#8220;bug&#8221; in the software world.  That is not a conversation I would like to partake in here, so lets call both bugs, integration items,  minor feature enhancements, and things that fall through the cracks of development tweaks.  It doesn&amp;#8217;t matter what the nature of origin is, these are all things that MUST get done.&lt;/p&gt;

&lt;p&gt;After the release of one of our products, a load of tweaks came in from the customer.  As proud craftsman, we decided tweaks were our responsibility, and we would take them on in addition to our normal iteration.  So we started to do them, to the detriment of our iteration.  We accomplished only about half of our iteration&amp;#8217;s velocity.  &lt;/p&gt;

&lt;p&gt;The next iteration, much to our surprise, we were twice as busy with production support.  This is about the time that a developer looses a little faith.  What did we miss?  Is this high quality software we are writing?  So we lost even more velocity when it came to iteration 2 after the release. Also, the customers were now unable to accurately plan new features moving forward due to an unstable velocity.&lt;/p&gt;

&lt;p&gt;It is so hard to predict or estimate production support and tweaks.  However, we needed to be able to so that the production support didn&amp;#8217;t leave such a footprint in the project.  It felt and looked like we were not getting very much done, even though we were working harder than usual.  It was the time being put into a vacuum and being unaccounted for that was troubling the project.  It also had a negative effect on the morale of the team.&lt;/p&gt;

&lt;p&gt;We came up with a card, we call the &#8220;Production Support Card.&#8221;  The amount of the iteration&amp;#8217;s velocity this card took up was calculated by the amount of time we spent on production support the previous iteration averaged with the amount of time allocated for that iteration(sound like a familiar formula?).  It is added as a card to the next iteration.  If the developers only spend 6 of the 10 points on production support, it is expected that they will complete 4 points worth of stories, which are automatically entered in the iteration.  For the first iteration where it becomes apparent that we need a production support card, we set the point value of the card at 0 and track how much time we spend, bumping out of the iteration the least important stories if needed.&lt;/p&gt;

&lt;p&gt;So, what does this tracking buy you, if you have to spend the same amount of time on tweaks?  First, it allows transparency to the customer about what you are working on that week.  When they see your normal velocity of 20 points turn into 5 points, they have a right to be worried.  When you say, in a defeated voice &#8220;we were fixing bugs,&#8221; they also have a right to worry about the stability of the code you have been writing, even though this spike in minor changes to the application is a part of the normal process.&lt;/p&gt;

&lt;p&gt;Second, it raises the moral of the team, because they are working towards a specific goal, to remove the production support cards from the iteration.  Also, we get the satisfaction of maintaining a velocity in points, which is something we know so well it is hard to work without.&lt;/p&gt;

&lt;p&gt;It takes a few iterations, and the team squeezes the life out of the production support card, putting you back on track.  After those iterations, the footprint goes from sasquatch to mini-me.&lt;/p&gt;

&lt;p&gt;It also helps the customer plan around production support.  Their time lines and release dates are made from a projection of feature difficulty to development&amp;#8217;s velocity.  Over a long period of time, the velocity normalizes, and it hurts the projections to have hiccups.  If you have production support data, you can predict about how much time around a release you will loose on the initial release of brand new development.&lt;/p&gt;</description>
      <pubDate>Mon, 18 Feb 2008 14:39:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:b81e3e34-826b-4e54-bc8b-71f9acbc891a</guid>
      <author>Paul Pagel</author>
      <link>http://blog.8thlight.com/articles/2008/02/18/agile-production-support-squashing-release-bugs</link>
      <category>Craftsmanship</category>
      <category>Coding</category>
      <category>Process</category>
    </item>
    <item>
      <title>Peer Pressure</title>
      <description>&lt;p&gt;One of the famous studies on peer pressure was the &lt;a href="http://en.wikipedia.org/wiki/Stanford_prison_experiment"&gt; Stanford prison experiment&lt;/a&gt;.  A group of average people were selected to play either a prisoner or prisoner guard.  As the participant became engrossed in the role, the peer pressure from other participants quickly degraded their moral compass.  The small negative actions lead the groups to quickly fall into patterns of behavior which were unlike their own.&lt;/p&gt;

&lt;p&gt;I see peer pressure work in the same manner for good all the time.  Since software is written by teams, the software is often a reflection of how well the team works together more so than individual skills of the developers.  When you have a group of developers who entice each other to do good work, the outcome can be great work.&lt;/p&gt;

&lt;p&gt;Creating a culture of positive peer pressure is about doing lots of little things.  Small positive actions will lead the team to create positive patterns of behavior.  &lt;/p&gt;

&lt;p&gt;Here are different techniques which have worked for different teams I have been a member.  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Name your team, not just your project.  This gives me as a developer some self-identity as part of a team.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Greet your team mates each day.  We shake hands to show respect each day for each team member.  We generally start and finish each day with a &lt;a href="http://blog.8thlight.com/articles/2007/07/19/shake-things-up"&gt;handshake&lt;/a&gt;.  This can alleviate tense situations by itself, as personal contact often does.  No chance to avoid a team member.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do some activity everyone enjoys.  Anything from eating lunch together to playing a competitive game as a team.  We have played basketball together.  Being competitive with my team gives me pride in the team, win or loose.  Get to know your team members.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We keep a good supply of coffee, tea, snacks, and gum for each other as gifts.  This act of giving to the team promotes the selflessness any team needs from its members top succeed.  There are different levels of skill on a team, but each team member is important.  It is difficult to write software for any project of magnitude without the full contribution of each member of the team.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Switch pairs pairs often.  When you work with everyone on the team, you feel closer to everyone on the team.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Talk while you pair.  Reading someone&amp;#8217;s mind takes more effort than talking.  Talking aloud also is a great way of brainstorming.  Pair communication starts when words become sound waves.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These small things can improve the accountability and creativity to make a well functioning team.  A happier team will become a creative and productive team.  A team that has a strong sense of togetherness will lift each other up when needed.  I find myself more willing to step up to daily challenges with the support of the team on my side.  There is no place for apathy and complacency in a team which has pressure to succeed.&lt;/p&gt;

&lt;p&gt;When the team succeeds, as positive teams often do, it becomes a group success and brings the entire team great pride.  A team which pressures each other to do better can turn an average developer into a great developer.&lt;/p&gt;</description>
      <pubDate>Fri, 18 Jan 2008 16:18:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:d8395950-2ba2-4b33-a03d-d986e322956a</guid>
      <author>Paul Pagel</author>
      <link>http://blog.8thlight.com/articles/2008/01/18/peer-pressure</link>
      <category>Craftsmanship</category>
      <category>Etiquette</category>
    </item>
    <item>
      <title>That's Not Agile! </title>
      <description>&lt;p&gt;&lt;em&gt;Removing the religion from software development&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I had feared those words.  I&amp;#8217;d often been tempted to use them myself, but something told me I shouldn&amp;#8217;t.  As I sat in a planning game on a previous job, I heard the words.  They still make me cringe.  &#226;&#8364;&#339;We can&amp;#8217;t do it that way.  That&amp;#8217;s not Agile.&#226;&#8364;&#157;&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m a big fan of agile.  I&amp;#8217;ve long been convinced that the agile movement truly is uncovering ways to do software better.  It&amp;#8217;s revolutionizing the way that companies approach software.  At 8th Light we&amp;#8217;re using Agile to help us deliver the highest quality software possible to our clients.  I wonder though, how exactly something can be classified as un-agile?&lt;/p&gt;

&lt;p&gt;What is Agile anyway?  Can it be measured?  Can one thing really be more agile than another?  If I had a yardstick and I was going to measure Agile,  what would the markings be along the stick?  What units would I use?  &amp;#8216;Points&amp;#8217; has already been taken, so maybe I should invent a new unit.  I&amp;#8217;ll call it the &lt;em&gt;Agl&lt;/em&gt;.  For every hour of pair programming an organization does it gets 10 &lt;em&gt;Agls&lt;/em&gt;.  Unit tests are worth 1 &lt;em&gt;Agl&lt;/em&gt; each.  Acceptance tests get 100 &lt;em&gt;Agls&lt;/em&gt;.  I&amp;#8217;d use negative values too.  For every page of documentation written, an organization looses 40 &lt;em&gt;Agls&lt;/em&gt;, but the group running in iterations gets 1000 &lt;em&gt;Agls&lt;/em&gt;.  One week iterations are worth 2000.&lt;/p&gt;

&lt;p&gt;The problem is that as a development organization adopts Agile and buys into various processes and practices, the temptation quickly grows to covert that development process into religion.  &#226;&#8364;&#339;We can&amp;#8217;t do code reviews, that&amp;#8217;s not Agile!&#226;&#8364;&#157;  &#226;&#8364;&#339;We don&amp;#8217;t write documents, that not Agile!&#226;&#8364;&#157;  What may start as genuine excitement and passion can quickly become religious dogma when those involved in the process lose sight of why they do what they do.  Let me say that while I am a religious guy, I hate religion.  Religion, to me, means action without thought:  doing or saying something because that is the thing that you are supposed to say or do.  I&amp;#8217;d rather call what I have faith.  Faith comes from beliefs or values held and turned into day-to-day living.&lt;/p&gt;

&lt;p&gt;Since we are talking about religion, I thought I story from the Bible might be appropriate.  Jesus and some friends were sitting down to eat when some super-religious folks showed up and started berating Jesus for letting his friends eat with dirty hands.  These religious-types had established an elaborate ceremony for washing hands that had very little to do with removing bacteria.  Jesus comes down hard on these guys for exchanging true principles for religious dogma.  He responds by handing them the principle that does really matter.  &#226;&#8364;&#339;Nothing outside a man can make him &amp;#8216;unclean&amp;#8217; by going into him. Rather, it is what comes out of a man that makes him &amp;#8216;unclean.&amp;#8217; &amp;#8221; (1)  Here one of the most well-known religious leaders of all time shows his followers that it is the true principles that matter, not the religious practices or rules.&lt;/p&gt;

&lt;p&gt;In software planning situations and day to day development we are faced with hundreds of little decisions about how to do our work.  Should we throw this code out and start building the whole thing from scratch?  Should we iteratively improve the code and slowly arrive at a better design?  Do I write a test for this code?  Should I pair with someone or just write this myself?  When making these decisions we need guidance, something to help us understand if one thing is better than another.  &#226;&#8364;&#339;Agile&#226;&#8364;&#157; is not that thing.  Agile is just the label put on a whole spectrum of practices.  Those guiding lights we need are principles.  Principles are the domain-specific set of beliefs that an organization has adopted.  They reflect what the organization values.  I think it&amp;#8217;s possible that many organizations get swept up in the excitement and freedom of agile practices that they skip this critical step of establishing the their principles.  Kent Beck lays out a set of principles for extreme programming.  Baby Steps, Failure, Quality, Redundancy, Opportunity, Flow, Reflections, Diversity, Improvement, Self-Similarity, Mutual Benefit, Economics, and Humanity(2) help direct an organization when it is trying to figure out the how of software development.  Whenever I&amp;#8217;ve heard Kent speak, he always comes back to the principles and values behind the practices in extreme programming.  UncleBob has established a great set of principles that help us discuss and qualify designs.  The Single Responsibility Principle, the Open-Closed Principle, the Don&amp;#8217;t Repeat Yourself Principle(3), and others are guiding lights for design decisions.  These give teams concrete evaluators that keep design discussions productive and prevent them from deteriorating into contests of dogma.  Alistair Cockburn writes about 7 properties in Crystal Clear that can be translated into principles:  Frequent Delivery, Reflective Improvement, Osmotic Communication, Personal Safety, Focus, East Access to Expert Users, Automated Tests, Configuration Management, and Frequent Integration (4).  I don&amp;#8217;t want to delve too deeply into these principles here, but an organization in the process of adopting agile should.  Each of these &lt;a href="http://agilemanifesto.org/" target="_new"&gt;manifesto&lt;/a&gt;-signing authors have explained these principles wonderfully in their books.&lt;/p&gt;

&lt;p&gt;At issue in my planning meeting was whether or not to require a certain feature in a third party library for which we are shopping.  At the time, we didn&amp;#8217;t have a need for this feature, but we anticipated that it may show up an upcoming story.  The person who spoke up saying &#226;&#8364;&#339;That&amp;#8217;s Not Agile&#226;&#8364;&#157; was really referencing the XP value of simplicity.  &#226;&#8364;&#339;Solve today&amp;#8217;s problems today and tomorrow&amp;#8217;s problems tomorrow.&#226;&#8364;&#157;(2)  This would suggest that one shouldn&amp;#8217;t take on additional complexity until it is needed.  However, when purchasing a third party library, perhaps the principle of Economics might suggest that paying a little more for this library today will save a lot of time and money later and potentially avoid purchasing the library twice.  Which is the right decision?  I don&amp;#8217;t know, but after having agreed on the principles that guide our decisions, we can have the conversations around those principles and pick a way forward.&lt;/p&gt;

&lt;p&gt;An organization transitioning to some flavor of agile ought to first clarify what its organization&amp;#8217;s principles are.  Read Beck or Martin or Cockburn or your favorite Agile author and choose the principles that you want to live by.  Second, make the principles visible.  Put them up on a wall.  Have meetings where team members present a principle.  Refer to them as you pair.  Write about them, read about them, explore them.  At 8th Light, we&amp;#8217;ve put them on our &lt;a href="http://www.8thlight.com/main/about"&gt;website&lt;/a&gt;.  Revisit them when starting a new project.  If you are working with a consultant, ask them to take you through a values and principles exercise.  If you are a consultant, please don&amp;#8217;t miss this critical part of transitioning to Agile.  Making your principles part of the every day vernacular of your organization will take you to a place where design and planning discussions stay productive and you&amp;#8217;ll hopefully never hear &#226;&#8364;&#339;That&amp;#8217;s not Agile!&#226;&#8364;&#157; again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;End Notes:&lt;/strong&gt;&lt;br&gt;
1) &lt;a href="http://www.biblegateway.com/passage/?search=Mark%207:1-23;&amp;amp;version=31" target="_new"&gt;Mark 7:1-16&lt;/a&gt;&lt;br&gt;
2) Beck, Kent. &lt;u&gt;Extreme Programming Explained: Embrace Change (2nd Edition).&lt;/u&gt; Addison-Wesley Professional.  2004.&lt;br&gt;
3) Martin, Robert C. &lt;u&gt;Agile Software Development, Principles, Patterns, and Practices.&lt;/u&gt; Prentice Hall. 2002.&lt;br&gt;
4) Cockburn, Alistar.  &lt;u&gt;Crystal Clear: A Human-Powered Methodology for Small Teams&lt;/u&gt; Addison-Wesley Professional.  2004.&lt;br&gt;&lt;/p&gt;</description>
      <pubDate>Sun, 05 Aug 2007 11:51:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:63e97027-6a49-4d5b-adae-b5de8903dd75</guid>
      <author>Doug Bradbury</author>
      <link>http://blog.8thlight.com/articles/2007/08/05/thats-not-agile</link>
      <category>Craftsmanship</category>
      <category>Process</category>
      <category>doug</category>
      <category>bradbury</category>
      <category>agile</category>
      <category>principle</category>
      <category>value</category>
      <category>religion</category>
      <category>development</category>
    </item>
    <item>
      <title>Shake Things Up</title>
      <description>&lt;p&gt;The most widespread and common greeting in the American culture is the handshake.  Handshakes are shared between anyone meeting for the first time, to finalize a business deal, and to end a conversation.  I spend a good deal of time around 2nd and 3rd generation Korean-Americans.  In Korean culture, like many Asian cultures, the handshake is replaced by bowing.  In these transitional immigrant generations, the bow and the handshake have been merged into one awkward action.  I was recently walking through the reception line at the wedding of 2 second generation Korean-Americans and I went to greet the 1st generation parents.  I was going to try to be respectful and offer a bow instead of a handshake, but just as I began to bend, a large hand was thrust out in front of me.  I felt myself lucky that I didn&amp;#8217;t end up with the guys finger in my nose.&lt;/p&gt;

&lt;p&gt;One of the things I immediately noticed as I began working with the craftsmen at 8th Light is that everyday I walked into the office, every member of the team shook my hand.  As each team member left for the day, he shook the hand of everyone who was left.  I expect this on the first day, as you always shake hands with everyone on your first day.   On the second day, I thought maybe they had all forgotten that they met me yesterday. As I realized that this would continue, It really made me start thinking.  &lt;/p&gt;

&lt;p&gt;As I went to work with another team for a little while I came to really miss the handshakes.  I&amp;#8217;d walk in the morning and maybe get an eyebrow flash from my teammates.  A &#226;&#8364;&#339;Hello&#226;&#8364;&#157; would come if I was really lucky.  I decided enough was enough, so I just started shaking hands.  At first, I got some really weird looks and was left hanging a few times.  The looks seem to ask &#226;&#8364;&#339;Why are you shaking my hand, we see each other every day.&#226;&#8364;&#157;  But slowly it started to catch on.  My  teammates began to expect a handshake from me at the start and end of each day.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s what I think these bookend handshakes do for a team.
First, believe it or not, a handshake becomes an intimate gesture.  It communicates genuine care and concern for each other.  To me it&amp;#8217;s a physical expression of the XP value of Humanity.&lt;/p&gt;

&lt;p&gt;Second, it communicates respect.  Sometimes design and project discussion can get very heated, especially if you are working with a passionate group of people.  If your days begin and end with a handshake, everyday is bookended by a statement of mutual respect.  There is a proverb that exhorts people to &#226;&#8364;&#339;Not let the sun go down on your anger.&#226;&#8364;&#157;  That handshake is a way to let go any residual anger from the day and commit the next to dealing with each other with respect.&lt;/p&gt;

&lt;p&gt;Third, It&amp;#8217;s an honest statement about the hours you are working and the time you are putting in on the project.  In a handshake-free environment, if I&amp;#8217;ve had to leave the office early, I&amp;#8217;d usually try to sneak out without anyone noticing.  At the time I was in an office culture that promoted flexible hours, but you always felt like people were watching you to make sure you were still putting in your hours.   I always put my time in, but because I sometimes played with my schedule quite a bit, I was always afraid that someone would perceive my time poorly.  When an handshake begins and ends your day, you are being direct and up front about your time.  You are communicating at the start of the day &#226;&#8364;&#339;I&amp;#8217;m here, I&amp;#8217;m ready to work&#226;&#8364;&#157; and at the end of the day &#226;&#8364;&#339;I&amp;#8217;m gone, my day is over.&#226;&#8364;&#157;  There are no apologies, no sneaking in or out, and no elaborate time-tracking system.  Your teammates trust that you are working as much as you should be and you are not likely to try and cheat you company or your team out of your time week-to-week. &lt;/p&gt;

&lt;p&gt;Try it in your team.  It&amp;#8217;s a morale boosting behavior that will cost a team nothing to implement, but will be one baby step to improving the strength and productivity of the team.&lt;/p&gt;</description>
      <pubDate>Thu, 19 Jul 2007 18:55:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:e51b03d9-144a-4ce0-85a8-ab3a3e4b74c7</guid>
      <author>Doug Bradbury</author>
      <link>http://blog.8thlight.com/articles/2007/07/19/shake-things-up</link>
      <category>Craftsmanship</category>
      <category>Process</category>
      <category>Etiquette</category>
      <category>doug</category>
      <category>bradbury</category>
      <category>handshake</category>
      <category>team</category>
      <category>value</category>
      <category>etiquette</category>
    </item>
    <item>
      <title>Something new, every day</title>
      <description>&lt;p&gt;Last December I went to to StarEast in Orlando because my fiancee is a tester and I well, I like sun.  While there I picked up the book &lt;a href="http://www.pragmaticprogrammer.com/titles/pad/"&gt;Practices of an Agile Developer&lt;/a&gt; and was particularly struck by the practice to keep a &amp;#8220;Solutions Log.&amp;#8221;  The way a solutions log works is simple.  Every time you find a solution to a problem you write it down, and later when you are confronted by a similar problem you have a reference.  &amp;#8220;Gee Whiz what a great idea!&amp;#8221; I thought to myself, because I think to myself like Beaver Cleaver, &amp;#8220;this way when Jim asks me about that bug I solved two weeks ago, I&amp;#8217;ll know &lt;em&gt;exactly&lt;/em&gt; what to tell him, instead of saying &amp;#8220;uhhh, err, yeah I sorta kinda remember&amp;#8230;&amp;#8221;  It really was an amazing revelation, seeing as how I hadn&amp;#8217;t met Jim yet.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://blog.8thlight.com/files/2007-06-21_genius_hat.jpg" alt="genius_hat" title="" style="float:left"/&gt;
Then I got home and subscribed to &lt;a href="http://www.agiledeveloper.com/blog/PermaLink.aspx?guid=d2754a12-8f7c-4406-a4ad-92dca4c6942d"&gt;Venkat&amp;#8217;s blog&lt;/a&gt; where he recommended &lt;a href="http://www.tiddlywiki.com/"&gt;TiddlyWiki&lt;/a&gt; for keeping this list.  If you&amp;#8217;re unfamiliar with TiddlyWiki it&amp;#8217;s an extremely cool browser-based personal note-taking tool that works entirely via JavaScript and CSS.  You fire up your personal version of the html file, double click, and viola! there you have a note saved into the very document.  Best of all it&amp;#8217;s searchable even via regular expressions and plain text.  With this tool I was gonna be a solution mastermind!  People will ask me for that bug I fixed 14 years ago and I&amp;#8217;ll be right there with my genius hat on and everything.  You do have a genius hat don&amp;#8217;t you?&lt;/p&gt;

&lt;p&gt;&lt;img id="dunce_cap" src="http://blog.8thlight.com/files/2007-06-21_dunce_cap.jpg" alt="dunce_cap" title="" style="float:right"/&gt;
How did it work out?  Roughly 18 months later I have a whopping&amp;#8230; 16 solutions, most of them written in the first week.  You know what I learned from this?  I &lt;em&gt;suck&lt;/em&gt; at keeping a solutions list.  The thing is I have no idea something is a solution to a recurring problem, until I come upon it a second time!  What I need is a way to psychically determine what the solutions I&amp;#8217;m going to need in the future are, and identify them.  Um&amp;#8230;.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve decided on a different option, which I think fits in well with the craftsmanship approach of perpetual learning.  Since joining 8th Light I&amp;#8217;ve been lucky enough to learn enormous amounts in a short amount of time, with more on the way, but of course none of this is in my solutions list.  So instead of catching the realization that something is a solution,  I&amp;#8217;m going to write it all down.  I&amp;#8217;ve created a new list, and instead of calling it a Solutions List, it&amp;#8217;s my LearnANewThingEveryDay list.  Every day I&amp;#8217;m obligated to write a new note with something I&amp;#8217;d learned that day.  If a day goes by and I haven&amp;#8217;t learned something, I have to go learn something.   I&amp;#8217;ll read a book, find a great blog posting, try out a coding exercise, whatever.  For example today I have written down some things I didn&amp;#8217;t know about routing in rails.  Mundane stuff that people more experienced with routing already new such as the :path_prefix parameter.  What would be an otherwise fruitless day debugging now has a few little things I&amp;#8217;ve learned from it.  Will I ever search for that item?  I don&amp;#8217;t know - but the point is I can, so when Jim asks me how to get eric/is/the/coolest/blogger in front of all his links, I won&amp;#8217;t stand there scratching my head.  &lt;/p&gt;</description>
      <pubDate>Tue, 26 Jun 2007 05:49:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:3c4907fc-d4d7-4464-b7b6-72c05b22365f</guid>
      <author>Eric</author>
      <link>http://blog.8thlight.com/articles/2007/06/26/something-new-every-day</link>
      <category>Craftsmanship</category>
      <category>Eric</category>
    </item>
    <item>
      <title>Pair Me Up</title>
      <description>&lt;p&gt;I am a better pair than solo developer.  For me, software is a collaborative art from the start to the end.  Starting from the beginning of a project, where the developers need to collaborate with the customer s and stakeholders of the project to learn about the business domain.  Then working with the project manager for sorting priorities and deadlines to make the business goals realizable in the fastest amount of time.  Also development is collaboration, via pair programming, to produce a dialog between the developers on their vision of the implementation of this code.  The last part, pair programming, is what I would like to focus on.&lt;/p&gt;

&lt;p&gt;Having a pair has the traditional advantages of keeping disciplined and sharing the knowledge base.  That is a starting point, but pairing is quintessentially important to my process due to the diversity it provides.  A diversity of approach and implementation provide me with enough to perform at a highly creative and expressive manner.&lt;/p&gt;

&lt;p&gt;Since you are not driving the keyboard and control of the computer, there is more time for contemplating code you wrote and direction you are moving.  Most of my good ideas come from the time when someone else is typing.  Since I was just working on the practical, I have my head wrapped around the code, and since I am not responsible for typing, I can reflect in the abstract.  &lt;/p&gt;

&lt;p&gt;I have heard many places that a benefit of test driven development is that the tests force you to design the API of the objects you are using as someone would use them.  Well, pair programming, in compliment with &lt;a href="http://www.stickyminds.com/sitewide.asp?Function=WEEKLYCOLUMN&amp;amp;ObjectId=9101&amp;amp;ObjectType=ARTCOL&amp;amp;btntopic=artcol"&gt;programming ping-pong&lt;/a&gt;, forces your code to be clean.  When you write a test, it isn&amp;#8217;t you that makes it pass, so you have to think with expression and intent in mind.  So, you end up writing the test FOR your pair.  It becomes a form of writing, not just coding.  &lt;/p&gt;

&lt;p&gt;Sometimes, the test needs to be explained.  While explaining something to a pair, your test must hold up your own arguments.  Often times when I come to explain something I just wrote, I think of a better way to do it.  Explanation is the best form of validating you understand where you are going well.&lt;/p&gt;

&lt;p&gt;Also, pairing is how I learned most of my developer personality.  Taking bits and pieces of the traits of my pairs through years of pairing.  My style is a composite of pairing with various mentors and peers of mine.  It has shown me how people approach this craft.&lt;/p&gt;</description>
      <pubDate>Thu, 14 Jun 2007 08:08:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:89c538c1-ddb0-430d-ba14-49ee401b91e6</guid>
      <author>Paul Pagel</author>
      <link>http://blog.8thlight.com/articles/2007/06/14/pair-me-up</link>
      <category>Craftsmanship</category>
      <category>Coding</category>
      <category>Process</category>
      <category>Testing</category>
    </item>
  </channel>
</rss>
