<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Joel Helbling's Blog</title>
    <link>http://www.joelhelbling.com/rss/</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>What was Joel thinking?  Find out here.</description>
    
    
        <item>
          <title>Some Thoughts About TDD and TAD</title>
          <description>&lt;p&gt;An essay I wrote back in late &amp;#8217;09, titled &lt;a href=&quot;http://www.joelhelbling.com/essays/tdd-is-dead-long-live-tdd/&quot;&gt;&lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt; is Dead; Long Live &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt;&lt;/a&gt; has picked up some comments after all this time.  Commenter &amp;#8220;Shmoo&amp;#8221; made an interesting point, essentially that all my arguments in favor of &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt; were really just arguments in favor of &lt;em&gt;unit tests&lt;/em&gt;, and could just as validly build the case for a &lt;em&gt;test-after&lt;/em&gt; style of unit testing.  Shmoo writes:&lt;/p&gt;
&lt;blockquote style=&quot;font-style: italic;&quot;&gt;
&lt;p&gt;All good points, Joel, except that they have little to do with &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt;, and more to do with unit testing (before or after the fact).&lt;/p&gt;
&lt;p&gt;&amp;#8220;&lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt; As Kind Teacher&amp;#8221; &amp;#8211; except for the first line, where you mention, &amp;#8220;Test-first,&amp;#8221; all the rest applies to test-after development (&lt;span class=&quot;caps&quot;&gt;TAD&lt;/span&gt;).&lt;/p&gt;
&lt;p&gt;&amp;#8220;&lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt; As Dopamine Drip&amp;#8221; &amp;#8211; the green bar rush you get here is the same in &lt;span class=&quot;caps&quot;&gt;TAD&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;&amp;#8220;&lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt; As Brain Girdle&amp;#8221; &amp;#8211; everything here applies to &lt;span class=&quot;caps&quot;&gt;TAD&lt;/span&gt; (indeed the, &amp;quot; &amp;#8230; tests make it easier for me to re-orient myself to my old code &amp;#8230;&amp;quot; has even less to do with &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt;).&lt;/p&gt;
&lt;p&gt;&amp;#8220;&lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt; as Scrooge&amp;#8221; &amp;#8211; as you say yourself, &amp;#8220;When I code without tests, I might end up rowing upstream in a gold-plated dinghy &amp;#8230;&amp;#8221; This clearly applies to &lt;span class=&quot;caps&quot;&gt;TAD&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;&amp;#8220;&lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt; As SmellOVision&amp;#8221; &amp;#8211; As you say, &amp;#8220;&amp;#8230; you find that you’re having a really hard time writing one particular test. 9 out of 10 Pragmatic Press authors agree this is a strong indication that your code could use some rethinking.&amp;#8221; That applies precisely to &lt;span class=&quot;caps&quot;&gt;TAD&lt;/span&gt; as it does to &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;None of your advantages is specifically related to writing the tests before the code.&lt;/p&gt;
&lt;p&gt;All you&amp;#8217;ve done is praise testing.&lt;/p&gt;
&lt;p&gt;Didn&amp;#8217;t Naresh pick you up on this?&lt;/p&gt;
&lt;p&gt;/ Shmoo_&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You make some interesting points, Shmoo.  I hadn&amp;#8217;t really considered the &lt;strong&gt;Test-After&lt;/strong&gt; approach as a desirable alternative to &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt;.  The reason for my &amp;#8220;blinkered&amp;#8221; focus on &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt; is due to my early experience with &lt;span class=&quot;caps&quot;&gt;TAD&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;I began learning unit testing and &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt; in the middle of a project, and so for new code I was doing &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt;.  But I really wanted coverage of all the code I had written before learning anything about unit tests, and so I &lt;em&gt;also&lt;/em&gt; undertook to write unit tests for all the old stuff.&lt;/p&gt;
&lt;p&gt;Those two exercises, done in parallel (&lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt; &amp;amp; &lt;span class=&quot;caps&quot;&gt;TAD&lt;/span&gt;) really sold me on &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt;.  The two experiences were dramatically different.  I do not think I exaggerate to say that the &lt;span class=&quot;caps&quot;&gt;TAD&lt;/span&gt; work was an order of magnitude more difficult and time-consuming than the &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt; work.  And of course my TDD&amp;#8217;d code emerged with a better, more testable design.&lt;/p&gt;
&lt;p&gt;That last sentence may be the crux of the difference between the two.  I find that &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt; leads to better code than &lt;span class=&quot;caps&quot;&gt;TAD&lt;/span&gt;, and I also find that &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt; is a better teacher of good code design than &lt;span class=&quot;caps&quot;&gt;TAD&lt;/span&gt;.  The &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt; workflow seems (for me) to &lt;em&gt;unfold&lt;/em&gt; good design as I go along, whereas, writing tests after just jabs me in the ribs to tell me that I already got it wrong.&lt;/p&gt;
&lt;p&gt;Furthermore, &lt;span class=&quot;caps&quot;&gt;TAD&lt;/span&gt;, to be really effective, requires a kind of attention and discipline which, frankly, I don&amp;#8217;t have in spades.  It is to easy to write code for 30 minutes, an hour, or half a day, before that nagging feeling that I need some more tests finally overcomes my conding-engrossed brain, and I shift gears and try to put some tests around the bridge to nowhere that I have been building.  &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt; ensures the testing is built-in, and once the habit is formed, I don&amp;#8217;t have to &lt;em&gt;remember&lt;/em&gt; to test; the testing and the coding quite naturally come up together.  For me, that&amp;#8217;s way, easier.&lt;/p&gt;
&lt;p&gt;This isn&amp;#8217;t to say that an &lt;em&gt;already&lt;/em&gt; mature, well disciplined developer mightn&amp;#8217;t do quite well with a test-after workflow.  But I find that &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt; is a fine ladder which is helpful in elevating the skills of developers through a wide range of skill levels.  I have been practicing it for a few years now, and I still find it helpful.  And the number of &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt;-practicing developers whose skill far exceeds my own encourages me not to lightly abandon the practice.&lt;/p&gt;</description>
          <pubDate>Wed, 28 Sep 2011 09:19:22 GMT</pubDate>
          <guid>http://www.joelhelbling.com/articles/2011/09/28/some-thoughts-about-tdd-and-tad/</guid>
          <link>http://www.joelhelbling.com/articles/2011/09/28/some-thoughts-about-tdd-and-tad/</link>
        </item>
    
        <item>
          <title>Google+ Will Win Because I'm Already Tired of It</title>
          <description>&lt;p&gt;Ok, so this is not a really &lt;em&gt;scientific&lt;/em&gt; barometer for the viability of &lt;strong&gt;Google+&lt;/strong&gt; (we always need more barometers), but try this one on for size:  &lt;em&gt;I&amp;#8217;ve been using Google+ for three weeks now, and I&amp;#8217;m feeling a bit burned out.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;To me this doesn&amp;#8217;t mean that Google+ is deficient, it means it&amp;#8217;s so good that it&amp;#8217;s grabbing a larger chunk of my attention than I can really sustain.  And I think that means it&amp;#8217;s a success.&lt;/p&gt;
&lt;p&gt;I remember when, years ago now, I discovered that I could use Twitter to troll for other folks with similar interests.  That was the day that Twitter became worthwhile to me, and I immediately spent several exhausting days building myself a micro-community around those interests.  And then suddenly I was completely fed up with it and had to take a break.  After that I pursued a more low-level, casual, occasional relationship with Twitter until a year or two after that, when I began more work on my personal brand.&lt;/p&gt;
&lt;p&gt;Onboarding Google+ has been easier.  Much, much easier.  It has been more exciting too.  But I am looking forward to things settling down a bit.  I am hoping I won&amp;#8217;t have to cross-post between Google+ and Twitter much longer, or at least I hope cross-posting gets easier (#g+).&lt;/p&gt;
&lt;p&gt;These exciting times remind me that I am not really part of the young wired generation.  I do not have the thumbs for constant texting, and my mind cannot endure the constant interruption stream which has become the norm for the Facebook generation.  I like to think I am hip, I strive to be current, but at the end of the day I see clearly that I need quiet.&lt;/p&gt;
&lt;p&gt;Eventually I came to a point where I ignored Twitter for days at a time, and then just jumped in for an hour or so.  And when I do pay attention, I use lists to provide some vague, gooey context to the stream.  You miss massive amounts of fascinating information that way.  But you stay sane.&lt;/p&gt;
&lt;p&gt;I will be playing around with notification settings in the next few days.  I&amp;#8217;m definitely planning to stay connected with Google+.  But I&amp;#8217;ll need to tailor the Google+ experience to be sustainable for me in order to do that.  From what I see so far, Google is already further ahead in that regard than either Facebook or Twitter.  And that is why Google+ is going to win.&lt;/p&gt;</description>
          <pubDate>Fri, 22 Jul 2011 17:24:21 GMT</pubDate>
          <guid>http://www.joelhelbling.com/articles/2011/07/22/google-will-win-because-im-already-tired-of-it/</guid>
          <link>http://www.joelhelbling.com/articles/2011/07/22/google-will-win-because-im-already-tired-of-it/</link>
        </item>
    
        <item>
          <title>What's So Wrong With Quick and Dirty Code?</title>
          <description>&lt;p&gt;The twittersphere and blogosphere have been burning up (at least in my corner of the social graph) with the topic of clean code vs expediency.  In essence, the question seems to be, &lt;em&gt;&amp;#8220;couldn&amp;#8217;t we deliver software faster by not worrying too much about clean code?&amp;#8221;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I think not.  Consider these trivial examples from domains with which we are (mostly) all familiar:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Could we not save a minute or so by not tying our shoes in the morning?&lt;/li&gt;
	&lt;li&gt;Isn&amp;#8217;t the kitchen more efficient if we never bother washing the dishes?&lt;/li&gt;
	&lt;li&gt;Who has time for car maintenance?  Isn&amp;#8217;t it faster if we just proceed to work riding on bare rims, with black smoke belching forth from under the hood?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These questions suggest obvious misperceptions, ones which functioning adults in the modern age easily recognize as dangerous.  But each of us had to learn avoid them at some point.  And there are human beings (called children) for which the attendant dangers may not be so apparent.&lt;/p&gt;
&lt;p&gt;The basic value proposition in QuickAndDirtyCode&amp;trade; that I&amp;#8217;m hearing is that it&amp;#8217;s faster.  But it&amp;#8217;s important to recognize that the risk in each of these mis-perceptions isn&amp;#8217;t merely of the moderate, inverse-linear kind.  If I&amp;#8217;m an idiot and think I don&amp;#8217;t need to tie my shoes when I go out, the danger to me is not merely that it will actually take &lt;em&gt;longer&lt;/em&gt; than if I &lt;em&gt;had&lt;/em&gt; tied them.  The danger is far worse: I could stumble on the stairs, injure myself, and impair my ability to go out for a long time.&lt;/p&gt;
&lt;p&gt;The risk in using unwashed dishes and utensils in the kitchen isn&amp;#8217;t simply that it actually takes longer to cook with them.  In point of fact it might be faster in some situations.  But there exists the very real risk of laying the entire family low with food poisoning, which is a major slowdown to many people, not just one.&lt;/p&gt;
&lt;p&gt;And if you drive your car on the rims, you&amp;#8217;ll be walking soon, &lt;em&gt;if you&amp;#8217;re lucky.&lt;/em&gt;  In the meantime, you&amp;#8217;ll lose time, equipment and maybe worse.&lt;/p&gt;
&lt;p&gt;The idea that quick, dirty and &amp;#8220;expedient&amp;#8221; coding edges past clean code in the short term is a terrifically naive one.  Software projects (and their several parts) tend to grow &lt;em&gt;when they are successful&lt;/em&gt;.  That&amp;#8217;s just what they do.  As the codebase grows, the risk in not writing clean code isn&amp;#8217;t merely that it ultimately may take a bit longer; dirty code can &lt;em&gt;sink a project.&lt;/em&gt;  Dirty code eventually dooms projects to one of two outcomes: a complete re-write, or total failure in the form of abandonment of the project&amp;#8217;s goals.  Clean code helps us steer clear of these two outcomes by offering us the chance to build better software on top of what we&amp;#8217;ve built in the past.&lt;/p&gt;
&lt;p&gt;So what do you do if you&amp;#8217;re new to software development, and clean code doesn&amp;#8217;t come naturally?  It seems clear to me that until we know enough to take the time to tie our shoes, we are not ready for the Big Time.  If we won&amp;#8217;t wash the dishes, we shan&amp;#8217;t do much cooking.  If we won&amp;#8217;t get the car fixed, we won&amp;#8217;t drive very far.  And if we don&amp;#8217;t learn to write clean code, we won&amp;#8217;t be delivering much working software.  For the less experienced developer, there really is no viable alternative: learn to write cleaner code.&lt;/p&gt;</description>
          <pubDate>Fri, 10 Dec 2010 14:24:31 GMT</pubDate>
          <guid>http://www.joelhelbling.com/articles/2010/12/10/whats-so-wrong-with-quick-and-dirty-code/</guid>
          <link>http://www.joelhelbling.com/articles/2010/12/10/whats-so-wrong-with-quick-and-dirty-code/</link>
        </item>
    
        <item>
          <title>Abstraction Wrangling</title>
          <description>&lt;p&gt;Corey Haines blogged today about the difference between &lt;a href=&quot;http://programmingtour.blogspot.com/2010/12/taking-it-too-far-v-taking-too-much.html&quot;&gt;Taking it too far vs Taking too much time&lt;/a&gt;.  He&amp;#8217;s talking about refactoring, and the differences between beginners and more experienced programmers when refactoring (or choosing not to refactor).&lt;/p&gt;
&lt;p&gt;One of his observations is that refactoring often involves introducing (or improving) abstractions.  He says one differentiator between experienced programmers and beginners is that the more experience programmers have become more adept at &amp;#8220;abstraction wrangling.&amp;#8221;  I think this observation is very apt; it tracks with what I&amp;#8217;ve observed in teaching Java to inmates at Marion Correctional Institute.  I think part of the reason for this must simply be the relative noise-to-signal ratio imposed by unfamiliarity with tools, conventions, &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt; and the language being used.  Less attention is available for thinking about abstractions when navigating the tools requires more conscious thought.&lt;/p&gt;
&lt;p&gt;But another thing that makes abstractions relatively more difficult for beginners is simply understanding what they mean (or could mean) in the context of a computer program.  Clearly, an object &amp;#8220;joel&amp;#8221; of type Person isn&amp;#8217;t actually a real, live person.  The implication is that the object &amp;#8220;joel&amp;#8221; has certain characteristics which model a real person.  But in what sense is it true that &amp;#8220;joel&amp;#8221; is like Joel?  In order to understand the computer program&amp;#8217;s abstraction, it&amp;#8217;s necessary to understand the intent or purpose of the program.  Is it a phone book?  Expect &amp;#8220;joel&amp;#8221; to have a phone number, just like Joel does.  Is it an org chart?  Maybe &amp;#8220;joel&amp;#8221; has a Boss, or TeamMates or an ArmyOfMinions.  (Real Joel does not have an army of minions.)&lt;/p&gt;
&lt;p&gt;In short I think the abstraction differentiator comes down to better familiarity with various application types and problem domains.  This knowledge helps to inform a programmer as to all the ways in which &amp;#8220;joel&amp;#8221; &lt;em&gt;could&lt;/em&gt; be like Joel, and more importantly, the ways in which &amp;#8220;joel&amp;#8221; is likely to be like Joel.  Knowing the intent of the metaphor makes it possible to narrow our expectations and thereby avoid taking the metaphor too far.  If the program is a phone book, we don&amp;#8217;t expect &amp;#8220;joel&amp;#8221; to have an instance of MedicalRecords or a collection of ChildhoodExperiences.&lt;/p&gt;</description>
          <pubDate>Thu, 09 Dec 2010 09:28:42 GMT</pubDate>
          <guid>http://www.joelhelbling.com/articles/2010/12/09/abstraction-wrangling/</guid>
          <link>http://www.joelhelbling.com/articles/2010/12/09/abstraction-wrangling/</link>
        </item>
    
        <item>
          <title>TDD is Kanban For Code</title>
          <description>&lt;p&gt;&lt;a href=&quot;http://www.threeriversinstitute.org/blog/&quot;&gt;Kent Beck&lt;/a&gt; had an interesting blog post the other day in which he proposes that &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt; is like Kanban for code.  It&amp;#8217;s an interesting mental model, and I find I like it.  Kanban speaks to the idea of a consistent, uninterrupted value stream, and the removal of waste from that process.  This concept maps to test driven development quite nicely; in step one, value enters the flow in the form of a failing test; next the value is built in the form of making the test pass, and finally, we refactor.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s Kent&amp;#8217;s notion of the last part, &amp;mdash;the refactoring&amp;mdash; that I disagree with.  He said, &lt;em&gt;&amp;#8220;From the kanban perspective, though, post-success refactoring is over-production, the worst of the seven wastes of the Toyota Production System.&amp;#8221;&lt;/em&gt;  Here I have to disagree.  I believe that the refactoring doesn&amp;#8217;t constitute waste at all, but is an essential part of the &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt;/Kanban-ish value stream.&lt;/p&gt;
&lt;p&gt;Once a Camry rolls off the assembly line at the Toyota plant, the Kanban value stream is still far from ended.  To simply let the finished cars pile up at the factory would certainly be a huge waste.  Without delivery of finished vehicles to the marketplace, all efficiency gains throughout the rest of the factory are pretty much moot.&lt;/p&gt;
&lt;p&gt;I see refactoring as being similar to delivering finished cars to the dealer: I think it helps if you think not of delivering simply source code, but of delivering business value.  Toyota knows that their job is not merely to build cars, but sell them.  To continue coding without continuously refactoring is akin to piling up finished cars at the factory.  In both cases the value stream becomes clogged, resulting in slowdowns, undelivered value, and even breakage of existing finished work.&lt;/p&gt;
&lt;p&gt;Refactoring isn&amp;#8217;t overproduction, it&amp;#8217;s simply the tail end of the &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt; value stream.  Like every other part of the value stream, it needs to run smoothly and consistently so as not to become a bottleneck.&lt;/p&gt;</description>
          <pubDate>Mon, 15 Nov 2010 14:24:16 GMT</pubDate>
          <guid>http://www.joelhelbling.com/articles/2010/11/15/tdd-is-kanban-for-code/</guid>
          <link>http://www.joelhelbling.com/articles/2010/11/15/tdd-is-kanban-for-code/</link>
        </item>
    
        <item>
          <title>PrizCon 2010: First Reflections</title>
          <description>&lt;p&gt;There is no research more fascinating and more satisfying than the research you do on a rabbit trail topic which runs tangentially away from the topic of a presentation you are supposed to be giving this weekend.  Somehow the procrastination just sweetens the reading, and those wikipedia disambiguation links just glimmer like liquid sunshine.  That&amp;#8217;s what I learned last week as I tried to pull together my talk for PrizCon 2010.&lt;/p&gt;
&lt;h3&gt;My Talk&lt;/h3&gt;
&lt;p&gt;My talk was entitled &amp;#8220;Agile Means Community and Community Means Success&amp;#8221; (&lt;a href=&quot;http://www.slideshare.net/joelhelbling/agile-means-community-and-community-means-success&quot;&gt;slides&lt;/a&gt;).  I give all my attendees mad kudos for bearing up under my delusional ramblings; after all the time spent on those tangential rabbit trails, it seemed a pity to waste all that research.  So it seems plausible that my talk covered too much ground.  On the plus side, I am a fast talker, and I hit my last slide in 30 minutes flat, and opened things up for questions, comments and discussion.  Easily this was the best part of the whole arrangement.&lt;/p&gt;
&lt;p&gt;I was pleased as punch that our keynote speaker &lt;a href=&quot;http://langrsoft.com&quot;&gt;Jeff Langr&lt;/a&gt; sat in on my talk!  Even better he jumped into the discussion afterwards, so my attendees got to discuss my talk with the guy who wrote &lt;a href=&quot;http://www.amazon.com/Agile-Java-TM-Test-Driven-Development/dp/0131482394/ref=sr_1_4?ie=UTF8&amp;amp;qid=1289705562&amp;amp;sr=8-4&quot;&gt;the book they are using to learn Agile and Java!&lt;/a&gt;  By the way, Jeff, I snagged the kindle edition last week, so if your ranking jumped from 600,000 to 30,000 among kindle books&amp;#8230;that was me.&lt;/p&gt;
&lt;h3&gt;The Keynote&lt;/h3&gt;
&lt;p&gt;Speaking of Jeff Langr, great talk.  It was huge that he agreed to fly in and keynote.  I hadn&amp;#8217;t met Jeff before, but we have &lt;a href=&quot;http://salientblue.com&quot;&gt;Paul Nelson&lt;/a&gt; as a mutual friend.  It was great to meet and talk shop with you, Jeff.&lt;/p&gt;
&lt;h3&gt;Things You Didn&amp;#8217;t Know About Dan&lt;/h3&gt;
&lt;p&gt;Dan Wiebe gave an awesome slide-free talk about the Java-in-prison story, and also about how he came to be a &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt;-card-carrying, pair-programming, agile software developer.  I was floored; I had no idea that he initially resisted &amp;#8220;all this new agile nonsense,&amp;#8221; but now that he&amp;#8217;s told the story, I can kinda visualize it.  For those of you who don&amp;#8217;t know what Dan looks like, he is a tall, bushy-bearded agile fanatic with clever, gleaming, beady eyes.  I am just glad he&amp;#8217;s on our side.  If he fixed those eyes on you right after you rolled some code without writing a test first&amp;#8230;{shudder}.  But seriously, he gave a terrific talk.&lt;/p&gt;
&lt;h3&gt;More Talks&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://twitter.com/vleet&quot;&gt;Matt Van Vleet&lt;/a&gt; jumped in to fill the time slot vacated by Bob Myers.  He said he threw his slides together during the keynote.  Not bad.  I gotta acknowledge his improvisational skills, and sheer chutzpah: he slaps together slides and jumps up to give &lt;em&gt;his boss&amp;#8217; talk&lt;/em&gt; on short notice with zero prep time&amp;#8230;&lt;em&gt;in prison.&lt;/em&gt;  Good talk, too.  Very entertaining, and I think he had some very helpful direction and ideas for the inmates who, after release, will be looking for work in the tech sector.&lt;/p&gt;
&lt;p&gt;The other talk I heard was Eric Wilson&amp;#8217;s very well attended story of how he changed careers, going from a guy who &amp;#8220;couldn&amp;#8217;t code &amp;#8216;hello world&amp;#8217; in any language&amp;#8221; to being a &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt;-practicing, gainfully employed software craftsman in the span of 18 months.  In his prior career, Eric was a professor of mathematics; so clearly he is no mental slouch.  But still it speaks volumes that he was able to shift gears and pick up the trade of software development to the point that he was providing for his family in such a short time.  As a matter of fact, if I remember the story correctly, he was paying the bills with working software after only about 9 months.  During those nine months he was still at the old job, and would wake up early so that he could spend an hour and a half learning and practicing code in the morning before heading to the office.  Some of the key points he made were 1) you&amp;#8217;ve got to be really diligent, 2) you&amp;#8217;ve got to take responsibility for your own education, and 3) he says, quite frankly, he asked God to help him.  It&amp;#8217;s a great story, and I think it had us all thinking about what it means to sack up in the face of learning challenges in order to reach our goals.&lt;/p&gt;
&lt;h3&gt;Even More Talks&lt;/h3&gt;
&lt;p&gt;In addition to all that, there were &lt;em&gt;six other talks&lt;/em&gt; which I did not get to hear, including some that were given by inmates.  One of those was about creating 3d animations using Blender and other technologies.  Another was a talk about how computers are changing the music industry.  Those guys actually had a digital recording application called &lt;a href=&quot;http://www.steinberg.net/en/products/cubase/start.html&quot;&gt;Cubase&lt;/a&gt; up and running, and they had some musical instruments there and were literally recording music during the talk.  Wish I could have seen the whole thing.&lt;/p&gt;
&lt;p&gt;To hear more about the other talks, read &lt;a href=&quot;http://javaguys.wordpress.com/2010/11/13/prizcon-2010-possibly-the-worlds-first-one-day-tech-conference-in-prison/&quot;&gt;Dan Wiebe&amp;#8217;s blog&lt;/a&gt; and stay tuned to &lt;a href=&quot;http://twitter.com/search?q=%23prizcon&quot;&gt;#prizcon&lt;/a&gt; on twitter.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Update:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://pillartechnology.com/blog/?p=214&quot;&gt;Matt Van Vleet&amp;#8217;s PrizCon blog post&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://langrsoft.com/jeff/2010/11/prizcon-2010/&quot;&gt;Jeff Langr&amp;#8217;s PrizCon blog post&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
          <pubDate>Sat, 13 Nov 2010 23:36:19 GMT</pubDate>
          <guid>http://www.joelhelbling.com/articles/2010/11/13/prizcon-2010-first-reflections/</guid>
          <link>http://www.joelhelbling.com/articles/2010/11/13/prizcon-2010-first-reflections/</link>
        </item>
    
        <item>
          <title>SDTConf 2010: First Reflections</title>
          <description>&lt;h3&gt;&lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt; Without Frameworks?  Really?&lt;/h3&gt;
&lt;p&gt;Sometimes all it takes is for someone to suggest you do something that you&amp;#8217;ve never tried before, and suddenly you&amp;#8217;re doing something you didn&amp;#8217;t know you could do.  That&amp;#8217;s what happened today in @chzy&amp;#8217;s &amp;#8220;Make it Sing&amp;#8221; hands-on openspace session at SDTConf today.  His suggestion that we &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt; sans-framework provoked @joshwalsh and me to create a &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt; framework called Really? which we developed by TDD&amp;#8217;ing itself.  What cracks me up is how easy this was to do.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;true.really?&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This, of course, will fail with a method missing error.  Fix the error, and you&amp;#8217;re on your way to&lt;/p&gt;
&lt;p&gt;&lt;code&gt;false.really?&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;You can get &lt;a href=&quot;http://github.com/dysprositos/really&quot;&gt;the source code for really? at github&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Practice, Practice, Practice&lt;/h3&gt;
&lt;p&gt;I really enjoyed the strong emphasis on coding practice at this year&amp;#8217;s SDTConf.  Two of the tracks had overhead projectors, and they were usually being used for looking at, refactoring, or writing code: whether it was the hands-on refactoring &lt;a href=&quot;http://i1222.photobucket.com/albums/dd490/joelhelbling/SDTConf2010/testing_and_refactoring_my_store_code.jpg&quot;&gt;little shop of horrors&lt;/a&gt; that &lt;a href=&quot;http://twitter.com/auditty&quot;&gt;@auditty&lt;/a&gt; unveiled (this session was a blast, btw), or the &lt;a href=&quot;http://i1222.photobucket.com/albums/dd490/joelhelbling/SDTConf2010/j_apl_array_programming.jpg&quot;&gt;strange, alien world of J and &lt;span class=&quot;caps&quot;&gt;APL&lt;/span&gt;&lt;/a&gt; which &lt;a href=&quot;http://twitter.com/kaleidic&quot;&gt;@kaleidic&lt;/a&gt; demonstrated for us, or the &lt;a href=&quot;http://i1222.photobucket.com/albums/dd490/joelhelbling/SDTConf2010/mob_code_the_game_of_life_in_javascript.jpg&quot;&gt;Game of Life in Javascript&lt;/a&gt; being diagnosed/optimized by &lt;a href=&quot;http://twitter.com&quot;&gt;@zspencer&lt;/a&gt; and &lt;a href=&quot;http://twitter.com/DocOnDev&quot;&gt;@DocOnDev&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;The Icebreaker&lt;/h3&gt;
&lt;p&gt;In addition to sessions where code and coding were being demonstrated, there were also many sessions where everybody opened their laptops to practice coding.  The first of these was &lt;a href=&quot;http://twitter.com/kbaribeau&quot;&gt;@kbaribeau&amp;#8217;s&lt;/a&gt; &amp;#8220;Coding Icebreaker.&amp;#8221;  In that session, we took turns pair programming the bowling score kata.  The catch, however, is that sessions were only 10 minutes long.  At the end of the session, one person remained at the same workstation, and the other moved down.  This means that you get to spend up to 20 minutes with each codebase, and that you get to see 3-4 codebases.  There were three implementations in Java, and one in Ruby.  I worked with all three Java implementations, but never got in front of the Ruby one.&lt;/p&gt;
&lt;p&gt;Each approach was very different, and the &amp;#8220;many-cooks-in-the-kitchen&amp;#8221; aspect to this exercise made it very challenging to do more than 1) read/grok the code, 2) write a test and 3) make it pass.  Some folks commented that leaving the code with a failing test was actually a nice thing to do, since fixing a failing test is often an easier task than writing the next failing test.  I&amp;#8217;ve always found this to be true.&lt;/p&gt;
&lt;h3&gt;Tick Tack Toe Driven Development&lt;/h3&gt;
&lt;p&gt;I also had fun in the &amp;#8220;&lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt; Like You Mean It&amp;#8221; session, doing the Tick Tack Toe Kata.  I was pair programming with &lt;a href=&quot;http://twitter.com/angelaharms&quot;&gt;@angelaharms&lt;/a&gt; who was fairly new to Ruby although not new to development or &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt;.  Her newfound enthusiasm for Ruby completely tracks with the way I felt when I first began learning that language, and it was fun walking through the &amp;#8220;Like You Mean It&amp;#8221; process using Rspec.&lt;/p&gt;
&lt;p&gt;We caught some critiques from &lt;a href=&quot;http://twitter.com/chzy&quot;&gt;@chzy&lt;/a&gt; and &lt;a href=&quot;http://twitter.com/nashjain&quot;&gt;@nashjain&lt;/a&gt; because of the fact that we created a Board class.  And I could see their point of view.  Others argued why not make the Board class if you know you&amp;#8217;re going to need it anyway.&lt;/p&gt;
&lt;p&gt;I personally am not bothered by the fact that we created a Board class because we were nevertheless focused on small, &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt;-invoked steps.  We started our rspec file with:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;
    describe Board do&lt;/p&gt;
end
&lt;p&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And then, of course, the first thing rspec told us is that constant &amp;#8220;Board&amp;#8221; wasn&amp;#8217;t initialized.  Feed the test.  Away we went.&lt;/p&gt;
&lt;p&gt;I later redid the exercise without creating a Board class.  I&amp;#8217;ll have to show it to @chzy and see if it&amp;#8217;s closer to what he was looking for.&lt;/p&gt;
&lt;p&gt;Next year we may be hosting SDTConf on the &lt;a href=&quot;hhttp://www.leandog.com/float.html&quot;&gt;Leandog boat&lt;/a&gt; in Cleveland.  That would be hugely fun.  We shall see.&lt;/p&gt;
&lt;h3&gt;Scanning The Topics&lt;/h3&gt;
&lt;p&gt;I have scanned in the &lt;a href=&quot;http://s1222.photobucket.com/albums/dd490/joelhelbling/SDTConf2010/&quot;&gt;open space topic cards from SDTConf 2010&lt;/a&gt;.  If you were there, please feel free to tweet/comment/blog/download the card images.&lt;/p&gt;</description>
          <pubDate>Sun, 31 Oct 2010 23:43:22 GMT</pubDate>
          <guid>http://www.joelhelbling.com/articles/2010/10/31/sdtconf-2010-first-reflections/</guid>
          <link>http://www.joelhelbling.com/articles/2010/10/31/sdtconf-2010-first-reflections/</link>
        </item>
    
        <item>
          <title>A Couple of Thoughts About "Standard Agile"</title>
          <description>&lt;p&gt;Lately I&amp;#8217;ve been hearing a lot about standardization of Agile methodologies, and while some of the discussion may be well-intended, I feel the trend isn&amp;#8217;t a healthy direction for the Agile movement.  My concern is that it reveals a reverence for manufacturing which doesn&amp;#8217;t help teams and managers when implementing Agile practices.  &lt;a href=&quot;http://noostvog.wordpress.com/2010/07/04/standardization-in-agile-teams&quot;&gt;Nick Oostvogel recently wrote&lt;/a&gt;,&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;#8220;Do we dare pretend to be better than the factory folks, which have multiple times the industry experience than we have in software development?&amp;#8221;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;As a matter of fact, we do (or we ought) to dare to be different from the &amp;#8220;factory folks.&amp;#8221;  The concept of an hypothetical list of standards may be fine, depending on how they are applied within an organization.  But a loose set of process guidelines is miles apart from the process management that goes on in manufacturing, which is as it should be.&lt;/p&gt;
&lt;p&gt;Manufacturing processes classically emphasize dense, in-depth decision streams &lt;em&gt;before&lt;/em&gt; the assembly line is set in motion.  In agile software development the building and the designing happen simultaneously: thus the decision stream is constant and &lt;em&gt;concurrent with&lt;/em&gt; the process.  In fact, in software engineering you might even say that the decision stream &lt;em&gt;is&lt;/em&gt; the process.  To improve software development is to improve the process in which good decisions are made.&lt;/p&gt;
&lt;p&gt;In the classic manufacturing model, decision making is confined to a relatively small number of process engineers &amp;mdash;those who will actually carry out the processes have little involvement in making the decisions they execute.  In software development there is no factory floor.  If there were a way to map that part of the metaphor, it should be the applications and systems being developed, not the process of building those apps and systems.  Consequently your rank-in-file developer has more in common with a manufacturing process engineer than he does with the factory worker on the line.  To blindly apply the manufacturing model to software engineering is to embrace a solution in search of a problem.&lt;/p&gt;
&lt;p&gt;If we point back to manufacturing as a general model for software development we promote heavy, up-front design, rather than encouraging an agile mindset which values lightweight and easily modifiable processes over wasteful standardization across an organization.  We in software engineering need to think more about the human decision makers involved.  These are considerations which have no particularly helpful ancillaries in the world of historical and mainstream manufacturing.  I&amp;#8217;m not knocking Lean or Toyota &amp;#8212;quite the opposite.  The concepts we draw from Lean are helpful precisely because they are revolutionary when compared to the manufacturing industry as a whole.&lt;/p&gt;</description>
          <pubDate>Thu, 08 Jul 2010 13:56:09 GMT</pubDate>
          <guid>http://www.joelhelbling.com/articles/2010/07/08/a-couple-of-thoughts-about-standard-agile/</guid>
          <link>http://www.joelhelbling.com/articles/2010/07/08/a-couple-of-thoughts-about-standard-agile/</link>
        </item>
    
        <item>
          <title>Apprenticeship Patterns: The White Belt</title>
          <description>&lt;p&gt;I love this pattern.  More than simply a good approach to software craftsmanship, I believe &lt;a href=&quot;http://apprenticeship-patterns.labs.oreilly.com/ch02.html&quot;&gt;wearing The White Belt&lt;/a&gt; is an essential life skill, with applications literally everywhere.  Without approaching life with the beginner&amp;#8217;s mind, we risk losing a virtually endless stream of opportunities for learning.&lt;/p&gt;
&lt;h3&gt;Get On Your Brain and Ride&lt;/h3&gt;
&lt;p&gt;One important trait of a person wearing the white belt is that he does not know what is important to learn.  Earlier in my apprenticeship, I did not grasp this.  I generally tried to hoard my attention, acting as if it were a very limited resource.  And thus it was.&lt;/p&gt;
&lt;p&gt;Nevertheless, there were, despite my &amp;#8220;best&amp;#8221; intentions, those days where I completely lost myself in learning something new.  I would become so absorbed in learning, that I would frequently &amp;#8220;come to&amp;#8221; at the end of an unbelievably short day, and suddenly realize that I was hungry, thirsty, and that I needed to pee like a race horse.  The world, including my own physical needs, had quite literally faded away.  I always felt it was a guilty pleasure; however, without realizing it, I was stumbling onto the power of what scientists refer to as neuroplasticity.  Studies have shown that people who believe their minds can continue to absorb new information &amp;mdash;pretty much without limitation&amp;mdash; are many times more effective at learning than those who believe, for instance, that in order to learn something new, we must lose something we learned earlier.  The truth is that we haven&amp;#8217;t even come close to tapping the human brain&amp;#8217;s potential.&lt;/p&gt;
&lt;p&gt;All too often, however, &amp;#8220;common sense&amp;#8221; would get the upper hand in my learning process, and it would shut things down.  I&amp;#8217;d fret that the things which were &amp;#8220;distracting&amp;#8221; me weren&amp;#8217;t of any real value.  I had, to some extent, swallowed some conventional wisdom that went along the lines of: &lt;em&gt;find out which programming language is the most lucrative, find out which technology stacks are going to help you earn the most money, and study those to mastery.&lt;/em&gt;  Blech.  I had convinced myself that I had enough expertise to determine what was important to learn, and what wasn&amp;#8217;t.  But I really didn&amp;#8217;t, and you don&amp;#8217;t either, because that&amp;#8217;s not the way it works.  We learn what is important to learn&amp;#8230;by learning.  And that means we must start to learning before we&amp;#8217;ve learned what&amp;#8217;s important to learn.  We have to stop worrying about wasteful learning and just start learning.  Follow your curiosity.&lt;/p&gt;
&lt;h3&gt;Go To The Dagobah System&lt;/h3&gt;
&lt;p&gt;The simplest way to don the white belt is to ask questions.  That&amp;#8217;s what I did when I was making the transition from veteran Perl hacker to novice Java programmer.  I found a mentor who tolerated my questions; an grouchy programmer named &lt;a href=&quot;http://www.twitter.com/prairiedog2k&quot;&gt;Bob&lt;/a&gt; who coached me through my introduction to Java unit tests and &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt;.  Our employer took a dim view on pair programming, but Bob and I pair programmed frequently.  My boss quite literally told me to stop writing unit tests, but I kept at it anyway (my boss eventually came around).  And anytime I had a question about design, or had gotten stuck on a problem, I&amp;#8217;d put on my white belt and go talk to Bob.&lt;/p&gt;
&lt;h3&gt;This Ain&amp;#8217;t No Beauty Contest&lt;/h3&gt;
&lt;p&gt;Humility is an essential requirement for wearing the white belt.  When you wear the white belt, you set aside your expertise.  You cannot simultaneously ask a mentor for help while reminding her that in some areas you have more experience than she does.  It just doesn&amp;#8217;t work.  You have to be willing to be the dumb one.  Sometimes, in the midst of hearing a few things you need to know, you&amp;#8217;ll also get an earful of stuff you already know.  Repeatedly butting in with &amp;#8220;I know that&amp;#8221; only ends the lesson too quickly.  Rather than explaining how much you already know, try rephrasing what your &amp;#8220;sensai&amp;#8221; is saying, or better yet, apply it to a particular context.  In this way you can demonstrate that you&amp;#8217;re apprehending what your hearing.&lt;/p&gt;
&lt;h3&gt;Keep Your Pants Up&lt;/h3&gt;
&lt;p&gt;A few years ago my son was taking Tai Kwan Do lessons.  He began with a white belt.  Soon, however, he progressed to the point that he was able to pass his teacher&amp;#8217;s requirements for a yellow belt.  He paid the price in practice, and I paid the price by writing a check for each new belt my son earned.  Consequently, as my son progressed, he began to accumulate a series of colored belts.  Eventually he had a thick bundle of them.  He hung them on the wall in his bedroom.  And despite all the other belts he earned, he always remained the owner of a white belt.&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s the way it is with any of us who have gained some experience.  Whatever color your latest belt may be, you remain the owner of a white belt.  The black belt programmer is simultaneously a white belt programmer, because there never comes a point at which it is appropriate to stop learning from others.  To predetermine who can teach you something and who cannot is as shortsighted as I was when I was a beginner, when I tried to determine the most important programming language for me to learn.  Stay humble, maintain your curiosity, and learn from absolutely anyone.&lt;/p&gt;</description>
          <pubDate>Fri, 04 Jun 2010 10:18:28 GMT</pubDate>
          <guid>http://www.joelhelbling.com/articles/2010/06/04/apprenticeship-patterns-the-white-belt/</guid>
          <link>http://www.joelhelbling.com/articles/2010/06/04/apprenticeship-patterns-the-white-belt/</link>
        </item>
    
        <item>
          <title>Apprenticeship Patterns: My First Language</title>
          <description>&lt;p&gt;The first language I ever learned well enough to really command was Perl.  Before that I coded the occasional short recipe in Basic.  I even did a smattering of Visual Basic.  I fiddled with Delphi.  I made several attempts at Java, but to no avail.  At one point I even downloaded and printed a huge stack of Eiffel documentation (read the first couple pages).  Back in college I coded in Pascal, and got good grades, but never felt like I was really fluent.  I even coded in &lt;span class=&quot;caps&quot;&gt;FORTRAN&lt;/span&gt; for a numerical methods math class.  It was a blast, but I didn&amp;#8217;t own a copy of &lt;span class=&quot;caps&quot;&gt;FORTRAN&lt;/span&gt;, and didn&amp;#8217;t understand its execution environment.  But somehow, when I delved into a Teach Yourself Perl in 21 Days book, it just clicked.  Perl was the first programming language that I ever really &lt;em&gt;loved.&lt;/em&gt;  Whenever possible, I read that book while sitting at a computer.  This was so that as soon as I encountered a code snippet, I could immediately type it in and then start tweaking it.&lt;/p&gt;
&lt;h3&gt;Making Perl My Batch&lt;/h3&gt;
&lt;p&gt;One reason I loved Perl was that, for me, its operating environment was very easy to understand.  You have this executable program, perl.exe.  You write scripts in plain text.  You run the executable, passing the filename as a parameter.  Perl.exe reads the script and does what you intended it to do.  Easy.  No make files.  No linking.  No memory management.  It let me go straight past all that chip-head junk and just do stuff that I&amp;#8217;d actually want to do.&lt;/p&gt;
&lt;p&gt;I also think that Perl scratched the itch I had developed through rather extensive writing of &lt;span class=&quot;caps&quot;&gt;DOS&lt;/span&gt; batch files (my day job).  Perl was simple enough for me to learn quickly, and provided so many of the features I had come to really wish for in &lt;span class=&quot;caps&quot;&gt;DOS&lt;/span&gt; batch.  I remember how excited I was to be working with real live flow control structures.&lt;/p&gt;
&lt;h3&gt;Peace Love And Understanding&lt;/h3&gt;
&lt;p&gt;Furthermore, Perl &amp;mdash;or more accurately, the Perl community&amp;mdash; was also very non-judgemental.  They liked to say &amp;#8220;there is more than one way to skin a cat.&amp;#8221;  Larry Wall, the creator of Perl, said that the language was purposefully designed to be apprehended in different ways and at different levels by the novice, the intermediate and master programmer.  I liked that.  Rather than worry that my code might not be completely proper, I felt free to just launch in.  And as my organic piles of code began to collapse beneath their own weight, I had the opportunity to learn first-hand the basic tenets of clean code cultivation.  Eventually I came to be a rather opinionated Perl programmer.  But at the beginning, I appreciated working in a language touted as accessible to horrible coders.  So what if my code took 15 lines to do what a Perl master could do in one?  I still accomplished what I wanted to do.  And writing 14 extra lines of code is not the end of the world.  Eventually I came to value readable Perl code over hopelessly cool and dense obfuscation, and I&amp;#8217;d settle for the five line version.  When you have coded cleanly in Perl, you have under-promised and over-delivered.&lt;/p&gt;
&lt;p&gt;After reading several chapters of the Teach Yourself book (but before getting to the chapters on Object Oriented Perl), I started working on a real-live application of my own.  Back in the days before wikis, I wrote a wiki.  Well, kinda.  I called it a Document Management System.  You logged in, and found yourself on a kind of home/default/landing page.  There was a list of titles down the right-hand side.  Click one of them, and you could view it.  You could also create or edit any of the documents, using plain &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; to nicely format the page.  Then I began reading about Object Oriented Perl, and suddenly the &lt;span class=&quot;caps&quot;&gt;DMS&lt;/span&gt; just wasn&amp;#8217;t good enough anymore.  Now I wanted it to be object oriented.&lt;/p&gt;
&lt;h3&gt;Hacker For Hire&lt;/h3&gt;
&lt;p&gt;Soon I got a gig, coding &lt;span class=&quot;caps&quot;&gt;CGI&lt;/span&gt; scripts for a local web designer.  That was fun.  It was also harrowing.  Welcome to legacy spaghetti in Perl.  I learned to gather requirements very carefully, guarding against scope creep and hidden complexity.  I also began to learn why some codebases are fun and easy to maintain, while others are positively a nightmare.  And I experienced the refactoring pain which ultimately prepared me to embrace &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt;.  Nonetheless, the first gig was fun, and I started thinking, &amp;#8220;you know, my next job is going to be a Perl programming job.&amp;#8221;&lt;/p&gt;
&lt;p&gt;And so it was.  I got a job working for a dot-com, with a small, distributed team of Perl programmers.  Up to that point I didn&amp;#8217;t actually know any other Perl programmers personally.  I learned from books, from the Internet, and by experimenting.  In hindsight I think that failing to connect with some other Perl programmers in the early days was a real mistake.  So working at the dot-com gave me a chance to learn from some excellent programmers.  And I learned to respect and strengthen our team&amp;#8217;s coding conventions.  Some of the conventions I liked and internalized.  Others I didn&amp;#8217;t agree with, but I observed them nonetheless.  Perl is so permissive that Perl programmers soon learn that if they want to work as a team, they must lay down a few team ground rules for code they maintain together, or soon they will drive each other crazy.&lt;/p&gt;
&lt;p&gt;After I left the dot-com (they ran low on money) I went to work as a database developer.  Predominantly I wrote &lt;span class=&quot;caps&quot;&gt;SQL&lt;/span&gt; queries and stored procedures using &lt;span class=&quot;caps&quot;&gt;TSQL&lt;/span&gt; and PL/&lt;span class=&quot;caps&quot;&gt;SQL&lt;/span&gt;.  But once in a while someone would come to me and say, &amp;#8220;Joel, I need to know something about the data which is spread across these 25 files.  Can you help me?&amp;#8221;  And I would write a 12 line Perl program to give them the information they needed.  And I began to really love Perl for its power in creating use-once, throw-away programs.  Sometimes, when someone came back to me with the same or a similar problem, I&amp;#8217;d be able to find the script I wrote before and re-use it.  Often I couldn&amp;#8217;t find what I was looking for, so I&amp;#8217;d just code it all over again.  Well-designed, reusable code is best, but fast and dirty throwaway code ain&amp;#8217;t bad eiter.  Today, as I learn to talk like the cool kids, I tend to call such code a &amp;#8220;spike.&amp;#8221;&lt;/p&gt;
&lt;h3&gt;That&amp;#8217;s No Perl, That&amp;#8217;s A Death Star&lt;/h3&gt;
&lt;p&gt;Throughout the years that I used Perl, I really learned to savor the culture of the Perl community.  They are brilliant folks, and often they seem to have a quirky outlook which I appreciate very much (no wonder my first Ruby book was Why&amp;#8217;s Poignant Guide!).  The leading masters in the Perl community were miles ahead of me, both in coding skill and in their understanding of elusive, abstract concepts.  All the reading and hacking that I did throughout those years helped to stretch my mind, and to remind me that I had a long ways to go.&lt;/p&gt;
&lt;p&gt;This experience taught me the value of turning to powerful programming languages to solve problems, mine data for answers and automate tedious tasks.  What I feel Perl did not give me was a really solid understanding of Object Oriented design.  For that I would finally return to Java, and then soon after, to Ruby.  But those are other stories for other days.&lt;/p&gt;</description>
          <pubDate>Fri, 28 May 2010 16:01:15 GMT</pubDate>
          <guid>http://www.joelhelbling.com/articles/2010/05/28/apprenticeship-patterns-my-first-language/</guid>
          <link>http://www.joelhelbling.com/articles/2010/05/28/apprenticeship-patterns-my-first-language/</link>
        </item>
    
    
  </channel>
</rss>


