Sometimes when developing a solution I stop my coding for a several minutes visualizing my work as a battle between abstractions and specializations.
The contrast of these opposites is a major characteristic of any program developed ever and the talent, experience and determination of the developer are stamping the final product.
Countless projects have failed miserably due to an imbalance of these constituents.
What is more interesting is the fact that quite of few of these failures had been driven by top level programmers who despite their talent somehow got lost in the process of overgeneralization, as they were trying to solve their particular problem using a very abstract and generic approach. Although such an approach might stand out from a pure theoretical perspective, the overhead of the generalization was such that led to very slow pace of advancement, code that was difficult to be adapted from newcomers to the team and usually resulted to an over engineered platform that was not able to follow the competitor’s evolution pace.