Интернет не работает, и это моя вина.

Еще в начале 1980-х я программировал приложение для передачи данных между небольшими компьютерами. Это было задолго до Ethernet, до Интернета. У нас была последовательная сеть (SYTEK) в кампусе, которая утверждала, что это надежный транспортный сервис уровня ISO 7. То есть вы вставляете символы Ascii в один конец, а они выходят на другом конце. В школе меня учили 7-слойной модели, я выпил всю крутую помощь о том, как каждый слой делает свое дело, и код выше и ниже мог считать, что все это работает. Тем не менее, у меня были некоторые базовые протоколы блокировки/подтверждения/подтверждения как часть моей программы, поэтому я мог обрабатывать прерванные передачи.

Писал на Фортране и Макро (компьютеры PDP-11 и LSI-11). Сначала все работало нормально. Я мог передавать и извлекать файлы с одного компьютера на другой. Затем одна передача вызвала сбой моей программы. После расследования я обнаружил, что могу передать особенно большой файл в то время, когда сеть была занята, и воссоздать сбой. Я поставил последовательный регистратор данных на путь и обнаружил, что этот надежный транспортный уровень иногда выбрасывает 8-килобайтный блок старых буферов прямо в середину моего потока данных. Что, если вы когда-либо занимались сетевым программированием, вы знаете, вызывало переполнение буфера, приводящее к сбою моего кода.

В тот момент я решил никогда не доверять ничему, что приходит с сетевого порта. Несмотря на то, что я писал код на обоих концах, я не мог предположить, что входные данные безопасны. Поэтому я переписал свой код. На каждом этапе обработки данных мой код все проверял. Если полученный байт некуда было положить, он отбрасывался. Если у меня заканчивались буферы — данные сбрасывались. Каждое значение заголовка было либо действительным, либо пакет был отброшен.

Вроде все достаточно просто, учитывая обстоятельства. Зачем мне делать что-то меньшее? Пока я занимался этим, я переделал управление буфером, чтобы сделать его более эффективным.

Так почему состояние Интернета моя вина? Сегодня, 30 с лишним лет спустя, программисты все еще пишут код, допускающий переполнение буфера. Программисты все еще пишут операторы Case и If Then, обрабатывающие содержимое заголовков, которые проваливаются, а не возвращаются к прерываниям.

Я должен был объявить о своем открытии в научной статье. Я должен был писать блоги и официальные документы. Я должен был читать лекции в школах программистов, колледжах и университетах по всей стране, черт возьми по всему миру, чтобы сегодня никто не писал ленивый, неряшливый код. Я должен был зарегистрировать торговую марку «Не пишите плохой код», «Переполнение буфера убивает» и «Десять часов, вы знаете, где находится ваше утверждение «Если тогда?». Я мог бы продать футболки и заработать миллионы.

Но я этого не сделал. Итак, теперь я на пенсии, живу на свою пенсию, а программисты все еще пишут плохой код.

Я имею в виду, если бы они ЗНАЛИ, что им не следует писать такой плохой код, они бы этого не делали, не так ли?

MF