System design is a complex process that requires attention to multiple factors. Below is a list of key aspects to consider, which can serve as a guide during sytem design or as a checklist when reviewing it. This list is not exhaustive, and the importance of each aspect may vary depending on the system being designed. Each section is presented as questions to help you think about the aspect, and assumes that the system is being modified to make it applicable not only to initial design but to the entire lifecycle of a system.
Are there any changes to the user interface? This includes, but is not limited to:
Are there any changes to the external interfaces of the system? External interfaces include:
Are there any changes to how storage is used? Storage includes:
Will existing data be compatible with the new code? If not, how will the data be migrated?
Are there any changes to the configuration of the system? Configuration includes:
Are there any critical changes to the core logic of the system? This may include but is not limited to:
Are there any changes to the security of the system? Security includes:
Are there any performance or scalability concerns? Does a performance test need to be conducted?
Can important actions be traced back to the user who performed them? This is important for auditing and debugging purposes.
How can the changes be tested? Should a test be added to the regression test suite?
Is the deployment process, including installations and upgrades, affected in any way? Can the changes be deployed without downtime? If not, how much downtime is required?