This course introduces software engineering paradigms that have shaped the field over the past few decades. Students are exposed to fundamental disciplines of software engineering as well as models and formalisms that crosscut system, project, and user perspectives. Students learn to iteratively define requirements, architect, design, implement, integrate, test, and deploy a solution. Students work on self-organizing teams, define their own software processes, and manage the work. Students learn to solve a real problem subject to multiple constraints by keeping the stakeholders involved throughout the lifecycle and by balancing underlying engineering tradeoffs. The topics are applied in the context of a semester-long project. In addition, the course includes a survey of common types of modern software systems having unique demands and specialized technology stacks, such as mobile, connected embedded, enterprise, cloud-based, and data-intensive systems.