Implementing a complex solution from scratch is infinitely more difficult then creating a complex solution in layers. There are several useful principles to keep in mind when designing and building complex systems.

The first is the KISS principle - Keep It Simple, Stupid. The KISS principle holds that the simple solution is usually the best solution. You need a strong incentive to design a Rube Goldberg contraption instead of using a simple mousetrap.

Complex solutions need complex maintenance. They are harder to build, harder to predict, harder to validate and harder to fix. But when designing software it’s easy to lose sight of whether a solution is complex. Some technology platforms make SOAP easy, some make REST easy, when possible use the one that fits your platform. But don’t go looking for reasons to use a technology that sounds interesting to you. If you like XSLT don’t be blinded by it and use it in place of a database.

The second principle is YAGNI - You Ain’t Gonna Need It. Many features aren’t strictly necessary for the operation of the system. But the business is often distracted from the core mission and focuses on functionality that isn’t needed. This is where architects and developers have to get their hands into the business. It can be extremely difficult to drive the business away from pet features.

When arguing for YAGNI, you can point to examples like Gmail and other Web 2.0 applications. They began with a very simple feature set implemented well. Over time they grew into much more complex systems. It’s not about rework, it’s about evolution.

When you develop a complex system in layers, everyone benefits. The business sees visible progress and can map that progress against further requests. The developers see visible progress and gain confidence. Lessons learned from early implementations can also be factored into later implementations. Software development becomes more predictable and controllable.