Tech Stack
To choose the tech stack, we have taken into consideration our previous, and carefully evaluating the suitability by referring to the MoSCoW requirements. It is important for us that the language or tools have good documentation and many available open-source resources that we can benefit from.
Frontend: React, Redux and Material-UI
React is a stable, efficient, beginner-friendly JavaScript framework, which makes creating a user-friendly, scalable, and dynamically changing interface simple. There are a ton of useful libraries and resources available, and the documentation is very well written. Since React is modern and popular, there will be no problems for incoming developers to maintain the codebase. Besides, React uses JSX syntax compared to HTML with Vue so it is easier to understand the function of a particular component. This means React does have greater expandability and scalability since reusing JSX is easier as to HTML.
Redux is a small library with a simple, limited API designed to be a predictable container for the application state. It operates in a similar fashion to a reducing function, a functional programming concept. There are three major concepts in Redux: Actions, Store and Reducers. Actions transfer data from the app to Store. Store object would keep the states of the application and provide some methods to access, distribute the states. While Reducer is a function that gets the current state and events of the application and then returns a new state.
In order to optimize the user interface design style, we decided to use Material-UI which is a React UI library that contains a set of high-quality components and demos for building rich, interactive user interfaces. Material-UI is an enterprise-class UI designed for web applications and it also provides us with themes to customize our web application in every detail. With help of this UI design library, we can develop a very clean and polished UI for our users.
Backend: Node.js and Express.js
Our backend is being developed with Node.js. With the fast processing speed and event-driven architecture, it provides fast synchronization and thus the experience of the application. It is also a lightweight tool which means our application can be more scalable.
We have also considered using Django on the backend. However, we went with NodeJS as it aids the simplicity by having both the back end and front end in JavaScript. Also, though Python and JavaScript are both single-threaded, NodeJS has the asynchronous functions, while Django does not. This makes NodeJS a more efficient and convenient solution. From our previous experience, NodeJS is relatively quick to get up and running, and choosing it is a wise decision, given the time constraints of the project.
With its huge popularity, many useful middleware packages and libraries have been created and maintained by developers. It also provides great flexibility with the ability to add handlers for requests with different HTTP verbs at different URL routes and request processing middleware throughout the request handling pipeline.
Database: PostgreSQL
For storing and managing the data, we decided to use PostgreSQL DBMS. This is because we covered relational databases and SQL in detail during Term 1 of this academic year. We chose PostgreSQL over other relational databases because of many features to protect data integrity and to build fault-tolerant environments in addition to being highly extensible. For example, it comes with a built-in enhancement SE-PostgreSQL which provides additional access controls.