Software applications have become very complex. They need to have high performance, scalability, maintainability, extensibility, security, distributed design, fail-safe mechanisms... the list goes on. These quality attributes make application plumbing complex.