So, dear Bob, I think the answer is fairly simple. If you can’t build it all and you can’t buy it all, you simply have to find a compromise. The only question is what flavour that compromise should be.
The problem with many compromises is that they occur in the wrong way – as the accidental outcome of a failed effort to either buy all or build all.
To make choices which are not accidental requires that we open our eyes and accept the reality of the need to compromise, and on this point both developers and architects alike struggle to get real. Without the ability to put our minds in neutral and to analyse the situation from a point of rest, there is a huge chance that we will assume a silver-bullet approach to technology can work. Technologists get excited about technology because it’s powerful. We understand the secret potential inside these machines and we yearn to see that potential realised in the lives of the people we work with. Any whispered message offering the hope of quick realisation (rather than the more usual drawn-out frustration) is instantly compelling.
So perhaps the better path is to see that for any given problem, the likely solution is a combination of buy and build. Not the horrific buy-then-customise option which is so often the way things work, but instead, analyse the problem in terms of complexity, buy the complexity, and build the rest of it.
If you’re in the business of producing cars, buy the engine and the chassis, and possibly the fiddly electronic bits, then make the rest of it.
There’s a reason behind this apparently arbitrary designation. It comes down to knowing what our core values are as producers. If I am a car producer, the equipment involved in the manufacturing of an engine and/or chassis may be quite distinct from that of manufacturing the seats and body. In order to concentrate excellence, focus on doing one or two things really well, and outsource the rest. That way you can continue to add true value without diluting the excellence of the other components.
This can be applied using a workflow as follows:
1. For any given build, when you break the build down into its component parts, break them down into components which are of roughly equal impact to the end-user. Or, to state it another way, each component you identify should be of roughly equal business-value.
2. Decide on an aspect of the project which usually is the most painful (for most people this will be either "effort” or “complexity”, but it may also be an aspect which is simply outside of your core expertise (e.g. “user interface”))
3. For each component, assign a pain rating (3 – high, 2 – medium, 1 – low, 0 – none)
4. Try to buy components for anything 3 or 2, try to build anything 1 or 0