Recently I’ve had to deal with problems that appear ridiculously easy to me. Stuff that appears incredibly obvious.
I’ve been trying to understand why these problems came to be. Who planted and watered them until they became full grown monsters that “can’t be fixed”?
Most of these appear to be the result of either lack of experience, or lack of imagination (talent?). And I’m a bit depressed because I’m not sure how to “teach” ways for people to suddenly acquire more experience or imagination / talent.
These kind of problems tend to fall into 3 categories:
The reusable problems generally appear to be in the art / experience / imagination category. Most problems are due to the wrong amount of desired reusability. Either something is “too” specific or super-generic — and in the end, not a good fit and not reusable. We had a problem the other day with how and where to store a configuration parameter for our application — a simple cut-off date. And for a full day with an email chain over 20 messages long, we debated on how and where to store this one value. During this whole chain, no one stepped back and thought about a way to logically do this if we ever needed to do it again. And when someone finally proposed a reasonably generic solution, it was immediately attacked for not being generic enough. I need to come up with interview questions that identify people who can handle this kind of problem.
The scalability problems seem to be in the experience / talent category — maybe a little imagination to see that your system / application may become wildly popular. Sometime’s it’s just ignored — the developers think performance is an ops problem, and the ops people think it’s an engineering problem. Obviously it’s both, but when each group just wants the other one to make it go away, nothing gets done. Scalability and capacity management aren’t hard — they just take rational people accepting portions of the responsibility.
Test-ability is my made-up word of the day. It refers to building an application, process or structure that can be confidently exercised outside of the production environment. Believe it or not, this also includes ops people as they may need to support / manage the testing environment. The ability to specify scale models of production (data, platform, scope) is important, but few developers give it any thought.
I wish I could build an “experience” simulator — something video-game like that could teach newbies in an engaging manner…