Why aren't abstraction, modularity, hierarchy, and layers enough? First, you must understand what you are doing. It is easy to create abstractions; it is hard to discover the right abstraction. It is hard to change the abstractions later. (ditto for modularity, hierarchy, and layers)