I recently went through a very interesting excercise: I installed my own engine in my 1985 VW Vanagon (if you are interested: http://www.cloakofcarrot.com/gallery/1985Westfaliavanengineinstallation
)
I did some reasearch, tracked down three companies that built engines for these sorts of vans, chose one. Now the 1985 vanagon has a 1.9l engine, which is no longer made, and was quite unreliable. Fortunately, the engine builders are capable of manufacturing a 2.1l engine that is bolt-equivalent of the 1.9l.
This meant that all I had to do was take the old engine out, swap the parts onto the new engine and put it back in.
I am not a professional mechanic, but was able to work through the process, and the van has been running great ever since.
There are a couple of things to learn here:
-
Why didn’t I build my own engine? Engines are a highly-domain expertise specific thing, and require special knowledge and tools to construct and test. Also - the market will not support a large number of engine builders.
-
By having clearly defined interfaces, I was able to not only change engines, but get a more powerful engine installed
-
It was reletively easy to do, as I simply had to have a good knowledge of the problems that were likely to occur, and the patterns required to solve them. I did not need a low-level understanding of how engines work, how to build engines or how to be a machineist…
This ‘how low do you know’ debate has been going on for years, and is really quite redundant. Different people are going to have different levels of understanding, and tolerance for complexity.
Those with skills and capability to handle the complexity should be involved in constructing lower level systems. But there is not a need for everyone to construct or understand things at a low level: the market will not support it.
The key is for those who engage in building these systems is to have clearly defined interfaces and patterns that will allow the rest to succesfully and effectively apply their creations to solve problems.
Why don’t we all build our own computers and hardware from vacuume tubes and magnets? That way everyone would understand exactly how things work at the lowest level.
Each wave of development builds on the last, and the more recently you learn things, the farther away from the core you get. Certainly, you can spend the time to learn assembler etc, but those skills will not likley land you a job anywhere these days.
The only way to build bigger and more reliable systems is through the use of well engineered systems that can be built into a whole matching a design. The domain experts in building motors can build the motors, and a desginer who needs a motor to power a car or a plant, can select the correct motor for their design and be assured that if they build a system that gives it the right coolant, fuel and oxygen that it will power their system reliably for the specifications provided.
That is how things are done in the engineering world, and that is the way things will continue to move in thes software world.