Let me start this off by saying that the computer science faculty at Yale is filled with brilliant professors. Each of them is accomplished in their own right and you can tell how much they know in their respective areas when you talk to them. However, brilliant people do not necessarily make great teachers. Coming out with a Yale CS major means a grounding in C, a lot of theory and little practical knowledge.
I remember going to my first Introduction to Programming (CS112) class my freshman year. After the first couple of classes, I was bored out of my mind in class — though to be fair, I was bored in most of my classes. I tend to be a very practical person — if I don’t see a use for something, I tend to ignore it and focus on what is useful. This isn’t to say I don’t have an open mind and consider the options, but I try to stay pragmatic. The class was focused on using C#. I had learned some C/C++ in high school, and everything seemed like a repeat to me, so I stopped going to class and just did the problem sets and showed up for the midterm and final. Aced that class, but didn’t really learn anything about C# in the process or its practical applications. I loved programming itself, but never the classes because I wasn’t learning anything I felt was useful.
I didn’t fare much better in my next class, Introduction to Computer Science (CS201). The professor was on his way out and the class was incredibly hard — we started with 15 people in the class, and went down to 3 — with people dropping out even around the final — it was bad. We attempted to learn lambda calculus and functional programming via ML, but no one had any idea what they were doing. All I learned was that I hated ML with a passion because I could never make it work the way I wanted to (I was too used to the imperative mindset). And because I wasn’t really taught the practical applications of it, I saw no use for functional programming. It seemed like such a useless undertaking and I had no idea why I was learning lambda calculus (which I didn’t even learn properly until I took Formal Semantics with Paul Hudak in my senior year — 3 years later). Recently, I’ve looked back with regret about my grounding (or lack thereof) in functional programming and really wished I had seen how useful it can be — it’s used a lot more in the real world than I realized or was taught.
Most of what I do now (as a CTO) is self-taught. At the beginning of PaperG, a web start-up, I had to choose between web technologies I wasn’t all that familiar with. At Yale, the only language we used to interact with the web was a little bit of Perl in one class (this has since changed! see http://hackyale.com/). I ended up choosing PHP because Ruby seemed unproven at the time (2007) and Java didn’t seem as good for the web (in retrospect, I was wrong). Plus PHP was used all over the place, such as at Facebook. I went with MySQL because once again, it was proven and in the end went with the popular LAMP stack. I didn’t learn any of this through Yale. The professors did always state that the more theoretical approach is due to their wish to give us a good grounding so that we can learn new concepts faster because of our better understanding of the underlying parts. I don’t disagree with this methodology, I just wish there had been more options after a foundation was set. PHP gets the job done, but I don’t know if it would have been my first choice if I had known more about the web landscape back then.
Almost everything I do now, I learned on my own. This isn’t to say I didn’t learn some important things at Yale. I really learned how to debug programs due to the assignments in a Systems Programming class, as well as the Operating Systems class — but as you can see, I really only learned through the assignments. To be honest, I would have paid more attention in my classes if I had known how they might be useful in the future. For example, I would have really focused and tried to learn languages like ML and Haskell if they hadn’t been presented so academically. I want to know — what can I build with this tools? How can I build faster or more efficiently? This isn’t to say I couldn’t have derived the answers to these questions myself by studying the languages, but I have little motivation to spend time on something I can’t see the value of — so if you just reversed the order and told me why it’s useful and what’s so great about it, then I’d be more interested in learning what makes it this way. There’s just too much information to filter through so I have to be pragmatic about it.
Maybe it’s just my learning style — I need to know the practical before I want to learn the theoretical.
I wish I could go back to those CS classes with the real-world experiences I’ve had since starting a tech company — I would have paid much more attention and learned so much more.