Via the remarkable alignment of cloud computing, software as a service (SaaS), and Agile development, the future of software has been revolutionized in a way that also allows us to teach it more effectively. Over the past 3 years we have been reinventing UC Berkeley’s undergraduate software engineering course to cross the long-standing chasm between what many academic courses have traditionally offered and the skills that software employers expect in new hires: enhancing legacy code, working with nontechnical customers, and effective testing. In our course, «two-pizza teams» of 4 to 6 students create a prototype application specified by real customers (primarily nonprofit organizations) and deploy it on the public cloud using the Rails framework and Agile techniques. Students employ user stories and behavior-driven design to reach agreement with the customer and test-driven development to reduce mistakes. During four 2-week iterations, they continuously refine the prototype based on customer feedback, experiencing the entire software lifecyclerequirements gathering, testing, development, deployment, and enhancementmultiple times during a 14-week semester. Because of Rails’ first-rate tools for testing and code quality, students learn by doing rather than listening, and instructors can concretely measure student progress. We have also successfully repurposed those same tools to support nontrivial machine grading of complete programming assignments, allowing us to scale the on-campus course from 35 to 115 students and offer a Massively Open Online Course (MOOC) to over 50,000 students. Indeed, to support instructors interested in adopting our techniques in their classes, we provide not only an inexpensive textbook and prerecorded video lectures to complement the curriculum, but also a set of questions and programming assignments that includes free autograding. Our experience has been that students love the course because they learn real-world skills while working with a real customer, instructors love it because students actually practice what they learn rather than listening to lecture and then coding the way they always have, and employers love it because students acquire vital skills missing from previous software engineering courses.