TL;DR

A useful project change log answers three questions:

  • Whether it is critical to update
  • Whether the release is backwards compatible
  • What has changed and why

A change log that covers these three points will help your users adopt new versions faster, even in some of the most conservative corporate environments. It will also make the ops people respect your project more.

Before We Start

Back in April we described some of the things we think make an open source project awesome.

That blog post got a lot of positive responses. Today we will dig a little deeper in one aspect of maintaining a project: writing a good change log.

Before we start, let’s remind a rule of thumb you can use with anything related to open source:

Don’t make your users mad

also known as

Don’t make your users want to break the computer

Bro, Do You Event Change log?

Besides documentation, which often takes a fairly substential amount of effort to write well and edit, a good change log is (in our opinion) the second most important thing that earns you credibility in your users’ eyes.

Unfortunately, the majority of open source projects on GitHub do not have a change log at all.

How To Write a Good Change Log

Before we talk about how to maintain a good change log, let’s define “good”. Good for a change log means informative. What kind of information a user is looking for when she is looking to upgrade? This will vary from person to person, but it likely includes a few things:

  • Is this release critical? Should I upgrade immediately or can it wait?
  • Is this release backwards compatible? Should I expect things to just work?
  • What has changed? Why? How can I use the new stuff?

All of these are very important for ops people, because when stuff breaks, they get woken up late at night. But a good change log is not written with just developers or just ops engineers in mind, it caters to both.

What Ops Care About

Like we’ve mentioned earlier, if an upgrade cases an outage, some people may be woken up at night. If that happens more than once thanks to your project, you can be damn sure that they will push for one of two things:

  • That your project is not upgraded for as long as possible
  • That your project is avoided altogether

As a maintainer, these are some of the worst things that can happen. So mess with ops people at your own risk. It won’t take hours to make them confident about upgrading, though. All you need to do is to make it clear if the release has any breaking changes.

It’s OK for your project to have breaking changes every once in a while. Just make it very clear in the announcement and change log when it happens.

Then mention if it is a critical upgrade or not. Using semantic versioning will help with this (major versions are rarely critical but point releases may fix critical bugs or security issues).

In some cases, a bug that you fix affects a lot of people. That should be well reflected, too. In other cases it affects a tiny minority, people who run a certain OpenBSD version on a rarely used hardware architecture, or a specific patch release of a runtime. In such cases, mentioning that the issue only affects such and such environments is a good idea as it will make everybody else upgrade quicker.

A common case of major breaking changes that primarily concern ops is when you drop support for a particular runtime version. For example, we’ve started phasing our support for Clojure 1.3 for our projects last month. Not mentioning such changes is basically stabbing your users in the back.

Example 1

Langohr 1.5 change log explicitly states that Clojure 1.3 is no longer supported:

Example 2

For Cassaforte 1.0.0-rc4 we decided we really need to move some code around between namespaces. It sucked to break the API at such a late stage but it was still in pre-1.0 days so we decided to do it. We knew Cassaforte already had a few users, so we mentioned the breaking changes in bold in the first line of the change log for that release:

Example 3

We don’t always mention whether everyone should upgrade in change logs for ClojureWerkz projects but I (@michaelklishin) try to do so for my other projects. We also mention this in release announcements.

In any case, if you know what group of users may be affected, mentioning that will earn you bonus points.

Summary

As you can see, it does not take much effort to make it very clear that there are breaking changes in a release. In fact, it often takes a single line of text. You can write that in a fraction of the time it takes you to skim Hacker News front page. No excuses.

What Developers Care About

Developers need a little more information from change logs. Sure, it’s just as important for them to know if there are breaking changes. But developers are more concerned with what new features were introduced.

It’s not sufficient, however, to just mention that there is a new feature X available in the release. You need to make it easy to understand how to use it. This means that documentation needs to be reasonably up-to-date and that you need to provide some examples in the change log itself.

Below are some example from Monger, Langohr and other projects of ours.

Example 1

Example 2

Example 3

How Not To Write a Change Log

Every once in a while you find a project that has ChangeLog.md in the repo that basically says “see git log for change log”.

Unless you write amazingly detailed commit messages and very carefully merge topic branches, that is not a change log. That is a “screw you, figure it out, I don’t owe you anything” thrown to your users. Don’t be that guy.

Final Thoughts

As you can see, it does not take a lot of effort to go from a useless change log to something that will help your users and, in turn, your project adoption.

Michael.