Open a terminal emulator on a 5K display. By default, the window is eighty characters wide. Open PEP 8, the Python style guide, and you will find that lines should be capped at seventy-nine. Open the Linux kernel coding style document and the soft limit is again eighty. The GitHub diff view, the man page, the email patch convention, the README that wraps because anything else looks wrong — all of them hold to a width that nobody in the room remembers being chosen.

It was chosen in 1928, by an IBM engineer called Clair Lake, and it was a piece of cardboard.

Until that year, the dominant punched card was Herman Hollerith's, which had run at twenty-four columns and then forty-five. IBM was working on something denser. Lake's design squeezed eighty narrow rectangular holes across the same physical card, in ten rows for numerical coding, with twelve rows added two years later for alphanumeric extensions. The card itself was 7⅜ inches by 3¼ inches. That was the unit of data for nearly half a century. By the 1960s, when programmers wrote FORTRAN or COBOL on coding sheets and then had keypunch operators turn them into stacks, the eighty-column card was so standard that the languages themselves were structured around it. COBOL programs used column 7 as a continuation indicator and the last eight columns as an identifier you could re-sort by, in case the deck got dropped (which apparently happened a lot). The card was the line, and the line was the card.

When teletypes and dot-matrix printers arrived, they were built to print eighty columns because that was the width of the data they were going to render. The DEC LA30, introduced in 1970, did exactly that. When dumb terminals replaced teletypes, the screens were sized to print one card line per screen line, conventionally at 8 pixels per character on a 640-pixel screen, which is the same arithmetic worked the other way. By the time the IBM PC shipped its 80×25 text mode, no card had been used to enter program code in years, but the ratio was load-bearing.

PEP 8 caps Python at 79, not 80, because some terminals reserve the last column for a wrap indicator. That is the punch card asking for one column back to flag a continuation it can no longer make itself. The persistence of COBOL in banks and government back offices is the obvious fossil. The eighty-column window is the quieter one, embedded in muscle memory, diff tools, and review etiquette.

You can argue with it. People do, every few years, on the Python forums and in kernel threads. The thing that is genuinely strange is how rarely the argument wins. Black formats to 88, ruff defaults near there, individual teams pick 100 or 120, and yet the cultural gravity remains 80. The card is gone, the keypunch operator is gone, the green-screen VT100 is in a museum, and the line still breaks at the same place a piece of stiff card used to end.

Sources: