news
Programming Leftovers
-
Ned Batchelder ☛ Testing: exceptions and caches
Two testing-related things I found recently.
-
Martin Alderson ☛ Turns out I was wrong about TDD
I definitely used to think of myself as a TDD sceptic. While I've always seen the promise of it, in my experience it often led to codebases that were optimised to be easy to test, but not focussed on product outcomes. To be clear, for some codebases this is the correct outcome. If you're building highly critical software which has a highly defined use case (that doesn't change much), then optimising for this is the right call. Stability/reliability actually is the most important product outcome.
-
Hugues ☛ Allowlist for .gitignore
To build an allowlist, we start by ignoring everything with /**/* and then selectively adding file extensions. For a Rust project, a naive .gitignore might look like this: [...]
-
Andrew Nesbitt ☛ PkgFed: ActivityPub for Package Releases
This makes dependencies bidirectional. Right now, a lockfile points at packages, but packages don’t point back. Maintainers can see download counts but not who’s downloading. With repos as actors, packages can see their followers. The maintainer of serde could see every public project that depends on it, organized by forge, by organization, by whatever metadata the repos expose. That’s useful for prioritizing issues, understanding your user base, reaching out about breaking changes.
-
MaskRay ☛ Long branches in compilers, assemblers, and linkers
This article explores how compilers, assemblers, and linkers work together to solve the long branch problem.
• Compiler (IR to assembly): Handles branches within a function that exceed the range of conditional branch instructions
• Assembler (assembly to relocatable file): Handles branches within a section where the distance is known at assembly time
• Linker: Handles cross-section and cross-object branches discovered during final layout -
Digital Mars D ☛ Obvious Things C Should Do
Standard C undergoes regular improvements, now at C23. But there are baffling things that have not been fixed at all. The Dlang community embedded a C compiler in the D programming language compiler so it could compile C. This C compiler (aka ImportC) was built from scratch. It provided the opportunity to use modern compiler technology to fix those shortcomings. Why doesn’t Standard C fix them?
-
Mark Seeman ☛ Two regimes of Git
Git is such a versatile tool that when discussing it, interlocutors may often talk past each other. One person's use is so different from the way the next person uses it that every discussion is fraught with risk of misunderstandings. This happens to me a lot, because I use Git in two radically different ways, depending on context.
Should you rebase? Merge? Squash? Cherry-pick?
Often, being more explicit about a context can help address confusion.
I know of at least two ways of using Git that differ so much from each other that I think we may term them two different regimes. The rules I follow in one regime don't all apply in the other, and vice versa.
In this article I'll describe both regimes.
-
Griffin Bank Ltd ☛ Is It Worth It?
In a corporate setting, if you can improve an incident that affects one person, once per work day, and save one minute per event, it's worth spending up to four hours fixing that per person it affects.
-
Perl / Raku
-
Arne Sommer ☛ Uniquely Constant with Raku
-
-
R / R-Script
-
Rlang ☛ 2026-01 Variable Fonts in R Graphics
This document describes the addition of support for variable fonts in R, when rendering glyphs, plus changes to the CRAN package xdvir to take advantage of that new support, when rendering LaTeX fragments.
-
Rlang ☛ Fight Data Science in R: Proven Boxing Metrics & Models
Boxing analysis is no longer just about punch totals or “who looked busier.” Modern fight analysis is data science: repeatable pipelines, validated data, explainable models, and performance indicators that translate into strategy. This post shows how to build a professional fight data science workflow in R—from raw data to metrics, modeling, and tactical insights—using code you can adapt to your own datasets.
You’ll get: a production-style project structure, data contracts, validation checks, feature engineering patterns, round-by-round models, fatigue and momentum signals, and high-signal visualizations for coaches and analysts. The goal is to help you move from “interesting charts” to decision-grade analytics.
-
-
Java/Golang
-
Nicolas Fränkel ☛ From a JAR to a full-fledged MacOS app
A couple of years ago, I developed a small Kotlin GUI to help me rename my files in batch. I actually created it with different JVM frameworks to compare their relative merits. In any case, I didn’t use it up until last week. And then, I was surprised to see that it didn’t work to rename a network volume, although it had in the past. In this brief post, I aim to describe the issue and its solution.
-