All of the information for this course (homework assignments, project information, communications from the staff, etc.) and discussions will be conducted on the Discourse server for this course https://sweng-forum.epfl.ch/ not through edX or this website.

This course will teach you the basics of modern software construction – the techniques and practices used to build a piece of computer software that meets high standards of quality, reliability, and maintainability. For most of you, the programs you have written previously, for your own use or for classes, were small and short-lived, and their defects and failures would have had minor consequences (perhaps your grade!). Experienced developers can write very good software at this scale without employing sophisticated techniques.

Real software – whether closed or open-source – differs for several reasons:

·      It is larger and more complex

·      It is developed by a team

·      It is maintained and evolved over a long period of time

·      It can cause serious harm if it fails

This 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 very 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 will focus on three of the most important aspects of software engineering:

·      Modern software development tools and practices

·      Producing high-quality software

·      Software development with a team of people

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.

The other theme of the course is learning to work collaboratively with a team of people to write, test, and debug a single piece of software. Many will find this aspect of the course to be very challenging and frustrating, but it is impossible for one person to produce software of the size and complexity of modern applications or systems, so it is essential to learn to develop 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 presented in lectures by constructing an Android app. This course requires a large amount of programming, as the only way to really understand and apply techniques and practices is to try them out in a realistic setting, which entails building a non-trivial software system with a team of people.

At the same time, we hope to make this course enjoyable and interesting by allowing each team to build an application of its own design that does something that the team finds interesting and useful.