Taking a learn-by-doing approach to software design, this text offers a blend of theory and practice to provide students and practitioners key concepts relevant to today's software designers. It contains examples, review questions, lab exercises, and case studies in order to illustrate real-world problems.