there's a challenge in how do you structure and organize edge-case logic such that the core application design needn't be entirely redesigned every time a new requirement is revealed or an existing one needs to be altered. When the client comes to you with changes in requirements, having built an architecture that can turn on a dime is a rewarding experience.