Software is the set of programs, concepts, tools, and methods used to produce a running system on computing devices – John Tukey, 1958.
A program is a set of instructions that inform a computer how to perform a very specific task. Every computer system consists of thousands of specialized, small-to-medium sized programs working in harmony to deliver a functioning system. No single program exists in isolation, and any programs that we write and execute depend on a number of other programs for their creation and operation.
When we talk about programs, we’re talking about a very broad category that includes:
- System software: programs written to provide services to other software. This includes operating systems, drivers, compilers and similar systems.
- Application software: programs written primarily for users, to help them solve a problem or perform a task, typically by manipulating and processing information. Applications are common on mobile or desktop devices, and on the web.
In this course, we’re going to focus on application software, or software designed to solve tasks for people. This includes work and productivity software, games or other types of useful programs that people use everyday. e.g. software to manipulate numbers (Excel), compose documents (Word), write code (Vim) or entertain ourselves (League of Legends).
In particular, we’re doing to talk about full-stack application software.
Full-stack is an overloaded term in software development. Historically, it referred to the idea that an application often has a “front-end” (user interface) and a “back-end” (server or process performing the actual computation). A full-stack developer in that context is someone who is capable of working on both “sides” of this boundary: the front-end that the user sees, and the back-end that does the “heavy lifting”.
In modern usage, we tend to think of full-stack in terms of a local “front-end” application, and one or more remote “back-end” services. e.g. a Twitter client fetches data from a remote system, and displays them on your local device. The application that you are running is responsible for communicating with, and fetching data from this remote system, as well as any local operations.
We focus on full-stack development because most software has some remote functionality that it leverages. In today’s world of “big data”, it’s common to write applications that rely on shared, remote data. Even so-called “standalone” applications will typically rely on a remote system to check that the user is licensed, or to check for application updates on execution.
Full-stack application development then refers to designing and building applications that offer client-side functionality, but that can also leverage back-end services when required.
How we perform software development
“Software development refers to a set of computer science activities dedicated to the process of creating, designing, deploying and supporting software." – IBM Research, 2022.
Software development is the complete process of taking a software system through requirements, design, implementation and eventual delivery to a customer. Software development isn’t just programming, but consists of many interrelated activities across different disciplines. It’s important to consider the broader context so that we can be confident that
- we have a target user, and a problem that they need solved.
- we have determined the characteristics or requirements of a solution.
- we have delivered something that will address their problems in an efficient and elegant fashion.
This is a course on software development in this broader-sense: going from initial requirements and working through the process to deliver a final product that someone can use and enjoy. However, for the sake of expediency (and the need to fit everything in a single term!) we will focus most of our attention on the design + implementation of software applications.
Software is only useful if it solves a problem for someone. We cannot develop software in a vacuum.
The importance of quality
The growth of software systems has easily been the most pervasive technological advancement of the past 50 years. Software underpins most industries: banking, finance, transportation, manufacturing, research, education, retail. It is practically impossible to live and work in modern society without interacting with software on a daily basis1.
Due to this, the software that we design and write can have significant real-world impact 2:
- Software has become embedded in virtually every aspect of our lives. Although software was once the domain of experts, this is no longer the case, and software is routinely used by consumers. We should strive to build software to meet the needs of all people.
- The information technology requirements demanded by individuals, businesses, and governments grow increasingly complex with each passing year. Design is a critical activity to ensure that we address requirements and build the “right thing”.
- If the software fails, people and major enterprises can experience anything from minor inconvenience to catastrophic consequences. Software should be high-quality, safe and reliable.
- As the perceived value of a specific application grows, the likelihood is that its user base and longevity will also grow, and demands for adaptation and enhancement will also grow. Software should be adaptable and scalable.
For these reasons, software design is mandatory to ensure that we build high-quality, stable, scalable systems. This will be a major topic as we progress through the course.
I’m writing this on a notebook computer, while wearing a smartwatch, with a smartphone in my pocket, a tablet on the table beside me and my speaker streaming music over the Internet. The amount of computing power at our disposal is astonishing. Also, I have too many gadgets. ↩︎
[Pressman & Maxim 2020]. ↩︎