The Missing Semester of Your CS Education 📚

  • By null
  • Last update: Sep 18, 2022
  • Comments: 16

The Missing Semester of Your CS Education

Build Status Links Status

Website for the The Missing Semester of Your CS Education class!

Contributions are most welcome! If you have edits or new content to add, please open an issue or submit a pull request.


To build and view the site locally, run:

bundle exec jekyll serve -w


All the content in this course, including the website source code, lecture notes, exercises, and lecture videos is licensed under Attribution-NonCommercial-ShareAlike 4.0 International CC BY-NC-SA 4.0. See here for more information on contributions or translations.



  • 1

    Creating the Thai version in the same concept of Missing Semester

    Hi there,

    I am Kanisorn from Thailand. I learned this course and I think this is really good content here. I would like to ask that I will create the Thailand CS Missing Semester and re-create contents to Thai.

    I plan to use re-create content because I love the concept of Missing Semester but we might modify or create by our own style. All is free, serve on GitHub Pages via And here we have fews Thai contributers to help to create/validate Thai contents. We will have more or less lesson from your current course.

    I am here because I concern about the license. Would I need to strict on the same license here.


  • 2

    Minor edits and additions

    Link back to Vim "search and replace" lecture section mirror sed substitution syntax, minor corrections about R, small clarifications about a couple commands

  • 3

    Update - correct misuse of shell

    In step 4 of the exercises, you mention the first line of the file and talk about how Bash interprets the shebang characters. Unfortunately /bin/sh is the POSIX compliant Bourne shell, Bash is the Bourne Again SHell and has extensions to the Bourne shell that do not exist in the Bourne shell. This corrects that misuse.

    While /bin/sh is guaranteed to exist on all POSIX compliant operating systems and /bin/bash is not, that's a different topic altogether.

  • 4

    Add Github action workflow to lint prose

    Uses the first action I've created and published to run write-good on Markdown files. Works well with add-pr-comment to have bot post a comment with the output from write-good if there is any. Purely informational; does not fail the check if output is generated.

    • use checkout to access repo files
    • use write-good-action to lint prose in Markdown files
    • use add-pr-comment to add comment to PR with write-good output if any
    • this will never reject a PR or commit based on write-good's output, this is informational only, and the PR author is free to ignore as write-good can be opinionated
  • 5 Exercises: Fix top-10 history script

    history 1 returns only the current event, making it look like the only command in history is the script people just pasted into their terminal. Note that tail prints the last 10 lines by default.

  • 6

    Private key path is expected after -i of ssh client

    According to man ssh. On macOS, if public key path is specified, user would come across Permissions 0644 for '/Users/username/.ssh/' are too open.

  • 7

    Added TLS / HTTPS section to security

    Our CTO sent around this doc to our division. Working for InfoSec, I thought there should be some mention of TLS / HTTPS since that's what folks work with all the time, and the existing async / sync + SSH discussion is almost there.

  • 8

    fixed styling in code snippet

    In the Course Overview + the shell page, there is a code snippet man ls that had styling that didn't match the other snippets. Changed the styling in the html to match the other snippets. Not sure if this is useful or not since it looks like the html is autogenerated when the web server is launched? If this isn't the best way to submit a PR for this, would love to hear how to do so? Thanks.

  • 9

    add the russian version


    I'm translating the course to Russian. I've already finished homepage, main page and the 1st and 2nd lectures. The repo: Thanks!

  • 10

    Search and replace link to Vim lecture, minor R correction and Rust uninstall clarification per Jon review

    Still a git amateur, unfortunately, so couldn't quite figure out how to make changes to the former pull request. Unless I'm mistaken, this request should contain the changes that @jonhoo and I worked through.

  • 11

    A mirror site for Chinese translation

    Thank you guys, this is such a great course! It is even more helpful to self-taught engineers like me. so I really want to contribute and what I can do is to translate this into Chinese to make it easier for Chinese developers to learn. so I create a mirror site of your project here : as the Chinese version and if it looks good to you, please can you consider to link it from yours?

    Though the site is not finished yet, I will translate one or two lecture notes per week, so I think it will be finished very soon.

    BTW, you can check the source code here:

  • 12

    Data Wrangling | journalctl doesn't work on WSL without configuration

    Questions 4 and 5 in the Data Wrangling lesson with OOTB WSL. I was able to get it up and running using the instructions here. It may be worth noting this for future versions for ease of use,

  • 13

    Add common network/DNS tools to debugging?

    Thanks for the great content in this series.

    In the "Debugging" lecture, it would be useful to add netcat or telnet to the list of tools to use when debugging network issues. As well, listing dig or nslookup and host or getent hosts would be helpful in cases of debugging DNS issues.

    A couple of examples where these are used from my experiences as a software engineer:

    • working through issues with firewalls in public cloud or on premise
    • debugging VPN setup issues
  • 14

    Safari in Q&A

    I think that the last part of the Q&A undersells the merits of Safari. Firefox excels for privacy reasons as you mention, but so does Safari. The lower memory footprint and battery life usage are benefits of Safari that aren't mentioned.

  • 15

    Swift Playgrounds in the notebook programming section?

    Can Swift Playgrounds be mentioned as an example of an interactive and exploratory programming environment in the notebook programming section of the potpourri page? I think macOS (and iPadOS) users might find this interesting and useful.

  • 16

    `which echo` is misleading

    The overview page uses which echo to show which program is executed when running echo $PATH. This is misleading. which only shows executables on the $PATH, but echo is built into most shells. For example, in Bash:

    $ type -a echo
    echo is a shell builtin
    echo is /bin/echo

    So when I run echo $PATH (or preferably echo "$PATH") it does not run /bin/echo, but rather the shell built-in. This is also mentioned in the GNU coreutils man echo:

    NOTE: your shell may have its own version of echo, which usually supersedes the version described here. Please refer to your shell's documentation for details about the options it supports.