Last night I was on my laptop (a MacBook Pro M1 from 2022) and I noticed that it was running extremely hot. It was a combination of a Twitch stream in the background and a few shopping sites in browser tabs playing media that combined to create a bunch of CPU cycles going to waste heat, but it got me thinking about how much cooler this laptop ran than the previous generation Intel Mac under the same casual browsing load for quite a while, and now a few years on it’s starting to echo those same limitations. This just makes me think of Wirth’s Law.
Niklaus Wirth was born in Switzerland and received his Ph.D. in Electrical Engineering and Computer Science from the University of California in 1963. Wirth alternated between computer science professorship posts in California and Zürich over his career, and wrote one of the earliest papers on the theory of software application design, “Program Development by Stepwise Refinement,” which influenced Fred Brooks of Brooks’ Law fame.
Stemming from frustrations with the standardization of the ALGOL programming language, Wirth created the Pascal programming language as a solo project. Pascal was popular for a time in application development and for a longer time in teaching.1 Wirth also created the Modula and Modula-2 languages which influenced the later development of C++.
With’s legacy of programming language design earned him a Turing Award in 1984, the titles of Fellow of the ACM (1994) and the Computer History Museum (2004), and the ACM SIGSOFT Oustanding Research award in 1999.
In 1995 Wirth published the paper A Plea for Lean Software in the journal Computer, in which he makes two concise claims in the thesis. The first of which,
Software expands to fill memory,
is a restatement of Parkinson’s Law as applied to computing. The second of these,
Software is getting slower more rapidly than hardware becomes faster,
he attributes to Martin Reiser, but in keeping with Stigler’s Law of Eponymy, the principle was named instead for Wirth himself.
There are a number of reasons why this is the case:
- When computers were more constrained, more effort was made to optimize software so that it would run acceptably on the slower hardware. As computers became more capable, the efforts that previously went into optimization could be reallocated to feature development.
- Platform evolution requires more to do the same in different contexts. The evolution of interfaces from purely command line, to textual user interface, to graphical user interface, to the Web, to agentic or whatever comes next, requires at each step more computation to create the user experience. Characters are easier to place than pixels, and pixels are easier to place than speech parts are to string together.
- Easier tools encourage sloppy development, as does a pathological focus on rapid feature delivery. Rarely do developers have the time to go back and optimize any but the most egregious slowdowns.
- Doing more under the hood. Software applications today are spending extra cycles on security checks, telemetry, serving advertisements, checking for updates, user surveillance, running language models, and much more that would have been impossible or unnecessary a generation ago.
- And much of the above is done with profit incentives in mind, since serving ads and exfiltrating user data are profitable, while optimizing the user experience tends to be costly instead.
Owing to these factors, despite the orders of magnitude more powerful our computer systems are as compared to any number of years ago, they don’t seem faster, and they are unlikely to in the future.
- The most favorable feature of Pascal for teachers is that its variable assignment operator
:=does not get confused with a test for equality (=in Pascal). Contrast this with C-like languages, where the assignment operator is=but equality tests are done with==. Seasoned programmers are used to this by now, but juniors get tripped up by this and even seniors will make the occasional mistake and have to be caught by static analysis tools ↩︎
