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.