An application is made of several components and sub-components, all of which are essential to the functioning of the application. However, there are components more important than others.
In todays competitive market, it is not possible to put equal effort on all components, therefore we need to focus on the most important parts of our software, as that is where the most value can be delivered.
To reveal what is core in our application we need to distill the problem and its domain, after which, we can ensure that the best developers are working on the most important areas for the business, the core domain.
The core domain is what makes the application worth building, is what makes it different, better, than similar products. Its what enables the business strategy.
A domain vision statement, which should be created in the beginning of a project, is an excellent source of information to figure out what is essential for the success of the application, what the business goal is, where the value is and therefore what is the core domain.
While distilling the problem domain, we need to divide the main problem, break it into smaller sub-domains. When we have clear sub-domains, we will be able to identify how important each sub-domain is.
The generic sub-domains, are the components that could be used in any enterprise software like reporting, searching, notification, emailing. These sub-domains do not define the application, they are an utility.
Try to integrate it as a 3rd party library or application, or use the less experienced developers to build it, leaving the more experienced developers free to develop the core domain.
The support sub-domains are the ones that any similar application would have. They define the type of application we are building, but they are not what distinguishes our application from the competition. They are enablers of the application, but not its differential.
As with generic sub-domains, try to integrate it as a 3rd party library or application, or use the less experienced developers to build it, leaving the more experienced developers free to develop the core domain.
These are the sub-domains that indeed deliver a competitive advantage against the competition applications, they are unique to our system, they are what makes our system worth building.
It is important to note however, that the core domain will change over time, according to the market evolution and the corresponding business strategy changes, in order to keep our software with a competitive advantage.
Deadline vs quality
Too many times the business sacrifices the software quality and long term maintainability for deadlines and time to market.
In the other hand, if deadlines and time to market is sacrificed, we end up with prolonged release dates.
A way to not abdicate of either of those, is to reduce the scope. Remove features that are not crucial, that can be done at a later stage and use the time, that was reserved for those features, to deliver the required features with the required quality.
Perfection is an illusion
Not all components of the system will be well designed. But neither is their importance the same, for the system we are building.
Put your focus, your best effort, into having the most important components, the core domain, as well designed and implemented as possible, and accept that the generic and support sub-domains will not be as well designed and implemented as the core domain.
It is, however, very important to create clear and stable boundaries between the components so that the less well designed components don’t end up polluting the well designed components. These boundaries are created through the use of interfaces or even anti-corruption layers.