For me, branching by attribute makes sense only when you have a sufficiently large project that you can reasonably talk about the “functional team” of X as an independent unit.
In addition, there are certain size criteria (admittedly, fuzzy). If you have 10 developers, you have only one team of functions, as far as I know - it doesn’t matter if two of them are “guys with widgets” or “database guys”. You may need> 1 development branch if someone does a lot of refactoring by making changes to the API, changing the expected behavior, so many BVTs won't work, etc. But this is not a function branch.
If you have 100 developers, you might need function branches. It depends on how closely your functions are related and how disciplined your SCM process as a whole is, especially with regard to build quality. Even if you do not have function branches, you will surely have some sort of branch hierarchy.
If you work with Windows, layers and layers of function branches are a godsend. If the shell command cannot be productive because the kernel command introduced an error, this is a big problem.
Of course, there is a balancing act. Some large organizations take too much branching of features. When it starts to take months before the code blessed by functional team X turns it into team Y, the pain of merging + integration testing outweighs the stability of the code that you tried to get in the first place. (hence the phrase "your tree depth from MAIN is inversely proportional to your sanity"). And in each case, the tree for version N should narrow down as its release approaches, eventually folding to the point where only checks directly in this connecting line will be and each branch of the function effectively targets N + 1.
source share