I've been confronted recently with the need to come to grips with a rather complicated software solution. The complication in this case isn't just a particular piece of code, or in fact even just the code - peripheral things like the build process and the deployment are complicated too. The general justification for all this complexity is that the problem is complex, and therefore demands a complex solution. I'm not sure that a complex solution is quite the same as a complicated one, but leaving that aside, I just don't really buy it as an argument.
I think the arguments against software and process complexity are legion, and I don't really think I need to enumerate them here. What I'm more interested in is how does it get that complicated in the first place.
The answer I think is that clever people, left to their own devices, will naturally come up with complicated solutions to complex problems. The reason being that a complicated solution is intellectually the easiest thing to produce. It's hard to discover a simple solution when the problem is complex, and if you don't have to explain your solution to anyone - the complicated one works just fine. It's only when someone else has to work on the code, or follow the process, that the cost of complexity becomes apparent. I've often found this to be the case with ant build scripts for example.
So what do you do about this if you'd rather not end up with a complicated solution? Well, I think the answer lies in the phrase 'left to their own devices'. Simply put - don't let people develop code or processes in isolation. No matter how clever or productive they are, make sure that they have to at least explain their solution to their peers. Ideally have them collaborate on at least the design, if not the coding.
Pragmatically sometimes it's just not going to be possible to find a simple solution within the time available. In a nicely componentised system or process, this isn't so bad - you just encapsulate that complexity and leave it for another day. So if you're in a world of complexity, and you're pressed for time - concentrate on encapsulation, isolate that complexity so that you can come back later and clean it up.