Quality of Software at Woovi
Tags: software, codequality
Published: 2024-01-18 11:48:04

Keeping the software quality high as you grow your team is a challenge. The more engineers you add, the easier is to make your codebase patterns diverge. The more different patterns you have the harder is to maintain the codebase. As you add more engineers and code the quality of the code tends to decrease.

Examining the strategies in place to ensure software excellence at Woovi while keeping up with a brisk pace of innovation.

## Automated Tests
The only way to move faster, adding more code, without causing regressive bugs in production is by using automated tests. Automated tests make sure we won't change an expected behavior when changing another "unrelated" code. Second-order effects of a code change can only be caught using automated tests.

## Manual tests on localhost and staging
To make sure our automated tests are as close as possible to real-world scenarios, we first test the code manual at localhost, and then in staging to make sure it behaves as expected. The automated test is the manual test in code.

## e2e testing
Adding e2e(end-to-end) testing in our staging environment lets us catch regressions for common and critical workflows in our product.

## Staging environment
We maintain a staging environment that is as close as possible to the production environment in which our code will be run. This ensures we catch bugs that didn't show up when testing in our localhost. 

## Normalize patterns of the codebase
We improve and normalize the patterns of our codebase using manual and automated tools. For the manual, we have code review and pair programming. For automated, we have a linter, prettier, and codemods.
These scripts reduce the complexity of our codebase, reducing the entropy of it.
We keep adding more restrictions in the codebase. These restrictions make sure we only have one way of doing something, reducing the cognitive load, the need to decide what pattern to use, and making everything simpler.

## Decoupled domains in a monorepo
We decouple domains per package in our monorepo.
Each package only exposes its public API, reducing the cognitive load for developers. For instance, a developer working on Cashback does not need to know anything about how the internal of Pix (Instant Payments) works.
Decoupled domains also make it easier to reason about the codebase, make it easier to find code, make tests and release faster.

## Writing and reviewing good issues and RFC (Request for Comments)
Shit in, Shit out. We write good issues and RFCs based on templates. Peers review the issues and RFCs before development. We catch bugs, data modeling, and architecture problems before even coding a single line of code.
Writing makes it clear what we want to achieve and how to achieve with it, making it clear all the tradeoffs of our decisions.

## Feature Flags
As we are constantly adding and refactoring our codebase, we use feature flags to be able to test in production before our users. Even though we use staging for testing, production is the real deal. We also use feature flags to release new features/products to some early adopters who want to use them even with fewer bugs.
Feature flags decouple our deployment from our release. We deploy many times a day, but we only release new behavior when needed or ready.

## Monitoring
After all that, we won't be able to catch all the bugs. We have error and performance monitoring to understand how our users are using our product in production.
Error monitoring will show our users bugs before they even notice, so we can fix them as fast as possible. They also show some unexpected behavior in some third-party APIs.
Performance monitoring gives us information to solve bugs in production at a fast pace, and also to track and improve the performance of our application.

## To Sum Up
Keeping the quality high as you scale it is very hard.
Adding more processes, automation, and tooling can help you.
You also need active monitoring to understand your distributed system in production, and the interaction of it with the external world.
Every new bug or production incident is an opportunity to make your system more reliable.

---
Woovi
[Woovi](https://www.woovi.com) is a Startup that enables shoppers to pay as they like. To make this possible, Woovi provides instant payment solutions for merchants to accept orders.

If you want to work with us, we are [hiring](https://woovi.com/jobs/)!

---
Photo by <a href="https://unsplash.com/@jasondeblooisphotography?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash">Jason D</a> on <a href="https://unsplash.com/photos/clear-crystal--XvhrIC1Mhc?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash">Unsplash</a>