A proposal for tracking the health of a code base
Code as Liability, features as Asset
For a peer reviewed software development project (ideally a module/sub-module) we introduce a dashboard to track its health.
The dashboard is regularly compiled and updated and includes:
A balance listing
- “
mass of code
” as liability [EWD.1] - “
user features
” as asset
An indicator:
- “
feature density
” the ratio “user features
” per “mass of code
” unit
It must be applied to peer reviewed projects where the review process exist to guarantee that code is and will remain easy to understand by all peers.
Only features which have are validated / tested in the software can of course be included in the dashboard.
Motivation
This metric encourages reducing the “mass of code
” as well and/or the production of fine grained list of its “user features
“, as both raise the feature density metric. It acts as both a trigger and a reward for the removal of cruft.
For a given module with a defined business scope, reducing the mass of code encourages finding simpler, more factored expressions of the user features in code, more compact documentation, as well as factoring out in other modules/products what is not directly linked to the domain.
For the same module, producing fine grained lists of user features encourages the understanding of its scope, and can help breaking down development into smaller deliverable units.
Application
The metric is not intended for comparaisons of software projects.
It is meant to be used by the developers themselves (software engineers, designers, documenters) to detect when and where they should direct their efforts. [EWD.2]
Tracking the derivative (its variation over time) of the metric (as for many other metrics) makes it easier to act upon.
Mass of code unit
Mass of code is voluntarily vague. Define it as you see fit. I would for instance include the code, its tests as well as documentation. All of these needs to be maintained in the name of the delivered features.
If code is by default “peer reviewed” then using lines of code is reasonable. With the peer review an additional control already exists for the readability of the code and thus the lines of code are themselves normalized somehow.
User features unit
Inside a focused module, user features can be considered equivalent and simply counted.
References
[EWD.1]: Inspiration from an E.W. Dijkstra’s quote:
From there it is only a small step to measuring “programmer productivity” in terms of “number of lines of code produced per month”. This is a very costly measuring unit because it encourages the writing of insipid code, but today I am less interested in how foolish a unit it is from even a pure business point of view. My point today is that, if we wish to count lines of code, we should not regard them as “lines produced” but as “lines spent”: the current conventional wisdom is so foolish as to book that count on the wrong side of the ledger. — E.W. Dijkstra [EWD1036]
[EWD.2]: simplicity is difficult
Firstly, simplicity and elegance are unpopular because they require hard work and discipline to achieve and education to be appreciated. — E.W. Dijkstra [EWD1243a
Acknowledgement
Thanks to Julien Kirch for his feedback