I have always enjoyed the clarity given by the OSI Model. It provides a mental framework for how different technologies like HTTP, TCP, IP, and 802.11 come together, each solving their assigned problems, and mostly seamlessly interoperating (with the help of some Narrow Waists).
I think it'd be an interesting exercise to divvy up the universe of software jobs along the same lines. I always think of how the value chain for humans is kind of similar, from the Hardware folks who make it all possible, all the way up to the Application folks who create business value, and all the interesting software jobs in between.
So without further ado, here it is:
Here my focus is on accounting for people who are primarily expected to code for their jobs. If you are a founder or PM or developer advocate, you might code every so often, but during that time you are acting as one of these roles rather than as your main job.
Because I primarily work at the App layer, you may also see some bias due to my lack of knowledge of other layers. Please feel free to add/correct me :)
Descriptively, I see the primary axis of software jobs as adding value from Machines all the way to End Users:
- At the lowest level we have people who work with Hardware. Their job is to expose new Capability for us hungry hungry software devs to eat up.
- Then, technically not required but a practical reality these days, we have the Cloud/Datacenter people. Their main job is Availability. Arguably you could view them and other Cloud Distros as providing "virtual" Hardware for the rest of us devs to run on.
- Next, we have people who make Runtimes. This includes Browser Devs, Language designers, and Framework/Tooling/Infrastructure Devs that are basically responsible for all the Developer Experience we enjoy.
The three layers we just covered I call Platform development. They don't really have anything specific to do with the Products that the next three layers create, but of course they make it all possible.
- Backend developers create internal/private/non-User-Facing Services that encode the secure Business Logic of the apps. I've taken a rather expansive definition here, including Machine Learning, Research, Process Automation, Security, Compliance, and Billing. The idea is that UX isn't the focus - it's more the functionality that is the focus here.
- Then, we have developers who work on Applications of all the prior layers. This is everyone else who codes - from Game Devs to Plugin Devs, to Sales/Support engineers and Mobile/Web Devs. They are uniquely responsible for creating a great user experience.
- Lastly, we have end users who create software with the software we give them. End User Computing lets users create software, but without traditional coding. This includes everyone else from Business Analysts working in Excel to productivity geeks setting up #NoCode automation.
The assertion is that as these jobs get more numerous as we get closer to Users, who are more diverse and therefore require more customization. Work is also "further away from the metal" and when we code at higher layers, we are increasingly encouraged to pretend that the resource constraints of layers below don't exist (for developer experience). This is, of course, a leaky abstraction - but a lot of the time it works.
I don't have much else to observe for now. Do you think there are other dimensions we can split these jobs, and what other commonalities can you find between layers?
Author's Note: This is part of the Strategy section of my upcoming book on Cracking the Coding Career. If you liked this, come check out the rest of the topics!