Content
Early in my computing career, I encountered a useful classification of software that divides it into three categories: system software, application software, and scripts. Although this abstraction is not perfect, it serves as a helpful conceptual framework for engineers and managers alike. Each category reveals unique insights about software development, usage, and the types of people who write them.
At the foundation lies system software, which includes operating systems, compilers, and databases. These serve as generic, foundational components necessary for building all other software types. While system software is widespread, it is inherently undifferentiated and does not perform meaningful tasks by itself. There are relatively few production-quality system software options available—just a handful of operating systems, around ten popular programming languages, and a couple dozen major database engines. The scarcity of choices stems from economic and technical challenges, as creating reliable system software demands large teams of highly skilled developers and often spans multiple generations. Notable examples include Unix and the gcc compiler, illustrating the complexity and scale involved. Despite its importance, only a minority of software engineers specialize in system software development.
Above this layer is application software, which encompasses all named programs designed for specific tasks. Examples range from consumer products like Photoshop, Excel, and TikTok to countless internal tools such as help desk ticketing systems or machine tool controllers. Applications are built on top of system software and sometimes other applications, designed to fulfill particular jobs with limited customization or scripting capabilities. Compared to system software, applications tend to have shorter lifespans, although some like Microsoft Office, Google Search, and Midnight Commander have endured for decades. Application software constitutes the bulk of professional software development, and correspondingly, the majority of professional developers focus on creating these applications.
The third category, scripting, covers software that automates or glues together various components, often tailored to very specific and narrow use cases. Scripts can be as simple as linking a spreadsheet to an email service using tools like Zapier or as complex as data analysis scripts leveraging libraries such as Numpy. Most software in the world falls into this scripting category. Unlike professional developers, script authors often include non-professional programmers like office workers creating Excel formulas or scientists writing data analysis code. Although scripts are generally less complex than full-blown applications, they still involve programming and serve clear practical purposes rather than existing as standalone products.
This framework elegantly places a wide spectrum of programming activities—from NoCode solutions to microcode—on the same continuum, highlighting the diverse tools developers should master. It also encourages developers to consider whether a simple script or automation is more appropriate than building a full application, as scripts can be cheaper to develop and enable faster iteration. Intriguingly, scripts often evolve into applications, and applications can grow into system software, reflecting a fractal nature across layers.
Within organizations, these categories manifest in different ways. Platform teams often customize system software to fit company-specific needs, reducing the complexity of tools used for application development. Historically, internal applications had limited scripting support, but advances in Robotic Process Automation (RPA), NoCode platforms, and Business Intelligence (BI) tools have increased automation and customization capabilities for non-professional developers. Looking ahead, it is expected that non-professionals will take on more software customization roles, driven by improved tools and growing demands for software solutions. Meanwhile, professional developers will focus on core system and user-facing software, providing APIs and data streams for higher-level scripting and automation tools to leverage.
Overall, this classification not only clarifies how software is built and maintained but also offers valuable career insights. Understanding these layers can help professionals choose where to specialize and how to collaborate effectively with others across the software ecosystem.