"A journey of a thousand miles begins with a single step." - Loazi
Overengineering is a difficult problem to diagnose and remedy. Good software engineers always have an eye on the horizon looking for potential issues and opportunities Particularly sharped eyed ones can see gargantuan issues lurking around every corner. This is good, it makes you cautious. This is also bad, it leads enthusiastic engineers to force a system into a radical direction that, while well intentioned, can harm the future of the system. It is preferable to address issues as they become apparent (even preemptively), rather than anticipate problems that may never exist.
"Premature Optimization is the root of all evil." - Donald Knuth
Optimization sounds like an awesome thing. Faster runtime, lower memory usage, and higher throughput are great things practically and metaphysically. But what is optimization? Optimization usually means adjusting how a system works so that a specific case works extremely well. This also means that other cases will may run so well. This is a problem for systems who have not matured into their final state. Assuming that it will NEED this, or this or that WILL be the case, before the system
has actually been used or even prototyped is misguided. It's have an eye on performance, but it shouldn't be a burden on the team, and needs to be judiciously pursued.
"Est natura hominum novitatis avida." Human nature is fond of novelty. - Pliny the Elder
It always seems like there are better tools out there. Every time some new framework, platform, or language comes out, I immediately have to try it. I fall in love with different characteristics that my current stack doesn't have. You really explore this new flame, learning these new things about it and your self. Things are pretty awesome. Then a couple of problems pop up, and you discover new ultra annoying things about this suddenly not so shiny thing. And you realize that you've been sitting around talking about high school and music for two months, and you just ruined a mature, rich, nuanced relationship for this vapid bullshit .... uhhhhh, I mean relearn how to asynchronously post a JSON object to a REST service.
As a manager these issues are magnified. Since not only do you have to deal with these issues, so does the rest of the team. Observing treads, and keeping an experimenting with new techniques should always be encouraged, but the object always needs to be the goal not an abstract notion of better.
"Make adjustments, not changes." - Day9
The problems of overengineering, premature optimization, and an affinity for novel tools are linked. They arise from legitimate concerns about real problems that a system (software and team) could/will run into in the future. Each of these mistakes can cost time, frustration, and doom a project. The real challenge isn't how to the perfect system from the beginning. But rather, how to make sure that the system begins and remains flexible.
No comments:
Post a Comment