In the beginning, I knew Basic. Those were good times. The Apple II was a pretty decent machine to learn to program on. It actually didn’t take me long to run into the fundamental limits of basic programming, even as a kid. In particular, it was insanely slow. I wanted to write games like the games that were already on my computer. I had learned graphics programming and everything but basic (QBasic in particular) just couldn’t keep up. There were probably dirty hacks that would make it work, but at the time I realized I needed to switch to a “real” language, and so I bought a C book.
In this phase, I knew many languages, and I liked them all.
I learned C and some of C++ on my own. They made me learn Pascal in high school. And then Java as a freshman in college. I liked all of these languages. They were basically all the same. It was just a matter of trading one syntax for another.
All of the features of each language that made them different were of no interest to me. I didn’t use, need, or want any of those features. I saw no need for them. C++ had templates. Who needs that nonsense? Java came with a ton of libraries. That was alright but it seemed like you were just trading one problem (a lack of features) for another (the need to be married to huge piles of documentation). I was always the kind of guy who preferred working from first principles.
I knew many languages, but my favorite was the one I used the most.
As I got farther into college and began to learn programming languages in depth, I began discovering the holes that these advanced features filled. I learned, like I usually do, from the “problem end”. I knew of the solution but never bothered to really learn it until one day a problem arose and finally the feature became justified. I began diving into various magical features of my favorite language. At the time, this was C++. I was operator overloading. I was using multiple inheritance. I was a big fan of templates. I became quite accustomed to the advanced features of C++ and every other language seemed quite lacking. They all had features I didn’t need, and were missing features I did.
Here, I knew many languages, but my least favorite was the one I used the most.
It takes a long time of using your “favorite language” and all of its features to be able to see the “beauty” in another language and exactly what you are missing. When you are locked into that single language, you don’t see how it could be improved. Eventually, though, I came to realize that other languages had some truly fantastic things to offer. This is when I learned Lisp, Python, and Ruby.
C++ had so many abusive warts. It wasn’t until I saw these problems fixed in other languages that I even knew they could be fixed. I was so sick of ugly templates and insanely verbose code. I was so sick of static typing and bizarre template hacks to get around it. I was so sick of operator overloading creating so much magic it was hard to understand. I was so sick of symbol names being mangled to pieces. I was really sick of error messages that lasted pages and pages.
Slowly, over time, I played around with all of those other “grass is greener” languages. As I began trying more and more languages, I kept finding things I hated in them. Over time, I became better at this. I’ve done this enough to realize things I hate about a language before I’ve really even dove into it. It still stands though that the less I know about it, the less I hate it. C++ is pure frustration. C is so slow (to develop in, not to run in). Ruby and Python have some serious greatness but also some serious annoyances.
I’ve heard really nice things about D. Maybe I’ll play with that.