6
Release early, release often – plan your release cycle well
No comments · Posted by patrick.c in Talk posts
Finding your perfect release cycle
Most projects have a “on demand” release plan. When security problems occur or a stable application has been build, then a release is quickly announced and put online. This is ok as long as it is a smaller project. Especially when your project is used in a business environment, people will ask for plans and schedules so they can plan their updates. Another problem with irregular release schedules is that when the last release has been a long time ago, then people might get impatient and start to use your daily development exports or use a checkout from the version control system, that you are using (I hope). The problem is that the impatient users will lead to more and more support requests, because they are using a version that is not released yet.
So what to do? Communicate your plans early. People like to be informed. When your plan for the next release does not take the expected 6 months and after 2 years you’re not ready, then you should consider to change your plans and try to do intermediate releases. When you are planning big changes, then it’s a good idea to check if you can split your changes into smaller pieces to keep the time between releases smaller.
When you have enough time to dedicate for the project or you have a group of people that helps you to have a more or less constant stream of changes then you might consider to establish a regular release cycle like for example gnome or ubuntu (they release every 6 months). Sometimes it’s easier to determine the changes that fit in a release cycle than to determine how long a set of changes will take. The advantage is that you might even skip some changes when time is running short.
Presumably dead projects
As mentioned above, sometimes changes take longer than expected. The planned release takes a year or two longer and you’ve pulished none or just a few intermediate bugfix of feature releases. The effect is that your userbase might shrink, people start complaining, maybe even start a fork to return to a steady release cycles with more releases per year. There is also an effect on the team. Maybe not your whole team is involved in the blocking task(-s) that lead to the delayed release. They want to continue, but their tasks might not be ready when the current blockers are finished, so they are asked to wait to not destabilize the code base even more. That leads to frustration even in your team and may damage the team on the long run.
How to deal with complex changes
So there are changes that are small and medium sized and of course the big tasks that take virtually ages. How should you deal with that? No matter how good you plan there were always tasks that have a high probability to break your release plans. To solve this you can use techniques that are commonly used in “commercial” software development: feature branches!
Every version control system that I know of has the ability to copy a repository or a part of it (this is called branching) and there is another functionality called merging where you can merge the changes of one branch in the other branch and solve any conflicts where the same code lines have been changed. I don’t want to go too much into detail here, because it depends on the software you are using, but when you use this for any non trivial changes in your project, then it’s not a big deal when you are used to it.
So, how does this work? You have a main development branch which is usually called “trunk”. You plan for example to refactor a part of the system, then you branch the trunk and work on that branch on your refactoring. The rest of the team can do for example smaller changes or bugfixes on the trunk or even other feature branches. When you like you can pull changes from the trunk in your branch if you feel that this is necessary. When you’re done, then you can merge your branch back into the trunk and your project has a shiny new feature or a cleaner codebase. The downside of this is that, when you have changed parts of the code and in the trunk people changed the same code pieces, then the version control system will complain and mark the file as conflicting. These conflicts have to be resolved manually. This happens in my experience not very often and when it happens it’s trivial to merge the changes and get the code running again. The chance of conflicts grows over time, when work is done in the trunk and the branch, but by pulling updates from the trunk in the branch you can minimize the chance of conflicts.
People often complain that this is too complex, they don’t know hot to do the branching and merging and they don’t believe in this anyway. Where does this come from? I think the answer is simple. When you don’t do branches, then you’re not “wasting” your time at the start by performing the branches and later when the merging occurs. But they don’t see the big picture. Development gets even easier when you do when you do this. You get used to branching and merging pretty soon and it’s not something you have to think a lot about. Everyone can develop their features without interfering too much with the rest of the team and when a feature is not ready when the planned release date approaches you can simply move it to the next release. So the whole team benefits from it, don’t get intimidated by some devs that are complaining. They’ll get use to it. ;-)
Condclusion
So, what have we learned here? Release plans are only as good as the techniques, you use to stick to them and purely code driven release schedules tend to get blown away by too complex tasks that have been underestimated. Use things like branching and/or discipline to establish a regular release schedule or at least be predictable and communicate your plans to give your users a chance to react, plan and look forward to your releases.
early-phase · introduction · release-planning · talk
No comments yet.
Leave a Reply
<< Numbers are nothing but smoke and mirrors – selecting a version numbering scheme
