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. Most programs we write in courses are typically small and short-lived, and their defects and failures have 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, as a field, has seen a wide range of techniques being 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 the latter, concentrating on three 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 automated defect-detection tools. The practices include using 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 alone software of the size and complexity required by modern applications and systems. For this reason, we focus on learning the skills for developing software together 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!