There are a number of great features that I want to use in iOS 4 and 5, and
compatibility with iOS 3.1.3 is starting to become an expensive burden. My
code is quickly filling with special cases and duplicate implementations, and
this will hinder Instapaper’s feature development, maintenance, and stability
until I can eliminate 3.1.3 compatibility. My quality assurance would also
improve since my testing-device count would be greatly reduced.

Deleting old code liberates you even though it hurts backward
compatibility. Between Java’s well-known cling to their old APIs and
Ruby’s, “let’s change this huge feature in a 0.1 update!”, it’s tough to find
the right balance. Marco is in a good position because he knows that only 0.48%
of his customers still run iOS 3.x.

Supporting older customers is important, but software is a living ecosystem.
Platforms, standards and systems keep evolving because we’ve not come anywhere
close to exhausting the possibilities of our technology. Bearing the burden of
legacy support is important up to a point. But ultimately, your code will grow
cancerous if there are too many if/else clauses to handle old cases.

Apple makes no apologies for abandoning old code and technologies. As I’ve
said before, I think it’s one of their greatest competitive
advantages.