Prioritizing Technical Debt
Lift helps you identify and prioritize technical debt by analyzing your code when you scan it either via a full console scan or in a PR. Specifically, Lift helps you find any God Classes existing in your repository. Use the Technical Debt tab of the console to view the results.
Beta Disclaimer
In the beta implementation, only Java projects using Maven and Gradle will be scanned by Lift and have results.
Table of Contents
Results
The Technical Debt results show in four sections.
First, the High Priority Classes section displays the top three God Classes, if any are found, as shown here:
If no God Classes are found, you will get a congratulatory message here instead, explaining that Lift has no suggestions for helping your project prioritize technical debt.
If your repository cannot be scanned for God Classes a message relaying that will be shown.
Second, Lift provides some information about God Classes, change proneness and technical debt.
Third, in the God Classes Identified section, assuming you have any results, Lift displays all the God Classes uncovered with more detail about each class, as shown below. These are sortable by priority. For ease with a lot of results, pagination and a case-insensitive filter are present.
Lastly, Lift shows a graphical representation of all God Classes identified using Change Proneness and Effort (to fix) as the X and Y axes of the graph. Each God Class identified appears as a circle within the graph, as shown in the example that follows. The circles vary in color based on the priority ranking of the combined axes determined by the tool.
Hovering over a circle gives the same information provided in the table above (Priority, Change Proneness, Effort and Method Count).
Before the graph there is also a dropdown which limits the number of God Classes shown. By default, it shows the 10 highest priority ones but 20 and an unlimited option are also available. Beware that for projects with many God Classes the unlimited option results may be hard to read.
Questions
What is technical debt and why is it important?
Code is a living document that must be cared for. All code accumulates technical debt over time. Technical debt includes any aspect of the code base that can make it slower or more difficult to add new features. It can come into being suddenly, via a hastily released feature, or it can build over time, such as when the product's use cases diverge from the underlying architecture.
Paying down technical debt:
- simplifies onboarding because the code is easier to learn
- makes sequencing work simpler by surfacing dependencies between features
- allows time estimates to be more accurate by reducing unforeseen work
- reduces the number of bugs added when implementing new features or fixing existing bugs
- helps developers be happier by allowing them to work more efficiently and have a sense of quality
How does Lift help you prioritize technical debt?
God Classes are identified and then scored based on the relationship between change proneness and effort to fix. The priority score is calculated by subtracting the effort rank from the change proneness score. God Classes with a high priority ranking may be good candidates for focusing your refactoring efforts; we suggest considering those first.
What are God Classes?
God Classes represent too many concepts, lumping together unrelated functionality in a single class. This leads to code that is harder to read, harder to test and harder to change.
What is change proneness?
Change proneness is a numeric expression of how much a class has changed since its introduction relative to changes in other classes. The higher the value, the more prone it is to change. More prone to change makes for higher priority calculation because you're more involved with the class and likely to work on it.
The numeric value here is relative to other items within the same repository and should only be used to compare classes within that repository. That is to say, for example, a "5" in one repository doesn't necessarily equate to a "5" in another repository.
What is effort rank?
Effort rank is a numeric expression of how difficult Lift understands a God Class will be to refactor. The higher the value, the more difficult refactoring is likely to be.
What does negative priority mean?
As stated, priority is a calculated measure of change proneness vs effort presented in a ranked order, so you can determine where to focus your technical debt paydown. A negative priority is representative of classes that are unlikely to change and very high effort to unwind. It does not mean that no work can be done but instead is a measure that the returns will not be as great. It is worth noting that a result with negative priority is not the same as not identifying a God Class. Classes that are not God Classes will not appear at all in these results.
Can I tweak this tool?
The layout of the results and presence of the Technical Debt tab cannot be tweaked, however, the tool can be configured using Lift's standard methods. The tool name is refactor-first
.
Where can I learn more?
The refactor-first
tool is an implementation of an open source project created and maintained by Jim Bethancourt. The fundamentals of the tool are based on the paper Prioritizing Design Debt Investment Opportunities by Nico Zazworka, Carolyn Seaman and Forrest Shull. You can see more about both in the project on GitHub, notably in the README.
Where can I give feedback?
Sonatype welcomes feedback on this or any of the tools as well as the overall Lift implementation on the Lift community forum.