On the topic of revision control. A promising thing I've been
experimenting with is thinking and building across the three layers we
use to compose systems: version control, package managers, build systems.
Starting with the public monorepo which basically includes all of Linux
(Nixpkgs), I overlay a monorepo of my own packages. Then I keep my
packages very fine grained, so I can blur the distinction between a
package manager (like Apt) and a builder (like Make). You end up with
something like Make, but everything in your revisions can depend, in a
compositional way, on older revisions. This helps decouple changes.
If you think about it, both your package manager and your builder can
manage dependencies and build projects, but only the package manager can
deal with multiple revisions, and only the builder does fine grained
dependencies. This is just an accident of history.