<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>@abahgat&#039;s blog</title>
	<atom:link href="http://blog.abahgat.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.abahgat.com</link>
	<description>Thoughts and experiences about software, the web and design</description>
	<lastBuildDate>Tue, 24 Jan 2012 09:01:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='blog.abahgat.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>@abahgat&#039;s blog</title>
		<link>http://blog.abahgat.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://blog.abahgat.com/osd.xml" title="@abahgat&#039;s blog" />
	<atom:link rel='hub' href='http://blog.abahgat.com/?pushpress=hub'/>
		<item>
		<title>How achievements can improve software quality</title>
		<link>http://blog.abahgat.com/2012/01/22/how-achievements-can-improve-software-quality/</link>
		<comments>http://blog.abahgat.com/2012/01/22/how-achievements-can-improve-software-quality/#comments</comments>
		<pubDate>Sun, 22 Jan 2012 22:58:21 +0000</pubDate>
		<dc:creator>Alessandro Bahgat</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[achievements]]></category>
		<category><![CDATA[channel 9]]></category>
		<category><![CDATA[coders]]></category>
		<category><![CDATA[game mechanics]]></category>
		<category><![CDATA[Gamification]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://blog.abahgat.com/?p=578</guid>
		<description><![CDATA[Last Friday, a blog post on Channel 9 announced Achievements for Visual Studio, an extension for the Microsoft IDE that tracks the actions of programmers as they write code and unlocks badges based on their behaviour. Now that the concept &#8230; <a href="http://blog.abahgat.com/2012/01/22/how-achievements-can-improve-software-quality/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abahgat.com&amp;blog=5154924&amp;post=578&amp;subd=abahgat&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><!-- U7J83NHXH34A --><a href="http://channel9.msdn.com/achievements/visualstudio"><img class="alignright size-full wp-image-581" style="border-color:initial;border-style:initial;border-width:0;margin:0;" title="Achievements for Visual Studio" src="http://abahgat.files.wordpress.com/2012/01/vsachievementslogo.png?w=584" alt="Visual Studio Achievements logo"   /></a>Last Friday, a blog post on Channel 9 announced <a href="http://channel9.msdn.com/Blogs/C9Team/Announcing-Visual-Studio-Achievements">Achievements for Visual Studio</a>, an extension for the Microsoft IDE that tracks the actions of programmers as they write code and unlocks badges based on their behaviour.</p>
<p>Now that the concept of <em><a class="zem_slink" title="Gamification" href="http://en.wikipedia.org/wiki/Gamification" rel="wikipedia">gamification</a></em> has become (even too much) mainstream, it is not surprising that this is not the first time an idea like this is proposed. Jason Rudolph has published an excellent blog post about <a title="Programming Achievements: How to Level Up as a Developer" href="http://jasonrudolph.com/blog/2011/08/09/programming-achievements-how-to-level-up-as-a-developer/">programming achievements</a>. Websites like <a href="http://coderwall.com/">coderwall</a> already inspect source code repositories on GitHub and others in order to build achievement-based profiles for coders. There even is an earlier project, called <a href="http://timdams.wordpress.com/2011/08/15/strokes-achievements-while-programming/">Strokes</a>, that added achievements and challenges to Visual Studio.</p>
<p>Introducing mainstream achievement support right within the IDEs, however, can have a stronger effect on the way we write software, as those tools can <strong>inspect code right while we are writing it</strong>. The strong link between action and reward lead to a stronger feeling of accomplishment when we earn those achievements, and programmers are likely to be receptive towards game mechanics (most of us have a background as gamers). But there is more than that.<br />
<span id="more-578"></span></p>
<h1>How it works</h1>
<p>Most of the newly introduced achievements promote best practices, such as the <em>Good Housekeeping</em> group depicted below. Some of them are triggered by specific events, such as <a href="http://channel9.msdn.com/achievements/visualstudio/Lonely">coding on a Friday night</a>, while others take <a href="http://channel9.msdn.com/achievements/visualstudio/PrintSourceCode">unlikely activities</a> and award achievements just for the fun of it. The full list is available on <a href="http://channel9.msdn.com/achievements/visualstudio">this</a> page.</p>
<p style="text-align:center;"><img class="aligncenter size-full wp-image-580" style="border-color:initial;border-style:initial;border-width:0;" title="Good Housekeeping achievement group" src="http://abahgat.files.wordpress.com/2012/01/goodhousekeeping.png?w=584" alt="Good Housekeeping"   /></p>
<p>There is also a more interesting set of achievements, appropriately called <em>Don&#8217;t Try This At Home</em>, which is way more controversial than all the others (and it resulted in a quite mixed set of reactions in the comments and on other blogs). Here are three examples:</p>
<p style="text-align:center;"><img class="aligncenter size-full wp-image-579" style="border-color:initial;border-style:initial;border-width:0;" title="Don't Try This At Home achievement group" src="http://abahgat.files.wordpress.com/2012/01/donttrythisathome.png?w=584" alt="Don't try this at home"   /></p>
<p>The achievements in this group are awarded as a consequence of using some commonly recognized bad practice, typically something that results in unreadable or unmaintainable code. They are given a sort of negative connotation, since most of them are not not worth any points (and some readers even proposed to actually <strong>subtract</strong> points) but they are still called <em>achievements</em>, which will certainly lead some coders &#8211; typically the ones with strong collector habits &#8211; to indulge in bad practices just to get all the possible badges.</p>
<p>And yet, even this initial implementation is a significant proof of how such a system can be used to influence the way we build software, even if at a low level. Since programming is not just a game, let&#8217;s see if we can design achievements to actually help us writing better software.</p>
<h1><strong>Taking it to the next level</strong></h1>
<p>Regularly running static code analysis tools can give so many benefits that, as <a href="http://altdevblogaday.com/2011/12/24/static-code-analysis/">John Carmack points out</a>, it is just irresponsible not to do it. However, especially with large and old code bases, even when such tools are used their output is neglected and they get discarded after a while. Often it takes the willpower of some good souls who choose to sacrifice their own time to fix all the defects that have been accumulating for months.</p>
<p>Gamification and achievements can be just the right nudge we needed to win the latent resistance towards static code analysis, as they can regularly inspect the code we write and give prompt, frequent and consistent feedback about how we are doing. But instead of presenting us with a flat list of warnings and notice, they can give us feedback in a more pleasant and personal way, as part of a wider system designed to add some fun to our chores.</p>
<p>The ideal system would be designed according to a few key principles, such as the following ones:</p>
<ul>
<li><strong>focus on positive change</strong> – by rewarding updates that increase the quality of the code base, more than one-off activities</li>
<li><strong>use positive framing</strong> – instead of punishing bad behaviour (e.g. by subtracting points), encourage good habits that last</li>
<li><strong>make cheating unappealing</strong> – if too much importance is given to the achievements themselves, users may try to &#8220;game&#8221; the gamification system, engaging in fake activities just to collect all the possible badges, or to get a higher score (that is why I am not fond progress bars, percentages and the whole concept of &#8220;missing achievements&#8221;)</li>
</ul>
<div>The present version of Visual Studio Achievements already uses a static code analysis tool, <a title="FxCop" href="http://www.microsoft.com/download/en/details.aspx?id=6544">FxCop</a>, to recognize code patterns related to some of the achievements, so we are certainly headed in the right direction.</div>
<div></div>
<div>
<div>This is just the beginning: consider what can be accomplished if we could access all the tools used in a continuous integration environment (version control, issue tracking, continuous integration). Here are some examples of the kind of behaviours I would love to see celebrated with achievements:</div>
<div>
<ul>
<li>reducing the number of warnings on an existing project</li>
<li>adding comments and documentation to a previously undocumented component</li>
<li>written a significant number of meaningful unit tests</li>
<li>committing 50 changes without breaking continuous integration</li>
</ul>
</div>
</div>
<h1>Conclusion</h1>
<p>As it often happens when games cross work and real life, ideas like this are bound to be controversial. On one side, we may see them as just adding some meaningless dimension to our day to day activities. On the other hand, we can benefit from the additional enthusiasm and motivation achievements can instill in us. Some people, like Reeves and Reed in <a href="http://www.amazon.com/gp/product/142214657X/ref=as_li_ss_tl?ie=UTF8&amp;tag=theunti-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=142214657X">Total Engagement</a> (p. 169), even suggest that building skill- and level-based profiles of employees and coworkers can result in better performing teams on the workplace.</p>
<p>Personally, as someone who has spent a significant fraction of his own lifetime playing games, game mechanics can have a big influence on my behaviour and engagement (even if I try to be aware of that happening). I believe that a well designed system can help a great deal in making positive behaviours and habits come more naturally.</p>
<p>Maybe achievements will not be that relevant for expert coders who are already passionate at what they do but, if used effectively, they can lead newbies to invest more in learning best practices and mastering their tools. Indeed, <strong>inducing good behaviour is better than imposing it</strong>.</p>
<p>So, when can we expect to see something like this on other platforms?</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/abahgat.wordpress.com/578/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/abahgat.wordpress.com/578/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/abahgat.wordpress.com/578/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/abahgat.wordpress.com/578/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/abahgat.wordpress.com/578/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/abahgat.wordpress.com/578/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/abahgat.wordpress.com/578/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/abahgat.wordpress.com/578/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/abahgat.wordpress.com/578/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/abahgat.wordpress.com/578/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/abahgat.wordpress.com/578/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/abahgat.wordpress.com/578/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/abahgat.wordpress.com/578/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/abahgat.wordpress.com/578/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abahgat.com&amp;blog=5154924&amp;post=578&amp;subd=abahgat&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.abahgat.com/2012/01/22/how-achievements-can-improve-software-quality/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:thumbnail url="http://abahgat.files.wordpress.com/2012/01/vsachievementslogo.png?w=150" />
		<media:content url="http://abahgat.files.wordpress.com/2012/01/vsachievementslogo.png?w=150" medium="image">
			<media:title type="html">Achievements for Visual Studio</media:title>
		</media:content>

		<media:content url="http://1.gravatar.com/avatar/7f3c642af40363040510685c7cc1334e?s=96&#38;d=wavatar&#38;r=R" medium="image">
			<media:title type="html">abahgat</media:title>
		</media:content>

		<media:content url="http://abahgat.files.wordpress.com/2012/01/vsachievementslogo.png" medium="image">
			<media:title type="html">Achievements for Visual Studio</media:title>
		</media:content>

		<media:content url="http://abahgat.files.wordpress.com/2012/01/goodhousekeeping.png" medium="image">
			<media:title type="html">Good Housekeeping achievement group</media:title>
		</media:content>

		<media:content url="http://abahgat.files.wordpress.com/2012/01/donttrythisathome.png" medium="image">
			<media:title type="html">Don&#039;t Try This At Home achievement group</media:title>
		</media:content>
	</item>
		<item>
		<title>We need smarter issue trackers</title>
		<link>http://blog.abahgat.com/2012/01/09/we-need-smarter-issue-trackers/</link>
		<comments>http://blog.abahgat.com/2012/01/09/we-need-smarter-issue-trackers/#comments</comments>
		<pubDate>Mon, 09 Jan 2012 11:21:24 +0000</pubDate>
		<dc:creator>Alessandro Bahgat</dc:creator>
				<category><![CDATA[design]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[Bug Tracking]]></category>
		<category><![CDATA[issue tracking]]></category>
		<category><![CDATA[Redmine]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://blog.abahgat.com/?p=537</guid>
		<description><![CDATA[While issue trackers originate as tools to manage projects more effectively, during the last years of work I have been through some situations where their misuse backfired. Tools originally conceived to improve workflows and project lifecycle became a significant burden &#8230; <a href="http://blog.abahgat.com/2012/01/09/we-need-smarter-issue-trackers/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abahgat.com&amp;blog=5154924&amp;post=537&amp;subd=abahgat&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><!-- U7J83NHXH34A --><img class="zemanta-img-inserted zemanta-img-configured alignleft" style="margin-top:10px;margin-bottom:10px;border-color:initial;border-style:initial;border-width:0;" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/63/Green_bug.svg/300px-Green_bug.svg.png" alt="" width="75" height="75" /></p>
<p>While issue trackers originate as tools to manage projects more effectively, during the last years of work I have been through some situations where their misuse backfired.<br />
Tools originally conceived to improve workflows and project lifecycle became a significant burden for the team using them, occasionally making difficult situations even worse.</p>
<p>This post is a collection of bad patterns I have seen happening. It is not a survey of all the possible situations that can occur. It is not meant to be an argument <strong>against</strong> issue trackers (if it tells anything, it will probably be about the teams I was part of), but rather an overview of things that went wrong because of the way <em>a particular team</em> used those systems.</p>
<p>In retrospective, most of the problems were due to a lack of discipline and experience of the project teams, and they are less frequent &#8211; if present &#8211; in a team of seasoned professionals. But, while training and education can certainly help, I would love to consider a different aspect: the issue tracking systems were not helping as they could have.</p>
<p>Here is a summary of the most common and annoying problems I encountered</p>
<ul>
<li><a href="http://blog.abahgat.com/2012/01/09/we-need-smarter-issue-trackers#tracker-misuse">The issue tracking system is misused</a></li>
<li><a href="http://blog.abahgat.com/2012/01/09/we-need-smarter-issue-trackers#duplicates">Lots of issues are duplicates</a></li>
<li><a href="http://blog.abahgat.com/2012/01/09/we-need-smarter-issue-trackers#processes">The system imposes over-engineered processes</a></li>
<li><a href="http://blog.abahgat.com/2012/01/09/we-need-smarter-issue-trackers#missing-info">Bug reports do not include enough information</a></li>
<li><a href="http://blog.abahgat.com/2012/01/09/we-need-smarter-issue-trackers#broken-priorites">The way priorities are managed is broken</a></li>
</ul>
<div>I would love to build on top of each negative experience, with a constructive attitude, by exploring how a better designed system could induce a better behavior.</div>
<p><span id="more-537"></span><br />
<a name="tracker-misuse"></a></p>
<h1>The issue tracker is misused</h1>
<p>While it should be obvious that an issue tracker is a tool to <em>track issues</em>, they are sometimes used for other kind of communications.</p>
<p style="text-align:center;"><a href="http://abahgat.files.wordpress.com/2012/01/whatdoyouthink.png"><img class="aligncenter  wp-image-554" style="border-color:initial;border-style:initial;border-width:0;" title="Issue trackers used to gather requirements" src="http://abahgat.files.wordpress.com/2012/01/whatdoyouthink.png?w=584&#038;h=184" alt="" width="584" height="184" /></a></p>
<p>The screenshot above is just the most recent example of misuse I have seen. The issues on the tracker should be items that can be acted upon, it is just not practical to use them to discuss features or to gather requirements.</p>
<p>A smart issue tracker should recognize questions and conversations and warn users when they are about to post them, just like Stack Overflow does in the screenshot below.</p>
<p style="text-align:center;"><a href="http://abahgat.files.wordpress.com/2012/01/stackoverflowsubjective.png"><img class="aligncenter  wp-image-556" style="border-color:initial;border-style:initial;border-width:0;" title="Questions with subjects that seem subjective generate a warning on Stac kOverflow" src="http://abahgat.files.wordpress.com/2012/01/stackoverflowsubjective.png?w=584&#038;h=221" alt="Questions with subjects that seem subjective generate a warning on Stack Overflow" width="584" height="221" /></a></p>
<p><a name="duplicates"></a></p>
<h1>Plenty of duplicates</h1>
<p>Duplicate bugs are a frequent pain point for many project teams, to the extent that a frequent suggestion is penalizing testers who open too many duplicates (and this <a title="" href="http://blogs.msdn.com/b/alanpa/archive/2007/08/01/duplicate-bugs.aspx">may not be a great idea</a>, after all). While they certainly can be minimized by a disciplined team, they still are likely to occur when a large team is testing a complex software product.</p>
<p>Avoiding duplicates is as easy as performing a search among the existing issues, but it is time consuming, so this step is often neglected. A smart issue tracker would automatically perform this step on behalf of the user and display a warning if it finds issues that look similar enough to the one being reported. This is exactly what happens when posting a new question on Stack Overflow (and somewhat similar to what Quora does): questions that look suspiciously similar to the one entered are displayed right next to the input area.</p>
<p>A diligent user would realize that there&#8217;s no need to add another issue if prompted with a match, but the system would never prevent the operation from being completed: a suggestion is better than an imposition, and users should be able to make the final decision.</p>
<p><a name="processes"></a></p>
<h1>Over-engineered processes</h1>
<p>Many issue tracking systems offer a very basic set of default states and properties, and allow their users to do many customizations to them from the settings page.</p>
<p>In the project I am part of, we use Redmine with a set of plugins oriented towards Agile methodologies. The default set of states and processes in Redmine has been customized to suit the project needs. Needless to say, strange things happened. All issues have an <em>optional</em> property &#8220;Assignee&#8221;, as expected by a system of this class. For some strange reason, however, we also have a state for issues called &#8220;Assigned&#8221;.</p>
<p style="text-align:center;"><img class="aligncenter size-full wp-image-551" style="border-color:initial;border-style:initial;border-width:0;" title="Two redundant fields: Assignee and Status = Assigned" src="http://abahgat.files.wordpress.com/2012/01/assignedassignee.png?w=584" alt=""   /></p>
<p>This redundant &#8220;Assigned&#8221; state information does not add any value to the process, it just adds one mandatory and uninformative step to the lifecycle of all issues. All the information it conveys can be derived from the presence or absence of value in the &#8220;Assignee&#8221; field. To make things worse, we can have issues in inconsistent state, with an empty &#8220;Assignee&#8221; field and state &#8220;Assigned&#8221;.</p>
<p>The process we ended up having for all of our tasks and issues can be simplified without loss of generality to the set of states and transitions offered by <a title="" href="http://www.pivotaltracker.com">Pivotal Tracker</a>, like the ones shown here. The only difference is that state transition in Pivotal are accomplished by clicking a button, while they are much more cumbersome in Redmine, since we need to update multiple fields at the same time.</p>
<p style="text-align:center;"><a href="http://abahgat.files.wordpress.com/2012/01/pivotaltrackerprocess.png"><img class="aligncenter  wp-image-545" style="border-color:initial;border-style:initial;border-width:0;" title="Pivotal Tracker offers a few states, but they are powerful enough for most scenarios." src="http://abahgat.files.wordpress.com/2012/01/pivotaltrackerprocess.png?w=239&#038;h=300" alt="" width="239" height="300" /></a></p>
<p>A good issue tracker should come with a set of sensible defaults, but powerful enough to handle most situations and state transitions should be as easy as clicking a button.</p>
<p>Configuration should be an option, not a requirement.</p>
<p><a name="missing-info"></a></p>
<h1>Missing information</h1>
<p>Reports without instructions about how to reproduce the bugs, screenshots of error pages, one-line reports without log extracts are frequent time-wasters.</p>
<p>During the last few months, I have lost count of the times I have seen issues being reopened without any other information, just to discover that the test progressed but the code was breaking at some later point.</p>
<p style="text-align:center;"><img class="aligncenter size-full wp-image-552" style="border-color:initial;border-style:initial;border-width:0;" title="Bugs were reopened without providing any detail" src="http://abahgat.files.wordpress.com/2012/01/reopennoinfo1.png?w=584" alt="Bugs were reopened without providing any detail"   /></p>
<p>While this kind of problem is often due to inexperience, a good tracker would induce (rather than imposing) bug reporters to supply enough information. (e.g. by not allowing to reopen an issue without supplying any information)</p>
<p><a title="Google Code" href="http://code.google.com/">Google Code</a> allows project owners to specify a &#8220;new issue&#8221; template that looks like the following:</p>
<blockquote>
<pre>What steps will reproduce the problem?
1.
2.
3.

What is the expected output? What do you see instead?</pre>
</blockquote>
<p>A template is an effective way to communicate what the team needs to know in order to solve issues. It encourages users to include useful information, and makes empty reports the less natural choice (reporters have to explicitly blank out the form).</p>
<p><a name="broken-priorites"></a></p>
<h1>Broken priorities</h1>
<p>The difference between the <em>severity</em> and the <em>priority</em> of a bug is often a source of confusion, even for <a title="Jira used to confuse severity and priority" href="https://jira.atlassian.com/browse/JRA-886">people who have been working on issue trackers for a long time</a>.</p>
<p>The <strong>severity</strong> of a bug depends on the impact it has on the underlying system, it is a functional measure, and can be estimated right when opening an issue.<br />
The <strong>priority</strong> of a bug is a scheduling decision, depending on business requirements, time required to fix and several other factors.</p>
<p>Severity and priority are clearly two different concepts. Although they are correlated (high severity should generally mean high priority, but not always), they represent different concepts. For example, an issue priority can change after a rescheduling, while an issue severity can hardly change unless something changes.</p>
<p>There are different <a title="Priority vs Severity… Why are you so difficult?" href="http://www.thetestingplanet.com/2011/07/priority-vs-severity-why-are-you-so-difficult/">schools</a> of <a title="Defect Severity vs Priority" href="http://www.aphids.com/agiletesting/2009/08/defect_severity_vs_priority.html">thought</a> about how to deal with this duality, ranging from supporting two different properties to two getting rid of one of them (e.g. <a title="Why FogBugz does not support severity" href="http://fogbugz.stackexchange.com/questions/352/priority-vs-severity">FogBugz dropped &#8220;severity&#8221;</a>).</p>
<p>In the last project I was working on the choice fell on the latter (we used <a title="" href="http://www.redmine.org">Redmine</a>, which supports <em>priority</em> by default and allows users to define custom levels). Now, while this is not a problem by itself, the highest possible issue priority configured was called &#8220;Blocker&#8221;.</p>
<p>At this point it should be evident about what the problem was: we were confusing scheduling with impact, automatically assuming that any issue that was blocking something else (yes, it was as vague as this) had higher priority than anything else.</p>
<p>To make things worse, we were using Redmine to track also our user stories and the features to be developed. What would a &#8220;blocker&#8221; priority mean, in that setting?</p>
<p>The chart below shows the result of this policy: in the last two months, 1 issue over every 4 was considered blocker.</p>
<p style="text-align:center;"><img class="aligncenter size-full wp-image-539" style="border-color:initial;border-style:initial;border-width:0;" title="Issue priority distribution over a two-months period" src="http://abahgat.files.wordpress.com/2012/01/issuedistribution.png?w=584" alt="Issue distribution"   /></p>
<p>The highest priority should be considered an exception, when it becomes the norm it ceases serving its purpose. &#8220;Blocker&#8221; was no longer informative, and bugs marked as such were only marginally more important than the others, which is something I do not want to see happening again.</p>
<p>A significant part of the responsibility is due to the confusion between priority and severity: there is no such thing as a &#8220;blocker priority&#8221;. If it is needed to track severity, there should be an option <strong>only for bug entries</strong> (not for tasks, chores and features).</p>
<p>The priority of a bug is a matter of planning and should not be set at the time of its discovery. A minimal triage process would have prevented most bugs being set as &#8220;blocker&#8221; just because they were blocking some automatic test routine.</p>
<p>A smart issue tracker would warn users when it detects that a significant part of the issues in the system have the highest priority, ideally right when they are about to open another issue using that level.</p>
<h1>Conclusion</h1>
<p>As it often happens, most of the problems do not depend just on the tracking systems themselves, but are caused by the way users interact with them. As said before, training and education can help a lot in minimizing the kind of patterns mentioned before, but better designed issue trackers can go a long way in reducing the possibilities for misuse.</p>
<p>Sites and applications on the Internet are becoming more and more powerful and refined in design. It is possible to guess what users are trying to do and induce them to use the systems we design in a proper way. It is possible to make small changes that point users in the right directions, and the previous sections offer some examples from the real world.</p>
<p>We can do better than punishing users when they do something wrong. We can design applications that realize when users are about to do something wrong, but instead of issuing an error message and aborting the action, they warn them, and point them in the right direction.</p>
<p>We should start designing issue trackers as if we were designing any other sophisticated application on the Internet.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/abahgat.wordpress.com/537/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/abahgat.wordpress.com/537/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/abahgat.wordpress.com/537/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/abahgat.wordpress.com/537/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/abahgat.wordpress.com/537/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/abahgat.wordpress.com/537/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/abahgat.wordpress.com/537/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/abahgat.wordpress.com/537/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/abahgat.wordpress.com/537/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/abahgat.wordpress.com/537/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/abahgat.wordpress.com/537/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/abahgat.wordpress.com/537/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/abahgat.wordpress.com/537/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/abahgat.wordpress.com/537/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abahgat.com&amp;blog=5154924&amp;post=537&amp;subd=abahgat&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.abahgat.com/2012/01/09/we-need-smarter-issue-trackers/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:thumbnail url="http://abahgat.files.wordpress.com/2012/01/issuedistribution.png?w=150" />
		<media:content url="http://abahgat.files.wordpress.com/2012/01/issuedistribution.png?w=150" medium="image">
			<media:title type="html">issuedistribution</media:title>
		</media:content>

		<media:content url="http://1.gravatar.com/avatar/7f3c642af40363040510685c7cc1334e?s=96&#38;d=wavatar&#38;r=R" medium="image">
			<media:title type="html">abahgat</media:title>
		</media:content>

		<media:content url="http://upload.wikimedia.org/wikipedia/commons/thumb/6/63/Green_bug.svg/300px-Green_bug.svg.png" medium="image" />

		<media:content url="http://abahgat.files.wordpress.com/2012/01/whatdoyouthink.png" medium="image">
			<media:title type="html">Issue trackers used to gather requirements</media:title>
		</media:content>

		<media:content url="http://abahgat.files.wordpress.com/2012/01/stackoverflowsubjective.png" medium="image">
			<media:title type="html">Questions with subjects that seem subjective generate a warning on Stac kOverflow</media:title>
		</media:content>

		<media:content url="http://abahgat.files.wordpress.com/2012/01/assignedassignee.png" medium="image">
			<media:title type="html">Two redundant fields: Assignee and Status = Assigned</media:title>
		</media:content>

		<media:content url="http://abahgat.files.wordpress.com/2012/01/pivotaltrackerprocess.png?w=239" medium="image">
			<media:title type="html">Pivotal Tracker offers a few states, but they are powerful enough for most scenarios.</media:title>
		</media:content>

		<media:content url="http://abahgat.files.wordpress.com/2012/01/reopennoinfo1.png" medium="image">
			<media:title type="html">Bugs were reopened without providing any detail</media:title>
		</media:content>

		<media:content url="http://abahgat.files.wordpress.com/2012/01/issuedistribution.png" medium="image">
			<media:title type="html">Issue priority distribution over a two-months period</media:title>
		</media:content>
	</item>
		<item>
		<title>Want to get better at your job? Spend time with children</title>
		<link>http://blog.abahgat.com/2011/12/21/want-to-get-better-at-your-job-spend-time-with-children/</link>
		<comments>http://blog.abahgat.com/2011/12/21/want-to-get-better-at-your-job-spend-time-with-children/#comments</comments>
		<pubDate>Wed, 21 Dec 2011 13:32:08 +0000</pubDate>
		<dc:creator>Alessandro Bahgat</dc:creator>
				<category><![CDATA[software engineering]]></category>
		<category><![CDATA[children]]></category>
		<category><![CDATA[communication]]></category>
		<category><![CDATA[job]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://blog.abahgat.com/?p=507</guid>
		<description><![CDATA[I still remember one of the most interesting questions I have been asked last year when I was interviewing for a Software Engineering position: How would you explain to a 12 years old what an API is? At first, I was surprised: &#8230; <a href="http://blog.abahgat.com/2011/12/21/want-to-get-better-at-your-job-spend-time-with-children/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abahgat.com&amp;blog=5154924&amp;post=507&amp;subd=abahgat&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I still remember one of the most interesting questions I have been asked last year when I was interviewing for a Software Engineering position:</p>
<blockquote><p>How would you explain to a 12 years old what an API is?</p></blockquote>
<p>At first, I was surprised: it certainly sounded like an uncommon question for a Software Engineering interview. And yet I tried to answer as best I could, trying to come up with a concise definition that could convey what I meant, but without assuming any specialist knowledge about computers and software.</p>
<p>As I progressed with the interview, it became evident what kind of ability my interviewer was trying to test.<br />
<span id="more-507"></span><br />
Whatever is the job we do, there is a good chance that we will need to interact with other people multiple times a day to get things done. However, <strong>the ability to communicate effectively is often overlooked and it is rarely a skill that is taught at school</strong>.</p>
<p>While we have no difficulty in interacting with other people in the same profession, things can sometimes go wrong when we meet someone with a totally different background.<br />
Have you ever tried explaining <em>virtualization </em>to a customer?<br />
If at some point their attention faded, they openly told us they could not understand what we were saying or we saw terror in their eyes when we met them during the following days, it is generally not because they are stupid, but probably because <strong>we are doing it wrong</strong>.</p>
<p><em>(Even if you are not from the IT field, you have probably been in a similar position. This post may apply to your experience as well.)</em></p>
<h1>So, how can we get better?</h1>
<p>Here is one trick that can help a lot.<br />
<strong>Spend time with children</strong>. If they are the curious, inquisitive type that always ask questions like &#8220;Why do airplanes fly?&#8221;, even better!<br />
In addition to being fun, explaining complex concepts to children turned out to be one of the most valuable exercises in communication I ever had the chance to try.<br />
Even if we are not dispensing unsolicited lectures, but we are rather asked a random question, chances are we will learn some interesting lessons about children.<br />
Here are some examples:</p>
<ul>
<li><em>They do not possess the same knowledge as we do</em> → It is not that they are stupid: we just have to choose the proper language for them and pick the right level of abstraction</li>
<li><em>Their attention span is generally limited</em> → We must be concise, stay on topic, and we should not answer their question starting from too far</li>
<li><em>They are not as much interested in the subject as we may be</em> → There is no point in delving into details that are irrelevant to them. We must know when to stop: never start a treatise on Nuclear Physics when asked why stars shine.</li>
<li><em>They pay little attention to pure abstractions</em> → We must leverage examples and analogies</li>
</ul>
<p>It turns out that those principles are <em>exactly</em> the same ones you could use to explain an abstract technical concept to a non technical colleague. It will not probably work for lambda-calculus, but I assure that it works for virtualization and many others.</p>
<h1>But what if I hate children?</h1>
<p>There are other activities that help getting better at communicating ideas. Here is a list of the most obvious ones, along with some non-obvious considerations.</p>
<ul>
<li><strong>Read</strong> – good books are able to engage us and keep up our attention. Fiction is fun, but try to read some non-fiction about some subject you are not an expert about. By doing that, you will be in the exact situation as your non technical colleagues when you try to explain something from your field. Look for patterns that work (e.g. metaphors and analogies) and try to make them yours.</li>
<li><strong>Listen to good podcasts</strong> (e.g. <a title="A great source of information about science" href="http://www.radiolab.org/">Radiolab</a> about science, <a title="Economics made interesting" href="http://www.npr.org/blogs/money/">Planet Money</a> about economics) – those are a great example about how you can take a complex subject and make it accessible to almost anyone.</li>
<li><strong>Practice writing</strong> – written communication is a lot different from speech. Writing on a blog is a good starting point, but keep in mind that email works only if you write concise messages that can be acted upon. Focus on brevity and meaning.</li>
<li><strong>Teach</strong> – Teaching offers a great incentive in delving deeper in the fundamentals of your profession, but it also forces you to pay a lot of attention about whether your message is getting across and keep the right pace when explaining things.</li>
</ul>
<p>While I still have lots to learn, I feel that in more than one occasion I was able to solve problems because I cared about expressing concepts in an effective way. I am still looking for ways to improve in this, however, so if you have any advice, please share.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/abahgat.wordpress.com/507/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/abahgat.wordpress.com/507/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/abahgat.wordpress.com/507/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/abahgat.wordpress.com/507/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/abahgat.wordpress.com/507/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/abahgat.wordpress.com/507/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/abahgat.wordpress.com/507/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/abahgat.wordpress.com/507/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/abahgat.wordpress.com/507/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/abahgat.wordpress.com/507/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/abahgat.wordpress.com/507/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/abahgat.wordpress.com/507/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/abahgat.wordpress.com/507/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/abahgat.wordpress.com/507/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abahgat.com&amp;blog=5154924&amp;post=507&amp;subd=abahgat&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.abahgat.com/2011/12/21/want-to-get-better-at-your-job-spend-time-with-children/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7f3c642af40363040510685c7cc1334e?s=96&#38;d=wavatar&#38;r=R" medium="image">
			<media:title type="html">abahgat</media:title>
		</media:content>
	</item>
		<item>
		<title>Tip: serve local files over HTTP with one console command</title>
		<link>http://blog.abahgat.com/2011/12/13/http-server/</link>
		<comments>http://blog.abahgat.com/2011/12/13/http-server/#comments</comments>
		<pubDate>Tue, 13 Dec 2011 13:55:47 +0000</pubDate>
		<dc:creator>Alessandro Bahgat</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://abahgat.wordpress.com/?p=459</guid>
		<description><![CDATA[This weekend I was playing with Facebook&#8217;s JavaScript SDK and I needed a quick way to serve over HTTP the files I was working on, so that I could access them in a browser window at http://localhost. I didn&#8217;t want to go &#8230; <a href="http://blog.abahgat.com/2011/12/13/http-server/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abahgat.com&amp;blog=5154924&amp;post=459&amp;subd=abahgat&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>This weekend I was playing with Facebook&#8217;s JavaScript SDK and I needed a quick way to serve over HTTP the files I was working on, so that I could access them in a browser window at http://localhost.</p>
<p>I didn&#8217;t want to go through the hassle of setting up Apache on my Mac, though, and I was looking for some quick alternative to installing a local web server. After some Googling, I <a title="http://stackoverflow.com/questions/101268/hidden-features-of-python" href="http://stackoverflow.com/a/5251200/27565">found</a> a wonderful one liner that did the job, provided that you have Python installed.</p>
<p>Open a Terminal window and go to the directory containing the files you want to serve and run:</p>
<pre>python -m SimpleHTTPServer</pre>
<p>or, if you are using Python 3,</p>
<pre>python -m http.server</pre>
<p>you will then be able to access your files on <tt>http://localhost:8000/</tt>. (You can specify a different port number by passing the number as last argument, just remember that you need root permissions to open sockets on ports lower than 1024.)</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/abahgat.wordpress.com/459/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/abahgat.wordpress.com/459/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/abahgat.wordpress.com/459/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/abahgat.wordpress.com/459/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/abahgat.wordpress.com/459/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/abahgat.wordpress.com/459/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/abahgat.wordpress.com/459/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/abahgat.wordpress.com/459/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/abahgat.wordpress.com/459/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/abahgat.wordpress.com/459/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/abahgat.wordpress.com/459/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/abahgat.wordpress.com/459/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/abahgat.wordpress.com/459/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/abahgat.wordpress.com/459/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abahgat.com&amp;blog=5154924&amp;post=459&amp;subd=abahgat&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.abahgat.com/2011/12/13/http-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7f3c642af40363040510685c7cc1334e?s=96&#38;d=wavatar&#38;r=R" medium="image">
			<media:title type="html">abahgat</media:title>
		</media:content>
	</item>
		<item>
		<title>The ultimate impulse purchase</title>
		<link>http://blog.abahgat.com/2011/09/06/the-ultimate-impulse-purchase/</link>
		<comments>http://blog.abahgat.com/2011/09/06/the-ultimate-impulse-purchase/#comments</comments>
		<pubDate>Tue, 06 Sep 2011 10:54:48 +0000</pubDate>
		<dc:creator>Alessandro Bahgat</dc:creator>
				<category><![CDATA[design]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[car]]></category>
		<category><![CDATA[iTunes]]></category>
		<category><![CDATA[music]]></category>
		<category><![CDATA[purchase]]></category>
		<category><![CDATA[radio]]></category>
		<category><![CDATA[song]]></category>

		<guid isPermaLink="false">http://abahgat.wordpress.com/?p=455</guid>
		<description><![CDATA[There is one thing that often frustrates me and yet it happens quite often: I am driving and listening to the radio, and at some point they play a song I like. I would love to buy it, but I &#8230; <a href="http://blog.abahgat.com/2011/09/06/the-ultimate-impulse-purchase/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abahgat.com&amp;blog=5154924&amp;post=455&amp;subd=abahgat&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://abahgat.files.wordpress.com/2011/08/imag0015.jpg"><img class="alignright size-medium wp-image-456" style="border-width:0;" title="Car dashboard" src="http://abahgat.files.wordpress.com/2011/08/imag0015.jpg?w=144&#038;h=192" alt="" width="144" height="192" /></a>There is one thing that often frustrates me and yet it happens quite often: I am driving and listening to the radio, and at some point they play a song I like. I would love to buy it, but I don&#8217;t know neither the song title nor its author.</p>
<p>Sometimes radio announcers say it immediately after, but some other times (most, actually) they do not, leaving no alternatives other than firing up <a href="http://www.shazam.com/">Shazam</a> to discover what is the song you like. And, well, if you are driving, that generally is a poor choice.</p>
<p>Now, just think about how we could redesign that process to make it more effective, using present-day technology and infrastructure.</p>
<p>Here is one possibility I would love to see happen.</p>
<p><span id="more-455"></span></p>
<p>Most cars are designed with a display meant to show miscellaneous information (including the name of the radio station you are listening to).</p>
<p>Now, imagine radio stations could use that display to show information about the song they are playing, and users would be able to <strong>press one single (physical) button to buy that song using some online store</strong> (iTunes, Amazon or some other alternative).</p>
<p>While this situation would require the convergence of effort and interests of several actors (radio stations, car manufacturers, music labels and online stores), it could lead to new business models, where radio can generate explicit leads just as Internet ads do.</p>
<p>That would the perfect setting to encourage <a title="Impulse purchase on Wikipedia" href="http://en.wikipedia.org/wiki/Impulse_purchase">impulse purchases</a>, allowing people to purchase songs they love <strong>right after they hear them</strong>.</p>
<p>If that is difficult to implement right now, maybe we just have to wait until we can have Android-powered car systems. If cars had a 3G connection and could leverage a proper ecosystem of apps and services, we can imagine a large number of new services, giving the term &#8220;mobility&#8221; a new and richer meaning.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/abahgat.wordpress.com/455/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/abahgat.wordpress.com/455/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/abahgat.wordpress.com/455/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/abahgat.wordpress.com/455/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/abahgat.wordpress.com/455/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/abahgat.wordpress.com/455/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/abahgat.wordpress.com/455/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/abahgat.wordpress.com/455/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/abahgat.wordpress.com/455/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/abahgat.wordpress.com/455/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/abahgat.wordpress.com/455/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/abahgat.wordpress.com/455/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/abahgat.wordpress.com/455/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/abahgat.wordpress.com/455/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abahgat.com&amp;blog=5154924&amp;post=455&amp;subd=abahgat&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.abahgat.com/2011/09/06/the-ultimate-impulse-purchase/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7f3c642af40363040510685c7cc1334e?s=96&#38;d=wavatar&#38;r=R" medium="image">
			<media:title type="html">abahgat</media:title>
		</media:content>

		<media:content url="http://abahgat.files.wordpress.com/2011/08/imag0015.jpg?w=225" medium="image">
			<media:title type="html">Car dashboard</media:title>
		</media:content>
	</item>
		<item>
		<title>What I love about the Kindle&#8230;</title>
		<link>http://blog.abahgat.com/2011/08/01/what-i-love-about-the-kindle/</link>
		<comments>http://blog.abahgat.com/2011/08/01/what-i-love-about-the-kindle/#comments</comments>
		<pubDate>Mon, 01 Aug 2011 11:14:57 +0000</pubDate>
		<dc:creator>Alessandro Bahgat</dc:creator>
				<category><![CDATA[design]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[digital]]></category>
		<category><![CDATA[ebook]]></category>
		<category><![CDATA[ereader]]></category>
		<category><![CDATA[Kindle]]></category>

		<guid isPermaLink="false">http://abahgat.wordpress.com/?p=413</guid>
		<description><![CDATA[&#8230;is not the device itself, but it is the whole ecosystem that surrounds it. I have received my Kindle as a gift at the beginning of this year, and it quickly became my favorite gift of all time. That can be &#8230; <a href="http://blog.abahgat.com/2011/08/01/what-i-love-about-the-kindle/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abahgat.com&amp;blog=5154924&amp;post=413&amp;subd=abahgat&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>&#8230;is not the device itself, but it is the whole ecosystem that surrounds it.<a href="http://amzn.to/ph0rsX"><img class="alignright size-full wp-image-434" style="border-color:initial;border-style:initial;border-width:0;" title="Kindle, 3rd Generation" src="http://abahgat.files.wordpress.com/2011/07/kindles1.png?w=584" alt="Kindle, 3rd Generation"   /></a></p>
<p>I have received my Kindle as a gift at the beginning of this year, and it quickly became my favorite gift of all time.</p>
<p>That can be quite surprising, knowing me. I own many different devices, gadgets and computers, but I have always been fond of the smell and feeling of paper books. Knowing that, some people were ready to bet that I would use the Kindle for just a few days and neglect it shortly after for something else (e.g. my iPad).</p>
<p>I must admit that I am sure this is exactly what would have happened with any other e-reader device. My experience with the Kindle, however, was (surprisingly) awesome, and it due to reasons I didn&#8217;t expect.</p>
<p><span id="more-413"></span></p>
<p>While the reader by itself is a great device under any aspect that matters (i.e. it is light, fast and the battery lasts weeks), the number of services Amazon built on top of that make the experience with the Kindle even better.</p>
<p>As you probably know by now, you can buy books directly from the device, you can send your files and documents over email, it automatically downloads new content over WiFi or 3G connections.</p>
<p>What I found incredibly useful, though, is the ability to read any book I downloaded from Amazon on any of the devices I use (whether it is a PC, a Mac, a phone or an iPad) by using the dedicated apps Amazon built for each of those.</p>
<p>All apps and devices are able to sync wirelessly, without the need for any cable connection to a computer. Even more important, <strong>any progress you make while reading the book is synchronized to all the devices you use to read it</strong>.</p>
<p>So, imagine the scenario, even if you read 3-5 pages of a book on your cell phone while waiting in line at the post office, the next time you pick up your Kindle you will find yourself at the right page. Isn&#8217;t that great?</p>
<p>I still miss this kind of feature every time I need to semi-manually manage 1-hour podcasts between my iPod nano, iPad, work and home computers. I&#8217;m sure you understand how much having to deal with such a nuisance makes the <a title="Kindle on Amazon" href="http://amzn.to/ph0rsX">Kindle</a> even more sweet to my eyes.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/abahgat.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/abahgat.wordpress.com/413/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/abahgat.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/abahgat.wordpress.com/413/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/abahgat.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/abahgat.wordpress.com/413/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/abahgat.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/abahgat.wordpress.com/413/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/abahgat.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/abahgat.wordpress.com/413/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/abahgat.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/abahgat.wordpress.com/413/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/abahgat.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/abahgat.wordpress.com/413/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abahgat.com&amp;blog=5154924&amp;post=413&amp;subd=abahgat&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.abahgat.com/2011/08/01/what-i-love-about-the-kindle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7f3c642af40363040510685c7cc1334e?s=96&#38;d=wavatar&#38;r=R" medium="image">
			<media:title type="html">abahgat</media:title>
		</media:content>

		<media:content url="http://abahgat.files.wordpress.com/2011/07/kindles1.png" medium="image">
			<media:title type="html">Kindle, 3rd Generation</media:title>
		</media:content>
	</item>
		<item>
		<title>There is no such thing as Internet Security</title>
		<link>http://blog.abahgat.com/2011/06/13/there-is-no-such-thing-as-internet-security/</link>
		<comments>http://blog.abahgat.com/2011/06/13/there-is-no-such-thing-as-internet-security/#comments</comments>
		<pubDate>Mon, 13 Jun 2011 12:25:15 +0000</pubDate>
		<dc:creator>Alessandro Bahgat</dc:creator>
				<category><![CDATA[web]]></category>
		<category><![CDATA[Citigroup]]></category>
		<category><![CDATA[Computer security]]></category>
		<category><![CDATA[Kevin Mitnick]]></category>
		<category><![CDATA[PlayStation Store]]></category>
		<category><![CDATA[RSA]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[Sony]]></category>

		<guid isPermaLink="false">http://abahgat.wordpress.com/?p=388</guid>
		<description><![CDATA[During the course of the last months, we have seen frequent news of security breaches, with many websites falling victims of malicious attacks. While this by itself is not a news, the frequency and scale of this kind of attacks hardly &#8230; <a href="http://blog.abahgat.com/2011/06/13/there-is-no-such-thing-as-internet-security/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abahgat.com&amp;blog=5154924&amp;post=388&amp;subd=abahgat&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>During the course of the last months, we have seen frequent news of security breaches, with many websites falling victims of malicious attacks. While this by itself is not a news, the frequency and scale of this kind of attacks hardly passes without notice.</p>
<p>Sony&#8217;s example is probably the most visible example of this trend, as Kevin Mitnick points out.</p>
<blockquote class='twitter-tweet tw-align-center' lang='en'><p>I lost count of all the Sony attacks. CORRECTED: Sony Scoreboard: Hackers 12, Sony 0,  Source: <a href="http://tinyurl.com/6dcugje" rel="nofollow">http://tinyurl.com/6dcugje</a></p>&mdash; <br />Kevin Mitnick (@kevinmitnick) <a href='http://twitter.com/#!/kevinmitnick/status/77179473480527872' data-datetime='2011-06-05T01:06:35+00:00'>June 05, 2011</a></blockquote>
<p>But they are not the only ones: the attacks on <a title="Regulators pressure banks after Citi data breach" href="http://www.reuters.com/article/2011/06/09/us-citi-idUSTRE7580TM20110609">Citigroup</a> and security company <a title="RSA finally comes clean: SecurID is compromised" href="http://arstechnica.com/security/news/2011/06/rsa-finally-comes-clean-securid-is-compromised.ars">RSA</a> are even more alarming. If even those companies that should be dealing with security issues every day are not impenetrable, chances are everyone&#8217;s data is at risk. Or, at least, that&#8217;s the message that most of the newspapers appear to be conveying.</p>
<p>While it&#8217;s easy to dismiss those people as fools, those facts should teach us something different: <strong>there is no such thing as a secure system</strong>.</p>
<p><span id="more-388"></span>As <a title="Schneier on Security" href="http://www.schneier.com/">Bruce Schneier</a> wrote in this <a href="http://books.google.com/books?id=x1Q9TxhYA3sC&amp;lpg=PA369&amp;ots=uNxy_qNnBq&amp;pg=PA369#v=onepage&amp;q&amp;f=false">afterword to Little Brother</a>,</p>
<blockquote><p>[...] it&#8217;s impossible to prove that something is secure. All you can do is try to break it. &#8212; if you fail, you know that it&#8217;s secure enough to keep you out, but what about someone who&#8217;s smarter than you? Anyone can design a security system so strong he himself can&#8217;t break it.</p></blockquote>
<p>In addition to that, any organization that has to deal with security on the Internet, has to deal with two additional additional factors: <strong>numbers</strong> and <strong>skill</strong>.</p>
<p>The number of people and the resources they can invest on building, securing and testing their systems are and will always be lesser than what some communities will be able to assemble.</p>
<p>And even if they have a team of 50 full-time employees working on their security infrastructure, it is not unlikely that some kid some day, by dedicating 15 hours per day to his passion for security systems, will be able to devise a way to penetrate a remote system.</p>
<p>So, should we just do what we can and hope for the best? I don&#8217;t think so, but we should probably invest more time than we do now to handle the possible consequences of our systems being compromised (e.g. partitioning critical data, early breach detection, faster recovery). Again, we should <a title="Failure is an option" href="http://abahgat.wordpress.com/2011/05/12/failure-is-an-option/">prepare to deal with the fact that our systems may fail</a>.</p>
<p>Again, we often spend a lot of effort trying to make our systems as hard as possible to break in, but we neglect to take the proper measures to make sure that, whenever that happens, we are able to contain damage and be rapidly up &amp; running right afterwards.</p>
<p>Why else would it have taken so long for Sony&#8217;s to reopen the PlayStation Store (<a href="http://en.wikipedia.org/wiki/PlayStation_Network_outage#Timeline_of_the_outage">almost 1 month</a>)?</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/abahgat.wordpress.com/388/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/abahgat.wordpress.com/388/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/abahgat.wordpress.com/388/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/abahgat.wordpress.com/388/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/abahgat.wordpress.com/388/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/abahgat.wordpress.com/388/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/abahgat.wordpress.com/388/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/abahgat.wordpress.com/388/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/abahgat.wordpress.com/388/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/abahgat.wordpress.com/388/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/abahgat.wordpress.com/388/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/abahgat.wordpress.com/388/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/abahgat.wordpress.com/388/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/abahgat.wordpress.com/388/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abahgat.com&amp;blog=5154924&amp;post=388&amp;subd=abahgat&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.abahgat.com/2011/06/13/there-is-no-such-thing-as-internet-security/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7f3c642af40363040510685c7cc1334e?s=96&#38;d=wavatar&#38;r=R" medium="image">
			<media:title type="html">abahgat</media:title>
		</media:content>
	</item>
		<item>
		<title>Authors ≠ committers: why most Open Source projects should switch to distributed revision control</title>
		<link>http://blog.abahgat.com/2011/05/25/authors-committers-why-open-source-projects-should-switch-to-distributed-revision-control/</link>
		<comments>http://blog.abahgat.com/2011/05/25/authors-committers-why-open-source-projects-should-switch-to-distributed-revision-control/#comments</comments>
		<pubDate>Wed, 25 May 2011 20:02:05 +0000</pubDate>
		<dc:creator>Alessandro Bahgat</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[dscm]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[hg]]></category>
		<category><![CDATA[mercurial]]></category>
		<category><![CDATA[open source]]></category>

		<guid isPermaLink="false">http://abahgat.wordpress.com/?p=314</guid>
		<description><![CDATA[I had been thinking about the idea behind this post for a while now, but reading this post about getting newbies involved in open source just convinced me to write it down. Being a concept developed in the Open Source &#8230; <a href="http://blog.abahgat.com/2011/05/25/authors-committers-why-open-source-projects-should-switch-to-distributed-revision-control/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abahgat.com&amp;blog=5154924&amp;post=314&amp;subd=abahgat&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I had been thinking about the idea behind this post for a while now, but reading this post about <a title="Getting newbies involved in open source" href="http://brandonhays.com/blog/2011/05/23/getting-newbies-involved-in-open-source/">getting newbies involved in open source</a> just convinced me to write it down.</p>
<p>Being a concept developed in the Open Source world, it is no wonder that <a title="Distributed revision control on Wikipedia" href="http://en.wikipedia.org/wiki/Distributed_revision_control">distributed revision control</a> systems give their best in that context. There are many pros and cons, that <a title="Linux Torvalds on git, Tech Talk video" href="http://www.youtube.com/watch?v=4XpnKHJAok8">other people described</a> in detail better than I can do. Of all the features they offer, however, the one I prefer is the least technical one, and it is related to the way they encourage <em>new</em> developers to contribute to open source projects. In that perspective, git and mercurial are a lot more effective than svn, for example.</p>
<p>It all comes as a side effect of <strong>authors and committers being two different roles</strong>. This can encourage new contributors, who are approaching a new project for the first time, and individuals who may not have the time and energy to dedicate long periods of their time to a project, but may be able to contribute with just a few patches.</p>
<div id="attachment_370" class="wp-caption aligncenter" style="width: 556px"><a href="http://abahgat.files.wordpress.com/2011/05/github.png"><img class="size-full wp-image-370" title="A commit from GitHub" src="http://abahgat.files.wordpress.com/2011/05/github.png?w=584" alt="A commit from GitHub"   /></a><p class="wp-caption-text">How GitHub displays both the author and the committer of a single change. Oh, and yes, there is something wrong with the dates. <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p></div>
<p>Think about that. Recognition is one of the most important drivers for Open Source contributors but, unfortunately, centralized revision control (subversion, CVS and the like) doesn&#8217;t help in giving credit to newcomers or occasional contributors.</p>
<p>That&#8217;s because, generally, sending a single patch (or even a few of them) is not enough to be granted commit access to a project repository (and rightly so) and the commit itself must be done by a project member with enough privileges.</p>
<p><span id="more-314"></span><br />
With svn or cvs, the committer of a changeset figures as its author, and the original author of the code is often just mentioned in the notes or in some &#8220;credits&#8221; list.</p>
<p>With git or mercurial, on the other hand, the author and the committer of a changeset are not necessarily the same person: each commit can then <strong>retain the original author name</strong>.</p>
<p>I believe that some coders would be much more willing to contribute to Open Source software if they know their name will be included in the official commit logs, especially given the existence of sites like <a class="zem_slink" title="Ohloh" href="http://www.ohloh.net/" rel="homepage">Ohloh</a>, that track contributions by single commits. I would be much more willing to engage in a project if I knew that my changes would be attributed to me no matter who commits them.</p>
<p>That is why I believe what I said in the title: if you are about to start a new Open Source project, you should pick git or mercurial as your revision control system. Do it not just because they are better (and I strongly believe they are), but also because they will make it easier for you to credit any contributor you&#8217;ll get.</p>
<hr />
<p><em>For those of you who are unfamiliar with the whole concept of distributed revision control, I suggest you to visit <a title="Hg Init: a Mercurial tutorial" href="http://hginit.com/">hginit.com</a> or <a title="Git Reference" href="http://gitref.org/">gitref.org</a>, they both offer intuitive and effective tutorials about the benefits of using mercurial or git.</em></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/abahgat.wordpress.com/314/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/abahgat.wordpress.com/314/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/abahgat.wordpress.com/314/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/abahgat.wordpress.com/314/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/abahgat.wordpress.com/314/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/abahgat.wordpress.com/314/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/abahgat.wordpress.com/314/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/abahgat.wordpress.com/314/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/abahgat.wordpress.com/314/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/abahgat.wordpress.com/314/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/abahgat.wordpress.com/314/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/abahgat.wordpress.com/314/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/abahgat.wordpress.com/314/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/abahgat.wordpress.com/314/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abahgat.com&amp;blog=5154924&amp;post=314&amp;subd=abahgat&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.abahgat.com/2011/05/25/authors-committers-why-open-source-projects-should-switch-to-distributed-revision-control/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7f3c642af40363040510685c7cc1334e?s=96&#38;d=wavatar&#38;r=R" medium="image">
			<media:title type="html">abahgat</media:title>
		</media:content>

		<media:content url="http://abahgat.files.wordpress.com/2011/05/github.png" medium="image">
			<media:title type="html">A commit from GitHub</media:title>
		</media:content>
	</item>
		<item>
		<title>Failure is an option</title>
		<link>http://blog.abahgat.com/2011/05/12/failure-is-an-option/</link>
		<comments>http://blog.abahgat.com/2011/05/12/failure-is-an-option/#comments</comments>
		<pubDate>Thu, 12 May 2011 16:20:57 +0000</pubDate>
		<dc:creator>Alessandro Bahgat</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[Failure]]></category>
		<category><![CDATA[Netflix]]></category>
		<category><![CDATA[outage]]></category>

		<guid isPermaLink="false">http://abahgat.wordpress.com/?p=334</guid>
		<description><![CDATA[As Software Engineers, we often tend to be overly optimistic about software. In particular, it often happens that we underestimate the probability of systems and components failures and the impact this kind of events can have on our applications. We &#8230; <a href="http://blog.abahgat.com/2011/05/12/failure-is-an-option/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abahgat.com&amp;blog=5154924&amp;post=334&amp;subd=abahgat&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>As Software Engineers, we often tend to be overly optimistic about software. In particular, it often happens that we underestimate the probability of systems and components failures and the impact this kind of events can have on our applications.</p>
<p>We usually tend to dismiss failure events as random, unlikely and sporadic. And, often, we are proven wrong.</p>
<p>Systems do fail indeed. Moreover, when something goes wrong, either it&#8217;s barely noticeable, or it&nbsp;leads to extreme consequences. Take the example of the recent AWS outage: everything was caused by a <a title="Summary of the Amazon EC2 and Amazon RDS Service Disruption in the US East Region" href="http://aws.amazon.com/message/65648/">mistake during a routine network change</a>.</p>
<p>Right now, some days after the event, post-mortem analyses and survival stories count in the dozens. There is one recurring lesson that can be learned from what happened.</p>
<p><span id="more-334"></span>Not only we should try to prevent failure, but we should <strong>design our systems to deal with failure as if it were systematic</strong>. This is the only way to build robust and resilient software, and still it may not be enough.<br />
Most of the sites and applications that were able to stay up and running while others were taken offline were designed with that principle in mind.</p>
<p>Netflix&#8217;s example is probably the most significant: while they were affected by the outage, things looked quite calm from a customer&#8217;s perspective. In retrospect, it&#8217;s not surprising at all, given what they <a title="5 Lessons We’ve Learned Using AWS" href="http://techblog.netflix.com/2010/12/5-lessons-weve-learned-using-aws.html">wrote on their Tech Blog</a>:</p>
<blockquote><p>
We’ve sometimes referred to the Netflix software architecture in AWS as our Rambo Architecture. Each system has to be able to succeed, no matter what, even all on its own. We’re designing each distributed system to expect and tolerate failure from other systems on which it depends.<br />
[...]<br />
One of the first systems our engineers built in AWS is called the Chaos Monkey. The Chaos Monkey’s job is to randomly kill instances and services within our architecture. If we aren’t constantly testing our ability to succeed despite failure, then it isn’t likely to work when it matters most – in the event of an unexpected outage.</p></blockquote>
<p>Even though Amazon explicitly <em>encourages</em> developers to build their applications to deal with random failures or service degradations, the guys at Netflix went out of their way to make sure they were not dismissing that kind of issues as unlikely. It&#8217;s good to know that this approach eventually paid off, and even if we&#8217;re often not in the position to adopt such radical strategies, we should certainly keep in mind the lessons they have learned.</p>
<p>It&#8217;s time to stop making fun of Murphy&#8217;s law, and start designing our stuff according to it. Stuff breaks, and when it happens, it breaks badly.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/abahgat.wordpress.com/334/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/abahgat.wordpress.com/334/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/abahgat.wordpress.com/334/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/abahgat.wordpress.com/334/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/abahgat.wordpress.com/334/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/abahgat.wordpress.com/334/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/abahgat.wordpress.com/334/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/abahgat.wordpress.com/334/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/abahgat.wordpress.com/334/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/abahgat.wordpress.com/334/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/abahgat.wordpress.com/334/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/abahgat.wordpress.com/334/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/abahgat.wordpress.com/334/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/abahgat.wordpress.com/334/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abahgat.com&amp;blog=5154924&amp;post=334&amp;subd=abahgat&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.abahgat.com/2011/05/12/failure-is-an-option/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7f3c642af40363040510685c7cc1334e?s=96&#38;d=wavatar&#38;r=R" medium="image">
			<media:title type="html">abahgat</media:title>
		</media:content>
	</item>
		<item>
		<title>What I learnt from coding offline</title>
		<link>http://blog.abahgat.com/2011/04/29/what-i-learnt-from-coding-offline/</link>
		<comments>http://blog.abahgat.com/2011/04/29/what-i-learnt-from-coding-offline/#comments</comments>
		<pubDate>Fri, 29 Apr 2011 08:58:27 +0000</pubDate>
		<dc:creator>Alessandro Bahgat</dc:creator>
				<category><![CDATA[coding]]></category>

		<guid isPermaLink="false">http://abahgat.wordpress.com/?p=291</guid>
		<description><![CDATA[During the last weeks, I&#8217;ve been writing a lot of code while commuting. Since I was working on an application that uses Facebook&#8217;s and Amazon&#8217;s APIs and I was working offline, I often found myself unable to test the code &#8230; <a href="http://blog.abahgat.com/2011/04/29/what-i-learnt-from-coding-offline/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abahgat.com&amp;blog=5154924&amp;post=291&amp;subd=abahgat&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>During the last weeks, I&#8217;ve been writing a lot of code while commuting.</p>
<p>Since I was working on an application that uses Facebook&#8217;s and Amazon&#8217;s APIs and I was working offline, I often found myself unable to test the code I was writing against live data.</p>
<p>I must confess I struggled at the beginning.</p>
<p>I had no chance to try out my small application while I was working on it and, generally, I had to code during 1-hour trips, waiting until I got to work/home to see whether everything was performing as expected.</p>
<p>The outcome? I was surprisingly productive. And I&#8217;m sure it was not just because of the absence of common distraction sources (IMs, Email, Twitter and the like).</p>
<p>So, what made the difference? Here are some of the insights I got from the experience.</p>
<p><span id="more-291"></span><br />
Write <strong>shorter and cleaner code</strong> &amp; <strong>write for reuse</strong>: two long-time classics, they are even more important in this kind of scenario. Minimizing code means you have less stuff that can break, while maximizing reuse means you can rely on a lot of tested and stable code, focusing on the feature you are building.</p>
<p><strong>Think before coding</strong> anything: getting it right the first time is significantly more effective than going through multiple rounds of debugging. While I was used to this when I started this career, this habit was getting weaker over time.<br />
Working with fast development machines and powerful IDEs was slowly changing my approach to an iteration of the same sequence: code → test → debug. Working offline forced me to keep a clear picture of what I was trying to accomplish and think thoroughly before writing anything.</p>
<p>Write <strong>more accurate unit tests</strong>: I was forced to think about everything that could possibly go wrong with my code. Unit tests were the only significant way to test my code while I had no access to live data.</p>
<p>Be <strong>feature oriented</strong> (this is my favourite): since I had to work for a while without being able to perform a significant integration test, I tried to pack features into 1-hour slots, so that I could test one single feature each time I got online again. Also, if my app started misbehaving, it was easy to track the culprit.</p>
<p>Switch to a <strong>peer to peer SCM</strong> (mercurial, at the time): this granted me the possibility to bring the entire project history with me, commit local changes (again, grouped by feature) while still allowing me to sync my source code across my different machines.</p>
<p>What then?<br />
As usual, I wouldn&#8217;t learn so much if I didn&#8217;t have so much to learn. While none of these points is certainly new by itself, what&#8217;s relevant to me is that this kind of experience taught me a lot of good habits and strengthened some others all in the same time. Not only I learned to cope with the disadvantage of being offline, but I even got better as a consequence.</p>
<p><strong>UPDATE</strong>: a friend pointed out to this excellent <a href="http://blog.rtwilson.com/want-to-write-some-code-get-away-from-your-computer/">post</a> by Robin Wilson which expresses a similar opinion. If you liked this post, you might be interested in his one as well.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/abahgat.wordpress.com/291/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/abahgat.wordpress.com/291/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/abahgat.wordpress.com/291/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/abahgat.wordpress.com/291/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/abahgat.wordpress.com/291/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/abahgat.wordpress.com/291/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/abahgat.wordpress.com/291/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/abahgat.wordpress.com/291/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/abahgat.wordpress.com/291/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/abahgat.wordpress.com/291/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/abahgat.wordpress.com/291/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/abahgat.wordpress.com/291/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/abahgat.wordpress.com/291/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/abahgat.wordpress.com/291/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.abahgat.com&amp;blog=5154924&amp;post=291&amp;subd=abahgat&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.abahgat.com/2011/04/29/what-i-learnt-from-coding-offline/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7f3c642af40363040510685c7cc1334e?s=96&#38;d=wavatar&#38;r=R" medium="image">
			<media:title type="html">abahgat</media:title>
		</media:content>
	</item>
	</channel>
</rss>
