<?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>Open eyes Working brain</title>
	<atom:link href="http://federico.galassi.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://federico.galassi.net</link>
	<description>dedicated, in respect and admiration, to the spirit that lives in the computer</description>
	<lastBuildDate>Fri, 06 Aug 2010 22:11:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Complexity killed the Wave</title>
		<link>http://federico.galassi.net/2010/08/07/complexity-killed-the-wave/</link>
		<comments>http://federico.galassi.net/2010/08/07/complexity-killed-the-wave/#comments</comments>
		<pubDate>Fri, 06 Aug 2010 22:11:41 +0000</pubDate>
		<dc:creator>federico</dc:creator>
				<category><![CDATA[simplicity]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[adoption]]></category>
		<category><![CDATA[complexity]]></category>
		<category><![CDATA[gall]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[kill]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[wave]]></category>

		<guid isPermaLink="false">http://federico.galassi.net/?p=336</guid>
		<description><![CDATA[So, Google is going to kill Wave. But despite these wins, and numerous loyal fans, Wave has not seen the user adoption we would have liked. We don’t plan to continue developing Wave as a standalone product, but we will maintain the site at least through the end of the year and extend the technology for [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://federico.galassi.net/wp-content/uploads/2010/08/nelson.jpg"><img class="alignright size-full wp-image-339" title="nelson" src="http://federico.galassi.net/wp-content/uploads/2010/08/nelson.jpg" alt="" width="200" height="187" /></a>So, Google is going to <a href="http://googleblog.blogspot.com/2010/08/update-on-google-wave.html">kill Wave</a>.</p>
<blockquote><p>But despite these wins, and numerous loyal fans, Wave has not seen the user adoption we would have liked. We don’t plan to continue developing Wave as a standalone product, but we will maintain the site at least through the end of the year and extend the technology for use in other Google projects.</p></blockquote>
<p>That&#8217;s a great example of why &#8220;do one thing well&#8221; is better than &#8220;do it all&#8221;. Not only because, as <a href="http://en.wikipedia.org/wiki/Gall's_law">Gall&#8217;s law</a> implies, it&#8217;s easier to get a simple system straight, but also because once you get a complex system straight, you still have to make people get their mind around it. Wave made chat and e-mail play well together, with a great replay feature, bots and translation. Twitter gives short text updates. Adoption declared the winner, but we <a href="http://federico.galassi.net/2009/06/09/google-wave-fallacy/">already knew it</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://federico.galassi.net/2010/08/07/complexity-killed-the-wave/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Please Don&#8217;t Touch the Slow Parts</title>
		<link>http://federico.galassi.net/2010/05/08/please-dont-touch-the-slow-parts/</link>
		<comments>http://federico.galassi.net/2010/05/08/please-dont-touch-the-slow-parts/#comments</comments>
		<pubDate>Sat, 08 May 2010 09:58:09 +0000</pubDate>
		<dc:creator>federico</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[better software]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[faster web]]></category>
		<category><![CDATA[fullo]]></category>
		<category><![CDATA[high performance web sites]]></category>
		<category><![CDATA[rules]]></category>
		<category><![CDATA[slow parts]]></category>
		<category><![CDATA[steve souders]]></category>

		<guid isPermaLink="false">http://federico.galassi.net/?p=321</guid>
		<description><![CDATA[I spoke at Better Software 2010, together with Fullo, about speeding up web applications. The talk draws heavily from Steve&#8217;s work, but it&#8217;s a little bit different from current literature because it tries to organize best practices not as flat list but under macro-areas emerged as &#8220;slow parts&#8221;. Also, i concluded with my obsession that [...]]]></description>
			<content:encoded><![CDATA[<p>I spoke at <a href="http://www.bettersoftware.it">Better Software</a> 2010, together with <a href="http://www.ideato.it">Fullo</a>, about speeding up web applications. The talk draws heavily from <a href="http://www.stevesouders.com/">Steve&#8217;s work</a>, but it&#8217;s a little bit different from current literature because it tries to organize best practices not as flat list but under macro-areas emerged as &#8220;slow parts&#8221;. Also, i concluded with <a href="http://federico.galassi.net/2009/11/15/javascript-performance-make-the-browser-happy-and-you-sad/">my obsession</a> that complexity inherently introduced by performance optimizations should not be dealt with by programmers directly, but by means of automation and abstraction.</p>
<p>Here it is.</p>
<p><strong>update</strong>: now i am linking to the extended version which i gave at phpday 2010</p>
<div style="width:425px" id="__ss_4110316"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/fgalassi/please-dont-touch-the-slow-parts-v2" title="Please Don&#39;t Touch the Slow Parts V2">Please Don&#39;t Touch the Slow Parts V2</a></strong><object id="__sse4110316" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=pleasedonttouch2-100515130606-phpapp01&#038;stripped_title=please-dont-touch-the-slow-parts-v2" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse4110316" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=pleasedonttouch2-100515130606-phpapp01&#038;stripped_title=please-dont-touch-the-slow-parts-v2" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="padding:5px 0 12px">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/fgalassi">Federico Galassi</a>.</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://federico.galassi.net/2010/05/08/please-dont-touch-the-slow-parts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Happy Birthday Blog</title>
		<link>http://federico.galassi.net/2010/04/03/happy-birthday-blog/</link>
		<comments>http://federico.galassi.net/2010/04/03/happy-birthday-blog/#comments</comments>
		<pubDate>Sat, 03 Apr 2010 13:04:28 +0000</pubDate>
		<dc:creator>federico</dc:creator>
				<category><![CDATA[misc]]></category>
		<category><![CDATA[banzai]]></category>
		<category><![CDATA[birthday]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[couchdb]]></category>
		<category><![CDATA[crockford]]></category>
		<category><![CDATA[fullo]]></category>
		<category><![CDATA[gabriele]]></category>
		<category><![CDATA[gtac]]></category>
		<category><![CDATA[ideato]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[javascript.the.good.parts]]></category>
		<category><![CDATA[kata]]></category>
		<category><![CDATA[keyboard]]></category>
		<category><![CDATA[laws.of.simplicity]]></category>
		<category><![CDATA[maeda]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[perfect.software]]></category>
		<category><![CDATA[pomodoro]]></category>
		<category><![CDATA[restful.web.services]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[talent.code]]></category>
		<category><![CDATA[touch.typing]]></category>
		<category><![CDATA[vim]]></category>
		<category><![CDATA[weinberg]]></category>
		<category><![CDATA[yourank]]></category>

		<guid isPermaLink="false">http://federico.galassi.net/?p=308</guid>
		<description><![CDATA[Exactly one year ago i posted here for the first time. A hello world tentatively saying &#8220;Let&#8217;s see what happens&#8221;. Now, a year, 16 posts and more than 1000 unique visitors later i can state that maybe it didn&#8217;t happen that much, but i liked the journey. So, let&#8217;s celebrate this first year with a [...]]]></description>
			<content:encoded><![CDATA[<p>Exactly one year ago i posted here for the first time. <a href="http://federico.galassi.net/2009/04/03/hello-world/">A hello world</a> tentatively saying &#8220;Let&#8217;s see what happens&#8221;. Now, a year, 16 posts and more than 1000 unique visitors later i can state that maybe it didn&#8217;t happen that much, but i liked the journey. So, let&#8217;s celebrate this first year with a collage of people, places, companies, technologies, tools, products, devices, books, etc&#8230; that influenced and, sometimes, even inspired me in my professional life . Thanks to all.</p>
<p style="text-align: center;"><a href="http://federico.galassi.net/wp-content/uploads/2010/04/blog_birthday_1.png" target="_blank"><img class="size-full wp-image-309 aligncenter" title="Click to open bigger" src="http://federico.galassi.net/wp-content/uploads/2010/04/blog_birthday_1_small.png" alt="" width="550" height="295" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://federico.galassi.net/2010/04/03/happy-birthday-blog/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>All Software Works Ok</title>
		<link>http://federico.galassi.net/2010/03/31/all-software-works-ok/</link>
		<comments>http://federico.galassi.net/2010/03/31/all-software-works-ok/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 21:59:10 +0000</pubDate>
		<dc:creator>federico</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[psychology]]></category>
		<category><![CDATA[simplicity]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[adaptation]]></category>
		<category><![CDATA[avatar]]></category>
		<category><![CDATA[barry]]></category>
		<category><![CDATA[bloated]]></category>
		<category><![CDATA[complexity]]></category>
		<category><![CDATA[construction]]></category>
		<category><![CDATA[cost]]></category>
		<category><![CDATA[enterprise]]></category>
		<category><![CDATA[inspiration]]></category>
		<category><![CDATA[money]]></category>
		<category><![CDATA[necessity]]></category>
		<category><![CDATA[pain]]></category>
		<category><![CDATA[schwartz]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[suffering]]></category>
		<category><![CDATA[sunk]]></category>
		<category><![CDATA[untestable]]></category>
		<category><![CDATA[vision]]></category>

		<guid isPermaLink="false">http://federico.galassi.net/?p=260</guid>
		<description><![CDATA[We live in times of complexity, and even though neat technologies and elegant software can be found at times, the market is still definitely dominated by absurdly heavy solutions. Enterprise is imploding and a wind of change towards more sustainable approaches is blowing all around us, yet the mainstream scene is comparatively stagnant and all [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://federico.galassi.net/wp-content/uploads/2010/03/drinking_bird.jpg"><img class="alignright size-full wp-image-265" title="drinking_bird" src="http://federico.galassi.net/wp-content/uploads/2010/03/drinking_bird.jpg" alt="" width="200" height="133" /></a>We live in times of complexity, and even though <a href="http://nodejs.org/">neat technologies</a> and <a href="http://nokogiri.org/">elegant software</a> can be found at times, the market is still definitely dominated by absurdly heavy solutions. <a href="http://www.tbray.org/ongoing/When/201x/2010/01/02/Doing-It-Wrong">Enterprise is imploding</a> and a wind of change towards <a href="http://en.wikipedia.org/wiki/NoSQL">more sustainable approaches</a> is blowing all around us, yet the mainstream scene is comparatively stagnant and all the pain inflicted to people is not really causing the deserved rebellion.</p>
<p>Why is that? Why when confronted by the possibility of rewriting their untestable bloatware, customer&#8217;s reply is almost always invariably &#8220;No, we don&#8217;t need it. We&#8217;ll just have to fix known bugs and add a couple of features, because right as it is, the software works ok&#8230;&#8221;?. What does &#8220;works ok&#8221; really mean? In my experience, it translates roughly to &#8220;The software does not physically blows up our office, it does some of the things we need to do, and over the years our employees have developed a thick skin against all the nuisances and a baggage of manual tricks, passed on by mouth, to get the rest of the work done anyway. Oh, and we already paid a lot for it&#8221;.</p>
<p>Recently, i got a taste of this mindset myself, when i booked online 2 tickets to <a href="http://www.avatarmovie.com/">Avatar</a> at the <a href="http://www.cinedream.it/">local cineplex</a></p>
<blockquote><p>&#8220;Hello this is my reservation code&#8221;</p>
<p>&#8220;Sorry Mr, those seats are reserved&#8221;</p>
<p>&#8220;Sure, by me&#8221;</p>
<p>&#8220;No, actually by others&#8221;</p>
<p>&#8220;What? see, i made this online reservation&#8230;&#8221;</p>
<p>&#8220;I see, but we take reservations both online and by phone, sometimes they overlap and phone is given priority&#8221;</p>
<p>&#8220;Overlap?! No trust me, i am a programmer, overlapping reservations are not supposed to happen, because your system has to take care&#8221;</p>
<p>&#8220;Oh, but evidently it doesn&#8217;t&#8221;</p>
<p>&#8220;WTF?!?!&#8221;</p>
<p>&#8220;Please, don&#8217;t get mad, i am gonna give you other seats. Today is not even bad. You should see how many angry people we must manage during christmas holidays when all movies are sold out!&#8221;.</p></blockquote>
<p>Now, given that reservation means <em>&#8220;An arrangement by which accommodations are secured in advance&#8221;</em>, how would you rate a reservation system that does not guarantee secure accommodations? Like a fish unable to breathe underwater, yet they live with it, and this takes me to the point.</p>
<p>First, humans are best when it comes to adaptation. That means we naturally adapt to pain so that we don&#8217;t feel so bad, and adapt to pleasure so that we don&#8217;t feel so good. Perception of any external stimulus in the end comes to balance. <a href="http://federico.galassi.net/2009/06/12/on-the-paradox…omer-happiness/">Barry Schwartz in the Paradox of Choice</a> says:</p>
<blockquote>
<div id="_mcePaste">respondents were asked to rate their happiness on a 5-point scale. Some of them had won between $50,000 and $1 million in state lotteries within the last year. Others had become paraplegic or quadriplegic as a result of accidents. Not surprisingly, the lottery winners were happier than those who had become paralyzed. What is surprising, though, is that the lottery winners were no happier than people in general. And what is even more surprising is that the accident victims, while somewhat less happy than people in general, still judged themselves to be happy.</div>
</blockquote>
<p>Second, humans are also very bad at admitting sunk costs. The idea of having spent money on something not worth is the ultimate inconvenient truth. Again Barry</p>
<blockquote><p>Aversion to losses also leads people to be sensitive to what are called “sunk costs.” Imagine having a $50 ticket to a basketball game being played an hour’s drive away. Just before the game there’s a big snowstorm—do you still want to go? Economists would tell us that the way to assess a situation like this is to think about the future, not the past. The $50 is already spent; it’s “sunk” and can’t be recovered. What matters is whether you’ll feel better safe and warm at home, watching the game on TV, or slogging through the snow on treacherous roads to see the game in person. That’s all that should matter. But it isn’t all that matters. To stay home is to incur a loss of $50, and people hate losses, so they drag themselves out to the game.</p></blockquote>
<p>Third, as brilliantly pointed out by <a href="http://programmer.97things.oreilly.com/wiki/index.php/Code_Is_Design">Ryan Brush&#8217;s &#8220;Code is Design&#8221;</a> in <a href="http://oreilly.com/catalog/9780596809492">97 Things Every Programmer Should Know</a> and by <a href="http://www.gabrielelana.it/archives/47">Gabriele&#8217;s &#8220;Waterfall Pitfall #1&#8243; (italian)</a>, <del>uninformed</del> most people understand software construction in terms of the better known building construction. Now, since programs are built out of bytes (not bricks), which are practically nothing, using mind (not excavators), which has no physical constraints, actual construction must be very cheap. This gives them the false hope of having an easy exit strategy at their disposal: fixing the software when an emergency comes up. Would they wait for a defective bridge to show the first cracks before attempting to fix it? Their unconstrained minds seem to be unable to realize that story construction aka book writing, built out of words, might represent a more fitting comparison and that <a href="http://en.wikipedia.org/wiki/Divina_commedia">The Divine Comedy</a> took <a href="http://en.wikipedia.org/wiki/Dante_Alighieri">Dante</a>, a renowned genius, more than ten years to finish.</p>
<p>Last but not least, mainstream has made a really good job at covering mistakes of incompetent programmers. From the almost sandboxed life cycle of a php script, to the rigid syntax of java and its <a href="http://wiki.eclipse.org/FAQ_What_is_a_Quick_Fix%3F">self-correcting IDEs</a>, to the plethora of <a href="http://www.codinghorror.com/blog/2007/01/do-certifications-matter.html">useless certifications</a>, great efforts have been devoted to make any primate with opposable thumbs able to program with very limited competence. Many and cheap, that&#8217;s how economy of scale is supposed to <del>fail</del> work, and that&#8217;s how we got this <a href="http://butunclebob.com/ArticleS.UncleBob.TheNextBigThing">horde of unprofessional programmers</a> sacking the best projects.</p>
<p>All of these points help to explain proliferation of crappy software. Maybe, they get it from some body rental which pays more for advertising than for the army of juniors that actually does the job. At the beginning it hurts, but they spent good money and cannot afford to accept failure, so lies are told and more time and money are invested to improve the situation. Then workarounds, albeit inefficient, come and direct suffering somehow decreases. Eventually, the pile of workarounds becomes part of company culture, and all is back to balance: the software starts working ok.</p>
<p>Unfortunately, this means that the quest for better <del>software</del> workflows can hardly come out of necessity, it must come out of vision, and vision takes <strong>inspiration</strong> fed to <strong>working brains</strong> then <strong>time</strong> for the masses to catch up. With Universe hopefully taking care of latter two, i like to think we, professional programmers, are those in charge of the former.</p>
]]></content:encoded>
			<wfw:commentRss>http://federico.galassi.net/2010/03/31/all-software-works-ok/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How I did It: Touch Typist in five months</title>
		<link>http://federico.galassi.net/2010/01/27/how-i-did-it-touch-typist-in-five-months/</link>
		<comments>http://federico.galassi.net/2010/01/27/how-i-did-it-touch-typist-in-five-months/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 17:22:52 +0000</pubDate>
		<dc:creator>federico</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[deep]]></category>
		<category><![CDATA[kaizen]]></category>
		<category><![CDATA[kata]]></category>
		<category><![CDATA[keyboard]]></category>
		<category><![CDATA[layout]]></category>
		<category><![CDATA[practice]]></category>
		<category><![CDATA[touch]]></category>
		<category><![CDATA[type]]></category>
		<category><![CDATA[typeracer]]></category>
		<category><![CDATA[typing]]></category>
		<category><![CDATA[typingweb]]></category>
		<category><![CDATA[typist]]></category>
		<category><![CDATA[wpm]]></category>

		<guid isPermaLink="false">http://federico.galassi.net/?p=242</guid>
		<description><![CDATA[Until, from the midst of this darkness, a sudden light broke in upon me, a light so brilliant and wonderous, and yet so simple. Deep practice, eradicate errors and deep practice again. I alone succeeded in discovering the secret of bestowing skill. Nay, even more, I myself became capable of bestowing mastery upon apprentice matter. [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><img class="alignright size-full wp-image-243" title="it-could-work" src="http://federico.galassi.net/wp-content/uploads/2010/01/it-could-work.jpg" alt="it-could-work" width="200" height="157" />Until, from the midst of this darkness, a sudden light broke in upon me, a light so brilliant and wonderous, and yet so simple. Deep practice, eradicate errors and deep practice again. I alone succeeded in discovering the secret of bestowing skill. Nay, even more, I myself became capable of bestowing mastery upon apprentice matter.</p>
<p><strong>It could work.</strong></p></blockquote>
<p>At the end of august 2009, while i was reading about <a href="http://steve-yegge.blogspot.com/2008/09/programmings-dirtiest-little-secret.html">the importance for a programmer to touch type</a>, i found out many programmers could type at 80 <a href="http://en.wikipedia.org/wiki/Words_per_minute">wpm</a> and above. I tried myself and consistently scored 60 wpm or below. I have been spending many hours a day at the keyboard since at least 1996. How could it be i am not as fast? I already knew about the importance of practice, but i did practice for years, didn&#8217;t I? Well, uhm, no.</p>
<p>Think of the career of a professional <a href="http://en.wikipedia.org/wiki/Soccer_player">football (soccer) player</a>. How does he get there, does he play all the time for years? Actually, he spends most of the week <a href="http://www.soccer-training-info.com/sample_workout_routine.asp">training</a>: stretching, pushups, sprints, weights, long runs, ball work, etc&#8230; Only a small percentage of time is indeed to play short games and the main game on sunday. That&#8217;s because play alone can only push your performance to the upper end of the range set by current skill. It&#8217;s not going to push you to the next level, to the next order of magnitude, and it doesn&#8217;t keep you from developing bad habits. And that&#8217;s where i got, very fast at typing in my very flawed 7-fingers posture. Not able to improve any further, not even in more than 10 years.</p>
<p>I really <a href="http://en.wikipedia.org/wiki/Kaizen">wanted to get better</a>, so the questions were How? and How long will it take? I didn&#8217;t know the answer to the latter but the former was by then clear in my mind. Find a keyboard dojo, do keyboard <a href="http://federico.galassi.net/2009/09/02/code-katas-programmers-deep-practice/">katas</a> and take the needed time. After trying a lot of viable solutions i found my dojo at <a href="http://www.typingweb.com/">www.typingweb.com</a>. To add some salt to the challenge i switched keyboard layout from italian to U.S., which is quite better for programming, and i started practicing daily with their courses, routinely taking tests to record my progress. Two <a href="www.pomodorotechnique.com/">pomodoros</a> a day for the first two months, then one, then again two when i was reaching the end. Always striving to get 97% or above accuracy at the higher possible speed for every single lesson.</p>
<p>Now, five months and about 120 pomodoros of deep practice later, i am writing this to shout to the world that IT COULD WORK. Next i&#8217;ll be moving to <a href="http://federico.galassi.net/2009/07/31/vim-or-the-inevitable-value-of-complexity/">vim</a> katas, while still having some fun at <a href="http://www.typeracer.com">www.typeracer.com</a>, because you never really stop to practice right?!</p>
<p style="text-align: right;">Yours sincerely,<br />
ten fingers typist<br />
american layout<br />
80 wpm average<br />
up to 100 wpm under a good moon<br />
Federico.</p>
<p style="text-align: right;"><img class="aligncenter size-full wp-image-252" title="typing_sep09" src="http://federico.galassi.net/wp-content/uploads/2010/01/typing_sep092.png" alt="typing_sep09" width="573" height="282" /></p>
<p style="text-align: right;"><img class="aligncenter size-full wp-image-251" title="typing_nov09-gen10" src="http://federico.galassi.net/wp-content/uploads/2010/01/typing_nov09-gen10.png" alt="typing_nov09-gen10" width="573" height="284" /></p>
<p style="text-align: right;">
]]></content:encoded>
			<wfw:commentRss>http://federico.galassi.net/2010/01/27/how-i-did-it-touch-typist-in-five-months/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Web Authentication as it SHOULD have been</title>
		<link>http://federico.galassi.net/2009/12/31/web-authentication-as-it-should-have-been/</link>
		<comments>http://federico.galassi.net/2009/12/31/web-authentication-as-it-should-have-been/#comments</comments>
		<pubDate>Thu, 31 Dec 2009 18:19:51 +0000</pubDate>
		<dc:creator>federico</dc:creator>
				<category><![CDATA[rest]]></category>
		<category><![CDATA[simplicity]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[401]]></category>
		<category><![CDATA[authentication]]></category>
		<category><![CDATA[basic]]></category>
		<category><![CDATA[digest]]></category>
		<category><![CDATA[form]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[locastorage]]></category>
		<category><![CDATA[login]]></category>
		<category><![CDATA[logout]]></category>
		<category><![CDATA[session]]></category>
		<category><![CDATA[sessionstorage]]></category>
		<category><![CDATA[stateless]]></category>
		<category><![CDATA[usernametoken]]></category>
		<category><![CDATA[wsse]]></category>

		<guid isPermaLink="false">http://federico.galassi.net/?p=214</guid>
		<description><![CDATA[REST is not an easy concept to grasp but once you get it you finally see the light on many different things. Having just read RESTful Web Services, i wanted to point out some unusual revelation that came to me: form based authentication with its login/session/logout workflow, which is currently dominant on the web, is [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-215" title="auth_small" src="http://federico.galassi.net/wp-content/uploads/2009/12/auth_small.jpg" alt="auth_small" width="200" height="191" /></p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">REST is not an easy concept to grasp but once you get it you finally see the light on many different things. Having just read RESTful Web Services, i wanted to point out some unusual revelation that came to me: form based authentication with its login/session/logout workflow, which is currently dominant on the web, is hopelessly broken.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">First two words about REST. It&#8217;s a set of constraints, of simplifying assumptions which, if applied to an architecture, will guarantee a number of good properties such as simplicity, scalability and reliability. The best known implementation of a RESTful architecture is the web and its backbone protocol, HTTP. HTTP RESTfulness made it good and yet so easy to implement that it eventually emerged as the great darwinian winner. Either your router or a pretty rabbit, if it&#8217;s networked it&#8217;s likely to speak HTTP.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Instead of giving yet another list of REST rules, i am going to give you a feeling of how the web works from a REST perspective. There&#8217;s a server which keeps state of the application, split into meaningful resources. Each resource has its own name (URI). That&#8217;s all the server knows. Then there&#8217;s a client which acts as a finite state machine visiting resources and then moving to other ones through links and forms. The state of the conversation, the session, where the client have been and where it is now, it&#8217;s something the client is in full control of. Server knows nothing about it. That&#8217;s statelessness.</div>
<p>Having recently read <a href="http://www.amazon.com/Restful-Web-Services-Leonard-Richardson/dp/0596529260">RESTful Web Services</a>, i wanted to write about the most interesting of my REST-induced epiphanies:</p>
<p style="text-align: left; "><a href="http://en.wikipedia.org/wiki/Form_based_authentication">Form based authentication</a> with its login/session/logout workflow, which is currently dominant on the web, is hopelessly broken.</p>
<p>To understand why, one has to grasp how the greatest living RESTful implementation, the web and its backbone protocol <a href="http://www.w3.org/Protocols/">HTTP</a>, was <a href="http://www.ted.com/talks/tim_berners_lee_on_the_next_web.html">meant to work</a>. In a nutshell, there&#8217;s a server that keeps the state of the web application, split into meaningful <a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm#sec_5_2_1_1">resources</a>. Each resource has its own name (<a href="http://en.wikipedia.org/wiki/Uniform_Resource_Identifier">URI</a>) and a set of available <a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm#sec_5_2_1_2">representations</a> of itself. That&#8217;s all the server knows. Then there&#8217;s a client that acts as a <a href="http://en.wikipedia.org/wiki/Finite-state_machine">finite state machine</a> visiting resources, getting representations and then moving to other resources through links and forms. <a href="http://en.wikipedia.org/wiki/Session_(computer_science)">The state of the conversation, the session</a>, where a client has been and where it is now, is something that belongs to the client. Server drives the client by feeding him a graph made of states and links to other states, but it&#8217;s the client who is in charge of following a path. That&#8217;s <a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm#sec_5_1_3">statelessness</a>, the simplifying property that made the web triumph as a <a href="http://en.wikipedia.org/wiki/Survival_of_the_fittest">darwinian winner</a>.</p>
<p>In this view, authentication should have been largely a client-side business.<br />
The client visits resources anonymously. If it wants to be authenticated, it just starts sending authentication data with <strong>each</strong> further request. If it wants to be anonymous again, it just stops. It could as well send a mix of authenticated and anonymous requests.<br />
The server doesn&#8217;t care of what happens between requests. If a single request carries authentication data, it checks the data and possibly replies as if the client were authenticated. If a request has no authentication data, a generic response is returned. There&#8217;s no server-side login through a form, there&#8217;s no server-side logout, and above all, there&#8217;s no temporal ordering between those two and hence no server tracked session. All of a sudden, the beauty of this comes with great force. By delegating authentication to the browser using the standard HTTP mechanism we can greatly <strong>simplify</strong> application code.</p>
<p>Unfortunately, in reality this is not the case. During its race to the top, HTTP lost part of its original vision, mainly due to implementation mistakes.</p>
<ol>
<li><a href="http://www.ietf.org/rfc/rfc2617.txt">The specs</a> failed to hit the sweet spot of authentication security. They standardized <a href="http://en.wikipedia.org/wiki/Basic_access_authentication">Basic Authentication</a> which, by sending user and password in plain text, scared people to death and <a href="http://en.wikipedia.org/wiki/Digest_access_authentication">Digest</a> which, due to its complexity and required server cooperation, never really caught on. A client-side mechanism with cheap yet reasonable security such as <a href="http://www.oasis-open.org/committees/wss/documents/WSS-Username-02-0223-merged.pdf">WSSE UsernameToken</a>, <a href="http://www.xml.com/pub/a/2003/12/17/dive.html">later adopted by atom</a>, would have been optimal.</li>
<li>Browsers took away login from client&#8217;s hands by showing the popup dialog to input user/password <strong>only</strong> after a 401 http error code <strong>from server</strong>. There should have been an always visible &#8220;login&#8221; button since <a href="http://tools.ietf.org/html/rfc2617">the specs</a> said &#8220;A user agent that wishes to authenticate itself with an origin server&#8211;usually, but <strong>not necessarily</strong>, after receiving a 401&#8230;&#8221;.</li>
<li>Browsers practically took away logout from client&#8217;s hands by requiring to close the browser in order to clean the passwords cache. There should have been an always visible &#8220;logout&#8221; button.</li>
<li>Browsers gave no chance to customize the ugly and annoyingly modal login dialog. HTML and/or CSS could have been used.</li>
<li>Browsers gave no client-side storage needed to keep session data but again turned back to server with <a href="http://en.wikipedia.org/wiki/HTTP_cookie">cookies</a>. They should have given something like upcoming HTML5 <a href="http://www.w3.org/TR/2009/WD-webstorage-20091222/">localStorage and sessionStorage</a>.</li>
</ol>
<p>Now there&#8217;s not much that can be done short of a collaborative effort by all browser vendors. Meanwhile we can keep dealing with authentication in application code on the server, in a never ending pile of custom solutions, each one slightly different, for yet another pretty standard problem. A problem solved <a href="http://tools.ietf.org/html/rfc1945#section-11">15 years ago</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://federico.galassi.net/2009/12/31/web-authentication-as-it-should-have-been/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Javascript Performance: Make the Browser Happy (and You Sad)</title>
		<link>http://federico.galassi.net/2009/11/15/javascript-performance-make-the-browser-happy-and-you-sad/</link>
		<comments>http://federico.galassi.net/2009/11/15/javascript-performance-make-the-browser-happy-and-you-sad/#comments</comments>
		<pubDate>Sun, 15 Nov 2009 20:40:11 +0000</pubDate>
		<dc:creator>federico</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[simplicity]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[aptimize]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[closure]]></category>
		<category><![CDATA[compilers]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[foreach]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[mark]]></category>
		<category><![CDATA[speed]]></category>
		<category><![CDATA[twain]]></category>
		<category><![CDATA[yahoo]]></category>

		<guid isPermaLink="false">http://federico.galassi.net/?p=193</guid>
		<description><![CDATA[The browser is emerging as the best platform for applications, so a large community is growing to address its final weakness: speed. Google, Yahoo and various independent programmers are all pushing a bunch of clever techniques to boost performance and please end users. That&#8217;s nice, yet as Mark Twain once said, half of the results of good [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-203" title="BENDER" src="http://federico.galassi.net/wp-content/uploads/2009/11/BENDER1.jpeg" alt="BENDER" width="232" height="184" />The browser is emerging as the <a href="http://en.wikipedia.org/wiki/HTML5">best platform</a> for applications, so a large community is growing to address its final weakness: speed. <a href="http://code.google.com/speed/">Google</a>, <a href="http://developer.yahoo.com/performance/">Yahoo</a> and <a href="http://javascriptrocks.com/performance/">various independent programmers</a> are all pushing a bunch of clever techniques to boost performance and please end users. That&#8217;s nice, yet as Mark Twain once said, <em>half of the results of good intentions are evil</em> and i see potential danger in many of the suggestions made. Here a representative short list of them:</p>
<ul>
<li>Avoid for-in and forEach in favor of optimized while loops</li>
<li>Before making modifications to a DOM node remove it and then re-insert it</li>
<li>To insert multiple DOM nodes, first insert them into a Document Fragment and then add it to the DOM</li>
<li>Join all scripts into a single file</li>
<li>Load javascript files on demand</li>
</ul>
<p>Let&#8217;s make it clear for once, execution speed is not a human problem, that&#8217;s what computers are for, they execute our commands fast. The human problem is programming speed and writing down clear, readable, maintainable commands aka programs. forEach loops make sense to me, they say &#8220;i want to do something on each item&#8221;, optimized while loops make sense to computers. If i want to add DOM nodes or modify one, i don&#8217;t care of removing it or document fragments, browsers care. To me it&#8217;s just noise. Almost all of the problems addressed by those techniques stem from lack of smartness in the browser, and that&#8217;s where fixes belong to, on the machine side. The fact that there are <a href="http://www.microsoft.com/windows/Internet-explorer/default.aspx">inept browser makers</a> is no excuse. Fixes still belong to the machine, they&#8217;re repeatable and can be made automatic. We have a long history of programs automatically converting human friendly code to machine friendly code. They&#8217;re called <a href="http://en.wikipedia.org/wiki/Compiler">compilers</a> and the output either machine code or optimized javascript doesn&#8217;t matter.</p>
<p>So, learn about javascript performance since knowledge is always the way, but don&#8217;t turn yourself into a machine, you&#8217;d be an awful one. Use the tools and wait for browsers to catch up.</p>
<ul>
<li><a href="http://www.aptimize.com/">Aptimize</a></li>
<li><a href="http://code.google.com/closure/compiler/">Closure Compiler</a></li>
<li><a href="http://developer.yahoo.com/yui/3/yui/#use">YUI 3 use</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://federico.galassi.net/2009/11/15/javascript-performance-make-the-browser-happy-and-you-sad/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Google Test Automation Conference: Testing is not enough</title>
		<link>http://federico.galassi.net/2009/10/26/google-test-automation-conference-testing-is-not-enough/</link>
		<comments>http://federico.galassi.net/2009/10/26/google-test-automation-conference-testing-is-not-enough/#comments</comments>
		<pubDate>Mon, 26 Oct 2009 00:19:22 +0000</pubDate>
		<dc:creator>federico</dc:creator>
				<category><![CDATA[great people]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[simplicity]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[abstraction]]></category>
		<category><![CDATA[declarative]]></category>
		<category><![CDATA[dsl]]></category>
		<category><![CDATA[functional]]></category>
		<category><![CDATA[gtac]]></category>
		<category><![CDATA[niklaus]]></category>
		<category><![CDATA[wirth]]></category>

		<guid isPermaLink="false">http://federico.galassi.net/?p=164</guid>
		<description><![CDATA[If i had to award the best talk at GTAC 2009, the no-brainer choice would be Prof. Niklaus Wirth opening talk. That&#8217;s not surprising if you consider who the speaker is, one of the great pioneers of computer science in the field of programming languages. What&#8217;s most surprising to me is that he presented a [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-170" title="niklaus wirth at google" src="http://federico.galassi.net/wp-content/uploads/2009/10/niklaus.jpg" alt="niklaus wirth at google" width="238" height="240" /></p>
<p>If i had to award the best talk at <a href="http://www.gtac.biz/">GTAC 2009</a>, the no-brainer choice would be Prof. <a href="http://en.wikipedia.org/wiki/Niklaus_Wirth">Niklaus Wirth</a> <a href="http://www.youtube.com/watch?v=8W5Jd_wzB90">opening talk</a>. That&#8217;s not surprising if you consider who the speaker is, one of the great pioneers of computer science in the field of <a href="http://en.wikipedia.org/wiki/Pascal_(programming_language)">programming languages</a>. What&#8217;s most surprising to me is that he presented a (pre)historical review of problems which turned out to be incredibly relevant today and, somehow, forced me to reframe my understanding of testing.</p>
<p><span style="background-color: #ffffff;">Building on <a href="http://www.cs.utexas.edu/users/EWD/transcriptions/EWD03xx/EWD340.html">1972 Dijkstra dismissal of software testing</a></span></p>
<blockquote><p><span style="background-color: #ffffff;">program testing can be a very effective way to show the presence of bugs, but is hopelessly inadequate for showing their absence.</span></p></blockquote>
<p><span style="background-color: #ffffff;">Wirth explained that testing is treating symptoms instead of the disease, with the disease being our failure to prove correctness of programs by analytical means. This failure has its roots in distant past but it still holds today with languages and tools too complex and unreliable. Languages and tools providing proper abstraction, <em>really</em> hiding the system beneath, would give us the simple and rigorous ground to make programs easy to prove correct, so that no testing would be needed. Unfortunately, this looks far from happening</span></p>
<blockquote><p><span style="background-color: #ffffff;">Programming languages are further from being mathematically nice than they were 50 years ago! They&#8217;re huge and complicated. They contain big libraries, and most of a programmer&#8217;s time is spent finding and learning the right libraries.</span></p></blockquote>
<p><span style="background-color: #ffffff;">and again</span></p>
<blockquote><p><span style="background-color: #ffffff;">What progress has this field actually made? We still struggle with the same problems as 50 years ago: iteration times, debugging, scratching our heads trying to figure out what went wrong.<span> </span></span></p></blockquote>
<p><span style="background-color: #ffffff;"><span>How insightful! Empirical evidence that computer science made no sizable improvement in software construction is everywhere. It&#8217;s like a hamster in a wheel, running nowhere. Why is that? Maybe, we&#8217;ve been piling </span><a href="http://www.joelonsoftware.com/articles/LeakyAbstractions.html">leaky abstractions</a><span> on leaky abstractions, apparently hiding information without really simplifying, to the point where progress is drowning in complexity.</span></span></p>
<p><span style="background-color: #ffffff;"><span>Testing is a nice way to easily lay down executable specifications, yet it requires maintenance and quickly degrades as we try to cover more cases. But when we code we have the chance to write self-describing programs which </span><em>are</em><span> executable specifications, reducing the coverage of tests needed, ideally to zero.</span></span></p>
<p>What does it mean in practice? Whenever it&#8217;s possible one should aim at <a href="http://en.wikipedia.org/wiki/Declarative_programming">declarative code</a>. <a href="http://www.martinfowler.com/bliki/DomainSpecificLanguage.html">Domain specific languages</a> and <a href="http://en.wikipedia.org/wiki/Functional_programming">functional programming</a> come to mind. The point being, if a program matches closely its specification, what&#8217;s left to test?</p>
<pre class="brush: ruby">def factorial(n)
    if n == 0
        1
    else
        n * factorial(n-1)
    end
end</pre>
]]></content:encoded>
			<wfw:commentRss>http://federico.galassi.net/2009/10/26/google-test-automation-conference-testing-is-not-enough/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Refactoring to Unobtrusive Javascript</title>
		<link>http://federico.galassi.net/2009/09/28/refactoring-to-unobtrusive-javascript/</link>
		<comments>http://federico.galassi.net/2009/09/28/refactoring-to-unobtrusive-javascript/#comments</comments>
		<pubDate>Mon, 28 Sep 2009 21:49:06 +0000</pubDate>
		<dc:creator>federico</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://federico.galassi.net/?p=159</guid>
		<description><![CDATA[I&#8217;ve been thinking for a while about techniques to enforce maximum separation of concerns in the client-side web technology stack. Even though, total separation of presentation, content and business logic may well be a utopia, the list of refactorings i collected over time are generally good to improve code quality and the whole concept of [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been thinking for a while about techniques to enforce maximum <a href="http://en.wikipedia.org/wiki/Separation_of_concerns">separation of concerns</a> in the client-side web technology stack. Even though, total separation of presentation, content and business logic may well be a utopia, the list of refactorings i collected over time are generally good to improve code quality and the whole concept of refactoring unusually applied to javascript is quite interesting per se. Here&#8217;s a talk about it i gave at <a href="http://www.javascriptcamp.com/">Javascript Camp 2009</a>.</p>
<div id="__ss_2081724" style="width: 425px; text-align: left;"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" title="Refactoring to Unobtrusive Javascript" href="http://www.slideshare.net/fgalassi/refactoring-to-unobtrusive-javascript">Refactoring to Unobtrusive Javascript</a><object style="margin:0px" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=20090925refactoringtounobtrusivejsjscamp-090928090731-phpapp01&amp;stripped_title=refactoring-to-unobtrusive-javascript" /><param name="allowfullscreen" value="true" /><embed style="margin:0px" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=20090925refactoringtounobtrusivejsjscamp-090928090731-phpapp01&amp;stripped_title=refactoring-to-unobtrusive-javascript" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a style="text-decoration:underline;" href="http://www.slideshare.net/">documents</a> from <a style="text-decoration:underline;" href="http://www.slideshare.net/fgalassi">Federico Galassi</a>.</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://federico.galassi.net/2009/09/28/refactoring-to-unobtrusive-javascript/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Code Katas: Programmer&#8217;s Deep Practice</title>
		<link>http://federico.galassi.net/2009/09/02/code-katas-programmers-deep-practice/</link>
		<comments>http://federico.galassi.net/2009/09/02/code-katas-programmers-deep-practice/#comments</comments>
		<pubDate>Wed, 02 Sep 2009 17:27:46 +0000</pubDate>
		<dc:creator>federico</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[deep]]></category>
		<category><![CDATA[dojo]]></category>
		<category><![CDATA[kaizen]]></category>
		<category><![CDATA[kata]]></category>
		<category><![CDATA[master]]></category>
		<category><![CDATA[practice]]></category>
		<category><![CDATA[talent]]></category>

		<guid isPermaLink="false">http://federico.galassi.net/?p=148</guid>
		<description><![CDATA[I&#8217;ve recently blogged about talent and how it&#8217;s grown through disciplined, committed, error focused practice at the edge of your ability, known as deep practice. I guess now it makes sense to approach it from the perspective of programming: What&#8217;s programmer&#8217;s deep practice? Unsurprisingly, inspiration can be found in the great japanese culture, people who [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-149" style="margin: 2px;" title="karate_champ" src="http://federico.galassi.net/wp-content/uploads/2009/09/karate_champ.png" alt="karate_champ" width="180" height="206" />I&#8217;ve recently <a href="http://federico.galassi.net/2009/08/28/teach-yourself-anything-in-10000-hours/">blogged about talent and how it&#8217;s grown</a> through disciplined, committed, error focused practice at the edge of your ability, known as deep practice. I guess now it makes sense to approach it from the perspective of programming: What&#8217;s programmer&#8217;s deep practice? Unsurprisingly, inspiration can be found in the great japanese culture, people who highly value <a href="http://en.wikipedia.org/wiki/Bushid%C5%8D">discipline</a> and <a href="http://en.wikipedia.org/wiki/Kaizen">self improvement</a>. Specifically i&#8217;m talking of martial arts. If you were to learn, say, karate you would go to a <a href="http://en.wikipedia.org/wiki/Dojo">dojo</a> and perform <a href="http://en.wikipedia.org/wiki/Kata">katas</a>. If you happen to be a programmer, you can go to a coding dojo and practice code katas.</p>
<p><a href="http://en.wikipedia.org/wiki/Kata_%28programming%29">Code katas</a>, a term first coined by Pragmatic Programmer <a href="http://en.wikipedia.org/wiki/Dave_Thomas_%28programmer%29">Dave Thomas</a>, are small programming exercises geared to hone a specific programming skill. Traditionally, they tend to be <a href="http://en.wikipedia.org/wiki/Algorithm">algorithmic</a> like parsing or visiting graphs but could as well aim to improve understanding of particular <a href="http://en.wikipedia.org/wiki/Programming_paradigm">programming paradigms</a>, like functional or object oriented, or a specific language. Also, <a href="http://matteo.vaccari.name/blog/archives/177">as remarkably pointed out by Matteo</a>, katas can be crafted to master a certain technology like web or database. While, as you may guess, Coding Dojos are sites, groups or communities which propose and maintain collections of katas hopefully with solutions and reviews.</p>
<p>So, how do you practice? I suggest you solve a kata, review your work, compare it to other solutions, share your code with others and discuss it. Then solve it again trying to take a different path, balance pros and cons, then solve it again and again, until you <em>feel you internalized the essence of the problem</em>. Finally, you can move to another kata. If it feels like a lot of work, then you got it right. No question mastership requires time and effort but, then again, masters are those destined for greatness.</p>
<p><strong>Resources</strong></p>
<ul>
<li><a href="http://www.katacasts.com/">Katacasts</a></li>
<li><a href="http://codekata.pragprog.com/2007/01/code_kata_backg.html">21 Code Katas by Dave Thomas</a></li>
<li><a href="http://www.rubyquiz.com/">Lots of Code Quizzes with Ruby Solutions</a></li>
<li><a href="http://matteo.vaccari.name/blog/archives/177">Matteo Vaccari&#8217;s Technological Katas</a></li>
<li><a href="http://codingdojo.org/cgi-bin/wiki.pl?KataCatalogue">Coding Dojo Code Katas</a></li>
<li><a href="http://charlesmaxwood.com/8-lessons-from-corey-haines-performance-kata/">Corey Haines Video Solution in Ruby of String Template</a></li>
<li><a href="http://butunclebob.com/ArticleS.UncleBob">Uncle Bob</a> Code Katas (search &#8220;kata&#8221;, ie bowling kata)</li>
<li><a href="http://rubyconf2008.confreaks.com/ruby-kata-and-sparring.html">Micah Martin on Code Katas and Video Solution in Ruby of Langton&#8217;s Ant</a></li>
<li><a href="http://sparring.rubyforge.org/battleship/">Micah Martin&#8217;s BattleShip Tournament</a></li>
<li><a href="http://code.google.com/codejam/">Google Code Jam</a></li>
<li><a href="http://www.codinghorror.com/blog/archives/001138.html">Jeff Atwood on Code Katas</a></li>
<li><a href="http://steve.yegge.googlepages.com/practicing-programming">Steve Yegge on Code Katas<br />
</a></li>
<li><a href="http://norvig.com/21-days.html">Peter Norvig on Deep Practice</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://federico.galassi.net/2009/09/02/code-katas-programmers-deep-practice/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
