Computer Science Degrees - What’s Lacking
I’ve been continuing to take classes despite working as a full-time developer. I work in the .Net world, but my heart is more in Python. Still, I wanted exposure to plenty of others and I’m currently in my second class on C++.
What I have noticed in the various courses I have taken at institutions of higher learning is that they don’t teach anything remotely close to the real world. I know this is a common claim and people cry out against the undergraduate program not preparing people for the real world. I get that. But I have always dismissed them.
Being a better, more rounded thinker is more important than job training, is it not? Surely it is. I’m not sure why no one slapped me. I’ve had that discussion a number of times with people. I should have been slapped. Now don’t get me wrong. I value and love my education. I have a degree in Politics from the University of New Hampshire. I am versed in various literature and can hold discussions on a number of topics (at one point I could almost do so in French).
But this is a false dichotomy. It’s as if the premise only allows well-rounded education or job training. That’s ridiculous.
I believe what Computer Science majors need is less Assignment-based instruction and more Project-based instruction. Random assignments that are isolated from each other, meaning accomplishing one has no effect on accomplishing another, don’t provide the type of reinforcement that maximizes the mind we need molded in academia. Completing a larger project with multiple parts is far more useful to the student. These parts interact with one another. One of the best lessons to learn early on is that changing code in one place can have small or large effects on other parts of code.
It’s difficult to learn that in assignments that are 50-150 lines. But if you’re building on top of the product/project you’re working on all semester, you will naturally run in to those types of consequences and suddenly your student will begin to think very differently. I value those that can think holistically about a product rather than the frustratingly common linear thinker that says to the team “Well, I’ll just change this and then it’ll be fixed.” I love it when I hear someone say “Well, if we change that there could be implications to these other parts.”
Admittedly, I think there’s a lot of cruft in undergraduate coursework these days. Taking art history doesn’t make you a better thinker per se. You don’t experience art in an art history class. You learn what you need to say about a particular painting/sculpture/etc. in order to demonstrate knowledge about the piece. We cannot say that a mathematics major is more well-rounded for taking such a course. Well-rounded according to whom? And how pompous to believe that one semester of being told what to think about paintings and what is meant to be conveyed by them makes an individual more well-rounded.
There’s value in education for the sake of education. I don’t argue against that and in fact, as a serial student, I’m quite fond of education for its own sake. However, the prototypical pedagogy associated with the usual assortment of subjects and course material falls short when it comes to Computer Science. Programming is a craft. It takes years to master. There are many other disciplines where this is similar, so why not change the teaching style?
Students experience a couple of introductory courses and then are expected to understand high level concepts. In my opinion, going through academia has the primary purpose of learning how to think which implicitly means application. Anyone who argues against that should be beaten with a stick. Socrates explored the meta, but he focused his knowledge on teaching and applying - even if the application was theoretical (see The Republic). If our goal is to teach people how to think, let’s make use of the discipline. Sorting arrays is great. It’s very helpful to understand a binary versus bubble sort and why one is faster or better in certain scenarios.
But we’re a community of people that build things. We command the electron to do our bidding. We engage in digital alchemy. We are the citizens of an industry governed by Moore’s law and yet we tacitly accept that there’s not a better way to gain an education in our medium?
I reject that.
Let’s build better coursework by building projects with students. When a student ends a semester with a (probably) working application that has been built in stages with a decent feature list there is a sense of accomplishment and a demonstrable grasp of the concepts this project instilled.