On the way to OOPSLA 2003, I found myself reflecting on how the design of any system beyond a certain size is inherently about making compromises. Perfection in any design effort involving trade-offs along a multitude of design dimensions, many of which are impossible to quantify, and some of which are intrinsically subjective, becomes not only impossible to achieve, but nearly meaningless, or at least profoundly impractical, to even contemplate. Any good design is an orgy of compromises.
Much of my thinking along these lines was shaped by reading Henry Petroski's work. There are other tentacles that reach all over the place. I'll try to find some.
My thought, though was this: If compromise is going to be an essential part of any practicing programmer's work, why are we so fixated on inculcating a passion for perfection in students, and so bad at teaching them to be good compromisers?
To be sure, there are realms where quality is measurable, and perfection can be pursued. Algorithm optimization and code succinctness come to mind. These skills can be taught, and better still, evaluated. This may be one reason we teach them first. Are we good at tempering the pursuit of these qualities with the judgement to effectively trade them off? Or can only experience teach this?