November 05, 2013
This past weekend at the Chippewa Valley Code Camp in Eau Claire, Wisconsin, I heard this question three different times in different variations from attendees:
“Will this [tool] solve all my problems?”
I don’t know why this surprised me so much to hear this multiple times, but it did. I probably once asked the same question. Multiple times.
But since then, I’ve learned that in software there is never just one answer. Software is hard. There are many solutions to every problem and every problem is different.
This all reminded me of a paper I read a few years ago by Fred Brooks: No Silver Bullet – Essence and Accident in Software Engineering. And a more recent retrospective on the subject.
In this paper, Brooks compares the accidental complexities to the essential complexities in software. The accidental complexities are those that are not essential to the problem being solved, so languages, tools, and techniques. If you ever hear me rant about developers chasing after shiny objects or “cool things”, these fall into this category. Essential complexities are those related directly to the problem being solved, such as requirements, design, and testing. This is the complexity that comes with solving the problem – making sure you are building the right thing and making sure you are building that thing right. Brooks postulates that even if you could eliminate the accidental complexities of software, you will not see an order of magnitude of improvement. And if there were a silver bullet, it would have to address the essential complexities.
As I continue to repeat:
This field and the problems we are trying to solve are constantly changing and our solutions must change as well. It is easy to be seduced by “the next best thing” because new tools, techniques, and languages are coming about every day. We can use these “next best things” as motivation to keep our development chops up to par, to keep us from getting bored, to keep us interested in our craft. And it may just be that one of these will solve a specific problem we are working on.
But having a silver bullet, or just one solution to my every problem would also be entirely boring.I suggest we use this to our advantage. Let it drive us to learn more about our craft, how to solve with real world problems with software, and how to discover what problems we should actually be solving with software. Let it motivate us to learn to be better developers. I want to know about more than just one tool, technique or language, not only because it expands my mind, but it helps me make better decisions if I know about how each one is used. But I also want to know more about the problem I need to solve and discovering that is difficult because again, there are many variables involved.
So, no. This [tool] will not solve all your problems. Making software really is hard. No one solution will solve all our problems because every problem is different.
There is no silver bullet.
Image courtesy of jinglyjon @ Flickr