Software Development, A 24/7 Job, May 2, 2012

fish decoration

In his book The Passionate Programmer, Chad Fowler has written a chapter called "The Eight-Hour Burn". He says that if you're giving your very best in your work, then he expects it would be impossible for you to do so for more than forty hours per week.

Without getting into the details of why I would agree that long hours are a bad idea for a software development career, I think that there is an implied premise that work happens at the office, a premise that I disagree with. Bill Gates has been quoted saying, "Measuring programming progress by lines of code is like measuring aircraft building progress by weight." I would add that measuring programming progress in terms of time at the office is not much better.

Joel Spolsky wrote on his blog, "Sometimes, I just can't get anything done". He writes about spending weeks at a time not being able to get started on some project, as if that were a bad thing. I'm sure that sometimes it is, but in my experience, when I can't write anything, or whatever I write doesn't seem right, I find that it is a sign that I'm not ready to write yet because I don't know what to write. Sometimes, I mentally flog myself for my lack of progress just as Joel says that he did. However, I've learnt that just becase I'm not writing code doesn't mean that I'm not making progress.

There is a magic spark that ignites within me when I contemplate software development away from my workstation where I cannot write a single line of code. I can't explain why, but I just don't feel it the same way if I sit at my workstation and push myself to write code. It is as if my mind switches from a crawling paradigm to a flying paradigm the moment I step outside.

I once worked for about a year on an inventory tracking system web application that tracks millions of dollars worth of equipment. One day, my client came to me and told me about a project he wanted me to do for him: he wanted me to create a web ordering module where users could place orders for new equipment and we could track the progress of the orders and then have them automatically entered into the inventory tracking system. He pointed to as what he wanted it to look and feel like. My client suggested that this would be a huge project that would be similar in size and scope to the inventory tracking system. So, I went to work and started thinking of ideas for how to architect database structures, web server code, and JavaScript for a web ordering module.

For the first week or so, I felt paralyzed whenever I tried to write any code. It seemed like no matter what code I wrote, I needlessly duplicated something that was already in the inventory tracking system. Eventually, as I was relaxing at home, a brilliant solution came to mind: since everything I tried writing simply duplicated features already in the program, I simply thought of a way to implement my client's request by mostly using the existing code and database structures, writing relatively little new code, and almost no new database structures. When I arrived at the office the next day, I knew what to do and there was no hesitation to write the code. Not only did I delight my client with the product I produced, I produced it in a fraction of the amount of time we anticipated.

Later on, I found myself tasked with redesigning an old web application that was written in VBScript on the "Classic ASP" framework. I believe that the application was over ten years old. The application had only four pages, and nearly all the interaction was programmed using postbacks. Immediately, I knew that AJAX would make the application look and feel like a modern web application. I lost no time in re-writing the entire application using C#, and yet, something was still amiss. I found that when I used the application as I imagined an end-user would, I constantly went back and forth between pages, clicking and waiting for one page to load, and then another. It just didn't feel right.

I took a long walk outside the office to think about what to do, and that same spark ignited again as if I were hit by lightning. I knew that in an application where a user goes back and forth between different pages of information, the expected interface is tabs. I imported jQuery-UI-Tabs into my web application and implemented the tabs to make it easy to go back and forth between the different pages without waiting for them to reload.

My very best work has been enabled by thoughts that occurred to me far away from my workstation.

I believe that I am witness to the effect that Paul Graham calls The Top Thought in Your Mind. When I can get something on my mind as the thing that I naturally think about when I'm not making an effort to think about something else, it makes a big difference. When that thing is something beyond my control that upsets me, I can get very unhappy very quickly and become mentally paralyzed; but when that thing is a challenge to be overcome or a problem to solve, it's the beginning of magical things happening.

Without even trying, I got the web ordering module task into this position, and it became as if I were making magic 24/7. I believe that an ability to make this happen regularly separates the extraordinary software developer from the average software developer. It is far more valuable (and pleasant) than trying to make progress by spending more time at the office. Back at the beginning of this article, there is a photo of a "fish" decoration that I brought home from my travels in Thailand. As the wind blows, it appears as if the fish must be working very hard to turn the propellers fastened to their fins even though the fish don't make any effort. In the same way, my client must feel that I am working very hard to make things happen, even though some of my ideas just feel natural.