• When a problem occurs varying data structures is easier than varying logic workflow structures.
  • Data Transfer Objects should be coarse grained and contain no logic.
  • Immutable data objects promote isolation, predictability, and readability.
  • Logic structures should avoid inheritance as much as possible and use a composition workflow logic structure.  The workflow can be altered replaced and reordered.  Watch for attempts to make the workflow a plugin architecture that will instantly transform a robust system architecture into a fragile easy to break system.
  • Optimization before completion of a working system is premature always.  Complete minimal viable architecture and verify all test cases pass before optimization