30/10/2012

Separate Deployment and Release for Web Applications

Background

Most organization has treated deployment as release. Of course, there are many advantages doing that. Like, it is easier to maintain and manage. And it will be very efficient for small team when one feature delivery requires time. So when new version get deployed into server, everyone will see the changes.

But when team grows, it becomes biggest problem if we still want to delivery features to customers as early as possible. There are few problems as my discovery:

  1. Feature deployed into server, but product team and sales team are not ready for end users to use yet.
  2. Some features will only bring value into certain group of customers and not bring any value to other group of customers
  3.  Some features are designed for working with certain user group but not for others yet. Release into everyone will cause
  4. Frequent change of user inteface are note acceptable to most customer although it will be liked by most of customers

What we do

Separate Release from Deployment

First way that I can thought of will be separate release from deployment. There are few pratices out there:

  1. Feature Flipping/Toggling
  2. Early Access Program
  3. Any other you are using? 
Do you have any ideas how to make it better? There must be some very good idea out there. Please let me know so that I can compare features.

Feature Flipping/Toggling

With feature flipping/toggling, you will single version of software but be able to allow certain user group to see new features like evanglist, trial users, users from certain region or country using GeoIP, users with certain behaviors.

It is easy to manage source code. But it is very hard to keep all software engineers to use feature flipping properly. If not, the code grows into a big mess. 

Early Access Program

There will be different version of software installed on server. Some users can be configured to access to newest version/some version of software.  It is hard to manage bugs found or some urgent feature needs to be in production.

The advantage of this is that you don't need to worry too much problems may be caused by feature flipping (architecture design and clean up of flags)

Why we will separate release from deployment

With separating release from deployment, we can
  • Minimize impact while doing deployment 
  • Minimize risk for deployment and release
  • Support continuous deployment without degrade too much of user experience because of frequent change
  • Customer can get feature as early as possible
  • A very good communication channel between customers and engineers
  • We still deliver much better product to most end user after some iterations with user feedback

Side Note

In both solution that I have found,  my feel is that most important part is to keep communication channel wide open between engineers and customers. The communication channel should be easily accessible for both engineers and customers.  Only with that, your team can be Agile.