Top all-time · #3796
Waleed Khan
Personal blog · blog.waleedkhan.nameprogrammingsystems
Waleed Khan writes Steno & PL, a personal blog at blog.waleedkhan.name about programming and systems. Since 2021, 20 different Hacker News readers have linked it 48 times, most often “Git undo: We can do better”. It is still writing: the last post was on 2026-09-04, and you can follow it by feed.
Too few sampled comments (6) to say how often HN recommends it.?
Why HN links it
HN readers link Waleed Khan's posts on Git and Jujutsu workflows, such as git-undo and formatting a commit stack. Commenters cite them as pointers when discussing Git tooling like git-branchless.
Summarised by Claude from a sample of 6 HN comments that link here. Each comment is marked recommending, critical or neutral (citing without judging); how this works.
This is a personal blog. Unless otherwise stated, the opinions expressed here are my own, and not those of my past or present employers.
Most-linked posts?
- Git undo: We can do better5 people · 6 mentions · first linked 2021-06-21
- Fast rebases with git-move4 people · 4 mentions · first linked 2021-10-14
- Quickly Formatting a Stack of Commits3 people · 3 mentions · first linked 2023-04-11
- Automatically detecting and replying to recruiter spam2 people · 3 mentions · first linked 2021-10-05
- Half my work is adding a cache2 people · 2 mentions · first linked 2025-08-24
- "Will I ever use this in the real world?"2 people · 2 mentions · first linked 2025-01-30
- Incrementally porting a small Python project to Rust2 people · 2 mentions · first linked 2021-05-14
- Writing Brittle Code2 people · 2 mentions · first linked 2025-01-30
- Encoding ML-style modules in Rust2 people · 2 mentions · first linked 2023-06-17
What Hacker News says?
If it was that easy, https://blog.waleedkhan.name/git-undo/ wouldn't be a thing.
Comment linking /git-undo/
on “Magit, the magical Git interface (2017)”Submitted Git undo: We can do better as a story · 762 points
HN discussionYou might find my blog post on some of the uses interesting: https://blog.waleedkhan.name/union-vs-sum-types/ In a language like TypeScript, they can be used for function overloading since there is no runtime dispatch based on argument type. But usually they're used as sum types in the same way as e.g. Rust enums. Typescript supports so-called "singleton types", in which a given type is inhabited by exactly one valu…
Comment linking /union-vs-sum-types/
on “TypeScript: Control flow analysis for destructured discriminated unions”Submitted Automatically detecting and replying to recruiter spam as a story · 121 points
HN discussionreflog can't quite catch every change that might happen because not everything is stored directly as a ref (ie a "head" that git tracks, like a branch pointer). For instance, if you are interactively using `git bisect` and you mark commits as good or bad, and you accidentally mark a commit incorrectly, you have to do something like: git bisect log > /path/to/file.txt git bisect reset # modify file.txt to "look corre…
Comment linking /git-undo/
on “The creator of Jujutsu has joined ERSC”Submitted Fast rebases with git-move as a story · 89 points
HN discussionThis was interesting to me. I played chess seriously for about 4 years and gained about 400 Elo points. Apparently that's rather above the expectations for an "ordinary" person! I spent around 1000 hours practicing chess during that time, 3/4ths of which was spent on tactics training (writeup here: https://blog.waleedkhan.name/hours-invested-vs-percentile-ra... ). I'm guessing that's a significant differentiating fa…
Comment linking /hours-invested-vs-percentile-rank/
on “How long does it take ordinary people to get good at chess?”Submitted Bringing Revsets to Git as a story · 40 points
HN discussionThe index as a data structure is really starting to show its age, especially as developers adapt Git to monorepo scale. It's really fast for repositories up to a certain size, but big tech organizations grow exponentially, and start to suffer performance issues. At some point, you can't afford to use a data structure that scales with the size of the repo, and have to switch to one that scales with the size of the us…
Comment linking /in-memory-rebases/
on “Make your monorepo feel small with Git’s sparse index”Submitted The Rust module system for Python users as a story · 33 points
HN discussion> So jj calls commits "changes", and this is less confusing? Sort of. It has both changes and commits, actually. (and sometimes commits are called revisions.) jj log @ muzrswxs steve@steveklabnik.com 2025-02-12 10:23:11 85b41b31 │ (empty) (no description set) ○ wotxrwpp steve@steveklabnik.com 2025-02-12 10:23:09 24ce0a16 │ (empty) (no description set) ○ ztxxskuu steve@steveklabnik.com 2025-02-11 18:20:56 1b3e12ac │…
Comment linking /patch-terminology/
on “JJ Cheat Sheet”Submitted Lightning-fast rebases with `Git move` as a story · 4 points
HN discussionI think the crux is that any complex data structure f1 using glyphs would not need to be updated explicitly in an imperative program through a function like updateFontInGlyph; the runtime would do it as part of its semantics. Of course that's a double-edged sword, as you may get undesired side effects as well as the desired ones like this. There are ways to achieve such "automatic updating" of items in a functional…
Comment linking /monotonicity/
on “Two Vexing Problems in Functional Programming”Submitted Half my work is adding a cache as a story · 3 points
HN discussionI use Z for plurals exclusively; that's one common system. You might be interested in my post: https://blog.waleedkhan.name/my-steno-system/#orthography For homophones, I use a different vowel (OEU = oi, the least used vowel sound; AE is an extra vowel sound not representing anything). For proper vs common names, i often duplicate the stroke (e.g. MAT = "mat", MAT/MAT = "Matt").
Comment linking /my-steno-system/
on “Plover is a free, open-source stenography engine”Submitted "Will I ever use this in the real world?" as a story · 3 points
HN discussionHere is a blog post I wrote on the topic https://blog.waleedkhan.name/getting-a-job-in-pl/
Comment linking /getting-a-job-in-pl/
on “Ask HN: How to get a job as a compiler engineer?”Submitted Automatically detecting and replying to recruiter spam as a story · 3 points
HN discussionJust gave a talk about this: https://blog.waleedkhan.name/what-if-sql-were-good/ - Recommend Ascent (Rust only, but supports targeting WASM) - Soufflé: good, but too hard to integrate into existing systems; lots of ergonomic problems in comparison to Ascent (can elaborate) - CozoDB: really cool but seems to be abandoned - Logica: have not tried it yet
Comment linking /what-if-sql-were-good/
on “Optimizing Datalog for the GPU”Submitted Incrementally porting a small Python project to Rust as a story · 3 points
HN discussionFor more info, here are some git-branchless write-ups on the topics: - https://blog.waleedkhan.name/git-undo/ — has a link to this article explaining some things that can't be undone in the Git model via reflog: https://github.com/arxanas/git-branchless/wiki/Architecture#... - https://blog.waleedkhan.name/in-memory-rebases/ — It's non-trivial to support workflows like "rebase just commit X out of its branch and inse…
Comment linking /bringing-revsets-to-git/
on “Ask HN: Git Alternatives – Sapling vs. Jj”Submitted Incrementally porting a small Python project to Rust as a story · 3 points
HN discussionOne thing I discovered while trying to improve my incremental Rust compilation time ( https://blog.waleedkhan.name/rust-incremental-test-times/ ) was that there was a lot of time that seems to have been attributable to `cargo` itself ( https://lobste.rs/s/ktyp2q/improving_incremental_test_times_... ), rather than the compiler. It seems like a similar situation as reported in the article.
Comment linking /rust-incremental-test-times/
on “How fast does Java compile?”Submitted The USB-C Dream as a story · 3 points
HN discussionYou want to rewrite each commit snapshot in isolation? Like fix the formatting for each? Sounds like `git test fix` from git-branchless. https://blog.waleedkhan.name/formatting-a-commit-stack/
Comment linking /formatting-a-commit-stack/
on “I'm daily driving Jujutsu, and maybe you should too”Submitted Half my work is adding a cache as a story · 2 points
HN discussionRecruiter emails are so generic that you can do this automatically! https://blog.waleedkhan.name/detect-recruiter-spam/ It's actually saved me a lot of time and led to several high-quality conversations with recruiters since then, which I would have missed out on otherwise.
Comment linking /detect-recruiter-spam/
on “Pay transparency: which states have laws and do they work?”Submitted "Will I ever use this in the real world?" (2016) as a story · 2 points
HN discussionIMO git would be way better with different naming and some UX improvements. Like a git undo[1] command, or renaming git reflog (git usage or git cmdlog), git blame (git author), and so on. Also stuff like the index, while great for experienced developers, leads to a lot of confusion early on. I'd love a command pallet where you could search for basic behavior in plain text like "reset my branch to GitHub's copy" or…
Comment linking /git-undo/
on “Show HN: Gut – An easy-to-use CLI for Git”Submitted Git undo: We can do better as a story · 2 points
HN discussion