Ideally, we would like to identify universal principles that should be followed in the design of all collaboration architectures. However, as explained in the sections above, there are no absolute rules in the design of these architectures. Therefore, what we offer, instead, is a set of qualified rules summarizing the advantages/disadvantages of different architectural approaches. These can be used by developers of an application/tool to optimize the set of properties that are important for that application/tool.
Layering: A higher degree of layering can support higher degrees of awareness and replication.
Awareness: A higher degree of awareness leads to more flexible sharing and higher-level units of collaboration, but supports less reuse, delays feedback, and increases interaction awareness (if the partitioned approach is not taken).
Replication: A higher degree of replication supports more divergence and a higher degree of concurrency; but requires more layers to be kept consistent, and results in inefficiency, access bottlenecks, and incorrect writes and other side effects.
Concurrency: A higher degree of concurrency increases fairness, performance, and the maximum degree of distribution; but reduces reuse, requires special system support, and increases programming overhead.
Distribution: A higher degree of distribution increases fault tolerance and reduces communication costs, but introduces problems of synchronization and heterogeneity.
Partitioning: Partitioned collaboration awareness reduces interaction awareness; but requires more programming effort and supports less reuse.
Pseudo-Layer: The pseudo-layer approach supports more reuse and modularity; but offers less performance and can result in duplication of effort.
External Modules: External modules are necessary for supporting session management, centralization, site-specific processing, collaboration and interaction independence, and inter branch independence; but increase the complexity of the system and can reduce performance.