Computer Science is one of those fields that’s highly popular and as a result receives a lot of criticism. Make no mistake, as someone in the field, I’m probably one of its biggest critics. As a result, I want to spend some time today thinking about ways we could improve CS education through the inclusion of some new courses. Enjoy!
Table of Contents
One of the most common lines of discourse in the tech community is the value of a computer science degree. There is a camp of people that got jobs in the tech field without a degree and therefore think the degree is valueless. Meanwhile, there is a camp of people who got degrees in computer science and use that fact as a form of elitism over the degreeless. These two camps regularly battle it out on social media:
Now to be fair, I don’t think any of these folks mean harm when they pick a side. For instance, I think a lot of the folks posting about self-taught developers are trying to give them the confidence to look for jobs. However, it can come off as “X is better than Y” which serves to perpetuate the usual gatekeeping we see in the tech field.
Regardless, there is also a camp of folks who don’t care one way or the other. I tend to think this is the “silent majority,” but that’s hard to prove given how often this discourse resurfaces. Fortunately, there are folks pushing for this form of unity in the community:
With that said, I’m writing this article today to acknowledge the limitations of a CS degree. As someone who is working toward their PhD with the hopes of teaching CS, I obviously believe in the institution, but there are definitely ways to improve.
At the same time, I’m writing this article as a way of brainstorming various courses that I’d be interested in teaching. These will eventually be courses that I can develop and advocate for on a college campus somewhere. How exciting is that?
Standard Computer Science Curriculum
Before we can talk about what courses should be taught in Computer Science, we should talk about what is already being taught. Currently, I am at The Ohio State University where the CS curriculum looks like this:
- General Engineering Requirements: 5 courses
- Computer Science Core: 8 courses
- Non-Computer Science Core: 5 courses
- Computer Science Core Choices: 5 courses
- Math Electives: 2 courses
- Technical Electives: 5+ courses
- General Education: 8 courses
Now, when I look over a list like this, my first thought is “wow, that’s an incredible amount of breadth.” CS students are required to take courses in Math, Computer Science, Computer Engineering, Physics, Engineering, Statistics, Social Sciences, History, Arts, Writing, and Ethics.
I don’t think there is anything wrong, necessarily, with a list of courses this broad. That said, if I look back to my own undergrad, there are a lot of courses on this list that students will likely never use again. For example, I love physics, and during my undergrad, I had to take four physics classes (i.e., Kinematics, Electricity and Magnetism, Statics, and Thermodynamics). Do you think I use an ounce of that knowledge today? Of course not. I imagine students taking this curriculum feel the same way.
Similarly, I think about some of the professional writing courses I had to take. Personally, I think writing is incredibly important. However, by outsourcing these course to English departments, students miss out on some of the nuance of writing in our discipline. As a result, these skills will have to be picked up on the job.
In the same breath, I am also a huge fan of including general education courses. CS students should have to learn ethics, psychology, and sociology during their degrees. Otherwise, they risk losing the human element of their jobs which leaves us with more potential Musks and Zuckerbergs in the world.
At this point, we haven’t even gotten to my main problem with CS curriculum: it’s generally very outdated. For example, most computer science programs are taught from a math lens. As a result, there is a lot of time spent of proving this or that rather than creating something of value. Certainly, I think learning Big O is important because it teaches you to write more efficient code, but have I considered Big O in my day-to-day? Not really.
Likewise, there are a lot of concepts, tools, and languages being taught that are growing old. For instance, I think about all the CS programs that start with C because students “need to know how memory works.” Hell, some programs still teach Lisp. By introducing this much complexity this early on, I feel like we lose a lot of potential students. Surely, we could teach Python or something similar with the same effect, right?
Overall, I suppose my main gripe with CS curriculum is that it seems to be catering to a specific type of student: the prospective academic. The vast majority of students are there to learn how to code, make cool stuff, and change the world. By reducing everything to theory, you strip a lot of the humanity of software development. I think it would be fundamentally better if programs were organized around specialties with courses taught around modern ideas. Let’s talk about that.
When I first got into education, my mind was very much set on teaching introductory programming. In short, my reason for doing this has nothing to do with in interest in teaching programming. Rather, I believe that this is the best opportunity to instill a positive view of CS in students. If I can be on the frontlines convincing students that they’ve chosen the right field and community, then I’ll feel like I’m making a positive change.
That said, as I’ve had more time to think about courses I’d like to teach, I’ve realized that it’s possible to teach courses that are outside the standard curriculum. This allows me to think about topics that aren’t traditionally taught in CS. Here’s what I came up with.
In general, I think writing classes are pushed off to English departments. As a result, students learn how to write well, but they don’t get a chance to apply those skills in their discipline. Instead, why don’t we teach technical writing in-house? I’m even open to co-teaching with a writing consultant, if that helps sell the course.
My main idea of a course like this is to cover various forms of “technical” writing CS. For example, I think a lot of CS courses teach proper documentation but don’t really emphasize it. This course would heavily cover documentation tools and styles.
Likewise, I’d love to share how to put together a blog, whether for professional development or as an extension of documentation. I write literally all the time, so I might be able to get other folks into it as well. Hell, I’d just be interested in teaching students about places where they can publish their work like Dev.to.
Again, like technical writing, open-source software is one of those topics that is taught in passing. Yet, when you get out into the real world, you’ll find that much of your life is spent looking through and creating open-source software.
As a result, a course like this would be critical for teaching skills like version control, continuous integration and deployment, as well as documentation. Perhaps, these skills could even be combined with the technical writing course to create a real-world software course.
Other skills could include dependency management, licensing, and community building. I don’t think I’ve ever been formally taught any of these skills, so it would be a welcome addition to any CS curriculum.
Introduction to Python
While many CS programs have started to include Python in their curriculum, I have to imagine that they teach the language from a traditional perspective. I’d like to teach a programming course where the focus is on real-world application. For example, I’m writing a series now on learning Python through Discord bots. Surely, this is more valuable to students than creating random programs based on mathematical theories.
With a course like this, I’d be willing to take the curriculum as far as to treat the course like a capstone but in the first year. In other words, students could brainstorm their own real-world applications, and I could facilitate the formal education to get them there.
At the end of the day, I’m mostly interesting in making sure students feel like they belong in the space. The learning is secondary to that.
Reflecting on Education
One thing I love more than anything at the moment is envisioning a better world. For me, that means spending time trying to improve my classes each day. In the future, I hope have get a bit more control over what I’m doing, and maybe I’ll be able to create one of these courses.
In the meantime, thanks for hanging around. I appreciate you taking a moment to read some of my ramblings. If you’d like to keep reading, here are some related articles:
- Stuck in Your Coding Journey? Try Leveraging Bloom’s Taxonomy
- Post-Positivist Thinking Is Holding Tech Education Back
- Lessons Learned From Two Years of College Teaching
Otherwise, thanks for hanging out! I appreciate it.
Recently, I was giving a lecture about Java's "common" methods (i.e., all of the methods of Object), and I had epiphany about how Java only has toString() while Python has str() and repr(). So, it...
Magic numbers are numerical constants that have no clear meaning in the code and therefore make code harder to read. Anything that makes code harder to read is something we can use to obfuscate our...