Open source maintainers with little time and changes

September 18, 2024

'Unmaintained' open source code represents a huge amount of value, value that shouldn't and can't be summarily ignored when considering issues like language backward compatibility. Some of that code is more or less unmaintained, but some of it is maintained by people spending a bit of time working on things to keep projects going. It is perhaps tempting to say that such semi-maintained projects should deal with language updates and so on. I maintain that this is wrong.

These people keeping the lights on in these projects often have limited amounts of time that they either can or will spend on their projects. They don't owe the C standard or anyone else any amount of that time, not even if the C standard people think it should be small and insignificant and easy. Outside backward incompatible changes (in anything) that force these people to spend their limited time keeping up (or force them to spend more time) are at the least kind of rude.

(Such changes are also potentially ineffective or dangerous, in that they push people towards not updating at all and locking themselves to old compilers, old compiler settings, old library and package versions, and so on. Or abandoning the project entirely because it's too much work.)

Of course this applies to more than just backward incompatible language changes; especially it applies to API changes. Both language and API changes force project maintainers into a Red Queen's Race, where their effort doesn't improve their project, it just keeps it working. Does this mean that you can never change languages or APIs in ways that break backward compatibility? Obviously not, but it does mean that you should make sure that the change is worth the cost, and the more used your language or API is, the higher the cost. C is an extremely widely used language, so the cost of any break with backward compatibility in it (including in the C standard library) is quite high.

The corollary of this for maintainers is that if you want your project to not require much of your time, you can't depend on APIs that are prone to backward incompatible changes. Unfortunately this may limit the features you can provide or the languages that you want to use (depending not just on the rate of change in the language itself but also in the libraries that the language will force you to use).

(For example, as a pragmatic thing I would rather write a low maintenance TLS using program in Go than in anything else right now, because the Go TLS package is part of the core Go library and is covered by the Go 1 compatibility guarantee. C and C++ may be pretty stable languages and less likely to change than Go, but OpenSSL's API is not.)


Comments on this page:

By Opk at 2024-09-19 14:08:38:

As someone who does maintain an old C open source project, I care more about what features can be relied upon to work than whatever new features the C standards committee might specify. There are still users on AIX, HP/UX and Solaris and unfortunately those are neither going away nor being updated to support new features.

C at least has the advantage of not changing too much. Just by existing, C++ probably helped to prevent people from adding bloat to C. C++ really isn't that stable any more: in my day job I'm supposed to maintain a huge C++ codebase but have long since ceased to have much understanding of the latest additions. I wish they'd concentrate on C++'s strengths instead of trying to chase after Rust. Modules would require a big reworking of the build system so that's not going to happen. So if they want some new component adding, I'll probably see if they'll let me use something like Go or Rust. A broader standard library might also help.

Written on 18 September 2024.
« My "time to full crawl" (vague) metric
OpenBSD versus FreeBSD pf.conf syntax for address translation rules »

Page tools: View Source, View Normal.
Search:
Login: Password:

Last modified: Wed Sep 18 23:02:01 2024
This dinky wiki is brought to you by the Insane Hackers Guild, Python sub-branch.