All too often I hear people dismiss the complexity of software development by claiming that something is just a simple matter of programming. My normal response is that if the speaker thinks it's going to be simple, then he can write it himself.
Even a seemingly trivial application can be amazingly complex when you have to address all the weird and wonderful things that can go wrong. Even a simple thing like sending out email event notifications can have hidden complexities, as we saw in Part 5 of this series, "Creating Acceptance Tests from Use Cases." If the requirements for even a simple club membership system can be quite complex, imagine how much complexity is hidden in larger commercial applications.