A Philosophy of Software Design , by John Ousterhout describes Ousterhout's general strategies for designing software.