Software reuse (or the lack thereof)

People outside software often think reuse is easy and common. Copying things on a computer is so simple that it must be same for writing software.

People inside software know the often ugly truth: most of the time it’s easier to redo the thing and write your own bespoke code in a way that fits well with what you already have.

To explain this to folks who don’t understand why, I usually end up talking about how very often the integration of a thing with your existing system is the hard part to do right, not getting the computer to just do the thing in isolation. Code is easy, systems are hard.

The lack of re-use is especially true for applications (because they’re systems) but much less true for libraries and frameworks (because they’re code in isolation).

Sometimes that explanation isn’t good enough though, and I wonder about alternatives. Recently I’ve pondered a comparison to clothes:

When you go shopping for clothes, you can select from many items with the same function—let’s say pants—but in different sizes, colors, and styles. Some sorts of software is the same way—like web frameworks, databases, or dashboard tools—you can select it off the shelf based on your needs and preferences and start using it immediately.

But other sorts of software—most software—is more like one-size-fits-all pants. They might get the job done in a pinch, but for most people they will fit terribly if at all and be horrendously uncomfortable. One-size-fits-none.

If most clothing were one-size-fits-all, you might start to seriously consider sewing more of your own garments. Open source or expensive vendor solutions give you the option of investing in extensive tailoring instead of fabrication, but often that turns out to be at least as much work for a less perfect fit and someone else’s quirky patterns that you may not quite understand.

The grand allure of bespoke software is it can fit just right.