Krishnan's Personal Website


Home | About | Blog | Skills | Innovations | Work with Me | Connect with me | Other Links


How Small Teams Can Build Enterprise-Grade Software



Published On: May 11 2025
Written By: Krishnan Sethuraman
Category: Software Engineering


 

A few years ago I met a prospect at a hotel lobby. For the sake of this article let’s call him Bob. One of Bob’s clients wanted to build a web application for their finance team. This was a straight up web application so I showed a keen interest in the project and pitched for it.

The overall discussion went well until Bob enquired about my team size. I told them that I had four software engineers and one test engineer. Bob got a bit disappointed and told me that we were a small team.

I was a bit taken aback because. Until that moment I never felt that a small team was not enough to build a real enterprise grade software. My team has built a good number of software applications for various companies ranging from startups to MNCs.

Obviously Bob did not give us the project. He was was fixated on the assumption that small teams cannot build enterprise grade applications.

In reality the world has seen small teams create amazing software applications. WhatsApp and Telegram are two such examples.

However I do not blame Bob for his apprehensions as most small teams do fall short of client’s expectation and fail to create enterprise grade software.

In this article I have talked about how small teams can build enterprise grade software.

 

What is Enterprise-Grade Software

Before we go any further it is paramount for us to understand what makes a software enterprise grade.

An enterprise-grade software has following characteristics:

  1. Good quality code
  2. Good documentation
  3. Emphasis on security
  4. Automate as much as possible
  5. Compliance (Industry specific compliance)

We will look into these characteristics in detail in the following sections.

In layman’s terms, enterprise-grade software is one that is well written, well documented, well maintained and is reliable in the production environment. It is also works as expected in any condition and under any amount of traffic. 

 

Key Principles for Small Teams to Build Enterprise-Grade Software

 

Principle 1: Lay a Strong Technical Foundation

When you're a small team, you don’t get multiple shots at redesigning your system. Which means the decisions you make early on matter a lot.

You must begin with a solid architecture. That doesn't mean overengineering, but it does mean thoughtful planning. Ask yourself:

Will this system be easy to expand as more users or features are added?

Can we isolate parts of our system so changes in one area don’t break others?

Choosing Between Monolith and Microservices

Most small teams start with a monolith, and that’s often the right choice. It’s faster to build, simpler to deploy, and easier to understand. But even within a monolith, you can build with modularity.

For example, structure your codebase so each part of the system—user management, billing, notifications—has its own clear boundaries. This way, when you're ready to move to a service-based architecture, the migration becomes easier.

Use real folder and service separation, maintain strict interfaces between components, and document assumptions. Imagine you're leaving behind a map for your future self.

Real Example: Stripe’s Early Codebase

Stripe famously started with a monolith, but they built it with clean abstractions. Years later, when it became necessary to split their systems into services, they already had the discipline in place. They weren’t trapped.

Small teams don’t need microservices early. But they do need foresight.

 

Principle 2: Good quality code

A piece of code is written only once. But it's read many times. This means that your code will be read many times by many people after you write. It might also be inherited by someone else.

If your code is poorly written then others reading or inheriting it will have a tough time understanding what you have written. I have seen many software applications go haywire just because the developers who wrote the code did a bad job.

Writing good quality code is not rocket science. It can be learned. Simple changes to the way you write code can turn your code from bad to good.

Do not repeat yourself

Never write the same code again and again. Instead right it as a library function and use it in any where you want.

No sql query inside loops

Never add sql queries inside a for or while loop. It's a very bad practice and should be avoided in all scenarios (there can be exceptions).

Avoid too many nested loops

Nested loops can be very cumbersome to read and can complicate otherwise a very simple code. Instead of using nested loops try reversing the condition. This will reduce the occurrences of nested loops and make the code appear clean.

Add comments

Comments are important in a good quality code. However, writing code for self-explanatory lines is not a great idea (you will be surprised at the number of times I have seen this). Instead add a comment only to explain complicated logic. 

 

Principle 3: Good documentation

A well written code is always accompanied by well written documentation. The documentation can be a postman collection or a detailed documentation on APIs, system architectures etc.

There are many open source solutions available to create documentation. My personal favorite is Dokuwiki.

 

Principle 4: High percentage of test coverage

Any project that I inherit, one of my very first action items would be to set up SonarQube. And in 90% of the cases I have seen 0% test coverage. 
Writing test cases as a small team can be overwhelming but it does help in the longer run. It speeds up the overall testing process and makes it a breeze to release new code to production.

A test coverage score of 70% and above is acceptable in the enterprise world. Anything less than that is considered low grade work. 

 

Principle 5: Emphasis on security

It is important to focus on security from day one. Never leave it for later because the “later” never comes.

Validate all inputs

The thumb rule of writing secure code is, never trust the user input. Always validate it strictly for the right data type, empty and non-empty and so on.

Use prepared statements

So not directly include the user input in sql queries. Instead use them in parameterized queries. This will act as a deterrent to sql injection attacks on your software.

Secure secret storage

Never commit your secrets like third party API keys and passwords to your source code repo. Always use them in an environment file.

Do not share the production secrets to the entire team. Always provide them on a need to know basis.

Handle errors securely

Never print the whole error directly on the browser or the user screen. Always sanitise it to remove personal information and then log them in a log file or log management application. These logs should then be used by the software engineers to take corrective measures.

For the end user of the software, always show an error message that is in plain language without any tech jargon.

Also consider compliance from the beginning. If you’re dealing with health data (HIPAA), user data (GDPR), or financial info (PCI DSS), build those controls early in the development process. 

Pro Tip: Run Regular Threat Modeling

Every few weeks, sit down and ask: "What could go wrong?" Think about internal abuse, external attacks, or data leaks. You don’t need a full security team—you just need to be proactive.

 

Principle 6: Automate Everything You Can

One of the biggest advantages small teams can gain is through automation. With fewer people, you can’t afford to spend time on tasks that can be done by machines.

Start by setting up CI/CD pipelines. Every time someone makes a change to the codebase, it should be automatically tested, built, and deployed. This reduces bugs, increases confidence, and allows you to move faster.

Use tools like:

  • GitHub Actions or GitLab CI for pipelines
  • Docker for consistent environments
  • Terraform or Pulumi for infrastructure as code
    (Add some more points and elaborate. Talk about automating code deployment and test cases) 

Story: The 2-Person DevOps Team

A startup in India scaled their application to handle 1 million requests per day with just two developers. How? Every deployment was fully automated. Code pushes triggered tests, built Docker containers, applied infra updates, and even ran rollbacks on failure.
What would’ve taken hours was done in minutes—with zero human error.

 

Principle 7: Build a Culture of Quality

The most underrated factor in software quality is team culture. Even a team of 3 can build like a company of 300 if they hold themselves to high standards.

  • Review each other’s code
  • Encourage asking questions early
  • Share learnings in short, written notes
  • Use checklists for testing and deployment
  • Make quality part of how you work—not something you “add later.”

 

Principle 8: Leverage the right tech stack

Choosing the right tech stack for the project is important. But what is equally important is that your team should have a strong understanding of the project.

I recently received an email from a client who wanted us to build a gaming app. While analysing the requirement I felt that the best programming language for the backend could be Go. However we did not have any expertise in the team to build a robust backend with Go.

So we decided to go with Python and Postgres. Our logic behind choosing Python was that our team knew Python really well and hence we were confident that we could build a robust backend for the mobile app.

The lesson here is never choose a tech stack just because it is cool or it is the next big thing. Always go with the tech stack that your team knows well. This will ensure the code that your team writes is of high quality and also you can manage it well in the longer run.

Stack Story: The Solo Founder’s CRM

As a solo founder I have built a CRM used by 200+ companies using Laravel + Vue.js. I chose this tech stack because I was very familiar with it. That let me spend less time writing good code and more time in creating content and solving user problems. 

 

Real Stories from the field

In the real world there are many impressive examples of small teams building and maintaining enterprise-grade software. I have included some of my favorite companies below. 

1. Craigslist — 50+ Billion Page Views/Month, ~30 Employees

Team Size: ~50 employees total, including just a handful of engineers.
Product Scale: One of the most-visited websites in the U.S.
Highlights:
No major redesign in decades — kept the site lean, fast, and functional.
Operates with minimal infrastructure and human resources.
Proves that software doesn’t need constant overhaul to be reliable at scale.

 

2. DuckDuckGo — ~150 Team Members, Millions of Users

Team Size: ~150 (as of 2023), including a small engineering team.
Product Scale: Processes over 100 million search queries per day.
Highlights:
Maintains a powerful, private search engine competing with Google.
Operates lean through open-source tools, aggressive caching, and smart partnerships (e.g., using Bing/Yandex results with privacy wrappers).
Leverages automation and a privacy-focused niche to stay competitive with a small headcount.

 

3. Fastmail — Secure Email Provider

Team Size: ~50 employees
Product Scale: Trusted by tens of thousands of users globally, including businesses.
Highlights:
Competes with Gmail and Outlook on quality and privacy.
Built and maintains a full-featured mail platform (IMAP/SMTP, calendar, contacts, JMAP) with a small team.
Proves a small team with deep domain expertise can provide world-class reliability.

 

4. Basecamp (Still!) — Managing Thousands of Teams

Team Size: ~50 people total, <20 engineers
Product Scale: Used by thousands of businesses for project management.
Highlights:
All customer support and feature development are done in-house.
Focus on doing less — few features, but done extremely well.
Operates with calm productivity — no late nights or hustle culture.

 

5. Hey.com — Email Reimagined by the Basecamp Team

Team Size: Same ~20 engineers shared with Basecamp
Product Scale: Thousands of users, high-demand launch with waitlists.
Highlights:
Launched to huge attention, challenging the email status quo.
Built completely in-house by the same small team that runs Basecamp.

 

Parting Words

The idea that only big teams can build great software is outdated. In fact, in many ways, small teams are better equipped to innovate. They’re nimble. They can move without bureaucracy. They can obsess over the details.

Yes, it takes work. Yes, it means learning DevOps, security, compliance, and infrastructure. But with today’s tools and knowledge, all of it is within reach.

Start with good architecture. Automate early. Focus on what matters. Use the right tools. And above all—never let size define your ambition.

Small teams can build software that changes the world. It’s already been done. You could be next.