This textbook provides a comprehensive treatment of the theoretical and practical aspects of discovering, analyzing, modeling, validating, testing, and writing requirements for software systems. New chapters examine nonfunctional requirements and requirements of systems using disruptive technologies such as blockchain.