Software development has undergone a major change in recent years, partly but not only as a result of the outsourcing phenomenon. Most software projects today are distributed, raising a whole slate of new issues of management, coordination, licensing, stakeholder involvement, specification, quality assurance (in particular testing) and maintenance. While there has been much discussion of the political and economic aspects of outsourcing, the technical consequences and issues of globalized software development are not completely understood. This talk presents a number of research challenges in distributed software engineering. It introduces a number of organizational and technical solutions that we have found to be efficient in industrial practice. On the educational side, it builds on our experience at ETH -- in particular our courses on "software engineering for outsourced and offshore development" and our multi-university distributed project course -- to discuss how to integrate distributed software development into the teaching of modern software engineering principles and practices.