When I started exploring code in freshman year of high school, I would’ve called it coding. Perhaps even programming. But it wasn’t computer science.
What I now major in is computer science — a similar sounding but utterly different thing. It’s a bit like how knitting sounds like a fun pastime on the weekends, but yarn engineering sounds like something you would only do if compensated handsomely.
And true to the name, what’s taught in the classes I’ve taken so far at Tufts is computer science. We start at the fundamentals, memorize the concepts, and write simple programs in a vacuum.
But that’s not how I learned programming. And much more importantly, that’s not why I enjoy programming. I enjoy programming because I can use it to make things that other people can use. Without people on the other side, my code might as well not have been written.
I have a theory that our professors also learned programming in the way that I did. They liked it, so they got good at it, and pursued a career in it. But then they got to teaching a class and thought to themselves, “What kind of foundation do I wish I had when starting out?”. And then they teach this foundation, forgetting that a robust foundation isn’t what got them interested in the first place.
The foundation is dull and difficult, and if you start there, you lose droves of students who thought they’d enjoy computer science but drop the program after the first class (or first week) because they’ve seen the computer science “isn’t for them.”
Let’s do a concrete example. Our first two homework assignments in Data Structures have been to implement a storage mechanism for a list of characters in two different ways: array lists and linked lists (if you don’t know what these mean, that’s completely fine). We’re doing this to understand the efficiency tradeoffs between two different mechanisms of storing data, even though they look the same from the outside.
But to find this interesting requires a lot of imagination. We’re building a tool that someone else could use to store data for a hypothetical use-case — but no one ever will use my code in any concrete way. The only thing that will ever run my code is the auto-grader that runs when I submit it. There’s nothing interesting there. It’s just an assignment.
Perhaps if we tacked a second week onto this assignment, where we built some sort of simple program that used the data structures we created in a way that showcased their effectiveness, it’d be more interesting. But we don’t do that. We struggle with finishing the assignment, turn it in, and the motivation for doing it never really sinks in.
That’s the other thing: these assignments are quite significant. The past two weekly homework assignments have taken me 7-8 hours each, even though I know programming already.
It’s not hard to see how students get discouraged:
- There’s no “aha!” moment early on where they see why what they’re learning is interesting.
- Assignments are a difficult and stressful to pull yourself through. Extremely stressful.
I wish there was something earlier on that would show computer science majors why what they’re doing is interesting. Why programming is an enjoyable thing to do. Why it brings me so much joy to do for my own projects.
So to my friends in these CS classes: hang in there. Let me know if you want to bounce ideas off of someone. But most of all, it gets better. Perhaps not in these classes, but knowing how to code means you can make things for other people; and that’s probably my favorite feeling.