Always Ship Trunk: Managing Change In Complex Websites by Paul Hammond (Typekit)
No rest for the wicked. More sessions to write up. Let’s find out how to do feature switches, Flickr-style. My comments are in italics.
Use revision control. Branching is sad because of merging. But Mercurial and git make it all magically delicious.
Revision control is nice but what it doesn’t answer is what is running on a given Web server.
There are three kinds of software.
- Open Source installed
- Web apps/SaaS
Web apps are not like installed apps. Revision control is meant to deal with loads of versions. With a Web app there’s about 1 version of your app in use. If you administer every computer your software is installed on, you don’t have to worry about a lot of stuff. Once you upgrade, the old code will never be run again. It has a very linear flow.
But not really. Upgrades don’t happen on every box simultaneously. And shouldn’t – best practice is rolling to a subset.
And you push to a staging/QA environment first. So suddenly you have more “installs.” And beta environments.
You have stuff (dependencies) outside your control – installed library dependencies, Web service dependencies – all that change has to be managed.
Coordinating lots of peopel working at the same time is hard.
Deep thought alert: Nobody knows you just deployed unless you tell them.
You can separate the code deployment from the launch. You can rewrite your infrastructure and keep the UI the same and no one knows.
Deep thought alert 2: You can run different versions in production at the same time.
Put it out. Ramp up usage. Different people can see different UIs and they don’t know.
What we need is a revision control system that lets up manage multiple parallel versions of the code and switch between them at runtime.
Branches don’t solve that problem for us (by themselves). And they don’t help with dependency changes that affect all branches at once – if someone changes their Web API you call, it affects every version!
revision vs version.
Manage the different versions within your application – “branching in code.” You know, if statements.
This is really dangerous if you don’t have super duper regression testing right? I’m rolling a new version but not really… Good luck on that.
This is the “switch concept.” It allows for feature testing on production servers.
Join it with cookies and you can have a “feature flip” page! You can put all kinds of private functionality into the app and rely on whatever if statement you wrote to make sure no one bad gets to it! Good Lord!
There are benefits to production testing (even if it’s not from end users) – firewall stuff, CDN stuff, et cetera. It’s very flexible. You can do dark launches. Run the code in the background and don’t display it. Now that’s clever.
There are three types of feature flags
- user facing feature development
- infrastructure development
- kill switches
They have loads of $cfg['disable_random_feature'] = false
The cost of this is complexity.
Separate your operational controls from development flags.
Be disciplined about removing unused feature flags so it’s not full of cruft.
If you’re going to do this, just go all in and always deploy trunk to every server on every deploy and manage versions with config.
Definitely daring. I wonder if it’s appropriate for more “real” workloads than “I’m uploading my pics to a free service for kicks” though.
Joel Spolsky sayeth: This is retarded.
With new style distributed merge, instead:
- Use branches for early development. Branches should be merged into trunk.
- Use flags for rollout of almost-finished code.
Is there a better alternative? Everyone who makes revision control systems makes them for installed software not Web software – what would one for installed software look like?
Q&A Tidbits: Put all the switches in one place… Not spread through the code.
What about Sarbanes/Oxley division of labor? Pshaw. This is for apps that are just for funsies.
You have to build some culture stuff to about devs not jsut hitting deploy and wandering off, but following up on production state.