As always, I enjoy reading what someone thinks of Smalltalk after a proper demonstration. I find Edwards thoughts on Smalltalk typical of that aha you get when you really see what Smalltalk'ers can do.

Edward was lucky, he had a Smalltalker handy to show him the ropes, few have that opportunity. I'm still amazed by how many people think they can grok Smalltalk by seeing syntax examples. Smalltalk isn't its syntax, it's its environment. Smalltalk is a living world of running objects, there are no files, no applications, just what's running. To understand Smalltalk, you have to either actually use it for a while, or have a seasoned Smalltalker demonstrate it to you. Reading sample code just won't cut it.

For better or for worse, Smalltalk is a world unto itself. It's much more an operating system than a programming language. When Steve Jobs stole the idea for a windowing system and mouse from Xerox (not that they invented it), it was Smalltalk he was seeing. Even he readily admits he was so dazzled by the GUI he didn't even notice Smalltalk, or the fact it was all networked with email, things we take for granted now but didn't exist widely back then.

Sure, we package code and use source control, but our methods aren't file based. Our source control systems are language aware, they can diff and merge code at the method level, auto merge and allow you to select, method by method, which version you want to keep. Smalltalk is different, top to bottom, it's just different. Everything is live, code changes are live, applications don't start, they're simply always running. Object oriented programming means something entirely different to a Smalltalker than to someone doing OO in another language.

Ruby comes very close to Smalltalk. It's a nice introduction to many if not most of Smalltalk's ideas. It's very pragmatic, fits in with the world around it, it's based on files, works with your favorite text editor, etc. etc. But Ruby still isn't Smalltalk. I use Ruby, I like Ruby, but Smalltalk is more productive when I'm working in unknown territory. Smalltalk is better for prototyping ideas quickly. A read eval print loop and hyper-linked documentation just doesn't compare to a real Smalltalk workspace and a real Smalltalk browser where the code itself is hyper-linked and navigable and objects are things you can actually pick up and shake.

Smalltalk doesn't have to be pragmatic, because it's better than its imitators and the things that make it different are also the things that give it an advantage. Its syntax isn't weird, C's is. Weird isn't even the right word, because what's weird is totally relative and very dependent on your background experience. Smalltalk's syntax is simply better.

Window window = new Window(0, 0, 800, 600);

Simply isn't as expressive as...

window := Window top: 0 left: 0 width: 800 height: 600.

And this is a trivial example, the more complicated the code gets, the more of an advantage Smalltalk has. Ruby chose to go with a C'ish syntax, but by convention, mostly tries to fake the Smalltalk style anyway because it's simply better.

window = Window.new :top => 0, :left => 0, :width => 800, :height => 600

So, if you still haven't tried Smalltalk, and I mean really tried it, by writing an application in it, give it a go. You'll never regret it, because everything you learn, and you'll learn a lot, you'll be able to bring back with you to whatever language you call home. Smalltalk will change the way you think, no matter what language you're coming from. Whether it changes it for better or for worse is of course entirely up to you. If you're afraid to try Smalltalk, then at least try Smalltalk Lite... uh, I mean, Ruby, you'll enjoy it and still be able to use your existing tools. You can work your way up to the real thing.

PS: Lisp and Haskell are two other equally mind bending languages that I think everyone should learn, however, neither of them can touch Smalltalk's development environment. That being said, learn them anyway.