One biggest question in designing the architecture of a system is because the word “simplicity” is rather relative thing than having hard-and-fast rule to define it. According to that, I think we also have some criterions to define the baseline here:
- First of all, it fulfils the MANDATORY functional requirements.
- It also fulfils the MANDATORY non-functional requirements.
- Frequently, we tend to jump right into the problem before knowing the exact threshold of each non-functional requirement.
- Please make sure that we already have the list of prioritized non-functional requirements with its expected values that are really *NEEDED*, not fancy features please.
- There is nothing to put out, otherwise it will break or not meet some of mandatory requirements.
- It can be developed, tested, distributed, deployed, maintained, managed, and support by using typical knowledge, tools, and processes.
- Sometimes, sometimes, the real problem is hidden in politics.
This list does not guarantee that we can get the best or simplest or most optimal design in one shot, but it is a reminder for us to always review it while we are designing something.
Having said that, sometimes, we also have to take some other criterions into account too. Somebody may argue that it depends on what type of the system we are designing is e.g. life-critical or safety-critical system, system that directly accessing to the precious resources, … , in such situations, a little degree of over-engineering maybe acceptable or even more preferable, which I also agree with it in some extents.
