Professional programmers often find that the program they’re working on now has a great deal in common with some program they wrote in the past. It is this feeling that makes the idea of software reuse so attractive.
Somehow reuse has become associated with object-oriented programming. But software does not have to be object-oriented to be reusable—this is obvious when we look at programming languages (that is, compilers), which are the most reusable software of all.
The way to get reusable software is to write programs bottom-up, and programs don’t have to be object-oriented to be written bottom-up. In fact, the functional style seems even better adapted for writing reusable software.
I conclude that there are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies.
The first method is far more difficult.