LIFE CYCLE OF SOFTWARE ENGINEERING ================================== References: Software Engineering: A Practitioner's Approach by Pressman. Software Engineering by Sommerville. An Integrated Approach to Software Engineering by Jalote. Fundamentals of Software Engineering by Ghezzi, Jazayeri, Mandrioli. Classical and Object-Oriented Software Engineering by Schach. Life Cycle: Often viewed as a "waterfall" from a high-level of abstraction to a low level of abstraction. Sometimes the process must move back to start over again at an earlier phase. The software may follow the classical (structured, function-oriented) or object-oriented methodology. Most of the following phases have a review and sometimes a set of milestones to check whether the process is working appropriately. Note in the following that "outputs" are "deliverables". Planning: Goal : On-going process of planning and organizing resources to achieve effective software development. Output: Software Project Plan Requirements: Goal : High-level description of the product. Output: Requirements Specification Document: Goals, Narrative, Priorities, Constraints, System Inputs/Outputs. Analysis: Goal : Investigation of "what" the system will do. Types : Structured Analysis with Data Flow Diagrams. Object-Oriented Analysis with classes and associations. Input : Requirements Specification Document Output: Analysis Specification Document: Models which abstract the system in order to reduce complexity. Validation Test Plan Optional Prototype for users to test drive the system. Preliminary User's Manual. Design: Goal : Specification for "how" the system will be built. Types : Structured Design with transform analysis to produce a control hierachy. Object-Oriented Design with objects, attributes, methods. Input : Analysis Specification Document Output: Design Specification Document Preliminary Design: Data Design: High-level presentation of data structures. Architecture Design: Structure/Organization of modules or objects. Detail Design: Detail Data Design: Low-level presentation of data structures. Procedural Design: pseudocode, flowcharts, or collaboration diagrams. Implementation: Goal : Effective translation of a design to a programming language. Input : Design Specification Document. Output: Code. Test: Goal : Systematically uncover errors within a reasonable amount of time and effort. Inputs: Project Plan from Planning. Analysis Specification Document including Validation Test Plan. Code from Implementation. Test Plan which can be constructed before the actual testing phase begins. Output: Reliable code which conforms to the specification. Unit: Test of individual modules/objects/functions with white, sometimes black, box test. White Box: Using the source code, develop test cases that will exercise the code in various ways: execute all paths, test boundaries of loops, etc. Black Box: Using the specification of the interface of the module, develop test cases that generate different inputs and check the output results. Integration: Test of modules until the software is completely integrated. May use: Top-Down : need stubs for underlying modules. Bottom-Up: need drivers to test underlying modules. Sandwich : spread out towards top and bottom with drivers and stubs. Builds : groups of modules that can be tested together. Harness : support environment (databases, etc.) to execute modules. Validation: Test the software against the Validation Test Plan. Does the software give the expected results using black box testing? System: Integrate and test the software with all system/hardware components. Performance: Measure the performance against specification, often using instrumentation. Stress: Run the system with abnormal quantity, frequency, or volume. Regression: Test a new release of software against a previous release and its outputs. Maintenance: Goal : Provide for the continued support of released software. Inputs: Bug Reports, Enhanchement Requests. Output: Updates and new versions of software. Rework: Correct, modify, enhance existing functionality. Reverse Engineering: Extract the design of the software from existing sources. Reengineering: Modify the software to use more modern techniques.