<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Planet TW</title>
	<link>http://blogs.thoughtworks.com/</link>
	<language>en</language>
	<description>Planet TW - http://blogs.thoughtworks.com/</description>

<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/PlanetTw" type="application/rss+xml" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site.</feedburner:browserFriendly><item>
	<title>Ross Pettit: Introducing alphaITjournal.com</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-30621875.post-9134422865434294672</guid>
	<link>http://feeds.feedburner.com/~r/PlanetTw/~3/344215479/introducing-alphaitjournalcom.html</link>
	<description>I'm pleased to announce the launch of &lt;a href="http://www.alphaitjournal.com/"&gt;alphaITjournal.com&lt;/a&gt;, an online magazine focused on the execution, management and governance of IT investments that can produce outsized (or "alpha") returns. The mission and purpose are summarised in the &lt;a href="http://www.alphaitjournal.com/articles/20080616"&gt;welcome message&lt;/a&gt; on the site and in the &lt;a href="http://www.reuters.com/article/pressRelease/idUS127551+08-Jul-2008+BW20080708"&gt;press release&lt;/a&gt; that was issued in early July.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;There are a few things that I hope stand out about the site.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;The first is the site layout. It's designed to give attention to writers and their articles, and make the content easy for readers to navigate without being overwhelmed by a polyglot of messages.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Another is the absence of advertising. Aside from the "Presented by &lt;a href="http://www.thoughtworks.com/"&gt;ThoughtWorks&lt;/a&gt;" message on the left navigation and bottom menu, there is no advertising on alphaITjournal.com. Being practitioners, this affords us flexibility in dealing with changing project demands and work priorities that will affect content production and editing.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Still another is the continuous release of content.  Rather than having monthly editions, there will be one or two articles released each week. This will make it easier for the reader to stay current, and it will also make it easier to sustain fresh content on the site.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Last but certainly not least is the diverse community of writers. While ThoughtWorks is sponsoring the site, the community of writers are from all corners the IT universe. They, in turn, are producing content on a diverse collection of topics, all with a common theme: how to maximise returns on IT investments.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;I hope that alphaITjournal.com consistently provides compelling content so that you'll be a regular reader, even a promoter: add it to your RSS news reader, share it with your peers and customers, add a link to it from your blog. I also hope that you'll consider being a contributor. We have a number of writers, but we are always looking for more. If you have ideas for individual articles, a series or a column, &lt;a href="http://www.alphaitjournal.com/static/contact"&gt;drop me an email&lt;/a&gt;.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;We've just gone live, so there are a few additions we'll make once we establish our rhythm (such as reader comments). Meanwhile, if you haven't done so already please give &lt;a href="http://www.alphaitjournal.com/"&gt;alphaITjournal.com&lt;/a&gt; a visit.</description>
	<pubDate>Thu, 24 Jul 2008 04:03:22 +0000</pubDate>
	<author>noreply@blogger.com (Ross Pettit)</author>
<feedburner:origLink>http://agilemanager.blogspot.com/2008/07/introducing-alphaitjournalcom.html</feedburner:origLink></item>
<item>
	<title>Neal Ford: Rich Web Experience 2008 x 2</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-9944221.post-7072240733781342530</guid>
	<link>http://feeds.feedburner.com/~r/PlanetTw/~3/343735927/rich-web-experience-2008-x-2.html</link>
	<description>&lt;img src="http://nealford.com/images/NOFL_RWE-East_125x125_spkr.jpg" align="left" hspace="10" alt="Rich Web Experience East"&gt;&lt;/img&gt; &lt;img src="http://nealford.com/images/NOFL_RWE-West_125x125_spkr.jpg" align="left" hspace="10" alt="Rich Web Experience East"&gt;&lt;/img&gt;Last year, one of the most refreshing conferences where I spoke was the Rich Web Experience. Too often, conferences are mono-cultures, and mono-cultures are generally boring. RWE is fundamentally different because it's what I call a condiment conference. The focus is on how to make applications better, not how to make the plumbing better. Nothing wrong with plumbing, mind you, it's just refreshing to look at faucets for a change. &lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;This conference has an eclectic mix of developers. Hallway conversations lack the implicit assumptions you can generally make at main course conferences. For example, all Java developers have an implicit context. At The Rich Web Experience, you have to throw away your base assumptions, both in sessions and conversations. Just like travel broadens you because you meet people with different contexts and experiences, attending the Rich Web Experience does the same for technologists. Instead of the usual low-level animosity that each technology tribe exhibits for the non-tribe members, everyone focuses on common ground. This year, there are 2: one near the east coast and another on the west.</description>
	<pubDate>Wed, 23 Jul 2008 16:22:40 +0000</pubDate>
	<author>noreply@blogger.com (Neal Ford)</author>
<feedburner:origLink>http://memeagora.blogspot.com/2008/07/rich-web-experience-2008-x-2.html</feedburner:origLink></item>
<item>
	<title>Agile Hong Kong: Build Jamming</title>
	<guid isPermaLink="false">http://agilehongkong.com/2008/07/23/build-jamming/</guid>
	<link>http://feeds.feedburner.com/~r/PlanetTw/~3/343693747/</link>
	<description>&lt;p&gt;Builds are a fundamental part of any project. They are the bedrock of a project. Done well they make development and maintenance of a project easier. Done poorly and they can increase the time it takes to develop and maintain a project and even make development difficult. A well structured build will even help reduce defects by making continuous integration easier and by ensuring tests are run during each integration cycle. A good build will also aid in the deployment of a system.&lt;/p&gt;
&lt;p&gt;In our next Jam we’ll look at build systems. Identify what makes a good build system, looking at how they might be structured for best practice. We’ll also look at various tools that support builds. Specifically we’ll look at tools that support continuous integration, prevent code duplication, bug detection and style checking amongst other tools. This Jam will include both a theoretical and a practical part. Some of the practices introduced in this session will form the basis to some future code jams.&lt;/p&gt;
&lt;p&gt;So, dust your laptops off and come along. If you don’t have a laptop (or it doesn’t work) then come along anyway, we’ll work in pairs so there should be every opportunity for you to team up with someone. Don’t forget your laptop charger!&lt;/p&gt;
&lt;p&gt;Drinks will be provided.&lt;/p&gt;
&lt;p&gt;When: 7:30pm, Tuesday 29th of July 2008&lt;br&gt;&lt;/br&gt;
Where: ThoughtWorks Hong Kong Office&lt;br&gt;&lt;/br&gt;
Address: Room 1304, 13/F, Tai Tung Building, 8 Fleming Road, Wanchai&lt;br&gt;&lt;/br&gt;
Map: &lt;a href="http://tinyurl.com/3mzf3n" target="_blank"&gt;ThoughtWorks Hong Kong&lt;/a&gt;&lt;br&gt;&lt;/br&gt;
&lt;img src="http://agilehongkong.com/wp-content/uploads/2008/01/contact1.jpg" alt="Contact" height="16" width="233"&gt;&lt;/img&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 23 Jul 2008 15:59:54 +0000</pubDate>
<feedburner:origLink>http://agilehongkong.com/2008/07/23/build-jamming/</feedburner:origLink></item>
<item>
	<title>Jay Fields: Move Mail.app RSS Feeds to NetNewsWire</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-12467669.post-3246594845351473612</guid>
	<link>http://feeds.feedburner.com/~r/PlanetTw/~3/343493823/move-mailapp-rss-feeds-to-netnewswire.html</link>
	<description>Like &lt;a href="http://pragdave.blogs.pragprog.com/pragdave/2008/04/importing-rss-f.html"&gt;Dave Thomas&lt;/a&gt;, I recently decided to give Mail.app a try as an RSS reader. Overall the experience hasn't been great, but it wasn't poor enough that I thought the effort to switch was justified.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;And then I decided to quit my job*. Next week will by my last week with ThoughtWorks and I'll need to turn in my laptop. I tend to store as much as possible online so this type of situation isn't a big deal, but going with Mail.app seems to have been a decision in the wrong direction. Maybe Mail.app stores my RSS feeds online somewhere, but it wasn't immediately obvious to me.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;A quick google search revealed a &lt;a href="http://www.macosxhints.com/article.php?story=20080319094830396"&gt;Mac OSX Hint&lt;/a&gt; on how to dump your RSS feeds to the command line. This was quite helpful, but what I really needed was an &lt;a href="http://en.wikipedia.org/wiki/OPML"&gt;OPML&lt;/a&gt; file that I could send to &lt;a href="http://www.newsgator.com/INDIVIDUALS/NETNEWSWIRE/"&gt;NetNewsWire&lt;/a&gt;.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;I wrote the following script for anyone that finds themselves in the same situation. This script will grab all the feeds and write them to an OPML file. I'm sure it can be cleaned up or done more easily, but this works.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;pre class="textmate-source vibrant_ink"&gt;&lt;span class="source source_ruby"&gt;feeds &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; &lt;span class="string string_interpolated string_interpolated_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;%x[&lt;/span&gt;IFS=$'&lt;span class="constant constant_character constant_character_escape constant_character_escape_ruby"&gt;\n&lt;/span&gt;';for i in $(find ~/Library/Mail/RSS/ -name "Info.plist");do grep "&amp;lt;string&amp;gt;http://" $i | sed "s/.*&lt;span class="constant constant_character constant_character_escape constant_character_escape_ruby"&gt;\(&lt;/span&gt;http&lt;span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_ruby"&gt;[&lt;/span&gt;^&amp;lt;&lt;span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_ruby"&gt;]&lt;/span&gt;*&lt;span class="constant constant_character constant_character_escape constant_character_escape_ruby"&gt;\)&lt;/span&gt;.*/&lt;span class="constant constant_character constant_character_escape constant_character_escape_ruby"&gt;\1&lt;/span&gt;/";done&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;split&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;&lt;span class="constant constant_character constant_character_escape constant_character_escape_ruby"&gt;\n&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;&lt;br&gt;&lt;/br&gt;feeds &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; feeds&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;collect &lt;span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_ruby"&gt;{&lt;/span&gt;&lt;span class="meta meta_syntax meta_syntax_ruby meta_syntax_ruby_start-block"&gt; &lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby"&gt;|&lt;/span&gt;&lt;span class="variable variable_other variable_other_block variable_other_block_ruby"&gt;element&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby"&gt;|&lt;/span&gt; element&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;gsub&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="string string_regexp string_regexp_classic string_regexp_classic_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_ruby"&gt;/&lt;/span&gt;&amp;lt;string&amp;gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_ruby"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;&amp;lt;outline xmlUrl=&lt;span class="constant constant_character constant_character_escape constant_character_escape_ruby"&gt;\"&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt; &lt;span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_ruby"&gt;}&lt;/span&gt;&lt;br&gt;&lt;/br&gt;feeds &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; feeds&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;collect &lt;span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_ruby"&gt;{&lt;/span&gt;&lt;span class="meta meta_syntax meta_syntax_ruby meta_syntax_ruby_start-block"&gt; &lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby"&gt;|&lt;/span&gt;&lt;span class="variable variable_other variable_other_block variable_other_block_ruby"&gt;element&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby"&gt;|&lt;/span&gt; element&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;gsub&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="string string_regexp string_regexp_classic string_regexp_classic_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_ruby"&gt;/&lt;/span&gt;&amp;lt;&lt;span class="constant constant_character constant_character_escape constant_character_escape_ruby"&gt;\/&lt;/span&gt;string&amp;gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_ruby"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;&lt;span class="constant constant_character constant_character_escape constant_character_escape_ruby"&gt;\"&lt;/span&gt;/&amp;gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt; &lt;span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_ruby"&gt;}&lt;/span&gt;&lt;br&gt;&lt;/br&gt;xml &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; &lt;span class="string string_unquoted string_unquoted_heredoc string_unquoted_heredoc_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;&amp;lt;&amp;lt;-eos&lt;/span&gt;&lt;br&gt;&lt;/br&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br&gt;&lt;/br&gt;&amp;lt;opml version="1.1"&amp;gt;&lt;br&gt;&lt;/br&gt;  &amp;lt;head&amp;gt;&lt;br&gt;&lt;/br&gt;    &amp;lt;title&amp;gt;mySubscriptions&amp;lt;/title&amp;gt;&lt;br&gt;&lt;/br&gt;    &amp;lt;/head&amp;gt;&lt;br&gt;&lt;/br&gt;  &amp;lt;body&amp;gt;&lt;br&gt;&lt;/br&gt;&lt;span class="source source_ruby source_ruby_embedded source_ruby_embedded_source"&gt;&lt;span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby"&gt;#{&lt;/span&gt;feeds&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;join&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;&lt;span class="constant constant_character constant_character_escape constant_character_escape_ruby"&gt;\n&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/br&gt;  &amp;lt;/body&amp;gt;&lt;br&gt;&lt;/br&gt;&amp;lt;/opml&amp;gt;&lt;br&gt;&lt;/br&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;eos&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/br&gt;&lt;span class="support support_class support_class_ruby"&gt;File&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;open&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;mail_app_export.ompl&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;w&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt; &lt;span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_ruby"&gt;{&lt;/span&gt;&lt;span class="meta meta_syntax meta_syntax_ruby meta_syntax_ruby_start-block"&gt; &lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby"&gt;|&lt;/span&gt;&lt;span class="variable variable_other variable_other_block variable_other_block_ruby"&gt;file&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby"&gt;|&lt;/span&gt; file &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_augmented keyword_operator_assignment_augmented_ruby"&gt;&amp;lt;&amp;lt;&lt;/span&gt; xml &lt;span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_ruby"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br&gt;&lt;/br&gt;note: This file works in NetNewsWire, but I had better success by logging on to newsgator.com and importing on their website. When you import on their website it pulls the feed names and other information. The NetNewsWire didn't seem to pull the additional information.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;*For those interested, I'm joining &lt;a href="http://drwtrading.com"&gt;DRW Trading&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;br&gt;&lt;/br&gt;&lt;a href="http://www.jayfields.com"&gt;© Jay Fields - www.jayfields.com&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/jayfields/mjKQ?a=8hSKsO"&gt;&lt;img src="http://feeds.feedburner.com/~a/jayfields/mjKQ?i=8hSKsO" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/jayfields/mjKQ?a=EDXIuJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/jayfields/mjKQ?i=EDXIuJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jayfields/mjKQ?a=gAezsj"&gt;&lt;img src="http://feeds.feedburner.com/~f/jayfields/mjKQ?i=gAezsj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jayfields/mjKQ?a=1o8jEJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/jayfields/mjKQ?i=1o8jEJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jayfields/mjKQ?a=lHDdTj"&gt;&lt;img src="http://feeds.feedburner.com/~f/jayfields/mjKQ?i=lHDdTj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jayfields/mjKQ?a=vuAbQj"&gt;&lt;img src="http://feeds.feedburner.com/~f/jayfields/mjKQ?i=vuAbQj" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jayfields/mjKQ/~4/343471674" height="1" width="1"&gt;&lt;/img&gt;</description>
	<pubDate>Wed, 23 Jul 2008 11:30:00 +0000</pubDate>
	<author>noreply@blogger.com (Jay Fields)</author>
<feedburner:origLink>http://feeds.feedburner.com/~r/jayfields/mjKQ/~3/343471674/move-mailapp-rss-feeds-to-netnewswire.html</feedburner:origLink></item>
<item>
	<title>Chris Leishman: Defining Throughput</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-3876908565466121476.post-2451366864397053073</guid>
	<link>http://feeds.feedburner.com/~r/PlanetTw/~3/343450477/defining-throughput.html</link>
	<description>In this second part to my series on &lt;a href="http://chrisleishman.com/2008/07/throughput-accounting.html"&gt;Throughput Accounting&lt;/a&gt;, I'm going to explore the concept of &lt;i&gt;Throughput&lt;/i&gt;, starting with a definition.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Every system has a &lt;i&gt;&lt;a href="http://en.wikipedia.org/wiki/Goal"&gt;goal&lt;/a&gt;&lt;/i&gt; it is trying to achieve.  For most business processes this goal is revenue - money given to the organisation by customers due to sales of product or services.  Given this, 'Throughput' is simply defined as a measure of &lt;i&gt;the rate at which a system is achieving its goal&lt;/i&gt;.  It is &lt;i&gt;not&lt;/i&gt; a measure of profit or any indicator of efficiency, it is just a measure of flow.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Throughput is often expressed in terms of 'goal units'.  In for-profit organisations, these units may be dollars of revenue.  For non-profit organisations it may be expressed by another measure, such as patients successfully treated in a hospital emergency ward.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;When dealing with monetary goal units, Throughput (T) is often measured as gross revenue from sale of a product (S) minus totally variable costs (TVC), which are only the costs that vary directly with the system output.  In a manufacturing setting, TVC is often just the cost of raw materials.  Thus &lt;i&gt;T = S - TVC&lt;/i&gt;.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;In the example from my &lt;a href="http://chrisleishman.com/2008/07/throughput-accounting.html"&gt;last post&lt;/a&gt;, a company was producing 800 widgets per month.  Their TVC, for materials, was $40 per widget.  If those widgets were being sold at $50, the throughput per widget would be $10 and the system throughput is $8000 per month, or around $0.18 per minute.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;In calculation, this is identical to the cost accounting metric '&lt;a href="http://en.wikipedia.org/wiki/Contribution_margin"&gt;contribution margin&lt;/a&gt;'.  The contribution margin is used to determine the  fraction of sales that contributes to offsetting fixed costs and can be used to disambiguate some decisions, such as the purchase price example from my &lt;a href="http://chrisleishman.com/2008/07/throughput-accounting.html"&gt;previous post&lt;/a&gt;.  As Throughput Accounting manages fixed costs separately, it is not required for this purpose - but has a much broader role.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;It is important to note that Throughput is measured only as the ultimate achievement of a system, for example it may be the final sale of a product or service.  It is &lt;i&gt;not&lt;/i&gt; measured in terms of production of assets that will then be processed further to achieve the ultimate goal (eg. assets sold to achieve revenue).  This is inventory - which I will discuss in a later post.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;A good question is how to define Throughput in the context of a software delivery engagement.  Ultimately the software system supports a business process which is in turn producing revenue - so it could be defined in terms of dollars made by the business.  Pragmatically, however, it is more useful to define Throughput as the rate at which software additions and/or modifications are delivered into an environment where they can be utilised by the business process.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;It is tempting to measure this rate in terms of  '&lt;a href="http://chrisleishman.com/2008/04/deliver-business-benefit-not-value.html"&gt;business benefit&lt;/a&gt;' (possibly also in dollars), which is the ultimate goal unit of the entire business process.  This is an important thing to focus on as often the best improvements can involve organisational changes as well as software changes.  However, when the software production process is the organisation's constraint (as it often is) then we are focussed on just this process alone.  In which case we need to use a 'goal unit' that is reflective of the amount of the work done to produce some change in software.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;In Agile software delivery methodologies there is the concept of '&lt;a href="http://agilefaq.net/2007/11/13/what-is-a-story-point/"&gt;story point&lt;/a&gt;', which is simply a relative measure of the effort required to deliver a particular requirement.  Given its relative nature, we can measure it over an arbitrary time period to determine the rate of delivery of story points, which we can use as Throughput.  This is effectively the same as the Agile term '&lt;a href="http://agilefaq.net/2007/11/03/what-is-velocity-in-a-scrum-team/"&gt;velocity&lt;/a&gt;' and this comparison is useful for applying some TA concepts to software delivery. I'll return to this point in future posts...&lt;img src="http://feeds.chrisleishman.com/~r/ExposingTheInnerDialogue/~4/343440819" height="1" width="1"&gt;&lt;/img&gt;</description>
	<pubDate>Wed, 23 Jul 2008 11:22:08 +0000</pubDate>
	<author>noreply@blogger.com (Chris Leishman)</author>
<feedburner:origLink>http://feeds.chrisleishman.com/~r/ExposingTheInnerDialogue/~3/343440819/defining-throughput.html</feedburner:origLink></item>
<item>
	<title>Ram - Sriram Narayanan: The Reply-To Header</title>
	<guid isPermaLink="false">urn:lj:livejournal.com:atom1:dynamicproxy:45403</guid>
	<link>http://feeds.feedburner.com/~r/PlanetTw/~3/342869859/45403.html</link>
	<description>If you receive a mail on the Belenix-discuss list and you hit reply, your reply goes to the author of that mail. I never did like this because I thought it didn't help build up content and knowledge on the list, and that this didn't show traffic on the list either.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Then I was pointed to the following URL, which reasons why the default behaviour should be "Sent to author", and why Reply-TO mungling actually gets in the way.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;a href="http://www.unicom.com/pw/reply-to-harmful.html"&gt;http://www.unicom.com/pw/reply-to-harmful.html&lt;/a&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;I quite agree with most of the reasoning - enough that I am convinced and am starting to train myself to hit Reply to All.</description>
	<pubDate>Tue, 22 Jul 2008 19:41:27 +0000</pubDate>
<feedburner:origLink>http://dynamicproxy.livejournal.com/45403.html</feedburner:origLink></item>
<item>
	<title>Carlos Villela: Git Iterator</title>
	<guid isPermaLink="false">http://www.lixo.org/archives/2008/07/22/git-histogram/</guid>
	<link>http://feeds.feedburner.com/~r/PlanetTw/~3/342915828/</link>
	<description>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt;
 &lt;a href="http://www.flickr.com/photos/jesus-h-shatner/1489971035/" title="photo sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1173/1489971035_9d6c0a399d_m.jpg" alt="" style="border: solid 2px #000000;"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;I wanted to generate some visualizations of our project’s growth, so I decided to put together a little shell script that looked at the output from &lt;code&gt;git log&lt;/code&gt; to spit out some metrics.&lt;/p&gt;
&lt;p&gt;So &lt;code&gt;git-iterate&lt;/code&gt; was born: run anything through your entire project’s history, and get the results in something easily converted into a beautiful chart!&lt;/p&gt;
&lt;p&gt;It does that by running &lt;code&gt;git-reset --hard $COMMIT&lt;/code&gt; for every commit in the repository, and then calling the script given to it as the first argument. It passes the commit ID to the script too, so this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
git-iterate echo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;…will generate a list of all your commit IDs, most recent last.&lt;/p&gt;
&lt;p&gt;The code is &lt;a href="http://github.com/cv/git-utils"&gt;on GitHub&lt;/a&gt;, as usual. I’m running a few stats on some projects I have access to, and will upload a few charts as soon as they’re ready. Meanwhile, feel free to send me the output of this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
git-iterate 'echo `flog app` `flog spec`' # if needed, replace "spec" for "test"
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;…and I’ll chart those for comparison as well. Also, it shouldn’t be difficult to port git-iterate to other source control systems (all of them have a checkout command, right?) and, if you do that, make sure to plug it in the comments.&lt;/p&gt;
&lt;p&gt;Have fun! &lt;img src="http://www.lixo.org/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley"&gt;&lt;/img&gt;&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;
&lt;strong&gt;Update:&lt;/strong&gt; fresh off the oven, here’s &lt;a href="http://spreadsheets.google.com/pub?key=pZ_qxWU0Fx8l2aH906srLJQ&amp;amp;oid=2&amp;amp;output=image"&gt;Rails’ total lines of code&lt;/a&gt;. Neat, huh?&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;&lt;/p&gt;</description>
	<pubDate>Tue, 22 Jul 2008 18:11:09 +0000</pubDate>
<feedburner:origLink>http://www.lixo.org/archives/2008/07/22/git-iterator/</feedburner:origLink></item>
<item>
	<title>Chris Leishman: Throughput Accounting</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-3876908565466121476.post-7455384431946038058</guid>
	<link>http://feeds.feedburner.com/~r/PlanetTw/~3/338351724/throughput-accounting.html</link>
	<description>Let me declare today that I have a new enemy - &lt;a href="http://en.wikipedia.org/wiki/Cost_accounting"&gt;Cost Accounting&lt;/a&gt;.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;In 1981, at a conference of Management Accountants, Eliyahu Goldratt declared Cost Accounting to be "Enemy #1 of Productivity".  In my work as a consultant for &lt;a href="http://www.thoughtworks.com/"&gt;ThoughtWorks&lt;/a&gt;, I value productivity highly.  Hence the enemy of my friend is also my enemy.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Goldratt, author of the popular business novel "&lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;amp;location=http%3A%2F%2Fwww.amazon.com%2FGoal-Process-Ongoing-Improvement%2Fdp%2F0884271781&amp;amp;tag=expotheinnedi-20&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=9325"&gt;The Goal&lt;/a&gt;", showed how traditional cost accounting easily and trivially leads intelligent managers and other decision makers to make bad decisions - decisions that have massive negative effects on performance and profitability.  This was actually not surprising news, as the problems with cost accounting had been recognised. But Goldratt also proposed an alternative.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;His alternative was titled "&lt;a href="http://en.wikipedia.org/wiki/Throughput_accounting"&gt;Throughput Accounting&lt;/a&gt;", and was described in the 1998 &lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;amp;location=http%3A%2F%2Famazon.com%2FThroughput-Accounting-Thomas-Corbett%2Fdp%2F0884271587&amp;amp;tag=expotheinnedi-20&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=9325"&gt;book by Thomas Corbett&lt;/a&gt;.  It is an accounting model which does not focus primarily on local cost optimisation and instead focuses primarily on overall system throughput.  Importantly, it does not attempt to allocate overhead costs across products and services.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Why is this important?  Cost accounting attempts to allocate a companies fixed costs over a given time period to the products or services produced in that period.  It enables managers to ignore the fixed costs and focus instead on the results of each period in relation to the products produced.  This made sense in the 1890s, when cost accounting was developed, as most companies had extremely low fixed costs.  The majority of costs were labour, which at the time was fully variable, as workers were only paid for the hours they laboured at the demand of the employer.  Although there was distortion due to the overhead allocation, it was extremely small.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Modern businesses, however, have a much lower proportion of fully variable costs.  Most costs are fixed, especially labour as now most employees work fixed hours regardless of demand.  Due to this environmental change, the distortion caused by cost allocation is much larger and can cause management decisions, based on cost accounting, that directly result in large loses of productivity and profit.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;As an example, imagine a company has fixed overheads of $10,000 (plant and labour) per month and currently produces 800 widgets with a materials cost of $40.  The unit cost per widget would be $52.50 ($40 + $10,000/800).  If an order now came for an additional 500 widgets at a price of $50, then management based on cost accounting should reject the order as it would result in a loss of $2.50 per widget.  However, as the majority of costs are fixed, the increase in production would actually result in a new unit cost of $47.69 ($40 + $10,000/1300), so profits would actually increase by $1,153.85.  This might seem clear, but imagine this example with many different products and prices in the mix and quickly it becomes hard to see the mistake.  This is &lt;i&gt;only one&lt;/i&gt; example of a poor decision made due to a cost accounting metric.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;So why am I so concerned?  In the software industry, especially, there is very little variable costs.  The overwhelming expense is for developers, which are typically in short supply, so they are not a variable cost.  Basing our decisions around software projects and the ROI from software delivery on cost accounting can lead to incredibly poor outcomes.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;In future blog posts, I'll also explore what I believe is another critically important aspect of Throughput Accounting - the focus on throughput and inventory reduction over costs.  I believe this has the potential for a massive effect on the software delivery process, especially when combined with the Lean practices that &lt;a href="http://www.thoughtworks.com/"&gt;ThoughtWorks&lt;/a&gt; &lt;a href="http://www.financialexpress.com/news/Lean-can-mean-more-business-for-IT-services-firms-Singham/189413/"&gt;is&lt;/a&gt; &lt;a href="http://www.thoughtworks.com/what-we-say/events/tech-briefing_us.html"&gt;pursuing&lt;/a&gt; in the industry.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Believe me when I say this - &lt;span style="font-style: italic;"&gt;Throughput Accounting will become of major importance in our industry&lt;/span&gt;.  It will make a dramatic change to the way we finance software projects and it has the power to put real numbers around why we use &lt;a href="http://en.wikipedia.org/wiki/Agile_software_development"&gt;Agile&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Lean_software_development"&gt;Lean&lt;/a&gt; principles and practices (as shown in David Andersons book "&lt;a href="http://www.amazon.com/Agile-Management-Software-Engineering-Constraints/dp/0131424602"&gt;Agile Management for Software Engineering&lt;/a&gt;").&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;If your interested in another good introductory text, in addition to &lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;amp;location=http%3A%2F%2Famazon.com%2FThroughput-Accounting-Thomas-Corbett%2Fdp%2F0884271587&amp;amp;tag=expotheinnedi-20&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=9325"&gt;Corbetts book&lt;/a&gt;, try the &lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;amp;location=http%3A%2F%2Fwww.amazon.com%2FThroughput-Accounting-Guide-Constraint-Management%2Fdp%2F0471251097&amp;amp;tag=expotheinnedi-20&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=9325"&gt;book by Steven Bratt&lt;/a&gt;, also titled "Throughput Accounting".&lt;img src="http://feeds.chrisleishman.com/~r/ExposingTheInnerDialogue/~4/338321236" height="1" width="1"&gt;&lt;/img&gt;</description>
	<pubDate>Tue, 22 Jul 2008 16:48:26 +0000</pubDate>
	<author>noreply@blogger.com (Chris Leishman)</author>
<feedburner:origLink>http://feeds.chrisleishman.com/~r/ExposingTheInnerDialogue/~3/338321236/throughput-accounting.html</feedburner:origLink></item>
<item>
	<title>Marc McNeill: The scourge of Document Driven Design</title>
	<guid isPermaLink="false">http://www.dancingmango.com/blog/2008/07/22/the-scourge-of-document-driven-design/</guid>
	<link>http://feeds.feedburner.com/~r/PlanetTw/~3/342675401/</link>
	<description>&lt;p&gt;Documents, or rather words are the scourge of product design.  Because words can never convey the true meaning or emotion of what is really required.  All to often, software development projects are driven by the documentation - agile projects can be equally guilty of this- driven by words on paper (or card) that convey what the requirement is.  &lt;em&gt;Issue #1. Developers don’t read!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Except for a few exceptions, software is all about a user interacting with a system in order to accomplish a goal.  Trying to describe that premise in terms of features and functionality is fundamentally flawed as it will be nested in the language of technical implementation, not in the user interaction.  “Find” becomes “search”, “buy” becomes “shopping cart”, “check” becomes “validation” and so on.  &lt;em&gt;Issue #2. The desired outcomes become lost in a smog of technical jargon.    &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Solution: Picture Driven Design.  &lt;/em&gt;Up front.  Yeah!  I’m all for up front design!  A picture tells a thousand words.  It has the power to remove ambiguities, clarify the vision, showing what the journey to realise outcomes look like.  Start with a day in the life of…  scribble out the flow, the user journey.  Nothing complicated, boxes and arrows.  Then scribble out what the user interface might look like.  Done.  That’s your up front design.  That’s your documentation.  That’s your scope.  What you do next is up to you, write loads of documents that describe it and produce the software in a waterfall way if you want.  I’d prefer you were more lean and adopted agile practices, but whatever you do, start with the picture.  I’m convinced it will save much pain later on.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Dancingmango?a=QxYCiJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/Dancingmango?i=QxYCiJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Dancingmango?a=fU3ZYj"&gt;&lt;img src="http://feeds.feedburner.com/~f/Dancingmango?i=fU3ZYj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Dancingmango?a=xrZbJJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/Dancingmango?i=xrZbJJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Dancingmango?a=KF8Xej"&gt;&lt;img src="http://feeds.feedburner.com/~f/Dancingmango?i=KF8Xej" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Dancingmango?a=mgZ73j"&gt;&lt;img src="http://feeds.feedburner.com/~f/Dancingmango?i=mgZ73j" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Tue, 22 Jul 2008 15:18:52 +0000</pubDate>
<feedburner:origLink>http://feeds.feedburner.com/~r/Dancingmango/~3/342635482/</feedburner:origLink></item>
<item>
	<title>Jay Fields: ActionScript: Literal XML</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-12467669.post-8124876326427070556</guid>
	<link>http://feeds.feedburner.com/~r/PlanetTw/~3/342582280/actionscript-literal-xml.html</link>
	<description>One feature of ActionScript I really like is the ability to use XML within the language. In ActionScript there's no need to use strings to represent XML, you can use XML inline just as you would any other literal (numbers, strings, etc).&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Recently I was working on some dynamic code that needed to update based on an XML response. We were just getting started on the card, so instead of worrying about the service, how it was triggered, etc, we added a button to the interface that called the response parsing method and passed in an XML literal as an argument. The code is similar to what's shown below.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;pre class="textmate-source vibrant_ink"&gt;&lt;span class="source source_actionscript"&gt;parseResponse(&amp;lt;user&amp;gt;&amp;lt;firstName&amp;gt;Jay&amp;lt;&lt;span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript"&gt;/&lt;/span&gt;firstName&amp;gt;&amp;lt;&lt;span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript"&gt;/&lt;/span&gt;user&amp;gt;);&lt;/span&gt;&lt;/pre&gt;&lt;br&gt;&lt;/br&gt;Sure, we had to change the code later and make a real service call, but this quick solution let us keep focusing on the task at hand instead of how to get the XML. In a language like Ruby we could have used a builder or just a string, and given such a small amount of XML it would have been fine. However, the actual XML we were working with was significantly larger than the example and would have been a decent mess of a multiline string or several builder calls. Being able to write XML natively was significantly easier.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;The beauty of literal XML is the simplicity. I don't have to represent it in any way other than what it actually is -- XML.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;If you aren't a fan of all the angle brackets, that's okay, ActionScript has you covered there also. You can add elements and attributes as you would expect to be able to if you prefer method calls.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;pre class="textmate-source vibrant_ink"&gt;&lt;span class="source source_actionscript"&gt;&lt;span class="keyword keyword_control keyword_control_actionscript"&gt;var&lt;/span&gt; &lt;span class="support support_function support_function_actionscript"&gt;request&lt;/span&gt;&lt;span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript"&gt;:&lt;/span&gt;&lt;span class="support support_class support_class_actionscript"&gt;XML&lt;/span&gt; &lt;span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript"&gt;=&lt;/span&gt; &amp;lt;smart_list&lt;span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript"&gt;/&lt;/span&gt;&amp;gt;;&lt;br&gt;&lt;/br&gt;&lt;span class="support support_function support_function_actionscript"&gt;request&lt;/span&gt;.&lt;span class="support support_function support_function_actionscript"&gt;sort&lt;/span&gt;.order &lt;span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript"&gt;=&lt;/span&gt; &lt;span class="string string_quoted string_quoted_double string_quoted_double_actionscript"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_actionscript"&gt;"&lt;/span&gt;highest&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_actionscript"&gt;"&lt;/span&gt;&lt;/span&gt;;&lt;br&gt;&lt;/br&gt;&lt;span class="support support_function support_function_actionscript"&gt;request&lt;/span&gt;.&lt;span class="support support_function support_function_actionscript"&gt;sort&lt;/span&gt;.field &lt;span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript"&gt;=&lt;/span&gt; &lt;span class="string string_quoted string_quoted_double string_quoted_double_actionscript"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_actionscript"&gt;"&lt;/span&gt;Average Position&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_actionscript"&gt;"&lt;/span&gt;&lt;/span&gt;;&lt;br&gt;&lt;/br&gt;&lt;span class="support support_function support_function_actionscript"&gt;request&lt;/span&gt;.max_results &lt;span class="keyword keyword_operator keyword_operator_symbolic keyword_operator_symbolic_actionscript"&gt;=&lt;/span&gt; &lt;span class="constant constant_numeric constant_numeric_actionscript"&gt;10&lt;/span&gt;;&lt;br&gt;&lt;/br&gt;&lt;span class="support support_function support_function_actionscript"&gt;request&lt;/span&gt;.toXMLString(); &lt;span class="comment comment_line comment_line_double-slash comment_line_double-slash_actionscript"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_actionscript"&gt;//&lt;/span&gt; "&amp;lt;smart_list&amp;gt;&amp;lt;sort&amp;gt;&amp;lt;order&amp;gt;highest&amp;lt;/order&amp;gt;&amp;lt;field&amp;gt;Average Position&amp;lt;/field&amp;gt;&amp;lt;/sort&amp;gt;&amp;lt;max_results&amp;gt;10&amp;lt;/max_results&amp;gt;&amp;lt;/smart_list&amp;gt;"&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br&gt;&lt;/br&gt;If you only ever use XML similar to the above syntax, then there may be little value in literal XML, but I don't think you're usage would be limited to the above syntax.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;I write tests, a lot of them. I prefer to see the actual XML in my tests, instead of the builder versions of XML. I don't like angle brackets any more than the next programmer, but I strongly prefer testing with &lt;a href="http://blog.jayfields.com/2008/02/testing-expect-literals.html"&gt;expected literals&lt;/a&gt;. I find my resulting tests to be more readable and reliable. If you've ever had a test fail because of whitespace issues in your XML, you should know what I mean by reliable.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Literal XML also ensures XML compliance at compile time and encourages IDEs to provide syntax highlighting. Two things that aren't essential, but are definitely nice to have.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;ActionScript is the first language I've used with literal XML support, and I'm very happy with the experience. As programmers we spend a lot of time hiding other languages with object relational mappers (orm) and builders, but literal XML is a refreshing step in the other direction. The creators of ActionScript have embraced the fact that XML isn't going anywhere. They built first class support for XML in the language itself instead of hiding the problem with a framework, and that helps me significantly more than any orm or builder ever has.&lt;div class="blogger-post-footer"&gt;&lt;br&gt;&lt;/br&gt;&lt;a href="http://www.jayfields.com"&gt;© Jay Fields - www.jayfields.com&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/jayfields/mjKQ?a=5dbdel"&gt;&lt;img src="http://feeds.feedburner.com/~a/jayfields/mjKQ?i=5dbdel" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/jayfields/mjKQ?a=OOvVtJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/jayfields/mjKQ?i=OOvVtJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jayfields/mjKQ?a=7xIMej"&gt;&lt;img src="http://feeds.feedburner.com/~f/jayfields/mjKQ?i=7xIMej" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jayfields/mjKQ?a=B5QsYJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/jayfields/mjKQ?i=B5QsYJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jayfields/mjKQ?a=wzkEBj"&gt;&lt;img src="http://feeds.feedburner.com/~f/jayfields/mjKQ?i=wzkEBj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jayfields/mjKQ?a=r0mTxj"&gt;&lt;img src="http://feeds.feedburner.com/~f/jayfields/mjKQ?i=r0mTxj" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jayfields/mjKQ/~4/342551675" height="1" width="1"&gt;&lt;/img&gt;</description>
	<pubDate>Tue, 22 Jul 2008 12:00:00 +0000</pubDate>
	<author>noreply@blogger.com (Jay Fields)</author>
<feedburner:origLink>http://feeds.feedburner.com/~r/jayfields/mjKQ/~3/342551675/actionscript-literal-xml.html</feedburner:origLink></item>
<item>
	<title>Ian Cartwright: Marketing Driven Development</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-35609063.post-3401343436371676031</guid>
	<link>http://feeds.feedburner.com/~r/PlanetTw/~3/341806141/marketing-driven-development.html</link>
	<description>Marketing Driven Development is a process where the features and priorities for a new release of software are driven primarily by a marketing department. So a feature is valued more for the ability to create a marketing campaign around it over any usefulness or value that it may have for an end user.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Marketing Driven Development is primarily a reaction to the fear of &lt;a href="http://en.wikipedia.org/wiki/Commoditization"&gt;commoditization&lt;/a&gt;.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;It's consequences often include&lt;br&gt;&lt;/br&gt;&lt;ul&gt;&lt;li&gt;Well known bugs (or to use the correct term: sub-optimal feature) remain for many versions as fixing them is never a priority&lt;/li&gt;&lt;li&gt;Usability does not improve as this is rarely seen as valuable by marketing and anyway it was sold as easy to use the first time around&lt;br&gt;&lt;/br&gt;&lt;/li&gt;&lt;li&gt;It tends to be expensive to buy, maintain and customize i.e. marketing driven development does seem to allow the avoidance of &lt;i style="font-style: italic;"&gt;commoditization&lt;/i&gt;&lt;span style="font-style: italic;"&gt;.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;</description>
	<pubDate>Tue, 22 Jul 2008 11:25:47 +0000</pubDate>
	<author>noreply@blogger.com (Ian Cartwright)</author>
<feedburner:origLink>http://iancartwright.com/blog/2008/07/marketing-driven-development.html</feedburner:origLink></item>
<item>
	<title>Jon Pither: Flow, Pair Programming and Emotional Intelligence</title>
	<guid isPermaLink="false">http://www.pitheringabout.com/?p=266</guid>
	<link>http://feeds.feedburner.com/~r/PlanetTw/~3/342339894/</link>
	<description>&lt;p&gt;I was involved in an interesting chat with some colleagues about the apparent incompatibilities between pair programming and being in the ‘zone’; a Zen like state where everything just clicks and one is able to perform seamlessly to their optimum ability given the present moment. From a developer viewpoint our egos become almost on autopilot as our hands reach out and tap away at the keyboard, the mind harmoniously serving up a variety of designs and strategies that may help us solve the problem at hand. We effortlessly approach excellence.&lt;/p&gt;
&lt;p&gt;Psychologists refer to zone as ‘flow’. Daniel Coleman - author of &lt;a href="http://www.amazon.com/Emotional-Intelligence-Matter-More-Than/dp/0553375067"&gt;Emotional Intelligence&lt;/a&gt; - describes flow as being “emotional intelligence at its best… the ultimate in harnessing the emotions in the service of performance and learning”. Emotions generate a plethora of thoughts for us, including distracting worries and concerns. Therefore having our emotions working for us enables us to be more focussed and to think more clearly and objectively about a specific problem.&lt;/p&gt;
&lt;p&gt;Pair programming is a not stress free activity. Though it has been proven to raise productivity it does require more focus on the part of the developer - asking much more of them than were they coding solo. Being in a “pair” you are constantly required to explain your intricate thought processes to another person. You are challenged, and you have a responsibility to ensure that the person you are pairing with gets up to speed with the material at hand and that you are providing them with a progressive learning experience.&lt;/p&gt;
&lt;p&gt;We need to appreciate that developers are humans, and sadly are not perfect coding punching-out machines. Pair-programming introduces an emotional burden on the developer. Thoughts such as how the other person in the pair is coping and performing are one of many, along with speculation as to what the other person is thinking… Are they frustrated that I can’t keep up? Are they worried I’m going too fast? Or worse still do they feel guilty for slowing me down? - a common concern as developers strive to be productive. In order to deal with these worries a whole new - totally justifiable - plateau of thinking opens up. The brain switches over from analysing the current software problem to instead work on strategies for making the pair more effective: ‘they have a need to see this area of the code-base as it will help them to contextualise the problem better… I want to get some “quick wins” to build our momentum as a pair, therefore it makes sense to pick off this little bit of low hanging fruit…’&lt;/p&gt;
&lt;p&gt;I believe that whilst pair-programming has the capacity to inhibit flow, the emotional intelligence within us is the tool to help minimize the impact distractions have allowing us to closer reach a level of excellence on an individual level. EQ is essentially about being aware of our emotions and the impact they have on us - to realise when we’re worried, or when our frustrations are mounting. A higher EQ will not only help us to better meet our own needs, but it will give us more empathy and understanding to better meet the needs of the person we’re working with - to help us create a more effective “pair”. EQ is essentially about being aware, and the best thing about it is that unlike IQ it can be learned.&lt;/p&gt;
&lt;p&gt;Lastly, I want to refer to the premise that “&lt;a href="http://time-blog.com/work_in_progress/2007/08/stress_makes_you_stupid.html"&gt;stress makes you stupid&lt;/a&gt;“. We underperform when our emotions run unchecked. I’ve seen first hand developers resigning from jobs they sought hard for because pair programming has been too much of a difficult experience. If we can improve our awareness of the distractions and difficulties pairing introduces - and in doing so our EQ - then we’ll likely make it easier for ourselves and the person we’re pairing with.
&lt;/p&gt;</description>
	<pubDate>Tue, 22 Jul 2008 08:03:32 +0000</pubDate>
<feedburner:origLink>http://www.pitheringabout.com/?p=266</feedburner:origLink></item>
<item>
	<title>ThoughtWorks Studios: CruiseControl Enterprise: 10 Best Practices</title>
	<guid isPermaLink="false">tag:studios.thoughtworks.com,2007-08-15:668</guid>
	<link>http://feeds.feedburner.com/~r/PlanetTw/~3/342307994/cruisecontrol-enterprise-best-practises</link>
	<description>I'm an Infrastructure Specialist at ThoughtWorks.  In my role I
make sure that we are building our software so it can successfully be
deployed to production.  In this series of blog posts I hope to
pass on my top ten tips for using CruiseControl Enterprise
effectively.  I'm writing these with the developers or systems
administrators in mind: the people who most often manage
CruiseControl.  However, I hope that anybody who is interested in
Continuous Integration will get something from these articles.&lt;br&gt;&lt;/br&gt;

&lt;br&gt;&lt;/br&gt;
&lt;b&gt;# 1: Publish with a Publisher&lt;/b&gt;&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;
Many projects use the concept of publishing: placing built artifacts
into a repository, or making test results available to end users. 
The ArtifactsPublisher is a very popular way to publish to
CruiseControl's own repository of timestamped directories, making logs
and archives available via the CruiseControl dashboard or legacy
reporting application. But ArtifactsPublisher is just one of a family
of Publishers, my favourite being the AntPublisher. If your Ant build
finishes by publishing artifacts to a repository or tagging your
version control system, there may be another way to do things. 
Consider the Ant example below:&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;
&amp;lt;font color='#6666cc'&amp;gt;&amp;lt;project&amp;gt;&lt;br&gt;&lt;/br&gt;
    &amp;lt;target name="&amp;lt;font color='#009900'&amp;gt;dist&amp;lt;/font&amp;gt;" description="&amp;lt;font color='#009900'&amp;gt;build everything&amp;lt;/font&amp;gt;"&amp;gt;&lt;br&gt;&lt;/br&gt;

    &amp;lt;/target&amp;gt;&lt;br&gt;&lt;/br&gt;
    &amp;lt;target name="&amp;lt;font color='#009900'&amp;gt;clean&amp;lt;/font&amp;gt;" description="&amp;lt;font color='#009900'&amp;gt;delete all build artifacts&amp;lt;/font&amp;gt;"&amp;gt;&lt;br&gt;&lt;/br&gt;
    &amp;lt;/target&amp;gt;&lt;br&gt;&lt;/br&gt;
    &amp;lt;target name="&amp;lt;font color='#009900'&amp;gt;test&amp;lt;/font&amp;gt;" description="&amp;lt;font color='#009900'&amp;gt;run unit tests&amp;lt;/font&amp;gt;"&amp;gt;&lt;br&gt;&lt;/br&gt;

    &amp;lt;/target&amp;gt;&lt;br&gt;&lt;/br&gt;
    &amp;lt;target name="&amp;lt;font color='#009900'&amp;gt;publish&amp;lt;/font&amp;gt;" description="&amp;lt;font color='#009900'&amp;gt;publish to repository&amp;lt;/font&amp;gt;"&amp;gt;&lt;br&gt;&lt;/br&gt;
    &amp;lt;/target&amp;gt;&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;
    &amp;lt;target name="&amp;lt;font color='#009900'&amp;gt;cruise&amp;lt;/font&amp;gt;" depends="&amp;lt;font color='#009900'&amp;gt;clean,dist,test,publish&amp;lt;/font&amp;gt;"/&amp;gt;       &lt;br&gt;&lt;/br&gt;

&amp;lt;/project&amp;gt;&amp;lt;/font&amp;gt;&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;
The end state of the build is to publish unit-tested artifacts to an
unspecified repository of some kind via the publish target.  This
is well and good, but the concept of publishing doesn't really fit the
developer build; if we can disconnect the publishing activity from the
rest of the build, we can run the same build in CruiseControl as the
developers.  To do this, have CruiseControl invoke your developer
build, leaving publishing as a separate Ant target:&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;
&amp;lt;font color='#6666cc'&amp;gt;&amp;lt;project&amp;gt;&lt;br&gt;&lt;/br&gt;
    &amp;lt;target name="&amp;lt;font color='#009900'&amp;gt;dist&amp;lt;/font&amp;gt;" description="&amp;lt;font color='#009900'&amp;gt;build everything&amp;lt;/font&amp;gt;"&amp;gt;&lt;br&gt;&lt;/br&gt;

    &amp;lt;/target&amp;gt;&lt;br&gt;&lt;/br&gt;
    &amp;lt;target name="&amp;lt;font color='#009900'&amp;gt;clean&amp;lt;/font&amp;gt;" description="&amp;lt;font color='#009900'&amp;gt;delete all build artifacts&amp;lt;/font&amp;gt;"&amp;gt;&lt;br&gt;&lt;/br&gt;
    &amp;lt;/target&amp;gt;&lt;br&gt;&lt;/br&gt;
    &amp;lt;target name="&amp;lt;font color='#009900'&amp;gt;test&amp;lt;/font&amp;gt;" description="&amp;lt;font color='#009900'&amp;gt;run unit tests&amp;lt;/font&amp;gt;"&amp;gt;&lt;br&gt;&lt;/br&gt;

    &amp;lt;/target&amp;gt;&lt;br&gt;&lt;/br&gt;
    &amp;lt;target name="&amp;lt;font color='#009900'&amp;gt;publish&amp;lt;/font&amp;gt;" description="&amp;lt;font color='#009900'&amp;gt;publish to repository&amp;lt;/font&amp;gt;" if="&amp;lt;font color='#009900'&amp;gt;logfile&amp;lt;/font&amp;gt;"&amp;gt;&lt;br&gt;&lt;/br&gt;
    &amp;lt;/target&amp;gt;&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;
    &amp;lt;target name="&amp;lt;font color='#009900'&amp;gt;dev&amp;lt;/font&amp;gt;" depends="&amp;lt;font color='#009900'&amp;gt;clean,dist,test&amp;lt;/font&amp;gt;"/&amp;gt;&lt;br&gt;&lt;/br&gt;

       &lt;br&gt;&lt;/br&gt;
&amp;lt;/project&amp;gt;&amp;lt;/font&amp;gt;&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;
The 'if' attribute on the 'publish' target ensures that the target can
only ever be run by a publisher or a determined person.  Next, you
need to make some changes to your CruiseControl configuration:&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;
&amp;lt;font color='#660000'&amp;gt;&amp;lt;!-- some config removed from this example --&amp;gt;&amp;lt;/font&amp;gt;&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;
&amp;lt;font color='#6666cc'&amp;gt;        &amp;lt;schedule interval="&amp;lt;font color='#009900'&amp;gt;60&amp;lt;/font&amp;gt;"&amp;gt;&lt;br&gt;&lt;/br&gt;

            &amp;lt;ant antWorkingDir="&amp;lt;font color='#009900'&amp;gt;${checkout.dir}&amp;lt;/font&amp;gt;" buildfile="&amp;lt;font color='#009900'&amp;gt;build.xml&amp;lt;/font&amp;gt;" target="&amp;lt;font color='#009900'&amp;gt;dev&amp;lt;/font&amp;gt;"/&amp;gt;&lt;br&gt;&lt;/br&gt;
        &amp;lt;/schedule&amp;gt;&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;
        &amp;lt;publishers&amp;gt;&lt;br&gt;&lt;/br&gt;
            &amp;lt;onsuccess&amp;gt;&lt;br&gt;&lt;/br&gt;

                &amp;lt;antpublisher antWorkingDir="&amp;lt;font color='#009900'&amp;gt;${checkout.dir}&amp;lt;/font&amp;gt;" buildfile="&amp;lt;font color='#009900'&amp;gt;build.xml&amp;lt;/font&amp;gt;" target="&amp;lt;font color='#009900'&amp;gt;publish&amp;lt;/font&amp;gt;"/&amp;gt;&lt;br&gt;&lt;/br&gt;
            &amp;lt;onsuccess&amp;gt;&lt;br&gt;&lt;/br&gt;
        &amp;lt;/publishers&amp;gt;&amp;lt;/font&amp;gt;&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;
And you're done.  Once you apply the new configuration to
CruiseControl, it will start to run the same Ant build as the
developers, meaning that there's no mystery when the build
breaks.  It may also shorten the build feedback loop by reporting
success faster.  While the developers celebrate or lament the
state of the build, the AntPublisher can get on with the work of
pushing artifacts around your network.  I also use it to tag the
codebase on a successful build - another thing that is specific to
Continuous Integration.  Publishers can be configured unadorned
inside the &amp;lt;publishers&amp;gt; element in the config file to run every
time a build completes regardless of status, or they can be wrapped in

&amp;lt;onsuccess&amp;gt; or &amp;lt;onfailure&amp;gt; to run conditionally.&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;
Publishers have a cousin element called Bootstrappers, but I'll cover that another time.&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;
©Copyright 2007 Julian Simpson. All rights reserved.
          &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ThoughtworksStudios?a=O45E8hbg"&gt;&lt;img src="http://feeds.feedburner.com/~f/ThoughtworksStudios?i=O45E8hbg" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ThoughtworksStudios?a=QYqlW5p7"&gt;&lt;img src="http://feeds.feedburner.com/~f/ThoughtworksStudios?i=QYqlW5p7" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ThoughtworksStudios?a=inrdBmYN"&gt;&lt;img src="http://feeds.feedburner.com/~f/ThoughtworksStudios?i=inrdBmYN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ThoughtworksStudios?a=zuwRU11L"&gt;&lt;img src="http://feeds.feedburner.com/~f/ThoughtworksStudios?i=zuwRU11L" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Tue, 22 Jul 2008 05:54:20 +0000</pubDate>
<feedburner:origLink>http://feeds.feedburner.com/~r/ThoughtworksStudios/~3/270628606/cruisecontrol-enterprise-best-practises</feedburner:origLink></item>
<item>
	<title>Simon Brunning: Links for 2008-07-21 [del.icio.us]</title>
	<guid isPermaLink="false">http://del.icio.us/brunns#2008-07-21</guid>
	<link>http://feeds.feedburner.com/~r/PlanetTw/~3/342237659/brunns</link>
	<description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://effbot.org/zone/simple-top-down-parsing.htm"&gt;Simple Top-Down Parsing in Python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Tue, 22 Jul 2008 05:00:00 +0000</pubDate>
<feedburner:origLink>http://feeds.feedburner.com/~r/SmallValuesOfCool/~3/342223579/brunns</feedburner:origLink></item>
<item>
	<title>Ram - Sriram Narayanan: Post release bugs can be expensive to fix</title>
	<guid isPermaLink="false">urn:lj:livejournal.com:atom1:dynamicproxy:45196</guid>
	<link>http://feeds.feedburner.com/~r/PlanetTw/~3/342237660/45196.html</link>
	<description>Just read at the register that Apple's having problems with helping MobileMe users sync information with Outlook. And to apologize (atone was the word used, actually), Apple has given the MobileMe users &lt;a href="http://www.theregister.co.uk/2008/07/21/mobile_me_yet_again/"&gt;120 days of free credit&lt;/a&gt;.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Awesome move by a company where they felt bad for what they did to the end users.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;And I sympathize with the developers at Apple who would have surely tested their work, but are now having to fix issues reported by end user (who may have lost their data).&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Hopefully, the devs at Apple would be feeling bad about end user losing data, because not all software devs actually feel the pain when customers lose something - money, sales accounts, jobs.</description>
	<pubDate>Tue, 22 Jul 2008 04:32:04 +0000</pubDate>
<feedburner:origLink>http://dynamicproxy.livejournal.com/45196.html</feedburner:origLink></item>
<item>
	<title>Brandon Hastings Byars: Orthogonality</title>
	<guid isPermaLink="false">urn:uuid:de388472-eec7-4e7d-be4d-27c7a9755aa3</guid>
	<link>http://feeds.feedburner.com/~r/PlanetTw/~3/342150448/orthogonality</link>
	<description>&lt;blockquote&gt;
Orthogonality means that features can be used in any combination, that the combinations all make sense, and that the meaning of a given feature is &lt;em&gt;consistent&lt;/em&gt;, regardless of the other features with which it is combined.  The name is meant to draw an explicit analogy to orthogonal vectors in linear algebra: none of the vectors in an orthogonal set depends on (or can be expressed in terms of) the others, and all are needed in order to describe the vector space as a whole.

&lt;div class="clear"&gt;&lt;/div&gt; 
&lt;div class="quote_attribution"&gt; – Michael Scott (Programming Language Pragmatics)&lt;/div&gt;
&lt;div class="clear"&gt;&lt;/div&gt;
&lt;/blockquote&gt;

	&lt;p&gt;I’ve used Delphi and Visual Basic at previous jobs.  I disliked both of them.  VB has this annoying distinction between objects and primitives, so I’d consistently type&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_vb "&gt;Dim server
server = "localhost"

Dim catalog
catalog = CreateObject("MyCompany.MyObject")&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;...only to be greeted by an ugly Windows popup box that &lt;code&gt;Object doesn't support this property or method&lt;/code&gt;.  The problem, as all you grizzled VB programmers no doubt spotted immediately, is the last line should start with the keyword &lt;code&gt;Set&lt;/code&gt;.  VB requires you to prefix assignments on “objects” with &lt;code&gt;Set&lt;/code&gt;.  But if you try to put a &lt;code&gt;Set&lt;/code&gt; in front of assignments on what VB considers primitives (like the first assignment above), you get an error that reads &lt;code&gt;Object required: '[string: "localhost"]'&lt;/code&gt;.&lt;/p&gt;


	&lt;p&gt;Delphi likewise frustrated me with mundane annoyances:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_Delphi "&gt;DoOneThing();

if value = goal then
    DoSomething();
else
    DoSomethingElse();&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;The code above doesn’t compile, and it won’t compile until you remove the semicolon from the call to &lt;code&gt;DoSomething()&lt;/code&gt;.  Semicolons complete a statement, and the statement is the entire &lt;code&gt;if-else&lt;/code&gt; clause.&lt;/p&gt;


	&lt;p&gt;These problems in VB and Delphi are related to the concept of &lt;em&gt;orthogonality&lt;/em&gt; mentioned in the opening quote.  VB doesn’t let you compose assignment to objects the same way it lets you compose assignment to primitives.  Delphi doesn’t let you end an &lt;code&gt;if&lt;/code&gt; clause the same way it lets you end an &lt;code&gt;else&lt;/code&gt; clause.  These inconsistencies encourage even experienced programmers to make silly syntax mistakes and make the language harder to use.&lt;/p&gt;


	&lt;h3&gt;What is orthogonality?&lt;/h3&gt;


	&lt;p&gt;The key principles I extracted from Michael Scott’s quote listed above are &lt;em&gt;consistency&lt;/em&gt; and &lt;em&gt;composability&lt;/em&gt;.  Composability means that features can be combined, and consistency stands in for the &lt;a href="http://en.wikipedia.org/wiki/Principle_of_least_astonishment"&gt;Principle of Least Surprise&lt;/a&gt;—features act how you expect they would, regardless of how they’re being combined.  VB’s assignments lack consistency.  Delphi’s semicolon parsing doesn’t act consistently when composed within a surrounding statement.&lt;/p&gt;


	&lt;p&gt;Scott claims that a highly orthogonal language is easier to understand and easier to use.  Nowhere does he mention that it’s easier to &lt;em&gt;implement&lt;/em&gt;.  I’m sure the Delphi grammar was simplified considerably by refusing to allow the &lt;code&gt;DoSomething&lt;/code&gt; statement to end in a semicolon when contained within an outer &lt;code&gt;if-else&lt;/code&gt; clause.  It’s also likely that the implementation of Visual Basic was simplified by having the programmer tell the compiler whether an assignment referred to an object or a primitive.&lt;/p&gt;


	&lt;p&gt;I suspect many non-orthogonal aspects of languages are there to make them easier to implement.  However, some languages that are trivially easy to implement can also be amazingly orthogonal.  Lisp is a prime example; it is a highly orthogonal language, and yet an entire Lisp interpreter written in Lisp fits on just &lt;a href="http://bc.tech.coop/blog/080101.html"&gt;one page&lt;/a&gt; of the Lisp 1.5 Programmer’s Manual.&lt;/p&gt;


	&lt;p&gt;I found it instructive to list out syntactic constructs that make languages less orthogonal.  It’s amazing how mainstream most of them are:&lt;/p&gt;


	&lt;h4&gt;Statements&lt;/h4&gt;


	&lt;p&gt;Statements aren’t necessary, and a number of languages avoid them altogether.  Having only expressions makes the language easier to work in.  Compare the inconsistency of Delphi’s statement parsing to the composability of Ruby’s expressions:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;x&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="number"&gt;0&lt;/span&gt;
  &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;Zero&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;
&lt;span class="keyword"&gt;else&lt;/span&gt;
  &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;Not Zero&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;The &lt;code&gt;if&lt;/code&gt; clause is an expression; it returns the last value evaluated (e.g., either “Zero” or “Not Zero”).  And that value can be composed within another expression.&lt;/p&gt;


	&lt;p&gt;So what happens when you don’t have a reasonable return value?  Smalltalk always returns &lt;code&gt;self&lt;/code&gt;, which is convenient because it allows method chaining.  In the Ruby example above, the entire expression returns the result of the call to &lt;code&gt;puts&lt;/code&gt;, which happens to be &lt;code&gt;nil&lt;/code&gt;.&lt;/p&gt;


	&lt;p&gt;The beauty of expressions is that the composability doesn’t just go one level deep:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;x&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;a&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="keyword"&gt;else&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt; &lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="ident"&gt;y&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;x&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;a&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="keyword"&gt;else&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;y&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;x&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;a&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="keyword"&gt;else&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;returns nil&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;y&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;x&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;a&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="keyword"&gt;else&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;nil?&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;As the example above shows, orthogonality doesn’t guarantee good code.  However, it allows the language to be used in unanticipated ways, which is A Good Thing.  Moreover, since everything is an expression, you can put expressions where you wouldn’t normally expect them.  For example, in Ruby, the &lt;code&gt;&amp;lt;&lt;/code&gt; operator represents inheritance when the receiver is a class, but the superclass could be an expression:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Test&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;x&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="constant"&gt;OneClass&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="keyword"&gt;else&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="constant"&gt;TwoClass&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Pushing a language like this, only to find that it’s &lt;a href="http://en.wikipedia.org/wiki/Turtles_all_the_way_down"&gt;turtles&lt;/a&gt; &lt;a href="http://www.cincomsmalltalk.com/userblogs/avi/blogView?showComments=true&amp;amp;entry=3284695382"&gt;all the way down&lt;/a&gt;, is a signpost for orthogonality.&lt;/p&gt;


	&lt;h4&gt;Primitives&lt;/h4&gt;


	&lt;p&gt;We already saw the clumsiness of VB primitives, but most mainstream languages share a similar problem.  Java, for example, has a confusing dichotomy of &lt;code&gt;long&lt;/code&gt;s and &lt;code&gt;Long&lt;/code&gt;s, the first a primitive and the second a full-fledged object.  C has stack-allocated primitives, which are freed automatically when they fall out of scope, and heap-allocated variables, which you have to free yourself.  C# has value types, which force another abstraction – boxing – into the programmer’s lap.&lt;/p&gt;



    &lt;div class="code"&gt;
    &lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;object&lt;/span&gt; DBNullIf(&lt;span style="color: blue;"&gt;int&lt;/span&gt; value, &lt;span style="color: blue;"&gt;int&lt;/span&gt; nullValue)&lt;/pre&gt;
    &lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
    &lt;pre style="margin: 0px;"&gt;    &lt;span style="color: blue;"&gt;return&lt;/span&gt; (value != nullValue) ? (&lt;span style="color: blue;"&gt;object&lt;/span&gt;)value : &lt;span style="color: #2b91af;"&gt;DBNull&lt;/span&gt;.Value;&lt;/pre&gt;
    &lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
    &lt;/div&gt;


	&lt;p&gt;The code above should be a head-scratcher.  Isn’t &lt;code&gt;object&lt;/code&gt; the superclass of all other types?  And if so, why do we have to explicitly cast our &lt;code&gt;int&lt;/code&gt; variable to an &lt;code&gt;object&lt;/code&gt; to make this code compile?  Why don’t we have to do the same for the &lt;code&gt;DBNull&lt;/code&gt;?&lt;/p&gt;


	&lt;p&gt;I mentioned above that ease of implementation is a common source of non-orthogonality.  With primitives, we can see another, more legitimate reason: performance.  There is a cost to keeping primitives out of the language.  Below, we’ll see several more non-orthogonal language features that make performance easier to optimize.&lt;/p&gt;


	&lt;h4&gt;Nulls&lt;/h4&gt;


	&lt;p&gt;Nulls have been problematic enough that an entire &lt;a href="http://en.wikipedia.org/wiki/Null_Object_pattern"&gt;design pattern&lt;/a&gt; has been created to avoid them.  Access violations and object reference exceptions are some of the most common programmer errors.  Most languages divide object references into two types: those that point to an object, and those that point to nothing.  There’s nothing intrinsically non-orthogonal about that division, except that in most languages the references that point to nothing &lt;em&gt;work differently&lt;/em&gt;.  Instead of returning a value, they throw an exception when dereferenced.&lt;/p&gt;


	&lt;p&gt;In Ruby, the division is still more or less there -- some references point to objects, and some point to nothing -- &lt;em&gt;but both types of references still return a value.&lt;/em&gt;  In effect, Ruby has built the Null Object pattern into the language, as the references that point to nothing return a &lt;code&gt;nil&lt;/code&gt; value.  But, like everything else in Ruby, &lt;code&gt;nil&lt;/code&gt; is an object (of type &lt;code&gt;NilClass&lt;/code&gt;), and can be used in expressions:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;nil?&lt;/span&gt;        &lt;span class="comment"&gt;# returns false&lt;/span&gt;
&lt;span class="constant"&gt;nil&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;nil?&lt;/span&gt;    &lt;span class="comment"&gt;# returns true&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;You never get an &lt;code&gt;NullReferenceException&lt;/code&gt; in Ruby.  Instead, you get a &lt;code&gt;NoMethodError&lt;/code&gt; when you try to call a method on &lt;code&gt;nil&lt;/code&gt; that doesn’t exist, which is exactly the same error you’d get if you called a method on any object that didn’t exist.&lt;/p&gt;


	&lt;h4&gt;Magic Functions&lt;/h4&gt;


	&lt;p&gt;Most object-oriented languages have certain functions that aren’t really methods.  Instead, they’re special extensions to the language that make the class-based approach work.&lt;/p&gt;



    &lt;div class="code"&gt;
    &lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; Magic&lt;/pre&gt;
    &lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
    &lt;pre style="margin: 0px;"&gt;    &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ClassMethod()&lt;/pre&gt;
    &lt;pre style="margin: 0px;"&gt;    {&lt;/pre&gt;
    &lt;pre style="margin: 0px;"&gt;    }&lt;/pre&gt;
    &lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
    &lt;pre style="margin: 0px;"&gt;    &lt;span style="color: blue;"&gt;public&lt;/span&gt; Magic()&lt;/pre&gt;
    &lt;pre style="margin: 0px;"&gt;    {&lt;/pre&gt;
    &lt;pre style="margin: 0px;"&gt;    }&lt;/pre&gt;
    &lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
    &lt;pre style="margin: 0px;"&gt;    &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; NormalMethod()&lt;/pre&gt;
    &lt;pre style="margin: 0px;"&gt;    {&lt;/pre&gt;
    &lt;pre style="margin: 0px;"&gt;    }&lt;/pre&gt;
    &lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
    &lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
    &lt;pre style="margin: 0px;"&gt;Magic.ClassMethod();&lt;/pre&gt;
    &lt;pre style="margin: 0px;"&gt;Magic magic = &lt;span style="color: blue;"&gt;new&lt;/span&gt; Magic(5);&lt;/pre&gt;
    &lt;pre style="margin: 0px;"&gt;magic.NormalMethod();&lt;/pre&gt;
    &lt;/div&gt;


	&lt;p&gt;Notice the context shift we make when constructing new objects.  Instead of making method calls via the normal syntax (&lt;code&gt;receiver.method()&lt;/code&gt;), we use the keyword &lt;code&gt;new&lt;/code&gt; and give the class name.  But what is the class but a factory for instances, and what is the constructor but a creation method?  In Ruby, the constructor is just a normal class-level method:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;regex&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Regexp&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;phone_pattern&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Typically, the &lt;code&gt;new&lt;/code&gt; class-level method allocates an instance and delegates to the newly created instance’s &lt;code&gt;initialize&lt;/code&gt; method (which is what most Ruby programmers call the “constructor”).  But, since &lt;code&gt;new&lt;/code&gt; is just a normal method, if you &lt;em&gt;really&lt;/em&gt; wanted to, you could override it and do something different:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Test&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;self.new&lt;/span&gt;
    &lt;span class="number"&gt;2&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="constant"&gt;Test&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;    &lt;span class="comment"&gt;# returns 4!!&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Operators also tend to be magic methods in many languages.  Ruby more or less treats them just like other methods, except the interpreter steps in to break the elegant consistency of everything-as-a-method to provide operator precedence.  Smalltalk and Lisp, two other highly orthogonal languages, do not provide operator precedence.  Operators are just normal methods (functions in Lisp), and work with the same precedence rules as any other method.&lt;/p&gt;


	&lt;p&gt;So here we have yet another reason, on top of ease of language implementation and performance, to add non-orthogonality to a language.  Ruby adds operator precedence, even though it adds an element of inconsistency, presumably because it makes the language more intuitive.  Since intuitiveness is one of the purported benefits of orthogonality, there is a legitimate conflict of interest here.  I think I would prefer &lt;em&gt;not&lt;/em&gt; having operator precedence, and leaving the language consistent, but it seems more of a question of style than anything else.&lt;/p&gt;


	&lt;h4&gt;Static and sealed Methods&lt;/h4&gt;


	&lt;p&gt;Class-based object-oriented languages impose a dichotomy between classes and instances of those classes.  Most of them still allow behavior to exist on classes, but that behavior is treated differently than instance behavior.  By declaring class methods as &lt;code&gt;static&lt;/code&gt;, you’re telling the compiler that it’s free to compute the address of this function at compile-time, instead of allowing the dynamic binding that gives you polymorphism.&lt;/p&gt;


	&lt;p&gt;Ruby gives you some degree of polymorphism at the class level (although you can’t call superclass methods, for obvious reasons):&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Animal&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;self.description&lt;/span&gt;
    &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;kingdom Animalia&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Person&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;Animal&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;self.description&lt;/span&gt;
    &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;semi-evolved simians&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;In most mainstream languages, not even all instance methods are polymorphic.  They are by default in Java, although you can make them statically-bound by declaring them &lt;code&gt;final&lt;/code&gt;.  C# and C++ take a more extreme approach, forcing you to declare them &lt;code&gt;virtual&lt;/code&gt; if you want to use them polymorphically.&lt;/p&gt;


	&lt;p&gt;Behavior cannot be combined consistently between &lt;code&gt;virtual&lt;/code&gt; and &lt;code&gt;sealed&lt;/code&gt; (or &lt;code&gt;final&lt;/code&gt;) methods.  It’s a common complaint when developers try to extend a framework only to find out that the relevant classes are &lt;code&gt;sealed&lt;/code&gt;.&lt;/p&gt;


	&lt;h4&gt;Instance Variables&lt;/h4&gt;


	&lt;p&gt;Only the pure functionalists can get by without state; the rest of us need to remember things.  But there’s no reason why the mechanism of retrieving stored values has to be treated differently from the mechanism of calling a parameter-less function that computes a value, nor is there a reason that the mechanism for storing a value has to be different from the mechanism of calling a setter function to store the value for you.&lt;/p&gt;


	&lt;p&gt;It is common OO dogma that state should be private, and if you need to expose it, you should do so through getters and setters.  The evolution of the popular Rails framework recently reaffirmed this dogma.  In prior versions, sessions were exposed to the controllers via the &lt;code&gt;@session&lt;/code&gt; instance variable.  When they needed to add some logic to storing and retrieving, they could no longer expose the simple variable, and refactored to a getter/setter attribute access.  They were able to do so in a backward-compatible way, by making the &lt;code&gt;@session&lt;/code&gt; variable a proxy to an object that managed the logic, but it was still a process that a more orthogonal language wouldn’t have required.  &lt;em&gt;The language should not force you to distinguish between field access and method access.&lt;/em&gt;&lt;/p&gt;


	&lt;p&gt;Both Lisp and Eiffel treat instance variables equivalently to function calls (at least when it comes to rvalues).  Lisp simply looks up atoms in the environment, and if that atom is a function (lambda), then it can be called to retrieve the value no differently than if the atom is a variable containing the value.  Eiffel, an object-oriented language, declares variables and methods using the same keyword (&lt;code&gt;feature&lt;/code&gt;), and exposes them  - both to the outside world and to the class itself -  the same way (Bertrand Meyer called this the Uniform Access principle):&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_eiffel "&gt;class POINT 
feature
    x, y: REAL
            -- Abscissa and ordinate

    rho: REAL is
            -- Distance to origin (0,0)
        do
            Result := sqrt(x^2 + y^2)
        end&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Once you get passed Eiffel’s tradition of &lt;span class="caps"&gt;YELLING TYPES&lt;/span&gt; at you and hiding the actual code, Uniform Access makes a lot of sense.  Instance variables are just like features without bodies.  C# has properties, which provide similar benefits, but force you to explicitly declare them.  Instead of a &lt;code&gt;getRho&lt;/code&gt; and &lt;code&gt;setRho&lt;/code&gt; method, you can have a property that allows clients to use the same syntax regardless of whether they’re using a property or a field.  Because Ruby allows the = symbol as part of a method name, it allows a similar syntax.&lt;/p&gt;


	&lt;p&gt;However, the separation between variables and properties is superfluous.  For example, there’s no need for them to have separate access levels.  If other classes need the state exposed, then declare it public.  If the language doesn’t offer instance variables, then you’re simply exposing a property method.  If you run into the same problem that Rails ran into, and suddenly need to add behavior around exposed state, refactoring should be easy.  Just add a private property method that is now the state, and leave the public property method.&lt;/p&gt;


	&lt;p&gt;So, in my hypothetical language, we might have the following:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;class Controller
  public feature session
end&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;And when you feel you need to add behavior around the exposed &lt;code&gt;session&lt;/code&gt; dictionary, it should be easy:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;class Controller
  public feature session
    # added behavior goes here
    private_session
  end

  private feature private_session
end&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;One thing that this hypothetical syntax doesn’t allow is separate access levels for getting and setting, but it shows the basic idea.&lt;/p&gt;


	&lt;h4&gt;Inconsistent Access Levels&lt;/h4&gt;


	&lt;p&gt;Since we’re on the subject of access levels, Ruby’s &lt;code&gt;private&lt;/code&gt; access level is not very orthogonal at all.  Unlike C++ derived languages, Ruby’s &lt;code&gt;private&lt;/code&gt; is object-level, not class-level, which means that even other instances of the same class can’t directly access the &lt;code&gt;private&lt;/code&gt; method.  That’s a reasonable constraint.&lt;/p&gt;


	&lt;p&gt;However, instead of making object-level &lt;code&gt;private&lt;/code&gt; access level orthogonal, the implementors simply disallowed developers to specify the receiver for &lt;code&gt;private&lt;/code&gt; methods.  This undoubtedly made implementing object-level &lt;code&gt;private&lt;/code&gt; access much easier.  Unfortunately, it means that you can’t even use &lt;code&gt;self&lt;/code&gt; as the receiver within the object itself, which makes moving a method from &lt;code&gt;public&lt;/code&gt; or &lt;code&gt;protected&lt;/code&gt; to &lt;code&gt;private&lt;/code&gt; non-transparent, even if all references to the method are within the class itself:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;TestAccessLevels&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;say_my_name&lt;/span&gt;
    &lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="ident"&gt;private&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;name&lt;/span&gt;
    &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;Snoopy&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="comment"&gt;# The following line throws an exception&lt;/span&gt;
&lt;span class="constant"&gt;TestAccessLevels&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;say_my_name&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;h4&gt;Second class types&lt;/h4&gt;


Having special types, like null, is a special case of having primitives, and it’s a common performance optimization.  Being a &lt;a href="http://en.wikipedia.org/wiki/First-class_object"&gt;first-class type&lt;/a&gt; has a well-defined meaning.  Specifically, its instances can:
	&lt;ul&gt;
	&lt;li&gt;be passed to functions as parameters&lt;/li&gt;
		&lt;li&gt;be returned from functions&lt;/li&gt;
		&lt;li&gt;be created and stored in variables&lt;/li&gt;
		&lt;li&gt;be created anonymously&lt;/li&gt;
		&lt;li&gt;be created dynamically&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;It’s becoming increasingly common for modern languages to move towards first-class functions.  In the &lt;a href="http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html"&gt;Execution in the Land of the Nouns&lt;/a&gt;, Steve Yegge parodied the typical transmogrifications Java programmers had accustomed themselves to in order to sidestep the language’s lack of first-class functions.  Java’s cousin (descendant?), C#, has &lt;a href="http://brandonbyars.com/blog/articles/2007/11/05/using-closures-to-implement-undo"&gt;more or less&lt;/a&gt; had them since .NET 2.0 in the form of anonymous delegates.&lt;/p&gt;


	&lt;p&gt;What neither Java nor C# have are first-class classes.  Both have reflection, and even allow you to create new types at runtime (painfully…).  But, because both languages are statically typed, you can’t access these runtime-created types the same way you can access normal types.  Assuming &lt;code&gt;Foo&lt;/code&gt; is a runtime-created type, the following code won’t compile:&lt;/p&gt;



    &lt;div class="code"&gt;
    &lt;pre style="margin: 0px;"&gt;Foo foo = &lt;span style="color: blue;"&gt;new&lt;/span&gt; Foo();&lt;/pre&gt;
    &lt;/div&gt;


	&lt;p&gt;The only way to make it work is by heavy use of reflection.  Ruby, on the other hand, makes it trivially easy to add types at runtime.  In fact, &lt;em&gt;all&lt;/em&gt; types are added at runtime, since it’s an interpreted language.&lt;/p&gt;


	&lt;h4&gt;Single Return Values&lt;/h4&gt;


	&lt;p&gt;Since you can pass more than one argument &lt;em&gt;to&lt;/em&gt; functions, why should you only be allowed to return one value &lt;em&gt;from&lt;/em&gt; functions?  Languages like ML add orthogonality by returning tuples.  Ruby works similarly, unpacking arrays automatically for you if you use multiple lvalues in one expression.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;duplicate&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;value&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;value&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;value&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="ident"&gt;first&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;second&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;duplicate&lt;/span&gt;&lt;span class="punct"&gt;("&lt;/span&gt;&lt;span class="string"&gt;hi there&lt;/span&gt;&lt;span class="punct"&gt;")&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;This feature allows you to combine lvalues and rvalues more consistently.&lt;/p&gt;


	&lt;h4&gt;Inconsistent Nesting&lt;/h4&gt;


	&lt;p&gt;Nesting is the standard programming trick of limiting scope, and most languages provide blocks that you can nest indefinitely if you want to limit scope.  For example, in C#:&lt;/p&gt;



    &lt;div class="code"&gt;
    &lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; TestNest()&lt;/pre&gt;
    &lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
    &lt;pre style="margin: 0px;"&gt;    &lt;span style="color: blue;"&gt;string&lt;/span&gt; outer = &lt;span style="color: #a31515;"&gt;"outer"&lt;/span&gt;;&lt;/pre&gt;
    &lt;pre style="margin: 0px;"&gt;    {&lt;/pre&gt;
    &lt;pre style="margin: 0px;"&gt;        &lt;span style="color: blue;"&gt;string&lt;/span&gt; middle = &lt;span style="color: #a31515;"&gt;"middle"&lt;/span&gt;;&lt;/pre&gt;
    &lt;pre style="margin: 0px;"&gt;        {&lt;/pre&gt;
    &lt;pre style="margin: 0px;"&gt;            &lt;span style="color: blue;"&gt;string&lt;/span&gt; inner = &lt;span style="color: #a31515;"&gt;"inner"&lt;/span&gt;;&lt;/pre&gt;
    &lt;pre style="margin: 0px;"&gt;        }&lt;/pre&gt;
    &lt;pre style="margin: 0px;"&gt;    }&lt;/pre&gt;
    &lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
    &lt;/div&gt;


	&lt;p&gt;In addition to blocks, Ruby allows you to nest functions, but the nesting doesn’t work in an orthogonal way:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;outer&lt;/span&gt;
  &lt;span class="ident"&gt;inner_var&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;inner variable&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;

  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;inner&lt;/span&gt;
    &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;inner method&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="ident"&gt;outer&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;inner&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;inner_var&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;In this example, the last line will throw a &lt;code&gt;NameError&lt;/code&gt;, complaining that &lt;code&gt;inner_var&lt;/code&gt; is undefined.  This is as we should expect – since it’s defined inside an inner scope from where we’re calling it, we should not be able to access it.  However, the same is not true for the &lt;code&gt;inner&lt;/code&gt; method defined in the call to &lt;code&gt;outer&lt;/code&gt;.  Despite the fact that it’s defined within a nested scope, it actually has the same scoping as &lt;code&gt;outer&lt;/code&gt;.&lt;/p&gt;


	&lt;p&gt;Ruby’s scoping gets even weirder:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;outer&lt;/span&gt;
  &lt;span class="keyword"&gt;begin&lt;/span&gt;
    &lt;span class="ident"&gt;inner_var&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;inner&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="ident"&gt;inner_var&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;outer&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;This code works, printing “inner” to the console.  It shouldn’t.&lt;/p&gt;


	&lt;p&gt;JavaScript similarly suffers from strange scoping rules.  Because all variables have function scope, and not block scope, a variable is available everywhere within a function regardless of where it is defined:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_javascript "&gt;function testScoping(predicate) {
  if (predicate) {
    var test = "in if block";    
  }
  alert(test);    // works, even though it's in an outer block
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;h4&gt;Fixing your mistakes&lt;/h4&gt;


	&lt;p&gt;Speaking of JavaScript, few things bug me more about programming languages than those that try to fix your mistakes for you.  JavaScript automatically appends semicolons for you at the end of a line if you forget to.  Most of the time, that works fine, but every now and then it creates a ridiculously hard bug to diagnose:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_javascript "&gt;return
{
  value: 0
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;The &lt;code&gt;return&lt;/code&gt; statement above looks like it returns an object with a single property.  What it &lt;em&gt;really&lt;/em&gt; does, though, is simply return.  The semicolon was appended on your behalf at the end of the &lt;code&gt;return&lt;/code&gt; keyword, turning the following three lines into dead code.  It is for this reason that Douglas Crockford recommends always using K&amp;amp;R style braces in JavaScript in &lt;a href="http://oreilly.com/catalog/9780596517748/"&gt;JavaScript: The Good Parts&lt;/a&gt;.&lt;/p&gt;


	&lt;h4&gt;Summary&lt;/h4&gt;


	&lt;p&gt;Orthogonality makes the language easier to extend in ways that the language implementors didn’t anticipate.  For example, Ruby’s first-class types, combined with its duck-typing, allows the popular mocking framework &lt;a href="http://where"&gt;Mocha&lt;/a&gt; to have a very nice syntax:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;logger&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;stub&lt;/span&gt;
&lt;span class="ident"&gt;logger&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;expects&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:error&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;with&lt;/span&gt;&lt;span class="punct"&gt;("&lt;/span&gt;&lt;span class="string"&gt;Execution error&lt;/span&gt;&lt;span class="punct"&gt;")&lt;/span&gt;

&lt;span class="ident"&gt;do_something&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:blow_up&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;logger&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;The fact that classes in Ruby are also objects means that the same syntax works for classes:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;stubs&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:exists?&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;returns&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;true&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;I picked on JavaScript a couple times, but it did a better job of any other language I know of with literals.  JavaScript has literal numbers and strings, like most languages.  It has literal regular expressions and lists like Perl and Ruby.  But where it really shines is in it’s literal object syntax.  Objects are basically dictionaries, and Ruby and Perl have hash literals, but JavaScripts objects include function literals:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_javascript "&gt;function ajaxSort(columnName, sortDirection) {
    setNotice('Sorting...');
    new Ajax.Request(
        "/reports/ajaxSort",
        {
            method: "get",
            parameters: { sort: columnName, sortDir: sortDirection },
            onSuccess: function(transport) { 
                $("dataTable").innerHTML = transport.responseText;
            },
            onComplete: function() { clearNotice(); }
        }
    );
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;In time, that syntax was leveraged to form the &lt;span class="caps"&gt;JSON&lt;/span&gt; format.&lt;/p&gt;


	&lt;p&gt;In a more dramatic example, when object-orientation became all the rage, Lisp was able to add object-orientation to the language &lt;em&gt;without changing the language&lt;/em&gt;.  The &lt;a href="http://en.wikipedia.org/wiki/Common_Lisp_Object_System"&gt;Common Lisp Object System&lt;/a&gt; (CLOS) is written entirely in Lisp.  The reason Lisp was able absorb an entire new paradigm is largely due to the language’s orthogonality.  Not all function-like calls work the same way; some are called “special forms” because they act differently (for example, by providing lazy evaluation of the arguments).  However, Lisp allows the programmer to create their own special forms by writing &lt;a href="http://brandonbyars.com/blog/articles/2008/02/12/understanding-syntactic-macros"&gt;macros&lt;/a&gt;, which are themselves written in Lisp.&lt;/p&gt;


	&lt;p&gt;It helps to have turtles all the way down.&lt;/p&gt;


	&lt;p&gt;(Update: 7/22/08 – fixed some code formatting issues when rendered through an &lt;span class="caps"&gt;RSS&lt;/span&gt; feed)&lt;/p&gt;</description>
	<pubDate>Tue, 22 Jul 2008 02:36:00 +0000</pubDate>
<feedburner:origLink>http://brandonbyars.com/blog/articles/2008/07/21/orthogonality</feedburner:origLink></item>
<item>
	<title>Kiran Bellubbi: NetFlix is so 1995 - it sux!</title>
	<guid isPermaLink="false">http://bellubbi.com/wordpress/2008/07/21/netflix-is-so-1995-it-sux/</guid>
	<link>http://feeds.feedburner.com/~r/PlanetTw/~3/341990794/</link>
	<description>&lt;p&gt;In a moment of weakness I gave in to advertising jingles and decided to try NetFlix out - its my second day using the service and one of the main reasons I decided to try it was their new &lt;a href="http://www.netflix.com/WatchNow" target="_blank"&gt;WatchNow feature&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;The WatchNow feature only works on Internet Explorer, buffering takes way too long - it took 1:25mins for a movie to be ready to be played on my 10mbs line at home. &lt;/p&gt;
&lt;p&gt;People at NetFlix: wake up! Go look at Hulu, watchTVSitcoms, joox, surfthechannel and compare your sucky, sub-par, &lt;em&gt;paid&lt;/em&gt; service against what these guys provide for free!&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/smalldoses/~4/341963851" height="1" width="1"&gt;&lt;/img&gt;</description>
	<pubDate>Mon, 21 Jul 2008 22:26:26 +0000</pubDate>
<feedburner:origLink>http://feeds.feedburner.com/~r/smalldoses/~3/341963851/</feedburner:origLink></item>
<item>
	<title>Ram - Sriram Narayanan: Opportunity: Sun hardware and software in demanding environments.</title>
	<guid isPermaLink="false">urn:lj:livejournal.com:atom1:dynamicproxy:44820</guid>
	<link>http://feeds.feedburner.com/~r/PlanetTw/~3/341895070/44820.html</link>
	<description>As an erstwhile hardware technician, I have always loved reading about hardware. And as an erstwhile Industrial Automation technician, machine uptime is something that I enjoy learning about.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;A long time discussion in the Industrial Automation Industry has been around how people would live to have the reliability of Sun hardware, the stability of Solaris, and the feature set of Windows based Automation tools.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Some years ago, I was fortunate to see a Bayer Diagnostics' Advia Centaur being commissioned at Asia's largest Thyroid testing center at Thane (pronounced: thaaney), Maharasthra. This machine (called an immunoassay system) did a whole bunch of tests at very high speeds. When you have to process something like 30,000 independent blood samples in 4 hours at night at very high speeds, then you need reliability and accuracy. The high speed system would process the test-tubes which had barcoded stickers on them.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;The only thing that counted as a minus for me was on how the data was finally made available. All the data collation was made available via some custom software. There was some different mechanism of providing the data over serial port, and this was in terms of "ask me for a very specific and I'll provide you that". There was no notion of making the data available as a stream, or via some http mechanism, or even some TCP stream.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;It was not as if the hardware platform was limited - the equipment was driven by a dual SPARC Solaris box running Solaris 8.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Well, this is not really a post discussing how data access could be provided better, so let met get back to the point.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;I learned then from the senior technicians from Bayer, that they trusted Solaris and the Sun hardware a lot. They had a few war stories to tell me about how some Sun hardware that they had would just _refuse_ to fail ! We all wondered if Sun was actually competing with itself !&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;These war stories of Sun hardware just working on and on, never failing, never dying, is something that I have heard from other guys who worked on Bank ATM systems too. They'd have OS/2 Warp on the kiosks (Windows 95/98 on rare occassions), and Solaris 8 on Sun servers.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;With the addition of awesome tools and technologies such as ZFS, DTrace, FMA, Trusted Security, multi core awareness, the plethora of storage options, and the soon to be integrated Crossbow - the Solaris OS and Sun hardware combination could become more attractive as a platform to delivery great solutions on. &lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;What, then is preventing system integrators from selecting Sun for Automation Solutions ? The lack of a Automation IDE targetting Solaris would be one thing. The absence of device drivers would be another. Writing high quality device drivers is an important job, especially when writing them for devices such as high speed counters (where accuracy is important) or Analog to Digital convertors (where precision and timing are important). National Instruments' LabView did have some Solaris based releases, but that was never really marketed too well - at least in India, unfortunately.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;There was an Eclipsecon presentation by Siemens' Brazil some years ago, but I haven't heard more since then.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Bottomline: Having a killer IDE, a healthy eco system of device drivers, and strong marketing could position Solaris well in those worlds where other OS can't cut it.</description>
	<pubDate>Mon, 21 Jul 2008 20:37:50 +0000</pubDate>
<feedburner:origLink>http://dynamicproxy.livejournal.com/44820.html</feedburner:origLink></item>
<item>
	<title>Manish Chakravarty: I am Immersed!</title>
	<guid isPermaLink="false">http://manish-chaks.livejournal.com/88517.html</guid>
	<link>http://feeds.feedburner.com/~r/PlanetTw/~3/341857599/88517.html</link>
	<description>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt;&lt;a href="http://www.flickr.com/photos/manish_chaks/2690292962/" title="photo sharing"&gt;&lt;img src="http://farm4.static.flickr.com/3034/2690292962_e452bd2026.jpg" alt="" style="border: solid 2px #000000;"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br&gt;&lt;/br&gt;&lt;span style="font-size: 0.9em; margin-top: 0px;"&gt;&lt;a href="http://www.flickr.com/photos/manish_chaks/2690292962/"&gt;I am Immersed!&lt;/a&gt;&lt;br&gt;&lt;/br&gt;Originally uploaded by &lt;a href="http://www.flickr.com/people/manish_chaks/"&gt;Manish Chakravarty&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;I completed my Immersion at ThoughtWorks.&lt;br&gt;&lt;/br&gt;It was a wonderful experience, both personally and professionally.&lt;br&gt;&lt;/br&gt;I will blog about my experience about it in a later blog post&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;More Immersion photographs at&lt;br&gt;&lt;/br&gt;&lt;a href="http://flickr.com/photos/manish_chaks/sets/72157606218107832/"&gt;http://flickr.com/photos/manish_chaks/sets/72157606218107832/&lt;/a&gt;&lt;br clear="all"&gt;&lt;/br&gt;</description>
	<pubDate>Mon, 21 Jul 2008 19:31:01 +0000</pubDate>
<feedburner:origLink>http://manish-chaks.livejournal.com/88517.html</feedburner:origLink></item>
<item>
	<title>Ram - Sriram Narayanan: Belenix 0.7.1 - Amazing initial download reports</title>
	<guid isPermaLink="false">urn:lj:livejournal.com:atom1:dynamicproxy:44732</guid>
	<link>http://feeds.feedburner.com/~r/PlanetTw/~3/341857601/44732.html</link>
	<description>Here's some exciting news about &lt;a href="http://www.belenix.org/"&gt;Belenix&lt;/a&gt;, and OpenSolaris based distribution that you ought to give a try !&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;+ About 1.1 TB served this weekend :)&lt;br&gt;&lt;/br&gt;+ About 1700+ downloads in two days :)&lt;br&gt;&lt;/br&gt;+ Independent seeding has begun :)&lt;br&gt;&lt;/br&gt;+ More downloads in progress :) &lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Yup, readers, that's smiles all the way :) (Err.. a Hindi saying to ward off the evil eye comes to mind.. "Buri nazar waley, tera muh kaala !" ;)&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;The Google Analytics on the site tell us more things:&lt;br&gt;&lt;/br&gt;+ 3000 Page Visits (where people stay around for more than a few minutes and read various things on the site)&lt;br&gt;&lt;/br&gt;+ Hits: 10344 on Sat and 6550 on Sun (We'd announced Belenix on Saturday)&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;1. A few people have written in expressing their satisfaction with Belenix 0.7.1&lt;br&gt;&lt;/br&gt;2. Someone wanted help with testing Belenix with 802.11 WEP. I have Enterprise WEP at work, but forgot to test this ! Ugh !&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;So, folks, get started with OpenSolaris ! :) Download Belenix from here &lt;a href="http://belenix.org/content/Download"&gt;http://belenix.org/content/Download&lt;/a&gt;    There's even a Metalink on that page ! :)&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Here are the &lt;a href="http://belenix.org/content/BeleniX-071-Released"&gt; release notes &lt;/a&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Contact #belenix @ freenode.net on IRC &lt;br&gt;&lt;/br&gt;Feel free to file bugs here : &lt;a href="http://sourceforge.net/tracker/?group_id=216118"&gt;http://sourceforge.net/tracker/?group_id=216118&lt;/a&gt;&lt;br&gt;&lt;/br&gt; We take bug reports very seriously, and future development always includes time for bug reports.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Website: www.belenix.org&lt;br&gt;&lt;/br&gt;Discussion List : belenix-discuss@opensolaris.org&lt;br&gt;&lt;/br&gt;Developer List: belenix-dev@opensolaris.org&lt;br&gt;&lt;/br&gt;IRC : #belenix @ freenode.net (late night India Standard Time is when the core team is around - there are others who hang aroudn too ! :)&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Feel free to get in touch with us. This is one group that's incredibly friendly, end user focussed as much as we can think of being, and driven by user inputs on what people want to see !</description>
	<pubDate>Mon, 21 Jul 2008 19:28:09 +0000</pubDate>
<feedburner:origLink>http://dynamicproxy.livejournal.com/44732.html</feedburner:origLink></item>
<item>
	<title>Carlos Villela: Networks Are Smart at the Edges</title>
	<guid isPermaLink="false">http://www.lixo.org/archives/2008/07/21/networks-are-smart-at-the-edges/</guid>
	<link>http://feeds.feedburner.com/~r/PlanetTw/~3/341754219/</link>
	<description>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt;
 &lt;a href="http://www.flickr.com/photos/camil_t/1185912575/" title="photo sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1316/1185912575_74ae17c666_m.jpg" alt="" style="border: solid 2px #000000;"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;A toothpaste factory had a probem: they sometimes shipped empty boxes, without the tube inside. This was due to the way the production line was set up, and people with experience in designing production lines will tell you how difficult it is to have everything happen with timings so precise that every single unit coming out of it is perfect 100% of the time. Small variations in the environment (which can’t be controlled in a cost-effective fashion) mean you must have quality assurance checks smartly distributed across the line so that customers all the way down the supermarket don’t get pissed off and buy someone else’s product instead.&lt;/p&gt;
&lt;p&gt;Understanding how important that was, the CEO of the toothpaste factory got the top people in the company together and they decided to start a new project, in which they would hire an external engineering company to solve their empty boxes problem, as their engineering department was already too stretched to take on any extra effort.&lt;/p&gt;
&lt;p&gt;The project followed the usual process: budget and project sponsor allocated, RFP, third-parties selected, and six months (and $8 million) later they had a fantastic solution — on time, on budget, high quality and everyone in the project had a great time. They solved the problem by using some high-tech precision scales that would sound a bell and flash lights whenever a toothpaste box weighing less than it should. The line would stop, and someone had to walk over and yank the defective box out of it, pressing another button when done.&lt;/p&gt;
&lt;p&gt;A while later, the CEO decides to have a look at the ROI of the project: amazing results! No empty boxes ever shipped out of the factory after the scales were put in place. Very few customer complaints, and they were gaining market share. “That’s some money well spent!” - he says, before looking closely at the other statistics in the report.&lt;/p&gt;
&lt;p&gt;It turns out, the number of defects picked up by the scales was 0 after three weeks of production use. It should’ve been picking up at least a dozen a day, so maybe there was something wrong with the report. He filed a bug against it, and after some investigation, the engineers come back saying the report was actually correct. The scales really weren’t picking up any defects, because all boxes that got to that point in the conveyor belt were good.&lt;/p&gt;
&lt;p&gt;Puzzled, the CEO travels down to the factory, and walks up to the part of the line where the precision scales were installed. A few feet before it, there was a $20 desk fan, blowing the empty boxes out of the belt and into a bin.&lt;/p&gt;
&lt;p&gt;“Oh, that — one of the guys put it there ’cause he was tired of walking over every time the bell rang”, says one of the workers.&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 21 Jul 2008 17:20:42 +0000</pubDate>
<feedburner:origLink>http://www.lixo.org/archives/2008/07/21/networks-are-smart-at-the-edges/</feedburner:origLink></item>
<item>
	<title>Simon Brunning: Happy Birthday me!</title>
	<guid isPermaLink="false">http://feeds.feedburner.com/2257@http://www.brunningonline.net/simon/blog/</guid>
	<link>http://feeds.feedburner.com/~r/PlanetTw/~3/341373799/002257.html</link>
	<description>&lt;p&gt;28 today!&lt;/p&gt;</description>
	<pubDate>Mon, 21 Jul 2008 09:01:06 +0000</pubDate>
<feedburner:origLink>http://feeds.feedburner.com/~r/SmallValuesOfCool/~3/341337945/002257.html</feedburner:origLink></item>
<item>
	<title>Brian Guthrie: GitHub, briefly</title>
	<guid isPermaLink="false">tag:blog.brianguthrie.com,:Article/364</guid>
	<link>http://feeds.feedburner.com/~r/PlanetTw/~3/341260057/github-briefly</link>
	<description>&lt;p&gt;I know that I’m late to the party here, that all of the cool kids have had accounts for what seems like Internet-decades, and that I can do nothing but add my voice belatedly to an already rapturous chorus; nevertheless, forgive my enthusiasm: GitHub rules, it is worth joining, and, once signed up, it took only a week for my workflow to be forever improved.  I am, in short, a believer.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;It’s never been easier or more convenient to contribute to other open source projects.&lt;/li&gt;
		&lt;li&gt;It’s never been easier to work remotely.&lt;/li&gt;
		&lt;li&gt;It’s never been easier to track the progress of projects and developers you’re interested in.&lt;/li&gt;
		&lt;li&gt;Unicorns!  Rainbows!  Puppies!&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Over the next few weeks I’ll gradually be migrating all of my projects over to it, and I encourage you to do the same.&lt;/p&gt;</description>
	<pubDate>Mon, 21 Jul 2008 06:03:45 +0000</pubDate>
<feedburner:origLink>http://blog.brianguthrie.com/articles/2008/07/21/github-briefly</feedburner:origLink></item>
<item>
	<title>Kris Kemper: Cognitive Benefit of TDD: Confirmation Driven Development?</title>
	<guid isPermaLink="false">http://blog.kriskemper.com/2008/07/20/cognitive-benefit-of-tdd-confirmation-driven-development/</guid>
	<link>http://feeds.feedburner.com/~r/PlanetTw/~3/340930030/</link>
	<description>&lt;p&gt;I recently read an blog post[1] describing a cognitive justification for test driven development. I think the topic is interesting. In doing TDD, there are a variety of reasons for why we write tests first, and it isn’t always to ensure correctness over time.&lt;/p&gt;
&lt;p&gt;Certainly, there are tests that are meant for ensure that changes don’t break earlier functionality. For instance, If I’m writing a sorting algorithm, unit tests will prevent it from not sorting at some point. If I use unit tests to assert the existence of explicit business rules against domain objects, I am trying to prevent those rules from being broken in the future.&lt;/p&gt;
&lt;p&gt;However, there is a behavioral point to TDD where a developer breaks down a larger goal into quickly attainable and testable tasks, and then completes each task in order to complete the larger goal. The tests provide a clear stopping point for the given task. Usually, writing automated tests allows us to recheck our previous tasks to ensure that we haven’t undone them. The automation of tests leverages the speed of computers to make rechecking those assertions faster and more reliably correct than a human could do it.&lt;/p&gt;
&lt;p&gt;There is an implied assumption here. The general assumption is that automation of those test will save us ti