<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Technikhil Writing</title>
	<atom:link href="http://technikhil.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://technikhil.wordpress.com</link>
	<description>Random musings - Sometimes technical - More often not</description>
	<lastBuildDate>Wed, 25 Jan 2012 16:35:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='technikhil.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Technikhil Writing</title>
		<link>http://technikhil.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://technikhil.wordpress.com/osd.xml" title="Technikhil Writing" />
	<atom:link rel='hub' href='http://technikhil.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Open source writing using Git</title>
		<link>http://technikhil.wordpress.com/2012/01/14/open-source-writing-using-git/</link>
		<comments>http://technikhil.wordpress.com/2012/01/14/open-source-writing-using-git/#comments</comments>
		<pubDate>Sat, 14 Jan 2012 05:30:19 +0000</pubDate>
		<dc:creator>technikhil</dc:creator>
				<category><![CDATA[Learning]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Github]]></category>
		<category><![CDATA[thinking]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[writing]]></category>
		<category><![CDATA[Writing process]]></category>

		<guid isPermaLink="false">http://technikhil.wordpress.com/?p=867</guid>
		<description><![CDATA[Of late I have noticed a trend &#8211; writers, especially technical writers, are embracing the software development process and incorporating it into their writing process. There&#8217;s a great podcast about this on Herding Code where some technical writers talk about &#8230; <a href="http://technikhil.wordpress.com/2012/01/14/open-source-writing-using-git/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technikhil.wordpress.com&amp;blog=111188&amp;post=867&amp;subd=technikhil&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Of late I have noticed a trend &#8211; writers, especially technical writers, are embracing the software development process and incorporating it into their writing process. There&#8217;s a great podcast about this on <a href="http://herdingcode.com/wp-trackback.php?p=342" target="_blank">Herding Code</a> where some technical writers talk about this trend.</p>
<p>Writers are embracing the agile philosophy of software development, one of the core tenets of this is to publish often and get feedback so you can improve/adjust. Authors are posting the content for their book projects online to get feedback &#8211; to the extent that publishers like <a href="http://www.manning.com/about/meap" target="_blank">Manning</a> and <a class="zem_slink" title="O'Reilly Media" href="http://shop.oreilly.com/category/roughcuts.do" rel="homepage" target="_blank">O&#8217;Reilly</a> offer programs that let people access to the book content as soon as the author creates it, for a discounted amount. The pioneers of this practice were the <a class="zem_slink" title="The Pragmatic Programmer" href="http://pragprog.com/frequently-asked-questions/beta-books" rel="homepage" target="_blank">Pragmatic Programmers</a> who offer &#8220;beta&#8221; versions of their books to customers at discounted prices. The idea behind this of course is that it lets authors get valuable feedback as to what is important, what to focus on. It also provides, authors with an incentive to keep from procrastinating about their writing.</p>
<p>Another major aspect of this trend is the embrace of <a class="zem_slink" title="Revision control" href="http://en.wikipedia.org/wiki/Revision_control" rel="wikipedia">source control</a> in the writing process. I think this is a great development, and it makes a lot of sense if you think about it.  The book writing process, like software development, is subject to a lot of chopping and changing as the book evolves. Also writing collaboratively on something is I imagine similar to writing code in a team and probably have the same issues &#8211;  one needs ways for multiple people to be able to work on the same document without worrying if they are overwriting someone else&#8217;s hard work. Finally, a version control provides you with a fine-grained backup that allows you to rewind and replay the evolution of the book, which should be invaluable during the editing process. If there is a conflict somewhere, version control also offers tools to detect and fix it in a safe manner.</p>
<p>Some authors have posted their content on <a class="zem_slink" title="GitHub" href="http://github.com" rel="homepage">Github</a>, which I think is an awesome idea.    Leveraging, the capabilities of a version control, especially a powerful and distributed one like <a class="zem_slink" title="Git (software)" href="http://git-scm.com" rel="homepage">Git</a> and Github, is well suited for writing projects. Authors can leverage the tools  and capabilities of Github  -</p>
<ul>
<li>On Github, feedback can easily be provided in the form of  commit notes, line notes, issues &#8211; heck you can even fork the project make the corrections and submit a pull request back to the author.</li>
<li>You can use Git as a fine grained distributed backup for your writing project that allows you to rollback specific portions of you project independently.</li>
<li>You can use the social features of Github to collaborate on the project and even drum up interest by distributing the link online.</li>
<li>You can maintain your code samples and other resources separately from your content and correct and upgrade them as needed. This can be very useful if the book is about specific technical frameworks that get upgraded after the book is completed and published.</li>
<li>Github even has a basic editor so you can work on your project online</li>
</ul>
<p>While browsing through Github for examples of books that use Github as a version control system for writers &#8211; I came across this <a href="https://github.com/schacon/git-scribe" target="_blank">tool</a> which is  in my mind a good first step, but I think there is a lot more that we can do to improve this experience. There are a whole lot of tools being built around this concept which is quite encouraging.</p>
<p>Writing and programming, have a lot in common. Both involve text, both are creative activities and both are ways to express ideas (one to a machine and the other to an audience) . There is scope for a lot of cross pollination of ideas between these fields. I think, currently the main challenge is a lack of knowledge and a fear of the technical nature of a tool like Git.</p>
<h4>Related links</h4>
<ul>
<li><a href="https://github.com/schacon/git-scribe" target="_blank">Git Scribe</a></li>
<li><a href="http://herdingcode.com/?p=342" target="_blank">On writing technical books</a></li>
<li><a href="https://github.com/arcturo/library" target="_blank">Arcturo ebooks on Github</a></li>
<li><a href="https://github.com/chromatic/modern_perl_book" target="_blank">Mordern Perl book on Github</a></li>
<li><a href="https://github.com/addyosmani/backbone-fundamentals" target="_blank">Backbone fundamentals on Github</a></li>
<li><a href="https://github.com/ManuelKiessling/NodeBeginnerBook" target="_blank">Node Beginner on Github</a></li>
</ul>
<br />Filed under: <a href='http://technikhil.wordpress.com/category/learning/'>Learning</a>, <a href='http://technikhil.wordpress.com/category/the-potential-the-passion/'>Open Source</a>, <a href='http://technikhil.wordpress.com/category/web-20/'>Web 2.0</a> Tagged: <a href='http://technikhil.wordpress.com/tag/git/'>Git</a>, <a href='http://technikhil.wordpress.com/tag/github/'>Github</a>, <a href='http://technikhil.wordpress.com/tag/thinking/'>thinking</a>, <a href='http://technikhil.wordpress.com/tag/tools/'>tools</a>, <a href='http://technikhil.wordpress.com/tag/writing/'>writing</a>, <a href='http://technikhil.wordpress.com/tag/writing-process/'>Writing process</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/technikhil.wordpress.com/867/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/technikhil.wordpress.com/867/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/technikhil.wordpress.com/867/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/technikhil.wordpress.com/867/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/technikhil.wordpress.com/867/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/technikhil.wordpress.com/867/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/technikhil.wordpress.com/867/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/technikhil.wordpress.com/867/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/technikhil.wordpress.com/867/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/technikhil.wordpress.com/867/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/technikhil.wordpress.com/867/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/technikhil.wordpress.com/867/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/technikhil.wordpress.com/867/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/technikhil.wordpress.com/867/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technikhil.wordpress.com&amp;blog=111188&amp;post=867&amp;subd=technikhil&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://technikhil.wordpress.com/2012/01/14/open-source-writing-using-git/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<georss:point>8.532389 76.955846</georss:point>
		<geo:lat>8.532389</geo:lat>
		<geo:long>76.955846</geo:long>
		<media:content url="http://1.gravatar.com/avatar/d6a8b31986a4ab92e7afd96ee89a96e4?s=96&#38;d=http%3A%2F%2Ftechnikhil.wordpress.com%2Fwp-content%2Fthemes%2Fpub%2Finuit-types%2Fimages%2Fgravatar.png" medium="image">
			<media:title type="html">technikhil</media:title>
		</media:content>
	</item>
		<item>
		<title>A Ruby on Rails glossary.</title>
		<link>http://technikhil.wordpress.com/2011/12/31/rails_glossary/</link>
		<comments>http://technikhil.wordpress.com/2011/12/31/rails_glossary/#comments</comments>
		<pubDate>Sat, 31 Dec 2011 13:30:35 +0000</pubDate>
		<dc:creator>technikhil</dc:creator>
				<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[Programming / Software]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[LinkedIn]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[web tools]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Tags]]></category>
		<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://technikhil.wordpress.com/?p=831</guid>
		<description><![CDATA[So it&#8217;s been about a year since I started working on the Ruby language in the context of the Rails framework. It&#8217;s been awesome,  the combination of Ruby&#8217;s developer friendly language style and the incredible productivity of the Rails framework makes &#8230; <a href="http://technikhil.wordpress.com/2011/12/31/rails_glossary/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technikhil.wordpress.com&amp;blog=111188&amp;post=831&amp;subd=technikhil&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>So it&#8217;s been about a year since I started working on the <a href="http://www.ruby-lang.org/en/about/" target="_blank">Ruby</a> language in the context of the <a href="http://rubyonrails.org/" target="_blank">Rails</a> framework. It&#8217;s been awesome,  the combination of Ruby&#8217;s developer friendly language style and the incredible productivity of the Rails framework makes this a killer framework for web applications. Building the basic code is simply a matter of typing in some commands that generate all the scaffolding of code needed for a basic website. The rest is usually a matter of tweaking and adding to the generated scaffold.</p>
<div>
<div class="wp-caption aligncenter" style="width: 510px"><a href="http://www.flickr.com/photos/14829735@N00/4833512699" target="_blank"><img class="zemanta-img-inserted zemanta-img-configured" title="The Evolution of Computer Programming Languages" src="http://technikhil.files.wordpress.com/2011/12/4833512699_761a3fcc61.jpg?w=500&#038;h=313" alt="The Evolution of Computer Programming Languages" width="500" height="313" /></a><p class="wp-caption-text">Image by dullhunk via Flickr</p></div>
</div>
<div></div>
<div>Like every web technology the Ruby on Rails framework has its own set of idioms, that one needs to get familiar with and since I am new to Ruby, for me this includes some Ruby idioms as well. I saw a <a href="http://broadcastingadam.com/2011/04/rails_glossary" target="_blank">post</a> today that lists a glossary of Rails terms and I thought I&#8217;d do my own. So here goes -</div>
<ol>
<li><strong>Application Servers</strong> &#8211; <a href="http://code.macournoyer.com/thin/" target="_blank">Thin</a>, <a href="http://en.wikipedia.org/wiki/Mongrel_(web_server)" target="_blank">Mongrel</a>, <a href="http://www.modrails.com/" target="_blank">Passenger</a>, <a href="http://unicorn.bogomips.org/" target="_blank">Unicorn</a>, <a href="http://pow.cx/" target="_blank">Pow</a> - These are application servers that run the Ruby web application and respond to the requests. They are generally integrated with a web-server like <a href="http://httpd.apache.org/" target="_blank">Apache</a> or <a href="http://nginx.org/en/" target="_blank">Nginx</a>, though Mongrel is technically capable of running on its own as a web-server (though since it is not multi-threaded this configuration is not useful for anything except for very light loads or on a development machine).</li>
<li><strong><a href="http://ar.rubyonrails.org/" target="_blank">Active Record</a></strong> &#8211; Active record is the <a href="http://en.wikipedia.org/wiki/Object-relational_mapping" target="_blank">ORM</a> tool used in the Rails framework to abstract the database handling. It is an implementation of the active record architectural pattern described by Martin Fowler thus &#8211; &#8220;An object that wraps a row in a database table or view, encapsulates the database access, and adds domain logic on that data.&#8221; The Active Record code is available as a separate gem that is downloaded as a dependency to Rails.</li>
<li><strong><a href="http://api.rubyonrails.org/files/activeresource/README_rdoc.html" target="_blank">Active Resource</a></strong> &#8211; A simple way to think of active resource is that it&#8217;s like active record but for REST based web-services. Active record provides a wrapper around REST actions providing a transparent proxy between a business entity and REST based web-services.</li>
<li><a href="http://as.rubyonrails.org/" target="_blank"><strong>Active Support</strong></a> &#8211; This is a set of utility classes and standard library extensions that are useful in Rails application development. It includes classes for dealing with caching, dates, time zones, text, etc. Like active record and active resource, active support is available as a separate gem that is installed as a dependency of the Rails gem.</li>
<li><strong><a href="http://gembundler.com/" target="_blank">Bundler</a></strong> - Bundler manages the gem dependencies of a ruby application in a repeatable way across multiple machines. It automatically looks for and installs / updates all the gems needed by the application when it is deployed on a machine. It can do this is a repeatable way across multiple machines and deployments.</li>
<li><strong><a href="http://en.wikipedia.org/wiki/Capistrano" target="_blank">Capistrano</a></strong> - Capistrano is a tool for executing command on groups of servers over SSH. It is used mainly in deploying web applications and is capable recognizing different types of server environment (like staging and production, etc).</li>
<li><a href="https://github.com/jnicklas/capybara" target="_blank"><strong>Capybara</strong></a> &#8211; This is an advanced version of the Webrat tool. It lets you do acceptance testing of applications using various drivers (Selenium and Rack are built-in) by simulating a real user hitting your web application.</li>
<li><a href="http://coffeescript.org/" target="_blank"><strong>CoffeeScript</strong></a> &#8211; Coffee-script is a little language that compiles into java-script. It has rapidly become very popular and has been included in Rails 3.1 as the default method of writing JavaScript code in a Rails application. I am personally a bit on the fence here but I like its terse syntax.</li>
<li><a href="http://cukes.info/" target="_blank"><strong>Cucumber</strong></a> - Cucumber lets software development teams describe how software should behave in plain text. The text is written in a business-readable DSL and serves as documentation, automated tests and development-aid &#8211; all rolled into one format. Cucumber along with RSpec are main tools used for the BDD methodology favored in many Rails projects.</li>
<li><a href="http://en.wikipedia.org/wiki/Domain-specific_language" target="_blank"><strong>DSL(Domain Specific Language)</strong></a> - A domain-specific language is a language dedicated to a particular domain or the representation of a particular problem or solution. DSL&#8217;s are more common than you think, some good examples in the Ruby being &#8211; Cucumber, Rake, Haml etc.</li>
<li><a href="http://www.ruby-doc.org/stdlib-1.9.3/libdoc/erb/rdoc/ERB.html" target="_blank"><strong>ERB (Embedded Ruby)</strong></a> - ERB is a simple and powerful templating system for Ruby. It is part of the Ruby core and it allows one to place ruby within other files (any text document).</li>
<li><a href="http://rubydoc.info/gems/factory_girl/1.3.3/frames" target="_blank"><strong>FactoryGirl</strong></a> &#8211; This is a gem that can be used for creating object factories in an automated fashion. This is useful in testing or even for populating an application when deployed</li>
<li><a href="http://docs.rubygems.org/shelf/index" target="_blank"><strong>Gem</strong></a> - At its most basic form, a Ruby gem is a package. It has the necessary files and information for being installed on the system. There is an online repository for Ruby gems at http://rubygems.org/ For me this is the biggest find and literally the &#8220;hidden gem&#8221; of my Ruby learning experience has been - <a href="http://docs.rubygems.org/read/book/7" target="_blank">Ruby Gems</a>.  It&#8217;s like having an <a href="http://en.wikipedia.org/wiki/App_Store" target="_blank">app-store</a> for your development needs, where most of the best gems are freely available to you!  The number of awesome, useful gems actually available to ruby developers means that we have a huge advantage over other frameworks. A testament to the power of Ruby gems has been that Microsoft has started its own package management library - <a href="http://nuget.org/" target="_blank">Nuget</a> which, seems to be simply a straight lift of the Ruby Gems concept, except of course they have incorporated it into the <a href="http://www.microsoft.com/visualstudio/en-us" target="_blank">Visual Studio</a> as an extension. Nuget was released by the same team that created the Microsoft version of Rails - <a href="http://www.asp.net/mvc" target="_blank">ASP.Net MVC</a> so you can see the Rails influence&#8230;</li>
<li><strong><a href="https://github.com/cucumber/gherkin" target="_blank">Gherkin</a></strong> - Gherkin is a <a href="http://en.wikipedia.org/wiki/Domain-specific_language" target="_blank">DSL</a>  that emerged from the <a href="http://cukes.info/" target="_blank">Cucumber</a> project. It was designed to succinctly describe behavior in a form that can be acted upon by a tool like Cucumber. It is described as business readable DSL and can be used in any project that has need of such a tool. The lexer and parser for the language has been create and the library is available in several frameworks including Ruby, JVM, Javascript (Node.js) and as a .NET dll.</li>
<li><strong><a href="http://git-scm.com/" target="_blank">Git</a></strong> - Git is a free and open source, distributed version control system. It was written by <a href="http://en.wikipedia.org/wiki/Linus_Torvalds" target="_blank">Linus Torvalds</a> to replace the old source control system for Linux and has become one of the tools of choice for a lot of Ruby projects. Git is typically used along with <a href="https://github.com/" target="_blank">Github</a> which is an online source control repository that leverages Git.</li>
<li><strong><a href="http://haml-lang.com/about.html" target="_blank">Haml</a></strong> - Haml is an HTML abstraction language. Haml functions as a replacement for inline page templating systems such as PHP, ASP, and ERB, the templating language used in most Ruby on Rails applications.</li>
<li><strong><a href="http://www.heroku.com/" target="_blank">Heroku</a></strong> - Heroku is a cloud based platform as a service (PaaS) which was one of the first to have Ruby and Rails support. One could build a Rails application and directly deploy it on Heroku without having to set up a web-server. The platform has evolved to support multiple languages including Java, Scala, Node.js, Clojure and Python.</li>
<li><a href="http://jquery.com/" target="_blank"><strong>jQuery</strong></a> - jQuery has become the JavaScript framework of choice for web developers everywhere. It is a fast, framework that leverages CSS style selectors to allow developers to traverse, animate and handle events in the HTML DOM while abstracting browser specific quirks as far as possible. It has become so popular that it displaces Prototype as the default JavaScript framework used in Rails 3 applications.</li>
<li><a href="http://memcached.org/" target="_blank"><strong>Memcached</strong></a> &#8211; A distributed open source caching system, memcached is an in-memory key-value store for small chunks of arbitrary data (strings, objects) from results of database calls, API calls, or page rendering. It is a generic store and can be used in any situation where caching is needed and is available in multiple languages and technologies. It is used in a lot of Rails applications even though today, other object stores like Redis are getting popular.</li>
<li><a href="http://www.merbivore.com/" target="_blank"><strong>Merb</strong></a> - Like Ruby on Rails, Merb is an MVC framework. But, it a lighter and more barebones version. I haven&#8217;t used Merb &#8211; I&#8217;d love it if someone could give a more apt description of what Merb is and how it compares to Rails and Sinatra.</li>
<li><strong>Open classes / Monkey Patching</strong> - Open classes is a feature of the Ruby language where you can simply open and add methods to existing classes. Active support library uses this feature to add a lot of its helper functions on the Ruby core classes like string. A popular name for this particular practice is &#8220;Monkey Patching&#8221;.</li>
<li><strong><a href="https://github.com/thoughtbot/paperclip" target="_blank">Paperclip</a></strong> &#8211; Its a complete (and easy) file attachment library for active record. It provides validation features based on the properties of the file like size, type, etc. The files themselves are saved in the filesystem. It has some basic image manipulation features as well, like creating thumbnails etc. There is a dependency on the ImageMagick library (an awesome image manipulation library) in order to use Paperclip.</li>
<li><a href="http://www.prototypejs.org/" target="_blank"><strong>Prototype</strong></a> - Prototype is a JavaScript Framework that aims to ease development of dynamic web applications. It was originally the default JavaScript framework bundled with Rails.</li>
<li><a href="http://rack.rubyforge.org/" target="_blank"><strong>Rack</strong></a> -  Rack is a gem that provides a simple interface between a web-server and the Ruby web framework. Rack is used in various Ruby web frameworks, like Rails, Sinatra and Merb.</li>
<li><a href="http://rake.rubyforge.org/" target="_blank"><strong>Rake</strong></a> &#8211; Rake is the ruby version of make but much more developer friendly. It provides capabilities that are similar to make but it uses the Ruby syntax instead of XML files or makefile syntax to define tasks.</li>
<li><a href="http://en.wikipedia.org/wiki/Representational_state_transfer" target="_blank"><strong>REST(Representational State Transfer)</strong></a> - REST is a set of principles that define how Web standards, such as HTTP and URIs, are supposed to be used. Well, actually REST as a concept is more abstract than that &#8211; its architectural style that can be applied to distributed systems. REST in the context of Rails, mainly is used to refer to the way Rails exploits REST concepts in the way that Rails web applications are structured.</li>
<li><a href="http://api.rubyonrails.org/v2.3.8/classes/ActionView/Helpers/PrototypeHelper/JavaScriptGenerator/GeneratorMethods.html" target="_blank"><strong>RJS(Ruby JavaScript)</strong></a> - It is a ruby helper used to generate JavaScript that are used to decorate HTML pages. It is used mainly in AJAX calls, and in situations where you wanted to conditionally emit JavaScript. The general opinion though was that it sucked and was avoided in favor of the unobtrusive style of jQuery.</li>
<li><strong><a href="http://guides.rubyonrails.org/routing.html" target="_blank">Routing</a></strong> - Routing is the aspect of the Rails web application that deals with the translation of a URL request to a specific action in the application. In Rails, it is the job of the router to recognize URLs and dispatch them to a controller’s action. It can also generate paths and URLs, avoiding the need for hardcoded strings in your views.</li>
<li><a href="https://www.relishapp.com/rspec" target="_blank"><strong>RSpec</strong></a> - RSpec is a Behaviour-Driven Development tool for Ruby programmers. RSpec helps you do the TDD part of that equation, focusing on the documentation and design aspects of TDD. Like Cucumber RSpec uses a DSL to simplify design and implementation tests.</li>
<li><a href="http://bashdb.sourceforge.net/ruby-debug.html" target="_blank"><strong>Ruby Debug</strong></a> - Just like it says on the tin &#8211; it is a debugger for ruby applications. Like the other tools it is gem that can be installed and can run your ruby application in debug mode.</li>
<li><a href="http://beginrescueend.com/" target="_blank"><strong>RVM(Ruby Version Manager)</strong></a> &#8211; This is an awesome tool from Wayne Seguin that is used to install, manage and work with multiple versions of the Ruby programming language on your machine. It even allows you to segregate your gems so you could work with multiple versions of the same gem for different applications.</li>
<li><a href="http://sass-lang.com/" target="_blank"><strong>SASS &amp; SCSS</strong></a> - These are CSS abstraction languages (I believe SCSS is a reference to the version that supports CSS3). They are compiled down to CSS. They allow you use variables, modules and include other files. I am not very familiar with them and would welcome more information from readers.</li>
<li><a href="http://www.sinatrarb.com/" target="_blank"><strong>Sinatra</strong></a> - From the website - &#8221;Sinatra is a DSL for quickly creating web applications in Ruby with minimal effort.&#8221; Like Merb, Sinatra is a minimalist web framework. Again, like Merb, I haven&#8217;t used Sinatra at all and would welcome some comments to flesh out this entry.</li>
<li><a href="http://test-unit.rubyforge.org/" target="_blank"><strong>Test::Unit</strong></a> - This is the default testing library available with Ruby. It is from the xUnit family of testing frameworks and is a part of the core Ruby libraries. It is mostly not used in favor of more powerful BDD style tools like RSpec.</li>
<li><a href="https://github.com/rails/jquery-ujs" target="_blank"><strong>UJS(Unobtrusive Javascript)</strong></a>- &#8221;Unobtrusive JavaScript&#8221; is a general approach to the use of JavaScript in web pages. The general principles of this approach includes -
<ol>
<li>Separation of behavior from the markup &#8211; The HTML in a document is meant to describe the structure of the document and should not contain programmatic elements in it. This is similar to the principle of separation of the structure from the presentation of the document when talking about the separation of CSS and HTML.</li>
<li>Should not pollute the global namespace &#8211; UJS code should add as little as possible to the global object or global namespace of the environment in which it runs.</li>
<li>Degrade gracefully &#8211; If the browser rendering the document does not have the capability needed the code should be able to degrade gracefully without breaking the rest of the application.</li>
</ol>
</li>
<li><strong><a href="http://www.vim.org/" target="_blank">Vim</a></strong> &#8211; IMO Vim, the text editor that just celebrated its 20th anniversary in 2011 has experienced a resurgence of sorts with the rise of Ruby and Rails. In fact there is a large number of Vim plugins that have been created to make developers even more productive and happy on this text editor. Indeed after Textmate (the other favored tool for Rails developers) I think Vim has the biggest following among Rails developers and the fact that its available even on Linux and Windows only makes it cooler&#8230;</li>
<li><strong>Web Servers</strong> &#8211; <a href="http://httpd.apache.org/" target="_blank">Apache</a>, <a href="http://nginx.org/en/" target="_blank">nginx</a>, <a href="http://www.lighttpd.net/" target="_blank">Lighthttpd</a> , <a href="http://code.macournoyer.com/thin/" target="_blank">Thin</a> - In the Rails world web servers options include Apache, nginx and lighty(lighthttpd) of which Apache is by far the most popular. I have included Thin in this list as well since it includes both a web-server and an application server. With advent of PaaS providers like Heroku, this particular aspect of web application development is becoming abstracted out, just as the database is getting abstracted on the other end.</li>
<li><a href="https://github.com/brynary/webrat/wiki" target="_blank"><strong>Webrat</strong></a> &#8211; This is a headless browser that is used in web application testing. It lets you run in browser test without the associated overhead of actually instantiating a browser. This does not execute any JavaScript but is great for doing tests of simple websites without much JS interactions.</li>
<li><strong><a href="https://github.com/mislav/will_paginate" target="_blank">Will_Paginate</a></strong> &#8211; This is the most popular pagination library out there for Ruby on Rails. It alos supports other Ruby web frameworks like Sinatra and Merb. This gem has a wide variety of <a href="http://mislav.uniqpath.com/will_paginate/" target="_blank">formatting options</a> and can accept an active record object or even a simple array. It is quite configurable and can be easily extended to do AJAX pagination as well.</li>
</ol>
<p>So, that&#8217;s all the terms that I can think of so far, I&#8217;ll try to add to this as and when I come across more terms. Nowadays, web development is more than a single framework, even one like Rails.  I have found the Rails community is more open and embracing of different ideas and frameworks &#8211; even to the extent of moving away from Rails and using lightweight frameworks like Sinatra. IMO that makes this glossary all the more relevant and fun.</p>
<p>As I have mentioned in the article I don&#8217;t profess to be an expert about or have even used all the tools and technologies listed above. I would love to get your comments and suggestions on what could be added.</p>
<p>And last but not the least &#8211; I wish you all an awesome 2012 &#8211; may all your efforts bear fruit this year.</p>
<p><strong>Update (Jan 12 &#8211; 2012) : </strong>Since there has been some interest in this post, I have added a few more entries and provide more information where I can &#8211; stay tuned :-)</p>
<br />Filed under: <a href='http://technikhil.wordpress.com/category/learning/'>Learning</a>, <a href='http://technikhil.wordpress.com/category/the-potential-the-passion/'>Open Source</a>, <a href='http://technikhil.wordpress.com/category/programming-software/'>Programming / Software</a>, <a href='http://technikhil.wordpress.com/category/web-20/'>Web 2.0</a> Tagged: <a href='http://technikhil.wordpress.com/tag/linkedin/'>LinkedIn</a>, <a href='http://technikhil.wordpress.com/tag/programming/'>programming</a>, <a href='http://technikhil.wordpress.com/tag/rails/'>Rails</a>, <a href='http://technikhil.wordpress.com/tag/ruby/'>Ruby</a>, <a href='http://technikhil.wordpress.com/tag/tags/'>Tags</a>, <a href='http://technikhil.wordpress.com/tag/web-development/'>Web Development</a>, <a href='http://technikhil.wordpress.com/tag/web-tools/'>web tools</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/technikhil.wordpress.com/831/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/technikhil.wordpress.com/831/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/technikhil.wordpress.com/831/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/technikhil.wordpress.com/831/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/technikhil.wordpress.com/831/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/technikhil.wordpress.com/831/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/technikhil.wordpress.com/831/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/technikhil.wordpress.com/831/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/technikhil.wordpress.com/831/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/technikhil.wordpress.com/831/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/technikhil.wordpress.com/831/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/technikhil.wordpress.com/831/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/technikhil.wordpress.com/831/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/technikhil.wordpress.com/831/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technikhil.wordpress.com&amp;blog=111188&amp;post=831&amp;subd=technikhil&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://technikhil.wordpress.com/2011/12/31/rails_glossary/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<georss:point>8.532389 76.955846</georss:point>
		<geo:lat>8.532389</geo:lat>
		<geo:long>76.955846</geo:long>
		<media:content url="http://1.gravatar.com/avatar/d6a8b31986a4ab92e7afd96ee89a96e4?s=96&#38;d=http%3A%2F%2Ftechnikhil.wordpress.com%2Fwp-content%2Fthemes%2Fpub%2Finuit-types%2Fimages%2Fgravatar.png" medium="image">
			<media:title type="html">technikhil</media:title>
		</media:content>

		<media:content url="http://technikhil.files.wordpress.com/2011/12/4833512699_761a3fcc61.jpg" medium="image">
			<media:title type="html">The Evolution of Computer Programming Languages</media:title>
		</media:content>
	</item>
		<item>
		<title>The loneliness of the software tester</title>
		<link>http://technikhil.wordpress.com/2011/10/20/the-loneliness-of-the-software-tester/</link>
		<comments>http://technikhil.wordpress.com/2011/10/20/the-loneliness-of-the-software-tester/#comments</comments>
		<pubDate>Thu, 20 Oct 2011 16:22:27 +0000</pubDate>
		<dc:creator>technikhil</dc:creator>
				<category><![CDATA[Programming / Software]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[LinkedIn]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Software testing]]></category>

		<guid isPermaLink="false">http://technikhil.wordpress.com/?p=663</guid>
		<description><![CDATA[Sometime back my favorite podcast Radiolab &#8211; released a short called &#8220;The Loneliness of the Goalkeeper&#8221; . The short was a re-broadcast of an english show on football (soccer) and the role of the goalkeeper in the game. In soccer &#8230; <a href="http://technikhil.wordpress.com/2011/10/20/the-loneliness-of-the-software-tester/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technikhil.wordpress.com&amp;blog=111188&amp;post=663&amp;subd=technikhil&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Sometime back my favorite podcast <a href="http://www.radiolab.org/" target="_blank">Radiolab</a> &#8211; released a short called &#8220;<a href="http://www.radiolab.org/blogs/radiolab-blog/2011/feb/08/radiolab-presents-loneliness-goalkeeper/" target="_blank">The Loneliness of the Goalkeeper</a>&#8221; . The short was a re-broadcast of an english show on football (soccer) and the role of the goalkeeper in the game.</p>
<p>In soccer the goalkeeper plays a truly unique role &#8211; the opposite to the role of the remaining 10 players in the team and indeed one could argue the aim of a game of football. The goal keeper has to defend the net and prevent a goal being scored.</p>
<p>Of course, the other players in his team also help him in defending the net, but there are few differences that make the goalkeepers stand apart. The primary one, of course, is that he is allowed to use any part of his body to handle the ball during the play in a restricted area in front of the net &#8211; the penalty area. If the ball enters the net &#8211; even if it is through a mistaken strike, an ill-conceived pass or fumble from him or his own team &#8211; the goal counts against the team&#8230;</p>
<p>This means that a goalkeeper rarely ventures outside the penalty area &#8211; he is the last line of defense to prevent the ball from getting into the net. This is the loneliness of the goalkeeper &#8211; he is ultimately responsible for any goal and must protect the net from all comers &#8211; friend or foe&#8230;</p>
<div class="zemanta-img">
<div class="wp-caption aligncenter" style="width: 310px"><a href="http://commons.wikipedia.org/wiki/File:U20-WorldCup2007-Okotie-Onka_edit2.jpg"><img class="zemanta-img-configured" title="Austrian Forward Rubin Okotie tries to score o..." src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/63/U20-WorldCup2007-Okotie-Onka_edit2.jpg/300px-U20-WorldCup2007-Okotie-Onka_edit2.jpg" alt="Austrian Forward Rubin Okotie tries to score o..." width="300" height="200" /></a><p class="wp-caption-text">Image via Wikipedia</p></div>
</div>
<p>The narrator of the piece goes on exploring the mental make-up of goalkeepers &#8211; the strange almost contrary nature that is needed to be a great goalkeeper. There is a subtle psychological difference in the mindset, brought on by the role of the goalkeeper. A goalkeeper does not have a single moment of triumph, there are only moments of disaster&#8230;  A goalkeeper&#8217;s mistakes are obvious and public while his success is not. After all &#8211; a goalkeeper who manages to prevent the opposition from scoring the entire game has simply done his job while a striker that scores that final goal takes his team to victory or saves them from defeat &#8211; is the hero!</p>
<p>As I listened to the podcast, I was struck by the similarities between the role of the goalkeeper and the role of a software tester. Unlike the rest of the team, the goalkeeper&#8217;s motive is to prevent a goal being scored &#8211; similarly the aim of a software tester is to find defects in code that is created by the team. In a way the software testing role requires an almost opposite mindset to that of a software developer, who wants to build a working product.</p>
<p>It is preached everywhere that a good programmer tests his code. Indeed nowadays it is a given that software should be written test first and the agile philosophy embraces this as a core tenet. I think the concept of <a href="http://en.wikipedia.org/wiki/Test-driven_development" target="_blank">TDD</a> is brilliant and that it promotes good coding habits. But I think in all the hype there is one point that has for a long time not been emphasized and that is the writing code in the test driven style does not mean that your code will be defect free.</p>
<p>I have seen a lot of people claim that they write their code test first as if that somehow means that they don&#8217;t need to test it. This assumption then leads to an impression that all one needs to do for getting defect free code is to embrace the <a href="http://en.wikipedia.org/wiki/Test-driven_development" target="_blank">test driven development</a> style. However what people don&#8217;t consider is that when a developer sits down to write code , he does so in a certain context. Code does not exist in a vacuum, it needs to interact with other code and in many cases the code itself might be a small section of a module of a feature in a platform.</p>
<p>The tests referred to in <a href="http://en.wikipedia.org/wiki/Test-driven_development" target="_blank">TDD</a> are simply the ones that validate the requirements for the code that you are writing at that point of time. These are unit tests and do not test the software product &#8211; only the code being written is to be tested. Writing tests for even that narrow scope requires a mental shift. Programmers who are used to simply writing code (and I count myself as one this group) find this mental shift a pretty big hurdle. It is really hard to force yourself to sit down and think of the requirement and then do the coding and writing the tests needed to validate it (especially if you have a deadline or worse a manager breathing down your neck). And after you do all that, you find yourself having to mock the environment around your code and tests to get them to run consistently (or at all). Sometimes it is simply not feasible/cost-effective or even necessary, to write tests that cover every error that your code might meet. To tie this back to the football analogy, I would consider that software developers can make at the most -  defenders of the goal. They are restricted both by their role and by their mindset from being able to truly subject software to the test.</p>
<p>In contrast, a software tester approaches things from a totally different perspective. The role of the software tester is to find defects &#8211; it is his goal and his responsibility is to the quality of the software product as a whole. Testers approach software from a product perspective and not a code perspective. They look at the entire product, its various layers and the seams in the code, where the different features come together &#8211; and then look for defects. They write code (in fact I think good software testers need to write as much code as developers) to probe the product from various angles. Software testers need to test the various modules, individually and in combination and using different types of input.</p>
<p>Testing is a matter of diligence &#8211; the sheer focus needed to go through all the combinatorial options for all the inputs and apis available in a typical software product requires an intense mental focus and very tidy and organized mind. It is this mental makeup that make great software testers. It is not easy to find people with such a unique mindset &#8211; in fact I was reading the other day of a <a href="http://www.seattlepi.com/news/article/Company-hires-adults-with-autism-to-test-software-2180941.php" target="_blank">startup company</a> that hires autistic people for software testing. Traits that make great software testers &#8211; intense focus, comfort with repetition, memory for detail &#8211; also happen to be characteristics of autism.</p>
<p>The role of a software tester is a lonely one &#8211; it is not something that will endear you with developers &#8211; after all you are pointing out defects in the code they wrote. If the software product fails the responsibility of failing to find the defect falls on the software tester. If the software tester does his job well and all the defects in a software product are fixed &#8211; he has merely done his job. Indeed if he does his job too well, and there are no defects to fix people will start wondering if there is a need for the role at all&#8230;</p>
<p>Like the goalkeeper &#8211; the software tester has a lonely job, but a vital one &#8211; he is the last line of defense &#8211; the responsibility of the overall quality of the software product lies with him. Software developers may have written the code for a killer feature but it is the software tester that ensures that it enhances the software product instead of breaking it&#8230;.</p>
<p><span class="Apple-style-span" style="font-weight:bold;">Related articles</span></p>
<ul class="zemanta-article-ul">
<li class="zemanta-article-ul-li"><a href="http://www.radiolab.org/blogs/radiolab-blog/2011/feb/08/radiolab-presents-loneliness-goalkeeper/" target="_blank">Radio Lab Presents: The Loneliness of the Goalkeeper</a></li>
<li class="zemanta-article-ul-li"><a href="http://r.zemanta.com/?u=http%3A//www.ctv.ca/CTVNews/Health/20110921/autism-software-testers-110921/&amp;a=55758322&amp;rid=00000001-b254-000F-0000-000000000297&amp;e=39906dfc6caad32b41e3a4b9a8f01b93">U.S. firm harnesses talents of young adults with autism</a> (ctv.ca)</li>
<li class="zemanta-article-ul-li"><a href="http://www.seattlepi.com/news/article/Company-hires-adults-with-autism-to-test-software-2180941.php">Startup Company Succeeds at Hiring Autistic Adults to Test Software</a> (seattlepi.com)</li>
</ul>
<br />Filed under: <a href='http://technikhil.wordpress.com/category/programming-software/'>Programming / Software</a>, <a href='http://technikhil.wordpress.com/category/software-engineering/'>Software Engineering</a> Tagged: <a href='http://technikhil.wordpress.com/tag/linkedin/'>LinkedIn</a>, <a href='http://technikhil.wordpress.com/tag/software-development/'>Software Development</a>, <a href='http://technikhil.wordpress.com/tag/software-testing/'>Software testing</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/technikhil.wordpress.com/663/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/technikhil.wordpress.com/663/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/technikhil.wordpress.com/663/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/technikhil.wordpress.com/663/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/technikhil.wordpress.com/663/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/technikhil.wordpress.com/663/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/technikhil.wordpress.com/663/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/technikhil.wordpress.com/663/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/technikhil.wordpress.com/663/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/technikhil.wordpress.com/663/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/technikhil.wordpress.com/663/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/technikhil.wordpress.com/663/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/technikhil.wordpress.com/663/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/technikhil.wordpress.com/663/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technikhil.wordpress.com&amp;blog=111188&amp;post=663&amp;subd=technikhil&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://technikhil.wordpress.com/2011/10/20/the-loneliness-of-the-software-tester/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<georss:point>8.532389 76.955846</georss:point>
		<geo:lat>8.532389</geo:lat>
		<geo:long>76.955846</geo:long>
		<media:content url="http://1.gravatar.com/avatar/d6a8b31986a4ab92e7afd96ee89a96e4?s=96&#38;d=http%3A%2F%2Ftechnikhil.wordpress.com%2Fwp-content%2Fthemes%2Fpub%2Finuit-types%2Fimages%2Fgravatar.png" medium="image">
			<media:title type="html">technikhil</media:title>
		</media:content>

		<media:content url="http://upload.wikimedia.org/wikipedia/commons/thumb/6/63/U20-WorldCup2007-Okotie-Onka_edit2.jpg/300px-U20-WorldCup2007-Okotie-Onka_edit2.jpg" medium="image">
			<media:title type="html">Austrian Forward Rubin Okotie tries to score o...</media:title>
		</media:content>
	</item>
		<item>
		<title>Needing an IDE should be considered a language smell</title>
		<link>http://technikhil.wordpress.com/2011/09/11/needing-an-ide-should-be-considered-a-language-smell/</link>
		<comments>http://technikhil.wordpress.com/2011/09/11/needing-an-ide-should-be-considered-a-language-smell/#comments</comments>
		<pubDate>Sun, 11 Sep 2011 13:15:31 +0000</pubDate>
		<dc:creator>technikhil</dc:creator>
				<category><![CDATA[Programming / Software]]></category>
		<category><![CDATA[Integrated development environment]]></category>
		<category><![CDATA[LinkedIn]]></category>
		<category><![CDATA[Microsoft Visual Studio]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[TextMate]]></category>

		<guid isPermaLink="false">https://technikhil.wordpress.com/?p=657</guid>
		<description><![CDATA[I&#8217;m a long time Visual Studio .Net (VS.Net) user &#8211; I have worked on the Microsoft .Net platform for a long time and have used the VS.Net tool during that time as my primary integrated development environment (IDE). It&#8217;s an &#8230; <a href="http://technikhil.wordpress.com/2011/09/11/needing-an-ide-should-be-considered-a-language-smell/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technikhil.wordpress.com&amp;blog=111188&amp;post=657&amp;subd=technikhil&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m a long time Visual Studio .Net (<a href="http://msdn.microsoft.com/en-us/vstudio/aa718325" target="_blank">VS.Net</a>) user &#8211; I have worked on the <a href="http://msdn.microsoft.com/en-us/netframework/" target="_blank">Microsoft .Net</a> platform for a long time and have used the <a href="http://msdn.microsoft.com/en-us/vstudio/aa718325" target="_blank">VS.Net</a> tool during that time as my primary integrated development environment (<a href="http://en.wikipedia.org/wiki/Integrated_development_environment" target="_blank">IDE</a>). It&#8217;s an awesome tool that has got better as the <a href="http://msdn.microsoft.com/en-us/netframework/" target="_blank">.Net</a> platform progressed and matured with awesome features like code-completion (one of the first <a href="http://en.wikipedia.org/wiki/Integrated_development_environment" target="_blank">IDE</a>s that had this), interactive debugging, refactoring and one of the most comprehensive documentation tools (<a href="http://msdn.microsoft.com/en-us/" target="_blank">MSDN</a>) in the business.</p>
<p>What was frustrating, however, was that to write a simple program, I needed to fire up <a href="http://msdn.microsoft.com/en-us/vstudio/aa718325" target="_blank">VS.Net</a> (which is this huge beast of a program that used a lot of resources). On the other hand writing your code in <a href="http://en.wikipedia.org/wiki/Notepad_(software)" target="_blank">Notepad</a> and then compiling and linking from the command line while interesting was, in my opinion, not practical. I found myself looking for the code completion features and searching Google for <a href="http://msdn.microsoft.com/en-us/vcsharp/aa336809" target="_blank">C#</a> keywords and <a href="http://msdn.microsoft.com/en-us/netframework/" target="_blank">.Net</a> API syntax. Using <a href="http://en.wikipedia.org/wiki/Notepad_(software)" target="_blank">Notepad</a> seemed too difficult so I tried to compromise and I started looking at other “lighter” <a href="http://en.wikipedia.org/wiki/Integrated_development_environment" target="_blank">IDE</a>s like <a href="http://sharpdevelop.net/opensource/sd/" target="_blank">Sharp Develop</a>, <a href="http://www.activestate.com/komodo-edit" target="_blank">Komodo Edit</a> and <a href="http://monodevelop.com/" target="_blank">Mono Develop</a> to deal with this problem. But that meant having to learn my way around the new <a href="http://en.wikipedia.org/wiki/Integrated_development_environment" target="_blank">IDE</a> with different keyboard shortcuts and user interfaces. The mental switching needed to work on another <a href="http://en.wikipedia.org/wiki/Integrated_development_environment" target="_blank">IDE</a> was too high a barrier and despite several half-hearted tries I always found myself going back to <a href="http://msdn.microsoft.com/en-us/vstudio/aa718325" target="_blank">VS.Net</a>. The massive footprint of <a href="http://msdn.microsoft.com/en-us/vstudio/aa718325" target="_blank">VS.Net</a> was something I decided to ignore to avail myself of the many tools that made coding in <a href="http://msdn.microsoft.com/en-us/vcsharp/aa336809" target="_blank">C#</a> easy.</p>
<p>Recently, I changed jobs and suddenly I was on <a href="http://en.wikipedia.org/wiki/Linux" target="_blank">Linux</a> and programming in <a href="http://www.ruby-lang.org/en/" target="_blank">Ruby</a>. I was apprehensive and I searched hard to find a replacement for <a href="http://msdn.microsoft.com/en-us/vstudio/aa718325" target="_blank">VS.Net</a>. I found <a href="http://www.eclipse.org/">Eclipse</a> to be a bit too bulky and heavy, it was too much like <a href="http://msdn.microsoft.com/en-us/vstudio/aa718325" target="_blank">VS.Net</a> &#8211; resource hungry :-) <a href="http://netbeans.org/">Net Beans</a> looked promising but then its community decided that <a href="http://netbeans.org/community/news/show/1507.html">Ruby and Rails support was not a priority</a> which disqualified it for me. After some more looking I concluded that the Linux way seemed to be to use general purpose text editors like <a href="http://www.vim.org/" target="_blank">Vim</a> and <a href="http://www.gnu.org/software/emacs/" target="_blank">Emacs</a> and customize them to ones specific needs.</p>
<p>Faced with coding without &#8211;  “gasp” &#8211; a proper enterprise <a href="http://en.wikipedia.org/wiki/Integrated_development_environment" target="_blank">IDE</a> and having to learn <a href="http://www.vim.org/" target="_blank">Vim</a> or <a href="http://www.gnu.org/software/emacs/" target="_blank">Emacs</a> &#8211; I decided to start of with a simpler text editor first. After looking around a bit more I settled on <a href="http://redcareditor.com/" target="_blank">Red Car</a> which is a <a href="http://jruby.org/" target="_blank">JRuby</a> open source editor that was copying <a href="http://macromates.com/" target="_blank">TextMate</a> (which I had heard was the editor that all the hip <a href="http://www.ruby-lang.org/en/" target="_blank">Ruby</a> people used) and resigned myself to a drop in my productivity&#8230;</p>
<p>Surprisingly though this did not turn out to be the case. I was certainly writing less code but amazingly I was still more productive in <a href="http://www.ruby-lang.org/en/" target="_blank">Ruby</a> and <a href="http://rubyonrails.org/" target="_blank">Rails</a> than I was in <a href="http://msdn.microsoft.com/en-us/vcsharp/aa336809" target="_blank">C#</a> and <a href="http://www.asp.net/" target="_blank">ASP.NET</a> in terms of the amount of work done. Despite the lack of an <a href="http://en.wikipedia.org/wiki/Integrated_development_environment" target="_blank">IDE</a>, I found the <a href="http://www.ruby-lang.org/en/" target="_blank">Ruby</a> syntax to be concise and extremely expressive (I have a separate <a title="Thoughts on Ruby – I think it’s great…" href="http://technikhil.wordpress.com/2011/06/01/thoughts-on-ruby-i-think-its-great/">post</a> on what I love about <a href="http://www.ruby-lang.org/en/" target="_blank">Ruby</a>) which made it easy to code without having to resort to code completion or similar niceties. More importantly I found reading and understanding code in <a href="http://www.ruby-lang.org/en/" target="_blank">Ruby</a> to be vastly easier than <a href="http://msdn.microsoft.com/en-us/vcsharp/aa336809" target="_blank">C#</a> and I found myself not needing the features provided by <a href="http://msdn.microsoft.com/en-us/vstudio/aa718325" target="_blank">VS.Net</a> to get a mental model of the code base.</p>
<p>The more I worked with <a href="http://www.ruby-lang.org/en/" target="_blank">Ruby</a>, the more I liked this way of working and I had a personal epiphany about programming language design. Some languages like <a href="http://msdn.microsoft.com/en-us/vcsharp/aa336809" target="_blank">C#</a> or <a href="http://msdn.microsoft.com/en-us/vbasic/ms789056" target="_blank">VB.Net</a>, forced you to have a <a href="http://en.wikipedia.org/wiki/Integrated_development_environment" target="_blank">IDE</a> just to be able to code in them, while others like <a href="http://www.ruby-lang.org/en/" target="_blank">Ruby</a> let you simply code. This is because coding in a language like <a href="http://msdn.microsoft.com/en-us/vcsharp/aa336809" target="_blank">C#</a> involves a lot of ceremony &#8211; you needed to write a lot of stuff to help the compiler understand the code &#8211; while <a href="http://www.ruby-lang.org/en/" target="_blank">Ruby</a> tries to get out of your way and just let you code. The terseness and expressiveness of languages like <a href="http://www.ruby-lang.org/en/" target="_blank">Ruby</a> allow programmers to easily keep larger amounts of functionality in their head.</p>
<p>This particular characteristic of languages should be recognized as a smell &#8211; just like a code smell&#8230; If you find yourself firing up an <a href="http://en.wikipedia.org/wiki/Integrated_development_environment" target="_blank">IDE</a> as the first step, when you want to write or read a program in a particular language, that is a language smell. It indicates that the language is probably not at the right level of expressiveness for the problem it is trying to solve. To be clear, this particular postulate should be considered in terms of the language design and of course should not be the only way to choose a language. But, it certainly should be an important consideration, IMO,  especially since the language you choose will be something that you will be something you are going to spend most of your waking hours using and more importantly trying to understand.</p>
<p>I think if you come in at the start of your day and it takes you less time to load your code, read and understand what you have written and get into your coding zone, you are definitely going to be more productive, than if you have to fire up a program, wait for a while for it to load and then jump around several files to get your mental model back in your head to start coding. And if you have chosen the language you are using wisely, you will be more productive and in my case a lot happier as well.</p>
<br />Filed under: <a href='http://technikhil.wordpress.com/category/programming-software/'>Programming / Software</a> Tagged: <a href='http://technikhil.wordpress.com/tag/integrated-development-environment/'>Integrated development environment</a>, <a href='http://technikhil.wordpress.com/tag/linkedin/'>LinkedIn</a>, <a href='http://technikhil.wordpress.com/tag/microsoft-visual-studio/'>Microsoft Visual Studio</a>, <a href='http://technikhil.wordpress.com/tag/programming/'>programming</a>, <a href='http://technikhil.wordpress.com/tag/ruby/'>Ruby</a>, <a href='http://technikhil.wordpress.com/tag/textmate/'>TextMate</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/technikhil.wordpress.com/657/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/technikhil.wordpress.com/657/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/technikhil.wordpress.com/657/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/technikhil.wordpress.com/657/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/technikhil.wordpress.com/657/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/technikhil.wordpress.com/657/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/technikhil.wordpress.com/657/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/technikhil.wordpress.com/657/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/technikhil.wordpress.com/657/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/technikhil.wordpress.com/657/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/technikhil.wordpress.com/657/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/technikhil.wordpress.com/657/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/technikhil.wordpress.com/657/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/technikhil.wordpress.com/657/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technikhil.wordpress.com&amp;blog=111188&amp;post=657&amp;subd=technikhil&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://technikhil.wordpress.com/2011/09/11/needing-an-ide-should-be-considered-a-language-smell/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<georss:point>8.532389 76.955846</georss:point>
		<geo:lat>8.532389</geo:lat>
		<geo:long>76.955846</geo:long>
		<media:content url="http://1.gravatar.com/avatar/d6a8b31986a4ab92e7afd96ee89a96e4?s=96&#38;d=http%3A%2F%2Ftechnikhil.wordpress.com%2Fwp-content%2Fthemes%2Fpub%2Finuit-types%2Fimages%2Fgravatar.png" medium="image">
			<media:title type="html">technikhil</media:title>
		</media:content>
	</item>
		<item>
		<title>Thoughts on Ruby &#8211; I think it&#8217;s great&#8230;</title>
		<link>http://technikhil.wordpress.com/2011/06/01/thoughts-on-ruby-i-think-its-great/</link>
		<comments>http://technikhil.wordpress.com/2011/06/01/thoughts-on-ruby-i-think-its-great/#comments</comments>
		<pubDate>Wed, 01 Jun 2011 00:00:36 +0000</pubDate>
		<dc:creator>technikhil</dc:creator>
				<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Programming / Software]]></category>
		<category><![CDATA[Languages]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://technikhil.wordpress.com/?p=620</guid>
		<description><![CDATA[So it&#8217;s the middle of the year and like last year I am in the middle of a new language. This time however there are some differences from last year. The biggest one is that this year I am actually &#8230; <a href="http://technikhil.wordpress.com/2011/06/01/thoughts-on-ruby-i-think-its-great/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technikhil.wordpress.com&amp;blog=111188&amp;post=620&amp;subd=technikhil&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>So it&#8217;s the middle of the year and like last year I am in the middle of a new language. This time however there are some differences from last year.</p>
<p>The biggest one is that this year I am actually working on the language &#8211; <a href="http://www.ruby-lang.org/en/" target="_blank">Ruby</a> &#8211; while I am learning it and I think this makes a big difference. Though I know that one can learn a language using sample exercises and <a href="http://codekata.pragprog.com/2007/01/code_kata_backg.html" target="_blank">Code Katas</a> &#8211; somehow I think the experience of working with a language everyday &#8211; gives one a real appreciation of what it is like to live with a language. When you are learning a language by choice &#8211; in your own time &#8211; you get to choose the problems and the <a href="http://codekata.pragprog.com/2007/01/code_kata_backg.html">Katas</a>. When you have to work with the language and you use it daily on problems thrust upon you by seemingly unreasonable and sometime crazy requirements &#8211; you get a better understanding of the warts and wrinkles of the language along with the pretty bits.</p>
<p>I actually had a cursory look at <a href="http://www.ruby-lang.org/en/" target="_blank">Ruby</a> sometime back, I had downloaded the language and looked at a tutorial on the web. I solved a couple of basic <a href="http://projecteuler.net/" target="_blank">Project Euler</a> questions with it. I remember thinking at the time &#8211; &#8220;Hmmmm, not really all that different from <a href="http://www.python.org/" target="_blank">Python</a>&#8230;&#8221; and deciding that learning it was not going to get me much. I was looking to exploring languages like <a href="http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/" target="_blank">F#</a> and <a href="http://www.erlang.org/" target="_blank">Erlang</a> at the time, since they were based on different ways of solving programming problems.</p>
<p>So, when I started on this Ruby project this year, I came with certain preconceptions &#8211; but then something happened that changed how I approached Ruby completely. I read the online book &#8211; <a href="http://en.wikipedia.org/wiki/Why's_(poignant)_Guide_to_Ruby" target="_blank">Why&#8217;s (Poignant) Guide to Ruby</a> and I realized that the way I had coded Ruby thus far was not the way Ruby was intended to be coded. Before I go a little further I think I will digress a little give my impression of <a href="http://en.wikipedia.org/wiki/Why's_(poignant)_Guide_to_Ruby" target="_blank">Why&#8217;s (Poignant) Guide to Ruby</a>&#8230;</p>
<p>This is not the first time I had heard of <a href="http://en.wikipedia.org/wiki/Why_the_lucky_stiff" target="_blank">Why</a> and his book.</p>
<div class="zemanta-img zemanta-action-dragged">
<div class="wp-caption alignright" style="width: 164px"><a href="http://en.wikipedia.org/wiki/File:Why%27s_self_portrait.png"><img title="_why's self-portrait from Why's (poignant) Gui..." src="http://upload.wikimedia.org/wikipedia/en/a/a1/Why%27s_self_portrait.png" alt="_why's self-portrait from Why's (poignant) Gui..." width="154" height="141" /></a><p class="wp-caption-text">Image via Wikipedia</p></div>
</div>
<p>Indeed one would be hard pressed indeed to spend any time in the Ruby community and not have heard about <a href="http://en.wikipedia.org/wiki/Why_the_lucky_stiff" target="_blank">Why the lucky stiff</a>, his <a href="http://en.wikipedia.org/wiki/Why's_(poignant)_Guide_to_Ruby" target="_blank">book</a> and his sudden disappearance from the internet (another digression &#8211; I really am amazed at the fact this person was able to keep his virtual life so compartmentalized from his non-virtual one that he was able to disappear so completely!). My first impression after reading the first few pages was &#8211; Wow!! This guy must have a good collection of hallucinogens and Pink Floyd albums &#8211; to create those weird cartoons&#8230;</p>
<div class="zemanta-img zemanta-action-dragged">
<div class="wp-caption alignnone" style="width: 310px"><a href="http://en.wikipedia.org/wiki/File:Why%27s_foxes.png"><img title="Why's foxes" src="http://upload.wikimedia.org/wikipedia/en/thumb/0/04/Why%27s_foxes.png/300px-Why%27s_foxes.png" alt="Why's foxes" width="300" height="87" /></a><p class="wp-caption-text">Image via Wikipedia</p></div>
</div>
<p>But, happily I persevered and was rewarded with a real appreciation of the beauty of Ruby. This book is not only a guide to the Ruby language &#8211; it is a guide to the Ruby philosophy &#8211; The Ruby Way. I would definitely recommend this book to all developers that are looking to learn Ruby, especially if you are coming from a background of working on the &#8220;big iron&#8221; languages like C# &#8211; this book will provide that mental shift in the way you code, that will let you really appreciate Ruby.</p>
<p>Well, now that the digression is out of the way, lets come back to the question coding style in Ruby. Rubyists tend to favor terse code that conveys its intent clearly and concisely. The Ruby culture uses idiomatic syntax and encourage succinctness in code. I really came to appreciate this when I saw the Ruby approach to a basic programming structure &#8211; the loop.</p>
<p>The canonical implementation of a for loop is in the form -</p>
<pre>for &lt;counter&gt; &lt;condition&gt;
&lt;begin block&gt;
	&lt;do something&gt;
&lt;end block&gt;</pre>
<p>In C it is -</p>
<pre>for(i = 0; i &lt; 10; i++)
{

}</pre>
<p>In VB it is -</p>
<pre>for i = 0 to 10

next</pre>
<p>or in the case of iterating through an array</p>
<pre>for each &lt;item&gt; in &lt;group&gt;
  &lt;do something&gt;
next</pre>
<p>In Ruby the for loop can be expressed in a variety of ways -<br />
The vanilla for loop is available -</p>
<pre>for i in 0..10

end 

for  in 

end</pre>
<p>But there is also -</p>
<pre>5.times { &lt;do something&gt; }

1.upto(10) (&lt;do something)

&lt;group&gt;.each {&lt;do something&gt;}

&lt;group&gt;.map
  &lt;do something&gt;
end .
.
.</pre>
<p>Now it can be argued that functions like map are available in other mainstream programming languages as well &#8211; but the point I&#8217;m trying to make is &#8211; in the Ruby way of programming they become the usual way of doing things.</p>
<p>Ruby is a language designed for developers &#8211; but in order to fully appreciate and utilize this one must write (and read) Ruby the way Ruby is meant to be written. Once you embrace &#8220;The Ruby Way&#8221; you will see in Ruby a language that stays out of the way of your thinking. Instead of grappling with or worrying about syntax, you spend more of you time working on your solution. You can see the syntax is very easy to read. In fact the expressiveness of Ruby makes it easy to get to the intent of the code without getting hung up on the syntax. Reading code after you left it for awhile becomes a snap and you find yourself getting back to where you left of more easily.</p>
<p>I had written a post earlier regarding &#8220;<a title="Juggling code – the coding zone and burnouts.." href="http://technikhil.wordpress.com/2010/04/07/juggling-code-the-coding-zone-and-burnouts/" target="_blank">the coding zone</a>&#8221; &#8211; Ruby gets me into the coding zone more easily and lets me sustain it for longer than with any other language I know. It is liberating to be able to conceive of and code entire features in the time it took me to look up the idiosyncrasies of the syntax and battle the compiler of other languages. I find coding in Ruby to be a pleasant experience, not the least because of the incredible community around it. The Ruby community in a very real sense is one of the strengths of the language that put it ahead of <a href="http://www.python.org/" target="_blank">Python</a> in my book.</p>
<p>So (as you can probably tell from this long post) &#8211; I am really enjoying my latest foray into Ruby. That&#8217;s not to say Ruby is perfect &#8211; even if you ignore its real performance disadvantage &#8211; Ruby has some things that can definitely be improved &#8211; but with its great community I think it has a real chance of moving forward and fixing these things.</p>
<br />Filed under: <a href='http://technikhil.wordpress.com/category/the-potential-the-passion/'>Open Source</a>, <a href='http://technikhil.wordpress.com/category/programming-software/'>Programming / Software</a> Tagged: <a href='http://technikhil.wordpress.com/tag/languages/'>Languages</a>, <a href='http://technikhil.wordpress.com/tag/programming/'>programming</a>, <a href='http://technikhil.wordpress.com/tag/ruby/'>Ruby</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/technikhil.wordpress.com/620/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/technikhil.wordpress.com/620/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/technikhil.wordpress.com/620/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/technikhil.wordpress.com/620/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/technikhil.wordpress.com/620/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/technikhil.wordpress.com/620/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/technikhil.wordpress.com/620/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/technikhil.wordpress.com/620/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/technikhil.wordpress.com/620/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/technikhil.wordpress.com/620/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/technikhil.wordpress.com/620/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/technikhil.wordpress.com/620/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/technikhil.wordpress.com/620/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/technikhil.wordpress.com/620/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technikhil.wordpress.com&amp;blog=111188&amp;post=620&amp;subd=technikhil&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://technikhil.wordpress.com/2011/06/01/thoughts-on-ruby-i-think-its-great/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<georss:point>8.532389 76.955846</georss:point>
		<geo:lat>8.532389</geo:lat>
		<geo:long>76.955846</geo:long>
		<media:content url="http://1.gravatar.com/avatar/d6a8b31986a4ab92e7afd96ee89a96e4?s=96&#38;d=http%3A%2F%2Ftechnikhil.wordpress.com%2Fwp-content%2Fthemes%2Fpub%2Finuit-types%2Fimages%2Fgravatar.png" medium="image">
			<media:title type="html">technikhil</media:title>
		</media:content>

		<media:content url="http://upload.wikimedia.org/wikipedia/en/a/a1/Why%27s_self_portrait.png" medium="image">
			<media:title type="html">_why&#039;s self-portrait from Why&#039;s (poignant) Gui...</media:title>
		</media:content>

		<media:content url="http://upload.wikimedia.org/wikipedia/en/thumb/0/04/Why%27s_foxes.png/300px-Why%27s_foxes.png" medium="image">
			<media:title type="html">Why&#039;s foxes</media:title>
		</media:content>
	</item>
		<item>
		<title>How to read code &#8211; a primer</title>
		<link>http://technikhil.wordpress.com/2010/07/06/how-to-read-code-a-primer/</link>
		<comments>http://technikhil.wordpress.com/2010/07/06/how-to-read-code-a-primer/#comments</comments>
		<pubDate>Tue, 06 Jul 2010 07:30:32 +0000</pubDate>
		<dc:creator>technikhil</dc:creator>
				<category><![CDATA[Learning]]></category>
		<category><![CDATA[Programming / Software]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[LinkedIn]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[thinking]]></category>

		<guid isPermaLink="false">http://technikhil.wordpress.com/?p=556</guid>
		<description><![CDATA[I like programming &#8211; it&#8217;s what I do and I am blessed in that I get to spend most of my waking hours developing software. Like a lot of programmers I obsess over how good my code is and how &#8230; <a href="http://technikhil.wordpress.com/2010/07/06/how-to-read-code-a-primer/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technikhil.wordpress.com&amp;blog=111188&amp;post=556&amp;subd=technikhil&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I like programming &#8211; it&#8217;s what I do and I am blessed in that I get to spend most of my waking hours developing software. Like a lot of programmers I obsess over how good my code is and how I can get better at it.</p>
<p>Over the years there have been reading a lot of articles and books on software development. There has been a lot of ink spent (both physical and virtual) on ways to improve your &#8220;programming foo&#8221; and become a super ninja programmer ! There are some common pearls in all this ink and one of them is the advice on reading code. This advice, is usually a one liner couched in the midst of a bunch of other recommendations and usually along the lines of &#8211; find some great open source software or any piece of software that you admire, open up the source code (or print it out) and read it. While, this is on the whole, great advice there are some problems with actually putting it in practice.  In this post I endeavor to give some practical suggestions on reading code, but first let us enumerate the problems.</p>
<div>
<ul>
<li><a href="http://technikhil.files.wordpress.com/2010/07/2677422743_5beb84a992_o.jpg"><img class="alignright size-thumbnail wp-image-570" title="reading_code" src="http://technikhil.files.wordpress.com/2010/07/2677422743_5beb84a992_o.jpg?w=145&#038;h=150" alt="" width="145" height="150" /></a>The usual impression conveyed (in the posts that advise one to read code) is that the dispenser of the advice is a programming guru who can literally sit back in their chair with a page of code and read it like a novel. Well, I am sure there are some superb programmers out there who enjoy looking at pages of cryptic English-like statements over a cup of coffee and can hold entire class hierarchies and architectures in their heads. This post is not meant for them &#8211; this post is for poor slobs like me who find staring at reams of code a boring, frustrating and ultimately pointless exercise. Of course, it can be argued that one can learn simply by reading a single class or even a function of a the entire project code, but, IMO, except for the most simple problems, most software is interdependent. It is often impossible to appreciate the design decisions and the rationale behind a particular function or class layout without knowing the rest of the system&#8230;</li>
<li>The next problem is getting code to read (actually before that you need to be able to identify code worth reading &#8211; check out <a href="http://technikhil.wordpress.com/2010/02/24/how-to-write-beautiful-cod/" target="_blank">this post</a> for details on that). There is a lot of great software out there &#8211; both open source and freely available and licensed or proprietary. There are huge open source directories like <a href="http://sourceforge.net/">Sourceforge</a> and <a href="http://code.google.com/hosting/" target="_blank">Google Code</a>, and huge pieces of software like <a href="http://download.openoffice.org/source/index.html" target="_blank">Open Office</a> and <a href="http://www.kernel.org/" target="_blank">Linux</a>. If you are working in a software development company, you can probably get access to the proprietary code in your <a href="http://en.wikipedia.org/wiki/Revision_control" target="_blank">source control repository</a>. A third common avenue are the programs distributed along with books on software development  or as part of resources for  education( <a href="http://en.wikipedia.org/wiki/MINIX" target="_blank">Minix</a> being the canonical example). Indeed we are actually spoiled for choice and from this universe of software identifying the ones that are good candidates for our purpose is a hard but essential task.</li>
<li>Another problem is the language in which the program is written &#8211; reading someone else&#8217;s code is tough enough as it is, adding the burden of familiarizing yourself with the quirks and syntax of a new language while doing this, is, IMO, a recipe for disaster and immense frustration . You need to find code written in a language that you are familiar with. This particular problem is not relevant if you are going through the code distributed as part of a book or as an educational resource, since you would have the book or your mentor to explain things and set out the context. If, despite this forewarning, you are planning to read code written in a different language than you are used to (without the benefit of having a book or a mentor) I would advise, that you at least learn enough of the language to create your own programs  in it (&#8220;Hello World&#8221; does not count :-)) .</li>
<li>The bit about context brings me to the next problem &#8211; figuring out what the code is doing is a lot harder if you are not familiar with the software itself. For example, it is far more difficult to go through the <a href="http://en.wikipedia.org/wiki/Linux" target="_blank">Linux</a> code and figure out the concept of <a href="http://en.wikipedia.org/wiki/Runlevel" target="_blank">runlevels</a> if you don&#8217;t use <a href="http://en.wikipedia.org/wiki/Linux" target="_blank">Linux</a> daily and see the <a href="http://en.wikipedia.org/wiki/Linux" target="_blank">Linux</a> boot sequence. Using the software gives one a context with which to read the code &#8211; this context includes the common terminology used, the functionality and features of the software, even the quirks and bugs that you experience.</li>
</ul>
</div>
<p>I have realized that for me &#8216;reading code&#8217; does not really describe the activities that I undertake &#8211; a better phrase for what I do is &#8216;code comprehension&#8217;. It is quite difficult for me to sit back with a laptop screen (or a printout) full of code and simply read through it. I need a lot more than simply a piece of code &#8211; I like to be able to look at documentation, play with the software, step through the code and even write tests for it before I really appreciate it. This is a significant investment of my time and effort, so I have to be very picky about the software I want to &#8220;read&#8221; (comprehend).</p>
<div>
<ul>
<li>The first filter I place on the code directory, when looking for code  is the language filter &#8211; for me this means &#8211; <a href="http://en.wikipedia.org/wiki/C_Sharp_(programming_language)" target="_blank">C#</a> or <a href="http://en.wikipedia.org/wiki/VB.NET" target="_blank">VB.NET</a> or <a href="http://www.python.org/" target="_blank">Python</a> or <a href="http://en.wikipedia.org/wiki/Javascript" target="_blank">Javascript</a>(while I am familiar with <a href="http://en.wikipedia.org/wiki/C%2B%2B" target="_blank">C++</a>, <a href="http://www.ruby-lang.org/en/" target="_blank">Ruby</a> and <a href="http://en.wikipedia.org/wiki/F_Sharp_(programming_language)" target="_blank">F#</a> as well I do not consider myself at a level where I can understand other people&#8217;s code in them). Next is to look for software that I have used &#8211; this allows me the a bit of a leg up since I know what the code is meant to do, cannot do and (if I am familiar enough) its limitations. Good candidates are open source software that you use in your day job (for eg. I use <a href="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET" target="_blank">Cruise Control.NET</a>, <a href="http://nant.sourceforge.net/" target="_blank">NANT</a> and <a href="http://www.nunit.org/" target="_blank">NUnit</a> which are open source tools written in <a href="http://en.wikipedia.org/wiki/C_Sharp_(programming_language)" target="_blank">C#</a>)</li>
<li>I happen to work in a software product company (a Microsoft shop), so one of the candidates for my reading list is the code in my companies source repository. If you happen to work in a software company, you can look at other projects, and even older versions of the software you are working on. In addition to providing insight on code, you get a pretty good idea of what was tried before and since. There are a few caveats though -
<ul>
<li>First, if you don&#8217;t have direct access to other projects, you need to ask permission &#8211; some companies are very touchy about their &#8220;intellectual property&#8221;.</li>
<li>Second, the quality of the software may not be as high as you think, since, in general, proprietary code does not get the kind of scrutiny open source code does. Warning signs to look out for are a lack of regular code reviews &#8211; if the software is not code reviewed the odds are that it would not be of good quality.</li>
<li>Third (this point is inspired from feedback provided by my friend <a href="http://praseedp.blogspot.com/">Praseed</a>), if the code in your company is business software (HR, Finance, ERP, etc) there is a lot of business context that needs to be understood first. Also, since most of this code tends to be factored by business functionality, it generally seems less modular than utility code or APIs.</li>
</ul>
</li>
<li>Look for well documented projects (this applies to open source as well as proprietary code).  By this I mean, that the documentation should highlight the overall design, and rationale for the way the code is. Simply having auto-generated <a href="http://en.wikipedia.org/wiki/Javadoc" target="_blank">Java Doc</a> type documents cannot be considered documentation :-). One useful avenue to explore is software created as educational resources (like <a href="http://en.wikipedia.org/wiki/MINIX" target="_blank">Minix</a> ). Since, the target is to teach through the software, they are usually quite clearly documented and have plenty of material explaining the design rationale behind the code.</li>
</ul>
<p>So, you have identified the software and downloaded the source code and documentation, so let&#8217;s get down and start <a href="http://www.merriam-webster.com/dictionary/spelunking" target="_blank">spelunking </a> ;-)</p>
<ul>
<li>Go through the design documentation and try to get a feel for the way the code has been built. Good software projects follow certain architectural patterns &#8211; these dictate the code organization. Once you get a handle on this, understanding the code becomes a whole lot easier. If you can create a class diagram of the code you can get a good idea of the layout.</li>
<li>The next thing to do is to compile it and run it. This can be straightforward or tough depending on the process followed in the project and it&#8217;s documentation.</li>
<li>Now it&#8217;s time to fire up your favorite <a href="http://en.wikipedia.org/wiki/Integrated_development_environment" target="_blank">IDE</a> and go exploring. A good place to start your code exploration  would be to try to trace a functionality of the project that you are familiar with. This would let you go through the various layers and sub-systems and get a handle on how they inter-connect. For example when I was exploring <a href="http://www.nunit.org/" target="_blank">NUnit</a> &#8211; I started by writing a test and looking at the code classes I needed to do that.</li>
<li>Try and identify the <a href="http://en.wikipedia.org/wiki/Design_pattern_(computer_science)" target="_blank">design patterns</a> used in the code. If you do not know what design patterns are, then you need to stop reading this post right now and read <a href="http://en.wikipedia.org/wiki/Design_Patterns_(book)" target="_blank">this book</a>. Familiarize yourself with <a href="http://en.wikipedia.org/wiki/Design_pattern_(computer_science)" target="_blank">design patterns</a> &#8211; they form a great way to recognize and understand the design of well written code. This makes it easier to keep it in your head while reading code. It also helps you identify nuances and customizations made by the programmers more easily.</li>
<li>Try to write tests for the code to fully understand it &#8211; this is really useful way to understand the dependencies between different parts of the code. When you try to write a test for the code you first need to satisfy (<a href="http://en.wikipedia.org/wiki/Mock_object" target="_blank">mock</a>) all its dependencies. Next you need to understand the possible entry points as well as the exit values for the code. This improves your understanding of the code and get you to the next level.</li>
<li>Finally, try to <a href="http://www.refactoring.com/" target="_blank">refactor the code</a>. In this step you have moved from simply understanding the code to becoming familiar enough to be able to modify it. As the sophistication of your <a href="http://www.refactoring.com/">refactoring </a>increases so too does your understanding. At this point you can if needed contribute your own code to the project :-)</li>
</ul>
</div>
<div id="_mcePaste">&#8220;Code Reading&#8221; IMO is more than just reading &#8211; it is a distinct set of activities that together help one understand code. It might seem more intimidating than simply &#8220;reading code&#8221; but it is well worth then effort IMO.</div>
<div>Happy &#8220;code reading&#8221; :-)</div>
<div>Update: I came across this <a href="http://www.joelonsoftware.com/articles/fog0000000053.html" target="_blank">post</a> by <a href="http://www.joelonsoftware.com" target="_blank">Joel Spolsky</a> where he quotes Seth Gordon as saying code reading &#8220;Is just like reading the Talmud&#8221;&#8230; Yup, code reading is definitely not easy.</div>
<br />Filed under: <a href='http://technikhil.wordpress.com/category/learning/'>Learning</a>, <a href='http://technikhil.wordpress.com/category/programming-software/'>Programming / Software</a>, <a href='http://technikhil.wordpress.com/category/software-engineering/'>Software Engineering</a> Tagged: <a href='http://technikhil.wordpress.com/tag/linkedin/'>LinkedIn</a>, <a href='http://technikhil.wordpress.com/tag/software-development/'>Software Development</a>, <a href='http://technikhil.wordpress.com/tag/thinking/'>thinking</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/technikhil.wordpress.com/556/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/technikhil.wordpress.com/556/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/technikhil.wordpress.com/556/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/technikhil.wordpress.com/556/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/technikhil.wordpress.com/556/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/technikhil.wordpress.com/556/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/technikhil.wordpress.com/556/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/technikhil.wordpress.com/556/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/technikhil.wordpress.com/556/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/technikhil.wordpress.com/556/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/technikhil.wordpress.com/556/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/technikhil.wordpress.com/556/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/technikhil.wordpress.com/556/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/technikhil.wordpress.com/556/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technikhil.wordpress.com&amp;blog=111188&amp;post=556&amp;subd=technikhil&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://technikhil.wordpress.com/2010/07/06/how-to-read-code-a-primer/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		<georss:point>8.532389 76.955846</georss:point>
		<geo:lat>8.532389</geo:lat>
		<geo:long>76.955846</geo:long>
		<media:content url="http://1.gravatar.com/avatar/d6a8b31986a4ab92e7afd96ee89a96e4?s=96&#38;d=http%3A%2F%2Ftechnikhil.wordpress.com%2Fwp-content%2Fthemes%2Fpub%2Finuit-types%2Fimages%2Fgravatar.png" medium="image">
			<media:title type="html">technikhil</media:title>
		</media:content>

		<media:content url="http://technikhil.files.wordpress.com/2010/07/2677422743_5beb84a992_o.jpg?w=145" medium="image">
			<media:title type="html">reading_code</media:title>
		</media:content>
	</item>
		<item>
		<title>The Humble Programmer &#8211; Edsger W Dijkstra</title>
		<link>http://technikhil.wordpress.com/2010/05/18/the-humble-programmer-edsger-w-dijkstra/</link>
		<comments>http://technikhil.wordpress.com/2010/05/18/the-humble-programmer-edsger-w-dijkstra/#comments</comments>
		<pubDate>Tue, 18 May 2010 03:56:28 +0000</pubDate>
		<dc:creator>technikhil</dc:creator>
				<category><![CDATA[Articles of Interest]]></category>
		<category><![CDATA[Programming / Software]]></category>
		<category><![CDATA[LinkedIn]]></category>
		<category><![CDATA[review]]></category>
		<category><![CDATA[thinking]]></category>

		<guid isPermaLink="false">http://technikhil.wordpress.com/?p=529</guid>
		<description><![CDATA[I first heard of Edsger W Dijkstra in the context of agile programming.I was having a discussion regarding agile programming with some friends and explaining Test Driven Development and the concept of first creating tests that can prove show the &#8230; <a href="http://technikhil.wordpress.com/2010/05/18/the-humble-programmer-edsger-w-dijkstra/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technikhil.wordpress.com&amp;blog=111188&amp;post=529&amp;subd=technikhil&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I first heard of <a href="http://en.wikipedia.org/wiki/Edsger_W._Dijkstra" target="_blank">Edsger W Dijkstra</a> in the context of <a href="http://en.wikipedia.org/wiki/Agile_software_development" target="_blank">agile programming</a>.I was having a discussion regarding agile programming with some friends and explaining <a href="http://en.wikipedia.org/wiki/Test-driven_development" target="_blank">Test Driven Development</a> and the concept of first creating tests that can <del datetime="2010-05-18T15:54:20+00:00">prove</del> show the correctness of the code before writing the code, when a friend mentioned that this sounded a lot like some of the arguments put forward by <a href="http://en.wikipedia.org/wiki/Edsger_W._Dijkstra" target="_blank">Prof. Dijkstra</a> in his Turing award lecture in 1972. I found that hard to believe, after all, if this was known in 1972 then why is it only becoming popular now ?</p>
<p>So I started looking up <a href="http://en.wikipedia.org/wiki/Edsger_W._Dijkstra" target="_blank">Edsger W Dijkstra</a> and realized that this man was one of the pioneering giants of software programming. He is the father of <a href="http://en.wikipedia.org/wiki/Structured_programming" target="_blank">structured programming</a> and one of the guiding heads responsible for much of the way we program computers today. There is a lot written about him all over the place &#8211; I shall focus on his Turing award lecture, that was titled &#8220;<a href="http://userweb.cs.utexas.edu/~EWD/transcriptions/EWD03xx/EWD340.html" target="_blank">The Humble Programmer</a>&#8220;. In this lecture, <a href="http://en.wikipedia.org/wiki/Edsger_W._Dijkstra" target="_blank">Prof. Dijkstra</a> puts forth six arguments on the way software programming should be done. On reading these six arguments I cannot help but feel that this lecture was one of the main inspirations used by the authors of the agile programming movement and design patterns community.</p>
<p>The six arguments put forward in the lecture are as follows -</p>
<ol>
<li>&#8220;A study of program structure had revealed that programs —even alternative programs for the same task and with the same mathematical content— can differ tremendously in their intellectual manageability. A number of rules have been discovered, violation of which will either seriously impair or totally destroy the intellectual manageability of the program.I now suggest that we confine ourselves to the design and implementation of intellectually manageable programs. The programmer only needs to consider intellectually manageable programs, the <del datetime="2010-05-18T15:54:20+00:00">alternative</del> alternatives he is choosing from are much, much easier to cope with.&#8221;</li>
<li>&#8220;As soon as we have decided to restrict ourselves to the subject of intellectually manageable programs, we have achieved once and for all a drastic reduction of the solution space to be considered. This argument is distinct from argument 1.&#8221;</li>
<li>&#8220;If one first asks oneself what the structure of a convincing proof would be and having found this, then construct a program satisfying this proofs requirements, the these correctness concerns turn out to be a very effective heuristic guidance. By definition this approach is only applicable if restrict ourselves to intellectually manageable programs.&#8221;</li>
<li>&#8220;The only mental tool by which a very finite piece of reasoning can cover a myriad of cases is called an &#8220;abstraction&#8221;. There are number of patterns of abstraction that play a vital role in the construction of programs. Knowledge of these patterns of abstraction are essential.&#8221;</li>
<li>&#8220;A programmer is fully aware of the limited size of his own skull; so he approaches the task of programming in full humility and avoids clever tricks.&#8221;</li>
<li>&#8220;The only <del datetime="2010-05-20T02:53:55+00:00">solution</del>problems we can solve in a satisfactory manner are those that finally admit a nicely factored solution.&#8221;</li>
</ol>
<p>When you go through these arguments you see the seeds for the various movements in programming software today -</p>
<ul>
<li>Arguments 1 and 2 are the foundation of principles like <a href="http://en.wikipedia.org/wiki/KISS_principle" target="_blank">KISS (Keep it Simple and Stupid)</a> and <a href="http://en.wikipedia.org/wiki/You_ain%27t_gonna_need_it" target="_blank">YAGNI (You Ain&#8217;t Gonna Need It)</a></li>
<li>Argument 3 forms the basis of efforts like  <a href="http://en.wikipedia.org/wiki/Test-driven_development" target="_blank">Test Driven Development</a> and the <a href="http://en.wikipedia.org/wiki/Design_by_Contract" target="_blank">Design By Contract</a>.</li>
<li>Argument 4 leads us to <a href="http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29" target="_blank">Design Patterns. </a></li>
<li>Argument 5 and 6 preaches humility in programming, the use of <a href="http://en.wikipedia.org/wiki/Abstraction_%28computer_science%29" target="_blank">abstraction</a> to write readable well factored programs &#8211; <a href="http://technikhil.wordpress.com/2010/02/24/how-to-write-beautiful-cod/" target="_blank">beautiful code</a></li>
</ul>
<p>I really enjoyed reading his lecture &#8211; I have the lecture here (<a href="http://technikhil.files.wordpress.com/2010/05/the_humble_programmer.pdf">The_Humble_Programmer</a>)  if you want to read it. He must have been an extremely engaging speaker &#8211; a lot of his quotes are available <a href="http://en.wikiquote.org/wiki/Edsger_W._Dijkstra" target="_blank">here</a>.</p>
<p>Till next time &#8211; Happy Programming !</p>
<p>Update: I have made a couple of corrections based of some of the comments <a href="http://www.reddit.com/r/programming/comments/c5hzl/a_review_of_dijkstras_1972_turing_award_lecture/" target="_blank">here</a>.  When I wrote that argument 3 is the basis for TDD I meant that in the lecture Dijkstra talks about first finding the structure of a proof and then constructing the program satisfying the proofs requirement. This is similar to the TDD approach of first writing a test and then writing code that satisfies the test.</p>
<br />Filed under: <a href='http://technikhil.wordpress.com/category/articles-of-interest/'>Articles of Interest</a>, <a href='http://technikhil.wordpress.com/category/programming-software/'>Programming / Software</a> Tagged: <a href='http://technikhil.wordpress.com/tag/linkedin/'>LinkedIn</a>, <a href='http://technikhil.wordpress.com/tag/review/'>review</a>, <a href='http://technikhil.wordpress.com/tag/thinking/'>thinking</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/technikhil.wordpress.com/529/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/technikhil.wordpress.com/529/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/technikhil.wordpress.com/529/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/technikhil.wordpress.com/529/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/technikhil.wordpress.com/529/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/technikhil.wordpress.com/529/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/technikhil.wordpress.com/529/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/technikhil.wordpress.com/529/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/technikhil.wordpress.com/529/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/technikhil.wordpress.com/529/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/technikhil.wordpress.com/529/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/technikhil.wordpress.com/529/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/technikhil.wordpress.com/529/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/technikhil.wordpress.com/529/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technikhil.wordpress.com&amp;blog=111188&amp;post=529&amp;subd=technikhil&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://technikhil.wordpress.com/2010/05/18/the-humble-programmer-edsger-w-dijkstra/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<georss:point>8.532389 76.955846</georss:point>
		<geo:lat>8.532389</geo:lat>
		<geo:long>76.955846</geo:long>
		<media:content url="http://1.gravatar.com/avatar/d6a8b31986a4ab92e7afd96ee89a96e4?s=96&#38;d=http%3A%2F%2Ftechnikhil.wordpress.com%2Fwp-content%2Fthemes%2Fpub%2Finuit-types%2Fimages%2Fgravatar.png" medium="image">
			<media:title type="html">technikhil</media:title>
		</media:content>
	</item>
		<item>
		<title>Google Android and the CLI</title>
		<link>http://technikhil.wordpress.com/2010/05/04/google-new-hires-android-and-the-cli/</link>
		<comments>http://technikhil.wordpress.com/2010/05/04/google-new-hires-android-and-the-cli/#comments</comments>
		<pubDate>Tue, 04 May 2010 04:18:19 +0000</pubDate>
		<dc:creator>technikhil</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[thinking]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[web tools]]></category>

		<guid isPermaLink="false">http://technikhil.wordpress.com/?p=509</guid>
		<description><![CDATA[Today morning I was reading about Brad Adams &#8211; Going Google and ruminating about what he wanted to do there when several earlier articles I had read suddenly came together and I had an inspiration that I thought I&#8217;d blog. &#8230; <a href="http://technikhil.wordpress.com/2010/05/04/google-new-hires-android-and-the-cli/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technikhil.wordpress.com&amp;blog=111188&amp;post=509&amp;subd=technikhil&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Today morning I was reading about <a href="http://bradabrams.com" target="_blank">Brad Adams</a> &#8211; <a href="http://bradabrams.com/2010/05/going-google/" target="_blank">Going Google</a> and ruminating about what he wanted to do there when several earlier articles I had read suddenly came together and I had an inspiration that I thought I&#8217;d blog.</p>
<p>It would by really cool if Brad and <a href="http://en.wikipedia.org/wiki/Tim_Bray" target="_blank">Tim Bray</a> (who recently left Sun and <a href="http://www.tbray.org/ongoing/When/201x/2010/03/15/Joining-Google" target="_blank">joined Google Android</a>) get together and implement the <a href="http://en.wikipedia.org/wiki/Common_Language_Infrastructure" target="_blank">CLI</a> on the <a href="http://developer.android.com/index.html" target="_blank">Android OS</a>.</p>
<p>Brad is one of the architects of the <a href="http://en.wikipedia.org/wiki/Common_Language_Infrastructure" target="_blank">CLI</a> and has been one of the main driving forces behind the development of the .NET framework and it&#8217;s adoption. He is currently looking at what he wants to do when he starts at Google. He mentioned that he thinks the cloud plus devices is one of the dominant trends of the future and I agree.</p>
<p>I think the <a href="http://developer.android.com/index.html" target="_blank">Android  OS</a> is an important part of this future and currently I am frustrated that there is only Java support for developing in it. Tim shares my frustrations and he is looking at <a href="http://www.tbray.org/ongoing/When/201x/2010/04/11/Other-Android-Languages" target="_blank">getting other languages supported in the Android OS</a>.  He is looking at Ruby right now &#8211; it&#8217;s open source and a dynamic language and it makes sense . But I feel the <a href="http://en.wikipedia.org/wiki/Common_Language_Infrastructure" target="_blank">CLI</a> (which is an open ECMA specification) is a great fit for the <a href="http://developer.android.com/index.html" target="_blank">Android  OS</a> because it can be used to as a basis to quickly support a lot of languages.  Besides as a .NET developer myself, I think that having the capability to develop Android applications in C# or <a href="http://ironpython.net/" target="_blank">IronPython</a> is a far more palatable proposition than doing it in Java :-)</p>
<p>I saw <a href="http://tirania.org/blog/archive/2010/May-03.html" target="_blank">this article</a> by Miguel de Icaza where he puts out an idea to incorporate the <a href="http://en.wikipedia.org/wiki/Common_Language_Infrastructure" target="_blank">CLI</a> into the browser engine so that we could use languages other than Javascript in our client-side scripting (my take on that is <a href="http://technikhil.posterous.com/cli-on-the-web-miguel-de-icaza" target="_blank">here</a>). It occurs to me that it should be similarly possible to bring it into the <a href="http://developer.android.com/index.html" target="_blank">Android   OS</a> as well.  There are currently efforts to <a href="http://stackoverflow.com/questions/214615/will-google-android-ever-support-net" target="_blank">port Mono</a> that could be used as a starting point.</p>
<p>So what say guys &#8211; can we get the <a href="http://en.wikipedia.org/wiki/Common_Language_Infrastructure" target="_blank">.NET CLI</a> in <a href="http://developer.android.com/index.html" target="_blank">Google Android</a> ?  Become the opposite of the Apple <a href="http://daringfireball.net/2010/04/why_apple_changed_section_331" target="_blank">iPhone</a> and embrace developers instead of driving them away :-)</p>
<br />Filed under: <a href='http://technikhil.wordpress.com/category/google/'>Google</a>, <a href='http://technikhil.wordpress.com/category/web-20/'>Web 2.0</a> Tagged: <a href='http://technikhil.wordpress.com/tag/software/'>software</a>, <a href='http://technikhil.wordpress.com/tag/thinking/'>thinking</a>, <a href='http://technikhil.wordpress.com/tag/web-development/'>Web Development</a>, <a href='http://technikhil.wordpress.com/tag/web-tools/'>web tools</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/technikhil.wordpress.com/509/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/technikhil.wordpress.com/509/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/technikhil.wordpress.com/509/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/technikhil.wordpress.com/509/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/technikhil.wordpress.com/509/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/technikhil.wordpress.com/509/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/technikhil.wordpress.com/509/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/technikhil.wordpress.com/509/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/technikhil.wordpress.com/509/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/technikhil.wordpress.com/509/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/technikhil.wordpress.com/509/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/technikhil.wordpress.com/509/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/technikhil.wordpress.com/509/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/technikhil.wordpress.com/509/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technikhil.wordpress.com&amp;blog=111188&amp;post=509&amp;subd=technikhil&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://technikhil.wordpress.com/2010/05/04/google-new-hires-android-and-the-cli/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<georss:point>8.532389 76.955846</georss:point>
		<geo:lat>8.532389</geo:lat>
		<geo:long>76.955846</geo:long>
		<media:content url="http://1.gravatar.com/avatar/d6a8b31986a4ab92e7afd96ee89a96e4?s=96&#38;d=http%3A%2F%2Ftechnikhil.wordpress.com%2Fwp-content%2Fthemes%2Fpub%2Finuit-types%2Fimages%2Fgravatar.png" medium="image">
			<media:title type="html">technikhil</media:title>
		</media:content>
	</item>
		<item>
		<title>Ganesha – the original lateral thinker</title>
		<link>http://technikhil.wordpress.com/2010/04/13/ganesha-%e2%80%93-the-original-lateral-thinker/</link>
		<comments>http://technikhil.wordpress.com/2010/04/13/ganesha-%e2%80%93-the-original-lateral-thinker/#comments</comments>
		<pubDate>Tue, 13 Apr 2010 01:00:58 +0000</pubDate>
		<dc:creator>technikhil</dc:creator>
				<category><![CDATA[Learning]]></category>
		<category><![CDATA[Of cabbages--and kings--]]></category>
		<category><![CDATA[Programming / Software]]></category>
		<category><![CDATA[Hindu mythology]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[thinking]]></category>

		<guid isPermaLink="false">http://technikhil.wordpress.com/?p=474</guid>
		<description><![CDATA[There is an ancient tale from Hindu mythology that illustrates lateral thinking (also known as &#8211;  “out of the box” thinking) that I would  like to share - One day Lord Siva and His consort Parvati were sitting atop their &#8230; <a href="http://technikhil.wordpress.com/2010/04/13/ganesha-%e2%80%93-the-original-lateral-thinker/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technikhil.wordpress.com&amp;blog=111188&amp;post=474&amp;subd=technikhil&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>There is an ancient tale from Hindu mythology that illustrates <strong>lateral thinking</strong> (also known as &#8211;  “<strong>out of the box</strong>” thinking) that I would  like to share -</p>
<p>One day <strong>Lord Siva</strong> and His consort <strong>Parvati</strong> were sitting atop their abode on Mt. Kailash with their sons <strong>Ganesha</strong> and <strong>Karthikeyan</strong> when the sage Narada dropped by for a visit. <strong>Narada</strong> had with him a special <strong>mango of knowledge</strong>, to offer to Siva. After accepting the mango from Narada,  Siva and Parvati decided to have a contest between their sons.</p>
<div class="wp-caption alignleft" style="width: 109px"><img title="Ganesha" src="http://technikhil.files.wordpress.com/2010/04/ganesh1.gif?w=99&#038;h=150" alt="Ganesha" width="99" height="150" /><p class="wp-caption-text">Ganesha</p></div>
<div class="wp-caption alignright" style="width: 128px"><img title="Karthikeyan" src="http://technikhil.files.wordpress.com/2010/04/ravilord-muruga.jpg?w=118&#038;h=150" alt="Karthikeyan" width="118" height="150" /><p class="wp-caption-text">Karthikeyan</p></div>
<p>The first one who circumnavigates the world three times would get to the mango of knowledge. Without further ado Karthikeyan  jumped on his peacock and started off. Ganesha on the other hand was busy eating his favorite ladoos and decided to finish them first. Karthikeyan had completed two rounds by the time Ganesha finally got ready to compete :-)</p>
<p>Ganesha simply approached Siva and Parvati and deliberately walked around them –  He circled them once, twice and three times and then claimed the mango.</p>
<p>When, Siva and Parvati asked him how he could claim the mango when he had not circled the world even once &#8211; Ganesha replied – &#8220;You both are my world&#8221;. Delighted by the answer Siva and Parvati gave Ganesha the mango, which he immediately gobbled up with relish.</p>
<p>Two of the important traits of good software developers are “<strong>enlightened laziness</strong>” and “<strong>Out of the box</strong>” thinking.  This tale is an example of both enlightened laziness and out of the box thinking – confronted by the immense task of circumnavigating the world – Ganesha &#8211; by simply thinking a little and restating the problem comprehensively defeated his brother Karthikeyan.</p>
<p>So, my eager friends – the ones who are chomping at the bit after the initial presentation of a project &#8211; eager to rush into coding it, please spend some time contemplating your problem.  Another, homily you might want to consider is -  <strong>&#8220;Think twice, code once&#8221;</strong> &#8211; You, might just save yourself a LOT of time and effort !! :-)</p>
<br />Filed under: <a href='http://technikhil.wordpress.com/category/learning/'>Learning</a>, <a href='http://technikhil.wordpress.com/category/of-cabbages-and-kings/'>Of cabbages--and kings--</a>, <a href='http://technikhil.wordpress.com/category/programming-software/'>Programming / Software</a> Tagged: <a href='http://technikhil.wordpress.com/tag/hindu-mythology/'>Hindu mythology</a>, <a href='http://technikhil.wordpress.com/tag/software-development/'>Software Development</a>, <a href='http://technikhil.wordpress.com/tag/thinking/'>thinking</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/technikhil.wordpress.com/474/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/technikhil.wordpress.com/474/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/technikhil.wordpress.com/474/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/technikhil.wordpress.com/474/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/technikhil.wordpress.com/474/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/technikhil.wordpress.com/474/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/technikhil.wordpress.com/474/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/technikhil.wordpress.com/474/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/technikhil.wordpress.com/474/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/technikhil.wordpress.com/474/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/technikhil.wordpress.com/474/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/technikhil.wordpress.com/474/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/technikhil.wordpress.com/474/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/technikhil.wordpress.com/474/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technikhil.wordpress.com&amp;blog=111188&amp;post=474&amp;subd=technikhil&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://technikhil.wordpress.com/2010/04/13/ganesha-%e2%80%93-the-original-lateral-thinker/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<georss:point>8.532389 76.955846</georss:point>
		<geo:lat>8.532389</geo:lat>
		<geo:long>76.955846</geo:long>
		<media:content url="http://1.gravatar.com/avatar/d6a8b31986a4ab92e7afd96ee89a96e4?s=96&#38;d=http%3A%2F%2Ftechnikhil.wordpress.com%2Fwp-content%2Fthemes%2Fpub%2Finuit-types%2Fimages%2Fgravatar.png" medium="image">
			<media:title type="html">technikhil</media:title>
		</media:content>

		<media:content url="http://technikhil.files.wordpress.com/2010/04/ganesh1.gif?w=99" medium="image">
			<media:title type="html">Ganesha</media:title>
		</media:content>

		<media:content url="http://technikhil.files.wordpress.com/2010/04/ravilord-muruga.jpg?w=118" medium="image">
			<media:title type="html">Karthikeyan</media:title>
		</media:content>
	</item>
		<item>
		<title>Juggling code &#8211; the coding zone and burnouts..</title>
		<link>http://technikhil.wordpress.com/2010/04/07/juggling-code-the-coding-zone-and-burnouts/</link>
		<comments>http://technikhil.wordpress.com/2010/04/07/juggling-code-the-coding-zone-and-burnouts/#comments</comments>
		<pubDate>Wed, 07 Apr 2010 01:32:14 +0000</pubDate>
		<dc:creator>technikhil</dc:creator>
				<category><![CDATA[Programming / Software]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[LinkedIn]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[thinking]]></category>

		<guid isPermaLink="false">http://technikhil.wordpress.com/?p=466</guid>
		<description><![CDATA[Software programming is a very mentally intensive activity. In any non-trivial software system the coder has to juggle a large number of mental models. Like a juggler, a coder,  has to mentally juggle not only the actual code that he/she &#8230; <a href="http://technikhil.wordpress.com/2010/04/07/juggling-code-the-coding-zone-and-burnouts/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technikhil.wordpress.com&amp;blog=111188&amp;post=466&amp;subd=technikhil&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>Software programming</strong> is a very mentally intensive activity. In any non-trivial software system the coder has to juggle a large number of mental models. Like a juggler, a coder,  has to mentally juggle not only the actual code that he/she is writing, but,  details of the code that it is related to, the details of the data being manipulated, the possible errors to be handled, the reliability and performance of the code, it&#8217;s security characteristics, the requirement that is being implemented and it&#8217;s design and usability, etc (depending on the code there may be more to think of or if you lucky, less :-)). Unlike a juggler who generally juggles things of similar size,  a coder mentally juggles problems whose complexity vary by several orders of magnitude (1 &#8211; 10<sup>9</sup>).</p>
<p>Given all this, it takes time for coders to become truly productive when they sit down and start working on something.  Once you get into the what I call the &#8211; <strong>coding zone</strong> , you find the ideas flowing through you seamlessly &#8211; coders in the zone lose sense of time and place &#8211; the problems and solutions are clear and you find <strong><a href="http://technikhil.wordpress.com/2010/02/24/how-to-write-beautiful-cod/" target="_blank">beautiful code</a></strong> coming from your keyboard. Coding when you are in the zone is an immensely satisfying task &#8211; it&#8217;s like the zone that sportspeople talk about &#8211; when they are breaking records, it seems like they are unstoppable and every movement is a beautiful ballet&#8230;</p>
<p>This is also why almost all good coders HATE BEING INTERRUPTED !! Whether it is a simple phone call or even a well meaning colleague coming over to tap you on your shoulder and ask a question &#8211; the effect is the same as though the coder was invited to a long meeting. It takes time and effort to get back to being productive  after the interruption.</p>
<p>There are several other things that contribute to this problem -</p>
<ol>
<li>&#8220;Open Office&#8221; plans where you are compelled to hear your neighbors  conversations.</li>
<li>Having one phone for several people in your area so you cant disconnect it and have to attend it on the off chance it yours.</li>
<li>Conversations over information that can be sent by email or IM or SMS or any of the multitude of asynchronous forms of communication available today.</li>
</ol>
<p>I have seen several ways to combat this  -</p>
<ol>
<li>Some people wear head-phones to block the ambient noise and subtly indicate to people they are working on something and interruptions are not encouraged (YMMV &#8211; I have seen people ignore the subtle indication and come over anyway).</li>
<li>Some people deal with all their email and IM at scheduled intervals &#8211; this way everyone gets their reply and people learn to come with the questions at those times.</li>
<li>If you are lucky enough to have a cabin then disconnecting the phone and leaving a message on the door is often effective.</li>
<li>Some companies even plan their meetings to happen only on certain days so everyday disruption is minimized.</li>
<li>A common inclination is to work at times when no-one else is around to bother you. This is a reason why coders are night owls :-)</li>
</ol>
<p>Another effect of software programming is <strong>burn-out</strong>&#8230; This is the opposite of being in the coding zone, but it seems to be consequence of being in one&#8230;  Like I mentioned in the beginning of this post &#8211; software programming is a very mentally intensive activity. Coders have frequently felt mentally burned-out after intensive coding sessions.  This happens more quickly on projects which you don&#8217;t find  interesting or enjoyable. Sometimes you can continue only for a day, other times it&#8217;s a month but invariably &#8211; burn-out happens.The key is to recognize it for what it is and deal with it.</p>
<p>Indeed,  when I previously mentioned that coders lose all sense of time when in the zone, I did not mean that they should spend all their time coding.  I am not  applauding coders that brag about sitting for 36 hours at a computer churning out code. Those, that spend 16 hours a day at the terminal and spend their nights dreaming about code are, invariably, the ones whose work the rest of the team has to spend the rest of the month fixing. Like in all things,  there is a balance that needs to be maintained. Spending long amounts of time in intense concentration is tiring, and it  is important to give things a rest. It is usually great to take some time off doing something else, like mountain biking, mixed martial arts, flying a plane or playing an instrument (these are pastimes of some of my friends :-)). Some people like physical activity others like mental activities like video games, or chess. The important thing is to have a balance. Sometimes, when you are grappling with a hard problem it is useful to stop thinking about it consciously and let your sub-conscious chew over it.</p>
<p>When you are no longer in the zone and are spinning your wheels, a break is the most productive thing you can do.</p>
<p>The <strong>Zen of Programming</strong> is being able to get into the zone and more importantly to recognize when you are no longer in it and take that break ! :-)</p>
<p><strong>Update</strong>: I came across <a href="http://tech.mit.edu/V130/N18/dubai.html" target="_blank">this article</a> the other day that got me thinking about burn-out.  I mentioned before that burn-out happens more quickly when doing something you don&#8217;t find interesting or enjoyable &#8211; this advise goes in spades when you are doing something you feel is morally wrong or that goes against your conscience.  Guilt is a catalyst that will accelerate both the speed and the intensity of your burn-out.</p>
<p>IMHO if given a choice it is much more satisfying to do something you believe in at a lower salary than something you don&#8217;t at a higher one.</p>
<br />Filed under: <a href='http://technikhil.wordpress.com/category/programming-software/'>Programming / Software</a>, <a href='http://technikhil.wordpress.com/category/software-engineering/'>Software Engineering</a> Tagged: <a href='http://technikhil.wordpress.com/tag/linkedin/'>LinkedIn</a>, <a href='http://technikhil.wordpress.com/tag/software-development/'>Software Development</a>, <a href='http://technikhil.wordpress.com/tag/thinking/'>thinking</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/technikhil.wordpress.com/466/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/technikhil.wordpress.com/466/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/technikhil.wordpress.com/466/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/technikhil.wordpress.com/466/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/technikhil.wordpress.com/466/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/technikhil.wordpress.com/466/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/technikhil.wordpress.com/466/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/technikhil.wordpress.com/466/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/technikhil.wordpress.com/466/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/technikhil.wordpress.com/466/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/technikhil.wordpress.com/466/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/technikhil.wordpress.com/466/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/technikhil.wordpress.com/466/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/technikhil.wordpress.com/466/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=technikhil.wordpress.com&amp;blog=111188&amp;post=466&amp;subd=technikhil&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://technikhil.wordpress.com/2010/04/07/juggling-code-the-coding-zone-and-burnouts/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<georss:point>8.532389 76.955846</georss:point>
		<geo:lat>8.532389</geo:lat>
		<geo:long>76.955846</geo:long>
		<media:content url="http://1.gravatar.com/avatar/d6a8b31986a4ab92e7afd96ee89a96e4?s=96&#38;d=http%3A%2F%2Ftechnikhil.wordpress.com%2Fwp-content%2Fthemes%2Fpub%2Finuit-types%2Fimages%2Fgravatar.png" medium="image">
			<media:title type="html">technikhil</media:title>
		</media:content>
	</item>
	</channel>
</rss>
