A Quality-Driven Systematic Approach for Architecting Distributed Software Applications