Computer Science Education and Gamification

I left my alma mater with degrees in computer science, software engineering, digital forensics, and mathematics. Well, the last one was a minor degree—but I enjoyed it nevertheless. I think I would have been happy to stay in academia perpetually and my hope is that one day I’ll return for my M.S. and Ph.D. In fact, I would have stayed in school longer—I really wanted to get a criminal justice and philosophy degree, but my partner at the time all but whacked me over the head when I suggested it. So, take my criticisms here with a grain of salt, and know full well that I’m certainly a hypocrite as it pertains to higher education. Today, I’m going to talk a little about the current system as it stands—or at least, what I personally experienced and what I’ve seen come out of other universities—and I’ll also talk about what worked well when teaching others some of the intracacies of computer science and software engineering. My hope is that there are educators out there that may foolishly stumble across this page and perhaps take some inspiration from it.

The Current State

When I went to school, I found that most of my mathematics professors were quite young, in contrast with my computer science professors who were counting the days down to retirement. One professor had been there so long that he still had a chip on his shoulder from when the math department for which he was hired insisted that he teach “those new-fangled computing devices”—and he maintained that grudge up until dementia won over his tenure. Computer science evolves at a staggering rate and the department was truly not prepared at the time to take on the addition of software engineering to the mix.

“Computer science and software engineering?” you say, “don’t you feel that you’re being slightly pedantic?” Well, sure, to the untrained eye they both involve the creation and manipulation of entirely fabricated environments. But comparing the two is like comparing biology to biochemistry. You can absolutely use elements of each to inform decisions made in the other, but fundamentally they’re different disciplines. Computer science is an incredibly broad discipline but frankly I would consider it to be fairly low-level (in terms of abstraction), and it involves a large number of only vaguely-related topics, from information security to computer organization, from language design to algorithmic complexity. Software engineering, in turn, reaps the technologies from the wider discipline of computer science to implement something useful for the end user—and this includes, as most software engineers will tell you (or ought to tell you, if they’re any good), documentation and collaboration with stakeholders. Software engineering in and of itself is, in my opinion, a trade for which an individual can be trained and in which human interaction is involved, whereas computer science is an academic discipline for which theoretical (if not formal) academia is required in order to have any hope at advancing the profession.

To put it another way: I would happily hire anyone fresh out of high school if they were a decent computer programmer, and train them to perhaps get rid of any bad habits that may have been picked up through self-teaching, if I needed a decent software engineer. But if I’m running a research institution inventing bleeding-edge technologies in quantum information science, I’m going to want someone who has some formal education in linear algebra and its prerequisites at the very least—and that’s not something that is feasible to train on the go. You’ll see this in other areas of computer science as well—many information security careers, for example, require the candidate to be certified to show that some targeted formal education was had and the user is qualified before having on-the-job training.

Part of this is due to the nature of the computer sciences in how self-education is required, without regard to whether or not formal training is required. It is my opinion that most professionals that go into a computer science or software engineering role without simply loving the profession (i.e. they earned the degree for the money but never did anything on their own time because they don’t have a passion for the subject) inevitably end up in the situation where they’re hating their life for the duration of their career, until such time that they land themselves in a management or quasi-management role. And I find that to be truly sad.

So ultimately, in my view, the necessity for formal training and for a degree is that breadth and depth of information that must be instilled outside of that which would be expected to be self-taught, at least within the scope of the computer sciences. And to some degree, this is one thing that institutions for higher education mess up frequently, at least as far as software engineering is concerned. See, the highly theoretical computer science degree generally is taught much like a mathematics degree, and this is fine. You go through school and you learn how to calculate complexity, how to classify programs in terms of set theory, or whether a program is going to halt (hint: maybe!); you might learn translator design, or various computer architectures, or even learn how to smash some stacks. But the more applicable software engineering degree is usually less helpful—institutions continually provide students with clean data where the real world overwhelmingly deals with dirty data, tools are often outdated (when I was going through classes focusing on Java, Apache Ant was used over Maven or Gradle, and SVN and CVS were used over git), and even Agile concepts were taught in terms of waterfall workflows (and you can tell that this is the case if your professors treat sprints like iterative waterfalls).

So we get a little more philosophical in terms of the purpose of education. Is it to become more worldly, more knowledgable? Or is it to prepare you for the workforce? I’ll save my opinions on that for the moment, but in either case the software engineering discipline is not given the respect it deserves—in the former case, the use outdated technologies do not properly teach students the most useful tools of the trade, and in the latter case, students get tossed into the workforce with very little knowledge of how the industry works.

I would argue once more that this is because computer programming and software engineering is, in itself, a trade and entirely distinct from computer science at large. Internships will always be more valuable to the working software engineer than the current state of software engineering programs.

Gamification

A larger problem in education is the gamification of the system. Ultimately, class grades yield a sort of game that one can choose to abuse. A majority of students that go through the university system do so for the purposes of earning the paper—and not necessarily for the purposes of pursing new knowledge. And this is a distressing feature of our current economic framework. Often this sort of behavior bites both the student and their future employer(s) in the butt, as students are hired after waving around the paper that supposedly indicates that they’re adept in and qualified for the field, only for their employers to find out that they mostly abused GPTs or their fellow peers to generate the deliverables necessary for the passing grade.

One way that students can be convinced, in some cases, to choose one form of gamification over another would be to provide those opportunities in class. And by this, I mean quite literally using games as media through which learning can take place. I once ran a local Special Interest Group of our ACM student chapter that focused on Java development, where I taught my peers of the intracacies of the JRE and dependency management through the development of Minecraft plugins, of all things. My peers learned more in that environment than they did in their Programming classes that went through a rigorous curriculum, and after they had built their own Minecraft server, they had a sense of ownership that inspired them to care more about their work instead of simply turning something in for a grade. (I will note that there is of course some bias in this observation, as the set of folks who attended these SIG meetups was decidedly smaller than the set of enrolled CS students, and it therefore likely represented folks who were already interested in the discipline outside of class… and yet this seems to support my earlier notion that a passion for the subject is significant and necessary.)

And outside of class, there are literal games that incorporate a programmatic element into their gameplays directly. There are a few on-the-nose examples that I enjoyed, namely TIS-100 which provides a fantastic introduction into assembly development (and race conditions) and more recently, Quantum Odessy, which seems to be a fairly decent introduction into developing programs for quantum computers in a visually unique manner. Another that I’ve heard a lot of good things about but have yet to try is Bitburner.

And then crucially, there are tons of capture the flag platforms out there that are inherently gamified. One of the most intuitive platforms that I’ve come across is pwn.college, provided by Arizona State University, although there are countless other CTF platforms out there.

Pedantry

I want to touch just once more on this computer science vs. software engineering denotation, and provide an example to better illustrate my vibe as it pertains to the matter. Let’s say that someone comes to me and says “oh hey, I want to maybe get into software engineering, what should I learn?”

And then we go get coffee at a favorite coffee shop. We chat for a few hours, we talk about the individual’s passions, what they want to do for work. I ask, “so, were you thinking of designing web applications? Or maybe learning how develop OS programs? Develop games?” You tell me about your passion for data science (you’re really into solving the gerrymandering problem) and I say “oh yeah, what a coincidence! I’ve done some reasearch into gerrymandering for university” and we talk about the inadequacies of the Polsby-Popper test and the frustrating nature of introducing new algorithms to the court systems. You talk about how much you enjoy directed graphs and have a sudden interest for MCMC methods and I go “oh wow, stats isn’t my favorite thing in the world but I’m glad someone likes it” and you laugh and I laugh, and then we talk about MGGG and the works of Dr. Moon Duchin. And then we sit back and think a while because our spoons are depleting quickly and finally I go “hey, it sounds like learning Python might be helpful, and maybe getting involved in the GerryChain project as a way to get your feet wet.”

Lovely. Now contrast that with this:

You: “Oh hey, I want to get into computer science, what should I learn?”

Me: “Br**nfuck.”

lordinateur.xyz