Monday, June 13, 2011

Learning Computer Science

There is no doubt that in today's computer-based, technology-driven, network-connected, information-intensive environments, that computer science is an ever more pertinent discipline. Not just computer programming, not just software development for everyday components, but the underlying fundamentals that generates new research and insights. The challenges information technology presents are only going to get harder as our data grows larger. We need more computer scientists. Instead of seeing a growing trend in the computer science student population, it has fluctuated wildly over the past decade – enrolment jumps, enrolment dips. There is no single factor that explains rising or declining interest in computer science. I'm sure of the reasons are directly related to the the teaching institution, not the discipline itself. I wonder, is a degree the only way to master the most challenging theoretical and applied aspects of computer science?

I don't have a degree. This fact means different things to different people. Not having a top-notch education obviously doesn't help in finding employment. However, I also didn't want to spend half a decade learning without doing. This isn't to say that a degree is a bad thing. To the contrary. I've worked with several people in my life with computer science and math degrees who've changed my understanding of what I do every day. However, I was more motivated to join the workforce sooner rather than later. Accumulating student loan debt wasn't on my to-do list either, so I finished a 2 year program and started working.

Finding a job in information technology isn't easy – there are plenty more reasons not to hire someone than to hire them. The biggest roadblock for finding employment is lack of experience – I had zero at once point. Not only did I know nothing about working in the real world, I had a miniscule diploma while seeking out jobs that require a degree and experience. It felt like I had no chance of getting hired and would have to return to school. This went on for quite a while – over a year. That's a long time to list professional job hunter on your resume.

Things got interesting when I found Enomaly. Not only it seem like an awesome start-up to work for, but they did open-source consulting gigs! The main reason I got hired was because I started and worked on an open source project at the time – a little tool that parsed XMI files and ran activity UML activity diagrams. It wasn't the project that made an impression – it was the idea of taking on an open source project they valued. This got me thinking, and to this day I still think about it, maybe open source software development can serve as an education in computer science.

The same stuff you'd find in a computer science course of any kind, you'll find in an open source software project out there. Its all in the code. This is how you learn how to write your own code by studying someone else's. The lessons learned accumulate as you read more code and write more of your own.

However, if you're young and just getting started, this task isn't so straightforward – you need a starting point. How do I know which open source project to study? Well, maybe it is straightforward after all – find an open source project you enjoy using yourself. Don't read the source code of a image editing program if you can't see yourself using it. Reading code for applications you have no interest in won't help you learn the science behind it all. Instead, its more of a chore. And this is one area where an open source computer science education really shines – the sheer variety of what's out there to learn about.

Once you've found an application you enjoy using and find interesting, you're ready to start reading code. I find the best way to start is not by jumping down to the low-level stuff and working my way up. Instead, I like to find something specific the user can do with the application – import a foreign file format say – and drill down in the code structure using a top-down approach. There is plenty to learn about on the way down.

The best part about learning computer science by studying open source projects is that it often spawns a series of learning projects. If you learn all about Django, maybe you'll want learn about other Python web frameworks and how they tackle similar problems. Maybe you'll investigate further on how sockets work or buy a book on network theory. Maybe you'll start reading the Python source code and learning about programming languages. The possibilities are endless. As you learn the fundamentals, you'll hone in on the specific ideas of what you're really interested in.

Open source software as a learning tool is great because its open. There are no barriers hiding the conceptual bits and pieces for those interested in how they work. So who are your instructors in an open source software education? Your peers are. The same people who took an active interest in the project, spent the necessary time to understand and contribute to it. Contributions come in many forms – code, monetary donations, and knowledge itself. The aspiration of any open source project community is that it will grow, steadily and for the long run. The only way to make this happen is by educating those who are willing to learn about it.

If you're already enrolled in a computer science program, use an open source project as an opportunity to expand what you already know or as a way to devise the right questions. You might find something you wouldn't have otherwise.