I once happened to attend a RubyConfIndia talk by C42’s Steven Deobald who said:

data > functions > macros > compilers

That kind of stuck in my head even though I didn’t know what it meant at that time. I understood it only after learning Clojure and “The Clojure / Lisp way”. I realized it when I was writing Python code for work, and I suddenly noticed I was writing code differently and I had one of those good aha moments that is supposedly the start of a person’s Lisp journey.

I’m now amused at how often I break down my Python or Java code into lots of little functions instead of the 100-liner functions that I used to write before and am still surprised that I never realized I was writing them! The good thing about the “lots of little functions” is the modularity and the ease with which I can write, read, understand and importantly test the code without having to build an object hierarchy first.

For example, my code has now suddenly started looking like this, where data structure is explicitly written down and the processing code is separate from it – this makes the code really reusable. It is a contrast to my earlier programming style where I would’ve probably had the data structure implicit in the parsing code (which makes it less maintainable) or worse, had classes and objects to do the same and it would certainly have not been so reusable! Think of a typical Java programming workflow where I would have had to create a class to represent the data input and passed that to a processor class instance and so on.

# http://www.lexicon.net/sjmachin/xlrd.html
import xlrd

START_ROW = 3 # skip headings

# Explicit structure of the data
    'name' : 0,
    'class' : 1,
    'maths' : 2,
    'geography' : 3,
    'english' : 4,

def row_to_dict(sheet, row_number):
    assert isinstance(sheet, xlrd.sheet.Sheet)
    assert isinstance(row_number, int) and row_number > 0 and row_number < sheet.nrows
    # Code that will work with changing structure
    return dict([(key, sheet.cell_value(rowx=row_number, colx=COLUMN_MAPPING[key])) for key in COLUMN_MAPPING.keys()])

def import_excel(content):
    book = xlrd.open_workbook(file_contents=content)
    sheet = book.sheet_by_index(DATA_SHEET_NUMBER)
    # Code that will work with different spreadsheet formats
    sheet_data = [row_to_dict(sheet, row_number) for row_number in range(START_ROW, sheet.nrows)]
    sheet_data = [data for data in sheet_data if len(data['name']) > 0] # Ignore empty rows
    return sheet_data

if __name__ == '__main__':
    from pprint import pprint
    pprint( import_excel(open('test.xls', 'rb').read()) )

To be clear, Python was a good first step, what changed was the mindset after attempting to learn a Lisp language. As Peter Norvig once said:

Basically, Python can be seen as a dialect of Lisp with “traditional” syntax (what Lisp people call “infix” or “m-lisp” syntax). One message on comp.lang.python said “I never understood why LISP was a good idea until I started playing with python.” Python supports all of Lisp’s essential features except macros, and you don’t miss macros all that much because it does have eval, and operator overloading, and regular expression parsing, so some–but not all–of the use cases for macros are covered.

A good friend of mine once said that Python is more popular because it is more approachable by traditional programmers and hence a more “social” programming language, whereas Lisp is a powerful language but not for everyone. That is explained in detail in the Lisp Curse essay.

So first good thing about Clojure is that it is a Lisp. Second is that it runs on the JVM which has solid performance, sometimes 20x better if you use it right. Third is solid Java interoperability. This was important to me because as a consultant, Java is unavoidable and I’ve written more Java code this year than I ever have. And using a good dynamic language on top of JVM with good Java interoperability is a path to making my work go faster. At least, that was how I got started. After all, your code will end up reflecting your company.

The downside I felt when I was grokking Clojure is that syntax is not simple even though that is the claim of traditional Lisps, for example #”” is regex, #{} is a set, #_() elides the form (compiler checks the code but acts as if it was commented out), #() is an anonymous function, #’ derefs to vars, and so on.

Here is a quick idea about Clojure’s philosophies that I was pointed to:

clojure three circles

Another interesting point is that functional programming languages are growing and it is probably because the future is DSLs again.

If you’re still not convinced, you should watch The Curious Clojureist. And you should definitely watch all the Rich Hickey talks.

How to learn Clojure

The O’Reilly Clojure book is best book that I’ve come across yet.

However, equally important, my strong recommendation is that Clojure is good only when combined with Emacs and ghoseb’s emacs setup. After learning Clojure in that environment, writing Python again makes me miss so many goodies (To get up to the same productivity in a few ways, I’m using PyCharm these days and am enjoying that).

To make my learning solid, I rewrote isbn.net.in for the third time in Clojure. The source code is at https://github.com/swaroopch/isbnnetinclj – be prepared to read some amateurish Clojure code.

I got a lot done in ~280 lines of Clojure code compared to 480+ lines of code in Ruby/Rails and a ton more boilerplate code. This difference in number of lines of code repeats often.

One interesting point is that because of the Clojure way of thinking, I ended up using a simple combination of future and core.cache to do the fetching of prices from book stores in parallel rather than bringing a full-fledged background jobs processor (delayed_jobs) to do that which vastly simplified the system. You can read that code in stores.clj.

Ending Thoughts

I got started with this journey because of frustrations with Java and at the same time I was trying to be not be narrow-minded with experience in just Python/Ruby/Perl languages (they are so similar). I kept reminding myself of what Douglas Crockford said:


That’s an easy one—lack of curiosity. They were so satisfied with the work that they were doing was good enough (without an understanding of what ‘good’ was) that they didn’t push themselves.

I’m much more impressed with people that are always learning. The brilliant programmers I’ve been around are always learning.

You see so many people get into one language and spend their entire career in that language, and as a result aren’t that great as programmers.

Programming languages becoming popular is almost never about the merits of the language itself and rather just a virtuous cycle of availability of programmers or platform requirements – Javascript and Objective-C are popular because you have no other choice, not only because of the merits of the language. Similarly, Clojure is leveraging the JVM and whatever native platform it runs on and hence is getting that initial lift needed to make the language appealing since people don’t want to learn and start on yet another ecosystem.

This is best explained by Alan Kay himself:

Q: What should Java have had in it to be a first-quality language, not just a commercial success?

Alan Kay: Like I said, it’s a pop culture. A commercial hit record for teenagers doesn’t have to have any particular musical merits. I think a lot of the success of various programming languages is expeditious gap-filling. Perl is another example of filling a tiny, short-term need, and then being a real problem in the longer term. Basically, a lot of the problems that computing has had in the last 25 years comes from systems where the designers were trying to fix some short-term thing and didn’t think about whether the idea would scale if it were adopted. There should be a half-life on software so old software just melts away over 10 or 15 years.

It was a different culture in the ’60s and ’70s; the ARPA (Advanced Research Projects Agency) and PARC culture was basically a mathematical/scientific kind of culture and was interested in scaling, and of course, the Internet was an exercise in scaling. There are just two different worlds, and I don’t think it’s even that helpful for people from one world to complain about the other world—like people from a literary culture complaining about the majority of the world that doesn’t read for ideas. It’s futile.

Did you know that Lisp and Smalltalk are not so much in vogue because they were killed by bad hardware!?:

Alan Kay: Yes, actually both Lisp and Smalltalk were done in by the eight-bit microprocessor—it’s not because they’re eight-bit micros, it’s because the processor architectures were bad, and they just killed the dynamic languages. Today these languages run reasonably because even though the architectures are still bad, the level 2 caches are so large that some fraction of the things that need to work, work reasonably well inside the caches; so both Lisp and Smalltalk can do their things and are viable today. But both of them are quite obsolete, of course.

Lastly, I wanted to mention that my Clojure journey would not have sustained if it wasn’t for Baishampayan Ghose (a.k.a. @ghoseb, a.k.a BG) whose untiring answers to my dumb questions was instrumental in me finally gaining some understanding of Clojure and Lisp in general. Thanks BG!

P.S. Watch this 2011 talk by Alan Kay. As @ghoseb would say, Be prepared to blow your mind.

I have been recently using the iXpenseIt iPhone app to track cash expenditures[1]. What’s interesting is it uses the “most used” / “most visited” feature (which you may be familiar with in Firefox or other software) to vastly speed up its usage for the individual using it.

Let’s take an example, this is my default “New Expense” screen:


Notice the entries – default vendor is “Shop”, default category is “Household” and default subcategory is “Supplies.” (my preferences).

Let’s say I had gone out for a Saturday afternoon lunch and I want to quickly enter the food bill. I type ‘Re’ and it quickly shows the best auto-complete option from the list of vendors:


When I tap the ‘Restaurant’ pop-over, a small neat thing happens – it shows me the frequent categories I used for this particular vendor:


So I tap on the second option and voila, the correct category and subcategory is chosen. The funny thing is that this simple “most frequently used” gimmick is the sole reason that I’m still using this expense tracking app (after all these days of trying so many of them) because my time to add a new entry goes down 3-5x times over time!


Another example  – consider my favorite note taking application Evernote – when I go to the ‘Add New Note’ option and the clock happens to be in the middle of a calendar event, the default title of the new note will be “Note from Event Name”:


Why is this useful? Because that is the most likely thing I’ll be doing – adding a note from the event that I’m attending, and this speeds up the process of me writing the new note.

I wish more applications would do this, for example:

  • I’m currently in Pune where Airtel does not have a 3G circle permission, so I am told to switch to Idea network or Vodafone network to get 3G access, but the hitch is that there are areas where Idea network signal strength is low and I have to manually change the network back to Airtel which has full signal strength. I really wish my smartphone could remember which network I use in each of my frequented locations and automatically switch based on that.
  • I wish my Email application would show frequently emailed contacts when I click on “Mail this link” in my browser.  Apple has a new VIP feature in Mountain Lion but I just wish it could show my “top 5 most emailed contacts in the past month” immediately next to the “To” entry field that I could just click on! (I couldn’t figure out how to use the built-in Mac OS X Automator software to simulate this)

Similar to these examples, what customizations / simple statistics / information usage would you like to see in the apps that you frequently use?


[1] I don’t intend to use it for more than a few months, it’s just to get a handle on expenses when living in a new city.

I have moved my website from my own Linode server to WPEngine.

Why? Because I was tired of my server randomly going to 100% CPU usage and the only way to revive it was to reboot the server! For a long time, I thought the problem was maybe MongoDB which I was using for isbn.net.in which was running on the same server as the blog. But surprisingly, it was most likely WordPress at fault.

On the same point, it has been quite embarrassing when I get tweets and emails that my blog is down, because of this. Especially embarrassing because I’m supposed to be a developer and I can’t even keep a simple website up? Something had to be done.

When I read patio11’s story of how and why he moved to WPEngine, I found myself nodding and agreeing with him throughout the article, especially the part about WordPress, PHP, Apache being very finicky software.
And I found other people who felt the same way as well. I also liked what I read on the WPEngine company website. And knowing that the guy who blogs at asmartbear.com is the same guy who started the WPEngine company gave me even more confidence in moving to WPEngine.

Since companies and projects are moving on to platforms like AWS (to get rid of hardware headaches) and Heroku (to get rid of deployment, operations and scaling headaches), I didn’t see why I shouldn’t move my personal website to a managed WordPress hosting.

That was when I chalked out a plan to move to WPEngine, and moved it wholesale on a weekend.

I’m glad to be no longer doing the constant monitoring of the server and monitoring of the security and upgrades of wordpress, security of plugins, daily backup, etc. WPEngine does that for me. And it even gives me a staging server if I just want to try out stuff. I can’t wait to try out their upcoming Heroku-style git repository feature.

The most surprising and positive upgrade in moving to WPEngine has been the speed. The blog opens up way way faster than before.

No, they haven’t paid me to write this article, I’m just a satisfied customer (so far).

My old superb theme by Divya Manian (Nimbupani) was beginning to show its software rot – it didn’t have support for widgets or the latest options and so on. So I took the major pieces of that theme and converted the default Twenty Eleven theme to use the same branding. Let me know whether it looks decent.

My mutated new WordPress theme

All in all, I’m happy with the move. And as you may have noticed, my frequency of publishing is starting to pick up, thanks to the having no headaches about the website.

Update on 21-Feb-2012 : Looks like Canonical had the same idea!

Instead of Canonical trying to tinker with the UI of Ubuntu Desktop Linux, I really wish they thought differently™ instead.

I find iPhone incredibly easy to use because of iTunes. Regardless of your feelings about iTunes, I find it an indispensable software and have been constantly wishing there was something similar for Android.

That’s my wish for Ubuntu’s direction – instead of trying to reinvent the UI, simply focus on integrating Android with Ubuntu, so much so that if you’re an Android user, you’ll be tempted to switch to Ubuntu because it makes life so easy.

For example:

  • iCloud equivalent that would sync Ubuntu and Android Address Book, Calendar, Notes, etc.
    • Yes, there is Ubuntu One but that only talks about the Dropbox aspect of things, not the integration into the specific data apps such as Address Book, Calendar, Notes, etc.
      • Maybe even combine forces with the CyanogenMod folks if it requires a custom Android build!
      • Possibly just use Dropbox as a backing store and maybe cut a deal with Dropbox to highlight Ubuntu, just like iOS integrates Twitter for mutual benefits, for example, Dropbox can be bookmarked in the “File -> Open With” window by default in Ubuntu, and so on. This is a marketing angle that will probably inform most Dropbox users, out of which a large segment will very likely have Android phones, about the possibility of considering Ubuntu.
    • This “uCloud for data” assures me that my data is always safe which is what I’m never comfortable with every new breaking version as well as changing apps in Linux/Ubuntu – “The new default photo app is Shotwell? What happened to F-Spot?” and other situations.
  • Connect your Android phone and auto-sync photos, music, etc.
    • Especially the facility of copying over new photos to the desktop and giving good organizational functionality such as deciding which photos to keep and which ones to delete.
  • Assist with making it easy to read EPUB and PDF both on the desktop and the phone like saving “last read location”, etc. just like the Kindle app
  • Other possibilities such as a IFTTT that involves the desktop, the phone and the cloud (an alternative to the Automator in OS X)

If a high build-quality laptop came supported with Ubuntu (there is a list of crowdsourced recommendations but none that you could depend on, it’s your guess and fate on whether all the hardware works well with Ubuntu) + an Ubuntu that works super-well with Android, then I would love to eventually switch away from Mac and iPhone to an open source Ubuntu and Android combination.

Benefits include:

  1. Open source benefits, as well as makes future of open source platforms more brighter rather than next generation assuming closed platforms where you can run apps is how it always has been as opposed to having a fully hackable environment
  2. To protect myself against future lockdowns – when I heard of Cory Doctorow talk about the coming war on general purpose computation, I thought he was being too negative and then Apple announced a lockdown of apps for OS X Mountain Lion amongst other AppStore sandboxing issues. Sigh.
  3. As a developer, I’m already highly dependent on Ubuntu server edition, would make it neat to use it on the desktop as well.
  4. This makes it super-easy to transition someone to Ubuntu since it works well with their phone which they rely so much on already, and since the data is suddenly available on the desktop as well, the fear of the unknown reduces and they become more open to trying out a new OS.
  5. I can finally have a usable Android phone.

P.S. Another random thought – An Ubuntu laptop that comes with a SIM card slot built-in so that I can put in a SIM card and will have internet always-on, just like an iPad.

Update : Submitted as Brainstorm Idea #29231.

I discovered recently that people are really using my repositories and getting pull requests for the same.

So I just wanted to mention here about the updates to these repositories so far since the last time I wrote about them.


The biggest change to my Vim environment is that I switched from vim-addon-manager with vim-scripts.org to Vundle, thanks to Anirudh’s comment on my previous post.

The second major change was the discovery of Solarized which was an amazing color scheme that I just have not been able to live without ever since I first saw it seven months ago.

solarized with vim with dark background

A great side effect of this was discovering iTerm2 for Mac. I now use iTerm2 solarized dark theme + vim solarized theme with dark background for the console version and vim solarized theme with light background for the GUI MacVim version. I’m absolutely adoring it and I find it very pleasing and easy on the eyes.

Other changes in dotvim include incorporating stuff related to CoffeeScript, Ubuntu Upstart, nginx, etc. whose syntax files are not part of the default Vimfiles, not in a git repo, etc.

dotvim is at https://github.com/swaroopch/dotvim.


After realizing that people have tried using dotbash and found the installation process cumbersome because the bash-it, by default, asks the user to approve every plugin that they want installed and they found it annoying. I replaced the default install script to install all the plugins (except recent buggy ones) and made installation much more simpler.

Again, after realizing that people are using dotbash and subsequently they were surprised that it overwrote ~/.gitconfig and other files by default which basically nuked their git email addreses and added mine and ended up me being listed as a “guest” committer on their repositories, I got rid of the username-specific stuff in the repository.

And also it is merged and keeping up with the master branch of the bash-it repository.

dotbash is at https://github.com/swaroopch/dotbash.

As always, looking forward to feedback on whether others find this tweaking of the development environment useful and feedback on how to improve it further.

I’ve been reading Coders at Work on and off, and it is a good read for coders who want to learn how coders, who they admire, think and approach programming.

Two favorite nuggets of mine so far are from JWZ and Brad Fitzpatrick who are definitely two of my programming heroes:

About taking things apart


Is there a key skill programmers must have?


Well, curiosity – taking things apart. Wanting to know what’s going on under the hood. I think that’s really the basis of it. Without that I don’t think you get very far. That’s your primary way of acquiring knowledge. Taking something apart and looking at it is how you learn to build your own. At least for me. I’ve ready very few books about computers. My experience has been digging through source code or reference manuals. I’ve got a goal and, alright, to do this I need to know what this thing does and what this thing does. And I’ll just sort of random-walk through that until I find where I’m going.

How to improve oneself


Do you have any advice for self-taught programmers?


Always try to do something a little harder, that’s outside your reach. Read code. I heard this a lot, but it didn’t really sink in until later. There were a number of years when I wrote a lot of code and never read anyone else’s. Then I get on the Internet and there’s all this open source code I could contribute to but I was just scared shitless that if it wasn’t my code and the whole design wasn’t in my head, that I couldn’t dive in and understand it.

Then, I was sending in patches to Gaim, the GTK instant-messenger thing, and I was digging around that code and I just saw the whole design. Just seeing parts of it, I understood. I realized, after looking at other people’s code, that it wasn’t that I memorized all my own code; I was starting to see patterns. I would see their code and I was like, “Oh, OK. I understand the structure that they’re going with.”

Then I really enjoyed reading code, because whenever I didn’t understand some pattern, I was like, “Wait, why the fuck did they do it like this?” and I would look around more, and I’d be like, “Wow, that is a really clever way to do this. I see how that pays off.” I would’ve done that earlier but I was afraid to do it because I was thinking that if it wasn’t my code, I wouldn’t understand it.

I am here at IITM, Chennai to help out NextDrop in some technology discussions, and have been blown away by the kinds of companies incubated at the Rural Technology Business Incubation facility (RTBI).

IITM Research Park

RTBI portfolio

For example, consider Stellapps which is developing an automated cow milking system!

To get a taste of what I’m talking about, definitely watch this talk at Google by Prof. Ashok Jhunjhunwala (the good stuff starts at 17 min 13 sec):

I switched to a Samsung Galaxy S-2 phone a couple of months ago, after my old iPhone 3G (not 3GS) became slower and started having button issues. The biggest problem I faced with the new phone was how do I sync data like music and contacts without it being a constant manual effort and without going through Google’s servers?

I paid for and tried Missing Sync ($39.95), but it would refuse to sync music complaining that there is no space even though there was clearly 10GB of free space, even support couldn’t solve this issue. And there were other annoyances like having to install an ugly calendar app for calendar syncing instead of it syncing to the default calendar app already on the phone.

I finally settled for SyncMate ($39.95) for syncing contacts, calendar, bookmarks, photos, folders, sms and calls, and iSyncr ($3) for syncing music and playlists.

I just wanted to put this out there for other people like me who miss the smooth syncing between iTunes and iPhone and wish they had the same with their Android device.

Update on 1st July, 2012 : Now there is an official Easy Phone Sync app from Samsung to sync Mac with your Samsung Android phone.

A common question I get from non-techies is “Is ecommerce for real? Do people really buy online?”

My line of argument is that the future is digital, and hence buying
online is a natural consequence of that.

However, just saying that was not convincing enough. So I gathered some
statistics as proof and to wow them:

Closer to home:

Then there always is the trump card of how ubiquitous online ticketing has become…

As you can see, digital is happening in India and with RBI
reporting that 35% of transactions (and 88% of the total amount) were

and Cash on Delivery slowly
how far will ecommerce

How would you convince someone that the future is digital and that ecommerce will be big in India?

Every once in a while I get an email like this:

Sir, I am a beginner to python and programming. I started with the C++
and found it hard so one day via google I found your perfect tutorial
“A byte of Python”. I read the whole tutorial in one day because it is
so interesting and helpful. Sir, I have created the script to backup
files from directory as you mentioned. Please see the script once and
tell me if I have chances in programming career. Sir I am final B.tech
student and I love programming. But I was rejected by every company
during campus placement because of my poor communication skills and
due to this my confidence level is very low. Sir I have also created a
web based application using PHP, MySQL and Kannel on Debian based
server for intra-college communication. Sir, I am regular reader of
your blog and I respect what you are doing to help freshers like me.
Sir I would like to know if you have any advice for me.

And like this:

I want to thank you about this great book ;-). I am a 20-years-old
student in computer science from Bulgaria and i found this book very
interesting and helpful. I’ve been programming in python for half a
month. I had little experience in C from the university and I wanted
to learn a high level language with simple syntax like Python and then
learn C++ and start writing useful programs. I send you a solution of
the problem in the end of the book that is just a demo version. Can
you give me a hint what i got to improve to make the address book
program better and give me the source code of your solution? I really
want to become a programmer so any advices especially from a man with
your knowledge would be highly appreciated! Thanks.

For a long time, I used to scratch my head for every such email because I really didn’t know what advice I have to offer. I did end up writing How Fresh Graduates Can Grow which a lot of students have liked.

In the past couple of years, I have started replying with just one line – I ask them to read The Passionate Programmer: Creating a Remarkable Career in Software Development by Chad Fowler. I happily  recommend this book knowing that if they actually do read and apply the principles in this book, they can’t go wrong.

I had read this book in its first edition when it was called My Job Went to India and I read it again when the renamed second edition came out.

The title of the book is self-explanatory but what makes the book special from other regular career books is that it is geared specifically to the art of software programming as well as explaining networking and many soft concepts/human aspects in a for-geeks “53 recipes” style.

Some of my favorite recipes/lessons are:

4. Be the worst

Legendary jazz guitarist Pat Metheny has a stock piece of advice for
young musicians, which is “Always be the worst guy in every band
you’re in.” Being the worst guy in the band means always playing with
people who are better than you.

Being the worst guy/gal on the team has the same effect as being the
worst guy in the band. You find that you’re unexplainably smarter.
You even speak and write more intelligently. Your code and designs get
more elegant, and you find that you’re able to solve hard problems
with increasingly creative solutions.

6. Don’t listen to your parents

I remember talking to a friend about potentially moving out of this
company, and he said, “Is it your destiny to work at $bigcompany for
the rest of your life?”
Hell no it wasn’t!_ So, I quickly found
another job and left.

This movement marked the clear beginning of a nonlinear jump in my
success in the software industry. I saw new domains, I worked on
harder problems, and I was rewarded more heavily than ever before. It
was scary at times, but when I decided to be less fear-driven and
conservative in my career choice, the shape and tone of my career – my
life – changed for the better.

15. Practice, practice, practice

When you practice music, it shouldn’t sound good. If you always
sound good during practice sessions, it means you’re not stretching
your limits. That’s what practice is for. The same is true in sports.
Athletes push themselves to the limit during workouts so they can
expand those limits for real performances. They let the ugliness
happen behind closed doors – not when they’re actually working.

Our industry tends to practice on the job. Can you imagine a
professional musician getting onstage and replicating the gibberish
from my university’s practice rooms? It wouldn’t be tolerated.
Musicians are paid to perform in public – not to practice. As an
industry, we need to make time for practice.

Practicing may include learning more about your programming
environment (APIs, libraries, methodologies, etc.), sight reading
(reading new pieces of open source code to improve your ability to
read and understand code), improvisation (introduce new constraints in
small projects to improve your thinking abilities) and so on.

32. Say it, Do it, Show it

You should start communicating your plans to your management. The best
time to start communicating the plans is after you have executed at
least one cycle of the plan. And – this is an important point – start
doing it before they ask you to do it. No manager in his or her right
mind would be unhappy to receive a succinct weekly e-mail from an
employee stating what was accomplished in the past week and what they
plan to do in the next. Receiving this kind of regular message
unsolicited is a manager’s dream.

Start by communicating week by week. When you’ve gotten comfortable
with this process, start working in your thirty, sixty, and
ninety-day plans. On the longer views, stick to high-level, impactful
progress you plan to make on projects or systems you maintain. Always
state these long-term plans as proposals to your manager, and ask for

The most critical factor to keep in mind with everything that goes
onto a plan is that it should always be accounted for later. Every
item must be either visibly completed, delayed, removed, or replaced.
No items should go unaccounted for. If items show up on a plan and are
never mentioned again, people will stop trusting your plans, and the
plans and you will counteract the effectiveness of planning. Even if
the outcome is bad, you should communicate it as such. We all make
mistakes. The way to differentiate yourself is to address your
mistakes or inabilities publicly and ask for help resolving them.
Consistently tracing tasks on a plan will create the deserved
impression that no important work is getting lost in the mix.

43. Making the Hang

Speaking for myself (and extrapolating from there), the most serious
barrier between us mortals and the people we admire is our own fear.
Associating with smart, well-connected people who can teach you things
or help you find work is possibly the best way to improve yourself,
but a lot of us are afraid to try. Being part of a tight-knit
professional community is how musicians, artists, and other
craftspeople have stayed strong and evolved their respective artforms
for years. The gurus are the supernodes in the social and professional
network. All it takes to make the connection is a little less

Of course, you don’t want to just randomly start babbling at these
people. You’ll obviously want to seek out the ones with which you have
something in common. Perhaps you read an article that someone wrote
that was influential. You could show them work you’ve done as a result
and get their input. Or, maybe you’ve created a software interface to
a system that someone created. That’s a great and legitimate way to
make the connection with someone.

44. Already Obsolete

You have to start by realizing that even if you’re on the bleeding
edge of today’s wave, you’re already probably behind on the next one.
Timing being everything, start thinking ahead with your study. What
will be possible in two years that isn’t possible now? What if disk
space were so cheap it was practically free? What if processors were
two times faster? What would we not have to worry about optimizing
for? How might these advances change what’s going to hit?

Yes, it’s a bit of a gamble. But, it’s a game that you will
definitely lose if you don’t play. The worst case is that you’ve
learned something enriching that isn’t directly applicable to your job
in two years. So, you’re still better off looking ahead and taking a
gamble like this. The best case is that you remain ahead of the curve
and can continue to be an expert in leading-edge technologies.

Looking ahead and being explicit about your skill development can mean
the difference between being blind or visionary.

P.S. This lesson was the reason why I started admiring DHH even more after seeing he is not afraid to include CoffeeScript and SCSS in Rails 3.1

51. Avoid Waterfall Career Planning

The important thing to realize is that change is not only possible in
your career but necessary. As a software developer, you would never
want to pour yourself into developing something your client doesn’t
want. Agile methodologies help prevent you from doing so. The same is
true of your career. Set big goals, but make constant corrections
along the way. Learn from the experience, and change the goals as you
go. Ultimately, a happy customer is what we all want (especially when,
as we plan our careers, we are our own customers) – not a completed

I probably put more excerpts from the book here than I should, but I wanted to drive home the point on some of the non-obvious-but-critical points that the book raises that every software developer should ponder about.

Go buy the book / ebook now!

Update: Also see Top 5 Developer Skills That Will Get You Hired or Promoted