There is complex and there is difficult, they are not the same.
Being able to run a marathon is very difficult. But what you have to do to prepare is simple. A small sheet of paper is enough to describe the steps. You will need tremendous effort and discipline - so it’s hard - but it is simple.
Software development is different: it is also complex.
A common theme in my articles on how we do Rails at 37signals is how facing software development with rigid recipes is naive and counterproductive. A good example is services: using a service for everything is a simple idea; applying domain-driven design and object orientation is not. Another manifestation is banning techniques because they can be harmful: concerns, accessing the database from models, callbacks, globals, etc. Ironically, the alternative critics usually recommend for those is using services.
In software, you must take a Babylonian body of knowledge, combine it with your own experience, and apply the result to make countless daily decisions. And of all this for a problem you can’t understand without solving it first. Rigidity doesn’t work, and – because this is a game of intricate complexity – it yields more harm than benefit. You need to embrace nuance.
Mind the recipes you follow.