Developing highly complex distributed systems: A software engineering perspective