Large software systems are among the most complex artifacts mankind has ever built. Software engineering is concerned with the methods, techniques, and tools that allow computer scientists to develop software systems that satisfy high quality standards: systems that are reliable, efficient, and flexible.