A system that has a good architecture
Tags: architecture, design, structure, foundation
Published: 2021-05-31 04:54:46

>   **"Architecture is about the important stuff. Whatever that is." - Ralph Johnson**

## Abstract

The purpose of this essay work is to provide insights for the reader to identify *A system that has a good architecture*.
With the general objective: Propose a base criteria to software architecture's attributes which are the foundation we should follow.
By detailing an existing software architecture, which meets the requirements for the project under scope, it becomes simple for us to understand the planning that occurred for the project to be highly adaptable and easy to change over time.
Then also explaining the benefits, trade-offs made and finally providing recommendations for further improvements for the existing software design.

---

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b5xhinme6bwkta7ibt4j.png)

## Context

The project's scope is providing a solution for physicians, clinics, hospitals to handle the appointments of their patients which will improve the services provided by the software's customers and also the final users will enjoy many helpful features, such as notifications, which enhance their quality of life.
Patients will access the solution, either by a website or mobile application, in order to find a physician according to their needs. They need to be able to filter them, by different criteria, locate the facilities where the doctors can be found during the day.  
The most important feature for the solution is being able to create the appointments, also receiving notifications and reminders. The physician should also be notified and receive reminders of the appointments' status.
The solution is expected to be accessible from anywhere in the world which will later be implemented in more countries after the project grows.

---

## Body

As the diagram shows the current architecture of the system is entirely decoupled, completely different from the original solution the project had before. 
The solution relies on Heroku as its PaaS that enables developers to build, run, and operate applications entirely in the cloud and also handles the infrastructure operations for us. Within that platform we are able to scale the up and down manually or automatically the system needs.
The system uses AWS S3 with a CDN in front in order to serve the images, files, documents as close as possible to the user of the app.
Also Infobip is the platform that the project uses to send sms notifications to all the users of the application.
As for the data store solution the system relies on Mysql database running on Linode servers.

### Interoperability
As the code base is deployed to Heroku, we have no restriction or configuration required in order to communicate with external solutions, apis, etc. It is clear on the architecture's diagram that the system interacts with Aws S3/CDN and the Infobip Api. 

### Portability

Again as the code base runs on Heroku the software system is constantly being transferred from one environment to another as stated above about the infrastructure operations.

### Availability
Heroku works on top of Aws as its IaaS, it is like a higher lever layer service. As Aws it is the largest or one of the largest Cloud providers the backend will almost always be accessible for the web and mobile clients. Now regarding the data store solution at the moment there is no high availability strategy in case of a failure to recover data. 

### Test-ability

There are two environments for the software system in order to test/approve/reject new features. The code is deployed to the staging environment where the features are tested by the project owner and then once approved they go to production manually.
At this point there is no proper CI/CD culture but the process just described above.

### Maintainability

Maintenance is necessary to preserve the value of the software over time. Maintainable code benefits whoever needs to maintain it, even if its the original developer. Code quality is fundamental for the software to be robust, avoid technical debt scenarios and be able to accurately estimate the time required to implement new features.
The software architecture design must ensure that it can meet the quality objectives, which in the case of the current software system are not met. this is probably one of the most important attribute for all of the software system's to meet.
The existing software solution requires a lot of work to meet this quality attribute.

---

## Conclusion

Although there are a lot of benefits with the current software architecture for the developers, testers, etc and also for the end users of the app because the high level elements of the software system are easy to replace or move somewhere else. The fact that quality attributes are not met is crucial for the project's success. Some techniques to increase maintainability include:
- Reducing size
- Increasing cohesion
- Reducing coupling

There is also an urge to separate the frontend from the backend, as the code uses the Django framework, this could help scaling the project later.
Now regarding the data store the system requires a high availability strategy to avoid losing data.
In order to save money and also to apply devops culture, it would be useful moving away from Heroku to Aws and take the advantage of Aws resources for a complete CI/CD process.