The Blender project has existed for more than 20 years. During this time, its codebase has grown organically, with a healthy mix of refactors, brand-new code, and core parts that have survived the journey. There are abandoned parts too, left to their own devices. These need fixing but also function quite well in their current […]
The Blender project has existed for more than 20 years. During this time, its codebase has grown organically, with a healthy mix of refactors, brand-new code, and core parts that have survived the journey. There are abandoned parts too, left to their own devices. These need fixing but also function quite well in their current state.
Sometimes technical debts start for the best of reasons. But when left unresolved for too long they can seriously impact the long term sustainability of the project, the cross-module pollination, and the overall stability/quality of the project.
To help mitigate these issues, the code quality day project began earlier this year. The goal was to make Blender more welcoming for new developers, as well as helping the software to scale.
The team will work together on making the Blender code easier to understand, rather than focusing on bugs and other tasks.
Read more details on the wiki.
This event happens on the first Friday of each month and started on February 2020. To celebrate its 10th edition let’s look at some examples.
The Clang-Tidy project helps catch bugs before they are even reported by fixing typical programming errors. Its support in the Blender codebase requires a lot of changes to prevent false positives, so this is still an ongoing effort.
However, the benefits of introducing automation are clear, and can be illustrated with the following issues.
It was potentially handling data from DNA wrongly.
A bit of a corner case, but no excuse to narrow types used in the DNA.
Typical errors which cause integer overflow.
User-measurable side effects are, for example, not being able to deal with an image of a huge resolution.
Different behavior in Debug/Release, worsen performance in debug builds.
Clang-Tidy detected a bug in studio light shading, which was only happening on Windows. The code was (ab)using compiler specific extensions.
Blender ID datablock types (Object, Collection, Armature, …) used to be hard-coded in Blender, each one with its own function calls and unique parameters.
They now changed to a runtime registration to help with the modularization of the read and write code. Now copy data and make locals are proper callbacks defined for each ID datablock.
Blender is using clang-format to help unify its code style across the entire program. A recent addition was the option to sort the included headers alphabetically.
The change is quite small: the commit is a one-line change enabling this option for the .clang-format file. However the codebase had to be cleared so it was less dependent on specific (and error-prone) order of includes.
The most popular changes are cleanups. A lot of the new code is created taking the existing codebase as an example. Cleaning up old functions guarantee that old technical debt doesn’t get replicated.
Descriptive variable names help the code to be better understood. They also work as a way of self-documenting parts of the code, and are aligned with modern code practices.
This commit renamed generic int i variables to view_id in the multi-view code.
A few macros make accessing the Blender data in a more powerful way. However their adoption is not widely spread across the codebase.
This commit updated more than 200 files to use the LISTBASE_FOREACH macro for datablock iteration.
In the coming months the Clang-Tidy should be wrapped up, and soon enough this will be integrated in the patch review system. More cleanups and comments will happen not only as part of the code quality day, but will be incorporated as a daily practice in the development.
It is important to find a good balance between handling technical debt and pushing development forward. Dedicating one day a month for that helps the most pressing issues from dragging on too long, while also building a culture of high-quality new code.
Blender welcomes any contributor to join its project and help make a positive impact in the world. Get involved today!