I was an Eiffel fanboy in the early 90s, when the only alternatives were Smalltalk and C++. It was obvious to me that garbage collection was necessary for modular systems, and that Eiffel assertions were the sweet spot in formal specification: lightweight enough to be usable in the real world, but formal enough to let you state and demonstrate useful things about your code.
However I was still always bothered by mutation. Everything was fine as long as you didn't change any data structures, but as soon as you added mutation to the mix everything fell apart. You could state an invariant, but if you shared a reference to an internal structure then you had to trust everything else in the system not to change anything.
Then I discovered functional programming in the shape of Haskell. Its still not perfect, but it's fundamentally better than OO.
I have also learned eiffel and read Meyer's book. The terrible standard library with the deep inheritence trees was my main complaint about this language. All his critics about C++ were very insightful. At that time almost nobody was speaking about immutability (GRAAL was called a language without variable). Java was almost revolutionary with its immutable strings.
However I was still always bothered by mutation. Everything was fine as long as you didn't change any data structures, but as soon as you added mutation to the mix everything fell apart. You could state an invariant, but if you shared a reference to an internal structure then you had to trust everything else in the system not to change anything.
Then I discovered functional programming in the shape of Haskell. Its still not perfect, but it's fundamentally better than OO.