10 February 2001
2 January 2002
I give each release a major number, a minor number, a stage, an iteration number, and a feature-set name. For example, "2.4 alpha 3 (rectangular)", or "2.4a3" for short, or "rectangular alpha 3" for memorability. The major and minor number (or the name) indicate a particular predetermined set of features.
I usually like to have some sort of theme to the names, to make versions even more memorable. Ideally, the names of minor releases are somehow specializations of their corresponding major-release names. I usually don't name iterations, since what I'm really naming is a feature set (and it can be hard to maintain continuity over a long succession of hierarchical names :).
I start major numbers at one and minor numbers at zero. The stage can be one of four things:
I give each patch a release version, the stage "delta", and an iteration number. For example, "2.3 alpha 3 delta 4", or "2.3a3d4" for short. The release mentioned is the most recent one in which the patch applies. If a newer release comes out and a patch still applies, I'll release a new patch with the appropriate new name, including the same iteration number, and the same content. For example, given patch 2.3a3d4 and the subsequent release of 2.3b1, I'd create patch 2.3b1d4. Patch iteration numbers start over with each new major or minor release.
A patch usually conveys a fix (as opposed to a feature). Ideally, final releases aren't patched, but they sometimes are. I never patch a final release with a feature; I just make a new major or minor release. I usually don't patch a final release with a fix either, since there's usually an impending major or minor release with new features that convey an appropriate fix.