This course teaches the basics of modern software development – the techniques and practices used to build a piece of computer software that meets high standards of quality, reliability, security, and maintainability. Programs you wrote in previous courses were most likely small and short-lived, and their defects and failures would have had minor consequences. Real-world software differs for several reasons: it is large and complex, it is developed by a team, it lives long and evolves and needs to be maintained, and it can cause serious harm if it fails. Such software must be carefully developed in a professional manner, using techniques and a mindset similar to those you would use to build a tunnel through a mountain, not those you would use to dig a hole in a garden.

Software engineering is a long-established field of computer science, with a wide range of techniques that have been proposed, a narrower range that are actually in use, and a far narrower range that are of demonstrated value. In this course, we focus on three of the most important aspects: Which are the tools and practices of modern software? How do we produce high-quality software? How do we develop software in a team? The tools include version control systems, automated testing tools, and automatic defect-detection tools. The practices include design patterns, defensive programming, modularity, abstraction, and agile development. Learning to work collaboratively with a team of people to write, test, and debug a single piece of software can be at times challenging and frustrating, but it is impossible for one person to produce software of the size and complexity of modern applications or systems. For this reason, we focus on learning the skills for developing software with other people.

This is a hands-on, practical course – the equivalent of a lab course in other fields. You will apply the ideas learned in lectures through an extensive class project that requires a large amount of programming. This will be hard work, but also an immense amount of fun!