% DRAFT: Running Software: A Preliminary Hierarchy of Abstraction % Michael Stone % March 15, 2014 As I wrote a few months back, I've been thinking about [how to run software][software]. Since then, I've noticed: 1. As with networking, the static parts of the end-to-end task of "running software" seem to be usefully decomposable into a hierarchy of layers of abstraction like so: ![](layers.svg) 2. As in manufacturing + product development, the [intersecting waterfall/spiral][joint-model] seems to be a useful mental model for how to bring software together with hardware. [software]: /posts/running-software-20130816/ [joint-model]: http://books.google.com/books?id=OT8NntOdjU0C&pg=PA61 3. Curiously, even though it has historically been the case that different languages are used both within and between layers, I find that I am increasingly enjoying systems that impose more uniformity, both for in-layer work (like, e.g., [Golang][golang] and [GCL][gcl]) and for between-layer configuration (like [Nix][nix]). [golang]: http://golang.org [gcl]: http://alexandria.tue.nl/extra1/afstversl/wsk-i/bokharouss2008.pdf [nix]: http://nixos.org