Software produced conventionally is generally written from the bottom up, although it may be designed from the top down . that is , the lower-level routines are written and on top of these , slightly higher abstractions are produced , and on top of these even more abstract elements are generated .
Normally , code portability decreases as one moves up the levels of abstraction . that is the lower level routines may be used in several different projects , and perhaps even the next level of abstraction may be reused.
Polymorphism in programming languages permits the programmer to generates high-level reusable components that can be tailored to fit different applications by changes in their low-level Parts.