February 28, 2012

Software Wood Bridges

At MegaPhone and USER1, as at any startup, we build a lot of prototypes. In fact, arguably everything we build is a prototype. In our early days, we churned through a lot of prototype terminology--everything from "one-off" and "test" to "demo," "study," "duct tape," "simplest thing that works," "minimum viable product," "proof of concept," "hack," "quick fix," and "mock-up".

But those terms never gave us the cohesive mental framework we needed in our software-design discussions. For any given project, feature, or fix, we needed a way to quickly and accurately express varying degrees of polish, complexity, and development time. So we came up with a metaphor: wood bridges.

Imagine a river. You're on one side, and you've got a hunch there's something interesting, useful, or valuable on the other side. How do you get across?

The Raft

A raft is the quickest way across the river. Rafts can be built by one or two people, and carry only a few passengers. They're fragile and dangerous, break down after only a few weeks or months, and require lots of manual labour to maintain and use. But despite those shortcomings, rafts get you to your goal quickly. They let you survey what's on the other side of the river so you can validate your hunches. If what you find looks good enough, you can invest in a wood bridge.

The Wood Bridge

A wood bridge takes longer to build than a raft, but it lets many more people cross the river with little or no manual intervention. Under a light enough load, a wood bridge can support regular traffic for months or even years. Yet its structure has a limited capacity: one heavy truck or millions of cars can break a wood bridge.

The Steel Bridge

A steel bridge takes the longest to build, and is the strongest bridge available. Steel bridges are extremely stable and can handle huge scale. They normally take a whole team to architect, engineer, and produce, and they have ongoing, permanent maintenance costs. Due to the high development investment, a steel bridge should be built only when lots of people clearly want to cross the river.

Everything In Between

Naturally, not every software project fits neatly into one of the three preceding categories. For us, more granularity seems to arise naturally in conversation. We talk about "balsa wood bridges", "popsicle stick bridges", and "ferries" (big rafts). We bend the metaphor to our needs.

Progress

Beyond expressing a given degree of polish, complexity, and development time, the wood-bridge metaphor lets us capture another key aspect of our software-development process: incremental improvement. There's a natural implied progression from raft, to wood bridge, to steel bridge. And even if you only ever build the raft, the potential to build the steel bridge is embodied in it. The raft carries the vision of the steel bridge across the river.

The wood-bridge metaphor also describes how committed the builder should be to craftmanship. Generally speaking, when you're done with a raft, you don't mind throwing it away. Rafts can be considered disposable; the code and craftsmanship are less important than finding out what's on the other side of the river.

Wood bridges, on the other hand, often serve as scaffolding for steel bridges, and can therefore be elegant in their own right. In many cases, plenty of wood is left even after a steel upgrade. Facebook, for example, started as a PHP wood bridge and later upgraded to C++ steel in the form of HipHop, a PHP-to-C++ transcompiler. The Facebook wood (PHP) and steel (C++/machine code) co-exist to this day. Twitter similarly started as a Ruby on Rails wood bridge that was partially upgraded to a Scala steel bridge. Wood bridges should have better craftsmanship than rafts.

These are not new concepts. Building something that meets an immediate set of needs with the expectation of upgrading in the future is a well known practice. The wood-bridge metaphor just lets our team agree on expectations and intent early and quickly. The metaphor also comforts our engineering hearts because it encompasses the opportunity to revise, reform, and enhance in the future.

An Example

The wood-bridge metaphor can be applied to any level of specificity in a software project.

An unoptimized loop is a wood bridge. Zynga moving a game from Amazon EC2 to its own data centers is a wood bridge being replaced by a steel bridge. There's a wood bridge example in every project you build. But for reference, here's a canonical example of the metaphor:

Imagine you want to sell fireworks online. As a raft, you put up a website with a phone number on it. You answer the phone yourself, deliver orders personally within your own town, and accept cash on delivery. Eventually, you get so many orders that you can't deliver them all alone. The raft, now broken, proved your hunch was right: lots of people want to buy fireworks online. It's time to build a wood bridge. You put up a PayPal form and hire a driver. Orders increase again. There's clearly a huge market opportunity, but to serve more users you need better infrastructure. Time for a steel bridge. You sign up for a Yahoo! Merchant account, set up a shopping cart, and hire a courier service to ship nation-wide. Bring on the masses.

Interestingly, depending on your perspective, your Yahoo! Merchant steel bridge might actually be a wood bridge to your next goal. You might outgrow it eventually and run your own ecommerce system in house. Yahoo! becomes the wood bridge; your own ecommerce system is the new steel bridge. That's expected. The wood-bridge metaphor is always a relative statement. The type of bridge describes a current position on the evolutionary path of your software. It tells your team what kind of investment you're making today, relative to yesterday and tomorrow.

Learn to Love Wood

At MegaPhone, we have only a few steel bridges in our technology stack. Most of our technology settles in at wood bridge status, waiting to prove itself worthy of a steel upgrade. I think a startup needs a culture that appreciates the beauty of wood bridges. Dream of steel bridges, but learn to love wood. It's easier to build with, pull apart, repurpose, demolish, repair, and revise. And it gets you across a lot more rivers.


Posted by moock at 11:17 PM