1.1 The Software ProcessSoftware Life CyclesA Programmer’s ToolboxesGoals of Quality SoftwareSpecification: Understanding the ProblemWriting Detailed Specification1.2 Program DesignAbstractionInformation HidingStepwise RefinementVisual Tools1.3 Design Approaches 17Top-Down DesignObject-Oriented Design1.4 Verification of Software CorrectnessOrigin of BugsDesigning for CorrectnessProgram TestingTesting C++ Data StructuresPractical ConsiderationsCase Study: Fraction ClassSummaryExercises