People say that “hindsight is 20/20.” And to a point, they’re right. When you look back at your past experiences, you see them clearer than you have before. Typically, it’s a bit reactionary; you emphasize the very bad parts and the very good parts. They play a much bigger role in the opinions you form as a result of your life experiences. This isn’t good or bad itself, it’s just part of how you think of the past.
As a computer science student finishing up my fourth year (out of five), I’m coming close to the point where I can look back on my education and try to put it all together. What have I learned from it? Was my money worth it? What would I do differently? How would I fix it if I had the power to change things? Those who have read other posts on my blog may know that computer science education is a topic near and dear to my heart. And though I have presented a few thoughts and opinions already, I feel like my prior writing has danced around, but not completely spelled out, what I’ve learned in reflecting on what’s been good and bad in my computer science education.
Computer science education has two parts: theory and practice. This should be no big surprise to anybody. In fact, it sounds patently obvious when I write it down. But I really think I’m onto something important here, so please indulge me for a bit!
Even though it’s true that most major fields have both theory and practice, computer science is different than most fields in that both are equally accessible. For many fields, you can learn theory online, in books, or in classes. There may be a cost to you, but it’s usually fairly small. But to actually learn and experience the practice of the field, there is a much higher cost. You need equipment, materials, and time. Internships and on-the-job training are great for that, but they’re nowhere near as easy to come by as books and Wikipedia. In computer science, on the other hand, the practical world is just as accessible as the theory. Just like you can look up algorithms, data structures, and automata, you can also download industry-grade programming languages, tools, and libraries – completely free.
If you ask me, nurturing both the theory and the practice of computer science together is the most critical part of computer science education. But frequently one of those two elements is lost in the balance. Take, for example, programming boot camps. An accelerated course in programming can only hope to teach someone enough to get writing code in a particular language and environment. Courses like these can’t afford to go into the theory of computer science. So when they train a web application programmer, they won’t teach that programmer about the algorithms that power their tools, the math that secures their app, or the intricate and fragile networks that connect it to its users. If an education were to stop there (and, to be clear, many people don’t stop there), it would be woefully incomplete.
But that doesn’t automatically make a university education like mine that much better. At my school, Case Western, we get a very theory-laden education. In the way of practical knowledge, we learn surprisingly little beyond how to program Java. Nowhere in our computer science core curriculum will you find version control systems, basic use of Linux, or basic education on how to create a web or mobile application. To be clear, these things aren’t computer science theory, but they sure are important! I would like to see them included in every student’s education, but not at the expense of the many equally important elements of theory we learn in class.
Amazingly, here at Case we’ve found a way to rectify the lack of “practical education” in a way that doesn’t sacrifice the theory and fundamentals offered in our classes: Hacker Society. CWRU’s Hacker Society (or HacSoc for short) is a group composed mainly of EECS students. We meet weekly for technical talks by current students, alumni, or even representatives from companies. Regardless of who presents, the talks are always technical in nature, and they frequently are on topics in the “practical” side of computer science. Sometimes they are presentations about programming projects that students have done. Other times they are about technology that a company uses internally. We’ve even gotten fascinating talks from graduate students about their research.
Perhaps most importantly, at the beginning of the year, we set aside a week or two for fundamental talks that we dub “HacSoc Bootcamp.” In these talks, we give introductions to things like using Linux, the command line, and version control. We even introduce people to programming languages and technologies that we (as organizers and typically more advanced students) enjoy and know well. Later in the fall, we host a tech conference called Link-State where we get speakers from far and wide to give a day’s worth of practical talks. And in the spring, we host a Hackathon for students to throw their practical skills to good use in a fun, competitive way. And throughout the year we try our best to maintain an open forum (actually, a mailing list) to answer questions and connect curious people with the more experienced members of our group.
If these last few paragraphs have read something like a sales pitch for Hacker Society, then you’re probably reading them correctly! I’m not trying to get you to buy anything, but I really think that what we do is really great. HacSoc drastically improves the quality of our education beyond what classes alone do for us, because it adds on the practical side of computer science. So even when I look back and see the bad parts of my education (courses that could have been better, too few professors in the department, etc), I also look back and see the bright spot that is Hacker Society: an amazing community education group. So I think that our model is something worth talking about, and maybe even spreading to other places.