Clojure hacker Stuart Sierra wrote an insightful piece on the design philosophies of developer tools. His conclusions are paraphrased here:
Git is an elegantly designed system of many small programs, linked by the shared repository data structure.
Maven plugins, by contrast, are not designed to be composed and the APIs are underdocumented. With Maven, plugins fit into the common framework of the engine, which strikes me as maybe a more difficult proposition than many small programs working on a common data structure.
Of the anarchic situation with Ruby package management (Gems, Bundler, and RVM) Sierra says, “layers of indirection make debugging harder,” and “The speed of development comes with its own cost.”
- Plan for integration
- Rigorously specify the boundaries and extension points of your system
...and I really like this idea:
- The filesystem is the universal integration point
- Fork/exec is the universal plugin architecture