Optimising for Iteration

Mark Zuckerberg in front of a Move Fast poster

Late last year I left Facebook, but I still like to follow what’s happening inside the company’s multicoloured walls. So last week I watched with interest with Mark Zuckerberg laid out a long-term vision for Facebook that focused on building meaningful communities and influencing the real world.

This plan seems to be both a reaction to the US election and resulting political drama, and an attempt to capitalise on the more serious tone that Facebook discussions can take compared to networks like Instagram and Snapchat.

Whether this approach will work as a product is an open question. It might take Facebook some time to get right. But they have repeatedly shown a willingness to push an idea until it either runs out of steam or takes flight. Even successful products like Messenger or Ads have seen years of continual iteration.

Technology choices that matter

It’s tempting to chalk up Facebook’s ability to to ship products quickly to the company’s size. And of course a lot of engineers can write a lot of code. But the Mythical Man-Month has remained a cliche in our industry for a good reason: it’s easy to drown in the overhead of communication and technical debt.

Facebook has remained nimble despite it’s size, not because of it. And this nimbleness has required deliberate cultural and technical choices. Many of these choices — like monorepos, or a reluctance to ditch PHP — are at odds with industry best practices, but have been the right call for a company optimising for speed.

Homogenous tech stack

Shipping a product at Facebook is as simple as committing JavaScript and PHP files to a monorepo. Engineers don’t have to worry about setting up continuous integration, hosting, deployment, configuring databases, or caching layers. These common elements are already built and are well maintained. Engineers just only to worry about building the unique parts of their product, and when they change teams they can reuse their knowledge on different products.

Continuous, gradual, code improvement

A homogenous stack doesn’t have to mean a static one. Engineers at Facebook often use automated codemod tools to update all the consumers of an abstraction as it changes. This drops the incremental cost of maintaining additional products close to zero.

Small, flexible primitives

The common abstractions that are available to engineers are fine grained and can be composed in novel ways. The prototype for Timeline was built in a single night by reusing existing abstractions.

Many mature products are backed by standalone services, like a fast index for Search, or custom storage systems for Messenger. But even for these products the business logic lives primarily in the PHP codebase, and can be changed with relative ease.

Focusing on impact, not the code

Each organisation, and even the company as a whole, has an overarching goal and set of metrics that use to guide their work. Shipping a project means nothing if it doesn’t make the product and corresponding metrics better.

Teams are steered away from thinking something is “done” when the initial release is ready to roll. Facebook Search took years to get to two billion daily searches after the launch of Graph Search. They got there by improving the product in response to user feedback instead of doubling down on the original product vision.


Being able to quickly iterate on products is just one quality that defines a code base. Other organisations might prioritise performance, or code size, or stability. But the important thing is to choose something that fits the needs of that organisation. Optimising for the wrong dimension can lead to wasted effort, or even worse, hurt the products they build.

When working with a new code base I like to ask myself how the abstractions and team structures facilitate iteration. Could we build and ship a project without spinning up a new project and team? Does the code we write today becomes an asset or a liability in the future? And how could we reduce the number of cross team interactions that have to happen to ship a product? Often with a little careful planning we can leave our future selves in a much better state.

Image credit: Mike Deerkoski

Jumping On the Bandwagon

Nokia and Microsoft’s deal has been getting a lot of press in the last week. Nokia Plan B (which has now been revealed as a hoax) got a lot of attention on Hacker News and spawned a bunch of knock offs which I was taking a look through on my morning train ride. By the time I’d got to work I’d decided to contribute my own poor sense of humour to the mix and set off on the quickest web page launch I’d ever done. The result was Nokia Plan XP which was put together in the time it usually takes me to get my morning coffee. Read more.

Inheritance and Mootools Mixins

I was playing with Mootools’ Class implementation today. It has a few nice features like mixins, easy inheritance and sane parent method calling. I did run into issues combining mixins (through the Implements keyword) with parent method calling. The following code fails with the message: The method “setOptions” has no parent. Read more.

Top trends of 2011

Brightlabs, my employer, regularly publishes a web-focused newsletter for small businesses called enlighten. The latest edition contains and article I wrote detailing “Five trends that will change the web in 2011“.

The web ceased long ago of being a mere tool for sharing text documents. Images, sound and interactivity via JavaScript have all shifted the web towards the multimedia future we have long been promised. At the same time the iPhone and its App Store have raised consumers expectations of what their web enabled devices are capable of. Web developers are striving to meet these new expectations and are taking their lead from the desktop to create more interactive web applications.

Read the article on Brightlabs.

Twitter will eat your URLs

My HTML periodic table has been getting a lot of attention on Twitter over the last few days. Because the page has a relatively short URL a lot of people have been tweeting the actual URL rather that using a URL shortening service. This has been good for me because shorteners remove the HTTP referrer and stop me from seeing where my Twitter traffic comes from.

A peek at my error logs did reveal one potential problem though. I’ve had well over a thousand hits to invalid URLs like http://joshduck.com/perio. These are obviously URLs which have run up against Twitter’s infamous 140 character limit and have been truncated. This results in wasted traffic for me and a waste of time for my visitors so I decided to push a quick fix. Read more.

A PHP snippet for pluralizing strings

Every time I’m working on CRUD applications it seems like a lot of boilerplate code goes towards displaying appropriate messages when lists can contain zero, one or more than one element. I put together a quick function to speed up the process.

The function takes a string with string fragments marked up inline as its main argument. It then formats the output based on the count passed into the function. Read more.

An introduction to PHP’s static scoping

The static keyword is a core feature of PHP’s object oriented programming. Unfortunately, there doesn’t seem to be much in the way of easy introductions available online, so I’d like to give a brief overview of how the keyword functions, and how it should be used.

PHP actually has two distinct uses for the static keyword. The first and most common usage is related class method and property scoping, the second to variable scoping within in a single function. Read more.

Includes are not functions

Over the last week I’ve been working with a commercial PHP eCommerce package. Amongst some shockingly bad code one of the patterns that has stood out has been the use of includes a kind of pseudo-function. Dozens of files in the application are in the following format. Read more.

Dynamically define subdomains with Apache

When I need to develop multiple sites at once I often find defining multiple Apache Vhosts and host files entries to be time consuming. Thankfully, with a little Apache magic it’s possible to automatically create a new subdomain for each project I start. Read more.

Fix your tables: how to stop cells from expanding out of control

HTML tables receive a bit of a bad rap thanks to years of abuse in web design, however in reality they’re semantic as the next element. They do have their quirks though, one common problem is that instead of aligning themselves like the rigid blocks we’re used to they tend to be a bit more fluid – expanding and contracting to fit their content.

This useful behaviour can become frustrating when a carefully laid-out table encounters abnormal input and suddenly decides to stop paying attention to the cell widths we’ve specified. Luckily there is a simple solution to this. All the major browsers implement an alternative fixed table layout which is specified through the appropriately named table-layout CSS property. Read more.