The object-oriented model makes it easy to build up programs by accretion. What this often means, in practice, is that it provides a structured way to write spaghetti code. This is not necessarily bad, but is not entirety good either. A lot of the code in the real world is spaghetti code, and this is probably not going to change soon. For programs that would have ended up as spaghetti anyway, the object-oriented model is good; they will at least be structured spaghetti. But for programs that might otherwise have avoided this fate, object oriented abstractions could be more dangerous than useful.

— Paul Graham “ANSI Common Lisp”