Readit News logoReadit News
Posted by u/anishathalye 20 days ago
The Missing Semester of Your CS Education – Revised for 2026missing.csail.mit.edu/...
We returned to MIT last month to teach a revised version of Missing Semester, six years after the original debut (which has been extensively discussed on HN, in https://news.ycombinator.com/item?id=22226380 and https://news.ycombinator.com/item?id=34934216).

We’ve updated the course based on our personal experiences as well as major changes in the field (e.g., the proliferation of AI-powered developer tools) over the past several years. The 2026 course includes revised versions of four lectures from the previous course, and it adds five entirely new lectures:

- Development Environment and Tools

- Packaging and Shipping Code

- Agentic Coding

- Beyond the Code (soft skills)

- Code Quality

We’d love to hear any feedback from the HN community to improve the current or future iterations of the course. In particular, we’re curious to hear the community’s take on our inclusion of AI-related topics (e.g., dedicating an entire class to the topic of agentic coding; though we tried to counterbalance it with plenty of disclaimers, and a dedicated section on AI etiquette in Beyond the Code).

--Anish, Jon, and Jose

NoNameHaveI · 19 days ago
I'm glad to see there is a "Beyond the Code" section that discusses comments. Here's what I typically told my students in Intro to Programming" Good comments lend insight into the code. Reading the code itself tells you the what. Comments should explain the why. Comments like "i+=1; /* Increment i */" are of little value. However comments such as "We increment i mid loop so that we can peek ahead at the next value for a possible swap" are more useful. Use a narrative voice when writing comments, like you are explaining the code to your grandparent. This make digestion easier. Remember, code spends most of its life, and most of its expense, in the maintenance phase. The easier you make your code to understand, the less it will cost and the longer it will live.
dec0dedab0de · 19 days ago
I prefer comments like "I'm sorry about this, I know it's ugly but I'm in a rush and it's the quickest way to get it working"
stronglikedan · 19 days ago
As long as there's a "TODO" tag in the comment to easily search for, then I prefer those comments as well.
jimbokun · 18 days ago
Would your Grandma approve of you introducing that technical debt?

That’s why it’s important to write comments as if to your grandparents. For the feelings of accountability that it engenders.

Hendrikto · 19 days ago
Great to see a chapter on version control. It is such a shame that almost no CS program teaches proper version control. VCSs and the commit history can be such a tremendously valuable tool when used correctly.

git bisect/blame/revert/rebase/… become so much less useful when VC is treated as a chore and afterthought, and basically amounts to: “Feature is done, my work is complete, just do `git commit -am "changes"` and be done with it.”. And don’t get me started on commit messages.

It is shameful that for a large part of the industry, this is the norm. It is shameful that for a lot of professional, who call themselves software architects or reliability engineers and such fancy titles, still have essentially no idea what they are doing with git, and their response when git add/commit/push/pull don’t work is to shrug, and just delete and re-clone the repo.

Version control should be treated with care and attention to detail. It pays for itself 100 times over.

If your commit history is maintained and tells a story, it is a joy to review your PR. If you just `git commit -am "try fix"` 26 times over, and all that is left in the end is a ball of mud, it is horrible.

xml · 19 days ago
If most people are not using a tool properly, it is not their fault; it is the tool's fault.

Git is better than what came before, and it might be the best at what it does, but that does not mean that it is good.

- The interface is unintuitive.

- Jargon is everywhere.

- Feature discoverability is bad.

- Once something goes wrong, it is often more difficult to recover. If you're not familiar enough with Git to get yourself into that situation, then you certainly aren't familiar enough to get yourself out of it.

Many of those issues are due to git being a command line interface, but others (like no general undo and funny names) are simply due to bad design.

I think it is about time that we try again and build a better version control tool, but maybe git is just too entrenched.

shagie · 19 days ago
> If most people are not using a tool properly, it is not their fault; it is the tool's fault.

I would say that is a reasonable criticism of git ... but I've seen the same thing in svn, perforce, cvs, and rcs. Different variations of the same issue of people not caring about the version history.

Since it's been a problem since the dawn of version control, it is either something that is part of all version control being a tool's fault that has been carried with it since doing ci, or it is something that people aren't caring about.

I feel this is more akin to a lack of comments in code and poor style choices and blaming the text editor for not making it easier to comment code.

cameronh90 · 19 days ago
> If most people are not using a tool properly, it is not their fault; it is the tool's fault.

This is a standard that we don't apply to most other tools outside of IT. I do think git could be more usable, but most powerful tools have sharp edges and require training.

A bandsaw is a fantastic tool, but if you try to use one without reading about it first, you'll end up losing a finger. I'm not sure I'd blame the bandsaw in that instance...

netdevphoenix · 19 days ago
> If most people are not using a tool properly, it is not their fault; it is the tool's fault.

Replace tool with one of piano|guitar|etc and see your logic fall apart. Software tools like any other have a manual and require effort and time to learn.

1718627440 · 19 days ago
The hardest thing to get people to, is to think of a evolution of their codebase as opposed to just a single state with a sophisticated backup system. Writing proper commit messages and diffs follows from that. The actual Git commands are then incidentally.
tech_tuna · 16 days ago
Git is better in some ways, but it is insanely complicated. That matters less now with AI tooling but still there was a time when we all had many choices (commercial and open source) for source control tools. My canonical example is git checkout -b <branch_name> for a new branch, git branch -D <branch_name> to delete the local branch and git push origin :<branch_name>.

I know that that is the old syntax but holy hell, that's insane. Why couldn't it always have been git branch --create|delete|delete-remote? It could have but Linus doesn't care about your feelings or small brain. :)

owlstuffing · 19 days ago
Right on. Git is good at what it does, but its CLI is too low-level. It feels more like an assembly language than an end-user language, and a haphazard one at that.

There are wrappers that make it much more approachable. IntelliJ’s Git frontend, for example, is pretty nice.

janalsncm · 19 days ago
Git has poor design because it forces users to learn its model of things rather than meeting users where they are. There’s way too many leaky abstractions that pop out as soon as you stray from the happy path, and you might not even know you’re straying when you do it.

Instead, the complexity of your mental model should scale with the complexity of the thing you’re trying to do. Writing a “hello world” in Java does not require a mental model of all of the powerful things Java can do.

We want CS 101 students to use version control but for a lot of them it will also be their first time using a CLI and a programming and also the underlying CS concept.

intended · 19 days ago
For UI/UX arguments on professional grade software, I present the Bloomberg terminal. A fever dream in shades of orange, black and blue.

For professional work, people can and do learn complex interfaces and jargon, if it is advantageous.

krupan · 19 days ago
Very true, though it has improved a over the years. Most people haven't noticed because when git has introduced newer simpler commands it hasn't deprecated the old ones. You can now use it like this, but most people don't know it:

git switch some-branch # edit files git restore file2 # undo changes to file2 git stage file1 git commit

Instead of the old workflow using checkout with a bunch of different flags.

I agree though that git is needlessly obtuse. I advocated for mercurial instead of git for years because mercurial was so much more user friendly, but git won. I hear good things about jj now

jimbokun · 18 days ago
I haven’t used jj but isn’t that exactly what it’s meant to be?

I believe git is architecturally sound and well designed, but the command line syntax can be overly confusing and opaque.

Deleted Comment

marcosdumay · 19 days ago
Git is badly designed, but your rule is also bad.

If somebody can get a lot done with a tool, then it's a good tool. And a lot of tools can't both enable people to get things done and avoid being misused. They have to pick one.

npinsker · 19 days ago
This feels harsh. Engineers have an endless list of other things to learn that are arguably more important, and it isn’t always worth understanding all the weird edge cases that almost never pop up (to say nothing of Git’s hostile, labyrinthine UX that one would have to deal with).
HelloNurse · 19 days ago
What things to learn are more important for "engineers" than using VC messages and history for communicating adequately (including communicating with themselves in the future) and using VC merging, staging etc. to put source code in a good state that they intend to build, share and archive? Irreproducible or incomprehensible work is worse than nothing.
gcr · 19 days ago
It's absolutely worth taking the time to learn `jj`, for example, but `jj`'s ideas build on top of `git`'s ideas. If you don't know why it's important that commits reference their parents, for example, that's limiting your knowledge of how VCS works in important ways.

A compromise/synthesis: everyone should absolutely learn how git works internally, but not necessarily how to use the git-specific porcelain/tooling/CLI

zerkten · 19 days ago
A big part of the problem is being permitted to teach this stuff. As a UK CS grad from the early-2000s, my observation was that academic staff recognized the need for these skills. They weren't permitted to teach it due to time available and the view that it wasn't academic. Thankfully, my university's CS department offered courses in these kinds of topics taught by the support staff (read: sysadmins). These courses existed to help other departments with skills but were open to students.

Fast forward twelve years and my wife did the MCIT at UPenn (https://catalog.upenn.edu/graduate/programs/computer-informa...) where git and other topics woven into the curriculum. Even then, they were perhaps a novelty because their focus was bringing non-CS undergrads into a CS Masters program. So-called "conversion" master's degrees were the norm in the UK in 2002.

TonyStr · 19 days ago
It seems most people learn git only through necessity. I've heard people say "I just want to code, I don't care about the peripherals". JIT learning is a good way to acquire capabilities with real-world application, but there is not JIT pull that forces people to learn about bisect, git objects, git logging, etc. These things can only be learnt either through setting off time to read documentation or by being taught through a course.

I think this is a good argument for teaching git, and being thorough in doing so, as many people are likely to never take that initiative themselves, while the benefits to being good at git are so obvious.

Anonyneko · 19 days ago
I think most people learn git through the particular processes that are established at their workplace, as every company uses git or VCS in general differently somehow.
stackghost · 19 days ago
>It seems most people learn git only through necessity. I've heard people say "I just want to code, I don't care about the peripherals"

I'm sure there's an element of (intellectual) laziness too, but I think people tend to only learn git by necessity because git is simply unpleasant to use.

A lot of us have Stockholm syndrome because git is less bad than what came before it, but git is not good.

skydhash · 19 days ago
I see this enough that I don’t bother ranting about it. There’s the free “Pro Git” (on the git homepage) that will teach you most of what you”ll need in a lifetime. But you tell people about rebase and the reflog and their eyes glaze over.
AnimalMuppet · 19 days ago
Version control isn't the only thing like that (though it might be the most important). They ought to have some familiarity with the idea of a bug database, for example. A requirements database (a software engineer could go through their entire career without having to ever touch one, but they should be familiar with the idea).
sigbottle · 19 days ago
I have heard of each of those tools but I've never really used them for real.

Like, I attempt to write good commit messages and stage my changes in such a way that the commits are small, obvious, and understandable. That's about it. But the advanced tooling around git is scary ngl.

oytis · 19 days ago
My rite of passage towards git kung-fu was committing to Linux kernel. It's brutal there, you have to have your history really clean.

Meanwhile enterprise teams are often like - who cares, let's auto-squash all commits into one.

krupan · 19 days ago
So much this. Once you get beyond the very basics, git is a code editing tool as much as your editor/ide is
sh34r · 19 days ago
Your workflow makes sense for FOSS projects, where the commit is the unit of work. In my experience, on most professional teams, the PR is the unit of work. PRs trigger CI/CD pipelines. PRs map to tickets. The meaningful commit goes with the squash merge to the shared dev/main branch.

There are cases where I've staged commits this way for a PR, to make it more reviewable. I'd usually rather split them off into separate PRs, but when that would create a pipeline of three MRs that are meaningless on their own, then rewriting history for a single MR makes sense. I generally consider my feature branch's commit history to be for me, not for you. Going back and rewriting history is a chore that shouldn't be necessary if I did a decent enough job with the PR description and task decomposition. Those commits are getting squashed anyway. Along with all the "fix MR comments" commits on top of it.

It wouldn't bother me to adopt your workflow if it fits your team and its tools and processes. I'd just say, consider that your way isn't the only correct way of doing things. Your preferences are valid, but so are others'. The only thing that really bothers me is absolutism. "My way or the highway."

Your writing here reminded me of a particularly unpleasant coworker I had in the past. I quickly browsed your comment history to make sure you're not him... Excessive rigidity is not an endearing quality.

All that being said, I have also been constantly annoyed by people with too many YoE who can't be bothered to spend an hour or three to learn the basics of how the Git tree is structured, and what merge vs rebase does. They rely too heavily on their GUI crutches and can't fix anything once it goes sideways. Even when you lead them to water, sending them reading material and offering to answer questions after, they refuse to drink. Willful ignorance is far more irritating than stubbornness. I don't expect them to be able to remember what bisect vs cherry-pick does. Claude will spit out the subcommands for them if they can describe what they need in English. But they can't do that if they have no understanding of the underlying data structures...

Deleted Comment

esafak · 19 days ago
This might be a good time to teach jujitsu, before they're too invested in git.
barnacs · 19 days ago
I don't think using git should necessarily be taught as a part of a CS education. Any self respecting engineer will be capable and have the curiosity and motivation to dig into it on their own. CS should give them the prereqs to do so, such as hashing, graphs, trees, etc.
Stevvo · 19 days ago
"Almost no CS program teaches proper version control"

This is just false. In the UK, you would learn version control in the first week, then submit all work through version control for the whole course.

I find it hard to believe that Americans just don't use version control at school. It doesn't make any sense.

Hendrikto · 18 days ago
> It doesn't make any sense.

Exactly. But that is sadly the state of things.

pards · 19 days ago
One of my large enterprise clients currently requires all tech staff to complete 18h (yes, eighteen hours!) of "agile training", in addition to speed-running 14 separate mandatory online courses.

This time would be much better spent watching these 9h of lectures.

projektfu · 19 days ago
I'd include sed and awk, because these tools are ubiquitous and can accomplish in a few readable lines what people write long programs to handle in other languages, seemingly because they are unaware of sed and awk, don't know how to use them, or are required for some reason to do it in the project language.

In fact, generally teaching people to select the right tool for the job is a good skill to prevent them from using golden hammers.

Arun2009 · 19 days ago
Just wondering - do you include information on interviewing, salary negotiation, communication with management, leading teams, and maybe topics on career progression?

These would have been very useful to me back when I was in the university.

Jonhoo · 19 days ago
Not at the moment, but it's a good idea for the next iteration of the class!
ontouchstart · 19 days ago
When I was a Physics Ph.D. student in NYU in the late nineties, I took a course called UNIX tools in the CS department. It was a hands on course where the instructor did live REPL in the terminal and we watched him showing us all the tricks. I got hooked with UNIX since then. Got myself a dialup terminal in my tiny apartment in east village and dial in to the workstation on campus. The latency is so bad that I can’t only see the feedback after a few keystrokes. That was when I trained my vi muscle memory. (EMacs was out of the question.)

Later I got my own IBM 386 and installed Linux on it and started to program in Perl …

I am a big fan of Jon’s YouTube videos on Rust and I started to use Rust in non conventional ways.

I am going to follow this lecture series and “port” them to rustdoc and see how it goes.

Another rabbit hole to fall down, it is going to be fun.

https://ontouchstart.github.io/rabbit-holes/missing/

0xbadcafebee · 19 days ago
If you want to master the shell (it will save years of your life), follow these guides. I highly recommend reading the entire BASH manual, it will answer every question you'll ever have, or at least give you a hint about it, as well as expose you to all the hidden knowledge (some call it "gotchas") you'll wish you knew later.

  101
  - Bash for Beginners (https://tldp.org/LDP/Bash-Beginners-Guide/html/)
  - Bash Tutorial (https://www.w3schools.com/bash/)

  201
  - Bash Programming (https://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html)
  - Advanced Bash Scripting Guide (https://tldp.org/LDP/abs/html/)

  301
  - The Bash Manual (https://www.gnu.org/software/bash/manual/bash.html) (https://man7.org/linux/man-pages/man1/bash.1.html)
  - ShellCheck (https://www.shellcheck.net/)
To find every Unix-y program and get a 1-line description of it (and referenced programs/functions), run:

  for i in $(ls /bin/* /usr/bin/* /sbin/* /usr/sbin/* | sed -E 's?.*/??g' | sort -u) ; do
    echo "command: $i"
    whatis "$(basename "$i")" | cat
    echo ""
  done | tee command-descriptions.log
View 'command-descriptions.log' with less command-descriptions.log, use arrow-keys and page up/down to navigate, and type 'q' to exit. To find out more about a program like df(1), run man 1 df.

e12e · 19 days ago
I think looking at some of the documentation for oils (née oil sh) and ysh - as well as [looking at using] these two projects [in place of bash] - is also a good idea today:

https://oils.pub/

zahlman · 19 days ago
I think I would do it more like:

  find /bin/ /usr/bin/ /sbin/ /usr/sbin/ -executable -type f -exec whatis "$(basename {})" \; | sort -u > commands.txt

0xbadcafebee · 19 days ago
You would need to make those double-quotes into single-quotes. Double-quotes will interpolate the $() immediately, running basename before find runs. Single-quotes will not interpolate the $(), so the whole string gets passed to find for it to execute each time
ILoveHorses · 19 days ago
Not an entire semester, but I'm really glad my uni had a semester long core CS course on exactly this. Still one of the most useful courses I've ever taken, I refer my notes from that class even now.