I was called to write this post after reading Jeff Atwood's The Ferengi Programmer and Rob Connery's apt response Patterns, Purists and Sinkholes. Their central argument is about whether the software development process can be codified.
Could there ever be a sufficiently precise set of rules to successfully build software by the book? Possibly.
Would it stifle the art? Certainly.
Are "principles and practices" useful? Yes! They provide scaffolding for reasoned analysis and discussion.
Are they universally good and complete? No. They are changeable embodiments of ideals.
Is it still worth learning and sharing principles and practices written down by others? Absolutely!
A Duty to Teach
What is a "best practice"?
First, let's start with the name. "Best" suggests that in some objective sense, these practices alone were judged to be absolutely superior to all others. Not merely are they good, they are superlative!
Second, the term is often applied to particular mechanisms used to achieve a particular policy. For example, "Thou shalt write application log files using protocol XYZ." There's more to learn about best practice than particular interfaces.
Let's call these things what they are instead: "standard practice".
Standard practice is a compromise by an organization to achieve a mutually agreeable implementation of an ideal principle. It is a tool to promote uniformity and consensus but it is no substitute for education. Standard practice should never be used to enforce unquestioned conformity and to stifle further debate.
Merely stating a standard practice does not free the speaker from the duty to teach!
An Unquestioning Mind Remains Unhired
Every professional software practitioner has a duty to learn. Those who shirk this duty eventually land in the pool of the millions of unemployed programmers who bang at the door of the software industry every day. They boast about their services yet fail time and again to invest their hearts and minds as barter for the money and recognition they feel is their due.
Let me share a secret...
If you say any of the following statements during an interview, I will probably not hire you. I don't care what your level of ability or experience is. These statements tell me you are on the path of eventual stagnation:
- "I don't know anything about X but it's too complicated and I believe everything should be kept as simple as possible."
Translation: I am unwilling to learn on my own and I am unwilling to admit it might help my career.
- "X is obviously better than Y." (I can't explain it but it is.)
Translation: I am unwilling to learn on my own and I cannot tell the difference.
- "In all of the X years of my experience I have never had to do Y." (So you must be wrong about thinking it might be important.)
Translation: I am unwilling to learn on my own and I will drag everyone who disagrees with my dogma into the pit of irrelevance.
- "I did X at all of my other jobs. X is the solution to all of your problems." (It slices, it dices.)
Translation: I am unwilling to learn on my own and I will not let go of my sledgehammer.
- "All of my work conforms to industry best practices X, Y and Z." (But I can't explain them.)
Translation: I am unwilling to learn on my own and I like to impress people with buzzwords.
- "I really want to work here but in two years do you think I can graduate to department X?" (X is so much cooler than Y even though I don't know X or Y very well, like development vs. testing.)
Translation: I am unwilling to learn on my own and I think what you do is beneath my status.
- "I learned everything on my own. It's so easy and obvious. Schools and books are for losers."
Translation: I am unwilling to accept that others might still have things to teach me and I am stunting my own growth.
- "I can learn any X. They're all the same." (Programming languages)
Translation: I am unwilling to accept that others might still have things to teach me and that there there are many ways of doing things; some vastly different from what I know.
I would rather endorse and train a candidate fresh out of school full of passion and vitality than a highly experienced person in denial of a closed mind.
A Broken Heart
A friend of mine recently told me this: "I am not sure whether I want to stay in software development much longer. I always have to learn new things each year and I feel I will never catch up. I think I should go into management or business intelligence since those fields stay the same all of the time and never change."
It broke my heart.
First, that he was planning to embark on a path of stagnation. Second, that he unfairly judged those in other disciplines as being somehow less sophisticated. Third, that he seemed to be making unhealthy decisions by default.
We talked for a long while after that.
Ultimately, I don't mind if he leaves software development (although I will be sad). I just hope he goes where his passion leads him. I will support him either way. Still, for me it was a worthwhile reminder that not everyone values their careers the same way...
Do want you want, but do it with all your heart and mind engaged. Learn and grow and change...