I’ve been thinking about software development a lot recently, as I have for many years, and I keep wondering why our tools are so bad.

Today it struck me that software developers are one of the only groups who even have a chance to change their tools: our tools are created using our primary skill (programming)! Nurses cannot nurse a more effective stethoscope into being. Bakers cannot bake a better pie pan. Authors cannot write a smoother pen. Accountants cannot calculate a different tax code. Programmers can program more effective tools! But we don’t. (At least not very quickly.) Professions whose skills are not directly related to their tools have a pass; we, software developers, do not.

A better world is possible

How many hours have been spent learning vim, emacs, Eclipse, or any of the various other editors people are using? How many hours were spent manipulating an editor to bend the tool to our will? How long has humanity  collectively spent tweaking a class path, fixing an out-of-date reference, or upgrading to the proper version of some package? How much time was wasted wrestling with version control (for example, counteracting bad check-ins or tracking down the author who forgot to include a necessary file)? How many people are dispatched to find a silly build break?

Perhaps all that time would have been better spent creating something that more closely matched our mental models or adjusting tools to the way we think and work. Bret Victor’s talk (Bret Victor - Inventing on Principle) recently made its way around the net and inspired some people, but I don’t think we’ve really internalized the message. Forcing people to play computer (compile large amounts of code in their head) and debug issues outside the scope of their project is passe! I hope we quit wasting human capital and improve software tools! (Soon, I hope to write a few cogent posts about what I think can be done.)

Do you agree that tools could be better? Why are the tools so bad? What tools are the biggest offenders? What’s the most frustrating aspect of developing software that is not directly related to the logic of your task? If you had infinite time and resources, what would you fix or build?