One thing I didn't see mentioned about creating software is that the tools and the systems often have serious problems to begin with, even before you start writing a program.
Some well known examples are:
- major programming languages such as C don't do enough to help with memory safety issues
- lack of explicit types in python function arguments can lead to surprising bugs which recur again and again
- operating systems and platforms, such as different web browsers, adhere to widely different conventions about how dependencies on other libraries and code is managed