Computer Science Transitional Syllabus

date: 2020-07-14

This is my adaptation of John Regehr’s “wish-list for self-study” ( to help me pivot into software engineering. I’ve marked with TODO those tools that I’m not yet comfortable using professionally. The goal is to flesh out my knowledge during COVID-19 and for the next few years.

In the software engineering course I’m teaching this spring, I often find myself saying things like “you need to know a scripting language” or “everyone should be able to run a code coverage tool.” Finally, the other day, a student stopped me and asked for the whole list. In other words, what — in my opinion — is the collection of tools that someone graduating with a CS degree should know how to use. Of course I couldn’t answer this on the spot but I’ve been thinking about it since then. The basic idea is that for most any common situation, you should have a decent tool at hand and be able to start solving problems with it without too much fumbling around. (John Regehr, 2018)

The Basic Toolbox

a version control system

“a Github-centric workflow including pull requests, remotes, merge conflicts, etc.”

a text editor

“a solid default choice that does a good job with most editing tasks[; it] should highlight and indent any common programming language, integrate with a spellchecker, easily load gigantic files, have nice regex-based search and replace, etc.”

a shell language

“for scripting a smallish number of commands, doing a bit of error checking, and perhaps looping or interacting with the user slightly”

a generic build system

a scripting language

“for low-grade automation, quick and dirty data analysis tasks, etc.”

a workhorse language

“for most tasks, [which] should have a huge collection of high-quality libraries, be pretty fast, run on all common platforms, etc.; know how to use its interactive debugger, static and dynamic bug-finding tools, a profiler, a code coverage tool, a package manager, and perhaps a random test-case generator.”

a pocket calculator

“go-to REPL for basic arithmetic and conversions between number representations, it should be near-instantaneous to get answers.”

a data analysis language

a database

a graphing program

a presentation tool

Secondary Tools

a browser language

a cloud-based testing service

a systems language

“for creating servers, daemons, and other code that wants to go fast, use little memory, have few dependencies, and interact tightly with the OS”

an interactive debugger for native executables