This updated book blends concepts with real, practical applications by providing an abundance of examples. The authors apply state-of-the-art software engineering methods consistently with two case studies: a realistic information system and a requirements-rich real-time system. Using modeling as a thread to tie together techniques, the book shows how software engineering is not a set of disjointed practices, but instead instantiates a key set of abstraction techniques.