A software stack is a collection of independent components that work together to support the execution of an application. The components, which may include an operating system, architectural layers, protocols, runtime environments, databases and function calls, are stacked one on top of each other in a hierarchy. Typically, the lower-level components in the hierarchy interact with hardware, while the higher-level components in the hierarchy perform specific tasks and services for the end user. Components communicate directly with the application through a series of complex instructions that traverse the stack.
Parts of a software stack
Software stacks can be simple or complicated, depending on the desired application functionality, and can incorporate components and services from an organization's on-premises resources, third-party providers (such as SaaS vendors) or supplied by a cloud provider. There is no baseline standard for the components and services that must be in a software stack, except that their features and functions support an application's development, delivery and operation.
Depending on the desired application, this could be at a minimum: an operating system, database, tools to support a programming language, and the application. Other components that can be part of a more complicated software stack include abstracted physical resources and virtualization, scheduling and orchestration, databases, computing, networking, security, user interface and more.
Software stack vs. technology stack
The simplest distinction between a software stack and a technology stack is implied in their names. A software stack incorporates only software components required to run an application, some of which could be virtualization or abstracted physical hardware resources. A technology stack includes both software and hardware components of IT infrastructure.
A full technology stack includes all aspects of IT infrastructure required to deploy and manage applications and services: hardware and software components, databases, middleware, storage and networking. In modern enterprise IT, software increasingly makes up more of these stacks.
There are many types of technology stacks. Some are constructed to deliver a technology product or service, while others support a business purpose. Examples include:
- a server stack, which includes the hardware, operating system and supporting software such as runtime environments, database software and software for various web services;
- a storage stack, which includes servers and server software, virtualization and networking components;
- a cloud infrastructure stack, which includes abstracted infrastructure (physical and virtualized hardware resources), platform infrastructure (application servers and databases), applications and services. A vast array of more granular services and functions can be added throughout this stack, such as machine learning, security and monitoring; and
- a marketing stack, which includes an email platform, a content management system, customer relationship management software, and analytics and tracking tools.
Examples of software stacks
Many software stack components are chosen frequently enough that they have become commonly recognized by their names or an acronym representing their core components. Below are several examples of common software stacks in any enterprise.
LAMP (Linux, Apache, MySQL, PHP): This is a well-known software stack for web development. The lowest layer of the stack's hierarchy is the Linux operating system, which interfaces with the Apache web server. The highest layer of the hierarchy is the scripting language -- in this case, PHP. (The "P" may also stand for the programming languages Python or Perl.) LAMP stacks are popular because the components are all open source and the stack can run on commodity hardware. Unlike monolithic software stacks, which are often tightly coupled and often built for a particular operating system, a LAMP stack is loosely coupled. This simply means that while the components were not originally designed to work together, they have proven to be complementary and are often used together. Today, LAMP components are now included in almost all Linux distributions. Developers can swap out MySQL for PostgreSQL to create a LAPP stack. A LEAP stack (Linux, Eucalyptus, AppScale, Python) is another flavor of this open source software stack, for cloud-based development and services delivery.
Apache CloudStack: Large enterprise customers and service providers use this open source cloud management stack to provide infrastructure as a service (IaaS). CloudStack provides developers with multiple layers of optional services as well as support for a variety of hypervisors and application program interfaces (APIs).
BHCS/BCHS (OpenBSD, C, httpd, SQLite): This collection of open source tools for web applications is based on the OpenBSD operating system and httpd web server, and written with C programming language.
GLASS (GemStone, Linux, Apache, Smalltalk, Seaside): This stack for web application development uses the Smalltalk programming language, GemStone as the database and application server, and Seaside as the web framework.
Software stacks can become complex as organizations increasingly use containers, distributed architectures and tie-ins to cloud platforms and services. Software configuration management can be used to strengthen and standardize software development, improve reporting and change management, and help allocate resources to development projects.
Benefits and challenges of software stacks
When stack components communicate through open and standard protocols and application program interfaces, the components become interchangeable with other components that use the same APIs. This makes it possible for a virtual machine (VM) running LINUX to run on the Windows operating system and change from a LAMP stack to a virtual WAMP stack. When a stack is loosely coupled, however, it can be challenging to optimize performance. Each component must be individually analyzed and tuned, which calls for very particular skill sets.
Front end, back end and full software stacks
A back-end LAMP developer position, on the other hand, might call for server-side scripting skills such as PHP, but also require the candidate to know about object-oriented programming (OOP), how to optimize a database for write-intensive applications or how to write RESTful APIs. Programming languages typically used in back-end software stacks include Python, Ruby and C++.
A posting for a full stack developer typically expects the candidate to be responsible for everything from patching the operating system to translating a user experience (UX) team's wireframe designs into code. This type of job can be very demanding because it requires the candidate to be very familiar with every layer of the stack.