# missing-semester-cn: the Chinese translation of MIT's Missing Semester, and how to build it locally

> The repository holds the Chinese translation of the Missing Semester of Your CS Education, a Jekyll site published to GitHub Pages. It is a translation project first and a web project second, which explains most of its constraints.

**missing-semester-cn/missing-semester-cn.github.io** — the CS missing semester Chinese version

- Repository: https://github.com/missing-semester-cn/missing-semester-cn.github.io
- Website: https://missing-semester-cn.github.io/
- Stars: 7,421 · Forks: 1,200
- Language: Markdown
- License: NOASSERTION
- Published: 2026-09-22 · Updated: 2026-09-22 · Language: en
- Canonical page: https://hysenlabs.com/projects/missing-semester-cn-missing-semester-cn-github-io

## What the Missing Semester Chinese site actually is

The Missing Semester of Your CS Education is a course about the parts of computing that a computer science degree tends to skip: the shell, version control, debugging, editors, and the tooling around code. The upstream English site lives at missing.csail.mit.edu. This repository is the Chinese site, published at missing-semester-cn.github.io, and the README frames it plainly as a translation: it points readers to the English course and marks how recently the two have been synced.

The audience is narrower than the upstream course's. It is for readers who want the lecture text in Chinese, and for translators who want to add or update a lecture. That second audience shapes the repository more than the first. There is no application code here, no package to install, no API. The primary language is Markdown, and the work product is prose plus a Jekyll configuration that renders it.

That matters for anyone evaluating it. You are not adopting a library with a compatibility surface. You are reading a translated textbook whose build system happens to be checked in alongside it.

## How the lectures are organised across three course years

The top level contains three lecture directories: _2019, _2020, and _2026. Each holds Markdown files named per topic, such as course-shell.md, version-control.md, or debugging-profiling.md. Jekyll collections are the mechanism that turns those directories into pages, configured through _config.yml, with _layouts and _includes supplying the page chrome and lectures.html and index.md acting as entry points.

The README carries two status tables, one for the 2026 lectures and one for the older project set. The 2026 table lists agentic-coding.md, beyond-code.md, code-quality.md, command-line-environment.md, course-shell.md, debugging-profiling.md, and development-environment.md as complete, with shipping-code.md and version-control.md still marked 待翻译, meaning untranslated and unassigned. The older table lists twelve lectures, all complete.

Two things follow from this layout. First, the 2026 syllabus is not the 2020 one with new filenames; the topics differ, and the 2026 set includes subjects the older set does not. Second, the translation status is tracked in a README table rather than in the repository's issue tracker or a project board, so the README is the coordination surface. The README states that contributors should reserve a topic by opening an issue, and that the table is updated accordingly to avoid duplicated work.

## Building the site locally with Jekyll

The README gives the local build as two commands. bundle install resolves the gems pinned in Gemfile and Gemfile.lock, and bundle exec jekyll serve -w starts Jekyll with watch enabled so edits to Markdown are re-rendered as you work.

```bash
bundle install
bundle exec jekyll serve -w
```

The README also shows a variant for Homebrew Ruby on macOS, where the Ruby binary may not be on the default PATH. Note that this is the form the README prints, with the PATH assignment prefixed to the command.

```bash
#PATH="/opt/homebrew/opt/ruby/bin:$PATH" bundle exec jekyll serve
```

After the server starts, Jekyll's default behaviour is to serve the site on localhost port 4000, which is also the port the repository's compose file maps. The README does not state the port; the Docker configuration does.

## Running it in Docker when you do not want Ruby installed

The repository ships a Dockerfile and a docker-compose.yml, so you can skip a local Ruby install entirely. The Dockerfile is based on ruby:3.4-alpine3.21, installs ruby-dev and alpine-sdk, copies Gemfile and Gemfile.lock into /app, runs bundle install at build time, and starts the server with the host bound to 0.0.0.0 so the port is reachable from outside the container.

```dockerfile
FROM ruby:3.4-alpine3.21

RUN apk add --no-cache ruby-dev alpine-sdk

RUN mkdir /app
COPY Gemfile Gemfile.lock \
    /app/
WORKDIR /app
RUN bundle install

CMD ["bundle", "exec", "jekyll", "serve", "-w", "--host", "0.0.0.0"]
```

The compose file builds that image, publishes port 4000, bind-mounts the repository into /app so live edits are visible inside the container, and sets restart: on-failure. The image name is missing-semester:latest.

```yaml
services:
  server:
    image: missing-semester:latest
    build:
      dockerfile: Dockerfile
      context: .
    ports:
      - 4000:4000
    volumes:
      - ./:/app
    restart: on-failure
```

One consequence of the bind mount: the container's /app is your working tree, so the bundle install performed at image build time is shadowed by whatever Gemfile.lock sits in your checkout. If you change the lockfile, rebuild the image rather than expecting the running container to pick it up.

## Where the translation workflow breaks down

The README's stated process is to open an issue to reserve a lecture, and the table is then updated. Nothing in the repository enforces that. There is no CI configuration listed among the top-level entries for checking whether a translation is current with its English counterpart, and the only sync signal is a badge in the README reading 最近一次与英文版同步-2026--04--06, which is a hand-maintained date rather than a computed one.

The practical failure mode is drift. The English course is edited upstream; this repository is not automatically notified. A lecture can be marked 完成 in the table while the English source it was translated from has since changed, and the badge will not tell you which lectures are affected. If you are relying on this site for accuracy against the current English course, the status table answers a different question than the one you are asking.

The second limitation is scale. Two of the nine 2026 lectures are unassigned, and the README's coordination model depends on a small number of named contributors. That is a reasonable model for a course translation, but it means the site's completeness is a function of volunteer availability rather than a schedule.

## The English Missing Semester site as the alternative

The obvious alternative is the upstream English site at missing.csail.mit.edu, which this repository explicitly links to in its README. The difference is not just language. The English site is the source of truth: when the two diverge, the English version reflects the current course, and this repository reflects whatever state the translation had reached.

Choosing between them depends on what you need. If you are reading to learn the material, the Chinese translation removes a language barrier and the 2020 lecture set is complete. If you are checking a claim, quoting the course, or need the newest 2026 material, the English site is authoritative and this one may lag. There is no third option in the repository: it does not vendor the English text, so you cannot diff the two from a single checkout without fetching the upstream separately.

## Licence and what it means for reuse

The README states that all course content, including the site source code, lecture notes, exercises, and lecture videos, is licensed under CC BY-NC-SA 4.0. The repository metadata reports the licence as NOASSERTION, which means GitHub's classifier did not identify a standard licence file; the README's statement is the clearer signal, and license.md exists at the top level.

The practical reading of CC BY-NC-SA 4.0 as the README describes it: attribution is required, commercial use is not permitted, and derivative works must carry the same licence. For a translation project this is coherent, since a translation is a derivative work and ShareAlike keeps the Chinese text under the same terms as the English original. If you were considering republishing the lectures inside a paid course or a commercial product, the NonCommercial term is the constraint to examine, and this is a question for your own legal review rather than something the repository resolves. The README points readers to the upstream licence page for more on contributions and translations.

## Conclusion

Adopt this repository if you want to read the Missing Semester material in Chinese, or if you want to translate one of the two remaining 2026 lectures. Do not adopt it if you need a versioned release to pin against, an English-language source of truth, or a site you can run without a Ruby toolchain. Before contributing, open an issue to claim a lecture, because the README states that topics are reserved through issues to avoid duplicate work. The first thing to verify is whether the lecture you want is still listed as 待翻译, since the status tables are the only coordination mechanism the project documents.

## FAQ

### What is missing-semester-cn?

It is the Chinese version of the Missing Semester of Your CS Education course, published as a Jekyll site at missing-semester-cn.github.io. The README points to the English course at missing.csail.mit.edu as the original.

### How do I build the missing-semester-cn site locally?

The README gives bundle install followed by bundle exec jekyll serve -w, and notes a Homebrew Ruby PATH variant for macOS. The repository also provides a Dockerfile and docker-compose.yml that publish port 4000.

### Which missing-semester-cn lectures are still untranslated?

The README's 2026 status table marks shipping-code.md and version-control.md as 待翻译, with the translator listed as 待分配. All twelve lectures in the older project table are marked complete.

### What licence does missing-semester-cn use?

The README states that all course content, including the site source code, lecture notes, exercises and videos, is licensed under CC BY-NC-SA 4.0. The repository metadata reports the licence as NOASSERTION.

## Sources

- [Issues](https://github.com/missing-semester-cn/missing-semester-cn.github.io/issues)
- [missing-semester-cn/missing-semester-cn.github.io on GitHub](https://github.com/missing-semester-cn/missing-semester-cn.github.io)
- [Project website](https://missing-semester-cn.github.io/)
- [README](https://github.com/missing-semester-cn/missing-semester-cn.github.io/blob/master/README.md)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/missing-semester-cn-missing-semester-cn-github-io
