The only way to write complex software that won’t fall on its face is to hold its global complexity down – to build it out of simple pieces connected by well-defined interfaces, so that most problems are local and you can have some hope of fixing or optimizing a part without breaking the whole