Optimization is generally viewed as the purposeful act of improving something under a set of circumstances. It is also generally viewed as a beneficial and useful process. I take exception to this. Optimization is good only when important choices are final -- and they usually aren't. An optimized system has lost some of its freedom to become something else. Any choice that is optimized for a particular set of conditions will be harder to adapt to other conditions than if it were not as optimized.
Optimization can only take place in one direction at a time (although that may consist of several conditions). If you want a change of direction, you will need to backtrack somewhat and start over. If you want a radically different solution, you may need to backtrack very far, or even start all over again. The further you have progressed in this one direction, the harder and more costly the change will be, because you may need first to backtrack and then to progress equally far in another direction before you get a system that is equally "good". This is why software systems are often discarded instead of attempted improved in a different direction. This is why software systems should be discarded instead of improving them in unintended directions.
Optimization means loss of freedom to navigate the solution space. As such, it should not be performed prematurely, and if at all possible, should be done by machine, such that whatever the human being sees is more intent than implementation. Examples of premature optimization include: explicit typing in programming languages, and explicit layout specification in electronic documents, both in office documents and on the WWW.
Unfortunately, designing any kind of system that is intended to be optimized by machine brings the implementation to a much higher level of abstraction, and few people can handle it unless trained not to think in terms of direct manipulation of the objects of the final product.
|Copyright © 1996, 2009 Erik Naggum — ☑ ISO HTML ☑ CSS ☑ UTF-8|