I often hear people wondering how a company like Google — with thousands of the world’s best engineers — can still have so many bugs in its products.
Are Google’s software developers simply not as good as everyone says they are? Is the company so poorly mismanaged that they can’t fix simple problems with web browser page layouts or email delivery systems?
The answer, of course, is that all companies accumulate technical debt as they grow. Even great engineering teams can “fall behind” on feature development and bug fixes because of the huge amount of maintenance work that accrues as code bases increase in size.
What is Technical Debt?
The work required to develop every new feature is not just limited to the code written specifically for that new feature, but it also involves all the automated software tests, Quality Assurance processes, code documentation, deployment processes, and scalability concerns that need to be addressed to support that new feature. Such technical overhead tends to increase exponentially as the number of new features increases. Companies “learn to live with” certain low-priority bugs because fixing them is simply not as high a priority as paying off other, more critical technical debt.
Giant profitable companies like Google are fortunate to be able to absorb huge amounts of technical overhead, thanks to large cash stockpiles, patient investors, and hordes of the world’s top engineers. But startups (and most other companies) do not have this luxury.
Many a promising company has collapsed under the weight of technical debt, finding themselves in a position where they are unable to move quickly enough to respond to changing business realities. Startup CEOs and CTOs should cautiously manage the tradeoff between building new features and paying off their technical debt before it accrues too much interest.
At Brainscape, we’ve been extremely careful to manage our technical debt, and we have learned many valuable lessons along the way. We’d love to share them with both startups and big companies alike.
6 Tips For Managing Technical Debt
When considering adding new features to your product, it is important to consult your engineers to fully understand the amount of ongoing work that will be required to maintain that feature. You should think of this maintenance cost in terms of the salaries of the engineers and managers whose time (and mental distraction) that this will require. Is the new feature really worth all the potential complexities and distractions that it could introduce later?
2. Consider an Early Code Refactor
If you are like most startups, you have likely experimented with a variety of different features and user experiences before honing in on the right product setup. There is a good chance that the relics of these artifacts are still buried in your code, confusing every new developer who joins your team.
It is thus often a smart idea to re-write much of your code – or at least “clean it up” – before scaling the product further or hiring too many new engineers. This is especially valid right after you have raised money, while you have the luxury of a long cash runway.
3. Hire the Right CTO
Many early-stage startups begin with a co-founding “CTO” who is fresh out of college or a coding boot camp. This person usually has a great “hacker mentality” and is able to build features quickly, in an agile way, using a variety of ready-made prototyping tools and APIs. Such a skill set is often perfect for the needs of a modern early-stage lean startup.
Yet as the startup begins to mature into a real company, the number of scalability issues multiplies exponentially, and the speed at which the company can evolve its technical architecture becomes a huge determinant of its success. It is therefore extremely helpful to hire a CTO who has worked on at least one large development team, on a product with hundreds of thousands of lines of code, for at least two years. There is no substitute for the smart engineering practices that are gained from such experience.
4. Do Some Things the Hard Way
The right engineer does not just write (or manage) code the fast way, deploying features as quickly as possible. Instead, s/he considers the complete long-term implications of each feature. How will this feature affect the product’s loading time as the user base grows? How hard will it be to maintain as we continue to add new features? Etc.
The right engineer understands the proper tradeoffs between development speed, performance, scalability, stability, security, reliability, and maintainability. The right engineer may initially take twice as long to develop a feature in order to avoid the risk that it takes 10 times as long to rewrite later. This skill of knowing where to draw the line only comes with experience.
5. Minimize Developer Turnover
Every time a software developer leaves your team, s/he leaves behind “legacy code” that new developers are going to have to learn. This learning curve (and inevitable code rewrites of things that “the last guy” did “the wrong way”) is often a large time suck and a big source of technical debt. Be sure to take good care of your developers so you can limit your turnover!
6. Create Team Redundancies
To reduce the technical debt created by potential developer turnover, it helps to ensure that at least two or more engineers are familiar with each piece of your code base. This can be facilitated by having a rotating division of responsibilities and/or by instituting a regular practice of pair programming or code reviews.
If your company is like most, there will likely be a constant compromise between the business and engineering sides of the business. “Business guys” tend to push for faster growth and more features, with little appreciation for how pretty things look under the hood; meanwhile, good engineers typically push for better technical solutions that make software more maintainable over time. Finding the right balance between growth and “managing technical debt” is one of the biggest determinants of startups’ long-term success.
[Want more resources like this article? Follow me on Twitter @acohenNY.]
Brainscape is a web & mobile education platform that
helps you learn anything faster, using cognitive science. Join the
millions of students, teachers, language learners, test-takers, and
corporate trainees who are doubling their learning results. Visit
brainscape.com or find us on the App Store