Don&#x27;t decompose up-front.  Instead, take your prototype and and start adding the polish necessary to turn it into a finished product.  When a subsystem starts getting so complicated that can&#x27;t understand it when you&#x27;re changing it, look at that subsystem in isolation and figure out how you might refactor it to eliminate code duplication, create simple interfaces, etc.  Eventually you end up with clean system boundaries separated by message passing, but each individual step doesn&#x27;t require that you hold the whole system in your head.