Architecture and Programming of Software Systems