As I approach my 10th year as a software professional, one of the things that frustrates me the most about our industry is the way in which people chronically overestimate the uniqueness of the problems they’re facing, and the frequency with which wheels are reinvented.

Designers, developers, and managers all have a habit of approaching common problems as if they’re the first one to do so. There’s an expression about “standing on the shoulders of giants.” We’re not all giants, and not all of our problems require herculean efforts.

Begin rant…

Your UI problem is not unique

I think the most common and ultimately harmful way this manifests is in user interface design.

Reinvention at the UI level is particularly insidious, as it doesn’t just waste the time and money of the team developing the software, but it confuses users (and we’re ultimately doing this for them, right? Right?)

I’ve witnessed bored designers coming up with the most elaborate one-off UI components to show a list of items or tabular data as if that’s a unique thing to do. Your typical line-of-business web app is not going to succeed or fail based upon the clever, innovative concept you’ve invented for showing a list of items to a user.

The thing is for the 99%, familiarity trumps cleverness. Every UI element that has to be explained-- especially when you could have swapped in one that people already know and accomplishes the same purpose—is one check against you and your product.

For example, I can’t tell you how many hours I’ve spent on teams debating the look and feel of the primary navigation for a web app. Grab a copy of Don’t Make Me Think, read the chapter on navigation, do what it says, and then move onto more pressing issues. You’re doing a big disservice to your users if you don’t copy the familiar style of navigation that your users have gotten used to on popular websites for the last decade.

One more example: your web app is not the first one to need to notify users of events that have happened in the system. Roughly 1.4 billion people--including the people who use your web app--use Facebook and are desperately familiar with the way that Facebook handles notifications. Rip their design off as closely as you can, and move on to something that can differentiate you from your competitors.

There are good catalogs of established UI patterns out there, such as the book Designing Interfaces. Before you have a long, long, like cruelly long series of meetings and email chains, whiteboard sessions, and the like, identify the pattern that relates to your requirement, find some well-known examples of the pattern, and copy them as closely as you can. If by some fluke your unique problem has not already been solved in a nice, familiar, recognizable, warm-fuzzy to your grandma kind of way, then by all means proceed to your brainstorming session(s).

Your development problem is not unique

For developers (and this includes me), I know that working day in and day out on that accounting app is not always particularly exciting, but avoid the temptation to write your own object-relational mapper from scratch to shove ledgers in and out of your SQL database. If you want to break out of the mold and roll your own thing from scratch, choose an area where you can really make a difference.

If you really want to differentiate yourself, be the person that knows the lessons of 40 years ago rather than a person who’s obsessively implementing TodoMVC over and over in this afternoon’s hottest JavaScript framework. The former is much rarer than the latter.

I know a lot of devs are entranced by the technology for its own sake. And there’s nothing wrong with nerding out over programming languages (my personal favorite), or JavaScript frameworks, or NoSQL databases or whatever floats your boat, but it’s easy to lose sight of the bigger picture.

“Barb, I know this thing is a pain in the ass to use, because the navigation makes no sense, no thought was put into the information architecture, and we didn’t consult with one actual user before developing it, but you’ll be happy to know that we’re using Riak on the back end. You’re welcome.”

There’s an episode of The Changelog podcast that came out recently in which they interviewed DHH about the decade long history of Ruby on Rails. With his trademark bluntness, he lets loose on “unique snowflakes” in a quote that I would guess was inspired by Tyler Durden’s speech from Fight Club:

They want to believe that every single application is a unique snowflake. That they're so brilliantly unique, too. That their value comes from their careful selection of which template language, which data mapper, which whatever the hell it is...

There are lots of applications out there trying to be needlessly novel to satisfy the egos of programmers who do not want to feel like they're working in cookie-cutter domains. That they somehow attach their self-worth to how novel their application is.

That’s a little harsh—what would you expect from DHH?—but I think the point is valid. It’s all too easy to focus on the minutiae of technology when in reality, we’re in a people business. And now I quote from Peopleware, as I often do:

…the High-Tech Illusion: the widely held conviction among people who deal with any aspect of new technology (as who of us does not?) that they are in an intrinsically high-tech business. They are indulging in the illusion whenever they find themselves explaining at a cocktail party, say, that they are “in computers,” or “in telecommunications,” or “in electronic funds transfer.” The implication is that they are part of the high-tech world. Just between us, they usually aren’t. The researchers who made fundamental breakthroughs in those areas are in a high-tech business. The rest of us are appliers of their work. We use computers and other new technology components to develop our products or to organize our affairs. Because we go about this work in teams and projects and other tightly knit working groups, we are mostly in the human communication business.

Managers, you’re not helping

Project managers, stakeholders, and other people who manage software efforts are not off the hook here. You also need to be honest about the product you’re making and accept that sometimes your unique take on logo placement is not what’s going to sell your software. You folks hold the keys to the backlog and how work gets prioritized. Spend those precious developer-hours on things that matter, not reinventing the same basic features and conventions that nearly every application has in common.

What’s worth spending time on?

The way that your bread is truly buttered in 99% of applications is through insights into the business domain that come from years of domain expertise accumulating slowly.

If you want to futz with some new technology and try something new, that’s great. But be honest about what you’re doing. Most of the time you’re doing it for you, not for your users.

I wish a standard role on every software team was the “That Thing’s Already Been Invented” Czar. Or “Code Historian” or “User Experience Historian”. Now that person would be worth their weight in gold.

Instead of Not Invented Here (NIH), how about Proudly Found Elsewhere (PFE)?

But what about innovation?

Innovation is a necessary thing and I would never suggest that people should never try anything new. If you never try anything new, the industry can never move forward.

The question of when to innovate is so context-specific. If you’re writing an early iPhone app during the wild west of that platform, by all means, try some new form of navigation. If you’re Facebook and having the (good) problem of 1 billion users hammering your database every day, by all means, invent your own database.

I think “20% time” or something similar may be a good solution. Spike some crazy idea you had or some bleeding edge tech on a pet project one day a week. If it happens to have practical implications for a product, then awesome. But it’s ok to just have some fun and learn something new. Scratch your itch--we know that’s important for its own sake.

Postscript: Why make Ruby on Rails?

It’s funny—when I started writing an outline for this post, I couldn’t stop thinking about DHH and Ruby on Rails, which I think is one of the few true game-changing innovations in the field of web development since I joined the industry. I kept thinking back to the early days of Rails’ creation and how difficult it would have been to justify such a project. It seems like such a strange case of yak shaving. Really? You need to take this weird Japanese programming language no one has heard of and write the umpteenth web framework in order to write yet another project management tool? How can you possibly justify that? What did your business partner, Jason Fried, think? You guys are the “do less” guys. What the hell?

In an interview from 2005, Fried says:

I had some natural hesitation about using Ruby at first ("What the #@!* is Ruby?" "Why don't we just use PHP--it served us well before?"), but David Heinemeier Hansson, the first engineer on the Basecamp project, cogently made the case and I bought it.

In the podcast episode I mentioned earlier, DHH also discusses his motivation while writing the code that would become Rails. It turns out that a major motivation for DHH was to remove all the wheel-reinvention that happens with each new web project. He wanted to make a “batteries included” full-stack framework that gave you sensible defaults and convention over configuration. Because it’s not necessary, for example, to invent your own naming conventions for every class and every property and how they map to the naming conventions of your database tables and columns. Because what the hell does it matter? He’ll think carefully about the problem, pick one, make it the default, and then you can move on, because you have more important things to worry about.