When customer demand overwhelms your capacity to deliver, or pressure from investors requires you to quickly conquer new markets, having a well-designed business software platform can make the difference between tremendous success or missed opportunities.
Regardless of how well your software platform is currently performing, when a wave of new traffic arrives, either as a one-off spike, or (a quality problem to have) as a new reality for your business, your systems will all come under extraordinary stress. Whether or not this translates directly to a financial windfall or a tragic loss of opportunities ultimately comes down to one question: Is your business software platform designed to support your growth? Or is it holding you back?
Here are the basic requirements for a forward-facing, growth-enabling software platform:
- You must have a comprehensive suite of automated functional tests for all aspects of your software, guaranteeing that you can freely and confidently break and re-build any part of it on-the-go, while keeping your production systems fully fit for purpose at all times;
- You must have a professional suite of non-functional tests, which enable you to know (at a minimum) how your system is performing, how far it can be stretched on any dimension and exactly where the performance bottlenecks are;
- It must be straightforward to increase the capacity of your core database on-the-go, without losing data or suffering any downtime. This is where managed solutions like AWS Aurora, which auto-scale in both computational power and capacity can be well worth the cost.
- It must be straightforward to increase the computational capacity of your software on-the-go without interruption. “Serverless” solutions like AWS ECS Fargate, which allow you to seamlessly adjust the number of instances running your software on demand, coupled with a reliable load balancing architecture and a cloud-based content distribution network (CDN) can go a long way in supporting this.
- To take advantage of these scaling solutions, your core software must be designed in such a way that components are loosely coupled (i.e. each component can operate sensibly on its own, without relying on other components) and are able to run concurrently. This usually means that components should not be sharing their internal state with other components, but should only interact via well-defined interfaces (APIs).
- Reliable message queueing solutions must be part of the base software architecture, allowing incoming requests to be safely kept in a temporary queue when the platform is too busy to process them. At the same time (this is too often forgotten!), a sensible back-pressure mechanism has to exist, preventing the queue from overflowing and ultimately informing the originator of the request that the system is currently under stress.
- Security should be part of the original design on all layers of your platform (never an after-thought or an add-on), in order to prevent malicious overloading of your systems with denial-of-service attacks.