Software Architecture : the Hard Parts