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 simulation, which took 75 days to create on a supercomputer at NASA's Goddard Space Flight Center in Greenbelt, Maryland, depicts CO2 emissions from May 2005 to June 2007.