 Software is essential to our lives. Imagine living without the internet, Google, Facebook, or your smartphone. We expect our software to work correctly. A bug in a program can make it really frustrating to use, or it could even correct your computer. But it could also be a lot worse than that. What if the software controlling a nuclear power plant fails? Or the software controlling an airplane? Unfortunately, software engineering techniques can help us make software that works correctly. Making good software is difficult, because often software is huge and complex. Some large systems have tens of millions of lines of code. If you printed them out on paper and stacked them like a book, you'd get a stack that's around 100 meters high. That's as high as a 25-story building. If you wanted to read through a program that's size to try to understand how it works, it's likely to take you about 50 years. If some software takes almost a lifetime just to read through, imagine how long it would take to write it. Of course no single person can do this alone. We need teams of developers working on software, sometimes three developers, sometimes ten developers, sometimes a hundred, and sometimes more. This is where software engineering comes in. How do we get a team of developers to write huge software where all the pieces fit together, it works reliably, and it does what the user wants? Software engineering is about so much more than just programming. In fact, the actual programming part is usually only about 20% of software projects. Even today, we are not good at getting software development right. A survey in 2009 found that only around a third of software projects succeeded, while a quarter of projects failed outright, or were cancelled before the software could be delivered. Fortunately, we now know a lot about what works and what doesn't. In this chapter, we'll look at some approaches that add doom to failure, but are still used surprisingly often, and some approaches that seem to work a lot better and can help us create software that does what it's meant to.