<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
> <channel><title>SKORKS &#187; Software</title> <atom:link href="http://www.skorks.com/category/software/feed/" rel="self" type="application/rss+xml" /><link>http://www.skorks.com</link> <description>For the betterment of the software craft...</description> <lastBuildDate>Wed, 23 Nov 2011 00:18:05 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.1.2</generator> <item><title>The Greatest Developer Fallacy Or The Wisest Words You&#8217;ll Ever Hear?</title><link>http://www.skorks.com/2011/02/the-greatest-developer-fallacy-or-the-wisest-words-youll-ever-hear/</link> <comments>http://www.skorks.com/2011/02/the-greatest-developer-fallacy-or-the-wisest-words-youll-ever-hear/#comments</comments> <pubDate>Mon, 07 Feb 2011 11:42:37 +0000</pubDate> <dc:creator>Alan Skorkin</dc:creator> <category><![CDATA[Developers]]></category> <category><![CDATA[developer wisdom]]></category> <category><![CDATA[expertise]]></category> <guid
isPermaLink="false">http://www.skorks.com/?p=1931</guid> <description><![CDATA[&#34;I will learn it when I need it&#34;! I&#39;ve heard that phrase a lot over the years; it seems like a highly pragmatic attitude to foster when you&#39;re in an industry as fast-paced as software development. On some level it actually IS quite pragmatic, but on another level I am annoyed by the phrase. It [...]
<strong>Related posts:</strong><ol><li><a
href='http://www.skorks.com/2010/03/the-difference-between-a-developer-a-programmer-and-a-computer-scientist/' rel='bookmark' title='The Difference Between A Developer, A Programmer And A Computer Scientist'>The Difference Between A Developer, A Programmer And A Computer Scientist</a></li><li><a
href='http://www.skorks.com/2008/10/here-are-some-words-that-rhyme-with-orange/' rel='bookmark' title='Here Are Some Words That Rhyme With Orange!'>Here Are Some Words That Rhyme With Orange!</a></li><li><a
href='http://www.skorks.com/2009/08/building-software-development-expertise-using-the-dreyfus-model/' rel='bookmark' title='Building Software Development Expertise &#8211; Using The Dreyfus Model'>Building Software Development Expertise &#8211; Using The Dreyfus Model</a></li></ol>]]></description> <content:encoded><![CDATA[<p></p><p><img
align="left" alt="Wisdom" class="alignleft size-medium wp-image-1936" height="349" hspace="20" src="http://www.skorks.com/wp-content/uploads/2011/02/wisdom-225x300.jpg" style="width: 262px; height: 349px;" title="Wisdom" vspace="5" width="262" />&quot;<em>I will learn it when I need it</em>&quot;! I&#39;ve heard that phrase a lot over the years; it seems like a highly pragmatic attitude to foster when you&#39;re in an industry as fast-paced as software development. On some level it actually IS quite pragmatic, but on another level I am annoyed by the phrase. It has become a mantra for our whole industry which hasn&#39;t changed said industry for the better. The problem is this, <strong>in the guise of sounding like a wise and practical developer, people use it as an excuse to coast</strong>. There is too much stuff to know, it is necessary to be able to pick certain things up as you go along &#8211; part of the job. But, there is a difference between having to &quot;pick up&quot; some knowledge as you go along and doing absolutely everything just-in-time.</p><p>The whole industry has become a bunch of generalists, maybe it has always been this way, I just wasn&#39;t around to see it, either way I don&#39;t like it. Noone wants to invest the time to learn anything really deeply, not <a
href="http://www.skorks.com/2010/04/on-the-value-of-fundamentals-in-software-development/" target="_blank">computer science fundamentals</a>, not the latest tech you&#39;re working with, not even the <a
href="http://blog.tmorris.net/java-is-pass-by-value/" target="_blank">language you&#39;ve been coding in every day, for the last few years</a>. Why bother, it will be replaced, superseded, marginalised and out of fashion before you&#39;re half way done. I&#39;ve discussed this with various people many times, but noone seems to really see it as a problem. &quot;<em>Just being pragmatic dude</em>&quot;. In the meantime we&#39;ve all become clones of each other. You want a Java developer, I am a Java developer, you&#39;re a Java developer, my neighbour is a Java developer. What differentiates us from each other &#8211; not much! Well, I&#39;ve got some jQuery experience. That&#39;s great, so you know how to build accordion menu then? Sure, I Google it and steal the best code I find :). In the meantime, if you need to hire a REAL expert (<em>in anything, maybe you&#39;re writing a fancy parser or need to visualise some big data</em>), I hope you&#39;ve stocked up on beer and sandwiches cause you&#39;re gonna be here a while.</p><p>Ok, there are ways to differentiate yourself, I have better communication skills, which is why I do better. That&#39;s important too, but, <strong>developers differentiating themselves based on soft skills rather than developer skills &#8211; seems a bit twisted</strong>. We all communicate really well but the code is a mess :). Hell, I shouldn&#39;t really talk, I am a bit of a generalist too. Of course I&#39;d like to think of myself as a <a
href="http://darrennegraeff.com/the-importance-of-t-shaped-individuals/" target="_blank">T-shaped individual</a>, but if we&#39;re completely honest, it&#39;s more of a dash-shaped or underscore-shaped with maybe a few bumps :). To the uninitiated those bumps might look like big giant stalactites &#8211; T-shaped indeed. <strong>You seem like an expert without ever being an expert</strong>, just one advantage of being in a sea of generalists.</p><h2>Investing In Your Future</h2><p>I don&#39;t want to preach about how we should all be investing in our professional future, everybody knows we should be. Most people probably think they are infact investing, they rock up to work, write a lot of code maybe even do some reading on the side, surely that must make them an <a
href="http://norvig.com/21-days.html" target="_blank">expert in about 10 years</a>, and a senior expert in 20 (<em>I keep meaning to write more about this, one day <a
href="http://feeds.feedburner.com/softwaretechandmore">I&#39;ll get around to it</a> :)</em>)? But, if that was the way, every old person would be an expert in a whole bunch of stuff and that is emphatically not the case. Maybe it is just that people don&#39;t know how to build expertise (<em>there is an element of truth to this</em>), but I have a sneaking suspicion that <strong>it&#39;s more about lack of desire rather than lack of knowledge</strong>. What was that saying about the will and the way &#8211; totally applicable in this case?</p><p>I&#39;ve gone completely off-track. &quot;<em>Investing in professional future</em>&quot; is just one of those buzzword things, the mantra is &quot;<em>I will learn it when I need it</em>&quot;. It was good enough for my daddy and it has served me well so far. Let&#39;s apply this thinking to finance, &quot;<em>I will invest my money when I think I need the money</em>&quot;. Somehow it doesn&#39;t quite have the same kind of pragmatic ring to it.</p><h2>You Don&#39;t Know What You Don&#39;t Know</h2><p>We&#39;ve all had those moments where you&#39;re going through major pain trying to solve a problem until someone comes along and tells you about algorithm X or technology Y and it makes everything fast and simple. It was lucky that person just happened to be there to show you the &quot;<em>easy</em>&quot; way, otherwise you would have spent days/weeks trying to figure it out and it would have been a mess. You can&#39;t be blamed for this though, you don&#39;t know what you don&#39;t know. For me, this is where the &quot;<em>I will learn it when I need it</em>&quot; mentality falls over. <strong>You can&#39;t learn something if you don&#39;t know it exists</strong>. Google goes a long way towards mitigating this problem, but not all the way. There are plenty of problems you will encounter in the wild where you can beat your head against the wall ad infinitum unless you know what class of problem you&#39;re looking at (<em>e.g. if you know a bit about searching and constraint propagation, <a
href="http://norvig.com/sudoku.html" target="_blank">solving sudoku is easy</a>, otherwise <a
href="http://xprogramming.com/xpmag/OkSudoku" target="_blank">it&#39;s</a> <a
href="http://xprogramming.com/xpmag/Sudoku2" target="_blank">really</a> <a
href="http://xprogramming.com/xpmag/SudokuMusings" target="_blank">quite</a> <a
href="http://xprogramming.com/xpmag/Sudoku4" target="_blank">hard</a></em>). You can&#39;t learn about an algorithm if you&#39;re not aware of it or its applicability. You can&#39;t utilise a technology to solve a problem if you don&#39;t even realise it has that capability. You&#39;re not going to always have someone there to point you in the right direction. I am willing to bet <strong>there is a billion lines of code out there right now which can be replaced with a million lines of faster, cleaner, better code simply because whoever wrote it didn&#39;t know what they didn&#39;t know</strong>.</p><p>I seem to be making a case for the opposite side here, if knowing what you don&#39;t know is the ticket then surely we should be focusing on breadth of knowledge. Superficial awareness of as much stuff as possible should see us through, we&#39;ll be able to recognise the problems when we see them and then learn what we need more deeply. Except it doesn&#39;t work like that, <strong>skimming subjects doesn&#39;t allow you to retain anything</strong>, our brain doesn&#39;t work that way. If we don&#39;t reinforce and dig deeper into the concepts we quickly <a
href="http://www.skorks.com/2009/09/become-a-better-developer-by-indexing-your-brain/" target="_blank">page that information out as unimportant</a>, it is a waste of time (<em>think back to cramming for exams, how much do you remember the next day?</em>). However if you focus on building deeper understanding of a subject &#8211; in an interesting twist &#8211; you will gain broad knowledge as well (<em>which you will actually be able to retain</em>). My grandad is a nuclear physicist, several decades of working to gain deeper knowledge of the subject has made him an expert, but it has also made him an excellent mathematician, a decent chemist, a pretty good geologist, a fair biologist etc. Just some <a
href="http://en.wikipedia.org/wiki/Empirical" target="_blank">empirical evidence</a> that seeking depth leads to breadth as a side-effect.</p><h2>Can You Learn It Fast Enough</h2><p
style="text-align: center;"><img
align="middle" alt="Learn fast" class="aligncenter size-medium wp-image-1938" height="217" src="http://www.skorks.com/wp-content/uploads/2011/02/learn-fast-300x199.jpg" style="width: 328px; height: 217px;" title="Learn fast" vspace="5" width="328" /></p><p>Some stuff just takes a long time to learn. I am confident I can pick up an ORM framework I haven&#39;t seen before without even breaking stride, I&#39;ve used them before, the concepts are the same. But what if you need to do some speech to text conversion, not quite as simple, not enough background. Hopefully Google will have something for us to copy/paste. That was a bad example, only research boffins at universities need to do that crap. How about building a website then, we all know how to do that, but what if you need to do it for 10 million users a day. We just need to learn everything about scaling, <strong>I am sure the users will wait a month or two for us to get up to speed :)</strong>. Yeah, I am just being stupid, all we need to do is hire an expert and &#8230; errr &#8230; oh wait, we&#39;re all out of beer and sandwiches.</p><h2>Why Should I Care</h2><p><strong>Working with experts is freaking awesome</strong>. You may have experienced it before, everything they say is something new and interesting, you learn new tricks with every line of code, you can almost feel your brain expanding :). You want to learn from the experts, so it&#39;s really sad when you can&#39;t find any. Since everyone is only learning when they &quot;<em>need it</em>&quot;, noone can teach anything to anyone. The chunk of wisdom here is this, you want to work with experts, but the experts also want to work with experts, so <strong>what are you doing to make sure the experts want to work with you</strong>? Being able to learn something when you need it is a good skill to have, but you can not let it be your philosophy as a developer. Yes it is a big industry you can&#39;t learn everything, so pick something and make sure you know it backwards, if you&#39;re curious enough to follow up on the interesting bits, you&#39;ll find you have a decent grasp of a lot of other stuff at the end. And if you do a good enough job, other super-awesome-smart people are going to want to come and hang around you cause they&#39;ll be able to learn something from you and you&#39;ll be able to learn much from them. Everybody will be a winner.</p><p><span
style="font-size: 10px; font-family: trebuchet ms;">Image by <a
href="http://www.flickr.com/photos/samueleghilardi/2971657900/" target="_blank">SamueleGhilardi</a> and <a
href="http://www.flickr.com/photos/specialkrb/3250756763/">SpecialKRB</a></span></p><p><strong>Related posts:</strong><ol><li><a
href='http://www.skorks.com/2010/03/the-difference-between-a-developer-a-programmer-and-a-computer-scientist/' rel='bookmark' title='The Difference Between A Developer, A Programmer And A Computer Scientist'>The Difference Between A Developer, A Programmer And A Computer Scientist</a></li><li><a
href='http://www.skorks.com/2008/10/here-are-some-words-that-rhyme-with-orange/' rel='bookmark' title='Here Are Some Words That Rhyme With Orange!'>Here Are Some Words That Rhyme With Orange!</a></li><li><a
href='http://www.skorks.com/2009/08/building-software-development-expertise-using-the-dreyfus-model/' rel='bookmark' title='Building Software Development Expertise &#8211; Using The Dreyfus Model'>Building Software Development Expertise &#8211; Using The Dreyfus Model</a></li></ol></p>]]></content:encoded> <wfw:commentRss>http://www.skorks.com/2011/02/the-greatest-developer-fallacy-or-the-wisest-words-youll-ever-hear/feed/</wfw:commentRss> <slash:comments>48</slash:comments> </item> <item><title>99 Out Of 100 Programmers Can&#8217;t Program &#8211; I Call Bullshit!</title><link>http://www.skorks.com/2010/10/99-out-of-100-programmers-cant-program-i-call-bullshit/</link> <comments>http://www.skorks.com/2010/10/99-out-of-100-programmers-cant-program-i-call-bullshit/#comments</comments> <pubDate>Sat, 16 Oct 2010 13:27:55 +0000</pubDate> <dc:creator>Alan Skorkin</dc:creator> <category><![CDATA[Developers]]></category> <category><![CDATA[developers]]></category> <category><![CDATA[fizzbuzz]]></category> <category><![CDATA[interview]]></category> <category><![CDATA[programmers]]></category> <category><![CDATA[skills]]></category> <guid
isPermaLink="false">http://www.skorks.com/?p=1871</guid> <description><![CDATA[Something has always struck me as a little bit off, about that &#34;statistic&#34; (or its equally unlikely brothers, 199 out of 200, 19 out of 20 etc.). I remember reading Joel&#39;s post alluding to this back in the day, then Jeff&#39;s a couple of years ago, there were a few others, most recently this one. [...]
<strong>Related posts:</strong><ol><li><a
href='http://www.skorks.com/2009/09/the-best-way-to-interview-a-developer/' rel='bookmark' title='The Best Way To Interview A Developer'>The Best Way To Interview A Developer</a></li><li><a
href='http://www.skorks.com/2010/02/high-academic-results-make-better-programmers/' rel='bookmark' title='High Academic Results Make Better Programmers'>High Academic Results Make Better Programmers</a></li><li><a
href='http://www.skorks.com/2010/05/how-to-be-a-real-elite-programmer-and-make-sure-everybody-knows-it/' rel='bookmark' title='How To Be A Real Elite Programmer And Make Sure Everybody Knows It'>How To Be A Real Elite Programmer And Make Sure Everybody Knows It</a></li></ol>]]></description> <content:encoded><![CDATA[<p></p><p><img
align="left" alt="Bullshit" class="alignleft size-full wp-image-1878" height="240" hspace="20" src="http://www.skorks.com/wp-content/uploads/2010/10/bullshit.jpg" title="Bullshit" vspace="5" width="240" />Something has always struck me as a little bit off, about that &quot;statistic&quot; (<em>or its equally unlikely brothers, 199 out of 200, 19 out of 20 etc.</em>). I remember reading <a
href="http://www.joelonsoftware.com/items/2005/01/27.html" target="_blank">Joel&#39;s post</a> alluding to this back in the day, then <a
href="http://www.codinghorror.com/blog/2007/02/why-cant-programmers-program.html" target="_blank">Jeff&#39;s</a> a couple of years ago, there were a few others, most recently <a
href="http://www.rethinkdb.com/blog/2010/06/will-the-real-programmers-please-stand-up/" target="_blank">this one</a>. And as much as I want to just accept it (<em>for reasons of self-aggrandisement</em>), I can&#39;t. I&#39;ve been in this industry for a few years now, in that time, I&#39;ve met some really good developers, a bunch of average ones, even the odd crappy one, but<strong> I am yet to meet the veritable army of totally useless non-programming programmers</strong> that must surely exist if those numbers are accurate (<em>the &quot;architects&quot; don&#39;t count :P</em>).</p><h2>Why Should Top Developers Seek You Out?</h2><p>Whenever I see the latest post about how hard it is to hire good people, because x out of y developers are useless, one question immediately springs to mind<span
style="font-weight: bold;">. </span><strong>Is that x out of y applicants, or x out of y working developers?</strong> There is a massive distinction. Unless you&#39;re a company trying to compile stats by doing an industry-wide study, you can&#39;t really comment on the skill levels of all working programmers in any authoritative fashion. So, we must be talking about x out of y applicants. But once again, it&#39;s not applicants in general it&#39;s applicants to YOUR company. All of a sudden the headline is:</p><blockquote><p><strong>X out of Y Applicants for Positions Advertised By My Company Can&#39;t Program</strong></p></blockquote><p>That&#39;s a whole lot less impressive/sensational and whole lot closer to reality. But, let us dig a little deeper. It&#39;s not just the one company, too many other people/companies have had the same pain. Which is perhaps why these posts receive so much attention. It&#39;s cathartic to have a bit of a whinge along with a bunch of other people who feel your pain :). My question for everyone is this, what makes your company so special? How much time did you spend making sure your ad was sufficiently attractive to the star developers and a sufficient deterrent to the crappy ones? I can tell you right now the fact that you&#39;re the &quot;<em>world&#39;s leading enterprise wodget provider</em>&quot;, the latest &quot;<em>well-funded social startup</em>&quot; or pay &quot;<em>above industry rates</em>&quot;, is not going to bring the coding elite knocking on your door. I guess it comes down to this, <strong>if you try to attract talent in a generic fashion you will attract a generic response</strong>, meaning that there is a decent chance your 200 applicants were ALL a bunch of discards.</p><h2>Blame Your Interview Process First</h2><p>Go back to <a
href="http://www.joelonsoftware.com/items/2005/01/27.html" target="_blank">that article of Joel&#39;s</a> that I mentioned above where he talks about the 199 useless programmers who apply for every job thereby inflating the applicant numbers. I don&#39;t think those 199 wannabe programmers exist, I think the pool is much larger. There is a whole bunch of, let&#39;s call them &quot;<em>aspiring programmers</em>&quot; who are totally crap and either can&#39;t get a job or can&#39;t keep one, which doesn&#39;t stop the from trying. A significant percentage of your applicants are those guys and yeah they can&#39;t program, but then again I wouldn&#39;t really call them &quot;<em>programmers</em>&quot; either. It wouldn&#39;t take long to get discouraged and cynical about the whole industry when dealing with those guys for days on end. But let&#39;s say you can screen all those out via resumes or whatever and only end up with seemingly legitimate applicants, how come so many of those can&#39;t code their way out of a paper bag?</p><p>Firstly, you didn&#39;t really screen all the discards out via the resumes, that&#39;s not possible, <strong>I&#39;ve seen some highly impressive resumes from some highly unimpressive people</strong>. All our stats are already suspect at this point, but let&#39;s plow on anyway. Likely the next course of action is to screen further via phone or face-to-face or both. We ask simple <a
href="http://www.skorks.com/2010/03/how-to-answer-a-programming-interview-question-and-look-good-doing-it/" target="_blank">coding questions</a> like the <a
href="http://www.skorks.com/2010/04/a-fizzbuzz-faux-pas/" target="_blank">fizzbuzz</a>, but our applicants still fail &#8211; even ones that shouldn&#39;t:</p><blockquote><p>&quot;Here is the question that the vast majority of candidates are unable to successfully solve, even in half an hour, even with a lot of nudging in the right direction:</p><p><em>Write a C function that reverses a singly-linked list. <br
/> </em></p><p>That&rsquo;s it. We&rsquo;ve turned away people with incredibly impressive resumes (including kernel developers, compiler designers, and many a Ph.D. candidate)&#8230;&quot;</p></blockquote><p>That&#39;s from <a
href="http://www.rethinkdb.com/blog/2010/06/will-the-real-programmers-please-stand-up/" target="_blank">the RethinkDB post</a> that I also mentioned above (I<em> am not picking on the RethinkDB guys, it is just conveniently the latest post on the subject that I have read :)</em>). Kernel developers, and Ph.Ds can&#39;t reverse a list? That seems entirely unlikely. Perhaps it is not the people who are to blame but the process. We have learned, especially over the last few years that it is often the process that prevents a software team from being productive. These days most teams would cast a critical eye towards their process when looking for causes of dysfunction, before they start pointing fingers at each other. So, why not cast the same critical eye towards the interview process? Perhaps the objectives of the interview are unclear, or you&#39;re not communicating well enough, or you&#39;re using the wrong medium for what you&#39;re trying to achieve (<em>e.g. coding over the phone</em>), or you didn&#39;t prepare thoroughly enough as an interviewer added to the probable unpreparedness of the interviewee (<em>this chronic unpreparedness is endemic in our industry and <a
href="http://feeds.feedburner.com/softwaretechandmore">deserves a post of it&#39;s own</a></em>). Sounds like the same kind of issues that cause software projects to go off the rails :). My point is, <strong>it is not necessarily the fact that the candidate is crappy it could be that you&#39;re just doing it wrong</strong>.</p><h2>Just Because It Makes Us Feel Good Doesn&#39;t Make It True</h2><p>As I was thinking about all this stuff I found myself referring to the X out of Y &quot;<em>statistics</em>&quot; as &quot;<em>feel-good numbers</em>&quot; because they make us all feel good about ourselves. I mean, it&#39;s pretty sad for the 99 out of 100 poor schlubs, but not you and me &#8211; we are coding ninjas. How does it feel to be special :)? Somehow though I don&#39;t reckon there are 99 working programmers sitting there reading those posts thinking &quot;<em>&#8230;yeah I am a bit of a failure, I wish I was one of those 1 in a 100 dudes</em>&quot;. As a decent programmer, look around yourself. <strong>Can you really honestly say the vast majority of the developers you&#39;re working with have trouble with loops or basic arithmetic</strong>? If you can, I fail to see how your company can produce any kind of working software and why are you hanging around that place anyway, it surely is not healthy for your career not to mention your sanity.</p><p>If you&#39;ve read anything I&#39;ve written before, you know that I am not one to shy away from a generalisation, but in this case I believe it gives a skewed picture that needlessly makes the whole industry look bad. There is no denying that lack of skill can be a problem in software, but then again this is one of the few professional disciplines where you can read a book and &quot;<em>wham bam thank you ma&#39;am</em>&quot;, you&#39;re a programmer, or at least think that you are (<em>and might even be able to find work if someone is desperate/stupid enough and you&#39;re smooth enough</em>). Try doing the same thing in the medical profession or law, or accounting. This is one of the problems that is unique to IT (<em>other industries have their own</em>), we deal with it to the best of our ability. This issue will always make the hiring process difficult, which makes it doubly as important to think long and hard about how to attract decent people and tweak your interview process to make sure you&#39;re getting what you need out of it. And yes it will be time consuming and difficult and will make you feel like you&#39;re wasting time instead of doing &quot;<em>real work</em>&quot;, but then again you know what the other side of the coin is.</p><p><span
style="font-size: 10px; font-family: trebuchet ms;">Image by <a
href="http://www.flickr.com/photos/nitot/3640230349/" target="_blank">nitot</a></span></p><p><strong>Related posts:</strong><ol><li><a
href='http://www.skorks.com/2009/09/the-best-way-to-interview-a-developer/' rel='bookmark' title='The Best Way To Interview A Developer'>The Best Way To Interview A Developer</a></li><li><a
href='http://www.skorks.com/2010/02/high-academic-results-make-better-programmers/' rel='bookmark' title='High Academic Results Make Better Programmers'>High Academic Results Make Better Programmers</a></li><li><a
href='http://www.skorks.com/2010/05/how-to-be-a-real-elite-programmer-and-make-sure-everybody-knows-it/' rel='bookmark' title='How To Be A Real Elite Programmer And Make Sure Everybody Knows It'>How To Be A Real Elite Programmer And Make Sure Everybody Knows It</a></li></ol></p>]]></content:encoded> <wfw:commentRss>http://www.skorks.com/2010/10/99-out-of-100-programmers-cant-program-i-call-bullshit/feed/</wfw:commentRss> <slash:comments>58</slash:comments> </item> <item><title>8 Types Of Software Consulting Firms &#8211; Which One Do You Work For?</title><link>http://www.skorks.com/2010/05/8-types-of-software-consulting-firms-which-one-do-you-work-for/</link> <comments>http://www.skorks.com/2010/05/8-types-of-software-consulting-firms-which-one-do-you-work-for/#comments</comments> <pubDate>Tue, 04 May 2010 13:11:07 +0000</pubDate> <dc:creator>Alan Skorkin</dc:creator> <category><![CDATA[Software]]></category> <category><![CDATA[consulting]]></category> <guid
isPermaLink="false">http://www.skorks.com/?p=1764</guid> <description><![CDATA[I have strong opinions regarding software consulting and consulting companies, which is probably no surprise as I seem to have a strong opinion about most things :). It&#39;s not a bad thing, makes for some lively conversation over drinks, but it is also a bit of a pain as it makes it hard to choose [...]
<strong>Related posts:</strong><ol><li><a
href='http://www.skorks.com/2010/05/software-as-a-destination-vs-software-as-a-journey/' rel='bookmark' title='Software As A Destination vs Software As A Journey'>Software As A Destination vs Software As A Journey</a></li><li><a
href='http://www.skorks.com/2008/08/fitness-for-software-developers-and-other-it-professionals/' rel='bookmark' title='Fitness for Software Developers (and Other IT Professionals)'>Fitness for Software Developers (and Other IT Professionals)</a></li><li><a
href='http://www.skorks.com/2008/08/if-software-development-was-like-medicine-part-1/' rel='bookmark' title='If Software Development Was Like Medicine: Part 1'>If Software Development Was Like Medicine: Part 1</a></li></ol>]]></description> <content:encoded><![CDATA[<p></p><p><img
align="left" alt="Consultant" class="alignleft size-full wp-image-1767" height="212" hspace="20" src="http://www.skorks.com/wp-content/uploads/2010/05/consultant.jpg" title="Consultant" vspace="5" width="214" />I have strong opinions regarding software consulting and consulting companies, which is probably no surprise as I seem to have a strong opinion about most things :). It&#39;s not a bad thing, makes for some lively conversation over drinks, but it is also a bit of a pain as it makes it hard to choose what to write about. I&#39;ll regale you with my serious thoughts regarding consulting in another post (<em>don&#39;t forget to <a
href="http://feeds.feedburner.com/softwaretechandmore">subscribe to my feed</a> so you don&#39;t miss it</em>) &#8211; today we&#39;ll try to maintain a bit of a lighter tone.</p><p>A little while ago I read an interesting book called <a
href="http://www.amazon.com/Nomadic-Developer-Surviving-Technology-Consulting/dp/0321606396" target="_blank">&quot;The Nomadic Developer&quot;</a>, <strong>if you are considering going into consulting I recommend you read it</strong> (<em>although you would appreciate it more if you&#39;ve already worked in software consulting</em>). The book has some decent advice and information for budding/existing software consultants, but the thing that really caught my eye was the humorous classification of consulting firms found at the beginning of the book. It was titled <strong>&quot;The Seven Deadly Firms&quot;</strong> and I thought I would share it with you for a bit of fun as well as adding one more classification of my own to bring the total up to eight. I will quote and paraphrase as necessary &#8211; here we go.</p><h3>BOZO Consulting</h3><p>BOZO is a place with well-intentioned people who really want to please their clients. The only downside to BOZO is it doesn&#39;t have the slightest clue about how to achieve that goal. <strong>BOZO says yes to everything</strong>: &quot;Yes, of course we will cut the estimate.&quot; &quot;Yes, of course, we will lower our bill rate.&quot; The idea is to get the deal at all costs. To summarize, BOZO has a sales-driven culture that lacks the ability to leverage any sort of delivery capability it accidentally hires (<em><strong>thought from Skorks:</strong> that would have to be one of the most buzzword driven sentences ever, how can we &quot;leverage&quot; that</em>).</p><h3>FEAR Consulting</h3><p>Firm founded on its ability to motivate software developers by fear. Micromanagement, abuse and/or Machiavellian management techniques are the tools this firm uses to generate mundane and uninspired results for clients. The best way to describe how FEAR stays in business despite such deplorable working conditions and treatment is to reference what is known as the <a
href="http://en.wikipedia.org/wiki/Stockholm_syndrome" target="_blank">Stockholm Syndrome</a> (<em><strong>thought from Skorks:</strong> the funny/sad thing is that any consultancy can accidentally/purposely take on aspects of FEAR Consulting in certain situation (financial/project pressures etc.)</em>).</p><h3>The Body Shop</h3><p>Contracting firm that pretends to be a consultancy. Sadly, not all consultants involved have been informed of this &quot;<em>minor</em>&quot; detail. <strong>The Body Shop has zero corporate culture</strong>. No events, no infrastructure and no interaction with fellow &quot;<em>consultants</em>&quot;. Working for a Body Shop you run significant risk of getting the sack after completing your first gig if there is no work immediately available (<em><strong>thought from Skorks:</strong> does anyone else find it funny that <a
href="http://www.thebodyshop.com/_en/_ww/index.aspx" target="_blank">the body shop</a> is an actual company, unfortunately all they do is sell skin care products, but who knows software consulting could be in their future</em>).</p><h3>CHEAP Consulting</h3><p>Some firms compete on quality. CHEAP consulting isn&#39;t one of those firms. This is a great place to work as long as eating and having a roof over your head are not huge priorities for you. CHEAP Consulting firms execute entire projects using hordes of low-cost developers, rather than small numbers of good ones. Ironically, this makes their projects, after all is said and done, come in far more over budget than the firms they competed against in the first place. The main feature of CHEAP is the heavy use of the word resource. (<em><strong>thought from Skorks:</strong> and you know <a
href="http://www.skorks.com/2010/04/the-most-annoying-habit-of-a-software-manager/" target="_blank">how I feel about the word resource</a>, anyway, probably not too many of these around in the first world even cheap developers are reasonably expensive if the cost of living is high enough</em>).</p><h3>Personality Cult Consulting</h3><p>The only drink that this firm has in the refrigerator is <a
href="http://en.wikipedia.org/wiki/Kool-Aid" target="_blank">kool-aid</a>. And if you refuse to drink it &#8211; that is, decide not to indulge in the cult of local hero worship &#8211; you might not have a future here. <strong>Critical thinking skills are not the highest priority</strong>. Frequently, a person who combines charisma with a good measure of talents finds himself able to start a consulting company that capitalizes on these traits. What starts out as a small group of like-minded people with a mission grows into a creature called PC Consulting. Discussions in such a place are rife with appeals to authority; that is, if the cult leader says something, it not only is given a lot of weight, but is treated as gospel (<em><strong>thought from Skorks:</strong> you know what I said about me having strong opinions, I cringe at how quickly I, and most decent developers I know, would get their ass handed to them in a place like this</em>).</p><h3>Smelzer and Melzer Accounting</h3><p
style="text-align: center;"><img
align="middle" alt="Accountant" class="aligncenter size-full wp-image-1768" src="http://www.skorks.com/wp-content/uploads/2010/05/accountant.jpg" style="width: 207px; height: 207px;" title="Accountant" vspace="3" /></p><p>Even the owners of this place, an accounting partnership, wonder how they ended up in the &quot;<em>computers</em>&quot; business. They know they make money from it but are unsure why, and frankly, they are not sure they trust these &quot;kids&quot; who have a lot of scary ideas. In most cases, accounting firms are run by accountants. And <strong>accountants frequently have significant issues with the way software tends to be developed</strong>. Software development methodology is chosen, based on what is perceived as predictable and developers often become the scapegoats when the expectations of predictability fail to materialize (<em><strong>thought from Skorks:</strong> this one is easy, <a
href="http://en.wikipedia.org/wiki/Big_Four_auditors" target="_blank">Big Four</a> anyone?</em>).</p><h3>&quot;Push the SKU&quot; Consulting</h3><p>&quot;<em>Services</em>&quot; arm of a product company that ends up acting as a de-facto sales force for the product, while at the same time, getting paid by the hour from the client to sell&#8230;ahem, I mean&#8230; &quot;<em>provide independent advice</em>&quot;. The incentive system tends to make this not the place for development of software that works independent of a particular product. Such an organization is not always a good place for software developers who have the interest of the client at heart first and foremost (<em><strong>thought from Skorks:</strong> does your software do X? &quot;Sure, sure it does, it just needs some minor configuration &#8230;&quot;</em>).</p><h3>Band Of Freelancers (My Contribution)</h3><p>A bunch of friends decide to form a company to build the next great product. But of course building products takes time and you have to live in the meantime, so <strong><em>everyone picks up some occasional consulting work to &quot;keep the lights on&quot;</em></strong>. The only problem is, occasional means pretty much permanent and it is difficult to write a product while working full time on something else. So, all the &quot;<em>founders</em>&quot; keep on consulting and no product ever materializes, so the company turns into a perpetual band-of-freelancers consulting company. The real danger is that the &quot;<em>founders</em>&quot; actually do well as consultants and are able to hire more people at which point there is a real danger of this company turning into BOZO, Body Shop or Personality Cult consulting.</p><p>There you go, <strong>humorous &#8211; yes, but also rather accurate, wouldn&#39;t you agree</strong>? Of course all those are examples of potentially dysfunctional consulting companies. There are plenty of big and small consultancies (<em>admittedly mostly smaller</em>) that are great places to work, treat their people well and approach their software development with skill and wisdom. The thing to be aware of is that no matter how good a consulting company is, most will exhibit at least some aspects of the above 8 at one point or another. The trick is to know whether or not, it is just a bad patch &#8211; soon corrected and forgotten &#8211; or whether it is becoming more of a permanent situation. Anyways, go check out the book if you want to get the full descriptions as well as tips for recognising if you might, infact, be working for one of these companies. <em>If you do work for a software consultancy, how would you classify the company you work for</em>? Does it by any chance fall into one of the 8 categories above?</p><blockquote><p>On an even lighter note, is it just me or does anyone else ever misspell the word consulting as con<strong>slut</strong>ing, can be a little embarrassing if you do it in any kind of semi-official document. The other one is con<strong>lust</strong>ing which also works but is not quite as good :).</p></blockquote><p><span
style="font-size: 10px; font-family: trebuchet ms;">Images by <a
href="http://www.flickr.com/photos/37996594214@N01/51722476/" target="_blank">orkboi</a> and <a
href="http://www.flickr.com/photos/venndiagram/4441822798/" target="_blank">Venn Diagram</a></span></p><p><strong>Related posts:</strong><ol><li><a
href='http://www.skorks.com/2010/05/software-as-a-destination-vs-software-as-a-journey/' rel='bookmark' title='Software As A Destination vs Software As A Journey'>Software As A Destination vs Software As A Journey</a></li><li><a
href='http://www.skorks.com/2008/08/fitness-for-software-developers-and-other-it-professionals/' rel='bookmark' title='Fitness for Software Developers (and Other IT Professionals)'>Fitness for Software Developers (and Other IT Professionals)</a></li><li><a
href='http://www.skorks.com/2008/08/if-software-development-was-like-medicine-part-1/' rel='bookmark' title='If Software Development Was Like Medicine: Part 1'>If Software Development Was Like Medicine: Part 1</a></li></ol></p>]]></content:encoded> <wfw:commentRss>http://www.skorks.com/2010/05/8-types-of-software-consulting-firms-which-one-do-you-work-for/feed/</wfw:commentRss> <slash:comments>11</slash:comments> </item> <item><title>You Don&#8217;t Need Math Skills To Be A Good Developer But You Do Need Them To Be A Great One</title><link>http://www.skorks.com/2010/03/you-dont-need-math-skills-to-be-a-good-developer-but-you-do-need-them-to-be-a-great-one/</link> <comments>http://www.skorks.com/2010/03/you-dont-need-math-skills-to-be-a-good-developer-but-you-do-need-them-to-be-a-great-one/#comments</comments> <pubDate>Tue, 23 Mar 2010 13:41:48 +0000</pubDate> <dc:creator>Alan Skorkin</dc:creator> <category><![CDATA[Developers]]></category> <category><![CDATA[math]]></category> <category><![CDATA[opinion]]></category> <guid
isPermaLink="false">http://www.skorks.com/?p=1549</guid> <description><![CDATA[A little while ago I started thinking about math. You see, I&#39;ve been writing software for quite a few years now and to be totally honest, I haven&#39;t yet found a need for math in my work. There has been plenty of new stuff I&#39;ve had to learn/master, languages, frameworks, tools, processes, communication skills and [...]
<strong>Related posts:</strong><ol><li><a
href='http://www.skorks.com/2010/03/the-difference-between-a-developer-a-programmer-and-a-computer-scientist/' rel='bookmark' title='The Difference Between A Developer, A Programmer And A Computer Scientist'>The Difference Between A Developer, A Programmer And A Computer Scientist</a></li><li><a
href='http://www.skorks.com/2011/02/the-greatest-developer-fallacy-or-the-wisest-words-youll-ever-hear/' rel='bookmark' title='The Greatest Developer Fallacy Or The Wisest Words You&#8217;ll Ever Hear?'>The Greatest Developer Fallacy Or The Wisest Words You&#8217;ll Ever Hear?</a></li><li><a
href='http://www.skorks.com/2009/09/the-best-way-to-interview-a-developer/' rel='bookmark' title='The Best Way To Interview A Developer'>The Best Way To Interview A Developer</a></li></ol>]]></description> <content:encoded><![CDATA[<p></p><p><img
align="left" alt="Math" class="alignleft size-full wp-image-1555" height="283" hspace="20" src="http://www.skorks.com/wp-content/uploads/2010/03/math.jpg" style="width: 274px; height: 283px;" title="Math" vspace="5" width="274" />A little while ago I started thinking about math. You see, I&#39;ve been writing software for quite a few years now and to be totally honest, I <a
href="http://www.robbyonrails.com/articles/2008/01/01/advanced-mathematics-and-programming" target="_blank">haven&#39;t yet found a need for math</a> in my work. There has been plenty of new stuff I&#39;ve had to learn/master, languages, frameworks, tools, processes, communication skills and library upon library of stuff to do just about anything you can think of; math hasn&#39;t been useful for any of it. Of course this is not surprising, the vast majority of the work I&#39;ve been doing has been <a
href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete" target="_blank">CRUD</a> in one form or another, that&#39;s the vast majority of the work most developers do in these interweb times of ours. You do consulting &#8211; <strong>you mostly build websites</strong>, you work for a large corporates &#8211; mostly build websites, you freelance &#8211; you mostly build websites. I am well aware that I am generalising quite a bit, but do bear with me, I am going somewhere.</p><p>Eventually you get a little tired of it, as I did. Don&#39;t get me wrong it can be fun and challenging work, providing opportunities to solve problems and interact with interesting people &#8211; I am happy to do it during work hours. But the thought of building yet more websites in my personal time has somewhat lost its luster &#8211; you begin to look for something more interesting/cool/fun, as &#8211; once again &#8211; I did. Some people gravitate to front-end technologies and graphical things &#8211; visual feedback is seductive &#8211; I was not one of them (<em>I love a nice front-end as much as the next guy, but it doesn&#39;t really excite me</em>), which is why, when I was confronted with some search-related problems I decided to dig a little further. And this brings me back to the start of this story because as soon as I grabbed the first metaphorical shovel-full of search, I ran smack-bang into some math and realized exactly just how far my skills have deteriorated. Unlike riding a bike &#8211; you certainly do forget (<em>although I haven&#39;t ridden a bike in years so maybe you forget that too :)</em>).</p><h2>Broadening Horizons</h2><p>Learning a little bit about search exposed me to all sorts of interesting software-y and computer science-y related things/problems (<em>machine learning, natural language processing, algorithm analysis etc.</em>) and now everywhere I turn I see math and so feel my lack of skills all the more keenly. I&#39;ve come to the realization that you need a decent level of math skill if you want to do cool and interesting things with computers. Here are some more in addition to the ones I already mentioned &#8211; cryptography, games AI, compression, genetic algorithms, 3d graphics etc. You need math to understand the theory behind these fields which you can then apply if you want to write those libraries and tools that I was talking about &#8211; rather than<a
href="http://agnosticcoder.com/2010/03/is-your-job-title-relevant-mine-is-im-a-software-mechanic/" target="_blank"> just use them</a> (<em>be a <a
href="http://en.wikipedia.org/wiki/Producer-consumer_problem" target="_blank">producer rather than just a consumer</a> &#8211; to borrow an OS metaphor :)</em>). And even if you don&#39;t want to write any libraries, <strong>it makes for a much more satisfying time building software, when you really understand what makes things tick</strong>, rather than just plugging them in and hoping they do whatever the hell they&#39;re supposed to.</p><p>The majority of developers will tell you that they&#39;ve <a
href="http://4.flowsnake.org/archives/108" target="_blank">never needed math for their work</a> (<em>like I did a couple of paragraphs above :)</em>), but after musing on it for a while, I had a though. What we might have here is a <strong>reverse <a
href="http://en.wikipedia.org/wiki/Law_of_the_instrument" target="_blank">Maslow&#39;s hammer</a></strong> problem. You know the one &#8211; when you have a hammer, everything looks like a nail. It is a metaphor for using a favourite tool even when it may not be best for the job at hand. Math is our hammer in reverse. We know the hammer exists but don&#39;t quite know how to use it, so even when we meet a problem where our hammer would be the perfect tool, we never give it serious consideration. The screwdriver was good enough for my granddaddy, it was good enough for my daddy and it is good enough for me, who needs a hammer anyway? The trick with math is &#8211; people are afraid of it &#8211; even most programmers, you&#39;d think we wouldn&#39;t be, but we are. So, we turn our words into a self-fulfilling prophecy. It&#39;s not that I don&#39;t need math for my work it&#39;s just that I don&#39;t really know it and even if I do, I don&#39;t know how to apply it. So I get by without it and when you make-do without something for long enough, after a while you don&#39;t even notice it&#39;s missing and so need it even less &#8211; self-fulfilling prophecy.</p><p>Here is some food for thought about something close to all our hearts &#8211; learning new skills. As a developer in the corporate world, you strive to be a generalizing specialist (<em><a
href="http://www.amazon.com/Passionate-Programmer-Remarkable-Development-Pragmatic/dp/1934356344/ref=pd_sim_b_3" target="_blank">read this book</a> if you don&#39;t know what I am talking about</em>). You try to be decent at most things and really good at some. But what do you specialize in? Normally people choose a framework or two and a programming language and go with that, which is fine and worthwhile. But consider the fact that frameworks and to a lesser extent languages have a limited shelf life. If you&#39;re building a career on being a Hibernate, <a
href="http://rubyonrails.org/" target="_blank">Rails</a> or Struts expert (<em>the struts guys should really be getting worried now :)</em>), <strong>you will have to rinse and repeat all over again in a few years when new frameworks come along to supersede the current flavour of the month</strong>. So is it really the best investment of your time &#8211; maybe, but then again maybe not. Math, on the other hand is not going away any time soon. Everything we do in our field is built upon solid mathematical principles at its root (<em>algorithms and data structures being a case in point</em>), so time spent keeping up your math skills is arguably never wasted. And it, once again, comes down to really understanding something rather than just using it by rote &#8211; math can help you understand everything you do more deeply, when it comes to computers. Infact, as <a
href="http://steve-yegge.blogspot.com/2006/03/math-for-programmers.html" target="_blank">Steve Yegge said</a>, what we do as programmers is so much like math we don&#39;t even realise it.</p><h2>What/Who Makes A Difference</h2><p
style="text-align: center;"><img
align="middle" alt="Knuth" class="aligncenter size-full wp-image-1556" height="256" src="http://www.skorks.com/wp-content/uploads/2010/03/knuth.jpg" style="width: 170px; height: 256px;" title="Knuth" vspace="5" width="170" /></p><p>You don&#39;t believe me, then consider this. Most of the<strong> people who are almost universally respected&nbsp; in our field as great programmers are also great mathematicians</strong>. I am talking people like <a
href="http://en.wikipedia.org/wiki/Donald_Knuth" target="_blank">Donald Knuth</a>, <a
href="http://en.wikipedia.org/wiki/Edsger_W._Dijkstra" target="_blank">Edsger W. Dijkstra</a>, <a
href="http://en.wikipedia.org/wiki/Noam_Chomsky" target="_blank">Noam Chomsky</a>, <a
href="http://norvig.com/" target="_blank">Peter Norvig</a>. But then again these guys weren&rsquo;t really developers, they were <a
href="http://www.skorks.com/2010/03/the-difference-between-a-developer-a-programmer-and-a-computer-scientist/" target="_blank">computer scientists</a>, so it doesn&#39;t really count right? I guess, but then again, maybe we shouldn&#39;t really talk until our output in pure lines of code even begins to approach 10% of what these people have produced. Of course, you can be successful and famous without being a <a
href="http://en.wikipedia.org/wiki/Boffin" target="_blank">boffin</a>, everyone has heard of <a
href="http://en.wikipedia.org/wiki/Hibernate_%28Java%29" target="_blank">Gavin King</a> or <a
href="http://www.loudthinking.com/" target="_blank">DHH</a>. That&#39;s kinda true (<em>although it&#39;s an arguable point whether or not many people have heard of Gavin or DHH outside their respective niches</em>), but &quot;heard of&quot; and universally respected are different things, about as different as creating a framework and significantly advancing the sum-total of human knowledge in your field (<em>don&#39;t get me wrong, I respect Gavin And David, they&#39;ve done a hell of a lot more than I have, but that doesn&#39;t make what I said any less of a fact</em>). How is all of this relevant? I dunno, it probably isn&#39;t, but I thought I&#39;d throw it in there anyway since we&#39;re being introspective and all.</p><p>The world is getting filled up with data, there is more and more of it every day and whereas before we had the luxury of working with relatively small sets of it, these days the software we write must operate efficiently with enormous data sets. This is increasingly true even in the corporate world. What this means is that you will be less and less likely to be able to just &quot;<em>kick things off</em>&quot; to see how they run, because with the amount of data you&#39;ll be dealing with it will just grind to a halt unless you&#39;re smart about it. My prediction is that algorithm analysis will become increasingly important for the lay-programmer, not that it wasn&#39;t before, but it will become more so. And what do you need to be a decent <a
href="http://en.wikipedia.org/wiki/Algorist" target="_blank">algorist</a> &#8211; you guessed it, some math skills.</p><p>So, what about me? Well, <strong>I&#39;ve decided to build up/revive my math skills a little bit at a time</strong>, there are still plenty of books to read and code to write, but I will try to devote a little bit of my time to math at least once in a while, because like exercise, a little bit once in a while, is better than nothing (<em>to quote <a
href="http://steve-yegge.blogspot.com/2006/03/math-for-programmers.html" target="_blank">Steve Yegge</a> yet again</em>). Of course I have a bit of an ace up my sleeve when it comes to math, which is good for me, but luckily with this blog, we might all benefit (<em>I know you&#39;re curious, I&#39;ll <a
href="http://feeds.feedburner.com/softwaretechandmore">tell you about it soon</a> :)</em>).</p><h2>Where Do You See Yourself In 5 Years</h2><p
style="text-align: center;"><img
align="middle" alt="Wakeboarding" class="aligncenter size-full wp-image-1557" height="207" src="http://www.skorks.com/wp-content/uploads/2010/03/wakeboarding.jpg" style="width: 311px; height: 207px;" title="Wakeboarding" vspace="5" width="311" /></p><p>So, is all this math gonna be good for anything? It&#39;s hard to say in advance, I am pretty happy with where I am at right now and so might you be, but it&#39;s all about potential. End of the day, <strong>if you&#39;re a developer in the corporate world you don&#39;t really need any math</strong>. If you&#39;re happy to go your entire career doing enterprise CRUD apps during work hours and paragliding or wakeboarding (<em>or whatever trendy &#39;sport&#39; the geeky in-crowd is into these days</em>) during your off time then by all means, invest some more time into <a
href="http://www.springsource.org/documentation" target="_blank">Spring</a> or <a
href="http://www.hibernate.org/" target="_blank">Hibernate</a> or Visual Studio or whatever. It will not really limit your potential in that particular niche; you can become extremely valuable &#8211; even sought after. But if you strive for diversity in your career and want to have the ability to try your hand at almost any activity that involves code, from <a
href="http://en.wikipedia.org/wiki/Information_retrieval" target="_blank">information retrieval</a> to Linux kernel hacking. In short if you want to be a perfect mix of <a
href="http://www.skorks.com/2010/03/the-difference-between-a-developer-a-programmer-and-a-computer-scientist/" target="_blank">developer, programmer and computer scientist</a>, you have to make sure you math skills are up to scratch (<em>and hell, you can still go wakeboarding if you really want :)</em>). Long story short, if you grok math, there are no doors that are closed to you in the software development field, if you don&#39;t &#8211; it&#39;s going to be all CRUD (<em>pun intended</em>)!</p><p><span
style="font-size: 10px; font-family: trebuchet ms;">Images by <a
href="http://www.flickr.com/photos/b3ni/3447971905/" target="_blank">Beni Ishaque Luthor</a>, <a
href="http://www.flickr.com/photos/scottlaird/85124165/" target="_blank">Scott Laird</a> and <a
href="http://www.flickr.com/photos/arturodonate/2343027570/" target="_blank">arturodonate</a></span></p><p><strong>Related posts:</strong><ol><li><a
href='http://www.skorks.com/2010/03/the-difference-between-a-developer-a-programmer-and-a-computer-scientist/' rel='bookmark' title='The Difference Between A Developer, A Programmer And A Computer Scientist'>The Difference Between A Developer, A Programmer And A Computer Scientist</a></li><li><a
href='http://www.skorks.com/2011/02/the-greatest-developer-fallacy-or-the-wisest-words-youll-ever-hear/' rel='bookmark' title='The Greatest Developer Fallacy Or The Wisest Words You&#8217;ll Ever Hear?'>The Greatest Developer Fallacy Or The Wisest Words You&#8217;ll Ever Hear?</a></li><li><a
href='http://www.skorks.com/2009/09/the-best-way-to-interview-a-developer/' rel='bookmark' title='The Best Way To Interview A Developer'>The Best Way To Interview A Developer</a></li></ol></p>]]></content:encoded> <wfw:commentRss>http://www.skorks.com/2010/03/you-dont-need-math-skills-to-be-a-good-developer-but-you-do-need-them-to-be-a-great-one/feed/</wfw:commentRss> <slash:comments>108</slash:comments> </item> <item><title>Why Open Source Rules And Commercial Drools</title><link>http://www.skorks.com/2009/08/why-open-source-rules-and-commercial-drools/</link> <comments>http://www.skorks.com/2009/08/why-open-source-rules-and-commercial-drools/#comments</comments> <pubDate>Thu, 13 Aug 2009 09:00:10 +0000</pubDate> <dc:creator>Alan Skorkin</dc:creator> <category><![CDATA[Software]]></category> <category><![CDATA[commercial vs open source]]></category> <category><![CDATA[commerical software]]></category> <category><![CDATA[open source]]></category> <guid
isPermaLink="false">http://www.skorks.com/?p=1023</guid> <description><![CDATA[I saw a great post this afternoon by Rob Walling of Software By Rob, where he talks about Competing With Open Source. His main point was the fact that while there are some great open source projects, most open source software suffers from usability, support and documentation issues (amongst other things) and this is where [...]
<strong>Related posts:</strong><ol><li><a
href='http://www.skorks.com/2008/08/java-and-net-taking-on-contenders-and-winning/' rel='bookmark' title='Java and .Net Taking On Contenders And Winning'>Java and .Net Taking On Contenders And Winning</a></li><li><a
href='http://www.skorks.com/2010/03/an-interview-question-that-prints-out-its-own-source-code-in-ruby/' rel='bookmark' title='An Interview Question That Prints Out Its Own Source Code (In Ruby)'>An Interview Question That Prints Out Its Own Source Code (In Ruby)</a></li><li><a
href='http://www.skorks.com/2009/09/rules-of-standup-you-dont-need-to-justify-your-own-existence/' rel='bookmark' title='Rules Of Standup &#8211; You Don&#8217;t Need To Justify Your Own Existence'>Rules Of Standup &#8211; You Don&#8217;t Need To Justify Your Own Existence</a></li></ol>]]></description> <content:encoded><![CDATA[<p></p><p><a
href="http://www.skorks.com/wp-content/uploads/2009/08/drools.jpg" target="_blank"><img
class="alignleft size-full wp-image-1024" style="margin: 5px 20px;" title="Drools" src="http://www.skorks.com/wp-content/uploads/2009/08/drools.jpg" alt="Drools" width="350" height="317" /></a>I saw a great post this afternoon by Rob Walling of <a
title="Software By Rob" href="http://www.softwarebyrob.com/" target="_blank">Software By Rob</a>, where he talks about <a
title="Competing With Open Source" href="http://www.softwarebyrob.com/2009/08/11/how-to-compete-against-open-source-competition/" target="_blank">Competing With Open Source</a>. His main point was the fact that while there are some great open source projects, most <strong>open source software suffers from usability, support and documentation issues</strong> (amongst other things) and this is where commercial software can have the upper edge. While I could see the point he was trying make, I found that over the last few years I have developed pretty much the opposite view. Of course, it all depends on the segment of the software market that you’re looking at (enterprise, mass market etc.), but lets start with the big ones.</p><h3>Enterprise Software Development</h3><p>If you’ve done enterprise software development for any length of time you would have heard of or used some of the biggies (note I have predominantly been doing Java development):</p><ul><li><a
href="http://www-01.ibm.com/software/websphere/" target="_blank">Websphere</a></li><li><a
href="http://www.oracle.com/appserver/weblogic/weblogic-suite.html" target="_blank">Weblogic</a></li><li><a
href="http://www.oracle.com/database/index.html" target="_blank">Oracle</a> (Database)</li><li>etc.</li></ul><p>All commercial, all owned by big companies, all established players in the market place with years of development effort put into them. So, let us examine these against some of the more pertinent points:</p><ul><li><strong>Easy of installation</strong> – I don’t know about you, but I would say all three that I mentioned above get a massive fail for this one (if you disagree please, I’d love to hear you explain how all those are easy to install)</li><li><strong>Great documentation</strong> – Sure there is a LOT of documentation for all of them, the value of it however is marginal. Most of the information is probably there, finding what you need is a whole other story. Another big fail.</li><li><strong>Usability</strong> – yeah all right, they are usable (sort of), but they have nothing over their open source counterparts in this department. Maybe not a fail, but certainly far from brilliant.</li><li><strong>Support</strong> – well, it is certainly there somewhere. You know it exists, getting your hands on some of this support is a whole other matter. Even if you do manage to get through the layers of bureaucracy and get a hold of someone who knows what they are talking about, it gets you precisely nowhere if you found a bug with the software. It’s not as if IBM will be rushing out a new Websphere release just to fix your little issue any time soon and even if they did, let’s see you easily upgrade.</li></ul><p>Notice that I only named 3 big commercial products, that’s not by accident. Undoubtedly there are hundreds of others used in enterprise software development, but the number pales in comparison to the sheer amount of open source libraries and products that are in general circulation. Lets see how many I can list off the top of my head in 5 seconds:</p><ul><li><a
href="http://www.linux.org/" target="_blank">Linux</a></li><li><a
href="http://www.openoffice.org/" target="_blank">Open Office</a></li><li><a
href="http://www.java.com/en/" target="_blank">Java</a></li><li><a
href="http://www.eclipse.org/" target="_blank">Eclipse</a> (IDE)</li><li><a
href="http://www.netbeans.org/" target="_blank">NetBeans</a> (IDE)</li><li><a
href="http://www.ruby-lang.org/en/" target="_blank">Ruby</a></li><li><a
href="http://rubyonrails.org/" target="_blank">Rails</a></li><li><a
href="http://mongrel.rubyforge.org/" target="_blank">Mongrel</a></li><li><a
href="http://www.springsource.org/" target="_blank">Spring</a></li><li><a
href="https://www.hibernate.org/" target="_blank">Hibernate</a></li><li><a
href="http://httpd.apache.org/" target="_blank">Apache</a> (web server)</li><li><a
href="http://ant.apache.org/" target="_blank">Ant</a></li><li><a
href="http://maven.apache.org/" target="_blank">Maven</a></li><li><a
href="http://ant.apache.org/ivy/" target="_blank">Ivy</a></li><li><a
href="https://hudson.dev.java.net/" target="_blank">Hudson</a> (CI)</li><li><a
href="http://code.google.com/webtoolkit/" target="_blank">GWT</a></li><li><a
href="http://struts.apache.org/" target="_blank">Struts</a></li><li>Anything <a
href="http://commons.apache.org/" target="_blank">Apache Commons</a></li><li><a
href="http://www.bugzilla.org/" target="_blank">Bugzilla</a></li><li><a
href="http://www.opensymphony.com/quartz/" target="_blank">Quartz</a></li><li><a
href="http://tomcat.apache.org/" target="_blank">Tomcat</a></li><li><a
href="http://www.xplanner.org/" target="_blank">XPlanner</a></li><li><a
href="http://groovy.codehaus.org/" target="_blank">Groovy</a></li><li><a
href="http://www.scala-lang.org/" target="_blank">Scala</a></li><li><a
href="http://www.acegisecurity.org/" target="_blank">Acegi</a> (Security)</li><li><a
href="http://www.junit.org/" target="_blank">JUnit</a></li></ul><p>Pretty impressive, and that was the very tip of the iceberg. And the interesting thing about most of those that I listed is the fact that they have decent documentation (for the most part), are reasonably easy to use, are reasonably easy to install (if you know what you’re doing, at least a little) and have great support not only from the developers but from the community. Which is the truly awesome thing about open source products, even the smallest ones will often have a community form around them, a community that is usually vociferous, helpful and that includes developers who actually wrote the product. This is something that even the biggest commercial products usually lack – a helpful community. And consider that with open source software if you do find a bug, you sometimes actually have a chance of getting the products fixed and a new version released pretty much just for you. Granted, this will never happen with the bigger open source products but at least you have a chance and at the end of the day, you can always just patch it yourself and build your own copy (and submit your fix to the developers) because the source code is right there (difficult yes, but at least possible). And to get back to documentation, if you really think about it, open source software is the best documented software of all because you always have the god’s own truth to have a look at – the code. If you don’t understand the doco for an open source product, you can read the code as a last resort; for a commercial product – good luck!</p><h3>Software For The Masses</h3><p>Of course we have so far been happily ensconced in developer land, but what about the average Joe Bloggs out there, what’s the landscape like for him/her (Joanne Bloggs :)) when it comes to open source vs. commercial. The field is a little more even here, Joe is not going to read the code, he pretty much wants his software to just work and you know what more and more often these days open source software just does. Sure, commercial products probably have the majority of the market at the moment when it comes to mass-market software, but I would guess that their market share is shrinking. Open source developers have learned that they need to build for the consumer and not for other developers and they’re slowly starting to do so. And the abundance of open source tools and frameworks is making this easier and easier for them.</p><p>The only commercial software I have on my machine is … well the operating system (I am a gamer so Windows is a must), and even there my machine is dual boot :). Aside from that, everything else I need to do with my machine is done by free or open source software:</p><ul><li><a
href="http://www.mozilla.com/en-US/firefox/personal.html" target="_blank">Firefox</a></li><li><a
href="http://www.videolan.org/vlc/" target="_blank">VLC</a> media player</li><li><a
href="http://www.7-zip.org/" target="_blank">7-Zip</a></li><li><a
href="http://www.openoffice.org/" target="_blank">Open Office</a></li><li><a
href="http://winscp.net/eng/index.php" target="_blank">WinSCP</a></li><li><a
href="http://www.chiark.greenend.org.uk/~sgtatham/putty/" target="_blank">Putty</a></li><li><a
href="http://windowslivewriter.spaces.live.com/" target="_blank">Windows Live Writer</a> (I am using this right now :))</li><li><a
href="http://notepad-plus.sourceforge.net/uk/site.htm" target="_blank">Notepad</a>++</li><li><a
href="http://www.ruby-lang.org/en/" target="_blank">Ruby</a></li><li><a
href="http://www.imgburn.com/" target="_blank">ImgBurn</a></li><li><a
href="http://www.foxitsoftware.com/pdf/reader/" target="_blank">Foxit Reader</a></li><li>and many others</li></ul><p>All of these were easy to install (they just worked), intuitive to use and have decent documentation as far as I know (never had to look at any). And as far as support goes, well once again we have the community which is more passionate and helpful around all of the apps that I listed than around most commercial products.</p><p>But, I am a developer, I hear you say, I know how to use and tweak all this stuff, surely Joe Bloggs would find things much tougher. Well, to that I have this to say, the only commercial software my parents have on their machine is … once again the operating system, and only because I didn’t want to confuse them too much (they are not developers :)). They’ve been using it fine and I haven’t heard any complaints about lack of documentation, support or usability, the machine does everything they want it to do, what else do you need?</p><p>This day and age commercial software is going to find it harder and harder to compete as the world is getting more connected and more savvy. Sure they can make the documentation great (which historically has not been the case), but so can open source software, and the 80/20 rule applies where it all becomes moot after a certain point. Commercial can be more useable, but once again 80/20 rule and you really need to innovate hard to stand out. Easy of installation is getting tougher and tougher to compete on as open source tools get more savvy about this one. Finally support is left, and honestly, no commercial software company has the same type of flexibility to offer support as a great open source product with a strong community. The only thing that you end up competing on is price and ‘nothing’, is going to beat ‘something’ every time.</p><p><span
style="font-size: 10px; font-family: trebuchet ms">Image by <a
href="http://www.flickr.com/photos/walkadog/2817815083/" target="_blank">BL1961</a> </span></p><p><strong>Related posts:</strong><ol><li><a
href='http://www.skorks.com/2008/08/java-and-net-taking-on-contenders-and-winning/' rel='bookmark' title='Java and .Net Taking On Contenders And Winning'>Java and .Net Taking On Contenders And Winning</a></li><li><a
href='http://www.skorks.com/2010/03/an-interview-question-that-prints-out-its-own-source-code-in-ruby/' rel='bookmark' title='An Interview Question That Prints Out Its Own Source Code (In Ruby)'>An Interview Question That Prints Out Its Own Source Code (In Ruby)</a></li><li><a
href='http://www.skorks.com/2009/09/rules-of-standup-you-dont-need-to-justify-your-own-existence/' rel='bookmark' title='Rules Of Standup &#8211; You Don&#8217;t Need To Justify Your Own Existence'>Rules Of Standup &#8211; You Don&#8217;t Need To Justify Your Own Existence</a></li></ol></p>]]></content:encoded> <wfw:commentRss>http://www.skorks.com/2009/08/why-open-source-rules-and-commercial-drools/feed/</wfw:commentRss> <slash:comments>7</slash:comments> </item> <item><title>How To Get The Most Out Of Your Design Sessions</title><link>http://www.skorks.com/2009/07/how-to-get-the-most-out-of-your-design-sessions/</link> <comments>http://www.skorks.com/2009/07/how-to-get-the-most-out-of-your-design-sessions/#comments</comments> <pubDate>Wed, 22 Jul 2009 12:34:28 +0000</pubDate> <dc:creator>Alan Skorkin</dc:creator> <category><![CDATA[Agile]]></category> <category><![CDATA[agile practices]]></category> <category><![CDATA[design sessions]]></category> <category><![CDATA[software process]]></category> <guid
isPermaLink="false">http://www.skorks.com/?p=843</guid> <description><![CDATA[Design sessions is one practice that most agile teams will find themselves engaging in from time to time. For some teams it will be completely informal (just get everyone together for 10-15 mins whenever you think it is warranted), for others it becomes more of a ritual where most non-trivial features get a once-over in [...]
<strong>Related posts:</strong><ol><li><a
href='http://www.skorks.com/2009/07/effective-vs-ineffective-pair-programming/' rel='bookmark' title='Effective vs Ineffective Pair Programming'>Effective vs Ineffective Pair Programming</a></li><li><a
href='http://www.skorks.com/2010/05/who-deserves-the-credit-for-software-craftsmanship-and-great-design/' rel='bookmark' title='Who Deserves The Credit For Software Craftsmanship and Great Design?'>Who Deserves The Credit For Software Craftsmanship and Great Design?</a></li><li><a
href='http://www.skorks.com/2010/03/why-your-developers-dont-want-to-swap-pairs-practical-agility/' rel='bookmark' title='Why Your Developers Don&#8217;t Want To Swap Pairs &#8211; Practical Agility'>Why Your Developers Don&#8217;t Want To Swap Pairs &#8211; Practical Agility</a></li></ol>]]></description> <content:encoded><![CDATA[<p></p><p>Design sessions is one practice that most agile teams will find themselves engaging in from time to time. For some teams it will be completely informal (just get everyone together for 10-15 mins whenever you think it is warranted), for others it becomes more of a ritual where most non-trivial features get a once-over in a design session before implementation proceeds.  There are many benefits to having regular design sessions with your team mates:</p><ul><li>an opportunity to share knowledge about a particular area of the system with the whole team</li><li>an opportunity to validate design decisions before implementation gets too far</li><li>promotes collective ownership of code as everyone has some stake in most non-trivial design decisions</li><li>gives an opportunity to brainstorm (brainstorming is not used nearly enough)</li><li>an opportunity to identify areas that are potential refactoring candidates</li><li>gets everyone more personally invested in the solution</li><li>gives people a break from cutting code and gives them an opportunity to engage in an alternative but still useful activity</li><li>an opportunity for the team to bond and &#8216;gel&#8217; further</li></ul><p>At least those are all the benefits that a design session SHOULD provide, but more often than not the potential of design session goes sadly under-utilised by many teams. Any sort of design session will provide some of the above benefits to some degree, however our goal as software developers and agile practitioners should always be to get the maximum benefits from all the practices we employ. So is there anything we can do to ensure we get the most out of a design session?</p><p><strong>A Typical Design Session Scenario</strong></p><p>A typical design session is a pretty informal affair and usually occurs when a pair would like some input from the rest of the team into the best way to implement the feature they are currently working on. When a pair calls a design session the rest of the team gathers in one place (usually in front of a whiteboard) where the team would proceed to outline the problem they are looking at as well as potential solutions that they have come up with. The pair running the session would normally use the whiteboard as a visual aid to help represent the problem and their solution (or solutions).</p><p>Ideally the rest of the team would have some insight into the problem and would offer better solutions or critique and improve the solutions that the pair running the design session has proposed. After some back-and-forth a solution that most people are happy with would emerge and everyone goes back to what they were doing before while the pair that called the session proceeds with the implementation.</p><p>While there is nothing overtly wrong with this scenario (and many teams would do well to even have that as one of the practices they follow), I believe there are many opportunities lost when a design session similar to the above occurs:</p><ul><li>not everyone is an extrovert and since no particular effort was made to engage the more introverted people their knowledge/ideas may go unheard/unused</li><li>it takes a while to switch mental gears, since no particular effort is made to snap everyone out of the mode they&#8217;re thinking in, interesting ideas/solutions may not occur to some people until long after the design session is over</li><li>only visual clues (whiteboard) and audio (verbal explanations) are used to represent the problem and the solution, many people work better with tactile clues (use physical objects to represent the problem), or by seeing themselves as part of a larger abstraction (acting it out)</li><li>by presenting a solutions at the start, potential creative solutions are stifled as it puts the team into an analytical mode (analysing the presented solutions) rather than creative mode (coming up with innovative solutions)</li><li>design sessions can sometimes be a serious affair and so an opportunity for &#8220;play&#8221; (while still doing something productive) is lost (this is a fluffy one but worth a mention I think), a design session can be light-hearted while still providing all the value</li></ul><p><strong>A Much Better Design Session</strong></p><p>A pair calls a design session in very similar fashion to the above. However before jumping into the problem, call for someone from the team a tell a joke or tell one themselves. It is unexpected in a work environment and will force people  to snap out of thinking about what they were just doing, it is also a playful start to the discussion which I think is never a bad thing as it gets everyone more relaxed. This also has the potential to turn into a design session ritual that everyone on the team can look forward to which will be something they share that brings the team closer together.</p><p>Before we draw the problem on the whiteboard, we explain it using just words and then we try and represent the problem using a tactile abstraction (i.e. build what you mean using lego blocks or chess pieces or anything that people can move and touch). This gets people thinking about the problem domain before you draw it i.e. forces them to think about it before seeing it in a familiar medium. The other thing you can do at this point, either before or after drawing, is to act the problem out using people as objects in the system. Many people learn and appreciate problems a lot better by actually doing rather than seeing or hearing about it. As an added benefit, this provides another opportunity for play, gets the less extroverted people more relaxed in a fun and friendly atmosphere and gets everyone primed to participate.</p><p>Do not present potential solutions you have come up with to the team, get the team to brainstorm first and come up with solutions of their own. Chances are they will probably come up with something similar to what you had, but they will have a lot more stake in it having thought it up rather than just validated the solution that the pair that called the session contributes. By not forcing your potential solution on the team you also have a much better chance of the team coming up with something truly innovative that you haven&#8217;t thought of (remember it&#8217;s analytical thinking &#8211; validating a solution, vs creative thinking &#8211; brainstorming a solution). Of course if noone can come up with anything interesting present your solution, you don&#8217;t want to get stuck in design paralysis.</p><p>At this point everyone discusses and agrees on a way forward and the design session is concluded. The difference is:</p><ul><li>the team was a lot more engaged</li><li>everyone had fun</li><li>people had a break from the routine</li><li>everyone was heard (there were no chickens in the design session, <a
href="http://en.wikipedia.org/wiki/The_Chicken_and_the_Pig" target="_blank">only pigs</a>)</li><li>everyone goes back to their work feeling a lot more fulfilled</li><li>the team has bonded together that little bit more</li></ul><p
style="text-align: center;"><div
id="attachment_852" class="wp-caption aligncenter" style="width: 625px"> <a
href="http://www.implementingscrum.com/2006/09/11/the-classic-story-of-the-pig-and-chicken/"><img
class="size-full wp-image-852 " title="Agile Chickens And Pigs" src="http://www.skorks.com/wp-content/uploads/2009/07/chickens_and_pigs_cartoon.jpg" alt="Agile Chickens And Pigs" width="625" height="220" /></a><p
class="wp-caption-text">Agile Chickens And Pigs</p></div><p><strong>At The End Of The Day</strong></p><p>I have very strong opinions on design sessions. I believe they are an extremely valuable tool in the arsenal of any agile team. However I also believe that unless you can fully engage everyone on the team (who is present at the design session) and get everyone thinking creatively (and potentially in a different mode than they would normally) you&#8217;re wasting a large part of the benefit that a design session can provide. Do you use design sessions in your team (if so do you use them as fully as you can) and do you get a lot of value out of them? I&#8217;d love to hear what other people have to say on the matter.</p><p><strong>Related posts:</strong><ol><li><a
href='http://www.skorks.com/2009/07/effective-vs-ineffective-pair-programming/' rel='bookmark' title='Effective vs Ineffective Pair Programming'>Effective vs Ineffective Pair Programming</a></li><li><a
href='http://www.skorks.com/2010/05/who-deserves-the-credit-for-software-craftsmanship-and-great-design/' rel='bookmark' title='Who Deserves The Credit For Software Craftsmanship and Great Design?'>Who Deserves The Credit For Software Craftsmanship and Great Design?</a></li><li><a
href='http://www.skorks.com/2010/03/why-your-developers-dont-want-to-swap-pairs-practical-agility/' rel='bookmark' title='Why Your Developers Don&#8217;t Want To Swap Pairs &#8211; Practical Agility'>Why Your Developers Don&#8217;t Want To Swap Pairs &#8211; Practical Agility</a></li></ol></p>]]></content:encoded> <wfw:commentRss>http://www.skorks.com/2009/07/how-to-get-the-most-out-of-your-design-sessions/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Effective vs Ineffective Pair Programming</title><link>http://www.skorks.com/2009/07/effective-vs-ineffective-pair-programming/</link> <comments>http://www.skorks.com/2009/07/effective-vs-ineffective-pair-programming/#comments</comments> <pubDate>Sun, 19 Jul 2009 13:59:37 +0000</pubDate> <dc:creator>Alan Skorkin</dc:creator> <category><![CDATA[Agile]]></category> <category><![CDATA[pair programming]]></category> <category><![CDATA[teamwork]]></category> <guid
isPermaLink="false">http://www.skorks.com/?p=816</guid> <description><![CDATA[Pair programming has always been one of the more controversial agile practices. Mostly because it is damn hard to sell to management (at least the unenlightened kind of management), we&#8217;ve all heard the old &#8220;double the cost for the same work&#8221; excuse. To those in-the-know that excuse is patent nonsense, those who&#8217;ve done it are [...]
<strong>Related posts:</strong><ol><li><a
href='http://www.skorks.com/2008/09/the-real-measure-of-code-quality/' rel='bookmark' title='The Real Measure Of Code Quality'>The Real Measure Of Code Quality</a></li><li><a
href='http://www.skorks.com/2010/03/why-your-developers-dont-want-to-swap-pairs-practical-agility/' rel='bookmark' title='Why Your Developers Don&#8217;t Want To Swap Pairs &#8211; Practical Agility'>Why Your Developers Don&#8217;t Want To Swap Pairs &#8211; Practical Agility</a></li><li><a
href='http://www.skorks.com/2009/07/how-to-get-the-most-out-of-your-design-sessions/' rel='bookmark' title='How To Get The Most Out Of Your Design Sessions'>How To Get The Most Out Of Your Design Sessions</a></li></ol>]]></description> <content:encoded><![CDATA[<p></p><p>Pair programming has always been one of the more controversial agile practices. Mostly because it is damn hard to sell to management (at least the unenlightened kind of management), we&#8217;ve all heard the old &#8220;double the cost for the same work&#8221; excuse. To those in-the-know that excuse is patent nonsense, those who&#8217;ve done it are well aware of the benefits that it brings even if they do sometimes find it hard to verbalise just exactly what those benefits are.  Pairing brings all sorts of benefits:</p><ul><li>organic code review</li><li>less bugs, which means less maintenance effort</li><li>detecting problems early</li><li>more focused effort (harder to procrastinate when person next to you)</li><li>etc.</li></ul><p>The most important benefit in my opinion is the fact that pairing is highly conducive to organic knowledge transfer (&#8220;pairing is knowledge sharing&#8221; for the poet in you). I believe this is key since in a large system there is literally no other way to do this well.</p><p>It is however interesting to ask exactly why pair programming brings those benefits and this would directly lead us to ask if there are any situations where pair programming can be less effective and what we can do to mitigate that.</p><p><strong>What&#8217;s So Good About Pairing And Why It Works</strong></p><p>The  reason I think pairing works so well is the fact that the &#8220;driver&#8221; and the &#8220;navigator&#8221; are mentally in completely different places. Andy Hunt explains this really well in his &#8220;<a
title="Pragmatic Thinking And Learning" href="http://www.amazon.com/Pragmatic-Thinking-Learning-Refactor-Programmers/dp/1934356050" target="_blank">Pragmatic Thinking &amp; Learning &#8211; Refactor Your Wetware</a>&#8221; book. The driver is focused on the nitty-gritty of the code, his mind is in its analytical mode (his left brain is more engaged) and he is more focused on the &#8220;small picture&#8221;. The navigator on the other is more focused on the bigger picture and due to the fact that he is not actually busy driving his mind is in its more intuitive mode (his right brain is more engaged). This means that the navigator is more able to see patterns and abstractions that the more analytically engaged driver will tend to miss.</p><p>However in order to be able to see the patterns and notice the abstractions, good system knowledge is invaluable (and the best way to gain it is through pairing so this is sort-of cyclical), which brings us to 4 situations where pairing can be either less or more effective.</p><p><strong>The 4 Pairing Situations</strong></p><p>The 4 situations are as follows:</p><ul><li>the driver and the navigator both know the system/area well</li><li>the driver knows the system/area well, while the navigator does not</li><li>the navigator knows the system well while the driver does not</li><li>both the driver and the navigator do not know the system/area well</li></ul><p><em>Driver and the navigator both know the system/area well</em></p><p>This is the ideal situation (obviously), and there is no need to say to much about this, when pairing having both people well versed in the system will ensure maximum effectiveness.</p><p><em>Driver knows the system/area well, while the navigator does not</em></p><p>This is a lot less ideal, in this case the person with the most knowledge of how the system works is in their analytical mode and is a lot less able to see the bigger picture and pick up on the appropriate patterns and abstractions. More than that, since as the driver they are focused on the task at hand and are actively busy/engaged they are potentially less able to share their expertise with their partner. The navigator is also extremely hampered by their lack of system knowledge, not only are they limited in their ability to help the driver, but they will also tend to feel frustrated and unfulfilled.</p><p><em>Navigator knows the system well while the driver does not</em></p><p>This situation is a lot better. In this case the person with less system knowledge is fully engaged as the driver, the navigator on the other hand is able to guide the pairing effort and is still able to see the code from a right-brain perspective. The navigator is also able to maintain a stream of commentary about the system for the driver to absorb. The downside here may be that the work proceeds somewhat slower due to the lack of system knowledge on the part of the driver. This can however be mitigated by discussion between the members of the pair before proceeding to do the next step in the work.</p><p><em>The driver and the navigator do not know the system/area well</em></p><p>From the perspective of getting some work done this is the worst situation to find yourself in. It can however be quite a lot of fun to dig through code you don&#8217;t know, as well as find and recover from mistakes together. The danger here is due to the fact that neither person is potentially able to appreciate the bigger picture -  the quality of the work can suffer and it can be inconsistent with the rest of the code in the system.</p><p>It is difficult to mitigate lack of system knowledge, there is always a significant amount of time and effort involved when the system is of reasonable size. I believe there are 2 ways to ensure that pairing brings benefit no matter what the situation:</p><ul><li>the person with the most system knowledge should spend the majority of their time being the navigator rather than the driver, in this way they can bring the most benefit to the system as well as to their partner</li><li>both members of a pair need to ensure that they are constantly proactive both in learning and in teaching</li></ul><p>Do you think there are other ways to make sure that our pairing efforts are always optimally successful? Feel free to leave a comment and let me know.</p><p><strong>Related posts:</strong><ol><li><a
href='http://www.skorks.com/2008/09/the-real-measure-of-code-quality/' rel='bookmark' title='The Real Measure Of Code Quality'>The Real Measure Of Code Quality</a></li><li><a
href='http://www.skorks.com/2010/03/why-your-developers-dont-want-to-swap-pairs-practical-agility/' rel='bookmark' title='Why Your Developers Don&#8217;t Want To Swap Pairs &#8211; Practical Agility'>Why Your Developers Don&#8217;t Want To Swap Pairs &#8211; Practical Agility</a></li><li><a
href='http://www.skorks.com/2009/07/how-to-get-the-most-out-of-your-design-sessions/' rel='bookmark' title='How To Get The Most Out Of Your Design Sessions'>How To Get The Most Out Of Your Design Sessions</a></li></ol></p>]]></content:encoded> <wfw:commentRss>http://www.skorks.com/2009/07/effective-vs-ineffective-pair-programming/feed/</wfw:commentRss> <slash:comments>10</slash:comments> </item> <item><title>How To Write A Name Generator (In Ruby)</title><link>http://www.skorks.com/2009/07/how-to-write-a-name-generator-in-ruby/</link> <comments>http://www.skorks.com/2009/07/how-to-write-a-name-generator-in-ruby/#comments</comments> <pubDate>Sat, 18 Jul 2009 14:33:44 +0000</pubDate> <dc:creator>Alan Skorkin</dc:creator> <category><![CDATA[Software]]></category> <category><![CDATA[coding]]></category> <category><![CDATA[name generator]]></category> <category><![CDATA[ruby]]></category> <guid
isPermaLink="false">http://www.skorks.com/?p=803</guid> <description><![CDATA[I love reading fantasy, I&#8217;ve even written about some of my favourite fantasy series on this blog. One of the things that I have always found interesting about fantasy literature (besides unworkable economies and unsustainable population densities &#8211; I tend to over-analyse when I read :)) was how they come up with the names for [...]
<strong>Related posts:</strong><ol><li><a
href='http://www.skorks.com/2009/07/how-to-write-a-web-crawler-in-ruby/' rel='bookmark' title='How To Write A Simple Web Crawler In Ruby'>How To Write A Simple Web Crawler In Ruby</a></li><li><a
href='http://www.skorks.com/2010/03/how-to-quickly-generate-a-large-file-on-the-command-line-with-linux/' rel='bookmark' title='How To Quickly Generate A Large File On The Command Line (With Linux)'>How To Quickly Generate A Large File On The Command Line (With Linux)</a></li><li><a
href='http://www.skorks.com/2010/04/serializing-and-deserializing-objects-with-ruby/' rel='bookmark' title='Serializing (And Deserializing) Objects With Ruby'>Serializing (And Deserializing) Objects With Ruby</a></li></ol>]]></description> <content:encoded><![CDATA[<p></p><p>I love reading fantasy, I&#8217;ve even written about some of my <a
title="Great Fantasy Series" href="http://www.skorks.com/2008/09/10-awesome-fantasy-series-that-are-not-potter-or-lotr/" target="_blank">favourite</a> <a
title="More great fantasy series" href="http://www.skorks.com/2008/09/10-more-awesome-fantasy-series-that-are-not-potter-or-lotr/" target="_blank">fantasy series</a> on this blog. One of the things that I have always found interesting about fantasy literature (besides unworkable economies and unsustainable population densities &#8211; I tend to over-analyse when I read :)) was how they come up with the names for all the characters. Large fantasy series often contain hundreds of characters &#8211; that&#8217;s a lot of names. This line of though naturally led me to think of what I would do if I ever needed to make up a bunch of names and being the software developer that I am the answer was naturally &#8211; get my computer to make up the names for me.</p><p>If you do a search around the web for name generators you get quite a few results, unfortunately most of those don&#8217;t tell you how they do what they do and even that is besides the point since I wasn&#8217;t really happy with the results that most of these name generators produce. Either the results are way too random (how about 6 consonants in a row) or they are not random enough with clear traces of human intervention (i.e. choosing from a list of pre-made names). Then I found Chris Pounds excellent <a
title="Name generator page" href="http://www.ruf.rice.edu/~pound/" target="_blank">name generator page</a>. One of the things that he has on this page is his language confluxer (lc) script so for my first attempt at writing a name generator I decided to basically take his script and clean it up a little bit. There were two reasons for this:</p><ul><li>he uses a pretty clever algorithm for his name generator, it is completely data driven and is therefore able to avoid the 6 consonants/vowels in a row issue while producing output that sounds similar to the data it is based on</li><li>it was a yucky Perl script and nobody wants to work with that (except Perl programmers), so I felt it was my duty to make it a little bit nicer and since I&#8217;ve been playing around with Ruby lately, well you get the picture :)</li></ul><p><strong>The Name Generator Algorithm</strong></p><p>As I said the script is completely data driven in that it takes a list of words (names in our case) as input and uses these to produce a bunch of randomised names that hopefully sound similar to the original input. It does the following:</p><ul><li>produces a list of starting letter pairs from the input data (all our names will start with one of these pairs)</li><li>produces a map of which letters can follow which other letters based on the input data</li><li>generates words/names by randomly selecting a starting pair and then appending to the word by randomly choosing a letter from the map based on what the last letter in our new word currently is</li><li>this continues until the word length falls into a particular range (this range is hard-coded in the script)</li></ul><p>There are a few more little twists that make this whole thing function but that is the essence of the algorithm.</p><p><strong>Faithful Perl-to-Ruby Conversion</strong></p><p>So first thing I did was to take the Perl script and do a direct conversion into Ruby, here is what I got:</p><div
class="wp_syntax"><div
class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'getoptlong'</span>
&nbsp;
data_file = <span style="color:#996600;">'data.txt'</span>
words_to_generate = <span style="color:#006666;">10</span>
&nbsp;
min_length = <span style="color:#006666;">3</span>
max_length = <span style="color:#006666;">9</span>
&nbsp;
opts = GetoptLong.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>
  <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;--datafile&quot;</span>, <span style="color:#996600;">&quot;-d&quot;</span>, <span style="color:#6666ff; font-weight:bold;">GetoptLong::OPTIONAL_ARGUMENT</span><span style="color:#006600; font-weight:bold;">&#93;</span>,
  <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;--number-of-words&quot;</span>, <span style="color:#996600;">&quot;-n&quot;</span>, <span style="color:#6666ff; font-weight:bold;">GetoptLong::OPTIONAL_ARGUMENT</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
opts.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>opt, arg<span style="color:#006600; font-weight:bold;">|</span>
  <span style="color:#9966CC; font-weight:bold;">case</span> opt
  <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#996600;">'--datafile'</span>
    data_file = arg
  <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#996600;">'--number-of-words'</span>
    words_to_generate = arg
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
start_pairs = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
follower_letters = <span style="color:#CC00FF; font-weight:bold;">Hash</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">''</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#CC0066; font-weight:bold;">open</span><span style="color:#006600; font-weight:bold;">&#40;</span>data_file, <span style="color:#996600;">'r'</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>file<span style="color:#006600; font-weight:bold;">|</span>
  chars = file.<span style="color:#9900CC;">read</span>.<span style="color:#CC0066; font-weight:bold;">chomp</span>.<span style="color:#9900CC;">downcase</span>.<span style="color:#CC0066; font-weight:bold;">gsub</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">/</span>\s<span style="color:#006600; font-weight:bold;">/</span>, <span style="color:#996600;">' '</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">chars</span>.<span style="color:#9900CC;">to_a</span>
  chars.<span style="color:#9900CC;">push</span><span style="color:#006600; font-weight:bold;">&#40;</span>chars<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>, chars<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#006600; font-weight:bold;">&#40;</span>chars.<span style="color:#9900CC;">length</span><span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">times</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>i<span style="color:#006600; font-weight:bold;">|</span>
    <span style="color:#9966CC; font-weight:bold;">if</span> chars<span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">&#93;</span> =~ <span style="color:#006600; font-weight:bold;">/</span>\s<span style="color:#006600; font-weight:bold;">/</span>
      start_pairs.<span style="color:#9900CC;">push</span><span style="color:#006600; font-weight:bold;">&#40;</span>chars<span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">+</span><span style="color:#006666;">1</span>, <span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
    follower_letters<span style="color:#006600; font-weight:bold;">&#91;</span>chars<span style="color:#006600; font-weight:bold;">&#91;</span>i, <span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#93;</span>=follower_letters<span style="color:#006600; font-weight:bold;">&#91;</span>chars<span style="color:#006600; font-weight:bold;">&#91;</span>i,<span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">+</span>chars<span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">+</span><span style="color:#006666;">2</span>,<span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">join</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> generate_word<span style="color:#006600; font-weight:bold;">&#40;</span>word, follower_letters, min_length<span style="color:#006600; font-weight:bold;">&#41;</span>
  last_pair = word<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">2</span>, <span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">&#93;</span>
  letter = follower_letters<span style="color:#006600; font-weight:bold;">&#91;</span>last_pair<span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">slice</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0066; font-weight:bold;">rand</span><span style="color:#006600; font-weight:bold;">&#40;</span>follower_letters<span style="color:#006600; font-weight:bold;">&#91;</span>last_pair<span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">length</span><span style="color:#006600; font-weight:bold;">&#41;</span>, <span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">if</span> word =~ <span style="color:#006600; font-weight:bold;">/</span>\s$<span style="color:#006600; font-weight:bold;">/</span>
    <span style="color:#0000FF; font-weight:bold;">return</span> word <span style="color:#9966CC; font-weight:bold;">unless</span> word.<span style="color:#9900CC;">length</span> <span style="color:#006600; font-weight:bold;">&amp;</span>lt;= min_length
    <span style="color:#0000FF; font-weight:bold;">return</span> generate_word<span style="color:#006600; font-weight:bold;">&#40;</span>word<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">1</span>, <span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">+</span>letter, follower_letters, min_length<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">else</span>
    word = word.<span style="color:#CC0066; font-weight:bold;">gsub</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">/</span>^\s<span style="color:#006600; font-weight:bold;">/</span>, <span style="color:#996600;">''</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0000FF; font-weight:bold;">return</span> generate_word<span style="color:#006600; font-weight:bold;">&#40;</span>word<span style="color:#006600; font-weight:bold;">+</span>letter, follower_letters, min_length<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
words_to_generate.<span style="color:#9900CC;">times</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>i<span style="color:#006600; font-weight:bold;">|</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> generate_word<span style="color:#006600; font-weight:bold;">&#40;</span>start_pairs<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#CC0066; font-weight:bold;">rand</span> start_pairs.<span style="color:#9900CC;">length</span><span style="color:#006600; font-weight:bold;">&#93;</span>, follower_letters, min_length<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span>, max_length<span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">capitalize</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div><p>At this point I had a bit of a shock at how eerily similar the Ruby version of the script looks compared to the Perl version (*shudders*). Anyways, you can just take the above script put it into a file and run it, you&#8217;ll need to give it a data file (here is the <a
title="English names" href="http://www.skorks.com/wp-content/uploads/2009/07/data.txt" target="_blank">one I used</a>).</p><p><strong>Cleaning Up The Basic Name Generator</strong></p><p>The problems with the above script are:</p><ul><li>it is not self-documenting</li><li>it is hard to test</li><li>it is hard to extend</li></ul><p>Anyways, I decided to make it a little bit nicer and easier to play around with by breaking it up into a couple of classes (in the interest of object orientation and stuff):</p><ul><li>name_generator_main.rb &#8211; the script entry point</li><li>NameGenerator &#8211; concerned with name generation (as you might expect)</li><li>DataHandler &#8211; concerned with reading the input data and producing the maps and arrays on which the NameGenerator relies</li><li>ArgumentParser &#8211; concerned with dealing with the command line arguments</li></ul><p>You can download all of it <a
title="Cleaner Name generator" href="http://www.skorks.com/wp-content/uploads/2009/07/name_generator.zip" target="_blank">here</a>.</p><p>Now the main script looks much cleaner and you know exactly what&#8217;s happening just by reading it:</p><div
class="wp_syntax"><div
class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'argument_parser'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'data_handler'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'name_generator'</span>
&nbsp;
argument_parser = ArgumentParser.<span style="color:#9900CC;">new</span>
argument_parser.<span style="color:#9900CC;">parse_arguments</span>
data_handler = DataHandler.<span style="color:#9900CC;">new</span>
data_handler.<span style="color:#9900CC;">read_data_file</span><span style="color:#006600; font-weight:bold;">&#40;</span>argument_parser.<span style="color:#9900CC;">data_file</span><span style="color:#006600; font-weight:bold;">&#41;</span>
name_generator = NameGenerator.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>data_handler.<span style="color:#9900CC;">follower_letters</span><span style="color:#006600; font-weight:bold;">&#41;</span>
names = name_generator.<span style="color:#9900CC;">generate_names</span><span style="color:#006600; font-weight:bold;">&#40;</span>argument_parser.<span style="color:#9900CC;">words_to_generate</span>, data_handler.<span style="color:#9900CC;">start_pairs</span><span style="color:#006600; font-weight:bold;">&#41;</span>
names.<span style="color:#9900CC;">each</span> <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span>name<span style="color:#006600; font-weight:bold;">|</span> <span style="color:#CC0066; font-weight:bold;">puts</span> name<span style="color:#006600; font-weight:bold;">&#125;</span></pre></div></div><p>This produces output similar to the following:</p><pre>Jamin
Luce
Jevon
Fredy
Hamilinis
Emmano
Shamarcul
Gagaedric
Jary
Raelis</pre><p>That&#8217;s pretty damn good for a random name generator. The best part of it, since it is completely data driven, if you change the input data you completely alter the output. So if you pass in a file with a bunch of French names, you will get French-sounding random names etc. Try it yourself!</p><p><strong>Related posts:</strong><ol><li><a
href='http://www.skorks.com/2009/07/how-to-write-a-web-crawler-in-ruby/' rel='bookmark' title='How To Write A Simple Web Crawler In Ruby'>How To Write A Simple Web Crawler In Ruby</a></li><li><a
href='http://www.skorks.com/2010/03/how-to-quickly-generate-a-large-file-on-the-command-line-with-linux/' rel='bookmark' title='How To Quickly Generate A Large File On The Command Line (With Linux)'>How To Quickly Generate A Large File On The Command Line (With Linux)</a></li><li><a
href='http://www.skorks.com/2010/04/serializing-and-deserializing-objects-with-ruby/' rel='bookmark' title='Serializing (And Deserializing) Objects With Ruby'>Serializing (And Deserializing) Objects With Ruby</a></li></ol></p>]]></content:encoded> <wfw:commentRss>http://www.skorks.com/2009/07/how-to-write-a-name-generator-in-ruby/feed/</wfw:commentRss> <slash:comments>14</slash:comments> </item> <item><title>Downgrading A Ubuntu Package</title><link>http://www.skorks.com/2009/07/downgrading-a-ubuntu-package/</link> <comments>http://www.skorks.com/2009/07/downgrading-a-ubuntu-package/#comments</comments> <pubDate>Tue, 14 Jul 2009 08:19:54 +0000</pubDate> <dc:creator>Alan Skorkin</dc:creator> <category><![CDATA[Developers]]></category> <category><![CDATA[Software]]></category> <category><![CDATA[java]]></category> <category><![CDATA[linux]]></category> <category><![CDATA[ubuntu]]></category> <guid
isPermaLink="false">http://www.skorks.com/?p=784</guid> <description><![CDATA[Here is the summarized version of how to downgrade a Ubuntu package
<strong>Related posts:</strong><ol><li><a
href='http://www.skorks.com/2009/08/installing-and-using-java-on-ubuntu/' rel='bookmark' title='What Everybody Should Know About Installing And Using Java On Ubuntu'>What Everybody Should Know About Installing And Using Java On Ubuntu</a></li><li><a
href='http://www.skorks.com/2009/08/partitioning-your-hard-drive-during-a-linux-install/' rel='bookmark' title='Partitioning Your Hard Drive During A Linux Install'>Partitioning Your Hard Drive During A Linux Install</a></li><li><a
href='http://www.skorks.com/2008/08/java-and-net-taking-on-contenders-and-winning/' rel='bookmark' title='Java and .Net Taking On Contenders And Winning'>Java and .Net Taking On Contenders And Winning</a></li></ol>]]></description> <content:encoded><![CDATA[<p></p><p>I was recently upgrading a couple of Ubuntu machines to the latest and greatest everything. It&#8217;s good to be up-to-date makes me feel like a no-nonsense, can-do developer :). Anyways one of the latest and greatest things that Ubuntu pulled in for me was the latest java 6 (JDK 1.6.0_14). All of a sudden my build started failing with strange coverage errors &#8211; I hate it when that happens. After looking around for a bit I found that there was a Cobertura issue with java 1.6.0_14, <a
href="http://jira.codehaus.org/browse/MCOBERTURA-101" target="_blank">this one</a>. So I though I&#8217;d try and downgrade Java 6 to the previous version (who needs to be fully up-to-date anyway, that stuff is for the birds, the real hardcore developers use the penultimate version, yeah!).</p><p>This of course was easier said than done, Ubuntu doesn&#8217;t really like it when you try to downgrade stuff. I thought that if I could obtain, or create, a debian package with the version of java that I was after I might just be able to manually install that one (yeah that might work). I was wrong, I did get my hands on the debian package that I needed, but Ubuntu spewed out some gaff about dependencies and &#8230; long story short, it didn&#8217;t work. Of course I could always forgo the use of the package manager and just manually install java and set up the PATH and JAVA_HOME and so forth but that would make me feel a little unclean so I thought I&#8217;d persist and do things the <span
style="text-decoration: line-through;">easy </span>hard way.</p><p>Eventually (after searching around for ages and eating 2 pieces of candy &#8211; Vicks VapoDrops &#8211; good for the throat) I found a nice Ubuntu forum thread about how to downgrade a package (<a
href="http://ubuntuforums.org/showthread.php?t=321156" target="_blank">this one</a>), so here is the summarised version of how to downgrade a Ubuntu package &#8211; more specifically my java 6.</p><p>Firstly, we need to find what lower versions of our package are available to us, we use the following command:</p><p
style="background-color:#F2F2F2; border-style:inset;border-width:2px;"><strong><code>apt-cache showpkg sun-java6-jdk</code></strong></p><p>This will produce output similar to the following:</p><p
style="background-color:#F2F2F2; border-style:inset;border-width:2px;"><code><br
/> Package: sun-java6-jdk<br
/> Versions:<br
/> 6-14-0ubuntu1.9.04 (/var/lib/apt/lists/security.ubuntu.com_ubuntu_dists_jaunty-proposed_multiverse_binary-amd64_Packages) (/var/lib/dpkg/status)<br
/> Description Language:<br
/> File: /var/lib/apt/lists/security.ubuntu.com_ubuntu_dists_jaunty-proposed_multiverse_binary-amd64_Packages<br
/> MD5: cb47d4c49fa7317c472613b7010ef9d8<br
/> 6-13-1 (/var/lib/apt/lists/au.archive.ubuntu.com_ubuntu_dists_jaunty_multiverse_binary-amd64_Packages)<br
/> Description Language:<br
/> File: /var/lib/apt/lists/au.archive.ubuntu.com_ubuntu_dists_jaunty_multiverse_binary-amd64_Packages<br
/> MD5: cb47d4c49fa7317c472613b7010ef9d8<br
/> Reverse Depends:<br
/> sun-java6-source,sun-java6-jdk 6-14-0ubuntu1.9.04<br
/> sun-java6-javadb,sun-java6-jdk 6-14-0ubuntu1.9.04<br
/> sun-java6-demo,sun-java6-jdk<br
/> sun-java6-demo,sun-java6-jdk 6-14-0ubuntu1.9.04<br
/> libnb-java2-java,sun-java6-jdk<br
/> libnb-java2-java,sun-java6-jdk<br
/> sun-java6-source,sun-java6-jdk 6-13-1<br
/> sun-java6-javadb,sun-java6-jdk 6-13-1<br
/> sun-java6-demo,sun-java6-jdk<br
/> sun-java6-demo,sun-java6-jdk 6-13-1<br
/> glassfishv2-bin,sun-java6-jdk<br
/> glassfishv2,sun-java6-jdk<br
/> Dependencies:<br
/> 6-14-0ubuntu1.9.04 - sun-java6-bin (5 6-14-0ubuntu1.9.04) libc6 (0 (null)) libx11-6 (0 (null)) debconf (18 0.5) debconf-2.0 (0 (null)) sun-java6-demo (0 (null)) sun-java6-doc (0 (null)) sun-java6-source (0 (null))<br
/> 6-13-1 - sun-java6-bin (5 6-13-1) libc6 (0 (null)) libx11-6 (0 (null)) debconf (18 0.5) debconf-2.0 (0 (null)) sun-java6-demo (0 (null)) sun-java6-doc (0 (null)) sun-java6-source (0 (null))<br
/> Provides:<br
/> 6-14-0ubuntu1.9.04 - java6-sdk java5-sdk java2-sdk java2-compiler java-sdk java-compiler<br
/> 6-13-1 - java6-sdk java5-sdk java2-sdk java2-compiler java-sdk java-compiler<br
/> Reverse Provides:<br
/> </code></p><p>There are two versions available in the repository. As we can see the java version we are looking for (6-13-1) is here. However it is worth noting that had we wanted to downgrade several versions back, we would be out of luck as older versions are no longer in the repository.</p><p>Now that we see the version that we want we need to do the following to downgrade:</p><p
style="background-color:#F2F2F2; border-style:inset;border-width:2px;"><strong><code>sudo aptitude install sun-java6-jdk=6-13-1</code></strong></p><p>This will produce something along the lines of:</p><p
style="background-color:#F2F2F2; border-style:inset;border-width:2px;"><code><br
/> Reading package lists... Done<br
/> Building dependency tree<br
/> Reading state information... Done<br
/> Reading extended state information<br
/> Initializing package states... Done<br
/> The following packages are BROKEN:<br
/> sun-java6-jdk<br
/> 0 packages upgraded, 0 newly installed, 1 downgraded, 0 to remove and 2 not upgraded.<br
/> Need to get 17.7MB of archives. After unpacking 1925kB will be freed.<br
/> The following packages have unmet dependencies:<br
/> sun-java6-jdk: Depends: sun-java6-bin (= 6-13-1) but 6-14-0ubuntu1.9.04 is installed.<br
/> The following actions will resolve these dependencies:<br
/> Remove the following packages:<br
/> sun-java6-fonts<br
/> sun-java6-plugin<br
/> Downgrade the following packages:<br
/> sun-java6-bin [6-14-0ubuntu1.9.04 (jaunty-proposed, now) -&gt; 6-13-1 (jaunty)]<br
/> sun-java6-jre [6-14-0ubuntu1.9.04 (jaunty-proposed, now) -&gt; 6-13-1 (jaunty)]<br
/> Score is 188<br
/> Accept this solution? [Y/n/q/?]  Y<br
/> The following packages will be DOWNGRADED:<br
/> sun-java6-bin sun-java6-jdk sun-java6-jre<br
/> The following packages will be REMOVED:<br
/> sun-java6-fonts{a} sun-java6-plugin{a}<br
/> 0 packages upgraded, 0 newly installed, 3 downgraded, 2 to remove and 2 not upgraded.<br
/> Need to get 50.7MB of archives. After unpacking 4096kB will be freed.<br
/> Do you want to continue? [Y/n/?] Y<br
/> </code></p><p>If we now run:</p><p
style="background-color:#F2F2F2; border-style:inset;border-width:2px;"><code>java -version</code></p><p>We get:</p><p
style="background-color:#F2F2F2; border-style:inset;border-width:2px;"><code>java version "1.6.0_13"<br
/> Java(TM) SE Runtime Environment (build 1.6.0_13-b03)<br
/> Java HotSpot(TM) 64-Bit Server VM (build 11.3-b02, mixed mode)</code></p><p>Which is the downgraded java that we were after, sweet!</p><p><strong>Related posts:</strong><ol><li><a
href='http://www.skorks.com/2009/08/installing-and-using-java-on-ubuntu/' rel='bookmark' title='What Everybody Should Know About Installing And Using Java On Ubuntu'>What Everybody Should Know About Installing And Using Java On Ubuntu</a></li><li><a
href='http://www.skorks.com/2009/08/partitioning-your-hard-drive-during-a-linux-install/' rel='bookmark' title='Partitioning Your Hard Drive During A Linux Install'>Partitioning Your Hard Drive During A Linux Install</a></li><li><a
href='http://www.skorks.com/2008/08/java-and-net-taking-on-contenders-and-winning/' rel='bookmark' title='Java and .Net Taking On Contenders And Winning'>Java and .Net Taking On Contenders And Winning</a></li></ol></p>]]></content:encoded> <wfw:commentRss>http://www.skorks.com/2009/07/downgrading-a-ubuntu-package/feed/</wfw:commentRss> <slash:comments>12</slash:comments> </item> <item><title>The Current State Of The Agile Nation &#8211; Agile Process Adoption</title><link>http://www.skorks.com/2009/03/the-current-state-of-the-agile-nation-agile-process-adoption/</link> <comments>http://www.skorks.com/2009/03/the-current-state-of-the-agile-nation-agile-process-adoption/#comments</comments> <pubDate>Sun, 01 Mar 2009 11:12:40 +0000</pubDate> <dc:creator>Alan Skorkin</dc:creator> <category><![CDATA[Agile]]></category> <category><![CDATA[Software]]></category> <category><![CDATA[software development]]></category> <guid
isPermaLink="false">http://www.skorks.com/?p=763</guid> <description><![CDATA[A few days ago I was asked where I thought Agile adoption was at right now. After giving a long and no-doubt confusing answer I thought I would write it up as well. After all if I had to confuse one person I might as well confuse and bore a whole lot of others while I am at it.
<strong>Related posts:</strong><ol><li><a
href='http://www.skorks.com/2008/10/are-you-actually-a-post-agilist/' rel='bookmark' title='Are You Actually A Post-Agilist?'>Are You Actually A Post-Agilist?</a></li><li><a
href='http://www.skorks.com/2009/08/before-there-was-lean-agile-or-waterfall-there-was-theory-x-y-and-z/' rel='bookmark' title='Before There Was Lean, Agile Or Waterfall There Was Theory X, Y And Z'>Before There Was Lean, Agile Or Waterfall There Was Theory X, Y And Z</a></li><li><a
href='http://www.skorks.com/2009/08/the-most-important-agile-practice-of-all/' rel='bookmark' title='The Most Important Agile Practice Of All'>The Most Important Agile Practice Of All</a></li></ol>]]></description> <content:encoded><![CDATA[<p></p><p>A few days ago I was asked where I thought Agile adoption was at right now. After giving a long and no-doubt confusing answer I thought I would write it up as well. After all if I had to confuse one person I might as well confuse and bore a whole lot of others while I am at it. Therefore, here is where I think the agile world is right now (<em>oh and by the way, the adoption rates below are my own opinion and are based purely on keeping a &#8216;finger on the pulse&#8217; not any statistical evidence</em>):</p><p><strong>The SCRUM People</strong></p><p>Scrum is by far the most well known and widely adopted process right now.  Scrum is becoming almost synonymous with agile with some of the biggest names (Ken Schwaber, Jeff Sutherland etc.) in the agile world pushing scrum as their process of choice. Scrum is one of the few agile process that has a certification path (as offered by the Scrum Alliance) and this is probably one of the main reasons why Scrum has become the most widely accepted agile process. Of course the fact that Scrum bundles the majority of XP practices into itself probably doesn&#8217;t hurt it much either, infact Scrum couldn&#8217;t exist without XP practices.</p><p><em>Adoption Rate: ~ 10%</em></p><p><strong>The XP People</strong></p><p>XP is probably the original Agile process if anything is. It is pretty much a set of common sense practices to make software development better. Many of the practices support each other but there is no common framework that ties them all together. This is probably why many management-type people don&#8217;t really like it much it makes them feel useless and unnecessary. But since we still have to work with all sorts of people including management-types, just about every single other agile process tries to wrap XP in just such a framework (see Scrum above).</p><p><em>Adoption Rate: ~ 7%</em></p><p><strong>The Other SCRUM People</strong></p><p>Of course when something starts to enjoy a bit of success and someone starts making a good living from it, other people get envious of that tasty pie and want to get themselves a piece. These people are disillusioned or simply want to make some cash without being bound by someone elses rules. This is what is happening to Scrum right now. With Scrum becoming more and more successful a lot of people come out all critical about how regular Scrum is not quite right and how they have a much better Scrum (<a
title="Is Scrum Failing Us?" href="http://www.netobjectives.com/blogs/Is-Scrum-Failing-Us" target="_blank">Is Scrum Failing Us?</a>). The Scrum certifications are all bad and how they have bigger and better certifications (<a
title="Scrum Master Certification" href="http://www.netobjectives.com/courses/scrum-master-certification" target="_blank">Scrum Master Certification By Net Objectives</a>).</p><p><em>Adoption Rate: ~ 2%</em></p><p><strong>The Lean People</strong></p><p>Then of course there are people who really want to be different so they come up with a whole different process and even give it a different name and since these people might even have a name within the community their ideas gain instant recognition (<a
title="Lean Software Development" href="http://www.poppendieck.com/" target="_blank">http://www.poppendieck.com/</a>). No matter that the ideas they espouse were always part of the Agile spirit, just the execution may have been faulty (agile doesn&#8217;t kill agile, people kill agile). But hell, why not, let&#8217;s re-brand &#8211; it worked for SOA.  The point is to create a niche, so that more consulting can be offered and more books can be written and if we happen to help people write better software at the same time, well that&#8217;s just an extra benefit.</p><p><em>Adoption Rate: ~ 3%</em></p><p><strong>The People Who Are Over It</strong></p><p>Inevitably there are people who are sick of it. After all Agile has been around for a decade or more now, there are bound to be people who just can&#8217;t be bothered any more. I wrote about it before it&#8217;s called <a
title="Post-Agilism" href="http://www.skorks.com/2008/10/are-you-actually-a-post-agilist/" target="_blank">post-agilism</a>. Sometimes you just get sick of arguing about process. You just want to write good software and deliver value. You know that you can&#8217;t please everyone, you know the good practices and the bad ones. You try to maximize the good ones and minimize the bad ones and do as good a job as you can under the circumstances.</p><p><em>Adoption Rate: ~ 8%</em></p><p><strong>The Clueless People</strong></p><p>For those of us who are into the whole Agile thing it might sometimes seem like the whole world is jumping on the Agile bandwagon. After all most of the job ads these days list Agile as a mandatory skills and everyone seems to be talking about it. Nothing could be further from the truth. The vast majority of people have absolutely no idea, they&#8217;ve heard of this Agile thing but they don&#8217;t know what the hell it&#8217;s all about and they don&#8217;t really care. They might be happy to bandy words but can&#8217;t really be bothered changing the way the work. This applies to both individuals and companies. Even if they are trying to pay lip service to the Agile way, they do it in such a half-arsed way as to make it completely meaningless (quarter-arsed).  Into here we can also bundle the people who think they are doing agile but they aren&#8217;t, people whose upper management says they are doing agile and a whole host of other types of dudes who make this bucket by far the biggest out of the ones I listed.</p><p><em>Adoption Rate: ~ 70%</em></p><p><strong>Conclusion &#8211; Things Could Be Better</strong><em><br
/> </em></p><p>There you go this is the state of the agile process adoption world as I see it right now. That&#8217;s right, I didn&#8217;t include all the other agile and quasi-agile processes such as DSDM, FDD etc. ; that&#8217;s because I think we can either easily lump them with one of my categories (e.g. lump DSDM with the clueless people), or their adoption rates are small enough to neglect, or maybe I just don&#8217;t care to mention them.</p><p>The Agile world seems to be splintering into smaller and smaller bits as more and more people, disillusioned for various reasons, try to peddle their own brand of process.  While this is going on everyone seems to forget the fact that just about any brand of Agile is better than waterfall or ad hoc. Rather than presenting a united front and forcing crappiness, like waterfall, completely out of the software development profession we are like the Greek city states with the giant Persia sitting dismissively on our borders. Except there is no Alexander in sight to unite us all and show them what&#8217;s what.  I hope you enjoy that little bit of allegory.</p><p><strong>Related posts:</strong><ol><li><a
href='http://www.skorks.com/2008/10/are-you-actually-a-post-agilist/' rel='bookmark' title='Are You Actually A Post-Agilist?'>Are You Actually A Post-Agilist?</a></li><li><a
href='http://www.skorks.com/2009/08/before-there-was-lean-agile-or-waterfall-there-was-theory-x-y-and-z/' rel='bookmark' title='Before There Was Lean, Agile Or Waterfall There Was Theory X, Y And Z'>Before There Was Lean, Agile Or Waterfall There Was Theory X, Y And Z</a></li><li><a
href='http://www.skorks.com/2009/08/the-most-important-agile-practice-of-all/' rel='bookmark' title='The Most Important Agile Practice Of All'>The Most Important Agile Practice Of All</a></li></ol></p>]]></content:encoded> <wfw:commentRss>http://www.skorks.com/2009/03/the-current-state-of-the-agile-nation-agile-process-adoption/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> </channel> </rss>
