Software Co Design: Principles And Practice