A good development system will permit many approaches to the design of an application or service. Some of these approaches will be flexible, some will be rigid; some stable (even in the face of change), and others brittle and prone to failure.
What makes the difference between systems that come together easily working so well, and systems that seem to fight back with their authors, never coming together without a fight? Why is it that the one approach can work so well in one tool, but be a proverbial pain in another?