--- title: Computer Science Transitional Syllabus author: Colton Grainger date: 2020-07-14 revised: 2020-09-17 math: true --- 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." - 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 - - - fish - ### a generic build system - Make (TODO) - - ### a scripting language "for low-grade automation, quick and dirty data analysis tasks, etc." - 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 refurbished X220 (or T420) thinkpad ``` not only our dream but also many thinkpad users' dream to be able to use the 7-row keyboard once again reborn as thinkpad anniversary edition 25 but it is just that, the one and only like the shooting star soared through the darkest night so bright but so short after using the 7-row keyboard you will see thinkpad's unique insights on keyboards you will see how the full-size keyboard can be concentrated it has been 1991 days since the beginning ``` (paraphrased from ) I just did not realize how totally useless I was typing on any other keyboard until like a year into painfully operating vim on a MacBook for work. I want a keyboard I can *get mad at!* Perhaps the *most self-destructive* aspect of a MacBook is that the *modifier keys* (e.g., `alt-b`) don't do what they should when I'm editing shell commands! Thinkpads are in space! Right now! ![](https://upload.wikimedia.org/wikipedia/commons/0/05/TORU_docking_system.jpg){:width="100%"} ![](https://upload.wikimedia.org/wikipedia/commons/b/b9/Wikimania_hackathon_1.JPG){:width="100%"} ### a windowing system - xmonad - paperWM ### a browser language - JavaScript (TODO) - ### a CI/CD pipeline - 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) -