Мне повезло в жизни, так как моя учительница русского языка и литературы в старших классах была педагогом с большой буквы. В выпускном классе мы особенно любили пятничные уроки литературы - читали стихотворение малоизвестного (нам) поэта или слушали песню какой-нибудь рок-группы и писали мини-сочинение об услышанном За спиной у нашей учительницы висел небольшой плакат с правилами и рекомендациями по написанию текстов. На эти правила она указывала, когда объясняла, как улучшить нашу малограмотную подростковую писанину.
Одно из правил - буквально слово в слово - я недавно встретил в одном популярном эссе о написании кода без ошибок (я расскажу об этом правиле позже). Мне стало любопытно, насколько применимы остальные правила со школьного плаката (короткий ответ – да), и есть ли у этого обоснование. Я немного зарылся в литературу, и вот что понял.
Программный код с точки зрения лингвистики
Если вы не родились в семье гуманитариев, то, скорее всего, ваш учитель русского языка и литературы был первым человеком на вашем жизненном пути, кто профессионально, на академическом уровне, изучал и применял лингвистику - науку о языке, о его структуре, развитии и функционировании. Лингвисты исследуют, как люди используют язык для общения, как он связан с мышлением, культурой и обществом, а также сравнивают различные языки мира.
Ну вы поняли, да?
С точки зрения лингвиста любой язык программирования – это просто еще один язык, такой же, как китайский или наскальные петроглифы. Он отражает внешний мир во всей его сложности и многообразии, но в полезном для человека виде. Со своей семиотикой, правилами, синтаксисом и даже фонетикой. Но подчиняется он тем же самым объективным законам лингвистики, ведь он творение рук человеческих.
Для лингвиста текст программы – это набор символов, который несет законченную мысль. Такая мысль называется инвариантом текста (научное определение элемента абстрактной системы языка в отвлечении от ее конкретных реализаций). А вот конкретный набор операторов программного языка в программе – называется его токенами (да, гуманитарии употребляют этот термин с 1980-х годов XX века ).
Вот возьмем, к примеру, код на С:
x = a + b * 2;
Лексический анализ этого выражения дает следующую последовательность токенов:
[(identifier, 'x'), (operator, '='), (identifier, 'a'), (operator, '+'), (identifier, 'b'), (operator, '*'), (literal, '2'), (separator, ';')]
Инвариант, который заложен в этом тексте, мы можем выразить любым другим языком программирования, который допускает аналогичную токенизацию. Или вы можете просто записать это выражение текстом на русском языке, и какой-то компилятор будущего сможет перевести его в машинный код без потери инварианта.
Если вы согласны с вышеуказанным, то нам остался всего один шаг.
У лингвистики есть несколько направлений, которые имеют непосредственное отношение к программному коду. Во-первых, это семиотика. Это большой раздел науки, предметом которой являются все знаковые системы, как естественные (языки), так и искусственные (языки программирования, системы сигнализации). Мы все знакомы (в той или иной мере) с таким разделом семиотики, как грамматика – который, в том числе, помогает писать тексты без ошибок. Во-вторых, это герменевтика, которая позволяет толковать и понимать тексты, символы, а также любые формы коммуникации.
Надеюсь, что сказанное убедило вас, что ваш учитель русского языка и литературы имел, что сказать, как говорят в Одессе, по понятному и безошибочному написанию программ, хотя сам не зная того и с немного абстрактной точки зрения.
Don’t write bugs
Мы все хотим писать код без ошибок. Мы все любим писать код без ошибок. Ошибки в коде - это плохо, и, чаще чем хотелось бы, это дорого. Если вы написали код с ошибкой, то хорошо, если это просто потеря личного времени и небольшой удар по нашему самомнению. Но ведь они приводят и к вполне осязаемым экономическим потерям (время на исправление и тестирование, репутация, даунтайм сервиса, потерянные клиенты).
Поэтому написание кода без ошибок – это богатая и мультидисциплинарная область информационных технологий, в которой десятки тысяч умных людей работают над сложными инструментами автоматизации и, в целом, крутятся миллиарды долларов. Все это заслуженно и важно.
Но что, если рассмотреть программный код с точки зрения простых правил лингвистики, которые были написаны на плакате в кабинете литературы - вот эти правила (по памяти):
1. Пойми то, о чем хочешь написать
2. Поняв, структурируй свою мысль
3. Структурировав, напиши мысли простыми словами
4. Написав, перечитай вслух то, что написал.
Давайте разберем каждое правило с точки зрения написания безошибочного программного кода.
Пойми то, о чём хочешь написать
Даже великие программисты временами забывают, что «писать код» и «понимать, что ты делаешь» - не одно и то же. Когда учительница литературы просила «раскрыть тему сочинения», она имела в виду ровно то же самое, что и архитектор ПО, когда говорит «разберись в бизнес-логике». Если вы не поняли задачу, вы не напишете работающий код - вы напишете фанфик на тему «Как я представляю себе HTTP-запрос».
На каком-то уровне мастерства программирования вы уже будете писать грамматически выверенные программы (а где-то будут помогать IDE, компиляторы и линтеры). Но неопределенность в предметной области всегда будет источником ошибок. Просто потому, что мы всегда моделируем реальность с определенной степенью погрешности.
Классическое обсуждение этого вопроса содержится в статье Серебряной пули нет (No Silver Bullet, 1986) Фредерика Брукса. В ней Брукс подчёркивает разницу между побочной сложностью (англ. accidental complexity) и имманентной сложностью (англ. essential complexity) и утверждает, что «ни в одной технологии или в управленческой технике не существует универсального метода, увеличивающего на порядок производительность, надёжность и простоту» (так называемой «серебряной пули»). Он прямо говорит - сложность программ - не в языке и не в синтаксисе, а в понимании сущности задачи.
Это и есть первый пункт плаката: сначала пойми, о чем ты хочешь написать свой код.
Поняв, структурируй свою мысль
Любое сочинение - это композиция. Вступление, основная часть, заключение. Программа - тоже композиция: иерархия модулей, функций и слоев абстракции. Нельзя просто взять и «накидать строк кода» - как нельзя просто «накидать мыслей» в школьном эссе на тему любви Онегина и Татьяны.
Дейкстра в своём ��егендарном эссе Structured Programming писал, что хаотичный поток инструкций мешает человеку рассуждать о корректности программы. Структура - это не просто синтаксис, это инструмент понимания.
В функциональных языках программирования (напрмер, Haskell) композиция функций является базовым инструментом языка и позволяет писать простой, понятный и безошибочный код.
Структурировав, напиши мысли простыми словами
В литературе есть золотое правило: если можно сказать проще - скажи проще. Тот же принцип в коде известен как KISS (Keep It Simple, Stupid).
Когда мы пишем код, нас нередко тянет показать, какие мы умные. Но код - это не соревнование по синтаксическим трюкам, а инструмент общения. Хороший код должен быть понятен даже тому, кто будет читать его через три года (то есть тебе же, но уже с седыми висками).
# Было
result = list(filter(lambda x: x if x not in exclusions and (x % 2 == 0 or x % 3 == 0) else None, data))
# Стало
result = [x for x in data if x not in exclusions and (x % 2 == 0 or x % 3 == 0)]
Первое - будто школьник написал сочинение, используя весь словарный запас. Второе - лаконично и понятно. Это не лучший код, но все же шаг вперед к понятному, а значит безошибочному, коду.
Если хотите почитать дальше, то рекомендую статью Пиши простой код.
Написав, перечитай вслух то, что написал
Это, наверное, самое простое и важное. И это единственный совет по улучшению кода из статьи Don't write bugs.
Учительница заставляла нас читать написанное не просто так. Когда мы произносим текст, мы начинаем слышать его шероховатости. Кент Бек в Clean Code говорил, что хороший код «читабелен как проза». Если вы можете проговорить строку кода и не сбиться с дыхания - вы на правильном пути. Если ваш код «скрипит на слух» - значит, что-то не так.
Серьезно: пишите пять-семь строчек кода и перечитывайте его вслух. Я гарантирую вам, что вы отловите море ошибок до первой компиляции.
Это тот же эффект, что даёт рефакторинг и ревью, которые являются более продвинутыми техниками чтения вслух. Попробуйте читать код вслух на ревью (да, это странно, но эффективно) или используйте инструменты статического анализа, которые делают это за вас.
Также вам может помочь техника указательного пальца. Возьмите самую важную структуру в своем коде и ведите ее указательным пальцем по тексту программы с учетом ветвлений и вариативности. Вы удивитесь, куда это может вас завести.
Заключение
Да, у вас могут быть совсем другие воспоминания о вашем учителе русского языка и литературы. Жизнь сложна и плохо воспроизводима. Но все, кого я коротко опросил во время подготовки этой статьи, вспоминали технику отлова ошибок путём чтения вслух и другие подобные правила - ещё из средней школы.
А значит школьные учителя прививали нам культуру работы с текстом, которая хорошо ложится на наше ежедневное ремесло перекладывания модели мира в машинный код. Токен за токеном. Строчка за строчкой.
Комментарии (23)

Emelian
24.10.2025 11:09У лингвистики есть несколько направлений, которые имеют непосредственное отношение к программному коду.
Вот, попытался применить вашу теорию к своей лингвистически-программной задаче: «Сколько всего слогов во французском языке?». Беру готовый электронный словарь, даже, со слогоделением. Вроде, дальше, всё просто. Разделяем, слова на слоги и убираем повторы. Затем, сортируем и подсчитываем количество полученных слогов в списке.
Проблема только в том, что слогоделение в этих словарях делают программные алгоритмы и, как, показывает практика, делают это, не редко, с ошибками. Т.е., не смотря на известные правила слогоделения, там масса исключений, как и во всём языке. А эти исключения никто запрограммировать не может. Поэтому, при подготовке обучающих материалов для изучения иностранного языка, слогоделение, как, впрочем, и транскрипцию, приходится править вручную. ИИ, здесь, тоже мало помогают. Ответы дают неопределенные и с ошибками.
Думал, ваша статья – поможет решить проблему. Не помогла!

stch
24.10.2025 11:09Непонятно, в чем сложность запрограммировать исключения? Их же конечное число и все они где-то описаны.

Emelian
24.10.2025 11:09Непонятно, в чем сложность запрограммировать исключения? Их же конечное число и все они где-то описаны.
Это не совсем так. Во французской грамматике немало чудес. Например, спросите у любого француза либо преподавателя французского, сколько букв во французском алфавите, с учётом диакритических знаков и лигатур, или сколько звуков в их стандартном фонетическом алфавите и вам никто, точно, не ответит. Начнутся пляски вокруг да около. Для примера, можете посмотреть мой диалог с французским ИИ («искусственным илиотом»), на эту тему: https://habr.com/ru/companies/bothub/news/891934/comments/#comment_28055496 .
Та же песня с правилами произношения. В любом учебнике грамматики их, относительно, не много. Однако, в справочнике Т. Ганцкой, «От буквы к звуку» их сотни, с морем исключений, причём, там не все исключения, а только те, которые автору удалось обнаружить в десятках первоисточников.
Аналогичная ситуация со слогоделением. Правил не много, а исключений – масса, но они нигде полностью не описаны. Просто ошибки исправляешь интуитивно, на основе логики, что в каждом слоге должна быть одна произносимая гласная. А, с учетом исключений в произношении слов и, соответственно, слогов, а также, наличия полугласных, это весьма нетривиальная задача. Хотя, никто особо, на эту тему не заморачивается, кроме меня. Говорят, что слогоделение нужно не для тренировки «чтения по слогам», как мы учили язык в детстве, а, всего лишь, для переноса в письменной речи. Только, кому это надо? Ибо, в компьютерный век, кто переносит, в электронных документах, слова по слогам? Обычно, форматируют текст целиком по словам.
Смысл в слогоделении состоит в том, что есть сильная связь между слогами и их произношением. Это хорошо видно в моих обучающих материалах (см. мои статьи, здесь).

SquareRootOfZero
24.10.2025 11:09Получается, просто у вас недоработана модель задачи, имея в составе своём зияющие пробелы. Как тут могут помочь советы по написанию программного кода?

souls_arch
24.10.2025 11:09Серьезно: пишите пять-семь строчек кода и перечитывайте его вслух. Я гарантирую вам, что вы отловите море ошибок до первой компиляции.
Нет. Профессионал думает до того, как начал писать. Может стажеру/трейни этот совет и норм, чтобы развить внимательность. Там еще можно и ИИ встроенный в IDE посоветовать отключить. А для серьезной работы - это антипаттерн, сильно снижающий скорость разработки.
Взять создание того же каркаса Веб-приложения на Spring Boot и не только. Там столько boilerplate-кода. Причем я не раз это делал без единой крит ошибки не проверяя и не запуская до определенной контрольной точки. А дальше есть рефакторинг, где ты все проверишь, оптимизируешь и улучшишь. Потом еще пишутся тесты. В конце концов, если ты где-то опечатался, - тебя поправит и направит на ошибку ИИ встроенный в IDE или компилятор. Вот много лет назад... Но мы живем не много лет назад. И бизнес будет сотрудничать с теми, кто производит рабочие решения быстро. А потом так же быстро допиливает их. Думать и делать еще и качественно никто не отменял, впрочем.
PS: код обратно на выполнение может и с ci/cd на доработку прилететь...и от блока ИИ анализатора(а они умеют не только лайтовый линтинг проводить, но и серьезные угрозы безопасности искать), и с контейнерных тестов, и с CodeReview и от тестеров manual/auto. Так сказать, последние стражи галактики...

Wesha
24.10.2025 11:09И бизнес будет сотрудничать с теми, кто производит рабочие решения быстро.
...выживший после этого бизнес будет сотрудничать с теми, кто производит рабочие решения правильно!

JobManKazakh
24.10.2025 11:09А исключения и авторское коверканье слов при написании литературного произведения?

GidraVydra
24.10.2025 11:09Серьезно: пишите пять-семь строчек кода и перечитывайте его вслух. Я гарантирую вам, что вы отловите море ошибок до первой компиляции.
А смысл? Допустить ошибку при написании 5-7 строчек кода именно в логике этих строчек довольно сложно. Большинство ошибок становятся таковыми только на бòльших масштабах, как раз из-за рассогласования взаимодействующих частей кода, которые ты не можешь одновременно держать в поле зрения. Например, вызвал метод с неправильными аргументами, потому что уже забыл его синтаксис. Как тут поможет перечитывание последних нескольких строк кода, если класс был объявлен 100 строк назад?

edo1h
24.10.2025 11:09Серьезно: пишите пять-семь строчек кода и перечитывайте его вслух
вы скажите ещё, что читаемые тексты на русском (или другом естественном языке) надо проговаривать «про себя»

NekrosofKac
24.10.2025 11:09Было бы неплохо.

edo1h
24.10.2025 11:09Что неплохо? Внутреннее проговаривание снижает скорость чтения и ухудшает понимание текста. Единственный случай когда без него никак — чтение стихов.

ZSN_2
24.10.2025 11:09Если вы читаете то, что написали три года тому назад то, что вы делали (и как) эти три года – вопрос.
Напутственные слова учительницы по русскому: ”Иди отсюда!!! В конце концов, землю тоже кому-то надо копать!!!”

rukhi7
24.10.2025 11:091. Пойми то, о чем хочешь написать
Гениально, конечно! Только не хватает объяснения как ученику понять, что он это понял или что делать если ученик думал что понял, но на самом деле совсем не понял но уже написал...

SquareRootOfZero
24.10.2025 11:09Я так понимаю, прошаренный программист должен писать, как Лев Толстой: длииииинный однострочник, и чтобы где-то посерёдке ещё процентов двадцать было на другом языке программирования.
Да и ТЗ, сформулированное как "Наташа Ростова - любимый персонаж Толстого", с которым непонятно, чего делать, тоже, наверное, готовило к определённым будущим реалиям. Всё, я понял формулу успеха. ЧатЖПТ, напиши мне статью для русскоязычного IT-ресурса, озаглавленную "Пиши код, как Лев Толстой".

Ndochp
24.10.2025 11:09посерёдке ещё процентов двадцать было на другом языке программирования
lua, dls и классическое "Любая достаточно сложная программа на Си или Фортране содержит заново написанную, неспецифицированную, глючную и медленную реализацию половины языка Common Lisp."

vladkorotnev
24.10.2025 11:09Напоминает один из моих пет-проектов — бэк на расте, но местами на php, клиент на сишарпе, подключающийся к фронту на mshta, в котором скрипты на visual basic, и всё это релизнуто в 2018. До какого-то времени даже работало...

PastorGL
24.10.2025 11:09Тю-ю-ю... ЯП вообще-то ни разу не про синтаксис (потому что подавляющее большинство из них имеют равномощный набор синтаксических конструкций, и отличаются только формой), а про семантику — в которой и заключается основная ценность.
Настоящий «язык» для программиста — это конкретные API и библиотеки, определяющие глаголы (функции, методы, процедуры, лямбды), существительные (объекты, хэндлы, указатели, и т.п.), и правила построения осмысленных предложений из них. Которые могут быть кардинально разными для одного и того же ЯП.

ssn3
24.10.2025 11:09Гм, автор открыл для себя классическое образование? Много годков назад, можно даже сказать в прошлом тысячелетии, сдавал курсовик "транслятор с бейсика на фортран" в рамках курса ... теория алгоритмов и формальных языков.
XPEHOTOH
Не сильно удачная демонстрация на собственном примере, как надо писать просто, когда описывая "черное", мы расскажем про "жидкое, квадратное, тёплое и лохматое", абсолютно никак от относящееся к делу и дико сбивающее с толку, для того чтобы просто к слову...))) Вот и "не соревнование по синтаксическим трюкам"... ))))