One output of experience is an ever-increasing list of things that caused you pain in the past. Because you are not a monster, you want to save other people pain. When you see them doing things that caused you pain, you warn them.
These warnings can come in several forms - don’t use this specific library, stay away from this tool, this programming language is slow, this pattern is for architecture astronauts, the entire paradigm of [current popular thing] is fundamentally flawed.
The final step in this evolution is the cynicism crustacean ensconced within a shell made of the disasters you have seen. Sometimes this feels strangely powerful. It can be fun to be the wise elder telling legends of the great monster you barely escaped in your younger days.
It also means that your experience is validated - if you hated a thing and it sucks you were RIGHT to hate it. If you hated a thing and the problem was you, you face the cold reality that maybe you did something wrong. Most of us cannot bear to gaze into the abyss that yawns behind that thought, so we trust our experience, we dogmaticize it, we turn our pain and the bleached bones of dead projects to best practices, and we ossify.
New ideas or new technologies remind you of old pain and bounce off the carapace of built-up wisdom. Eventually you are so encumbered by experience that you become brittle and immobilized and changes in technology or culture or management crumble you to dust.
If you don’t share experience with others, your effectiveness will never scale beyond your own efforts. If you impart your battle scars on others without considering the circumstances in which they were inflicted, people who believe you will miss out on awesome things. The challenge of the experienced developer is to pass on wisdom without passing on dogma, but most developers think their personal experience should be enshrined as a best practice.
What a downer. Time for a puppy break.
Experience and Progress
I’m not arguing against the existence or validity of experience. Without experience there is no progress, and software development becomes a pop culture. Software development has demonstrably progressed. “On the Criteria To Be Used in Decomposing Systems into Modules” is a seminal paper on modularity written in 1971. It describes a simple program based around sorting strings.
This is a small system. Except under extreme circumstances (huge data base, no supporting software), such a system could be produced by a good programmer within a week or two.
Thanks to the accumulated experience and effort of hardware designers, language designers, and library creators, a competent programmer could build it in a few hours today. Progress due to experience is real!
If experience can be harmful, but also enables progress, what is the right way to share your experience with others? How do you gain experience without turning in to a curmudgeon?
Context and Scope
Experience is helpful without becoming dogmatic when it is accompanied by the context it was learned in and is not overly generalized. Now I will make up a ridiculous example to illustrate this.
Imagine yourself as a wise elder, bitten once before by a project that used the Ook! programming language. The project was to build a social network specifically for people who hate social networks. You used the web framework Ook! on Oreos, but even then it turns out a language built around manually moving pointers around an array using grunts made it hard to build a modern web application. The project failed, and you learned.
Next time Ook! is floated as a possible technical solution you have a few options. You can decry Ook! as broken technology that only a monkey would use. You can generalize that to say all esoteric languages, like B***k, Piet, and Shakespeare are awful and no one should ever use them.
Alternatively, you could scope your argument to the problem at hand.
“I used Oook! on a past project that failed. The project was to build a web app, and Ook! is focused on low-level programming and simians, so it wasn’t a great fit for that problem. Also, a social network for people who hate social networks was probably not the best idea. On this project, since we are trying to communicate with alien robot orangutans, it might still be a good fit.”
The difference between saying “I used X and it sucked” and “I used X for Y and it didn’t work out because of Z” is the difference between becoming experienced and simply growing cynical.
Be experienced, not cynical.