In programming, we often encounter a programmer who has had much success working on problems of a certain size but has never been able to go beyond them. In fact, we sometimes encounter the converse situation—the programmer who was not notably successful until he began to work on bigger systems. In the first case, the techniques that worked so well on small programs just cannot be applied effectively to large ones. In the second, application of powerful and general techniques to simple problems may have resulted in excessive overhead.

