Common mistake in arch: Using functionality to id services ("Buying Stocks", "Selling Stocks", ...). Functional decomposition maximizes impact of change, is coupled to it. Better encapsulate change to insulate. Do not resonate with change. |
The conclusion is that you should never design against the requirements (or the features, or the use cases, or the user stories). What you must do instead is identify the smallest set of building blocks, call them microservices if you like, that you can put together to satisfy ANY requirement: present and future, known and unknown. There is a strong process angle of how you go about doing just that.
Identify areas of volatilities, and those you encapsulate in (micro)services. Then you implement the required behavior as the interaction between those services. A new requirement would simply mean a different services interaction, not a different decomposition, so now when the requirements change, your design does not.
https://www.infoq.com/news/2016/07/lowy-every-class-service?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global
The visualization shows the history of commits in the Eclipse, Apache, PostgreSQL and Python project. Developers and files are represented as moving elements. When a developer commits a file, it lights up and flies towards that developer.