This course introduces students to the techniques used by programmers to produce code that is flexible, easy to debug, and easy to enhance; and maintain in the future. The Software Engineering course is divided into two parts. The first part describes the basic tasks one needs to complete to deliver useful software. These tasks include designing, programming, and testing. The second part describes some common software development models that use different techniques to perform those tasks.