<?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>/dev/psychology &#187; Perl</title>
	<atom:link href="http://p.einarsen.no/tag/perl/feed/" rel="self" type="application/rss+xml" />
	<link>http://p.einarsen.no</link>
	<description></description>
	<lastBuildDate>Sun, 30 Oct 2011 11:29:36 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Going to OSCON?</title>
		<link>http://p.einarsen.no/going-to-oscon/</link>
		<comments>http://p.einarsen.no/going-to-oscon/#comments</comments>
		<pubDate>Sun, 24 Jul 2011 17:28:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Managing dev teams]]></category>
		<category><![CDATA[jobs]]></category>
		<category><![CDATA[oscon]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[psychology]]></category>

		<guid isPermaLink="false">http://p.einarsen.no/?p=404</guid>
		<description><![CDATA[Interested in discussing psychology and software development? I&#8217;m at the OSCON in Portland, Oregon all week this and I would be really interested to chat with others interested in psychology. I&#8217;m mainly at the conference to help hiring for Booking.com so come and ask for me at the Booking.com stand in the Expo hall. And [...]]]></description>
			<content:encoded><![CDATA[<p>Interested in discussing psychology and software development? I&#8217;m at the <a href="http://oscon.com/">OSCON</a> in Portland, Oregon all week this and I would be really interested to chat with others interested in psychology.</p>
<p>I&#8217;m mainly at the conference to help hiring for Booking.com so come and ask for me at the Booking.com stand in the Expo hall.</p>
<p>And if you&#8217;re interested in any of the many positions we&#8217;re looking to fill also drop by, of course!  Have a look at our available openings at <a title="jobs portal" href="https://booking-openhire.silkroad.com/epostings/index.cfm?version=1&amp;company_id=1006&amp;.en-gb.html?sid=78431b58be9b2972165b78b96b86cda4">the Booking.com jobs portal</a>. We&#8217;re still trying to get hold of many, many experienced Perl developers, and we&#8217;re also willing to teach highly experienced developers in other languages Perl.</p>
]]></content:encoded>
			<wfw:commentRss>http://p.einarsen.no/going-to-oscon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What makes a superstar developer?</title>
		<link>http://p.einarsen.no/what-makes-a-superstar-developer/</link>
		<comments>http://p.einarsen.no/what-makes-a-superstar-developer/#comments</comments>
		<pubDate>Wed, 22 Jun 2011 21:07:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Learning]]></category>
		<category><![CDATA[Managing dev teams]]></category>
		<category><![CDATA[black swans]]></category>
		<category><![CDATA[developers]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Superstars]]></category>

		<guid isPermaLink="false">http://p.einarsen.no/?p=402</guid>
		<description><![CDATA[A funny discussion is going on at HBR Blogs:  Management-type blogger Bill Taylor suggests our culture wrongly celebrates the super-stars, and claims great people are overrated, on the cost of well-functioning teams (via Igor Sutton). But, to illustrate his example he uses software engineers as an example. Cue outpouring of frustration &#8211; Bill&#8217;s getting hammered [...]]]></description>
			<content:encoded><![CDATA[<p>A funny discussion is going on at HBR Blogs:  Management-type blogger Bill Taylor suggests our culture wrongly celebrates the super-stars, and claims <a href="http://blogs.hbr.org/taylor/2011/06/great_people_are_overrated.html">great people are overrated</a>, on the cost of well-functioning teams (<a href="http://igorsutton.com/">via Igor Sutton</a>). But, to illustrate his example he uses software engineers as an example. Cue outpouring of frustration &#8211; Bill&#8217;s getting hammered in the comment section.</p>
<p>So what&#8217;s the problem?</p>
<p>First, try to look past that Bill skipped 30 years of research and experience in software engineering and stamps into it like a PHB-cliche, seemingly assuming his opinion is as valid as any research on the subject. That alone probably ticked off the defensive reaction in any software developer accidentally stumbling into the Harvard Business Review blog section.</p>
<p>The main misunderstanding is the assumption that there is only one type of talent. And both Taylor and a fair amount of the commenters makes this mistake and applies their experience with basic bell-curve measured skills onto a type of talent that is ruled by other laws.  <strong><a href="http://www.fooledbyrandomness.com/">Nassim Nicholas Taleb</a> </strong>discusses this distinction in great detail in <a href="http://en.wikipedia.org/wiki/Black_swan_theory">The Black Swan</a> &#8211; <a href="http://www.math.nyu.edu/fellows_fin_math/gatheral/extremistan.pdf">the environments of &#8220;mediocristan&#8221; and &#8220;extremistan&#8221;.</a> The first which you can understand using the bell curve and gaussian distribution, the latter where differences are of an order of magnitude and are qualitative or disruptive differences.</p>
<p>For example, in most manual labour or production line work, a practitioner can get good or even excellent, but mostly within a range that can be measured safely with standard deviations and the differences between average and excellent performance does not differ in it&#8217;s nature, but it&#8217;s output. Here throwing more people at the problem can solve it &#8211; maybe your top salesman makes ten sales a week while your average makes 4. Well, throw in 3 averages and you&#8217;re just as good. That&#8217;s not necessarily good economy or a good idea, but it can get you where you want.</p>
<p>In contrast, in the world of &#8220;extremistan&#8221;, a difference in skill can be of such a magnitude that it makes a qualitative difference. In the comment section of Taylor&#8217;s article, someone asks, &#8220;Would you want a Shakespeare or 100 Bill Taylor&#8217;s?&#8221;, and countless variations on the theme. And software engineering is that sort of talent. A &#8220;superstar developer&#8221; doesn&#8217;t necessarily a programming Shakespeare make, but he or she can make something a lesser qualified individual can never do, or do it so fast it makes the difference between staying in competition or not. Or just connect the dots and save the day.</p>
<p>Throw in the special problem of software engineering that putting one more person on a task tends to double the time it takes to solve it, and the effect is even larger.</p>
<p>But then, the Bill Taylor&#8217;s take their experiences with the &#8220;mediocristan&#8221; type of talent and applies it on the very different world of software engineering. It comes out, as is well pointed out in the comment section, as commoditization of something that can not be commoditized. Software development can&#8217;t be reduced to the number of lines written per day, in any meaningful way. Even business people who really, really want to think about it in that way, will still be wrong. It has been discussed and demonstrated countless times. The classic <a href="http://javatroopers.com/Mythical_Man_Month.html">&#8220;The Mythical Man-Month&#8221;</a> explains how you can&#8217;t just think of your software engineers as burger flippers.</p>
<p>When the original blog post received so much vitriol, it comes from <em>every software engineer in the world&#8217;</em>s experience with clueless managers who approach development in the Bill Taylor way. Today&#8217;s successful companies are ran in a different way, by Zuckerberg&#8217;s and Steve Jobs&#8217; who are playing in a the-winner-takes-it-all world of the Internet. It doesn&#8217;t take that many, as long as you have the right people &#8211; Facebook has 2000 employees serving over 600 million users.</p>
<h3>So what makes a super star developer?</h3>
<p>I believe in the old truism that the difference between developers can be of the 100x magnitude &#8211; I actually think the<a href="http://p.einarsen.no/the-net-negative-production-programmer/"> Net Negative Production Programmer</a> is a reality, so accordingly a top developer is infinitely better than the worst&#8230; However, unless you think the superstars have their skills handed down to them by divine intervention, something must have brought them to this. Here&#8217;s some points I believe are what makes up the super star:</p>
<ul>
<li><strong>It&#8217;s knowing the codebase well</strong>. The superstar is often the guy who knows the codebase to the last semi-colon. It&#8217;s not about being the smartest guy in the room, but just knowing exactly where to hack in that little change, and that little change, and that little change, and that little change&#8230;. before lunch.</li>
</ul>
<ul>
<li><strong>It&#8217;s content knowledge. </strong>The superstar is the guy who also knows the content of what he is coding really well. If you&#8217;re making a chess bot, the developer who is also a chess grandmaster knows all the elements, the edge cases and the purpose of what he is trying to do. He will have a working prototype running while the developer without any chess background is still trying to understand all the implicit assumptions in the instructions he got from his <a href="http://en.wikipedia.org/wiki/Scrum_(development)#Core_Scrum_roles">Scrum Product Owner</a>. I think this one is essential, and so often overlooked. Knowing the thing you work with, and working with what you find interesting is not only making development work into a whole other ballgame, it&#8217;s also does wonders for motivation.</li>
</ul>
<ul>
<li><strong>It&#8217;s situational. </strong>You can&#8217;t throw Linus Torvalds, Larry Wall or Bill Joy into your hack app shop and expect to have the next Angry Birds in a month. You need the right person and the right setting.</li>
</ul>
<ul>
<li><strong>It&#8217;s knowing programming well. </strong>The superstar developer doesn&#8217;t have to be a superstar in the inner working of his programming language &#8211; but he knows it well enough that it&#8217;s not in the way of him reaching his ultimate goal.</li>
</ul>
<ul>
<li><strong>It&#8217;s practice, practice, practice. </strong>Yeah exactly! No one is born into superstardom. This is written about a lot, and <a href="http://www.gladwell.com/outliers/index.html">Malcolm Gladwell&#8217;s thesis of the 10.000 hours of practice rule</a> really applies the software engineering too. One complicating factor with this point is, as I wrote about in<a href="http://p.einarsen.no/accelerate-your-perl-learning/"> accelerating your Perl learning</a>, that most developers are on a lifelong learning mission anyways. They (we&#8230;) always look to learn something new, so what puts the superstar apart from the average? It&#8217;s not that easy to pick out, but in his article about the 10.000 hours of practice, Gladwell touches upon the differences of training and learning. It&#8217;s a large field of research and I hope to post more about it later.</li>
</ul>
<ul>
<li><strong>It&#8217;s a high level of intelligen</strong>ce. But not necessarily an extreme level of intelligence. However, a certain level of numeracy and ability of thinking in abstractions is necessary.  Maybe at some point we&#8217;ll find that super developers are able to hold more variables at the same time in their working memory, or something along those lines, and that turns out to explain the differences. But I have yet to see any research like that.</li>
</ul>
<p>And it&#8217;s motivation&#8230; and the right management&#8230; but these things are also things external to the superstar, that you one move around to find. The brain finds it&#8217;s ideal setting..</p>
<p>So there, that&#8217;s what put the superstars apart from the average. I&#8217;d love to hear others&#8217; take on it.</p>
<p><span style="font-size: 15px; font-weight: bold;">The sad thing is&#8230;</span></p>
<p>..that reality is that a well functioning team can usually match the lone superstar or even has it&#8217;s own advantages. <em>It&#8217;s actually a good message</em>: let&#8217;s not just celebrate these few people, they&#8217;re brought forward on the shoulders of people going through the daily grind of facilitating it and cleaning up the mess. Or we can achieve great things just by working together. It&#8217;s just presented so boneheadedly wrong.</p>
<p>Finally, Bill followed up with <a href="http://blogs.hbr.org/taylor/2011/06/great_people_are_overrated_par.html">a clarification of some sorts,</a> basically that IBM is made up of average people and see how long they have lasted, while Enron was full of superstars, and look how they crashed.  I wonder what IBM thinks of his base assumption there.</p>
]]></content:encoded>
			<wfw:commentRss>http://p.einarsen.no/what-makes-a-superstar-developer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Accelerate your Perl learning 2: From novice to adept</title>
		<link>http://p.einarsen.no/accelerate-your-perl-learning-2-from-novice-to-adept/</link>
		<comments>http://p.einarsen.no/accelerate-your-perl-learning-2-from-novice-to-adept/#comments</comments>
		<pubDate>Sat, 14 Nov 2009 08:40:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Language]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Expert knowledge]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://p.einarsen.no/?p=324</guid>
		<description><![CDATA[I stated in an article some time back that a challenge in learning is that the knowledge setting experts apart from novices isn&#8217;t explicitly known by either &#8211; it&#8217;s tacit knowledge. Since that was about learning Perl, I just want to bring attention to this good series of blog posts by chromatic under the header [...]]]></description>
			<content:encoded><![CDATA[<p>I stated in <a href="http://p.einarsen.no/accelerate-your-perl-learning/" target="_blank">an article some time back that a challenge in learning</a> is that the knowledge setting experts apart from novices isn&#8217;t explicitly known by either &#8211; it&#8217;s <em><a href="http://en.wikipedia.org/wiki/Tacit_knowledge" target="_blank">tacit knowledge</a></em>. Since that was about learning Perl, I just want to bring attention to this good series of blog posts by <a href="http://www.modernperlbooks.com/mt/" target="_blank">chromatic</a> under the header &#8220;From Novice To Adept&#8221;, as they fill in a bit of this gap:</p>
<ul>
<li></li>
<li><a href="http://www.modernperlbooks.com/mt/2009/11/from-novice-to-adept-the-risk-of-being-undone.html" target="_blank">The Risk of Being Undone</a></li>
<li><a href="http://www.modernperlbooks.com/mt/2009/11/from-novice-to-adept-the-risk-of-maintenance.html" target="_blank">The Risk of Maintenance</a></li>
<li><a href="http://www.modernperlbooks.com/mt/2009/11/from-novice-to-adept-the-risk-of-failure.html" target="_blank">The Risk of Failure</a></li>
<li><a href="http://www.modernperlbooks.com/mt/2009/11/from-novice-to-adept-pronouns-in-perl.html" target="_blank">Pronouns in Perl</a></li>
<li><a href="http://www.modernperlbooks.com/mt/2009/11/from-novice-to-adept-functional-versus-structural-code.html" target="_blank">Functional versus Structural Code</a></li>
<li><a href="http://www.modernperlbooks.com/mt/2009/11/from-novice-to-adept-the-act-of-naming.html" target="_blank">The Act of Naming</a></li>
<li><a href="http://www.modernperlbooks.com/mt/2009/11/from-novice-to-adept-the-act-of-naming.html" target="_blank">On Answers to Smart Questions</a></li>
<li><a href="http://www.modernperlbooks.com/mt/2009/10/from-novice-to-adept-embrace-the-copious-documentation.html" target="_blank">Embrace the Copious Documentation</a></li>
<li><a href="http://www.modernperlbooks.com/mt/2009/10/from-novice-to-adept-embracing-idioms.html" target="_blank">Embracing Idioms</a></li>
<li><a href="http://www.modernperlbooks.com/mt/2009/10/from-novice-to-adept-cleaning-up-bad-code.html" target="_blank">Cleaning Up Bad Code</a></li>
<li><a href="http://www.modernperlbooks.com/mt/2009/10/from-novice-to-adept-declarations-and-scope.html" target="_blank">Declarations and Scope</a></li>
<li><a href="http://www.modernperlbooks.com/mt/2009/10/from-novice-to-adept-scalar-context-and-arrays.html" target="_blank">Scalar Context and Arrays</a><a href="http://www.modernperlbooks.com/mt/2009/10/from-novice-to-adept-cleaning-up-bad-code.html" target="_blank"><br />
</a></li>
</ul>
<p>And a bonus: <a href="http://www.modernperlbooks.com/mt/2010/01/essential-skills-for-perl-5-programmers.html" target="_blank">Essential Skills For Perl 5 Programmers.</a></p>
<p>Are there any other good resources out there expicitly aiming at taking novices to the next level &#8211; or is that just when general &#8220;documentation&#8221; takes over as learning instruments? What&#8217;s it like in other languages?</p>
<p>Also, while updating with Perl news, scruffy old perl.org has become <a href="http://www.perl.org/" target="_blank">dashing new perl.org</a>!</p>
<p><em>Updated with new articles March 8, 2010</em><em>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://p.einarsen.no/accelerate-your-perl-learning-2-from-novice-to-adept/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The Great Perl Comeback?</title>
		<link>http://p.einarsen.no/the-great-perl-comeback/</link>
		<comments>http://p.einarsen.no/the-great-perl-comeback/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 20:50:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Language]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://p.einarsen.no/?p=315</guid>
		<description><![CDATA[Google Timeline is a wonderful tool! Here is a Google Timeline for the search &#8220;Perl&#8221; showing an exceptionally interesting trend: It may seem like the recent efforts to market Perl, as well as the Perl Ironman blogging drive, is paying off big time in terms of online attention! The graph certainly sends a clear message [...]]]></description>
			<content:encoded><![CDATA[<p>Google Timeline is a wonderful tool! Here is <a href="http://www.google.com/search?q=perl&amp;hl=en&amp;client=safari&amp;rls=en&amp;tbo=1&amp;tbs=tl:1,tll:2000,tlh:2019&amp;ei=bpHwStijEsXI-QaLqLjrBw&amp;sa=X&amp;oi=timeline_histogram_main&amp;ct=timeline-histogram&amp;cd=11&amp;ved=0CBMQyQEoCw" target="_blank">a Google Timeline for the search &#8220;Perl&#8221;</a> showing an exceptionally interesting trend:</p>
<p><a href="http://www.google.com/search?q=perl&amp;hl=en&amp;client=safari&amp;rls=en&amp;tbo=1&amp;tbs=tl:1,tll:2000,tlh:2019&amp;ei=bpHwStijEsXI-QaLqLjrBw&amp;sa=X&amp;oi=timeline_histogram_main&amp;ct=timeline-histogram&amp;cd=11&amp;ved=0CBMQyQEoCw" target="_blank"><img title="Skjermbilde 2009-11-03 kl. 20.48.47" src="http://p.einarsen.no/wp-content/uploads/2009/11/Skjermbilde-2009-11-03-kl.-20.48.47.png" alt="The great Perl comeback?" width="492" height="127" /></a></p>
<p>It may seem like the <a href="http://perlhacks.com/2009/07/marketing-perl.php" target="_blank">recent</a> <a href="http://use.perl.org/~Ovid/journal/39353" target="_blank">efforts</a> to <a href="http://szabgab.com/blog/2009/07/1248529850.html" target="_blank">market Perl</a>, as well as <a href="http://ironman.enlightenedperl.org/" target="_blank">the Perl Ironman blogging drive</a>, is paying off big time in terms of online attention!  The graph certainly sends a clear message that Perl is alive and kicking as never before.</p>
<p>Note: I tried to create comparative graphs for Ruby, Python and Java, but was left with enough noise from fake gems, snake attacks and earthquakes to fill several Hollywood movies. Any suggestions for good searches for comparison are welcome.</p>
<p>Note 2: Maybe this is just caused by some Google indexing algorithm gone bad, but a quick visual inspection of the first 100 hits indicated that the August and September hits are real Perl mentions.  Is this a real empirical indication that the recent efforts are really paying off?</p>
]]></content:encoded>
			<wfw:commentRss>http://p.einarsen.no/the-great-perl-comeback/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>New newsletter from Programming Psychology Interest Group</title>
		<link>http://p.einarsen.no/new-newsletter-from-programming-psychology-interest-group/</link>
		<comments>http://p.einarsen.no/new-newsletter-from-programming-psychology-interest-group/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 18:27:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Resources]]></category>
		<category><![CDATA[links]]></category>
		<category><![CDATA[newsletter]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[PPIG]]></category>

		<guid isPermaLink="false">http://p.einarsen.no/?p=293</guid>
		<description><![CDATA[This would perhaps not be newsworthy normally, but I thought the PPIG newsletter was dead. Those rumours were apparently highly exaggerated: the November 2009 issue was just released, detailing among other things the PPIG 2009 workshop and the upcoming 2010 workshop. It also includes a few links to some really interesting blog posts: Does parallel [...]]]></description>
			<content:encoded><![CDATA[<p>This would perhaps not be newsworthy normally, but I thought the PPIG newsletter was dead. Those rumours were apparently highly exaggerated:<a href="http://ppig.org/newsletters/2009-11.html" target="_blank"> the November 2009 issue was just released</a>, detailing among other things the PPIG 2009 workshop and the upcoming 2010 workshop.</p>
<p>It also includes a few links to some <strong>really</strong> interesting blog posts: <a href="http://gcn.com/blogs/tech-blog/2009/06/new-parallel-processing-languages.aspx" target="_blank">Does parallel processing require new languages?</a>, <a href="http://www.artima.com/weblogs/viewpost.jsp?thread=252702" target="_blank">What do you consider readable code?</a>, <a href="http://www.sans.org/top25-programming-errors/" target="_blank">The Top 25 Most Dangerous Programming Errors</a> and this <a href="http://www.computerworld.com.au/index.php?q=article/270267/-z_programming_languages_perl&amp;fp=&amp;fpid=" target="_blank">old article from Computerworld on how community and culture goes hand in Perl</a>.</p>
<p>Enjoy.</p>
<p>Oh, and it also seems to be written extensively in rhyme.</p>
]]></content:encoded>
			<wfw:commentRss>http://p.einarsen.no/new-newsletter-from-programming-psychology-interest-group/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Does code base structure follow organization structure?</title>
		<link>http://p.einarsen.no/does-code-base-structure-follow-organization-structure/</link>
		<comments>http://p.einarsen.no/does-code-base-structure-follow-organization-structure/#comments</comments>
		<pubDate>Wed, 28 Oct 2009 08:19:08 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Managing dev teams]]></category>
		<category><![CDATA[Understanding Code]]></category>
		<category><![CDATA[bugs]]></category>
		<category><![CDATA[organizations]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[structure]]></category>

		<guid isPermaLink="false">http://p.einarsen.no/does-code-base-structure-follow-organization-structure/</guid>
		<description><![CDATA[After writing about the Software Engineering Myths Microsoft claims to have busted, I&#8217;ve been thinking about their find that organization structure is the most predictive factor for bugs. And it makes me think, to what degree are organizations&#8217; code bases shaped by their formal or informal organization structure? Are core modules and root objects often [...]]]></description>
			<content:encoded><![CDATA[<p>After writing about the <a href="http://p.einarsen.no/debunking-software-engineering-myths-does-the-organization-matter-more-than-the-programming/" target="_blank">Software Engineering Myths Microsoft claims to have busted</a>, I&#8217;ve been thinking about their find that organization structure is the most predictive factor for bugs.</p>
<p>And it makes me think, to what degree are organizations&#8217; code bases shaped by their formal or informal organization structure? Are core modules and root objects often the domain of senior developers and objects lower in the hierarchy the domain of juniors? My experience is that it often tends to be, and it seems a reasonable overlap: after all, you want your more trusted developers fiddling where the damage can be greatest.</p>
<p>But how about other attributes of the code base? In the world of Perl, are CPAN authors often hired as external consultants? Are the most communicative programmers the ones that will write network services? Are the modules most used also written by the programmers that are most in contact with others?</p>
<p>And does organization structure also shape general code base structure? Will a more hierarchical organization tend more towards hierarchical object structures, while more chaotic or flat organizations tend towards more chaotic or flat code organization?</p>
<p>A lot of questions, but no answers&#8230; But one thing that comes to mind is, if organization and code structure follows each other, is this a good idea? I think few people designing a data model or object hierarchy starts with the organization structure as a blueprint, but speaking from my own limited experience, you can often at least see a reflection of either in both.  Is this a good or bad thing? What can the consequences be?</p>
]]></content:encoded>
			<wfw:commentRss>http://p.einarsen.no/does-code-base-structure-follow-organization-structure/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Debunking Software Engineering Myths: Does the organization matter more than the programming?</title>
		<link>http://p.einarsen.no/debunking-software-engineering-myths-does-the-organization-matter-more-than-the-programming/</link>
		<comments>http://p.einarsen.no/debunking-software-engineering-myths-does-the-organization-matter-more-than-the-programming/#comments</comments>
		<pubDate>Sun, 18 Oct 2009 13:27:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Managing dev teams]]></category>
		<category><![CDATA[Case study]]></category>
		<category><![CDATA[code quality]]></category>
		<category><![CDATA[dynamic typing]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Research]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://p.einarsen.no/?p=270</guid>
		<description><![CDATA[I&#8217;ve been wanting to post a link to this article for a while, but ever since I discovered it, research.microsoft.com has been unreachable for me, so I&#8217;ll post a small summary: Microsoft has done research on some popular conceptions about software engineering and come up with hard numbers on some factors affecting code quality.  Here [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been wanting to post a link to this article for a while, but ever since I discovered it, <a href="http://research.microsoft.com/" target="_blank">research.microsoft.com</a> has been unreachable for me, so I&#8217;ll post a small summary:</p>
<p>Microsoft has done research on some popular conceptions about software engineering and come up with hard numbers on some factors affecting code quality.  Here are the main findings reported in the artice, with links to the research papers, in case the original is lost forever:</p>
<ul>
<li>More test coverage does <strong>not</strong> equal better code quality, as measured by number of post-release fixes.  Usage patterns and code complexity are the main reason test coverage is a poor predictor of quality.</li>
<li><a href="http://en.wikipedia.org/wiki/Test-driven_development" target="_blank">Test Driven Development</a> increases quality, creating code that was up to 40% to 90% better in the Microsoft research. The cost is increased development time, 15% to 35% in the same studies. (<a href="http://portal.acm.org/citation.cfm?id=1380664" target="_blank">Realizing quality improvement through test driven development: results and experiences of four industrial teams</a>)</li>
<li>Use of <a href="http://en.wikipedia.org/wiki/Assertion_(computing)" target="_blank">Assertions</a> decrease program faults. However, this is also correlated with programmer experience, meaning more experienced programmers generally write more assertions and have less program faults. (<a href="http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=4021986" target="_blank">Assessing the Relationship between Software Assertions and Faults: An Empirical Investigation</a>). And here is <a href="http://lambda-the-ultimate.org/node/1912" target="_blank">more about Assertions</a>.</li>
<li>Organizational metrics, which are not related to the code, can predict software failure-proneness with a precision and recall of 85 percent. Not only that, but organizational structure was by far <em>the best predictor of code quality</em>, and was at least 8% percent better than the best predictor the researchers could get from code-based measurements. (<a href="http://portal.acm.org/citation.cfm?id=1368160" target="_blank">The influence of organizational structure on software quality: an empirical case study</a>)</li>
<li>Organizational closeness is more important than geographical closeness, which has no effect on quality (<a href="http://macbeth.cs.ucdavis.edu/distributed.pdf" target="_blank">Does Distributed Development Affect Software Quality? An Empirical Case Study of Windows Vista</a>)</li>
</ul>
<p>Here&#8217;s Microsoft&#8217;s article: <a href="http://research.microsoft.com/en-us/news/features/nagappan-100609.aspx" target="_blank">Exploding Software-Engineering Myths</a> (or if that doesn&#8217;t work, <a href="http://74.125.77.132/search?q=cache:HRiBUTlXJmQJ:research.microsoft.com/en-us/news/features/nagappan-100609.aspx+http://research.microsoft.com/en-us/news/features/nagappan-100609.aspx&amp;cd=1&amp;hl=en&amp;ct=clnk&amp;client=safari" target="_blank">a Google Cache link).</a></p>
<p>One drawback with this research is that this is primarily based on case studies, which is a generally poor research method for drawing general conclusions. How valid are these observations for other organizations outside Microsoft? Is the organizational structure of your project or company actually more decisive than your programming methodology?</p>
<p>Also, how transferable is this to other programming frameworks. In dynamic typed languages like Perl, is test coverage more important? I often find that a sub-set of my tests do what a compiler could have done in a statically typed language, or even for Perl if I just had a more automatic testing tool. So maybe coverage would be more predictive of bugs if the compiler catches fewer mistakes? That would be a good candidate for further research.</p>
<p>However, this is excellent as a step towards more <a href="http://portal.acm.org/citation.cfm?id=999432" target="_blank">evidence-based software engineering</a>.</p>
<p>Found through <a href="http://johntellsall.blogspot.com/2009/10/empirical-data-behind-software.html" target="_blank">John Tells All</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://p.einarsen.no/debunking-software-engineering-myths-does-the-organization-matter-more-than-the-programming/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Why do programmer personality types matter?</title>
		<link>http://p.einarsen.no/programmer-personality-types-and-why-it-matters-at-all/</link>
		<comments>http://p.einarsen.no/programmer-personality-types-and-why-it-matters-at-all/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 21:13:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Understanding Code]]></category>
		<category><![CDATA[API's]]></category>
		<category><![CDATA[Cognition]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Personality]]></category>
		<category><![CDATA[Style]]></category>

		<guid isPermaLink="false">http://p.einarsen.no/?p=238</guid>
		<description><![CDATA[How do programmers differ, and why should you care? Steven Clarke from Microsoft&#8217;s usability labs has identified and demonstrated at least three different programmer styles, which has been reported in quite a few places, hence programmers do indeed differ. The types Clarke found are: THE SYSTEMATIC DEVELOPER: Writes code defensively. Does everything he or she [...]]]></description>
			<content:encoded><![CDATA[<p>How do programmers differ, <em>and why should you care</em>? <a href="http://blogs.msdn.com/stevencl/" target="_blank">Steven Clarke</a> from Microsoft&#8217;s usability labs has identified and demonstrated at least three different programmer styles, which has been reported in quite <a href="http://www.mertner.com/morten/?p=11" target="_blank">a</a> <a href="http://asserttrue.blogspot.com/" target="_blank">few</a> <a href="http://blogs.msdn.com/brada/archive/2003/11/18/50737.aspx" target="_blank">places</a>, hence programmers do indeed differ. The types Clarke found are:</p>
<blockquote><p><strong>THE SYSTEMATIC DEVELOPER: </strong>Writes code defensively. Does everything he or she can to protect code from unstable and untrustworthy processes running in parallel with their code. Develops a deep understanding of a technology before using it. Prides himself or herself on building elegant solutions.<br />
<strong>THE PRAGMATIC DEVELOPER:</strong> Writes code methodically. Develops sufficient understanding of a technology to enable competent use of it. Prides himself or herself on building robust applications.<br />
<strong>THE OPPORTUNISTIC DEVELOPER: </strong>Writes code in an exploratory fashion. Develops a sufficient understanding of a technology to understand how it can solve a business problem. Prides himself/herself on solving business problems.</p></blockquote>
<p><em>Now why should you care?</em></p>
<p>Almost every mention I&#8217;ve seen of this online &#8211; or of any other personality type categorization system &#8211; is usually followed by a &#8220;<em>which type are you</em>?&#8221;. This misses the point utterly and completely. Psychological research like this first becomes really valueable when you <strong>stop thinking about yourself </strong>and start asking how this can help you <strong>understand</strong> <strong>other people</strong>. If you design API&#8217;s and base your design on what makes most sense to your own coding style, you will create something that two thirds of your audience will find difficult to use. Even if you don&#8217;t like or agree with their style.</p>
<p>Granted, that makes the assumption that programmers are always equally distributed among styles, which is a pretty wild assumption. The point is that other people are more likely to think differently than similarly to you.</p>
<p>That is also a good thing to keep in mind when formatting code for readability: if your coding style differs from standard <a href="http://perltidy.sourceforge.net/" target="_blank">Perl Tidy</a> or your company&#8217;s coding standard, keep in mind that you are not formatting for yourself, but a colleague, maintainer or anonymous CPAN downloader. They are more likely to understand a common standard than your standard.  It sounds obvious, don&#8217;t it? I don&#8217;t think many (any) programmers think like this even so.</p>
<p><img class="alignright" title="Figure 1" src="http://p.einarsen.no/wp-content/upload/clarke.fig1.png" alt="" width="232" height="237" />Now, <a href="http://brad_abrams.members.winisp.net/Projects/APIDesignPapers/MeasuringAPIUsability.pdf" target="_blank">Clarke, in an article to Dr. Dobbs Journal</a>, has an example of a cognitive mapping of programmer types and API traits which is quite illustrative.  In Figure 1, thick blue lines shows the expectations of a particular programmer type, while the dark lines shows the score of a particular API. As you can see in this case, the match is bad. Now the good thing is that Clarke&#8217;s research gives you a framework to discuss how and why.</p>
<p><a href="http://brad_abrams.members.winisp.net/Projects/APIDesignPapers/Dagstuhl.pdf" target="_blank">That&#8217;s important because programming style isn&#8217;t related to experience level or educational background.</a> An programmer with an opportunistic style will not necessarily grow into a systematic programmer with more experience, neither will a systematic programmer become more pragmatic with age. Or perhaps they will &#8211; but you can&#8217;t assume that.</p>
<p>Finally, the dimensions which Clarke suggests APIs can be understood on at a cognitive level:</p>
<blockquote><p>• <strong>Abstraction level. </strong>The minimum and maximum levels of abstraction exposed by the API, and the minimum and maximum levels usable by a targeted developer.</p>
<p>• <strong>Learning style.</strong> The learning requirements posed by the API, and the learning styles available to a targeted developer.</p>
<p>• <strong>Working framework.</strong> The size of the conceptual chunk (developer working set) needed to work effectively.</p>
<p>• <strong>Work-step unit. </strong>How much of a programming task must/can be completed in a single step.</p>
<p>• <strong>Progressive evaluation.</strong> To what extent partially completed code can be executed to obtain feedback on code behavior.</p>
<p>• <strong>Premature commitment</strong>. The amount of decisions that developers have to make when writing code for a given scenario and the consequences of those decisions.</p>
<p>• <strong>Penetrability</strong>. How the API facilitates exploration, analysis, and understanding of its components, and how targeted de- velopers go about retrieving what is needed.</p>
<p>• <strong>API elaboration.</strong> The extent to which the API must be adapted to meet the needs of targeted developers.</p>
<p>• <strong>API viscosity.</strong> The barriers to change inherent in the API, and how much effort a targeted developer needs to expend to make a change.</p>
<p>• <strong>Consistency.</strong> How much of the rest of an API can be inferred once part of it is learned.</p>
<p>• <strong>Role expressiveness.</strong> How apparent the relationship is between each component exposed by an API and the program as a whole.</p>
<p>• <strong>Domain correspondence.</strong> How clearly the API components map to the domain and any special tricks that the developer needs to be aware of to accomplish some functionality.</p></blockquote>
<p>Steven Clarke seems to have discontinued his blog, but his scientific work is <a href="http://en.scientificcommons.org/steven_clarke" target="_blank">chronicled at Scentific Commons</a>.</p>
<p>(Found, among other places, <a href="http://asserttrue.blogspot.com/" target="_blank">assertTrue()</a> ).</p>
]]></content:encoded>
			<wfw:commentRss>http://p.einarsen.no/programmer-personality-types-and-why-it-matters-at-all/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Accelerate your Perl learning</title>
		<link>http://p.einarsen.no/accelerate-your-perl-learning/</link>
		<comments>http://p.einarsen.no/accelerate-your-perl-learning/#comments</comments>
		<pubDate>Wed, 30 Sep 2009 21:23:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Learning]]></category>
		<category><![CDATA[Arrested Development]]></category>
		<category><![CDATA[Excersise]]></category>
		<category><![CDATA[Omega-3]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://p.einarsen.no/?p=183</guid>
		<description><![CDATA[This is inspired by an article by chromatic from ages back, about your programming force multipliers. I think improving your learning is a major &#8220;force multiplier&#8221;, so this is about how to do that. Observation 1: Most programmers are on a life-long learning mission. Actually, all programmers are. Programming is about solving problems. You must pick [...]]]></description>
			<content:encoded><![CDATA[<p>This is inspired by an article by <a href="http://modernperlbooks.com/mt/index.html" target="_blank">chromatic</a> from ages back, about your <a href="http://broadcast.oreilly.com/2008/12/force-multipliers-for-developers.html" target="_blank">programming force multipliers</a>. I think improving your learning is a major &#8220;force multiplier&#8221;, so this is about how to do that.</p>
<p><strong>Observation 1</strong>: <em>Most programmers are on a life-long learning mission</em>.</p>
<p>Actually, <strong>all</strong> programmers are. Programming is about solving problems. You must pick up <em>something </em>from that.</p>
<p><strong>Observation 2</strong>: <em>Learning happens at different speeds, both between individuals and within the same individual. </em></p>
<p>One day you get the point of mod_perl and burst forward, after  making CGI-scripts in the same way for three years. At the same time your colleague kept discovering new cool skills every week.</p>
<p><strong>Accordingly</strong>, most programmers should be concerned not about their learning, but also their <em>learning velocity. </em>Your skill level is not only based on what you know, but how long it took you to learn it and how much more you can manage to squeeze in during your programmer life-span! If you&#8217;re ambitious, but your learning curve is slow or stuck, someone will put you on the sidelines. If your goal is to really understand something, you will be able to reach a deeper understanding if you can fit more learning into a short timespan.</p>
<p>So, this isn&#8217;t about using <a href="http://www.google.com/search?client=safari&amp;rls=en&amp;q=accelerated+learning&amp;ie=UTF-8&amp;oe=UTF-8" target="_blank">mind-maps, role-plays or fancy games at a training course</a>. Rather, this is about tactics and strategies for life-long learning, or the kind of <a href="http://tribes.tribe.net/ernstfuchs/thread/530b25e5-1644-4b99-b31d-f8125b8016c1" target="_blank">ten-year long learning</a> it takes to <a href="http://www.scientificamerican.com/article.cfm?id=the-expert-mind" target="_blank">create world-class expertise</a>. I want to share something about what Psychology knows about making us learn more, faster, better and deeper &#8211; as well as some personal experiences &#8211; and hopefully get some feedback about people&#8217;s own experiences about increasing their learning rate.</p>
<p>So here are some points:</p>
<h2>Avoid Arrested Development</h2>
<p>You start a new job. You have an amazing learning curve while you pick up knowledge and skills from your new colleagues. Six months in you&#8217;ve found the comfort level at which you can do your job well. Six years later you are still at that level. <em>Meet Arrested Development</em>.  This is why some people are Formula 1 drivers, while most people drive their car good enough to get them to work and the beach.</p>
<p>Getting out of arrested development might not be easy. One key is to avoid automatic behaviours. In coding, this is to be aware of your habits and trying to break them up. Starting every day with opening a secure shell to the server and starting vim? How about learning to use <a href="http://padre.perlide.org/" target="_blank">Padre</a> instead? Always firing up CGI::Application for every new web application? Learn Catalyst, HTML::Mason, even Ruby on Rails.</p>
<p>Or push your limits. Try taking on larger responsibilities. Take on a project that is larger, more complex or more difficult than anything you&#8217;ve built before.</p>
<p>The problem with getting out of arrested development is that it might take unlearning of the comfort level, and actually decrease your productivity and even understanding temporarily. It&#8217;s actually quite easy to explain in a programming setting: If you&#8217;re moving on from CGI::Application to Catalyst, your first web application is going to take longer than normal to develop. But your next one might be a big step forward for both you and human-kind.</p>
<p>(Although probably mostly for you)</p>
<h2>Take Risks</h2>
<p>It is found, again and again, that taking risk is a driving force in learning. In experiments in controlled learning environments, it is regularly found that being willing to try out more, click more buttons and do individual try-and-see experimenting is clearly correlated with higher outcomes in learning. And it&#8217;s just because the risk-takers will get more learning opportunities, they will simply see more of how things work.</p>
<p>So make sure you have a safe testing environment, a box for experiments and wild ideas. Try to break things that work, find edge cases or do things in a new way. Have a machine you can re-install without losing your precious collection of photos. Write some crazy ideas on your blog. Try and see what happens. But most important: Create a technical environment that is conductive to risk-taking, just as much as a social environment. If your development server is a sacred cow or people are dependent upon it, set up a crash-test server.</p>
<p>I think a reason <a href="http://en.wikipedia.org/wiki/Test-driven_development" target="_blank">Test Driven Development </a>is working is also because it forces you to think about and try out your software. Writing tests is also a great way to get to know new packages or software suites, you can take risks you would never imagine doing while developing code. <em>This method</em><em> takes two scalars? I wonder what happens if I give it a 10.000 element list of japanese characters!</em></p>
<p>And let me repeat this: <em>Take on a project that is larger, more complex or more difficult than anything you&#8217;ve built before.</em></p>
<h2>Learn the right things</h2>
<p>Some knowledge needs pre-requisite knowledge. It&#8217;s just a fact of life. If you try to learn how to make 3d graphics, it will take you a lot longer if you don&#8217;t know vector mathematics. (And you might want to look at something other than Perl for implementation..)</p>
<p>It&#8217;s pretty obvious stuff.</p>
<p>What is less obvious is what the optimal learning direction in computer programming actually is. In Perl, is there a learning run that is better than others? A sequence of reading perldocs that is more effective than another? I can certainly imagine some bad and good places to start, but everyone can do that. What is more unclear is what happens after that start. When you&#8217;re half-good and can do what you want, but want to expand, what is the most optimal directions to follow?</p>
<p>I actually don&#8217;t have a good answer to that yet. My only advice would be that if the terminology is getting too tricky, it is time to go back a step. And not only to..</p>
<h2>Learn the terminology</h2>
<p>When you meet a new term, don&#8217;t fill in it&#8217;s meaning from the context. One of my own most immediate improvements in learning came from always immediately looking up words I don&#8217;t understand. I believe there usually is a reason I don&#8217;t know the word, and often I&#8217;ve had some surprises where my &#8220;context fill-in&#8221; actually was way off.</p>
<p>Also, as suggested above, it you&#8217;re missing too much terminology, it might be a hint you are in over your head and need to gain the pre-requisite knowledge.</p>
<h2>Learn something new outside Perl</h2>
<p>Everyone will tell you this. Stuck on Perl? Get some new vibes from Ruby. Your C-coding is getting you down, try Scala (<a href="http://creativekarma.com/ee.php/weblog/comments/my_verdict_on_the_scala_language/" target="_blank">should get you back to C soon enough</a>). And you can go further. <a href="http://use.perl.org/~Alias/journal/39661" target="_blank">Adam Kennedy says he gets inspiration from places like TED conferences, New Scientist or Economist.</a> Some people will suggest just learning anything can get you out of a rut.</p>
<p>However, there is a condition. If it is going to help your programming, it must involve some sort of <em>domain-transferable skills. </em>Not everything new you learn will necessarily do that. I&#8217;ve been doing digital photography for nearly ten years and have gotten to a decent level. <strong>It has absolutely not improved my programming in any way. </strong>It is far too <em>domain-specific</em>. Getting a degree in psychology, however, has plunged me forward on a lot of levels, from new learning skills to seeing new ways of solving problems and learning about how the brain does biological information processing. Studying Zen sometimes provides me with a focus that is very conductive to understanding difficult subjects. The same with learning mathematics, particularly discrete mathematics.</p>
<p>So consider well what you learn. Pick the right thing, and you might gain a unique perspective on programming or just sharpen your thinking. Pick the wrong thing and you are wasting good learning time on taking vacation shots.</p>
<p>Of course, you might want a whole and fulfilling life filled with culture and art too, but that&#8217;s not what this text is about.</p>
<h2>Accessing other peoples experience</h2>
<p><strong>Talk with people, and talk </strong><em><strong>with</strong></em><strong> them, not </strong><em><strong>to</strong></em><strong> them.</strong> Unless you are Ada Lovelace or Charles Babbage and invented this stuff, learning programming involves transferring knowledge from another human&#8217;s brain into your brain (I know some of you will lament this fact). One of the most effective ways of doing this, and the one way we are the most biologically disposed to, is talking combined with listening.  Reading is a hard-learnt skill that is piggy-backed on top of the visual system the last some-thousand years. Conversation, on the other hand, has a significant part of your head dedicated to it. Use that!</p>
<p><strong>Study the code of excellent programmers and learn from it</strong>. Avoid the code of bad programmers, and if you have to look at it, don&#8217;t learn from it. Perl is fantastic for this. As well as being a great code repository, CPAN is also a fabulous learning resource. In addition, the core modules are often very good and thorough code that has been optimized and looked after a lot. If you bring your laptop on the train and lose the connection to the net, study a core module.</p>
<p><strong>The problem of tacit knowledge</strong>. A problem of accelerating training towards an expert level is that the <strong>real </strong>expert knowledge is not the same as the knowledge written down in documentation and books. Rather, what actually sets a novice or an expert apart is unknown, or at least not explicitly known, to either. If you just squeeze 10 years worth of reading into someone in five years, they might just still be at the 5 year level in real skill, but with a lot of knowledge they don&#8217;t really know how to apply. This is related to the concept of declarative or procedural memory, or that <strong>what you read and what you do</strong> is remembered in completely different ways and places in your brain.</p>
<p>That, for example, is what things like <a href="http://p.einarsen.no/variables-and-the-roles-they-play/" target="_blank">the &#8220;variable roles&#8221; mentioned in a previous post</a> try to encode. They find how experts understand and use variables, and try to teach that to beginners instead of giving them the basic intro and letting them get the experience the hard way. How do this apply in a life-long learning perspective? Study the how and what people do, not only what they say (or write).  Also: Study design patterns. Don&#8217;t necessarily base your own software designs on them, but know them, as they encode expert experience that previously was <em>tacit</em>.</p>
<h2>Increase your physical learnability</h2>
<p>Up until recently, we thought you grew new neurons (brain cells) up to certain age, then it stops and from then on it went down hill. It is not the case. At least in the hippocampus, which is the center of forming new memories, neurogenesis is found to take place all through life.</p>
<p>But there is a condition&#8230;</p>
<p>It takes physical exercise, namely aerobic training &#8211; that means running, biking, rowing or anything that makes you pant and sweat for an extended period of time.</p>
<p>I&#8217;m sorry&#8230; but it will increase your learnability&#8230;</p>
<p>Furthermore, your brain needs the right chemicals to actually form new neurons. One major compound that can&#8217;t be synthesized by your body from normal foodstuffs is omega-3 fatty acids. Omega-3 is found repeatedly to increase general cognitive ability (meaning higher processing power in your head) under many conditions. <em>And you know you want more processing power as well as increased memory.</em> Omega-3 fatty acids can usually be bought as pure capsules, or they can be found in salmon and walnuts if you want to eat that every day.</p>
<p>But be careful with the portioning. Too high Omega-3 dosages can lead to thinning of the blood, and while you might want to accelerate your Perl learning until your gum bleeds, you didn&#8217;t read that here.</p>
<p>And the last, but not least, point, is to be well rested. The code-all-night pattern might work when you are teenager or young adult and physically don&#8217;t need as much sleep. After that, it will effectively decrease your hard-won cognitive abilities.</p>
<h2>And more?</h2>
<p>Believe it or not, but I would actually like to expand on most of the points above and provide some more evidence and put some numbers to the claims above. But I have to post my <a href="http://ironman.enlightenedperl.org/" target="_blank">Perl Ironman 10-day post</a> and that effectively limits the time.</p>
<p>So, please share how you learn, or your advice to <strong>increase your learning rate</strong>. I know some rather able Perl-programmers drop by here occasionally. If you managed to become a guru, please share what you have done different. Is it just a lot of years of experience? Or do you have a unique approach?</p>
]]></content:encoded>
			<wfw:commentRss>http://p.einarsen.no/accelerate-your-perl-learning/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>What is readability, or simple != readable</title>
		<link>http://p.einarsen.no/what-is-readability-or-simple-readable/</link>
		<comments>http://p.einarsen.no/what-is-readability-or-simple-readable/#comments</comments>
		<pubDate>Sun, 20 Sep 2009 20:07:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Language]]></category>
		<category><![CDATA[Understanding Code]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[readability]]></category>
		<category><![CDATA[Research]]></category>

		<guid isPermaLink="false">http://p.einarsen.no/?p=161</guid>
		<description><![CDATA[As a programmer, you write for two very different kinds of readers. One is the rigid computer platform, the other is the human maintainers of your code. For the former we have quite conclusive guidelines on what works, but the latter is only consistent as a source of disagreement and uncertainty. Typically the guideline is [...]]]></description>
			<content:encoded><![CDATA[<p>As a programmer, you write for two very different kinds of readers. One is the rigid computer platform, the other is the human maintainers of your code. For the former we have quite conclusive guidelines on what works, but the latter is only consistent as a source of disagreement and uncertainty. Typically the guideline is &#8220;<em><a href="http://c2.com/cgi/wiki?CodeForTheMaintainer">Always code as if the person who ends up maintaining your code is a violent psychopath who knows where you live.</a></em>&#8220;, while most people end up writing as if the person maintaining the code is themselves.</p>
<p>Neither approach is particularly good -I can&#8217;t imagine code written for violent psychopaths  would really be that great to maintain. And on the other end, a lot of coders optimize for their own readability, and will argue the finer points of formatting from that point of view, not that of <em>the actual readers</em> &#8211; missing the point that readability is ultimately decided by the reader, not the writer.</p>
<p>I certainly catch myself doing this quite often.</p>
<p>In the Perl world, this is probably an even bigger issue than in other languages.  <a href="http://en.wikipedia.org/wiki/There%27s_more_than_one_way_to_do_it">There-Is-More-Than-One-Way-To-Do-It</a> is still one of Perls big strenghts, but certainly not all the ways are equally good &#8211; which is why <a href="http://oreilly.com/catalog/9780596001735/">Perl Best Practices</a> is now a staple of any Perl-wielding office. The contrasting Python, with it&#8217;s <a href="http://www.python.org/dev/peps/pep-0020/">&#8220;there should be one — and preferably only one — obvious way to do it&#8221;</a>, seems to be able to get away with 19 simple statements to define the pythonic best practice.</p>
<p>Now, anyone can have an opinion, particularly since research on code readability it still quite lacking. We just don&#8217;t know for certain yet what makes people get code. However, cognitive psychologists have been interested for several decades in how people generally organize large data structures in their brains, and some of this has given some neat practical applications for coding, such as <a href="http://www.si.umich.edu/furnas/Papers/FisheyeCHI86.pdf">Furnas&#8217; paper on &#8216;Fish-eye&#8217; views (1986)</a>. (This is basically about IDEs with collapsing code branches, but now you know why that&#8217;s nice, how to do it right and who thought of it first.)</p>
<p>Research on general language comprehension, however, is a massive field. In the <a href="http://www.acm.org/jcdl/jcdl01/">ACM Journal of Computer Documentation</a>&#8216;s August 2000 issue, <a href="http://portal.acm.org/citation.cfm?id=344599.344630">George R. Klare provides some clear-minded and research-based adviced for communicators </a>that might be enlightening and is a good starting point for thinking about readability of normal text &#8211; that might apply to programming.</p>
<p>He specifies four purposes of readability:</p>
<ul>
<li>Reading speed and efficiency.</li>
<li>Reader judgment.</li>
<li>Readership.</li>
<li>Comprehension, Learning and Retention.</li>
</ul>
<p>Of these, only the last is of any big interest for programmers; you don&#8217;t typically care about the speed the maintainer needs to read your code. You might care about the Reader  judgment if you code to impress your fellow programmers, but that is another chapter. Readership applies to how the size of the readership may be a function of  the simplicity of the text &#8211; a consideration on the skill level of your maintainers, perhaps, but few people code with the intention of their code to be read by a large audience.</p>
<p>However, the biggest issue with text and code is comprehension. Even more so in programming code, as it is essential that the maintainer is able to create a <em>precise</em> representation of the code in his own mind. Also he must be able to understand both what it actually does and what the intention is, since these don&#8217;t always add up.  For debugging purposes, it is actually completely essential that the reader can separate the soft human intentions from the hard computer operations, so any code must be understood on two levels simultaneously.</p>
<p>Now, how does readability affect comprehension? First, keep in mind that readability in natural language usually refers to choice of words and sentence length, and is typically measured by level of education necessary to read the text. This might not be appropriate for code readability &#8211; level of programming skill might not map to level of code understanding in the same way, and readability in code is often just a matter of indentation and syntactics.</p>
<p>But it probably maps somewhat close. This is where research is lacking again, so it is hard to tell.</p>
<p>Klare&#8217;s big advice, however, is that higher readability does not always convert into higher comprehension, but is modulated by situation and traits in the readers. And that is the important part. He describes four conditions when it does not work as you would think:</p>
<ol>
<li>A reader can understand at higher levels than expected if his motivation is high. Also, skill level is a fuzzy concept.</li>
<li>If time is not limited, increase in readability might not make a difference on comprehension. The more time is limited, the larger the effect of readability</li>
<li>The greater the readers background knowledge on the topic, the less effect does readability have. On the other hand, even an expert on one field may prefer higher levels of readability in texts outside his field.</li>
<li>Type and level of motivation might affect comprehension.</li>
</ol>
<p>or to quote his summary:</p>
<blockquote><p>[..] more readable, written material is likely to produce greater comprehension, learning and retention than less readable only when one or more of the following factors are present: the less readable is much harder than the more readable, and clearly beyond the reader&#8217;s usual level; reading time is limited; the reader does not have a large amount of background or experience with the topic being covered; and, the reader has a relatively strong set to learn.</p></blockquote>
<p>Now does this particulary increase understanding of readability of programming code?</p>
<p>Perhaps not.</p>
<p>However, if we think of readability not as just the reading of code as natural language, but rather of understanding of the semantic concepts, there is an interesting observation to be made.  If we consider using more basic programming to make the program easier to understand, while avoiding more advanced concepts, Klare&#8217;s summary of readability shows something that also adds up with other research, namely that <em>this approach to readability doesn&#8217;t always increase comprehension.</em></p>
<p>In a very recent piece of research using Scala, <a href="http://infoscience.epfl.ch/record/138586?of=HD">Gilles Dubouchet found that using more compact and advanced functional programming methods rather than basic, typical loop-constructs increased comprehension</a>.  Although one single piece of research such as Dubouchet&#8217;s is too limited to base decisions on, it becomes more interesting when it actually adds up with prior research on language comprehension.</p>
<p><strong>Together it indicates that using more advanced methodology can increase comprehension for both original programmers and maintainers, unless they are pressed on time or motivation.</strong></p>
<p>Unlike many other languages, Perl allows you to increase the complexity of your programming across methodology quite freely. You can start with the simple baby-Perl, go through procedural programming, add objects or start playing with functional approaches. You can use <a href="http://search.cpan.org/~adamk/Aspect-0.21/lib/Aspect.pm">Aspect Oriented Programming</a> or add on your own crazy, homespun programming methodology, if you so please.  For <em>comprehension and readability purposes</em>, the above research indicates that if you consider your audience and their situation well, going for a higher and more advanced level might not be a disadvantage.</p>
<p>But do keep in mind that the research is still a bit patchy, and this is mostly an argument without empirical data. But I&#8217;ll make sure I report what I find, as this is just the first in many articles about readability&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://p.einarsen.no/what-is-readability-or-simple-readable/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

