<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" gd:etag="W/&quot;CkUESXs7eip7ImA9WhVUFkQ.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962</id><updated>2012-05-22T18:06:48.502+05:30</updated><category term="barcamp" /><category term="continuous integration" /><category term="news" /><category term="quirks" /><category term="web" /><category term="books" /><category term="bug" /><category term="recruiting" /><category term="registry" /><category term="spawn" /><category term="gwt" /><category term="methodology" /><category term="symlinks" /><category term="innovative" /><category term="rubyconfindia2012" /><category term="dzone" /><category term="DCB1" /><category term="junction" /><category term="css" /><category term="evolving" /><category term="devcampbangalore" /><category term="utf8" /><category term="rails" /><category term="video" /><category term="c42" /><category term=".net" /><category term="performance" /><category term="cc.rb" /><category term="xp" /><category term="training" /><category term="rant" /><category term="undernet" /><category term="resharper" /><category term="JSNI" /><category term="scala" /><category term="java" /><category term="refactoring" /><category term="activ" /><category term="anti-pattern" /><category term="security" /><category term="intro" /><category term="humour" /><category term="thoughtworks" /><category term="intellij" /><category term="hackdayindia" /><category term="india" /><category term="barcampbangalore5" /><category term="django" /><category term="links" /><category term="mochikit" /><category term="hiring" /><category term="mvc" /><category term="leisure" /><category term="interview" /><category term="photo" /><category term="brug" /><category term="twb" /><category term="opinion" /><category term="content repository" /><category term="digg" /><category term="practices" /><category term="mongrel" /><category term="mac" /><category term="offshore" /><category term="darkness" /><category term="OOP" /><category term="quality" /><category term="fun" /><category term="feedburner" /><category term="testing" /><category term="release" /><category term="architecture" /><category term="musings" /><category term="nasscom" /><category term="gotcha" /><category term="prototype" /><category term="ide" /><category term="ruby" /><category term="rdt" /><category term="dragdrop" /><category term="jcr" /><category term="skills" /><category term="rubymonk" /><category term="javascript" /><category term="bangpypers" /><category term="tomcat" /><category term="event" /><category term="conference" /><category term="osx" /><category term="sysinternals" /><category term="bangalore" /><category term="announcement" /><category term="GI" /><category term="unconference" /><category term="agile" /><category term="python" /><category term="plugin" /><category term="analysis" /><category term="javaone" /><category term="browser" /><category term="enterprise" /><category term="ci" /><category term="barcampbangalore4" /><category term="windows" /><category term="irc" /><category term="tdd" /><category term="tweak" /><category term="recruitment" /><category term="rubyconf" /><category term="hack" /><category term="jackrabbit" /><category term="dcb2" /><category term="oss" /><category term="cycle" /><category term="tool" /><category term="feedflare" /><category term="REST" /><category term="feedflareunit" /><category term="ajax" /><category term="howto" /><category term="programming" /><category term="bcb4" /><category term="deployment" /><category term="startup" /><category term="tw" /><category term="lucene" /><category term="metaprogramming" /><category term="2010" /><category term="entrepreneurship" /><category term="noob" /><category term="dining table" /><category term="YUI" /><category term="tibco" /><category term="versioning" /><category term="literature" /><category term="jquery" /><category term="activeresource" /><category term="cool" /><category term="rubyconf2011" /><category term="blogger" /><category term="call" /><category term="twitter" /><category term="functional programming" /><category term="search" /><category term="mingle" /><category term="microsoft" /><category term="book review verdict:read" /><category term="jruby" /><category term="goldberg" /><category term="wrest" /><title>Electric Sheep Blog</title><subtitle type="html">On hacking and startups &lt;br&gt; by &lt;a href="#Profile1"&gt;Sidu Ponnappa&lt;/a&gt;</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.sidu.in/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Sidu Ponnappa</name><uri>https://profiles.google.com/103040704249449871264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGXL6VUh5X0/AAAAAAAAAAI/AAAAAAAAAYM/kP3kKE520zA/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>160</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/diningtablecoder" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="diningtablecoder" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;Dk4HQn46fSp7ImA9WhVUEUg.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-9180907712631904622</id><published>2012-05-16T12:27:00.001+05:30</published><updated>2012-05-16T13:25:33.015+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-16T13:25:33.015+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="rubymonk" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>Everyone should learn programming</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
I had no intention of writing about this meme because I'm biased&amp;nbsp;by the fact that we're building a &lt;a href="http://rubymonk.com/"&gt;platform to allow programmers to teach programming&lt;/a&gt;, but then Jeff Atwood wrote his "&lt;a href="http://www.codinghorror.com/blog/2012/05/please-dont-learn-to-code.html"&gt;Please don't learn to code&lt;/a&gt;" post. I'm sitting at home, grumpy because I'm ill, so this was all the excuse I needed to get this off my chest.&lt;br /&gt;
&lt;br /&gt;
Frankly, I don't care if Mayor Bloomberg &lt;i&gt;should &lt;/i&gt;learn to code, mostly because I don't live in New York. For me, what's important is the fact that he will &lt;b&gt;&lt;i&gt;never learn to code non-trivial programs&lt;/i&gt;&lt;/b&gt;&amp;nbsp;by going about it in this manner.&amp;nbsp;Much of the hype on the internet misleads people into assuming that by writing a code snippet a week, they're going to become programmers. That's like assuming if you solve a Sudoku problem once a week for a year, you will become a mathematician.&lt;br /&gt;
&lt;br /&gt;
Learning programming is not easy. It's easier than many other disciplines because you can learn through experimentation, but to be a good programmer, you need to make the effort to understand how computers work.&lt;br /&gt;
&lt;br /&gt;
The less you understand, the less effective you are as a programmer.&lt;br /&gt;
&lt;br /&gt;
You see, any non-trivial software program depends on dozens or hundreds of abstractions. For the non-programmers reading this post, an abstraction basically hides a complex mechanism or concept behind a simple interface. A real-world example of an abstraction would be the remote control of a television - you don't need to know what goes on in the circuitry of the TV to switch channels; you know that hitting that button makes it happen, and all of the underlying complexity is "abstracted away" from you, the user. This is ok, because you are not in the business of designing and building TVs.&lt;br /&gt;
&lt;br /&gt;
You can certainly write many trivial programs without looking under the hood, but for bigger pieces of software, &lt;i&gt;some &lt;/i&gt;understanding of how all the abstractions in your system work is essential. Memory management, threading, storage and scheduling are just some of the areas one needs to be familiar with before you can understand why your program behaves in a certain way. Once you get into production software you need to understand networks, packets, routing - I could go on like this for five minutes. Without understanding all of this, the behaviour of your program is a black box to you. When something goes wrong - which it will - you will have no idea why it happened. And you will not be able to fix it.&lt;br /&gt;
&lt;br /&gt;
Getting the basics sorted would easily take six to twelve months of serious study. Without this, you're just messing around doing building "Hello world" programs that provide gratification to you and little else.&lt;br /&gt;
&lt;br /&gt;
Long story short, there's nothing stopping anyone from becoming a kick-ass programmer, but remember, programming isn't an exception to the &lt;a href="http://en.wikipedia.org/wiki/10000_hours_rule"&gt;10,000 hour rule&lt;/a&gt;.&lt;br /&gt;
&lt;h4&gt;






&lt;hr /&gt;






If you liked this post, you could&lt;/h4&gt;
&lt;h4 style="text-align: center;"&gt;






&lt;a href="http://feeds.sidu.in/diningtablecoder"&gt;subscribe&lt;/a&gt;&amp;nbsp;to the feed&lt;/h4&gt;
&lt;h4 style="text-align: center;"&gt;






&lt;a class="twitter-follow-button" data-show-count="false" href="https://twitter.com/ponnappa"&gt;Follow @ponnappa&lt;/a&gt;&lt;/h4&gt;
&lt;h4 style="text-align: center;"&gt;






or simply&amp;nbsp;&lt;a href="http://www.blogger.com/comment.g?blogID=3718956085911858962&amp;amp;postID=9180907712631904622"&gt;comment on this post&lt;/a&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-9180907712631904622?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=yUl5loUhiOE:yCHECv5APnU:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=yUl5loUhiOE:yCHECv5APnU:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=yUl5loUhiOE:yCHECv5APnU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=yUl5loUhiOE:yCHECv5APnU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=yUl5loUhiOE:yCHECv5APnU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=yUl5loUhiOE:yCHECv5APnU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=yUl5loUhiOE:yCHECv5APnU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=yUl5loUhiOE:yCHECv5APnU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=yUl5loUhiOE:yCHECv5APnU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=yUl5loUhiOE:yCHECv5APnU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/yUl5loUhiOE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/9180907712631904622/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=9180907712631904622" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/9180907712631904622?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/9180907712631904622?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2012/05/everyone-should-learn-programming.html" title="Everyone should learn programming" /><author><name>Sidu Ponnappa</name><uri>https://profiles.google.com/103040704249449871264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGXL6VUh5X0/AAAAAAAAAAI/AAAAAAAAAYM/kP3kKE520zA/s512-c/photo.jpg" /></author><thr:total>5</thr:total></entry><entry gd:etag="W/&quot;C0MAQ38-fSp7ImA9WhVXF0s.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-7929225668142039415</id><published>2012-04-14T02:48:00.001+05:30</published><updated>2012-04-18T20:34:02.155+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-18T20:34:02.155+05:30</app:edited><title>This explains a lot about DHH's code</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span style="background-color: white; color: #333333; font-family: verdana, sans-serif; font-size: 12px; line-height: 18px;"&gt;Even if you’re talking about unit testing, the only way I’ve found tests to help design is by ensuring that I don’t regress when refactoring. That’s a very valuable attribute, probably the key attribute of testing for me, but I file that under “don’t create bugs”, not under “helped me design”.&lt;/span&gt;&lt;/blockquote&gt;
&lt;br /&gt;
From the comments by DHH on his own &lt;a href="http://37signals.com/svn/posts/3159-testing-like-the-tsa?108#comments"&gt;blog post&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
This tells us that DHH &amp;nbsp;fails to grasp how the value created by regression testing using unit tests is&amp;nbsp;&lt;a href="http://blog.c42.in/tdd-isnt-about-testing-its-about-design"&gt;different from the value created by designing your interfaces using TDD&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-7929225668142039415?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=JTHx6_eazYU:qqxNjCDQjEk:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=JTHx6_eazYU:qqxNjCDQjEk:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=JTHx6_eazYU:qqxNjCDQjEk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=JTHx6_eazYU:qqxNjCDQjEk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=JTHx6_eazYU:qqxNjCDQjEk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=JTHx6_eazYU:qqxNjCDQjEk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=JTHx6_eazYU:qqxNjCDQjEk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=JTHx6_eazYU:qqxNjCDQjEk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=JTHx6_eazYU:qqxNjCDQjEk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=JTHx6_eazYU:qqxNjCDQjEk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/JTHx6_eazYU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/7929225668142039415/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=7929225668142039415" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/7929225668142039415?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/7929225668142039415?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2012/04/this-explains-lot.html" title="This explains a lot about DHH's code" /><author><name>Sidu Ponnappa</name><uri>https://profiles.google.com/103040704249449871264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGXL6VUh5X0/AAAAAAAAAAI/AAAAAAAAAYM/kP3kKE520zA/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0ANR3c8fSp7ImA9WhVVFks.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-847211220596866795</id><published>2012-04-05T03:15:00.014+05:30</published><updated>2012-05-10T21:33:16.975+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-10T21:33:16.975+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="entrepreneurship" /><category scheme="http://www.blogger.com/atom/ns#" term="startup" /><category scheme="http://www.blogger.com/atom/ns#" term="bangalore" /><category scheme="http://www.blogger.com/atom/ns#" term="rails" /><title>No virtuous circle, or how India's Silicon Valley is... different</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;br /&gt;
I've lived in Bangalore since I was three - we moved here in 1987 after my father retired from the public sector that year. Bangalore, then, was known as a retirement city, famed for its pleasant weather and abundant greenery. The Indian economy &lt;a href="http://en.wikipedia.org/wiki/Indian_economy#Pre-liberalisation_period_.281947.E2.80.931991.29"&gt;was still closed&lt;/a&gt;, most of the jobs were in the public sector and salaries were low. Top executives in the public sector earned less than Rs. 60,000 a year - my father retired as the General Manager of &lt;a href="http://en.wikipedia.org/wiki/United_India_Insurance_Company_Limited"&gt;United India Insurance&lt;/a&gt;, giving me a reference point. At an exchange rate of about fourteen rupees to the dollar, this amounted to around 4200 US dollars a year, give or take. Somewhere around this time was when Bangalore started to be called the "&lt;a href="http://en.wikipedia.org/wiki/Silicon_Valley_of_India"&gt;Silicon Valley of India&lt;/a&gt;" by the local media.&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;
















&lt;br /&gt;
&lt;/h3&gt;
&lt;h3 style="text-align: left;"&gt;
















&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;1997&lt;/span&gt;&lt;/h3&gt;
&lt;br /&gt;
Ten years on and six years into the &lt;a href="http://en.wikipedia.org/wiki/Indian_economy#Post-liberalisation_period_.28since_1991.29"&gt;post-liberalisation&lt;/a&gt; economy, Bangalore was already starting to become a software hub. I remember my cousin doing a course in Java and joining &lt;a href="http://en.wikipedia.org/wiki/Wipro"&gt;Wipro&lt;/a&gt;, making him one of the lucky few to have a well paying job at a respected firm. At this point, Texas Instruments had been in Bangalore for twelve years and &lt;a href="http://en.wikipedia.org/wiki/Infosys"&gt;Infosys&lt;/a&gt; for fourteen. Wipro had &lt;a href="http://en.wikipedia.org/wiki/Wipro#History"&gt;diversified from vegetable oil into IT&lt;/a&gt; a full seventeen years earlier. Younger upstarts like &lt;a href="http://en.wikipedia.org/wiki/MphasiS"&gt;MphasiS&lt;/a&gt; hadn't been founded yet. The average software engineer earned about Rs. 100,000 a year right out of college which at 1997 exchange rates was around 2800 dollars a year. Senior executives in the private sector were taking home heady sums like fifteen lakhs (1 lakh == 100,000) a year if memory serves.&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;
















&lt;br /&gt;
&lt;/h3&gt;
&lt;h3 style="text-align: left;"&gt;
















&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;2007&lt;/span&gt;&lt;/h3&gt;
&lt;br /&gt;
Twenty years on, it's 2007. This was the year &lt;a href="http://flipkart.com/"&gt;Flipkart.com&lt;/a&gt;&amp;nbsp;was founded by a couple of ex-Amazon engineers. I'm twenty three years old and working at &lt;a href="http://thoughtworks.com/"&gt;ThoughtWorks&lt;/a&gt; while also (with my employer's permission) moonlighting at my first start-up, &lt;a href="http://inactiv.com/"&gt;InActiv Labs&lt;/a&gt;, where we're frantically trying to raise money. Our first offering, a SMS based personal accounting service had tanked the previous year, but our group messaging service, Activ Mobs, had gone viral. Serving the 60,000 users we accumulated in the two months after launch was costing us about three thousand rupees with spikes to six thousand rupees - every day. We were basically spending 60% of our combined founders incomes from our day jobs just paying for text messages and the numbers were rising rapidly. Raising funding was absolutely critical. Several of the bigger VCs were already in India back then, and we pitched to all of them, but for better or worse, failed to raise money. A year passed in this manner, with the service limping along. By mid-2008, we'd decided that we were going to pour our combined life savings of about five lakhs (INR 500,000) into the business in a last ditch attempt to save it.&lt;br /&gt;
&lt;br /&gt;
One month later, my mother was diagnosed with a &lt;a href="http://en.wikipedia.org/wiki/Leiomyosarcoma"&gt;leiomyosarcoma&lt;/a&gt;. After that, there was no question of spending my savings - every paisa had to be saved against the possibility of our life insurance cover running out. For twelve months I hoarded money and liquidated all my investments against a rainy day. Then, through sheer good fortune, my father's forty year career in public sector insurance paid off - a new government scheme was approved which allowed retired senior executives and their families nearly infinite health cover. We could finally afford to have my mother stay in a bigger, better hospital room when she went in for her chemo. Our personal financial situation no longer impacted her treatment. My relief was immense, but it would be another six months before I even &lt;a href="http://blog.sidu.in/2011/05/c42-engineering-year-one.html"&gt;thought about starting up again&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
I tell this story only to illustrate out what is perhaps obvious: That life is uncertain and when things go wrong, entrepreneurs running bootstrapped businesses are often forced to choose between loved ones and their venture, mostly for financial reasons.&lt;br /&gt;
&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;
















&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;2012&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
So on to the present, twenty five years after I moved to Bangalore. The top Indian outsourced services firms have all exceeded 100,000 employees. The total number of truly successful Indian internet startups is under ten, and every single one of them replicates a validated business model imported from the first world. Funding is easier to come by, but Bangalore is still an arid desert when compared with the Valley. Basically, the Indian tech startup ecosystem is still a tiny tiny thing in much need of nurturing.&lt;br /&gt;
&lt;br /&gt;
From an economic perspective, salaries are rising at 15% annually, with most college grads starting at one of the big services companies with around 3 lakh rupees a year (or 6000 dollars at the current exchange rate). Most mechanical engineering, civil engineering, industrial engineering and chemical engineering graduates wind up at one of the large services firms where they learn to how to write software. Their engineering degrees are largely wasted; the more driven among them embrace this reality and do an MBA in a year or two and stop writing code in favour of a career in management.&lt;br /&gt;
&lt;br /&gt;
CS grads that are above average start work at about five lakhs a year, and the really good ones can start with ten lakhs or more, though there are just a handful of openings at this salary level. Salaries for roles that require serious programming skills are going through the roof, but it's still incredibly hard sifting through the chaff to find people qualified for the role. Amazon, Zynga and other product companies that have development arms in Bangalore still find talent inexpensive relative to the six figure salaries they pay in the US and are happy to pay very very well, especially in contrast with the large services firms. Most capable programmers now naturally gravitate toward established product firms, where it's not unusual for someone with five years of experience to earn twenty lakhs a year (40,000 dollars at current conversion rates). You'll notice that while the India-US PPP ratio is 1:5, software salaries are actually at about 1:3.&lt;br /&gt;
&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;
















&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;No virtuous circle&lt;/span&gt;&lt;/h3&gt;
&lt;br /&gt;
This now brings me back to the title of this post, the "virtuous circle." In the valley, failing at a startup for the right reasons earns respect and makes people take you more seriously. It also makes it more likely that you'll raise funding in the future. Failure benefits you in visible ways, creating a positive feedback loop that works to increase your opportunities. In the valley, you're surrounded by people that made serious money by founding or working at startups. It's obviously a viable way to earn a living; sure, starting a Facebook or a Google is like winning the lottery, but even without you can earn a very respectable income from your salary and stock options. Startup meet-ups happen every other week, with a hundred people or more in attendance at every one.&lt;br /&gt;
&lt;br /&gt;
In contrast, I don't know anybody in my personal network in Bangalore that's made significant money from a tech startup. I know &lt;i&gt;of&lt;/i&gt;&amp;nbsp;a handful of people, but have never met them. Start up meetings are rare, with a handful of people showing up. Most of the time in the meeting is spent &lt;a href="http://en.wikipedia.org/wiki/Bikeshedding"&gt;bike-shedding&lt;/a&gt;. If you're lucky, you'll meet one person running their own business at such a meeting - the rest are all aspiring entrepreneurs.&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;
















&lt;br /&gt;
&lt;/h3&gt;
&lt;h3 style="text-align: left;"&gt;
















&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;Negative feedback loops&lt;/span&gt;&lt;/h3&gt;
&lt;br /&gt;
In India, failing at a startup means you go back to a regular day job for a couple of years to refill your bank account. Your failures create no additional value, because the learning from them aren't useful to the current ecosystem. You'll certainly get a regular job based off past experience, but don't expect the fact that you started a company to count for much. We don't have two generations of successful technology entrepreneurs ready to give a leg up to the current crop by mentoring them. We don't have the early stage investment ecosystem to infuse money into promising businesses. Most fundamentally, we don't have a society that values risk takers, because in an economy like India's, risk takers crash and burn and may well take their families with them. Everyone, from your parents to your siblings to your in-laws will call you crazy for giving up that cushy job at a top product firm. And you know what? They're likely right.&lt;br /&gt;
&lt;br /&gt;
Here, doing a product startup only makes financial sense if you're in your early twenties, intend to remain single or have a substantial inheritance. As you get older, you absolutely need a steady, significant income because unlike the first world, you're paying for your kids education from the age of three and up. You're likely to also be supporting your parents by the time you're is your early forties. Education and healthcare are, as I'm sure you know, expensive.&lt;br /&gt;
&lt;br /&gt;
This means that you have a narrow window early on to successfully do a product start up. Missing that window means the realities of life will force you into a regular job. Even if you tenaciously hang on, you're doing so knowing that you're forcing your family to compromise on their lifestyle to allow you to pursue your dreams.&lt;br /&gt;
&lt;br /&gt;
Added to this is social pressure from older generations, many of whom lived through the Licence Raj and struggled to find &lt;i&gt;any&lt;/i&gt;&amp;nbsp;job, leave alone start something of their own. As a friend of mine pointed out so succinctly, unless you're fabulously, visibly successful, you're always the chap running that "computer angadi" ("computer shop" in Kannada). To most of our grandparents and parents, quitting a steady job is tantamount to social and financial suicide.&lt;br /&gt;
&lt;br /&gt;
Quitting a steady job at a big-brand firm to join a smaller company is not as bad, because, you know, you're still an employee (which is a good thing), but they'll still call you stupid for giving up the brand. "Your son didn't get job in Infosys-aa?" was a question my mother had to field from all quarters when I joined first started working.&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;
















&lt;br /&gt;
&lt;/h3&gt;
&lt;h3 style="text-align: left;"&gt;
















&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;Doing it right means playing safe&lt;/span&gt;&lt;/h3&gt;
&lt;br /&gt;
In India, the deck is both socially and economically stacked against the entrepreneur. The question, then, is how do we change the odds and make life a little easier for ourselves?&lt;br /&gt;
&lt;br /&gt;
Let me start by outlining the constraints that we need to satisfy:&lt;br /&gt;
1) You need market-equivalent income to support those who depend on you.&lt;br /&gt;
2) Your business needs to be stable so you're better able to hire.&lt;br /&gt;
3) Your business needs to be very profitable so you can pay well, because you're looking to hire top talent, you're competing with Amazon and Zynga, not Infosys.&lt;br /&gt;
&lt;br /&gt;
You'll notice that there's a conflict inherent in (2) and (3). Stable business models grow slowly and usually aren't very profitable. Since you clearly can't do both, you need to pick one. Most entrepreneurs in Silicon valley shoot for (3) and trust in their ability to raise money and bring in senior advisors to introduce some stability. We don't have that luxury, so we need to shoot for (2) first, and then figure out (3).&lt;br /&gt;
&lt;br /&gt;
Satisfying these three constraints led us to the business model that C42 Engineering currently follows. Here's our reasoning:&lt;br /&gt;
1) We solved the market equivalent income problem by starting out as a boutique Ruby consultancy. We get good rates, which means we can pay fairly well.&lt;br /&gt;
2) A services business run right is very stable and predictable. It is also an excellent source of challenging engineering projects, making it even more attractive to programmers which in turn makes it easier to hire.&lt;br /&gt;
3) Channel 100% of services profits into a product arm with multiple products if possible. Iterate. Fail fast. Ship. Rinse. Repeat.&lt;br /&gt;
&lt;br /&gt;
C42 Labs, our product arm that was responsible for &lt;a href="http://rubymonk.com/"&gt;RubyMonk&lt;/a&gt;, has an annual budget of 60,000 dollars, a sum we're likely to double in the coming year. This is about 4.5 times my &lt;i&gt;annual&lt;/i&gt; salary when I quit to start C42 Engineering two years ago, so it's clearly an improvement over my ability to fund such a project back then. It not be much when compared to the millions that startups in the Valley routinely raise, but it's a solid, dependable sum produced in a sustainable manner. We're also creating a brilliant team of engineers in the process of growing the consulting business and are getting to work on some amazing projects for &amp;nbsp;interesting, successful companies in the process.&lt;br /&gt;
&lt;br /&gt;
We have big dreams for RubyMonk and the learning space. The ultimate goal of the &lt;a href="http://en.wikipedia.org/wiki/The_Diamond_Age"&gt;Young Lady's Illustrated Primer&lt;/a&gt; beckons. But the best ideas sometimes fail, and if, to our ill fortune RubyMonk is one of them, we'll still be back at work on the next business plan in our pipeline the very next day. No downtime, no salary cuts, no layoffs, no bad mojo.&lt;br /&gt;
&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;
















&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;Conclusion&lt;/span&gt;&lt;/h3&gt;
&lt;br /&gt;
If you've been involved in the Bangalore start up scene, you know that services start-ups are often looked down upon as being "impure." When I was a working on Activ Mobs, I too was of this opinion and strongly felt I'd never like to do a services business. This harsh perception is driven by the fact that many product startups start doing a little consulting on the side to ease cashflow and before you know it, they've become full fledged services firms. The comfort that a steady stream of revenue offers is extremely attractive after you've scrimped and compromised for a couple of years.&amp;nbsp;There's a second, more valid reason for such critical view of services - every new business you add will dilute your focus. When you have both consulting and product, you focus is halved. This is a risk any diversified business faces, and frankly, there's no good answer to this besides "be more disciplined."&lt;br /&gt;
&lt;br /&gt;
What I do have to say is this: Deal with the risk. Define it. Work it into your business model. The solution to a paucity of early stage funding and expensive talent isn't hoping that things will get better, and that your business will survive until then. Figure out how to make a small amount of money early, and in a reliable manner. Then re-invest and diversify. You'll grow more slowly and take longer to become massively successful, but you're now much more likely to make it to the end of the road.&lt;br /&gt;
&lt;br /&gt;
Don't worry about local "wisdom" - &amp;nbsp;just do the sensible thing. This could mean you start with consulting like us, or simply bootstrapping in you spare time like &lt;a href="http://blogvault.net/about"&gt;my friend Akshat's doing&lt;/a&gt;&amp;nbsp;until you get to sustainable revenue, then quit to run the business full time.&lt;br /&gt;
&lt;br /&gt;
But whatever happens, don't let the naysayers stop you from starting up. Just remember that you must be pragmatic about how you go about it, because even though we wish it were more similar, Bangalore isn't quite Silicon Valley yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4 style="text-align: left;"&gt;


&lt;hr /&gt;

If you liked this post, you could&lt;/h4&gt;
&lt;h4 style="text-align: center;"&gt;
















&lt;a href="http://feeds.sidu.in/diningtablecoder"&gt;subscribe&lt;/a&gt;&amp;nbsp;to the feed&lt;/h4&gt;
&lt;h4 style="text-align: center;"&gt;
















&lt;a class="twitter-follow-button" data-show-count="false" href="https://twitter.com/ponnappa"&gt;Follow @ponnappa&lt;/a&gt;
&lt;script&gt;
!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");
&lt;/script&gt;&lt;/h4&gt;
&lt;h4 style="text-align: center;"&gt;




&lt;a href="http://hackerstreet.in/item?id=15042"&gt;join the conversation&lt;/a&gt; on HackerStreet&lt;/h4&gt;
&lt;h4 style="text-align: center;"&gt;
















or simply &lt;a href="http://www.blogger.com/comment.g?blogID=3718956085911858962&amp;amp;postID=847211220596866795"&gt;comment on this post&lt;/a&gt;&lt;/h4&gt;
&lt;div style="text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-847211220596866795?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=VU4AevWjL4c:1eAAcOLaG_c:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=VU4AevWjL4c:1eAAcOLaG_c:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=VU4AevWjL4c:1eAAcOLaG_c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=VU4AevWjL4c:1eAAcOLaG_c:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=VU4AevWjL4c:1eAAcOLaG_c:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=VU4AevWjL4c:1eAAcOLaG_c:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=VU4AevWjL4c:1eAAcOLaG_c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=VU4AevWjL4c:1eAAcOLaG_c:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=VU4AevWjL4c:1eAAcOLaG_c:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=VU4AevWjL4c:1eAAcOLaG_c:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/VU4AevWjL4c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/847211220596866795/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=847211220596866795" title="15 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/847211220596866795?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/847211220596866795?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2012/04/no-virtuous-circle-or-how-indias.html" title="No virtuous circle, or how India's Silicon Valley is... different" /><author><name>Sidu Ponnappa</name><uri>https://profiles.google.com/103040704249449871264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGXL6VUh5X0/AAAAAAAAAAI/AAAAAAAAAYM/kP3kKE520zA/s512-c/photo.jpg" /></author><thr:total>15</thr:total></entry><entry gd:etag="W/&quot;D0EBR3Y_eSp7ImA9WhVRFEU.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-2945331396331498215</id><published>2012-03-23T12:24:00.000+05:30</published><updated>2012-03-23T12:24:16.841+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-23T12:24:16.841+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="rubyconfindia2012" /><category scheme="http://www.blogger.com/atom/ns#" term="rubyconf" /><title>I'm speaking at RubyConf India 2012</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;I'm speaking at &lt;a href="http://rubyconfindia.org/"&gt;RubyConf India&lt;/a&gt; in Pune this year for the third year running! You can find out more at my &lt;a href="http://lanyrd.com/people/ponnappa"&gt;Lanyrd profile&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;
&lt;a href="http://rubyconfindia.org/"&gt;&lt;br /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;a href="http://rubyconfindia.org/"&gt;&lt;img alt="I am speaking at RubyConf India 2012" src="http://rubyconfindia.org/2012/assets/badges/speaker.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://rubyconfindia.org/"&gt;    &lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-2945331396331498215?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=2TQfm6w2Ah0:cGtIETHhkKE:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=2TQfm6w2Ah0:cGtIETHhkKE:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=2TQfm6w2Ah0:cGtIETHhkKE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=2TQfm6w2Ah0:cGtIETHhkKE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=2TQfm6w2Ah0:cGtIETHhkKE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=2TQfm6w2Ah0:cGtIETHhkKE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=2TQfm6w2Ah0:cGtIETHhkKE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=2TQfm6w2Ah0:cGtIETHhkKE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=2TQfm6w2Ah0:cGtIETHhkKE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=2TQfm6w2Ah0:cGtIETHhkKE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/2TQfm6w2Ah0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/2945331396331498215/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=2945331396331498215" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/2945331396331498215?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/2945331396331498215?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2012/03/im-speaking-at-rubyconf-india-2012.html" title="I'm speaking at RubyConf India 2012" /><author><name>Sidu Ponnappa</name><uri>https://profiles.google.com/103040704249449871264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGXL6VUh5X0/AAAAAAAAAAI/AAAAAAAAAYM/kP3kKE520zA/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D04ERXk4eip7ImA9WhVVEkQ.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-8884385823837008045</id><published>2012-03-05T17:32:00.002+05:30</published><updated>2012-05-06T14:48:24.732+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-06T14:48:24.732+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="entrepreneurship" /><category scheme="http://www.blogger.com/atom/ns#" term="startup" /><title>On building companies, open spaces and with a little pairing on the side</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
Here are two longish emails that I should have converted into blog posts. I'm lazy, though.&lt;br /&gt;
&lt;br /&gt;
Whatever. Here they are.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Switching from a solo contractor to being a development company&lt;/span&gt; (&lt;a href="http://lists.lrug.org/pipermail/chat-lrug.org/2012-February/006976.html"&gt;full thread&lt;/a&gt;)&lt;br /&gt;
&lt;blockquote&gt;
Luke,&lt;br /&gt;
&lt;br /&gt;
&amp;gt; I like doing a range of stuff, for example managing client&lt;br /&gt;
So is it fair to say you enjoy managing entire projects, and that this&lt;br /&gt;
is what is motivating you to consider starting a company?&lt;br /&gt;
&lt;br /&gt;
If yes, then here are a few thoughts off the top of my head.&lt;br /&gt;
&lt;br /&gt;
Why start a company:&lt;br /&gt;
* You should figure out goals for your business; remember, a business&lt;br /&gt;
is best run based on a set of principles rather than on implementation&lt;br /&gt;
details. The implementations (and consequently the role you play as a&lt;br /&gt;
founder) change based on market situations, but principles will remain&lt;br /&gt;
broadly constant. What you've outlined in your response is what *you*&lt;br /&gt;
want to do; as someone already pointed out on this thread, as a&lt;br /&gt;
business owner, you'll find yourself having little to do with the&lt;br /&gt;
execution of projects once you grow even a little bit. Pre-sales,&lt;br /&gt;
sales, strategy, recruting, client satisfaction and employee&lt;br /&gt;
satisfaction will take up *all* your time. Hacking open source is&lt;br /&gt;
something I now do over weekends as a hobby. That's just how it is.&lt;br /&gt;
&lt;br /&gt;
* Define success criteria. "I know my company is successful when foo&lt;br /&gt;
happens in a regular and measurable manner." If you don't define&lt;br /&gt;
success criteria, you won't know if your business is stagnating.&lt;br /&gt;
&lt;br /&gt;
* You didn't mention making more money than you are now as a goal.&lt;br /&gt;
Even if your business isn't about increasing your income, it still&lt;br /&gt;
needs to be sustainable. This means that you *have* to set revenue and&lt;br /&gt;
profitability targets for the business, or you will stagnate quickly.&lt;br /&gt;
Stagnant businesses find it very hard to survive in poor economic&lt;br /&gt;
conditions.&lt;br /&gt;
&lt;br /&gt;
* Try to play the devil's advocate; question your every motive and&lt;br /&gt;
decision, and come up with alternatives that provide the same outcome&lt;br /&gt;
without starting a business. Evaluate each of those alternatives very&lt;br /&gt;
honestly, because, maybe they're actually a better fit - starting a&lt;br /&gt;
business is a risky proposition. And if they don't, they'll help you&lt;br /&gt;
understand your own motivations better, which in turn will help you&lt;br /&gt;
understand the principles around which you want to build your company.&lt;br /&gt;
&lt;br /&gt;
Sales:&lt;br /&gt;
* Start small, use sources that build trust like odesk and elance -&lt;br /&gt;
treat them as your marketing arm. The 6% to 10% you pay them is your&lt;br /&gt;
marketing budget.&lt;br /&gt;
&lt;br /&gt;
* Your next objective should be to get *off* these sites as quickly as&lt;br /&gt;
possible. That way, you force yourself to do branding, positioning and&lt;br /&gt;
marketing, channeling that same budget toward these activities.&lt;br /&gt;
&lt;br /&gt;
* How you do your marketing is a function of whom you're selling to.&lt;br /&gt;
How big are your clients? How much revenue do they make? Whom do you&lt;br /&gt;
speak to in their hierarchy - the founder/CEO, middle management, or&lt;br /&gt;
engineering? All of these questions will help you determine how you&lt;br /&gt;
present yourself and your company to them. To some prospective&lt;br /&gt;
clients, you'll be the experienced engineer who happens to run a&lt;br /&gt;
company. To others, maybe you need to be the CEO of a consultancy.&lt;br /&gt;
However it plays out, market segmentation is absolutely critical.&lt;br /&gt;
&lt;br /&gt;
* Identify sales channels. IRC, mailing lists, meetup groups,&lt;br /&gt;
conferences, hoardings, TV ads - it all depends on what your budget is&lt;br /&gt;
and which market segment you're targetting.&lt;br /&gt;
&lt;br /&gt;
* You can't be good at everything. Understand and accept that the&lt;br /&gt;
moment you start a company, you are a manager, and a good manager&lt;br /&gt;
knows when he/she needs help. Don't hesitate to hire people to fill&lt;br /&gt;
roles that you're no good at yourself (remember the 10k hour rule -&lt;br /&gt;
you just don't have the time to become good at everything). So long as&lt;br /&gt;
these people increase revenue and profits, you're fine. In my&lt;br /&gt;
experience, one or more  trusted, competent co-founders who complement&lt;br /&gt;
your skills can make a world of difference (and make your life less&lt;br /&gt;
stressful).&lt;br /&gt;
&lt;br /&gt;
Miscellaneous:&lt;br /&gt;
* Services revenue is a function of hourly rates * no of hours worked.&lt;br /&gt;
There are two ways to succeed at this in a financial sense - the&lt;br /&gt;
McKinsey model, and the Infosys model. One increases rates, the other&lt;br /&gt;
increases the number of hours by hiring large numbers of people. Be&lt;br /&gt;
clear about which model you want to apply to your company. If you do&lt;br /&gt;
neither, your profits will suffer, even though you may have&lt;br /&gt;
significant revenue.&lt;br /&gt;
&lt;br /&gt;
* The McKinsey model will force you to push rates up steadily, and&lt;br /&gt;
also to hire increasingly better talent. Branding your business to&lt;br /&gt;
increase rates and recruiting top talent are the core problems to be&lt;br /&gt;
solved.&lt;br /&gt;
&lt;br /&gt;
* The Infosys model will force you to hire more people. Maintaining&lt;br /&gt;
acceptable quality while keeping rates low, and recruiting sufficient&lt;br /&gt;
people are the core problems to be solved.&lt;br /&gt;
&lt;br /&gt;
* Build up a cash buffer. Services sales (well, all sales :)) are&lt;br /&gt;
cyclic and if you hit a slump, it will hurt. In the beginning, hedge&lt;br /&gt;
by hiring contractors until you've got (say) three months salary in&lt;br /&gt;
the bank. Then start hiring employees. Remember, you can't do enough&lt;br /&gt;
to keep the people who work with you happy. Step one is them knowing&lt;br /&gt;
that their salaries are not constantly at risk.&lt;br /&gt;
&lt;br /&gt;
* Study. There are three lines of work that (off the top of my head) I&lt;br /&gt;
can think of that require constant study and reflection - medicine,&lt;br /&gt;
programming and business. You don't have to get an MBA, but you do&lt;br /&gt;
need to have a steady stream of books that you read and people that&lt;br /&gt;
you learn from. The bare minimum I would recommend is getting a&lt;br /&gt;
subscription to 'The Economist' and reading it religiously every week.&lt;br /&gt;
Try to also find semi-formal or formal advisors with industry&lt;br /&gt;
experience that you meet with (say) once a month to review your&lt;br /&gt;
business.&lt;br /&gt;
&lt;br /&gt;
Phew. Long post. I think that's a fair distillation of what we've&lt;br /&gt;
learned building our business over the last couple of years. Feel free&lt;br /&gt;
to ask questions if you want me to drill down into anything in greater&lt;br /&gt;
detail. I'm happy to also cite practical examples if it would help.&lt;br /&gt;
&lt;br /&gt;
Regards,&lt;br /&gt;
Sidu.&lt;br /&gt;
&lt;a href="http://c42.in/"&gt;http://c42.in&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://rubymonk.com/"&gt;http://rubymonk.com&lt;/a&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Some thoughts on open plan areas&lt;/span&gt; (&lt;a href="http://www.sfruby.info/messages/31738862/"&gt;full thread&lt;/a&gt;)&lt;br /&gt;
&lt;blockquote&gt;
I've worked in open spaces for about seven years now across several&lt;br /&gt;
different physical offices with different layouts, pair programming&lt;br /&gt;
the entire time. Based on conversations with my colleagues that shared&lt;br /&gt;
the same environments, it's obvious that different people responded&lt;br /&gt;
*very* differently to the same setting. Also, I'm going to address&lt;br /&gt;
pair programming separately, as workspaces and pairing are orthogonal&lt;br /&gt;
and their effects shouldn't be conflated. Finally, these are my&lt;br /&gt;
experiences, so YMMV.&lt;br /&gt;
&lt;br /&gt;
1) Large open space containing 120+ people - very hard for me to work&lt;br /&gt;
due to background noise, constant distractions, almost never zoned in&lt;br /&gt;
&lt;br /&gt;
2) Large open space containing ~20 people - brilliant, I loved all the&lt;br /&gt;
space, and other teams were far enough away that background noise was&lt;br /&gt;
negligible, yet they were clearly in line of sight so when I wanted to&lt;br /&gt;
ask a question, I could see if they were free and wander over. One of&lt;br /&gt;
my best experiences.&lt;br /&gt;
&lt;br /&gt;
3) Large open space containing about 80+ people - this was the same&lt;br /&gt;
space as in (1) but with fewer people in it and with our team being&lt;br /&gt;
off in a corner; it worked better than in (1) but not as well as (2)&lt;br /&gt;
&lt;br /&gt;
4) Connected open spaces, each containing a team of 2 to 4 people -&lt;br /&gt;
this I think worked moderately well; the lack of LOS raised thresholds&lt;br /&gt;
to communication, but the background noise problems and constant&lt;br /&gt;
interruptions by other colleagues was reduced&lt;br /&gt;
&lt;br /&gt;
Extrapolating from these, I'd say what worked best was a large enough&lt;br /&gt;
open space that folks didn't disturb each other, but still had LOS and&lt;br /&gt;
easy access. Second best is a set of connected, smaller, open spaces,&lt;br /&gt;
one each to a team (assuming of course that your teams are one to&lt;br /&gt;
three pairs).&lt;br /&gt;
&lt;br /&gt;
&amp;gt; Indeed, a lot of old research from MS showed that when coders have private&lt;br /&gt;
&amp;gt; offices, they are 2X as productive (yeah, %100 increase)&lt;br /&gt;
I think we make sweeping generalisations a little too easily. Writing&lt;br /&gt;
Windows code is not the same as writing a web app is not the same as&lt;br /&gt;
writing COBOL on a mainframe. Also, perhaps if those MS programmers&lt;br /&gt;
TDDed their code, they wouldn't have to hold so much of it in their&lt;br /&gt;
heads all the time, making intense concentration less necessary and&lt;br /&gt;
reducing defects, making them more collaborative, resulting in a&lt;br /&gt;
better shared understanding of the codebase and reduced truck-factor,&lt;br /&gt;
resulting in better software and happier engineers. Who knows, right?&lt;br /&gt;
Software engineering is a complex subject and I'd be wary of any *one*&lt;br /&gt;
factor being touted as a productivity silver-bullet. Ultimately, it&lt;br /&gt;
depends on the project and the people.&lt;br /&gt;
&lt;br /&gt;
Now on to pairing. Writing software alone is a completely different&lt;br /&gt;
thing from writing software in a team. If you work in a&lt;br /&gt;
self-organizing team, then it is important to realise the impact of&lt;br /&gt;
your social relationships on your productivity because team&lt;br /&gt;
productivity is everyone's problem, not some manager's. Pair&lt;br /&gt;
programming just increases the importance of recognising the social&lt;br /&gt;
aspects of software engineering. The objective is to be able to zone&lt;br /&gt;
in with your pair, and you do whatever suits (and this is likely going&lt;br /&gt;
to change with *every* person you pair with). I know pairs that shared&lt;br /&gt;
an iPod, that moved to a meeting room or balcony so they had less&lt;br /&gt;
distractions, that were heads down churning out code in the middle of&lt;br /&gt;
the floor oblivious to all the noise around them...&lt;br /&gt;
&lt;br /&gt;
Basically, getting pair programming to work has nothing to do with&lt;br /&gt;
open spaces and has everything to do with you and your pair&lt;br /&gt;
understanding one-another's work style. And yes, it's ok to accept&lt;br /&gt;
that there are some people you can never pair with because you just&lt;br /&gt;
don't get along. It's also ok to accept that you're extremely&lt;br /&gt;
introverted and are only comfortable pair-programming with people&lt;br /&gt;
you've been friends with for years. I used to be extremely introverted&lt;br /&gt;
(starting two companies changed that) but it's important to remember&lt;br /&gt;
that team *productivity* is the goal, not pair programming, open&lt;br /&gt;
spaces or whatever else. These are just mechanics that facilitate&lt;br /&gt;
productivity, and like anything else are subject to the 80/20 (or&lt;br /&gt;
50/50 or 20/40) rule.&lt;br /&gt;
&lt;br /&gt;
Best,&lt;br /&gt;
Sidu Ponnappa.&lt;br /&gt;
&lt;a href="http://c42.in/"&gt;http://c42.in&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://rubymonk.com/"&gt;http://rubymonk.com&lt;/a&gt;&lt;/blockquote&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-8884385823837008045?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=RJSQ3UnzpWU:0y9aQfWtyLc:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=RJSQ3UnzpWU:0y9aQfWtyLc:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=RJSQ3UnzpWU:0y9aQfWtyLc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=RJSQ3UnzpWU:0y9aQfWtyLc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=RJSQ3UnzpWU:0y9aQfWtyLc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=RJSQ3UnzpWU:0y9aQfWtyLc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=RJSQ3UnzpWU:0y9aQfWtyLc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=RJSQ3UnzpWU:0y9aQfWtyLc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=RJSQ3UnzpWU:0y9aQfWtyLc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=RJSQ3UnzpWU:0y9aQfWtyLc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/RJSQ3UnzpWU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/8884385823837008045/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=8884385823837008045" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/8884385823837008045?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/8884385823837008045?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2012/03/on-building-companies-and-open-spaces.html" title="On building companies, open spaces and with a little pairing on the side" /><author><name>Sidu Ponnappa</name><uri>https://profiles.google.com/103040704249449871264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGXL6VUh5X0/AAAAAAAAAAI/AAAAAAAAAYM/kP3kKE520zA/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CUQEQng-eCp7ImA9WhRVGE0.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-9199740367904939150</id><published>2012-01-17T17:58:00.000+05:30</published><updated>2012-01-17T17:58:23.650+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-17T17:58:23.650+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="rubyconf" /><category scheme="http://www.blogger.com/atom/ns#" term="rubyconf2011" /><title>Our RubyConf XI talk on Rails Services</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;a href="http://c42.in/people#niranjan-paranjape"&gt;Niranjan&lt;/a&gt; and I paired on a talk titled "Rails services in the walled garden" at RubyConf 2011 in New Orleans.&lt;br /&gt;
&lt;br /&gt;
The video has been out for a bit courtesy the awesome folks and &lt;a href="http://confreaks.com/"&gt;Confreaks&lt;/a&gt;, and we've (finally) &lt;a href="http://blog.c42.in/our-rubyconf-xi-talk-on-rails-services"&gt;posted it up on the C42 blog&lt;/a&gt;. As always, we'd love your feedback.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-9199740367904939150?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=r16-i4gvnxE:J0iK0O7vBi8:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=r16-i4gvnxE:J0iK0O7vBi8:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=r16-i4gvnxE:J0iK0O7vBi8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=r16-i4gvnxE:J0iK0O7vBi8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=r16-i4gvnxE:J0iK0O7vBi8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=r16-i4gvnxE:J0iK0O7vBi8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=r16-i4gvnxE:J0iK0O7vBi8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=r16-i4gvnxE:J0iK0O7vBi8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=r16-i4gvnxE:J0iK0O7vBi8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=r16-i4gvnxE:J0iK0O7vBi8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/r16-i4gvnxE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/9199740367904939150/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=9199740367904939150" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/9199740367904939150?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/9199740367904939150?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2012/01/our-rubyconf-xi-talk-on-rails-services.html" title="Our RubyConf XI talk on Rails Services" /><author><name>Sidu Ponnappa</name><uri>https://profiles.google.com/103040704249449871264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGXL6VUh5X0/AAAAAAAAAAI/AAAAAAAAAYM/kP3kKE520zA/s512-c/photo.jpg" /></author><thr:total>0</thr:total><georss:featurename>New Orleans, LA, USA</georss:featurename><georss:point>29.95106579999999 -90.0715323</georss:point><georss:box>29.795776299999993 -90.3285233 30.10635529999999 -89.8145413</georss:box></entry><entry gd:etag="W/&quot;A0ICSXs6eCp7ImA9WhdREkQ.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-3249430064750751598</id><published>2011-08-02T21:09:00.000+05:30</published><updated>2011-08-02T21:09:28.510+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-02T21:09:28.510+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="rails" /><category scheme="http://www.blogger.com/atom/ns#" term="offshore" /><title>Identifying good offshore Ruby and Rails vendors - a guide.</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;span class="Apple-style-span" style="color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 14px; line-height: 18px;"&gt;There are many small, new Ruby consultancies all over the world that do stellar work. There are many, many more that don't. How do you tell them apart?&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 14px; line-height: 18px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 14px; line-height: 18px;"&gt;&lt;a href="http://gja.in/blog"&gt;Tejas&lt;/a&gt; and I paired on a blog post that tries to answer this question over at the &lt;a href="http://blog.c42.in/identifying-good-offshore-ruby-and-rails-vend"&gt;C42 Engineering blog&lt;/a&gt;. Do take a look and tell us what you think.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-3249430064750751598?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=ahaX3O9UoBw:uEwU28Q0wpI:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=ahaX3O9UoBw:uEwU28Q0wpI:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=ahaX3O9UoBw:uEwU28Q0wpI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=ahaX3O9UoBw:uEwU28Q0wpI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=ahaX3O9UoBw:uEwU28Q0wpI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=ahaX3O9UoBw:uEwU28Q0wpI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=ahaX3O9UoBw:uEwU28Q0wpI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=ahaX3O9UoBw:uEwU28Q0wpI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=ahaX3O9UoBw:uEwU28Q0wpI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=ahaX3O9UoBw:uEwU28Q0wpI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/ahaX3O9UoBw" height="1" width="1"/&gt;</content><link rel="related" href="http://blog.c42.in/identifying-good-offshore-ruby-and-rails-vend" title="Identifying good offshore Ruby and Rails vendors - a guide." /><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/3249430064750751598/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=3249430064750751598" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/3249430064750751598?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/3249430064750751598?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2011/08/identifying-good-offshore-ruby-and.html" title="Identifying good offshore Ruby and Rails vendors - a guide." /><author><name>Sidu Ponnappa</name><uri>https://profiles.google.com/103040704249449871264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGXL6VUh5X0/AAAAAAAAAAI/AAAAAAAAAYM/kP3kKE520zA/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DEAFQHwyfip7ImA9WhdTE04.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-1949580340377893533</id><published>2011-07-11T03:55:00.000+05:30</published><updated>2011-07-11T03:55:11.296+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-11T03:55:11.296+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="rubyconf" /><title>I'm speaking at RubyConf 2011 at New Orleans</title><content type="html">Two of my colleagues and I will be speaking at &lt;a href="http://rubyconf.org/"&gt;RubyConf US&lt;/a&gt; this year. &lt;a href="http://c42.in/people#srushti-ambekallu"&gt;Srushti&lt;/a&gt;, lead developer on the &lt;a href="http://github.com/c42/goldberg"&gt;Goldberg CI server&lt;/a&gt;&amp;nbsp;will be pairing with &lt;a href="http://blog.brianguthrie.com/"&gt;Brian Guthrie&lt;/a&gt; of ThoughtWorks to deliver a talk titled "&lt;a href="http://rubyconf.org/presentations/11"&gt;Ruby Software Continuously Delivered and Exhaustively Explained.&lt;/a&gt;"&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://c42.in/people#niranjan-paranjape"&gt;Niranjan&lt;/a&gt; and I&amp;nbsp;will be pairing on the second talk titled "&lt;a href="http://rubyconf.org/presentations/45"&gt;Rails services in the walled garden&lt;/a&gt;."&lt;br /&gt;
This will be our second year speaking at RubyConf, and we're really looking forward to it.&lt;br /&gt;
&lt;br /&gt;
If you'd like to see our other presentations, do take a look at the&amp;nbsp;&lt;a href="http://blog.c42.in/our-rubyconf-x-talk-on-offshoring-ruby"&gt;videos of our talks from RubyConf US 2010&lt;/a&gt; and &lt;a href="http://blog.c42.in/tag/rubyconfindia"&gt;RubyConf India 2011&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-1949580340377893533?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=TYC7o_jBYIo:09oeCWCLVnA:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=TYC7o_jBYIo:09oeCWCLVnA:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=TYC7o_jBYIo:09oeCWCLVnA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=TYC7o_jBYIo:09oeCWCLVnA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=TYC7o_jBYIo:09oeCWCLVnA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=TYC7o_jBYIo:09oeCWCLVnA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=TYC7o_jBYIo:09oeCWCLVnA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=TYC7o_jBYIo:09oeCWCLVnA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=TYC7o_jBYIo:09oeCWCLVnA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=TYC7o_jBYIo:09oeCWCLVnA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/TYC7o_jBYIo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/1949580340377893533/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=1949580340377893533" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/1949580340377893533?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/1949580340377893533?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2011/07/im-speaking-at-rubyconf-2011-at-new.html" title="I'm speaking at RubyConf 2011 at New Orleans" /><author><name>Sidu Ponnappa</name><uri>https://profiles.google.com/103040704249449871264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGXL6VUh5X0/AAAAAAAAAAI/AAAAAAAAAYM/kP3kKE520zA/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0UHSH86fyp7ImA9WhZaGEs.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-530073276068489962</id><published>2011-07-05T16:57:00.000+05:30</published><updated>2011-07-05T16:57:19.117+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-05T16:57:19.117+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="ci" /><category scheme="http://www.blogger.com/atom/ns#" term="goldberg" /><title>Pipelines: What are they good for?</title><content type="html">My colleague &lt;a href="http://c42.in/people#srushti-ambekallu"&gt;Srushti&lt;/a&gt;, lead dev on the &lt;a href="http://github.com/c42/goldberg"&gt;Goldberg CI server&lt;/a&gt; project, recently wrote an &lt;a href="http://blog.c42.in/pipelines-what-are-they-good-for"&gt;article on pipelines&lt;/a&gt; in the context of Continuous Integration. Do take a look.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-530073276068489962?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=WSn9bYyc94k:9FTj8qIJW64:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=WSn9bYyc94k:9FTj8qIJW64:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=WSn9bYyc94k:9FTj8qIJW64:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=WSn9bYyc94k:9FTj8qIJW64:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=WSn9bYyc94k:9FTj8qIJW64:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=WSn9bYyc94k:9FTj8qIJW64:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=WSn9bYyc94k:9FTj8qIJW64:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=WSn9bYyc94k:9FTj8qIJW64:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=WSn9bYyc94k:9FTj8qIJW64:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=WSn9bYyc94k:9FTj8qIJW64:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/WSn9bYyc94k" height="1" width="1"/&gt;</content><link rel="related" href="http://blog.c42.in/pipelines-what-are-they-good-for" title="Pipelines: What are they good for?" /><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/530073276068489962/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=530073276068489962" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/530073276068489962?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/530073276068489962?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2011/07/pipelines-what-are-they-good-for.html" title="Pipelines: What are they good for?" /><author><name>Sidu Ponnappa</name><uri>https://profiles.google.com/103040704249449871264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGXL6VUh5X0/AAAAAAAAAAI/AAAAAAAAAYM/kP3kKE520zA/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0UFSHc8fip7ImA9WhZbF0g.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-3242930816626620333</id><published>2011-06-22T21:43:00.000+05:30</published><updated>2011-06-22T21:43:39.976+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-22T21:43:39.976+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="opinion" /><category scheme="http://www.blogger.com/atom/ns#" term="recruiting" /><title>Why Bill Taylor is wrong about great hackers</title><content type="html">I've just posted an article in response to Bill Taylor's post 'Great people are overrated' &lt;a href="http://blog.c42.in/why-bill-taylor-is-wrong-about-great-hackers"&gt;over at the C42 Engineering Blog&lt;/a&gt;. Do take a look.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-3242930816626620333?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=YkS1txS4e8k:36wDHAli1Jw:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=YkS1txS4e8k:36wDHAli1Jw:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=YkS1txS4e8k:36wDHAli1Jw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=YkS1txS4e8k:36wDHAli1Jw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=YkS1txS4e8k:36wDHAli1Jw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=YkS1txS4e8k:36wDHAli1Jw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=YkS1txS4e8k:36wDHAli1Jw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=YkS1txS4e8k:36wDHAli1Jw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=YkS1txS4e8k:36wDHAli1Jw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=YkS1txS4e8k:36wDHAli1Jw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/YkS1txS4e8k" height="1" width="1"/&gt;</content><link rel="related" href="http://blog.c42.in/why-bill-taylor-is-wrong-about-great-hackers" title="Why Bill Taylor is wrong about great hackers" /><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/3242930816626620333/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=3242930816626620333" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/3242930816626620333?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/3242930816626620333?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2011/06/why-bill-taylor-is-wrong-about-great.html" title="Why Bill Taylor is wrong about great hackers" /><author><name>Sidu Ponnappa</name><uri>https://profiles.google.com/103040704249449871264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGXL6VUh5X0/AAAAAAAAAAI/AAAAAAAAAYM/kP3kKE520zA/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C04DRnk4cCp7ImA9WhZVEk4.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-8241303495712011145</id><published>2011-05-23T13:39:00.010+05:30</published><updated>2011-05-24T15:42:57.738+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-24T15:42:57.738+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="c42" /><category scheme="http://www.blogger.com/atom/ns#" term="startup" /><title>C42 Engineering, Year One.</title><content type="html">We've come a long way since that evening in December 2009 when a handful of colleagues spent an evening drinking Highland Park and trying to figure out what they should be doing with their lives. Everyone wanted to do a start-up; nobody had any big ideas. We also knew that raising money for a product startup in India is quite hard at the best of times, so we figured we'd do this by the book - start and grow a nice, stable services firm and bounce off it to build a product division. We'd take more time to get there, but we were less likely to crash and burn because we couldn't raise funding.&lt;br /&gt;
&lt;br /&gt;
At that point, only two members of the group were actually in a position to do something about it and they took the first, difficult step of quitting a comfortable job and trying their hands at something they'd never done before - setting up a boutique Ruby consulting firm, offshore.&lt;br /&gt;
&lt;br /&gt;
By early January both &lt;a href="http://c42.in/people#srushti-ambekallu"&gt;Srushti&lt;/a&gt; and &lt;a href="http://c42.in/people#niranjan-paranjape"&gt;Niranjan&lt;/a&gt; had quit ThoughtWorks and begun actively studying the market. Of the others, most returned to their usual routine; I was the exception. Starting January 1st, I was on unpaid leave to look after my mother who was in the last stages of her battle with soft-tissue sarcoma, a virulent form of cancer. I stayed on as a nominal ThoughtWorker because I was still peripherally involved in organizing the first edition of &lt;a href="http://rubyconfindia.org"&gt;RubyConf India&lt;/a&gt; which was scheduled for late March that year.&lt;br /&gt;
&lt;br /&gt;
Thus began what I later realised were the toughest six months of my life thus far. My mother was in and out of hospital for most of that period, and January was especially trying because my father over-extended himself on a trip and wound up briefly in hospital too. I had a fair idea what Niranjan and Srushti were up to with the company as they were at this point working out of my aunt's house, which is on the floor just below my own. My family'd been using it as a store-room for the ten years since my aunt passed away, and boy was it a mess. I'd make it a point to drop in for a few minutes every day and hang out with them among all the old newspapers, furniture and dust to see what was going on. They'd usually be sitting at the dining table on some truly ancient chairs hacking code, or as likely, playing World of Warcraft. We'd talk for a bit - if it was a Friday or weekend I'd bring my laptop down and we'd all three of us do a raid or three.&lt;br /&gt;
&lt;br /&gt;
By late January they'd managed to sign up a client on a fixed-bid Rails project. Four weeks later when they did the numbers, they realised that their hourly billing rate hovered somewhere between $3 and $5. Lesson learned, they then started bidding only on projects that paid by the hour and soon signed up a client at $15 per hour that would stay with them for the next six months. C42 Engineering had found it's first 'boulder' - a steady, long-term project that the company could depend on.&lt;br /&gt;
&lt;br /&gt;
With the end of March came &lt;a href="http://rubyconfindia.org/2010"&gt;RubyConf India&lt;/a&gt;, and a few days later I quit ThoughtWorks. March was also notable because during RubyConf we met Niranjan's childhood friend &lt;a href="http://c42.in/people#aakash-dharmadhikari"&gt;Aakash&lt;/a&gt; and shortly thereafter he decided to move to Bangalore and join Niranjan and Srushti. Thus, when I joined &lt;a href="http://c42.in"&gt;C42 Engineering&lt;/a&gt; at the end of April after serving my notice period, I was the fourth person to sign up.&lt;br /&gt;
&lt;br /&gt;
My first act after joining was to take a leave of absence that was to last two months. I stayed home looking after my mother and C42 Engineering moved on without much involvement on my part and signed up another client for an engagement that lasted three months. At this point we had two projects and had two people billable full time, but we hadn't yet registered a company and weren't even paying salaries yet. Niranjan and Srushti were effectively working as independent contractors, with Aakash shadowing first one, then the other. I saw little of them in this period - both Niranjan and Srushti were working on separate projects, and by the end of May C42 had moved out of my aunt's place and had started working out of a room at Srushti's dad's office in Cooke Town (less dust and better power backup).&lt;br /&gt;
&lt;br /&gt;
My mother passed away on June 11th 2010, just under two years after she was diagnosed with cancer; I started work at C42 full time shortly thereafter. &lt;br /&gt;
&lt;br /&gt;
Things started heating up at around the same time. First off, we registered the company. We then proceeded to execute two key parts of our strategy for that year. First, we started billing in pairs instead of as individuals and second, we moved away from sourcing projects via online brokerages like elance.com and started generating leads and selling projects ourselves. Shortly thereafter we started hiring, and over the next five months had four people join us. We had a second pair become billable, then our third. Ultimately, the last quarter of 2010 generated more revenue than the first three combined, and this despite December having terrible utilization numbers because we were all off in Goa watching &lt;a href="http://www.nigel.in/"&gt;Nigel&lt;/a&gt; get married.&lt;br /&gt;
&lt;br /&gt;
The other event of note in 2010 was Niranjan's and my &lt;a href="http://blog.c42.in/our-rubyconf-x-talk-on-offshoring-ruby"&gt;talk being accepted for RubyConf X&lt;/a&gt;, New Orleans. This was a calculated risk on our part because the cost of the trip was non-trivial for a business as young as ours was, and we weren't sure if there would be any immediate returns we'd have in terms of projects (or even leads). In hindsight, however, I realise that these were relatively unimportant things. What speaking at RubyConf X really brought us was a degree of credibility, something that you otherwise earn the hard way over a period of months; once the video of our talk went online, there was a noticeable change in quality of our leads. Sales didn't necessarily go up, but conversations with prospective clients that had already watched the video had a much more positive tone.&lt;br /&gt;
&lt;br /&gt;
Things have been pretty upbeat since then - we remain sold out more or less all the time, our rates have steadily risen to the current USD40 per hour per developer. Our open source initiatives have seen considerable progress - we added RFC 2616 compliant caching to &lt;a href="https://github.com/kaiwren/wrest"&gt;Wrest&lt;/a&gt;, saw a remarkable number of pull-requests on &lt;a href="https://github.com/c42/goldberg"&gt;Goldberg&lt;/a&gt;, and contributed &lt;a href="https://github.com/rspec/rspec-mocks/issues/10"&gt;any_instance support&lt;/a&gt; to RSpec.&lt;br /&gt;
&lt;br /&gt;
If I had to highlight a key learning from all that we've learned in the last year, it would be that executing consistently is tough because the way you need to evaluate your priorities changes as your revenue grows. Three guys hacking in a room and eight people working as a part of a business are two fundamentally different kinds of organisations that behave very differently. It seems like this should be obvious and not a 'key learning', but we were blind-sided by how far reaching its impact was on the way we worked and how hard it was for us to start thinking differently. I've read about this kind of stair stepping where a $10k business works differently from a $100k business which in turn is different from a $1000k business and so on, but seeing it happen has been... educational. Tracking time accurately, invoicing your clients correctly and on time, making payroll on time - these things seem simple on paper, but are quite hard to do consistently in practice.&lt;br /&gt;
&lt;br /&gt;
There are plenty of things that we're still struggling with and don't have good answers for. Scaling people up technically is one - we're heavily dependent on pairing for our training, which means we can at any point only hire as many people as we have experienced Ruby developers in the company. Developing skills to the point that we consider acceptable takes months, and then more months until that person is at the point where they can in turn mentor someone else. We're still trying to figure out if there is a way to train people in a shorter duration without compromising on quality, but for now we're cutting back on growth to maintain quality.&lt;br /&gt;
&lt;br /&gt;
In conclusion, I think we've been very lucky in some ways this last year. A boutique, offshore Ruby consultancy would have been much harder to establish if we'd started a little earlier, or if we'd tried to do so without a core team of experienced Rubyists; we've been in the right place at the right time with the right people on board and we've benefitted enormously from this. Now we have to work on the real challenge, which is creating a successful product division while continuing to grow our services arm. I'll try to make it a point to keep posting updates - at this point, I suspect we'd definitely benefit from any advice we can get.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-8241303495712011145?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=omTlRL3ouf8:dPnkbZ7Ycpw:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=omTlRL3ouf8:dPnkbZ7Ycpw:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=omTlRL3ouf8:dPnkbZ7Ycpw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=omTlRL3ouf8:dPnkbZ7Ycpw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=omTlRL3ouf8:dPnkbZ7Ycpw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=omTlRL3ouf8:dPnkbZ7Ycpw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=omTlRL3ouf8:dPnkbZ7Ycpw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=omTlRL3ouf8:dPnkbZ7Ycpw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=omTlRL3ouf8:dPnkbZ7Ycpw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=omTlRL3ouf8:dPnkbZ7Ycpw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/omTlRL3ouf8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/8241303495712011145/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=8241303495712011145" title="21 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/8241303495712011145?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/8241303495712011145?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2011/05/c42-engineering-year-one.html" title="C42 Engineering, Year One." /><author><name>Sidu Ponnappa</name><uri>https://profiles.google.com/103040704249449871264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGXL6VUh5X0/AAAAAAAAAAI/AAAAAAAAAYM/kP3kKE520zA/s512-c/photo.jpg" /></author><thr:total>21</thr:total></entry><entry gd:etag="W/&quot;AkECRXo-cSp7ImA9Wx9bE0o.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-8019921781033686713</id><published>2011-02-22T18:14:00.000+05:30</published><updated>2011-02-22T18:14:24.459+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-22T18:14:24.459+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="india" /><category scheme="http://www.blogger.com/atom/ns#" term="2010" /><category scheme="http://www.blogger.com/atom/ns#" term="rails" /><category scheme="http://www.blogger.com/atom/ns#" term="rubyconf" /><category scheme="http://www.blogger.com/atom/ns#" term="offshore" /><title>Our RubyConf X talk on offshoring Ruby</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;The video recording of our talk at RubyConf X at New Orleans last year has been released. You can watch it &lt;a href="http://blog.c42.in/our-rubyconf-x-talk-on-offshoring-ruby"&gt;over at the C42 Engineering blog.&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-8019921781033686713?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=50hrkN7MzWE:WzruvZtd-oU:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=50hrkN7MzWE:WzruvZtd-oU:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=50hrkN7MzWE:WzruvZtd-oU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=50hrkN7MzWE:WzruvZtd-oU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=50hrkN7MzWE:WzruvZtd-oU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=50hrkN7MzWE:WzruvZtd-oU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=50hrkN7MzWE:WzruvZtd-oU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=50hrkN7MzWE:WzruvZtd-oU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=50hrkN7MzWE:WzruvZtd-oU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=50hrkN7MzWE:WzruvZtd-oU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/50hrkN7MzWE" height="1" width="1"/&gt;</content><link rel="related" href="http://blog.c42.in/our-rubyconf-x-talk-on-offshoring-ruby" title="Our RubyConf X talk on offshoring Ruby" /><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/8019921781033686713/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=8019921781033686713" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/8019921781033686713?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/8019921781033686713?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2011/02/our-rubyconf-x-talk-on-offshoring-ruby.html" title="Our RubyConf X talk on offshoring Ruby" /><author><name>Sidu Ponnappa</name><uri>https://profiles.google.com/103040704249449871264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGXL6VUh5X0/AAAAAAAAAAI/AAAAAAAAAYM/kP3kKE520zA/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEMMQ3Y6cSp7ImA9WhVUEUs.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-7566929402445770334</id><published>2010-12-05T04:22:00.004+05:30</published><updated>2012-05-16T15:31:22.819+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-16T15:31:22.819+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="hiring" /><category scheme="http://www.blogger.com/atom/ns#" term="skills" /><title>Is expecting expertise unreasonable?</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
Here's a snippet from a recent comment on a oldish blog post of mine:&lt;br /&gt;
&lt;blockquote&gt;
"However, in this post there is one thing that touches a raw nerve. The whole point about whether the person does coding in his free time. Why would you care? In fact, the point of free / spare time is to do activities you don't do at work. Today, I've an MBA and am far removed from the tech world, but I'm involved in recruiting for consulting (the industry I work in), but I'll not hire a person who does cases during his / her spare time. I'd rather hire someone who has a life and some hobbies. Such people can be much more interesting, fun to work with, and actually more versatile at solving business problems than someone who has a unidimensional personality."  &lt;/blockquote&gt;
&lt;br /&gt;
Every time someone says something like this, I'm appalled. No, really, that's the only word for it.&lt;br /&gt;
&lt;br /&gt;
First, I don't understand the constant assumption that if you choose to study in your spare time, you have no life. Some of the best programmers, entrepreneurs and managers I know (some are all three) run marathons, are published authors, do underwater photography and more without ever compromising on study. Truly passionate people have several passions - and their greatest passion dictates the area in which they choose to work, but never to the complete exclusion of everything else. The stereotype of the programmer living in a basement doing nothing but write code is just that - a stereotype. People who fit the stereotype are the exception, not the norm, believe me. That said, I do wish that the manager who did nothing but study cases was also a stereotype - most professional managers that I meet last read a book during their MBA (and it was the Nirma washing powder case) and haven't been exposed to a new idea since. But I digress.&lt;br /&gt;
&lt;br /&gt;
I also find the 'if you study, you have no life' argument something of a cop out. It tells me that you aren't passionate about what you do for a living - if you were, studying and getting better at what you do would be something that just happened automatically. Henry Ford created the assembly line because he constantly studied manufacturing. Sam Walton created Walmart because he spent all his time studying retail. Nobody creates anything great without expending considerable effort studying the problem and trying different solutions. We aim to write great code as one of the key parts of solving our customers problems, so yes, I prefer people that are looking to become better programmers. Such people almost always hack on personal projects in their spare time; as far as I can tell, it's the quickest way to identify the best programmers.&lt;br /&gt;
&lt;br /&gt;
Second is the implication that people who are passionate about what they do and express this by working on their skills outside of work hours aren't 'versatile'. I've never figured out what the connection is here. Is it that someone who does not consciously work to improve their skills must perforce be better than someone who does because they become (magically) more versatile? The answer to 'Are you an expert in your field?' isn't 'No, but I have hobbies.'&lt;br /&gt;
&lt;br /&gt;
Are you saying that if you conducted an orchestra, you'd refuse to include a musician who practiced outside of the concerts they played in? Are you saying you wouldn't consult a doctor that studied the latest advancements in medicine? What's special about programmers or managers that they're exempt from others expecting them to improve their skills? As far as I'm concerned, the important thing to remember is that even if you are an expert in your field today, you won't remain one unless you're constantly introspecting and working to improve. Your career will falter, because your peers are improving while you're standing still. This isn't rocket science - everybody wants to work with the more capable person, not the less capable one that has hobbies. In my experience though, the more capable person is usually the one with the hobbies and the less capable one is usually a couch potato in his or her spare time.&lt;br /&gt;
&lt;br /&gt;
Lastly, the whole notion of how people perceive learning at work as being something that must happen during working hours strikes me as being rather odd. When you were in school and college, did you do all your studying in the classroom? No - you studied in what was, technically, your spare time. So what's the deal with expecting to learn everything you need to know during your eight hours at work? Now that's what I call unidimensional - someone whose knowledge of their domain encompasses merely what they see during work hours.&lt;br /&gt;
&lt;br /&gt;
To cut a long story short: To study or not to study - the choice is yours; but don't ever fool yourself into believing that passionate people that study are in any way the poorer choice for any role. That perception is a fallacy.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="font-size: small;"&gt;Update:&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Here are the links to conversations around this post on &lt;a href="http://news.ycombinator.com/item?id=1971324"&gt;Hacker News&lt;/a&gt; and the &lt;a href="http://groups.google.com/group/software_craftsmanship/browse_thread/thread/a8ebf102445b1409"&gt;Software Craftsmanship list&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
&lt;hr /&gt;
If you liked this post, you could&lt;/h4&gt;
&lt;h4 style="text-align: center;"&gt;
&lt;a href="http://feeds.sidu.in/diningtablecoder"&gt;subscribe&lt;/a&gt;&amp;nbsp;to the feed&lt;/h4&gt;
&lt;h4 style="text-align: center;"&gt;
&lt;a class="twitter-follow-button" data-show-count="false" href="https://twitter.com/ponnappa"&gt;Follow @ponnappa&lt;/a&gt;&lt;/h4&gt;
&lt;h4 style="text-align: center;"&gt;
or simply&amp;nbsp;&lt;a href="http://www.blogger.com/comment.g?blogID=3718956085911858962&amp;amp;postID=7566929402445770334"&gt;comment on this post&lt;/a&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-7566929402445770334?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=NNj5TKJdrFY:z8i56aH590k:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=NNj5TKJdrFY:z8i56aH590k:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=NNj5TKJdrFY:z8i56aH590k:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=NNj5TKJdrFY:z8i56aH590k:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=NNj5TKJdrFY:z8i56aH590k:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=NNj5TKJdrFY:z8i56aH590k:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=NNj5TKJdrFY:z8i56aH590k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=NNj5TKJdrFY:z8i56aH590k:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=NNj5TKJdrFY:z8i56aH590k:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=NNj5TKJdrFY:z8i56aH590k:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/NNj5TKJdrFY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/7566929402445770334/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=7566929402445770334" title="9 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/7566929402445770334?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/7566929402445770334?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2010/12/is-expecting-expertise-unreasonable.html" title="Is expecting expertise unreasonable?" /><author><name>Sidu Ponnappa</name><uri>https://profiles.google.com/103040704249449871264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGXL6VUh5X0/AAAAAAAAAAI/AAAAAAAAAYM/kP3kKE520zA/s512-c/photo.jpg" /></author><thr:total>9</thr:total></entry><entry gd:etag="W/&quot;D04HSX0zeCp7ImA9Wx5VEkU.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-7326069810663515118</id><published>2010-10-05T19:08:00.000+05:30</published><updated>2010-10-05T19:08:58.380+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-05T19:08:58.380+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="rubyconf" /><title>Speaking at RubyConf X</title><content type="html">My &lt;a href="http://rubyconf.org/presentations/26"&gt;proposal&lt;/a&gt; for &lt;a href="http://rubyconf.org/"&gt;RubyConf X&lt;/a&gt; has been accepted, so I'll be in New Orleans in November. If you're going to be there, do say hello. &lt;br /&gt;
&lt;br /&gt;
Looks like the two major conferences I'll be speaking at this year are both RubyConfs :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-7326069810663515118?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=3dkA3i-IhdQ:0B00c2Je5pY:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=3dkA3i-IhdQ:0B00c2Je5pY:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=3dkA3i-IhdQ:0B00c2Je5pY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=3dkA3i-IhdQ:0B00c2Je5pY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=3dkA3i-IhdQ:0B00c2Je5pY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=3dkA3i-IhdQ:0B00c2Je5pY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=3dkA3i-IhdQ:0B00c2Je5pY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=3dkA3i-IhdQ:0B00c2Je5pY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=3dkA3i-IhdQ:0B00c2Je5pY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=3dkA3i-IhdQ:0B00c2Je5pY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/3dkA3i-IhdQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/7326069810663515118/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=7326069810663515118" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/7326069810663515118?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/7326069810663515118?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2010/10/speaking-at-rubyconf-x.html" title="Speaking at RubyConf X" /><author><name>Sidu Ponnappa</name><uri>https://profiles.google.com/103040704249449871264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGXL6VUh5X0/AAAAAAAAAAI/AAAAAAAAAYM/kP3kKE520zA/s512-c/photo.jpg" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;DEYGQH0yfCp7ImA9WxBRF08.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-4874488474111708370</id><published>2010-01-06T02:33:00.006+05:30</published><updated>2010-01-06T02:45:21.394+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-06T02:45:21.394+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="rails" /><title>On WWRails... finally</title><content type="html">I'm not sure why I didn't do this long ago, but better late than never, what?&lt;br /&gt;&lt;a href="http://www.workingwithrails.com/recommendation/new/person/18353-sidu-ponnappa" target="_blank"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 90px;" src="http://3.bp.blogspot.com/_ABLwpl_AaVo/S0Opntjz9KI/AAAAAAAAAKk/vj-TI9YT1Kg/s320/wwrails.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5423364875994002594" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-4874488474111708370?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=OLO1sfGlDgQ:6rwZ0z7MIAw:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=OLO1sfGlDgQ:6rwZ0z7MIAw:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=OLO1sfGlDgQ:6rwZ0z7MIAw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=OLO1sfGlDgQ:6rwZ0z7MIAw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=OLO1sfGlDgQ:6rwZ0z7MIAw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=OLO1sfGlDgQ:6rwZ0z7MIAw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=OLO1sfGlDgQ:6rwZ0z7MIAw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=OLO1sfGlDgQ:6rwZ0z7MIAw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=OLO1sfGlDgQ:6rwZ0z7MIAw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=OLO1sfGlDgQ:6rwZ0z7MIAw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/OLO1sfGlDgQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/4874488474111708370/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=4874488474111708370" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/4874488474111708370?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/4874488474111708370?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2010/01/on-wwrails-finally.html" title="On WWRails... finally" /><author><name>Sidu Ponnappa</name><uri>https://profiles.google.com/103040704249449871264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGXL6VUh5X0/AAAAAAAAAAI/AAAAAAAAAYM/kP3kKE520zA/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_ABLwpl_AaVo/S0Opntjz9KI/AAAAAAAAAKk/vj-TI9YT1Kg/s72-c/wwrails.jpg" height="72" width="72" /><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;C0AFSXs6eip7ImA9WxBSFE0.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-4900628086596875028</id><published>2009-12-21T18:32:00.003+05:30</published><updated>2009-12-21T18:51:58.512+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-21T18:51:58.512+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="rubyconf" /><title>RubyConf India - Call for Proposals</title><content type="html">The Call for Proposals for &lt;a href="http://rubyconfindia.org/"&gt;India's first RubyConf&lt;/a&gt; in now on. For information on where and how to submit your proposal, please check &lt;a href="http://rubyconfindia.org/"&gt;the website&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This is a significant milestone to reach when setting up a conference for the first time. There are many people who deserve much appreciation for making this possible, not least all the enthusiastic members of India's Ruby community. A heartfelt thanks to all of you and do come and present; after all it is because of you that the community has gotten this far!&lt;br /&gt;&lt;br /&gt;Please do post this information to any Ruby communities that you are a member of. At this point, publicity is key, so please also blog, tweet, digg and reddit away!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-4900628086596875028?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=Cf2nEY9ca5o:2V3o_-vzO-g:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=Cf2nEY9ca5o:2V3o_-vzO-g:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=Cf2nEY9ca5o:2V3o_-vzO-g:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=Cf2nEY9ca5o:2V3o_-vzO-g:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=Cf2nEY9ca5o:2V3o_-vzO-g:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=Cf2nEY9ca5o:2V3o_-vzO-g:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=Cf2nEY9ca5o:2V3o_-vzO-g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=Cf2nEY9ca5o:2V3o_-vzO-g:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=Cf2nEY9ca5o:2V3o_-vzO-g:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=Cf2nEY9ca5o:2V3o_-vzO-g:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/Cf2nEY9ca5o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/4900628086596875028/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=4900628086596875028" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/4900628086596875028?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/4900628086596875028?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2009/12/rubyconf-india-call-for-proposals.html" title="RubyConf India - Call for Proposals" /><author><name>Sidu Ponnappa</name><uri>https://profiles.google.com/103040704249449871264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGXL6VUh5X0/AAAAAAAAAAI/AAAAAAAAAYM/kP3kKE520zA/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C0QERXk7fyp7ImA9WxNXGUU.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-7258060293916700192</id><published>2009-10-08T11:21:00.004+05:30</published><updated>2009-10-08T11:25:04.707+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-08T11:25:04.707+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="rubyconf" /><title>RubyConf India - It's official!</title><content type="html">Yes, it's true. RubyConf is happening in Bangalore, India early next year. Here's the link to the (currently rather brief) &lt;a href="http://rubyconfindia.org"&gt;RunConf India 2010 website&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-7258060293916700192?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=NW5LI20CEGY:WlqcwsbfMiE:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=NW5LI20CEGY:WlqcwsbfMiE:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=NW5LI20CEGY:WlqcwsbfMiE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=NW5LI20CEGY:WlqcwsbfMiE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=NW5LI20CEGY:WlqcwsbfMiE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=NW5LI20CEGY:WlqcwsbfMiE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=NW5LI20CEGY:WlqcwsbfMiE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=NW5LI20CEGY:WlqcwsbfMiE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=NW5LI20CEGY:WlqcwsbfMiE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=NW5LI20CEGY:WlqcwsbfMiE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/NW5LI20CEGY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/7258060293916700192/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=7258060293916700192" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/7258060293916700192?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/7258060293916700192?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2009/10/rubyconf-india-its-official.html" title="RubyConf India - It's official!" /><author><name>Sidu Ponnappa</name><uri>https://profiles.google.com/103040704249449871264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGXL6VUh5X0/AAAAAAAAAAI/AAAAAAAAAYM/kP3kKE520zA/s512-c/photo.jpg" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;C0cER3syfCp7ImA9WxNQEUs.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-4920140306838854130</id><published>2009-09-17T00:10:00.005+05:30</published><updated>2009-09-17T09:46:46.594+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-17T09:46:46.594+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="performance" /><category scheme="http://www.blogger.com/atom/ns#" term="jruby" /><title>Faster xml deserialisation on JRuby</title><content type="html">For the last day or so, I've been looking at XML deserilisation performance at work. When dealing with REST/POX, a respectable fraction of the time is spent in serilising and deserialising xml; consequently it's a fair target for performance analysis. Since I'm currently working on a multi-threaded Twitter library built using &lt;a href="http://github.com/kaiwren/wrest"&gt;Wrest&lt;/a&gt;, I decided I might as well take a look at xml deserialisation performance under JRuby.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;The Contenders&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Wrest delegates XML deserilisation to ActiveSupport, which in turn supports one of three libraries - LibXML Ruby, Nokogiri and of course REXML. REXML is the slowest, buggiest of the three and is pure Ruby. Both LibXML and Nokogiri use the native libxml2 libraries; however LibXML is &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; available on JRuby whereas Nokogiri is. Nokogiri also has an as yet unreleased version that does not use the JNA based JRuby FFI implementation and is expected to be faster. Build instructions for the non FFI Nokogiri are available &lt;a href="http://planet-soc.com/node/7930"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;REXML can however be enhanced by including &lt;a href="http://github.com/nicksieger/jrexml"&gt;JREXML&lt;/a&gt; which uses the java xpp3 libs and claims a 10x performance improvemnt. &lt;br /&gt;&lt;br /&gt;Thus we have four contenders:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Vanilla REXML&lt;/li&gt;&lt;li&gt;REXML enhanced by JREXML&lt;/li&gt;&lt;li&gt;FFI Nokogiri&lt;/li&gt;&lt;li&gt;Non FFI nokogiri&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;The Test Environment&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;jruby -v&lt;/code&gt; reads &lt;code&gt;jruby 1.4.0dev (ruby 1.8.7p174) (2009-08-05 619cebe) (Java HotSpot(TM) 64-Bit Server VM 1.6.0_13) [x86_64-java]&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;I'm using a 2.2GHz 2008 MacBook Pro running Leopard&lt;/li&gt;&lt;li&gt;The benchmark is a simple Hash.from_xml. It's canned as a Wrest rake task. The full command is &lt;code&gt;jruby -S rake -J-server benchmark:deserialise_xml&lt;/code&gt;&lt;/li&gt;&lt;li&gt;JREXML 0.5.3 and Nokogiri 1.3.3 (the non-FFI build is also 1.3.3, revision fb7e9bb6, from the origin/java branch of tenderlove/nokogiri)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;The Numbers&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:115%;"&gt;Vanilla REXML&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;Deserialising using ActiveSupport::XmlMini_REXML&lt;br /&gt;Rehearsal -------------------------------------------------&lt;br /&gt;Hash.from_xml  11.831000   0.000000  11.831000 ( 11.831000)&lt;br /&gt;--------------------------------------- total: 11.831000sec&lt;br /&gt;&lt;br /&gt;                    user     system      total        real&lt;br /&gt;hash.from_xml   5.475000   0.000000   5.475000 (  5.474000)&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:115%;"&gt;REXML + JREXML&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;Detected JRuby, JREXML loaded.&lt;br /&gt;Deserialising using ActiveSupport::XmlMini_REXML&lt;br /&gt;Rehearsal -------------------------------------------------&lt;br /&gt;Hash.from_xml  11.323000   0.000000  11.323000 ( 11.323000)&lt;br /&gt;--------------------------------------- total: 11.323000sec&lt;br /&gt;&lt;br /&gt;                    user     system      total        real&lt;br /&gt;Hash.from_xml   5.436000   0.000000   5.436000 (  5.436000)&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:115%;"&gt;FFI Nokogiri&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;Deserialising using ActiveSupport::XmlMini_Nokogiri&lt;br /&gt;Rehearsal -------------------------------------------------&lt;br /&gt;Hash.from_xml   9.468000   0.000000   9.468000 (  9.468000)&lt;br /&gt;---------------------------------------- total: 9.468000sec&lt;br /&gt;&lt;br /&gt;                    user     system      total        real&lt;br /&gt;Hash.from_xml   3.876000   0.000000   3.876000 (  3.876000)&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:115%;"&gt;Non FFI Nokogiri&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;Deserialising using ActiveSupport::XmlMini_Nokogiri&lt;br /&gt;Rehearsal -------------------------------------------------&lt;br /&gt;Hash.from_xml   5.956000   0.000000   5.956000 (  5.956000)&lt;br /&gt;---------------------------------------- total: 5.956000sec&lt;br /&gt;&lt;br /&gt;                    user     system      total        real&lt;br /&gt;Hash.from_xml   2.123000   0.000000   2.123000 (  2.123000)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;As expected, REXML was slow. Surprisingly though, JREXML didn't improve those numbers very much.&lt;br /&gt;FFI Nokogiri was faster than REXML, but the JNA seems to have taken its toll - on MRI 1.8.6 the same benchmark runs in under 2s. Non FFI Nokogiri was the real win, though, taking deserialisation performance within spitting distance of the CRuby Nokogiri.&lt;br /&gt;&lt;br /&gt;Note that &lt;code&gt;Hash.from_xml&lt;/code&gt; does mess around a bit with the hash that the libraries produce and this might make the numbers different from directly using the xml libraries; however since this API is what I need to use with in Wrest (and Rails on JRuby, for that matter) these are the relative performance numbers I'm interested in seeing. If you're not using Rails (or Wrest, dare I say?) you may want to re-run this benchmark against the libraries directly without ActiveSupport mediating.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-4920140306838854130?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=eH5ZsyeQVno:thB7oYfzS4A:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=eH5ZsyeQVno:thB7oYfzS4A:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=eH5ZsyeQVno:thB7oYfzS4A:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=eH5ZsyeQVno:thB7oYfzS4A:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=eH5ZsyeQVno:thB7oYfzS4A:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=eH5ZsyeQVno:thB7oYfzS4A:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=eH5ZsyeQVno:thB7oYfzS4A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=eH5ZsyeQVno:thB7oYfzS4A:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=eH5ZsyeQVno:thB7oYfzS4A:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=eH5ZsyeQVno:thB7oYfzS4A:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/eH5ZsyeQVno" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/4920140306838854130/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=4920140306838854130" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/4920140306838854130?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/4920140306838854130?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2009/09/faster-xml-deserilisation-on-jruby.html" title="Faster xml deserialisation on JRuby" /><author><name>Sidu Ponnappa</name><uri>https://profiles.google.com/103040704249449871264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGXL6VUh5X0/AAAAAAAAAAI/AAAAAAAAAYM/kP3kKE520zA/s512-c/photo.jpg" /></author><thr:total>4</thr:total></entry><entry gd:etag="W/&quot;C0UNSXo_eyp7ImA9WxNSEU4.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-397829642580057019</id><published>2009-08-22T19:06:00.015+05:30</published><updated>2009-08-24T21:58:18.443+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-24T21:58:18.443+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="wrest" /><category scheme="http://www.blogger.com/atom/ns#" term="REST" /><title>Wrest, REST and Ruby HTTP libraries</title><content type="html">I've been using Rails' ActiveResource for over eighteen months to consume the &lt;a href="http://en.wikipedia.org/wiki/Plain_Old_XML"&gt;POX&lt;/a&gt; based pseudo &lt;a href="http://en.wikipedia.org/wiki/REST"&gt;REST&lt;/a&gt; that Rails applications make so easy to produce, and I'm not overwhelmed. &lt;br /&gt;&lt;br /&gt;ActiveResource &lt;a href="http://blog.brianguthrie.com/articles/2008/08/02/the-weirdest-code-ive-seen-recently"&gt;isn't a particularly well written library&lt;/a&gt;, nor is it easy to extend, modify and use. It doesn't support certain features that I've come to consider essential for a Rails POX/REST client, like pagination. The only nice things you can say about it are that it works for the most common cases, and that it ships with Rails. But you know what hackers say about sucky tools - 'Don't get mad; roll your own'. So I did. &lt;br /&gt;&lt;br /&gt;I started working on &lt;a href="http://github.com/kaiwren/wrest"&gt;Wrest&lt;/a&gt; a few months ago with the intention of creating a drop-in replacement for ActiveResource. The section of the Wrest &lt;a href="http://github.com/kaiwren/wrest/tree/master/README.rdoc"&gt;README&lt;/a&gt; that talks about Wrest::Resource is actually a record of the features that we've discussed over the &lt;a href="http://blog.sidu.in/2006/10/eh-wassa-dining-table.html"&gt;dining table&lt;/a&gt; that we &lt;span style="font-style:italic;"&gt;wished&lt;/span&gt; ActiveResource had. However, as I hacked away on Wrest, I slowly came to realise that a good REST client needs to be a good &lt;span style="font-style:italic;"&gt;HTTP&lt;/span&gt; client first.&lt;br /&gt;&lt;br /&gt;I took a look at those that were popular at the time, but they didn't really appeal to my engineering aesthetic. They heavily favoured class/static methods and seemed to be geared toward command line usage rather than as a library. So I started to implement a clean, easy to use and well encapsulated HTTP library first, resulting in Wrest::Core; it is now ready for use and is sufficiently mature that I'm comfortable writing about it and inviting people to take it for a spin. It does need a few more features, but nothing that can't be added with a few hours worth of hacking. Wrest::Resource however, is still a work in progress, but some of its building blocks are already ready for use. You can see some examples &lt;a href="http://github.com/kaiwren/wrest/tree/master/examples"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Wrest is available for installation through both RubyGems and as a Rails plugin via &lt;a href="http://github.com/kaiwren/wrest"&gt;Git&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;To get the gem, all you need to do is &lt;code&gt;(sudo) gem install wrest&lt;/code&gt;. If you want it as a Rails plugin, simply do &lt;code&gt;script/plugin install git://github.com/kaiwren/wrest.git&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Wrest runs on Ruby 1.8, 1.9 as well as JRuby.&lt;br /&gt;&lt;br /&gt;Here is an example that shows how you can use the &lt;a href="http://delicious.com/help/api"&gt;Delicious API&lt;/a&gt; using Wrest. If you can't see it (it's a github gist that needs js) you can see the original source &lt;a href="http://github.com/kaiwren/wrest/tree/master/examples/delicious.rb"&gt;here&lt;/a&gt;. You may also be interested in the &lt;a href="http://github.com/kaiwren/wrest/tree/master/examples/twitter.rb"&gt;Twitter example&lt;/a&gt;, which showcases a more complex scenario with ideas and features from Wrest::Resource.&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/172794.js"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-397829642580057019?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=To8DZLZVSZM:kJVmLBjklvM:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=To8DZLZVSZM:kJVmLBjklvM:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=To8DZLZVSZM:kJVmLBjklvM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=To8DZLZVSZM:kJVmLBjklvM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=To8DZLZVSZM:kJVmLBjklvM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=To8DZLZVSZM:kJVmLBjklvM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=To8DZLZVSZM:kJVmLBjklvM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=To8DZLZVSZM:kJVmLBjklvM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=To8DZLZVSZM:kJVmLBjklvM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=To8DZLZVSZM:kJVmLBjklvM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/To8DZLZVSZM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/397829642580057019/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=397829642580057019" title="11 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/397829642580057019?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/397829642580057019?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2009/08/wrest-rest-and-ruby-http-libraries.html" title="Wrest, REST and Ruby HTTP libraries" /><author><name>Sidu Ponnappa</name><uri>https://profiles.google.com/103040704249449871264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGXL6VUh5X0/AAAAAAAAAAI/AAAAAAAAAYM/kP3kKE520zA/s512-c/photo.jpg" /></author><thr:total>11</thr:total></entry><entry gd:etag="W/&quot;CUAHRXo9fip7ImA9WxJVE0Q.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-3903574927410490750</id><published>2009-07-01T01:56:00.001+05:30</published><updated>2009-07-01T01:58:54.466+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-01T01:58:54.466+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="oss" /><category scheme="http://www.blogger.com/atom/ns#" term="release" /><category scheme="http://www.blogger.com/atom/ns#" term="cc.rb" /><title>CruiseControl.rb 1.4.0 released!</title><content type="html">We are happy to announce the release of &lt;a href="http://cruisecontrolrb.thoughtworks.com"&gt;CruiseControl.rb&lt;/a&gt; 1.4.0. This release adds support for three distributed version control systems - Git, Mercurial and Bazaar - in addition to Subversion.&lt;br /&gt;&lt;br /&gt;CC.rb remains easy to install, pleasant to use and simple to hack. Since the source has now moved to a &lt;a href="http://github.com/thoughtworks/cruisecontrol.rb"&gt;git repository&lt;/a&gt;, it is easier than ever to fork and contribute. We're looking forward to your pull requests!&lt;br /&gt;&lt;br /&gt;Downloads are available from both &lt;a href="http://rubyforge.org/frs/?group_id=2918"&gt;Rubyforge&lt;/a&gt; and &lt;a href="http://github.com/thoughtworks/cruisecontrol.rb/tree/v1.4.0"&gt;Github&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-3903574927410490750?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=okteJPXJC48:F77oEyYsHJ4:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=okteJPXJC48:F77oEyYsHJ4:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=okteJPXJC48:F77oEyYsHJ4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=okteJPXJC48:F77oEyYsHJ4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=okteJPXJC48:F77oEyYsHJ4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=okteJPXJC48:F77oEyYsHJ4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=okteJPXJC48:F77oEyYsHJ4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=okteJPXJC48:F77oEyYsHJ4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=okteJPXJC48:F77oEyYsHJ4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=okteJPXJC48:F77oEyYsHJ4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/okteJPXJC48" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/3903574927410490750/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=3903574927410490750" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/3903574927410490750?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/3903574927410490750?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2009/07/cruisecontrolrb-140-released.html" title="CruiseControl.rb 1.4.0 released!" /><author><name>Sidu Ponnappa</name><uri>https://profiles.google.com/103040704249449871264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGXL6VUh5X0/AAAAAAAAAAI/AAAAAAAAAYM/kP3kKE520zA/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CUQMRHw4cCp7ImA9WxJXEE0.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-1163640395608610744</id><published>2009-06-03T09:24:00.005+05:30</published><updated>2009-06-03T09:59:45.238+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-03T09:59:45.238+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="darkness" /><category scheme="http://www.blogger.com/atom/ns#" term="metaprogramming" /><title>Dynamic languages, Twitter, kind_of? and some statistics</title><content type="html">Some time ago &lt;a href="/2009/04/twitter-on-ruby-and-scala.html"&gt;I'd written&lt;/a&gt; about how &lt;a href="http://www.artima.com/scalazine/articles/twitter_on_scala.html"&gt;Twitter's descriptions of their own codebase&lt;/a&gt; made my hackles rise.&lt;br /&gt;&lt;br /&gt;I wasn't alone in this, and one discussion thread on the internal ThoughtWorks dev list later we had some hard numbers extracted from all the Ruby work we've done or are doing.&lt;br /&gt;&lt;br /&gt;Martin's put them up on his bliki - &lt;a href="http://martinfowler.com/bliki/DynamicTypeCheck.html"&gt;take a look&lt;/a&gt;. &lt;span style="font-style:italic;"&gt;There&lt;/span&gt; are the numbers to back the talk - you &lt;span style="font-style:italic;"&gt;don't&lt;/span&gt; need type checks all over your codebase in Ruby (or any other dynamic language), Alex Payne's opinion notwithstanding.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-1163640395608610744?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=bClnjV0wATQ:XytGiRd6zLk:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=bClnjV0wATQ:XytGiRd6zLk:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=bClnjV0wATQ:XytGiRd6zLk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=bClnjV0wATQ:XytGiRd6zLk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=bClnjV0wATQ:XytGiRd6zLk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=bClnjV0wATQ:XytGiRd6zLk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=bClnjV0wATQ:XytGiRd6zLk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=bClnjV0wATQ:XytGiRd6zLk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=bClnjV0wATQ:XytGiRd6zLk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=bClnjV0wATQ:XytGiRd6zLk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/bClnjV0wATQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/1163640395608610744/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=1163640395608610744" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/1163640395608610744?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/1163640395608610744?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2009/06/dynamic-languages-twitter-kindof-and.html" title="Dynamic languages, Twitter, kind_of? and some statistics" /><author><name>Sidu Ponnappa</name><uri>https://profiles.google.com/103040704249449871264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGXL6VUh5X0/AAAAAAAAAAI/AAAAAAAAAYM/kP3kKE520zA/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkYNRXcycSp7ImA9WxVaE0k.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-5130760274998432808</id><published>2009-04-10T12:27:00.008+05:30</published><updated>2009-04-10T12:53:14.999+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-10T12:53:14.999+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="event" /><category scheme="http://www.blogger.com/atom/ns#" term="dcb2" /><category scheme="http://www.blogger.com/atom/ns#" term="devcampbangalore" /><title>DevCamp Tomorrow</title><content type="html">So &lt;a href="http://devcamp.in"&gt;DevCamp&lt;/a&gt; is tomorrow; I haven't got my talk(s?) anywhere close to ready, so today is going to be a hard grind. Perhaps, I'll just do the Ruby talk and skip the js one?&lt;br /&gt;&lt;br /&gt;Anyways, if you live in Bangalore or happen be in town on Saturday, 11th April, do consider dropping in (directions to ThoughtWorks office can be &lt;a href="http://devcamp.in/wiki/Venue:_ThoughtWorks_Bangalore"&gt;found on the wiki&lt;/a&gt;, map and all); there are &lt;a href="http://devcamp.in/wiki/DevCamp_Bangalore_2_Sessions"&gt;18 sessions up on the wiki&lt;/a&gt; and a bunch of interesting people participating, so it should be an entertaining gig.&lt;br /&gt;&lt;br /&gt;Oh, and do remember to tell any of your friends who might be interested.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-5130760274998432808?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=CRrMwQDujVQ:5nG5jeX7cQM:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=CRrMwQDujVQ:5nG5jeX7cQM:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=CRrMwQDujVQ:5nG5jeX7cQM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=CRrMwQDujVQ:5nG5jeX7cQM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=CRrMwQDujVQ:5nG5jeX7cQM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=CRrMwQDujVQ:5nG5jeX7cQM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=CRrMwQDujVQ:5nG5jeX7cQM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=CRrMwQDujVQ:5nG5jeX7cQM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=CRrMwQDujVQ:5nG5jeX7cQM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=CRrMwQDujVQ:5nG5jeX7cQM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/CRrMwQDujVQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/5130760274998432808/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=5130760274998432808" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/5130760274998432808?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/5130760274998432808?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2009/04/devcamp-tomorrow.html" title="DevCamp Tomorrow" /><author><name>Sidu Ponnappa</name><uri>https://profiles.google.com/103040704249449871264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGXL6VUh5X0/AAAAAAAAAAI/AAAAAAAAAYM/kP3kKE520zA/s512-c/photo.jpg" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;AkAEQX0zfCp7ImA9WxVaE0k.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-6478747728829537405</id><published>2009-04-06T22:19:00.012+05:30</published><updated>2009-04-10T13:01:40.384+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-10T13:01:40.384+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="functional programming" /><category scheme="http://www.blogger.com/atom/ns#" term="twitter" /><category scheme="http://www.blogger.com/atom/ns#" term="scala" /><title>Twitter on Ruby and Scala</title><content type="html">Ever heard a code-smell in a conversation? Like this guy is giving you gyan about how he's doing x in language y and it's such a pain in the ass, and you're thinking to yourself "x is such a darn stupid idea in the first place," know what I mean?&lt;br /&gt;&lt;br /&gt;The reason I bring this up is because this &lt;a href="http://www.artima.com/scalazine/articles/twitter_on_scala.html"&gt;interview with some of the Twitter hackers&lt;/a&gt; came up on the ThoughtWorks software dev mailing list today, and it smelt faintly of cowpats so I thought it worth a mention.&lt;br /&gt;&lt;br /&gt;Most of the interview is fairly quiet, sensible stuff; you're ambling along going 'Ho, hum, mildly interesting...' and then something fearsomely ignorant bumbles out and gores you someplace delicate. Here's an example that got pointed out: &lt;blockquote&gt;Alex Payne: I’d definitely want to hammer home what Steve said about typing. As our system has grown, a lot of the logic in our Ruby system sort of replicates a type system, either in our unit tests or as validations on models. I think it may just be a property of large systems in dynamic languages, that eventually you end up rewriting your own type system, and you sort of do it badly. You’re checking for null values all over the place. There’s lots of calls to Ruby’s kind_of? method, which asks, “Is this a kind of User object? Because that’s what we’re expecting. If we don’t get that, this is going to explode.” It is a shame to have to write all that when there is a solution that has existed in the world of programming languages for decades now.&lt;/blockquote&gt;Aargh. Aargh, I say. I would freakin' bust someone who wrote object-oriented code with &lt;code&gt;is_a?&lt;/code&gt; or &lt;code&gt;kind_of?&lt;/code&gt; in it, and here's this laddie out on the world wide internetworks proudly &lt;span style="font-style:italic;"&gt;admitting&lt;/span&gt; that his people write that kind of code. &lt;code&gt;nil&lt;/code&gt; checks everywhere? The solution to &lt;a href="http://en.wikipedia.org/wiki/Null_object_pattern"&gt;that&lt;/a&gt; has been around for ten years now, for crying out loud. Hasn't anyone told them this kind of code is a people problem, not a language problem?&lt;br /&gt;&lt;br /&gt;Here's another bit that seemed suspicious:&lt;blockquote&gt;Alex Payne: I think programmers who’ve never worked with a language with pattern matching before should be prepared to have that change their perceptions about programming. I was talking to a group of mostly Mac programmers, largely Objective-C developers. I was trying to convey to them that once you start working with pattern matching, you’ll never want to use a language without it again. It’s such a common thing that a programmer does every day. I have a collection of stuff. Let me pick certain needles out of this haystack, whether its based on a class or their contents, it’s such a powerful tool. It’s so great.&lt;/blockquote&gt;Needle in a haystack, eh? In my limited fp experience, pattern matching is used in functional languages for both terseness and for polymorphism. What they seem to be describing - using pattern matching as a glorified regexp and an accessory to the violation of encapsulation - seems pretty unnecessary, given that they're using an OO language that supports polymorphism through objects anyways. This kind of stuff was why I put my Scala studies on hold until I learned how to think correctly in functional terms; Scala makes it easy for a novice to write code that is neither good FP nor good OO.&lt;br /&gt;&lt;br /&gt;I have this feeling that Twitter is always 'discovering' something which the rest of the world already knows and has used for a long time. What's worse, they won't go look at the tons of work that's out there and learn from that; no, they'll make the same naive mistakes all over again, like they did a couple of years ago with message queues, a story I've heard from a lot of people.&lt;br /&gt;&lt;br /&gt;Don't get me wrong here, I'm not dissing everything they've said; they're good chaps and have a fantastic service deserving of respect. I've also written a &lt;span style="font-style:italic;"&gt;little&lt;/span&gt; Scala myself and have been lurking on the &lt;span style="font-style:italic;"&gt;/Lift/&lt;/span&gt; lists for over a year and I agree with them when they say Scala is a nice language. But frankly, a little engineering and attention to code quality might help them solve more problems than switching languages.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-6478747728829537405?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=Y1NJCunp15w:51BeLwKX58g:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=Y1NJCunp15w:51BeLwKX58g:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=Y1NJCunp15w:51BeLwKX58g:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=Y1NJCunp15w:51BeLwKX58g:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=Y1NJCunp15w:51BeLwKX58g:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=Y1NJCunp15w:51BeLwKX58g:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=Y1NJCunp15w:51BeLwKX58g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=Y1NJCunp15w:51BeLwKX58g:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=Y1NJCunp15w:51BeLwKX58g:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=Y1NJCunp15w:51BeLwKX58g:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/Y1NJCunp15w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/6478747728829537405/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=6478747728829537405" title="17 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/6478747728829537405?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/6478747728829537405?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2009/04/twitter-on-ruby-and-scala.html" title="Twitter on Ruby and Scala" /><author><name>Sidu Ponnappa</name><uri>https://profiles.google.com/103040704249449871264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGXL6VUh5X0/AAAAAAAAAAI/AAAAAAAAAYM/kP3kKE520zA/s512-c/photo.jpg" /></author><thr:total>17</thr:total></entry><entry gd:etag="W/&quot;A0QCQn08cCp7ImA9WxVbEU4.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-6913532167865883593</id><published>2009-03-22T23:27:00.007+05:30</published><updated>2009-03-27T13:06:03.378+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-27T13:06:03.378+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="irc" /><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="undernet" /><title>Connecting to Undernet in India is easy... not.</title><content type="html">It appears that &lt;a href="http://undernet.org"&gt;Undernet&lt;/a&gt; is &lt;a href="http://forum.undernet.org/viewtopic.php?f=2&amp;t=9536&amp;start=15"&gt;blocked across a whole bunch of networks in India for reasons unknown&lt;/a&gt;. Here's my traceroute to us.undernet.org:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;~$ traceroute us.undernet.org&lt;br /&gt;traceroute: Warning: us.undernet.org has multiple addresses; using 66.186.59.50&lt;br /&gt;traceroute to us.undernet.org (66.186.59.50), 64 hops max, 40 byte packets&lt;br /&gt; 1  192.168.1.1 (192.168.1.1)  1.227 ms  0.858 ms  0.875 ms&lt;br /&gt; 2  ABTS-KK-Dynamic-001.64.167.122.airtelbroadband.in (122.167.64.1)  39.120 ms  26.279 ms *&lt;br /&gt; 3  ABTS-KK-Static-041.32.166.122.airtelbroadband.in (122.166.32.41)  47.611 ms  25.424 ms  25.164 ms&lt;br /&gt; 4  ABTS-KK-Static-009.32.166.122.airtelbroadband.in (122.166.32.9)  25.713 ms  25.913 ms  24.841 ms&lt;br /&gt; 5  122.175.255.29 (122.175.255.29)  26.253 ms  25.515 ms  25.598 ms&lt;br /&gt; 6  * * *&lt;br /&gt; 7  * * *&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;There is just one server accessible, and that's montreal.qc.ca.undernet.org. Hopefully, this should save you a half hour's googling.&lt;br /&gt;&lt;br /&gt;Don't let this stop you from filing a complaint with your ISP though (I just logged one with Airtel - ticket #18088886 - and they've promised to have this sorted by 1:30 pm tomorrow) - this is still a free country and they have no business blocking &lt;span style="font-style:italic;"&gt;anything&lt;/span&gt; on the internetworks.&lt;br /&gt;&lt;br /&gt;Update 2009-03-24:&lt;br /&gt;Oslo.NO.EU.Undernet.Org also seems to work. Still no response from Airtel, however. That's quite atypical - it's the first time in about three years that Airtel has failed their "we'll fix it in four business hours" promise.&lt;br /&gt;&lt;br /&gt;Update 2009-03-27:&lt;blockquote&gt;&lt;br /&gt;Date: 25/3/09 1:24 AM&lt;br /&gt;Hi,&lt;br /&gt;&lt;br /&gt;I was to be informed about the status issue 18088886 regarding blocking of Undernet IRC servers by Airtel latest by 13:30 on 24th March, but have not been contacted. Please get back to me with an update.&lt;br /&gt;&lt;br /&gt;Thanks,&lt;br /&gt;Sidu.&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;br /&gt;Date: 25/3/09 1:32 PM&lt;br /&gt;&lt;br /&gt;Dear Mr.Sidu,&lt;br /&gt;&lt;br /&gt;Thank you for writing to us at Airtel Telemedia Services.&lt;br /&gt;&lt;br /&gt;We acknowledge the receipt of your mail dated March 25th, 2009.&lt;br /&gt;&lt;br /&gt;With regards to reference number 18088886, we regret to inform you that IRC&lt;br /&gt;port 66602 cannot be opened as the same has&lt;br /&gt;been blocked by Department of Telecommunications (DoT).&lt;br /&gt;&lt;br /&gt;For further assistance, please.&lt;br /&gt;• Call us at 080-44444121&lt;br /&gt;• E-Mail us at - care.karnataka@airtel.in&lt;br /&gt;• Fax us at 080-41112346&lt;br /&gt;&lt;br /&gt;Assuring you of our best of  services at all times.&lt;br /&gt;Yours sincerely,&lt;br /&gt;&lt;br /&gt;Thrapthi&lt;br /&gt;Customer Relations&lt;br /&gt;Airtel Telemedia Services&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;br /&gt;Date: 25/3/09 3:08 PM&lt;br /&gt;Hi,&lt;br /&gt;&lt;br /&gt;The highest port possible is 65535. Port number 66602 does not exist. Please confirm your response.&lt;br /&gt;&lt;br /&gt;Please keep in mind that I am able to connect to other IRC networks (like Freenode) on the standard IRC ports, which would not be possible if the ports themselves were blocked by the DoT.&lt;br /&gt;&lt;br /&gt;Best,&lt;br /&gt;Sidu. &lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;br /&gt;Date: 26/3/09 9:15 AM&lt;br /&gt;&lt;br /&gt;Dear Mr. Sidu,&lt;br /&gt;&lt;br /&gt;Thank you for writing to us at Airtel Telemedia Services.&lt;br /&gt;&lt;br /&gt;We acknowledge the receipt of your mail dated March 25th, 2009.&lt;br /&gt;&lt;br /&gt;Your request for broadband related has already been registered with the&lt;br /&gt;reference number&lt;br /&gt;18088886 and we have forwarded your mail to our technical team for further&lt;br /&gt;clarifications.&lt;br /&gt;&lt;br /&gt;We would get back to you as per the updates.&lt;br /&gt;&lt;br /&gt;For further assistance, please.&lt;br /&gt;• Call us at 080-44444121&lt;br /&gt;• E-Mail us at - care.karnataka@airtel.in&lt;br /&gt;• Fax us at 080-41112346&lt;br /&gt;&lt;br /&gt;Assuring you of our best of  services at all times.&lt;br /&gt;Yours sincerely,&lt;br /&gt;&lt;br /&gt;Mohsin.&lt;br /&gt;Customer Relations&lt;br /&gt;Airtel Telemedia Services&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-6913532167865883593?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=82Q_DUxBfUo:_huMI1V3Ek0:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=82Q_DUxBfUo:_huMI1V3Ek0:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=82Q_DUxBfUo:_huMI1V3Ek0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=82Q_DUxBfUo:_huMI1V3Ek0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=82Q_DUxBfUo:_huMI1V3Ek0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=82Q_DUxBfUo:_huMI1V3Ek0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=82Q_DUxBfUo:_huMI1V3Ek0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=82Q_DUxBfUo:_huMI1V3Ek0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=82Q_DUxBfUo:_huMI1V3Ek0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=82Q_DUxBfUo:_huMI1V3Ek0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/82Q_DUxBfUo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/6913532167865883593/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=6913532167865883593" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/6913532167865883593?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/6913532167865883593?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2009/03/connecting-to-undernet-in-india-is-easy.html" title="Connecting to Undernet in India is easy... not." /><author><name>Sidu Ponnappa</name><uri>https://profiles.google.com/103040704249449871264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGXL6VUh5X0/AAAAAAAAAAI/AAAAAAAAAYM/kP3kKE520zA/s512-c/photo.jpg" /></author><thr:total>5</thr:total></entry><entry gd:etag="W/&quot;D0ICQHg5cSp7ImA9WxVUEUQ.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-2878213727096657061</id><published>2009-03-16T14:16:00.007+05:30</published><updated>2009-03-16T14:56:01.629+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-16T14:56:01.629+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="event" /><category scheme="http://www.blogger.com/atom/ns#" term="dcb2" /><category scheme="http://www.blogger.com/atom/ns#" term="devcampbangalore" /><title>Announcing DevCamp Bangalore 2</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ABLwpl_AaVo/Sb4UrhdLMTI/AAAAAAAAAJw/8Cm1RI-87js/s1600-h/devcamp22009.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 104px;" src="http://2.bp.blogspot.com/_ABLwpl_AaVo/Sb4UrhdLMTI/AAAAAAAAAJw/8Cm1RI-87js/s400/devcamp22009.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5313707348291432754" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We're happy to announce the second edition of DevCamp Bangalore, &lt;a href="http://devcamp.in/"&gt;DevCamp Bangalore 2&lt;/a&gt;; it's happening on Saturday, 11th April 2009.&lt;br /&gt;&lt;br /&gt;DevCamp is an un-conference by the &lt;a href="http://www.cs.berkeley.edu/%7Ebh/hacker.html" class="external text" title="http://www.cs.berkeley.edu/~bh/hacker.html" rel="nofollow"&gt;hackers&lt;/a&gt;, for the &lt;a href="http://www.catb.org/jargon/html/meaning-of-hack.html" class="external text" title="http://www.catb.org/jargon/html/meaning-of-hack.html" rel="nofollow"&gt;hackers&lt;/a&gt; and of the &lt;a href="http://en.wikipedia.org/wiki/Hacker_%28programmer_subculture%29#Definition" class="external text" title="http://en.wikipedia.org/wiki/Hacker_(programmer_subculture)#Definition" rel="nofollow"&gt;hackers&lt;/a&gt;.&lt;br /&gt;It's a species of &lt;a href="http://en.wikipedia.org/wiki/Barcamp" class="external text" title="http://en.wikipedia.org/wiki/Barcamp" rel="nofollow"&gt;BarCamp&lt;/a&gt; where anything a lover of computers and technology would consider important or entertaining goes.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.devcamp.in/wiki/DevCamp_Bangalore_1"&gt;first DevCamp&lt;/a&gt; happened a little over a year ago and was a lot of fun; we're hoping hoping to keep that trend going with DCB2.&lt;br /&gt;&lt;br /&gt;If you're planning to do a session at DCB2, do keep in mind the fact that everyone at DevCamp is a hacker, a pro. Please assume a high level of exposure and knowledge on the part of your audience and tailor your sessions to suit. Avoid 'Hello World' and how-to sessions which can be trivially found on the net. First hand war stories, in-depth analyses of topics and live demos are best.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-2878213727096657061?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=q0xEUchZpDE:_h_xM-MYQR4:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=q0xEUchZpDE:_h_xM-MYQR4:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=q0xEUchZpDE:_h_xM-MYQR4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=q0xEUchZpDE:_h_xM-MYQR4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=q0xEUchZpDE:_h_xM-MYQR4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=q0xEUchZpDE:_h_xM-MYQR4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=q0xEUchZpDE:_h_xM-MYQR4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=q0xEUchZpDE:_h_xM-MYQR4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/diningtablecoder?a=q0xEUchZpDE:_h_xM-MYQR4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=q0xEUchZpDE:_h_xM-MYQR4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/q0xEUchZpDE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/2878213727096657061/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=2878213727096657061" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/2878213727096657061?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/2878213727096657061?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2009/03/announcing-devcamp-bangalore-2.html" title="Announcing DevCamp Bangalore 2" /><author><name>Sidu Ponnappa</name><uri>https://profiles.google.com/103040704249449871264</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-BGXL6VUh5X0/AAAAAAAAAAI/AAAAAAAAAYM/kP3kKE520zA/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_ABLwpl_AaVo/Sb4UrhdLMTI/AAAAAAAAAJw/8Cm1RI-87js/s72-c/devcamp22009.jpg" height="72" width="72" /><thr:total>1</thr:total></entry></feed>

