Software architecture attempts to bridge the gap between