Designing software for the future