This course presents the fundamental concepts underlying software engineering, with a particular interest for complex and/or distributed systems. The course is associated to a software development project realized by the students organized in teams. Each session includes a regular talk followed by a collective evaluation of the student project status.
Pre-requisites: This course is not a computer programming course. Students should be comfortable with one or several programming languages before attending the course. Without being an absolute pre-requisite, previous participation to "Algorithms and programming" and "Digital systems: from algorithms to circuits" will be appreciated.
Software engineering is the study of the software production as an economic activity, where hardware, manpower and delays are always limited resources. The advances during the last decade within the domain of software engineering have permitted large productivity gains. The course will focus on understanding how development practices associated with appropriate tools influence (positively or negatively) the productivity of the software industry.
Distributed computing systems will be integrated in the course as objects of interest, but also, through the student team project. The motivation of this choice is twofold: first, the evolution of computing hardware is the leading the market toward an "everything distributed" state; second, distributed systems tend to be very challenging both to develop and to debug.
Course notes: http://www.vermorel.com/softeng.html
- AntiPatterns by William J. Brown, Raphael C. Malveau, Hays W. "Skip" McCormick, Thomas J. Mowbray
- Joel on Software: And on Diverse and Occasionally Related Matters That Will Prove of Interest to Software Developers, Designers, and Managers, and to Those Who, Whether by Good Fortune or Ill Luck, Work with Them in Some Capacity by Joel Spolsky
- Design Patterns: Elements of Reusable Object-Oriented Software by Erich Gamma, Richard Helm, Ralph Johnson, John M. Vlissides