Course Instructor
Course Information
You can find an unofficial version of the course outline here.Announcements
- Feb-16-2011: Tutorials' schedule updated.
- Feb-16-2011: Lecture notes for Testing 2 (and AOP) are now avaliable.
- Feb-10-2011: Lecture notes for Testing 1 (and AOP) are now avaliable.
- Feb-8-2011: Lecture notes for AspectJ are now available.
- Feb-4-2011: Please note tha the lecture for Feb-3-2011 will be posted after I finish running the demo next Tuesday.
- Feb-2-2011: A clarification has been added to assignment 1 description.
- Feb-1-2011: Lecture for Feb 1st posted. Note that the lecture includes nswers to questions received so far on assignment1.
- Jan-31-2011: Tutorials' schedule updated.
- Jan-27-2011: Assignment 1 released.
- Jan-26-2011: Program understanding & impact analysis lecture posted
- Jan-21-2011: Program understanding lectures posted
- Jan-21-2011:
The grading scheme page has been updated to include the details
discussed in the lectures
Course Objectives
Basic software engineering courses focus on how to build a software system on a green field site. However, as a developer heads to the industry, he spends most of his time maintaining medium to large scale systems, that he has not contributed to their initial design or implementation, thus knows no information about their internal secrets. Maintaining an existing systems demands the developer to first understand the existing system design and implementation details (sometimes in the absence of documentation), to know which parts of the system would need to be modified, and to make sure that his applied modifications will not alter already working functionality, or inject additional defects.
This course aims to give students a realistic experience in how to maintain existing open source applications, in addition to learning how to design a software system so that it would be easy to maintain later on. By the end of this course, students will learn:
-
Techniques to help understand a software system that was developed by different authors (Program understanding )
-
How to identify the affected portions of the system by an intended change for some maintenance task (Software change impact analysis )
-
Techniques to enhance the ability to evolve a software system, and if that is always easy to do (Design for reuse )
-
How to reuse existing functionality during system evolution tasks to lessen the chances for injecting new defects (Software reuse )