BackgroundMost 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:
- Feature deployed into server, but product team and sales team are not ready for end users to use yet.
- Some features will only bring value into certain group of customers and not bring any value to other group of customers
- Some features are designed for working with certain user group but not for others yet. Release into everyone will cause
- 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 DeploymentFirst way that I can thought of will be separate release from deployment. There are few pratices out there:
- Feature Flipping/Toggling
- Early Access Program
- Any other you are using?
Feature Flipping/TogglingWith 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 ProgramThere 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 deploymentWith 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