And the things that are wrong with it are:
- unit tests are needed too much. I love unit testing, but in Smalltalk unit tests are needed for things that a strong-typed language would verify compilation-time.
- the language is too tied to its environment. It gives a lot of benefits, but precludes me from using my favorite tools (I am thinking emacs here)
- integrated nature of the language/environment makes shipping software a pain. It's extremely hard to be sure that you picked all the changes in your environment that are needed for running your code, and excluded all changes that are there for other projects or simply for your convenience. The most foolproof way seems to be shipping the entire image, after sanitizing it.
- the environments still have amazing number of bugs, for such mature tools.
- If I really coded more in Smalltalk, I would probably have more complains about the runtime library. As it is, the GUI dev tools are not too kind to custom graphics - standard forms are far better supported. I won't even mention the criptic world of Morph. In any case, if somethiong is missing in the runtime library, it can be easly added by the developer.
The language itself draws no critique from me because there is so little of it. Smalltalk has almost no syntax. I would appreciate standard mechanism for decalring accessors the way Ruby does it. But I can live without, or make it up.