Evaluation is an often forgotten but essential component when creating a system design solution. In evaluation, we compare the solution to the system’s requirements and check for conformity.
The evaluation process occurs after we have designed a system. The system design process should be
Note: In the early years of software development, the convention was to follow a top-down or a waterfall methodology to develop applications. In such methods, we used to make the architectural design of the software at the start of the development cycle. However, nowadays, we follow an incremental approach where the system design itself evolves over time.
This relationship can be seen in the illustration below:
In this process, we check for conformity with the requirements. This offers us several advantages, and we can see a few of them below:
Incremental improvement: When we incrementally evaluate the system design, we ensure the incremental improvement of our system as a whole.
Quality assurance: We ensure the system meets the functional and nonfunctional requirements. We can quickly identify if any requirement is missing from the system design.
Optimization: In evaluation, we can identify areas in the system design where we can improve the system’s design.
Goal orientation: We can ensure that the system design is oriented toward meeting the objectives or goals of the project.
A system design interview is usually 45–60 minutes. We might be inclined to believe that we should spend 100% of this time designing a solution. However, it is essential to review our solution as it not only shows our skill in evaluating solutions but also allows us to incrementally improve the system. It can be exponentially beneficial to save 10–15% of your interview time for evaluation of the solution and do a second iteration of the solution.
When we compare our solution against the requirements given by the interviewer, we can identify any shortcomings in our solution.
The following example shows how critical the evaluation of a solution can be.
Let’s say someone was being interviewed for a system design role, and they made the following solution for a short URL generation system:
When we evaluate this system, we can see that the cache is being used alongside most of the components. Now, if we were to implement cache storage at every component, it would be hard to maintain, causing scalability issues. This solution would not be feasible for a large-scale system. So we found a place for improvement, now what?
This is where we will iterate and improve the solution.
Now, we have added a separate “Cache service” component, which will be handling all our cache needs. This way, the design has improved scalability and maintainability.
This is just one of the examples of how evaluation can be useful. Some others might be more obvious, like not adding a load balancer for a large-scale application, while some may be a bit more hidden within the design, like which components are communicating and why.
Evaluation is essential to ensure having a good system design solution, whether it be in an interview setting or in a real-world application.