This guide is intended to help our software development teams create scalable, maintainable, and efficient systems that meet our client's needs. It is a reference document for our engineers to follow as they work on various projects.
We design our systems to be modular, which means that each component should be independent and loosely coupled. This makes it easier to maintain and scale our systems. A good example of modular code is a web application that is built using a modular architecture.
<aside> 💡 For example, please refer to our open-source whisper-chain-be repository. The whisper-chain backend is divided into modules and very clearly structured under services, libs & helpers.
</aside>
We design our systems to be scalable, which means that they should be able to handle increased traffic or usage. We must use techniques such as load balancing and horizontal autoscaling to achieve this. For example, the whisper chain application leverages on
Our systems should be reliable, which means that they should be able to operate continuously without downtime. We must use techniques such as Blue/Green deployment, redundancy and failover to achieve this.
Our systems should be able to integrate with other systems or services. We must use techniques such as APIs and message queues to achieve this.
<aside> 💡 Example of Scalability, Reliability & Integration done the right way -
Fab, an e-commerce store that our team engineered, needed to be integrated with our in-house Warehouse Management System’s shipping service to automatically generate shipping labels and track shipments. To achieve this, we used the following techniques:
By using APIs and message queues to integrate our e-commerce store with the shipping service, we automated the shipping process and provided a better experience for our customers, while also ensuring that our systems are scalable and reliable. We ended up shipping 24000 orders a day.
</aside>
Our systems should be flexible, which means they should be able to adapt to changes in requirements or customer needs. We must use techniques such as microservices and APIs to achieve this.
<aside> 💡 Example -
Let's say you have an online marketplace that allows users to buy and sell products. Initially, your website only allows users to sell physical products, but you later decide to add support for digital products such as e-books and software downloads. To achieve this, you would use the following techniques:
By using microservices and APIs to create a flexible and modular architecture, you can easily add new features and functionality to your marketplace, without disrupting existing functionality or requiring extensive code changes. For example, if you later decide to add support for a new payment method, you can simply create a new microservice for that payment method and integrate it with your existing payment processing microservice using APIs. This approach allows you to quickly adapt to changing customer needs and stay competitive in a fast-paced marketplace.
</aside>
We should monitor our systems to detect and resolve issues quickly. We should use techniques such as logging and alerting to achieve this. All our in-house products must have a logging lib and use it appropriately.