Saturday, December 29, 2007

Is the Waterfall Method Just a Way to Procrastinate?

This weekend, I finished reading the very good book The Now Habit: A Strategic Program for Overcoming Procrastination and Enjoying Guilt-Free Play, written by Neil Fiore. I really wish I had read this book before reading Getting Things Done: The Art of Stress-Free Productivity. The information in each book reinforces the other, but I think the information in The Now Habit would have provided a solid foundation to better understand the reasoning behind the strategies presented in GTD.

While reading The Now Habit, it was interesting to reflect on the information in the book as it related to the philosophies behind different software development methodologies, specifically Waterfall-like methods versus Agile-like methods. There were two main points of the book that stood out to me as related to software development.

Perfectionism
Fiore suggests that creative work requires workers to eliminate desires for perfection and allow themselves the opportunity to make mistakes. Perfectionism blocks workers from starting, making them afraid the initial steps they may be prepared to take aren't part of the "perfect" solution. Now compare the two different methodologies:
  • Waterfall Method: Requirements and design must be "perfect" before starting any development work. Mistakes in earlier phases must be avoided, otherwise their cost explodes in later cycles.
  • Agile Method: Development is undertaken with the understanding that initial ideas and design will need correction. Test-driven development provides a safety-net so mistakes cost less and can be corrected without fear of breaking other parts of the system. Working code is given preference to perfect code.
Frequent Rewards
Another suggestion Fiore makes is to plan work in short time intervals, giving yourself frequent rewards after completing discrete tasks needed to complete the project. Rewards that exist too far out into the future will only encourage a person to engage in activities that provide a more immediate reward (e.g. watching television). Comparing the methodologies once again:
  • Waterfall Method: At best, the development cycle is broken up into short iterations allowing for frequent feedback during that cycle. However, such feedback rewards will only occur after the Requirements/Design phases. Any rewarding feedback from customers on the working product can only occur when requirements changes are much more costly.
  • Agile Method: Short, frequent iterations reward the team with visible signs of progression. A short development iteration will have a proposed completion date near enough in the future to provide motivation to make the shorter deadline. The completion of each iteration builds momentum to move on and complete the next.

Monday, December 10, 2007

Should You Get A Master's Degree?

I'm currently a couple of semesters away from (hopefully) earning a Master's degree in Software Engineering. It has been a long process, one that I'm anxious to see come to an end. Working full time, while taking one class per semester, drags the process out much too long.

If I could travel back in time, I'd tell my younger self two things:
  1. Google's stock won't be overpriced at $100 when they have their IPO.
  2. Don't waste your time getting a Master's degree.
Waste is probably too strong of a word as I don't feel the entire process has had no benefit. I was able to take two programming classes I didn't take as an undergraduate (databases, compilers), and I've learned quite a bit working on my thesis project (more on that later). Having a Master's degree may provide me the opportunity to teach later in my career, something I always thought I might enjoy.

But overall, I feel that my time spent on course/project work could have been spent on things that would have improved my personal brand much better. Looking back, I could have built a website using Ruby on Rails, contributed to an open-source project or spent more time improving my writing skills by blogging regularly (at this current moment, writing a blog post is a way to procrastinate on my project). All of these activities would make me much more attractive to a potential employer than would having a Master's degree listed on a resume.

My thesis project is an attempt to build an automated refactoring tool for C++ programs. I knew going into the project that writing such a program was a fool's errand. But it seemed interesting at the time and I knew the project would be approved. Although I have quite a bit of work left, assuming I get as much functionality completed as I think I can, I'll be pretty pleased with the end result. It will be more of a prototype than a complete program. But one only has to do a Google search on parsing C++ to see why I think a prototype would be a pretty nice accomplishment.

So to answer my question, no, you probably shouldn't get a Master's degree. Instead spend your time learning/building something you find interesting, something that could impress a future employer or turn into your own business.

If you ignore my advice and still want to get a Master's degree, I would then offer you this advice. Get your degree immediately after you finish your undergraduate degree. Don't start after you are in the work force and have to take more than two years to finish. Also, wait until after you earn your degree to get married and have kids. :)