Lessons from industrial design for software engineering through constraints identification, solution space optimisation and reus