- Allow different parts of the system to use different versions of their dependencies and to make progress without impacting the other parts.
- To make it easy to set up the system in different environments (development, QA, staging, production) without major deviation one from the other.
- To make on-boarding new developers easy.