Software engineering strives to come up with the best practices of developing software at a certain level of quality. We do need correct and performant programs. In this part, we’ll talk about errors in our programs and learn ways to handle them. Some of the errors are inevitable at run time, so we have to alleviate their consequences for users. Some of them can be fully avoided by applying smart testing techniques. We’ll also cover performance problems, both discovering them and dealing with them. We’ll then take a small detour in this part. In chapter 9, we’ll talk about internal compiler things, such as Haskell program behavior at run time. I find understanding this topic crucial for developing efficient and performant software in Haskell.