10 min read Foundations Lesson 01 of 12
Course 02 · Part 1 — The Foundations of Software

What Is Software?

We use software every day. But what is software really, and how does it fundamentally differ from physical silicon hardware?

Software in Our Everyday Lives

We use software constantly throughout our waking hours. We open Facebook on our phones, stream videos on YouTube, navigate websites through web browsers, calculate numbers, play games, and the moment we press the computer's power button, we are already interacting with software.

But what actually is software?

Many people equate software simply with an app or a program. However, the true concept of software is far broader, deeper, and more fundamental.

To understand software deeply, we must first uncover the foundational relationship between hardware and software.

1. The Difference Between Hardware and Software

Hardware consists of the physical parts of a computer that exist in the tangible, material world. These are components you can see, touch, wire up, and physically modify.

Physical Hardware

Tangible electronic components you can touch:

  • CPU (Central Processing Unit)
  • RAM (Random Access Memory)
  • SSD / HDD (Storage Disks)
  • Keyboard and Mouse
  • Monitor & Motherboard
Digital Software

Instructions, programs, and data you cannot physically touch:

  • Operating Systems (Windows, Linux, macOS)
  • Web Browsers (Google Chrome, Firefox)
  • Applications (VS Code, Photoshop)
  • Mobile Apps (YouTube, WhatsApp)
  • Scripts & Code (A Python Program)

Software cannot be held in your hands like a stick of RAM. Thus, the classic introductory analogy goes:

“Hardware is the machine; software is the set of instructions that makes that machine do meaningful work.”

However, this analogy alone is incomplete. Software is not merely a sequence of instructions; a complete software system encompasses data, runtime configurations, libraries, and many other cooperating components.

2. So, Is Software Just Code?

The short answer is: No.

When we learn programming, we write human-readable source code. For example, in Python:

main.py Python Source Code
print("Hello")

This is a microscopic sample of source code. But the physical CPU inside your machine cannot directly read or execute these English characters.

Our human-written source code must somehow be transformed, compiled, or interpreted into a form that the computer's low-level execution engine natively understands:

From Code to Processor Execution

1
Human Code
Written Source Code
2
Translation
Compiler or Interpreter
3
Instructions
Machine Code or Bytecode
4
CPU Execution
Hardware Execution

In Course 01, we learned that the CPU ultimately executes binary opcodes using electrical signals and logic gates. In this Course 02, we investigate: How do those instructions actually get there in the first place?

3. The Layers of Software

Thinking of software as a single homogeneous layer makes computer architecture confusing. In reality, software operates in distinct, hierarchical tiers.

In any modern computer, you can visualize the software stack as a series of cooperating levels:

5
Application Software

Chrome, VS Code, Spotify, Games — what the user interacts with

4
System Software / Runtime / Libraries

Python Runtime, Node.js, C Standard Library (glibc)

3
Operating System (OS Kernel)

Linux Kernel, Windows NT Kernel, macOS Darwin

2
Firmware & Device Drivers

UEFI / BIOS, GPU Drivers, Network Drivers

1
Physical Hardware

CPU, RAM, SSD, GPU, Motherboard

Example: Booting up your laptop

You press the power button. Extremely low-level firmware (UEFI/BIOS) immediately initializes the memory controllers and hardware buses. Next, the Operating System kernel loads into RAM. Finally, applications like Chrome, VS Code, or Spotify launch atop the OS.

When you browse the web in Chrome, Chrome never directly manipulates physical silicon pins. Multiple protective, organized software layers handle the heavy lifting beneath it.

4. Why Do We Need an Operating System?

Imagine a scenario: What if your computer had no operating system installed at all?

You strike a key on your keyboard. Electrical pulses travel through the USB bus. The CPU is technically capable of processing those signals, but:

Which specific running application should receive that keystroke?
Which monitor pixels should be illuminated with what color?
On which physical sector of the storage drive should a file be saved?
How is RAM partitioned so programs don't overwrite each other's data?
How can your browser, music player, and code editor run concurrently without causing crashes?

To solve all these coordination challenges, we require a specialized category of foundational software: the Operating System (OS).

Windows, Linux, macOS, Android, and iOS are classic examples. An operating system arbitrates physical hardware resources and provides a stable, protected environment for user applications. Calling an OS just "software to boot your PC" is an understatement—it is the central traffic controller and resource manager of the entire computer.

5. Does an Application Directly Access the CPU?

An application ultimately has its instructions executed by the CPU. However, applications do not manage the low-level mechanics of physical hardware on their own.

Real-World Flow: Saving an Image in a Photo Editor

Suppose you are editing an image in Photoshop and click the “Save” button.

1. Photo Editor: The application manages UI logic: “This file needs to be saved to disk.”
2. Operating System: The app issues a privileged system call (e.g., write syscall) to the OS kernel.
3. File System: The file system (NTFS / APFS / ext4) calculates file metadata, directory entries, and block offsets.
4. Storage Driver: The NVMe/SATA driver generates hardware packets for the drive controller.
5. Physical SSD: Floating gate voltage states in flash memory cells are modified to permanently record the bytes.

The First Golden Rule of Systems Software:

“Software never operates in complete isolation. Layers of software collaborate synchronously across the stack.”

6. Another Crucial Half of Software: Data

Software is never just executable code instructions. Its vital counterpart is Data.

Consider a streaming music app like Spotify:

  • The application Instructions (Code) specify: play audio, pause playback, adjust volume.
  • What is the music track itself? It is digital Data.
1. Instructions (Code)

Algorithmic logic, loops, and functions that dictate actions and behavior.

2. Data (Information)

Photos, audio streams, videos, documents, user profiles, and database tables.

3. Configuration (Settings)

App themes, access keys, network port mappings, and runtime preferences.

Therefore, an operable, real-world software system is always defined as: Instructions + Data + Configuration.

7. Where Does Software Actually Live?

A common naive answer to this question is:

“Software lives inside the computer.”

While not entirely false, it is fundamentally imprecise. Where inside the computer does software reside at any given moment?

1. Storage (SSD / HDD)

When an app is closed, its executable binaries sleep on persistent storage disk.

2. RAM (Memory)

When launched, the OS copies essential code and allocates state in high-speed RAM.

3. CPU (Processor)

The CPU fetches, decodes, and executes those instructions from memory continuously.

The universal execution lifecycle of software is: Storage → RAM → CPU → Execution. This concept forms the bridge directly from our hardware fundamentals in Course 01 to the software story.

8. How Does Software Give "Intelligence" to Computers?

A CPU alone possesses zero native awareness. It does not "know" how to launch YouTube or render a 3D video game. It simply fetches and evaluates billions of microscopic binary instructions every single second.

Software engineers structure these instructions into meticulous, deterministic sequences so the machine performs purposeful work:

1 Read data from memory or input devices (Read Data)
2 Perform arithmetic or logical checks (Process Data)
3 Update internal states or generate outputs (Produce Result)
4 Emit output to screen, network, or storage (Display Output)

In complex applications, instructions number in the billions. Yet boiled down to first principles:

“Software is an organized system of instructions and structured data designed to command a computer.”

9. Can a Computer Work Without Software?

This question brings forth a crucial insight into computer systems:

Hardware can receive electricity and oscillate its internal clock crystals. But without software, it cannot perform useful computing.

Even if you have the world's most powerful processor, 128 gigabytes of ultra-fast RAM, and a cutting-edge PCIe SSD, without an operating system and software installed, you cannot open a browser, compile a program, play audio, or save a single file.

The Role of Hardware

Hardware gives the machine its physical capability.

The physical ability to conduct electricity and compute logic.

The Role of Software

Software tells the machine how to use that capability.

The mind and instructions that turn silicon into a living tool.

Evaluating either in isolation leaves you with only half the picture. Together, they constitute a complete computing machine.

10. Thinking of a Computer System as Layers

Let us visualize the complete stack in a clean, unified architectural diagram:

┌───────────────────────────────────────────────┐
│              Applications                     │
│      Chrome  •  VS Code  •  Games             │
└───────────────────────┬───────────────────────┘
                        ↓
┌───────────────────────────────────────────────┐
│            Libraries / Runtimes               │
│     Standard C Lib  •  Python  •  V8          │
└───────────────────────┬───────────────────────┘
                        ↓
┌───────────────────────────────────────────────┐
│               Operating System                │
│     Kernel  •  File System  •  Scheduler      │
└───────────────────────┬───────────────────────┘
                        ↓
┌───────────────────────────────────────────────┐
│              Drivers / Firmware               │
│         UEFI / BIOS  •  GPU Drivers           │
└───────────────────────┬───────────────────────┘
                        ↓
┌───────────────────────────────────────────────┐
│               Physical Hardware               │
│        CPU  •  RAM  •  SSD  •  Peripherals    │
└───────────────────────────────────────────────┘

This is a simplified abstraction of real computers, which contain additional specialized microarchitectural layers. Yet it teaches us the most essential principle:

“A modern computer never operates via a single monolithic program. It is an orchestra of disciplined layers running in harmony.”

11. What Will We Learn in This Course?

Now that we understand software's place in the machine, our upcoming questions become genuinely exciting:

? What is a program fundamentally, and where does code go in memory?
? How are machine instructions synthesized from human source code?
? How does an operating system load and prepare a binary in RAM?
? How does the CPU clock through and execute individual instructions?
? How do applications receive keystrokes and paint graphical pixels?
? How do dozens of programs run concurrently without memory corruption?

We will answer each of these questions step by step over the next 11 lessons of this course.

🧠 Key Takeaways

  1. Hardware represents the physical computing components: parts you can physically touch and measure.
  2. Software is a coordinated system of instructions, programs, and data: giving life and purpose to hardware.
  3. Applications do not manipulate hardware directly: they delegate work through operating system kernels and drivers.
  4. Operating Systems manage hardware resources: providing an isolated, safe execution ground for software.
  5. Modern software works in layers: with each layer abstracting complexities for the tier above it.
🚀 Next Lesson

Lesson 02 — Program, Instructions & Machine Code

In our next lesson, we dive down to the bedrock layer: what a program looks like in memory, how CPU instruction sets function, and how binary machine code drives electronics.

“How does our high-level code ultimately transform into the exact binary opcodes executed by the CPU?”
Start Lesson 02