This document introduces software design and the software development life cycle. It discusses how software design uses abstraction techniques like data abstraction, procedural abstraction, and information hiding to manage complexity. The key activities in the software life cycle are requirements specification, design, implementation, testing, and maintenance. Object-oriented design and the Unified Model life cycle are also introduced. The document then provides an example design and implementation of an array-based phone directory to illustrate these concepts.