The guidelines of a good software architecture for achieving NFP goals are as follows:
- For any component, the following points should be taken into consideration
Keep component small, Keep component interfaces simple, allow multiple interfaces to the same functionality, separate processing components from data, separate data from meta-data, Separate concerns into different components, keep the functionality only inside component, keep components cohesive, insulate processing components from changes in data format, give each component a single, clearly defined purpose and a simple interface, replicate data whenever necessary.
- For any connector, the following points should be taken into consideration
Select connectors carefully, use broadcast connectors with caution, make use of asynchronous interaction whenever possible, use location transparency judiciously, Treat connectors explicitly, Keep only interaction facilities inside connectors, separate interaction concerns into different connectors, restrict interactions facilitated by each connector, give each connector a clearly defined responsibility, choose simple connectors suited for the task.
- For architectural configuration, keep frequently interacting components close, carefully select and place connectors in the architecture, consider the efficiency impact of selected architectural styles and patterns, eliminate unnecessary dependencies, manage all dependencies explicitly, use hierarchical decomposition, avoid system bottlenecks, make use of parallel processing capabilities, try to make distribution transparent, use appropriate architectural styles.