It should be no secret now that I have written an implementation of dc
and
POSIX bc
. What is definitely a secret is the fact that I do not actively
work on it anymore.
Just because I don’t actively work on it doesn’t mean I don’t maintain it. I do. Whenever a bug report comes in, I fix the bug and release a new version. I just don’t do active development anymore.
This may or may not come as a surprise, but it is intentional because I believe that programmers should try to “finish” software.
What I mean by “finishing” software is that when a piece of software is at a point where it covers the use cases of the intended user(s), it should be considered finished, and active development should cease.
For some kinds of software, that’s not really possible. For example, the Linux
kernel needs to keep updating drivers. But for something like a bc
or dc
, it
is simple.
But why? Why would I stop?
If I kept going, bc
would only grow in size, and it is commonly accepted that
the more lines of code, the more bugs there will be. (See these blog posts by
Steve Yegge, Jeff Atwood, and Dan Mayer.) Even when assuming
(rightly) that complexity is the real cause of bugs, a bigger piece of
software is going to be more complex, as the interactions between individual
lines of code increases. So if I kept working on bc
, it would only get
bigger and buggier.
However, if I finish bc
and stop active development while maintaining it, it
gets to stay as perfect as I can make it.
And that is why I try to finish software.