Conventions
Versioning
Eons uses a versioning system compatible with Semantic Versioning. However, we change some of the semantics to simplify usage for real-world products.
We still use
[MAJOR].[MINOR].[PATCH] versions but they are more accurately named:
- Requirements
- Implementation
- Updates
[REQUIREMENT].[IMPLEMENTATION].[UPDATE].
A simple test to know which version number to increment is:
- Requirements - did the requirements of the project change?
- Implementation - did the tests change?
- Updates - did the design, code, or dependencies change?
Requirements
Requirements represent the purpose or "environmental niche" that the versioned product is designed for. For example, the requirement (major) version of a hammer has not been changed in a long time. Stating requirements only implies a usage and does not guarantee the product will be used for the intended purpose. For example, you could put a hammer on the edge of a table and use it to fling nails around - no one is stopping you - but that is a use case outside of the requirements that drive hammer production. It is up to managers to set requirements. Perfect management (and foresight) results in unchanging and everlasting requirements. Changing the requirements can be seen as a pivot or as developing a separate product from the old.Implementation
Our backwards compatibility is only as rigid as what we test for. If functionality exists but is not tested for, we cannot reasonably guarantee that the functionality will be maintained. This is the main difference between the Eons versioning system and that laid out by Semver. When we talk of "backwards compatibility", we speak of what requirements we attempt to satisfy through tests while knowing that the tests themselves are imperfect. Implementation thus represents how well the requirements are being met and can indicate how dependable the product might be moving forward. A stable and mature project should be able to point to test cases to show that backwards compatibility has been maintained. Similarly, if you choose to build on product that does not test for your use case then you are using the product in an unsupported manner. Under Eons versioning, implementation (minor) releases can "break" backwards compatibility. This happens when that compatibility was not defined or when tests themselves are identified as the source of a problem, and are inhibiting the project from meeting the requirements. Both managers and engineers should collaborate on implementation to ensure that all requirements are being adequately tested for. It may also be advantageous to leave features officially untested while they are being developed and add official tests once agreement is reached on how the requirement should be implemented.Updates
Products need to be built and code needs to be written. Updates are how you do it. Before releasing your product, make sure your tests pass. That's it! You should also increment the update (patch) version when updating dependencies; i.e. with any external code changes.Short Versions
Part of the inspiration for Eons versioning is to be able to utilize floating point numbers to represent versions. By ensuring updates always meet the established requirements, there is effectively no difference between versions 1.2.3 and 1.2.4. Thus, both can be stated as 1.2. the precision on the float can be adjusted to represent orders of magnitude (e.g. 1.20 > 1.19 > 1.2).Project Quality
We can go a step further and say what a version means for project quality. We assume good projects are:- Reliable (i.e. backwards compatible).
- Active (i.e. lots of updates).
- Well managed (i.e. kept on task).
project_quality_approximation = version_update / version_requirement
Determining reliability requires an additional metric: test coverage. Once we know how many guarantees are offered, in the form of test coverage and project size, we can state reliability as how often the tests change (i.e. the implementation version number). Thus, reliability = project_size * test_coverage / version_implementation.
Combining all the metrics above, we get: project_quality = (version_update * project_size * test_coverage) / (version_requirements * version_implementation).