But, as with many college relationships, C and I couldn’t last in the real world. At my first job out of school, I found my second love, Smalltalk, which made me realize that my previous relationships were all just preparation for this one. I loved everything about that language: the syntax, the environment, the base class hierarchy. But unfortunately it was an impractical relationship, and so we had to part after only a few years (Smalltalk: it was me, not you). The next several seasons of love were spent toiling in C++, for both the Microsoft and Sun platforms. I had no love for C++, and I am sure she knew it. C++ tried to rekindle our relationship from time to time with STL and MFC, but we both knew it was not right. All the time I was with C++, I couldn’t help but think of Smalltalk (C++: it was you, not me).
I met Java in the mid-1990s while she was still in beta. At first I thought it was love, but over time realized that I would have loved any language after C++. I also couldn’t help but hear echoes of Smalltalk in the syntax and class hierarchy of Java. But over time I learned to appreciate Java’s performance and rigor, and if it was not actually love, it was something close to it. I will confess to two-timing Java in the early/mid 2000s though with C#, which I needed for tighter Windows integration. It was never serious, though, and I didn’t love C#, and have many a .NET knowledge base article with my name on them.
It wasn’t until I met Ruby in 2007 that I thought I might have another chance at a love like the kind I had with Smalltalk. Ruby eliminated the ceremony of Java, and let me focus on what we both wanted: to produce code. But like Smalltalk, Ruby was impractical for where I was at in my career, so we decided to remain friends with benefits while I spent the next several years juggling Java and C#. I should confess: while working for a large Fortune 100 tech company, I briefly found myself treating PowerPoint like a programming language. It was a romantic rock-bottom.
A seven-year itch woke me up to the renaissance occurring in programming languages, driven by cloud computing and distributed / parallel computing. I met Clojure, although we didn’t seriously date; and also met Scala, Node.js and Haskell. By this time I realized that there were many more languages, and maybe I should be playing the field: DART, GO, F#, Fantom, Chapel, X10, and Haxe.
The more I reflect on my past romantic liaisons, however, the more I believe Ruby could be my soulmate: being the one language that I can use for developing web applications (RoR), distributed systems programming (JRuby), infrastructure automation (Chef) and testing. But I’ve loved and lost many languages over the years - do I really believe in soulmates anyway? ;)