Developer Productivity @ Scale
There are multiple ways to scale
When it comes to scaling, most developers assume there is only one way to scale: performance. How do I support the most number of users, or the highest amount of traffic, or the fastest processing times?
The above is what I consider Performance @ Scale.
But there is another way to scale: rate of development. Can my rate of development keep up in a sustainable way over the long-run.
This is what I consider Developer Productivity @ Scale.
Complexity is your biggest throttle
There is a well-studied concept in software development called technical debt. In this concept, a code base accummulates hacks (“expedient solutions”) over the lifetime of its development, and unless investment is made to reduce it in the course of development, it accummulates and eventually causes the project to stall.
I have seen this happen multiple times in my career:
- A poorly documented critical frontend code base with three different coding styles and an equal number of state management libraries. A third of features were covered by test cases, half of which failed anyway on the main branch. This led to an incredibly high turnover rate, and stalled project delivery.
- A developer that took a nested if-else requirement, and turned into it a complex switch statement built out of bitwise-operations. This, and other similar decisions turned a 6 month project into a 1 and a half year project.
- An attempt to shoehorn IdP provider flows in a single-sign-on feature into a password-based authentication setup. This one we caught in time, but would have been a ticking time bomb for security vulnerabilities and an obstacle to effective handover.
- I cursed and swore at a series of unreadable functions that no one could understand, only to realise I myself had written it 2 weeks ago, and therefore was swearing at myself.
Each of the above added complexities, that throttled (or would have throttled) development in the medium to long-run.
A fictional burndown visualisation
Another perspective: Personas in an SDLC
I like to work with Personas. When building products, we always need to keep the end-user in mind. No users, means no value is being delivered, means the software we have written is useless.
The same applies to a process. The software development lifecycle is also a process, and that process has a few end-users. There are a few ways to think about an SDLC, but let’s use the approach that I am most familiar with: [Scrum].
There are several personas above
- Product Owner
- Scrum Master (rarely an effective one though)
- End Users
- Stakeholders
- Developers –>
Performance is the least important factor
A little word about performance.
Caveat: When it comes to new product development.
How do we ensure this?
- Enforcing coding standards
- Effective code reviews
- Adhering to KISS and SOLID principles
- Design principles
- Prioritising fixing technical debt
- Etc.
But this post is really an exhortation to readers. While working on a system, ask a simple question about the other users of our code base before considering a development piece done:
If a competent developer comes along tomorrow and looks at what myself and the team has done, how long will it take for them to become productive on the same code base?