There comes a point when writing professional software that a system simply must have the following characteristics, which I collectively refer to as The Robustness Requirement:
- Data Auditability: Every non-system configuration object record must contain fields to capture when and by which user the record was created, as well as when and by whom the record was deleted. “Deleted” rows should either remain and be marked as “deleted” or be moved to a _history table.
- Scalability: Services should be easily moved to additional servers and the web front-end should be clusterable.
- Cacheable: Data should cached in a distributed manner.
- Sophisticated UI: User interfaces should have a level of sophistication that intuitively displays invalid fields and error messages.
- Logging: The system should have a deeply-rooted logging system where all messages are aggregated in a searchable manner. Logging levels and filters should be able to change on the fly without interrupting any services.
- Fault Tolerance: The system should be relatively fault-tolerant so that services can automatically restart, and helpful messages are displayed to the user while services are unavailable.
- Permission-based Security: Almost any action should be permissioned on both a user and role basis.
- Data Storage Scalability: Data persistence read/write operations should be specifically routed through read-only and writeable connections so that read operations can be separated and distributed across multiple servers (and consequently be scalable beyond just one data server).
- Vendor Agnostic: Care should be taken to hide any vendor-specific implementations as much as possible so that service vendors can be changed with minimal effort. This includes the database platform. Too many software shops become tied to a specific platform or vendor.
Admittedly, this is a little bit of a Xanadu type of place to be. Hardly any system actually meets all these requirements, but it should be a conscious decision by the team to abandon any of the above requirements.