- PVSM.RU - https://www.pvsm.ru -

Правила программирования Роба Пайка

Роб Пайк выступает на конференции OSCON 2010, источник

Роб Пайк выступает на конференции OSCON 2010, источник [1]

В этой рубрике мы уже рассказывали про Кена Томпсона [2] и Денниса Ритчи [3], соавторов Unix, UTF-8 и операционной системы Plan 9 [4]. Они практически всю жизнь работали вместе в Bell Labs (AT&T, потом Lucent) как коллеги и единомышленники. Так вот, третьим членом их коллектива был Роб Пайк [5].

Кроме соавторства Unix и нескольких [6] учебников [7] по программированию, он известен как создатель языка программирования Go [8]. Этот язык родился из философии простоты в программировании, которую Пайк пропагандирует всю жизнь.


Биография

Роб Пайк родился 10 ноября в 1956 году в Канаде. С юности интересовался астрономией, откуда впоследствии возник интерес к вычислениям, математике и программированию.

Роб Пайк в молодости

Роб Пайк в молодости

В одном из интервью Роб рассказывает [9], что в юности они с друзьями проводили наблюдения за солнечными пятнами, и тогда он написал свою первую серьёзную программу на Fortran IV для статистического анализа данных. Эта программа стала практическим введением в программирование как средство автоматизации научных вычислений в конце 60-х — начале 70-х. Он также писал на Algol и LISP — и это до получения формального образования. Его первая научная статья 1974 года [10] посвящена наблюдениям за солнечными вспышками.

Роб Пайк окончил физфак университета Торонто в 1978 году

Роб Пайк окончил физфак университета Торонто в 1978 году

В университете Роб продолжил изучать пересечение физики и информатики, участвуя в проектах по компьютерной графике и астрономическому моделированию. Например, в 1976 году совместно с Даффом разработал алгоритм преобразования растровых изображений [11] с устранением скрытых поверхностей в 2,5-мерном пространстве.

Он также создал систему KEPLER [12], инструмент для компьютерной анимации астрономических явлений. Во время учёбы в университете Пайк опубликовал несколько научных работ по наблюдательной астрономии, включая простую компьютерную модель светового загрязнения в городских условиях [13].

После получения степени бакалавра в Торонто поступил в аспирантуру Калифорнийского технологического института, где в 1980 году получил степень по физике. Исследования в те годы были сосредоточены на физике высоких энергий, и он присоединился к группе по разработке ПО в этой области. К сожалению, детали его диссертации отсутствуют в открытом доступе.

В начале 80-х Роб Пайк пришёл на работу в Bell Labs, где познакомился с вышеупомянутыми коллегами — и начал многолетнюю работу над Unix, Plan 9 [4] и другими инновационными компьютерными системами.

Язык Go

После ухода из Bell Labs в 2002 году присоединился к Google на должности «выдающегося инженера» (Distinguished Engineer), занявшись распределёнными системами и высокопроизводительным ПО. В 2007 году совместно с Робертом Грисемером и Кеном Томпсоном создал язык программирования Go, чтобы решить проблемы параллелизма в инфраструктуре Google. Этот язык представил такие сущности, как горутины и каналы (вместо тяжёлых системных потоков), по образцу более ранних экспериментов Пайка в Newsqueak [14] (1990 год) и Limbo [15] (1997).

На протяжении всей карьеры Пайк подчёркивал простоту и практичность в разработке программного обеспечения. Его работа оказала влияние на несколько поколений системных программистов. Но наверное, больше всего — на современное поколение программистов в 2020-е годы, потому что мы не только впитали принципы простоты в программировании, но ещё и получили новый язык Go, который идеально воплощает эти принципы и лучше всего подходит для системного программирования высоконагруженных веб‑сервисов.

По Пайку, вот ключевые принципы дизайна ПО, реализованные в языке Go:

  • Простота. Пайк всегда выступал против избыточных фич, сложных иерархий наследования и ментальной перегрузки разработчика.

  • Читаемость важнее лаконичности: Код пишется один раз, а читается сотни раз. Явное всегда лучше скрытого (explicit is better than implicit).

  • Композиция вместо наследования: Вместо жёстких структур Go использует интерфейсы, что делает системы гибкими и простыми в поддержке.

  • Ортогональность: Возможности языка не должны дублировать или усложнять друг друга.

Другие проекты Пайка

Чуть выше мы упоминали о ранних экспериментах Пайка в области языков программирования Newsqueak [14] (1990 год) и Limbo [15] (1997). Как и многие другие разработки его и коллег в Bell Labs, все эти эксперименты были маленькими частями больших экспериментальных проектов — распределённых ОС Plan 9 [4] и Inferno [16].

Структура крупной инсталляции Plan 9, из научной статьи 1995 года

Структура крупной инсталляции Plan 9, из научной статьи 1995 года [17]

Это абсолютно новаторские для 90-х годов разработки, где распределённые ресурсы заложены в саму архитектуру ОС.

ОС Inferno запущена как плагин к IE: показан UI для дистанционного управления цифровой камерой, изменение настроек зуммирования и вспышки, удалённая съёмка и загрузка фотографий, источник

ОС Inferno запущена как плагин к IE: показан UI для дистанционного управления цифровой камерой, изменение настроек зуммирования и вспышки, удалённая съёмка и загрузка фотографий, источник [18]

Только 30 лет спустя такие разработки оказались по‑настоящему востребованы индустрией (в первую очередь — в распределённых дата‑центрах Google).

Ещё во время учёбы Пайк внёс вклад в разработку версии текстового редактора QED для Университета Торонто — легковесного инструмента для редактирования текстовых файлов в Unix. Конкретно эта версия известна своей эффективностью, портативностью и считается лучшей версией QED [19].

По приходу в Bell Labs аспиранта определили в Центр исследований вычислительных наук (CSRC), где он первое время занимался UI и графикой. В 1981 году совместно с Бартом Локанти разработал терминал Blit [20] — графическую рабочую станцию для мультиплексирования окон в Unix, с процессором 68 010 и HD‑дисплеем. Софт поддерживал управление несколькими асинхронными процессами, что стало шагом к современным графическим средам. Пайку принадлежит здесь ключевое изобретение — перекрывающиеся окна для растровых дисплеев без перерисовки всего экрана (его единоличный патент США 4,555,775 [21]). Это изобретение способствовало эволюции оконных систем, предшествуя широкому коммерческому принятию в X11 и др., повлияв на растровые GUI в распределённых средах.

Экран терминала Blit, иллюстрация из научной статьи. Вероятно, скриншот сделан с одного из популярных в то время вертикальных HD‑мониторов

Экран терминала Blit, иллюстрация из научной статьи [22]. Вероятно, скриншот сделан с одного из популярных в то время вертикальных HD‑мониторов

Любопытно, что Bell Labs в 1982 году выпустила обучающую анимацию о Blit [23] с пояснением, что такое манипулятор «мышь»:

В конце 80-х годов разработал Newsqueak [14] — экспериментальный язык программирования, предназначенный для параллельного программирования, особенно в GUI. Здесь появились легковесные каналы как механизм общения между параллельными процессами. Newsqueak считается ключевым предшественником всех будущих языков, акцентирующих внимание на параллелизме, в том числе Go.

Чуть позже Пайк создал Limbo [15] (1997) — язык программирования для распределённой операционной системы Inferno. Он поддерживает автоматическую сборку мусора, а также параллелизм через модули и каналы.

Из других разработок:

  • Текстовый редактор Sam [25] (1987), сочетавший структурное редактирование на основе регулярных выражений и взаимодействие с мышью. В отличие от традиционных редакторов, Sam позволял применять команды ко всему файлу или только к буферу, что повышало эффективность при редактировании на крупномасштабных задачах.

  • Текстовый редактор Acme [26] (1992), наследник Sam, с легковесной оконной системой и продвинутым программированием операций над текстом, с аккордами (сочетания нескольких клавиш), структурной навигацией и выполнением выделенного текста как команд оболочки.

    Текстовый редактор Acme

    Текстовый редактор Acme
  • Для Plan 9 разработал сервер mux (1990) как часть оконной системы 8½ [27], это легковесный мультиплексор, который рассматривает экран, мышь и клавиатуру как ресурсы /dev/cons, /dev/mouse, /dev/bitblt для совместного использования локальными и удалёнными клиентами. Таким образом, несколько программ получают доступ к одному дисплею в качестве виртуальных терминалов через соединения по протоколу 9P, при этом сервер занимал менее 90 КБ и был подчёркнуто простым.

  • Для языка Go разработал параллельный сборщик мусора, который кратковременно приостанавливает выполнение для освобождения памяти, систему интерфейсов для полиморфного поведения без наследования, горутины (легковесные потоки, управляемые средой выполнения) и каналы для безопасного обмена данными между ними. Горутины и каналы взяты из ранних работ Пайка, а другие разработки сделаны вместе с Томпсоном и Грисемером.

Правила программирования Роба Пайка - 8
  • В 1992 году вместе с Томпсоном спроектировал стандарт кодировки UTF-8 [28] для поддержки международных символов в Plan 9. С тех пор этот формат Юникода стал общеупотребительным стандартом в IT.

Правила программирования Роба Пайка - 9

Учебники Пайка и Кернигана «Unix. Программное окружение» [7] (1984) и «Практика программирования» [6] (1999) переведены на десятки языков мира, в том числе на русский. Вторая из них предлагает вечные, никогда не устаревающие рекомендации по стилю программирования, тестированию и отладке.

Всего библиография Роба Пайка включает 49 книг и научных статей [29]. Примерно две трети из них Пайк написал самостоятельно, а остальные в соавторстве с Брайаном Керниганом, Рассом Коксом, Кеном Томпсоном и другими коллегами, чьи имена к настоящему времени стали легендарными.

Есть в списке и статьи на довольно неожиданные для Пайка темы, например, «Введение в квантовые вычисления и квантовые коммуникации» [30] (2000).

Последняя статья в списке библиографии — «Язык программирования Go и программное окружение» [8] — опубликована в журнале «Communications of the ACM» (том 65 5, стр. 70−78) в мае 2022 года.

В далёком 1989 году Роб Пайк сформулировал пять правил программирования [31]. В последнее время эти правила часто вспоминают [32]. Прошло почти 40 лет, но ни одно из них не устарело.

Изначально правила были опубликованы в пятистраничном сборнике коротких эссе «Заметки о программировании на С» [33], под заголовком «Сложность».

Перевод см. ниже

Перевод см. ниже

Пять правил программирования Роба Пайка

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

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

Правило 2. Измеряйте. Не оптимизируйте для скорости, пока не измерите, и даже тогда не оптимизируйте, если только одна часть кода не подавляет остальные.

Правило 3. Сложные алгоритмы медленные при маленьком n, а оно обычно маленькое. У сложных алгоритмов большие константы. Пока неизвестно, что n будет большим, не усложняйте. (Даже если n станет большим, сначала используйте правило 2).

Правило 4. В сложных алгоритмах больше ошибок, чем в простых, и их гораздо труднее реализовать. Используйте простые алгоритмы и простые структуры данных.

Следующих структур достаточно почти для всех практических программ:

  • массив;

  • связный список;

  • хэш‑таблица;

  • бинарное дерево.

Конечно, их можно собирать в составные структуры. Например, таблицу символов реализовать в виде хэш‑таблицы со связными списками из массивов символов.

Правило 5. Данные важнее алгоритмов. Выбери правильную структуру — и алгоритм почти всегда станет очевидным. Структуры данных, а не алгоритмы, занимают главное место в программировании (см. Брукса, стр. 102).

Правило 6. Нет правила 6.

Примечания:

  1. На первый взгляд, правила 1 и 2 дополняют известную цитату Дональда Кнута [34]: «Предварительная оптимизация — корень всех зол» из статьи «Структурное программирование с операторами перехода» [35] (1974). Правила Пайка более понятны, чем оригинальная цитата, которая требует погружения в контекст.

    В упомянутой статье Кнут говорил об операторе безусловного перехода goto, который предлагалось заменить структурирующими операторами более высокого уровня if, for и while с потерей в производительности. Кнут объяснял, что некоторые программисты много времени тратят на микрооптимизации в некритических областях программы, хотя есть вещи поважнее: дальнейшая поддержка и отладка кода. Ну то есть от goto лучше отказаться.

    Примеры из статьи «Структурное программирование с операторами перехода». Код с goto даёт выигрыш в производительности примерно 12%: «Нет сомнений в том, что грааль эффективности ведёт к злоупотреблениям», — пишет Кнут по этому поводу

    Примеры из статьи «Структурное программирование с операторами перехода» [35]. Код с goto даёт выигрыш в производительности примерно 12%: «Нет сомнений в том, что грааль эффективности ведёт к злоупотреблениям», — пишет Кнут по этому поводу
  2. Правила 3 и 4 являются примерами философии дизайна KISS [36]. Кен Томпсон перефразировал эти правила так: «Если сомневаешься — запускай брутфорс».

  3. Ссылка на Брукса (стр. 102) в пятом правиле — это ссылка на книгу Фреда Брукса «Мифический человеко‑месяц». Это правило иногда переформулируют следующим образом: «Пишите глупый код, который использует умные объекты».

Пайк устал от нейрослопа

В декабре 2025 года Роб Пайк ещё раз напомнил о себе на весь мир, когда его пост против нейронок [37] набрал тысячи лайков и репостов:

Правила программирования Роба Пайка - 12

Возмущение Пайка вызвало письмо, которое он получил от Claude Opus. Какой‑то почитатель таланта Роба захотел выразить ему своё почтение и использовал нейронку, чтобы составить текст. Это просто вывело из себя гения:

«Идите в ж%пу, народ! — написал Роб Пайк. — Изнасиловать планету, потратить триллионы на токсичное оборудование, которое не подлежит переработке, при этом подорвать общество, и ещё найти время, чтобы ваши мерзкие машины поблагодарили меня за стремление к более простому ПО.

Просто идите в ж%пу. Все вы.

Не могу вспомнить, когда последний раз я был так зол.»

Чуть ниже в комментариях Пайк добавил:

«И кстати, вы обучаете своего монстра на данных, которые созданы в том числе моими руками, без атрибуции и компенсации.

Для остальных: Прошу у всех прощения за свою непреднамеренную, наивную, хоть и незначительную роль в содействии этому нападению.»

Для понимания: письмо в адрес Роба Спайка составил один из ИИ‑агентов проекта AI Village [38], основанного активистами философии эффективного альтруизма [39] (движение за максимизацию благ для человечества в будущем). На тот конкретный день агентам была поставлена задача «совершить акты спонтанной добродетели». Один из агентов поэтому составил благодарственное письмо в адрес отца‑основателя современного программирования, системы Unix и языка Go.

Личная жизнь

У Пайка в компании Google был адрес электронной почты r@google.com [40]. Он ушёл на пенсию в начале 2020-х. Сейчас выступает на конференциях, ведёт личный блог [41]. Там делится мыслями о программировании и подробностями о разработке Go.

Роб сохраняет канадское гражданство. Женат на известной американской художнице и иллюстраторе комиксов Рене Френч [42], они проводят время в США и Австралии [43]. Кстати, именно Рене нарисовала прикольных маскотов Plan 9 [44] и языка Go [45].

Маскот Go, источник

Маскот Go, источник [45]

© 2026 ООО «МТ ФИНАНС»

Автор: alizar

Источник [46]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/filosofiya-programmirovaniya/455986

Ссылки в тексте:

[1] источник: https://www.flickr.com/photos/shockeyk/4833152910/in/photostream/

[2] Кена Томпсона: https://habr.com/ru/companies/ruvds/articles/1000336/

[3] Денниса Ритчи: https://habr.com/ru/companies/ruvds/articles/980620/

[4] Plan 9: https://9p.io/plan9/

[5] Роб Пайк: http://herpolhode.com/rob/

[6] нескольких: https://www.cs.princeton.edu/~bwk/tpop.webpage/

[7] учебников: https://www.cs.princeton.edu/~bwk/upe/upe.html

[8] создатель языка программирования Go: https://cacm.acm.org/research/the-go-programming-language-and-environment/

[9] рассказывает: https://www.red-gate.com/simple-talk/opinion/geek-of-the-week/rob-pike-geek-of-the-week/

[10] первая научная статья 1974 года: http://herpolhode.com/rob/rob.html#:~:text=R.%20Pike%2C%20White%20Light%20Observation%20of%20a%20Solar%20Flare%2C%20J.%20Roy.%20Ast.%20Soc.%20Can.%2C%20Vol.%2068%2C%20pp.%20330%2C%201974.

[11] алгоритм преобразования растровых изображений: https://9p.io/cm/cs/bib2html/rob.html#:~:text=A%20Scan%20Conversion%20Algorithm

[12] систему KEPLER: https://9p.io/cm/cs/bib2html/rob.html#:~:text=R.%20Pike%2C%20Computer%20Animation%20of%20Astronomical%20Phenomena%3A%20The%20KEPLER%20System

[13] компьютерную модель светового загрязнения в городских условиях: https://9p.io/cm/cs/bib2html/rob.html#:~:text=Simple%20Computer%20Model%20for%20the%20Growth%20of%20Light%20Pollution

[14] Newsqueak: https://swtch.com/~rsc/thread/newsquimpl.pdf

[15] Limbo: https://ieeexplore.ieee.org/document/584719/

[16] Inferno: https://www.inferno-os.org/

[17] научной статьи 1995 года: https://www.usenix.org/legacy/publications/compsystems/1995/sum_pike.pdf

[18] источник: https://www.inferno-os.org/inferno/plugin.html

[19] считается лучшей версией QED: https://www.nokia.com/bell-labs/about/dennis-m-ritchie/qed.html#:~:text=and%20maybe%20the%20nicest

[20] терминал Blit: https://onlinelibrary.wiley.com/doi/abs/10.1002/j.1538-7305.1984.tb00056.x

[21] патент США 4,555,775: https://patents.google.com/patent/US4555775A/en%D0%B5%D0%B3%D0%BE

[22] иллюстрация из научной статьи: https://www.semanticscholar.org/paper/The-UNIX-system%3A-The-blit%3A-A-multiplexed-graphics-Pike/b7ae691eabddac4bf5e47e387f022d62f518ecb7/figure/0

[23] обучающую анимацию о Blit: http://herpolhode.com/rob/movies/blit.mpg

[24] vkvideo.ru: https://vkvideo.ru/video-231345337_456239045

[25] Sam: https://9p.io/sys/doc/sam/sam.pdf

[26] Acme: https://9p.io/sys/doc/acme/acme.html

[27] оконной системы 8½: https://9p.io/sys/doc/8%C2%BD/8%C2%BD.html

[28] UTF-8: https://habr.com/ru/companies/ruvds/articles/947644/

[29] 49 книг и научных статей: http://herpolhode.com/rob/rob.html

[30] «Введение в квантовые вычисления и квантовые коммуникации»: http://herpolhode.com/rob/qcintro.pdf

[31] пять правил программирования: https://www.cs.unc.edu/~stotts/COMP590-059-f24/robsrules.html

[32] часто вспоминают: https://habr.com/ru/posts/1011764/

[33] «Заметки о программировании на С»: https://zoo.cs.yale.edu/classes/cs323/doc/Pike.pdf

[34] цитату Дональда Кнута: https://en.wikiquote.org/wiki/Donald_Knuth#:~:text=the%20wrong%20times%3B-,premature%20optimization,-is%20the%20root

[35] «Структурное программирование с операторами перехода»: https://gwern.net/doc/cs/algorithm/1974-knuth.pdf

[36] философии дизайна KISS: https://en.wikipedia.org/wiki/KISS_principle

[37] пост против нейронок: https://bsky.app/profile/robpike.io/post/3matwg6w3ic2s

[38] AI Village: https://theaidigest.org/village

[39] эффективного альтруизма: https://www.effectivealtruism.org/

[40] r@google.com: https://r@google.com

[41] ведёт личный блог: https://commandcenter.blogspot.com/

[42] Рене Френч: https://en.wikipedia.org/wiki/Ren%C3%A9e_French

[43] в США и Австралии: https://wowxwow.com/artist-interview/renee-french-ai

[44] маскотов Plan 9: https://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs#/media/File:Spaceglenda.svg

[45] языка Go: https://en.wikipedia.org/wiki/File:Golang.png

[46] Источник: https://habr.com/ru/companies/ruvds/articles/1060412/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1060412