# Computer Science Transitional Syllabus

date: 2020-07-14

This is my adaptation of John Regehr’s “wish-list for self-study” (https://blog.regehr.org/archives/1578) 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.”

• git
• GitHub

### 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.”

• vim
• vim plugins

### 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”

• bash

• Make (TODO)

### a scripting language

• Python3 (TODO: go deeper)

### 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.”

• Java (TODO)
• OCaml/Java (TODO)
• Scala (TODO)

### a pocket calculator

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

• again, Python3

### a data analysis language

• once more, Python3
• pandas
• numpy
• SQLAlchemy

### a database

• MySQL
• AWS RDS (TODO)

### a graphing program

• numpy/pandas/matplotlib
• Graphviz (directed graphs)
• $\LaTeX$’s TikZ, Xy-pic (commutative diagrams)

### a presentation tool

• Jupyter notebooks with RISE extension
• $\LaTeX\$ beamer package
• Pandoc

## Secondary Tools

### a browser language

• JavaScript/TypeScript (TODO)

### a cloud-based testing service

• GitLab (TODO)

### 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”

• C++ (TODO)
• Go (TODO)

### an interactive debugger for native executables

• GDB: The GNU Project Debugger (TODO)