Another thing to mention that the software layer:
- To help businesses fit processes into your software while staying flexible, YOU HAVE TO PROVIDE COMPREHENSIVE OPTIONS SUITE
By comprehensive, I mean everything ideally should be an option and have most likely several options to control the aspects of the thing.
So whenever in your code you are using any constants or branching decisions redirecting to other events, try to think of them as an option somewhere available in the user interface.
And probably start by building a system how you can create your options in a declarative way so that it is easy to maintain and update.
Each option should have its default value (ideally the value should not be empty or falsy, so that it stays easy to implement in the code without additional logic, and allows the user to simply delete the option to come back to the default value).
However, pay special attention to checkboxes: their default value should be empty. This saves the time on the client enrollment, skipping them the task of checking the boxes when they first deploy.
So for example if you have a feature which should be enabled by default in your software, the checkbox to control that feature should be:
- Disable? (If checked, this feature will be disabled)
And for optional features disabled by default the checkbox will be:
Also try to foresee the multi-language support by default from the very beginning, because it is a hell to implement on existing solution. I usually approach it by splitting an entity into two entities related to each other:
- Primary entity contains everything except for language strings. And one-to-many field pointing to its language strings objects (alias)
- Language strings object contains language strings only, no business logic, nothing else but texts + languages primary key (en_us) + many-to-one pointer to the parent object.
Then your internal or external apis when returning the primary object should always attach all translation strings so that the client can filter whatever they need (unless you want to provide them a handy filter in the API itself).
And then in the software itself, all texts displayed to user should also support similar structure so that your software is ready to be translated. Hopefully today you can install some procedures and use apis to automatically translate your configurations to multiple languages, so that you develop your software in English and your development tools make it happen in all other languages you need. IMPORTANT THE USER INTERFACE STRINGS SHOULD BE AN OPTION SOFTWARE ADMINISTRATOR CONTROLS. This way if you want to modify the strings in your software user interface you just update the options on your private settings screen.
That makes a hell lot of options to develop, but it saves you so much time you can’t imagine.
So settings coverage is another metric to track in your software development.
Saying that because spent my last 15 years moving a fully customized softwares to Off the shelf solutions ready to deploy. Truly painful experience. But what a lesson.
Another point: the whole system should be API first by design, because it will be easier to work with for you. And the most important, businesses don’t like new softwares, they prefer additional tabs in the existing software (and what they see in that tab is actually what your API delivers). So having the robust API from the very beginning will open you doors otherwise closed because of that constraint from business.
This API first design suggests you adopt modular structure. Donc confuse modular structure with micro services. It’s way easier to maintain a monolith composed of multiple modules, than descend to the hell of micro services.