Software Engineering is Worth Teaching

7 min read Original article ↗

Computer science programs have this habit of pretending that they’re not teaching future software engineers. They act as if everyone is going to become computer scientists, and no, not those dirty applied types who write databases and study networks, but real computer scientists who don’t write code and are essentially applied mathematicians. It’s like if structural engineering programs didn’t exist, so you could only study physics. And most of the professors were physics professors who couldn’t build a bridge to save their lives. And when you asked if hey, are there going to be any practical courses on building bridges, you’re repeatedly told oh no, we’re studying physics, and building bridges is not physics.

To be clear, I’m not saying we should turn computer science degrees into some vocational pseudo-bootcamp that just teaches the hot framework de jour. That’d be a waste. The benefit, in my mind, of a 4 year degree is that it allows students to invest time into topics that do not provide immediate gratification, that may seem unnecessary or overly abstract, but will help them in the long term. You want to provide students with at least a few courses where they struggle and curse and bemoan their way through, but five, ten years down the line they realize that it made them a materially better software engineer, thinker, human, or whatever role they choose to play in the world. Some such courses may be theoretical computer science. A course on distributed systems or type theory can fulfill this role. But they’re far from the only options that would help make people better software engineers.

One such option that’s particularly on my mind is cybersecurity. We’re seeing an unprecedented wave of LLM-driven cybersecurity attacks. I anticipate that this will only get worse. Hacking has gone from something that was reasonably challenging to scarily easy. As this wave has grown, it’s made me reflect on my own cybersecurity knowledge. To sum it up, it’s quite poor. I can discuss basic concepts like password hashing or phishing, but it’s all a bunch of haphazard, potentially incorrect or out of date tidbits that I’ve learned from random sources and folklore. Worse, I don’t know what I don’t know. It’s very well possible that the code I write every day as a software engineer is leading to insecure, exploitable code.

I don’t believe I’m unique here. I sincerely doubt that most computer scientist graduates have taken a cybersecurity class. It’s also unlikely that your average software engineer will take the time to self-educate about cybersecurity. In other words, this is the exact sort of important, future-looking skill that students could benefit from learning in an undergraduate curriculum.

Ok, maybe that’s a little too applied. Another area often considered is an ethics course. Engineering programs often require one, why not computer science? Code has so much power. It determines the rules of the platforms that drive massive portions of the global economy. It powers life-saving and life-ending machines. It can store the secrets and dreams and hatreds of a billion people. Wouldn’t it make sense to have students think a little about the power they hold? There’s a lot of fascinating case studies one could use, from the Therac-25 to Cambridge Analytica. And other non-computer science cases too, like the Challenger explosion. Of course, just the act of requiring an ethics course is no guarantee of good behavior. Nor do I think there is necessarily a singular “ethic” to teach. But neither is a literature course a guarantee of literacy. It’s still worth attempting.

More than ethics, I think there’s some fascinating opportunities for situating technology in society and history. I’d love for software engineers to understand how the internet has shaped society and vice versa. Does your average software engineer understand that the internet was started as a military project and continued by universities using government grants? Do they understand the libertarian views that shaped the internet and its culture? Do they know about free software and open source movements? I think it’s easy to think that everybody knows about these topics, but really it’s limited to the rare few who read the odd Unix history link on Hacker News and whose eyes don’t immediately glaze over at an old mailing list archive. This may seem too navel-gazing in nature, but hey, college is if nothing else a great exercise in navel-gazing. And I do think it’d be useful! The next time a software engineer needs to pick a license for their project, or decide to open sourcing some code, or write some code that affects what people can write on the internet, they can have this background knowledge.

There’s more possibilities here. Mechanism design is a really neat intersection of how code affects society, whether that’s the stock market, online auctions, digital advertising, etc. You could have a whole class on how things break! Each class students could read a post-mortem and discuss it. The homework could be labs where you go over a simulated failure and fix it. The tests could be group simulations where you need to analyze it, come up with solutions, and write up a case study. A course on journalism and data visualization would be fantastic. You could have students write articles and visualize them. You could analyze how visualization crystalizes or occludes your story.

What about a performance class? There’s so much deep knowledge within optimizing systems. Yes, a lot of it is likely taught in a systems course, but not always with a performance lens. I wouldn’t be surprised if many students come out of college thinking performance is “use a fast language like C++ or Rust and write fancy algorithms”. And really, what does fast even mean? Do you want to be fast in the median but have slow tail latencies? Do you need to be consistently fast? Do you need your software to operate at a human scale timeline or in the relativistic realm of nanoseconds?

I imagine some or a lot of these courses exist. Perhaps the problem is not with CS programs writ large, but just the particularly lacking program I attended. But I anticipate that even in the programs that have these courses, they are often seen as extra, nice-to-haves that are ultimately secondary to the real computer science courses. There’s an element of class hierarchy that influences this belief. These courses are too practical, too tied to actual practice. I’ve heard systems engineering described as “blue collar” and it’s not inaccurate. Systems is the plumbing, the infrastructure of our world. Why study such vulgar subjects like an engineer when instead you could learn complexity theory as befitting a gentleman in a college of arts and sciences? I kid, I kid, but I also don’t.

What I’m really advocating for is that schools start treating software engineering as a legitimate intellectual practice befitting of coursework. I’d like it if schools could make these courses integral parts of a curriculum. If we could start thinking about computer science curricula as giving software engineers the best possible intellectual foundation in yes, CS theory, but also engineering practice, the social and cultural implications of the work, and more, then we could really equip people to be fantastic software engineers who think carefully about their craft.