Programming is deeply disappointing. We continually fail to live up to our own expectations, more so than any other form of engineering or craft. And it’s not getting much better. The lack of any substantial progress is the most disappointing thing of all. Worst of all: it is our own fault.
Most of the software and standards we use are deeply flawed. We all know it, but we accept it as a fact of life. I guess that at least half of programming effort is wasted by having to live with the accumulation of past mistakes that have become entrenched into dysfunctional standards and platforms. The problem is that it’s no one’s job to fix things. We are powerless as individuals, and we have no institutions whose job it is to fix mistakes. We need to build such institutions. But in the meantime, there is one thing we can do as individuals.
The fundamental reason that it always makes sense to live with flawed designs is that software reproduces without cost and never wears out. This is unique in human history, and we have not yet come to terms with its downside. Every other work of man has a natural lifespan that forces us to replace it regularly. Replacement is when things improve. You can incorporate new technologies and new designs. Without the steady demand for replacement, innovation languishes. This law holds true for life as well: evolution requires death.
I have therefore decided that in the future all of my software will have an expiration date. I will release it under a Darwinian License that says the software and any derivatives of it can not be used after a fixed date, except for educational and research purposes. By forcing an eventual complete rewrite, progress gets a chance. It is our duty as programmers to not let the dead hand of our own works hold back progress by those who come after.