Спор о русском в коде обычно ведут идеологи. Одни требуют «программировать на родном», другие крутят пальцем у виска. Но если убрать эмоции, остаётся инженерная задача: где локализация снимает трение, а где создаёт новое?

Мы 60 лет учим разработчиков думать по‑английски, чтобы они могли программировать. Не «знать английский» — это нормально. А думать на нём, когда пишут код на русском домене. Юрист, читающий спецификацию, и разработчик, читающий код, говорят на разных языках — и мы называем это профессиональным стандартом.

Пора это признать. И посмотреть, во что это обходится на практике.

Мелкие тупняки, которые складываются в большие потери

Когнитивный налог — это не драма. Это не история про то, как кто‑то полгода не мог разобраться в одном имени. Это сотни мелких заминок в день, каждая из которых длится минуту‑другую — и вместе они съедают часы.

Открываешь модуль, видишь getPrincipal(). Думаешь: тело долга. Пишешь формулу. Через минуту выясняется, что в соседнем модуле getPrincipal() — это владелец учётной записи, а в третьем — глава организации. Ты не потратил полдня. Ты потратил пять минут. Но таких пятиминуток за день — десятки. Bill — счёт или банкнота? Draft — вексель или черновик? Security — ценная бумага или безопасность? Каждая — маленькая заминка. Вместе — налог, который платит каждый русскоязычный разработчик, даже не замечая этого.

Имена, которые ничего не значат

У этого есть отдельная разновидность — и она коварнее, чем кажется. Речь не о лени. Речь о том, что придумать точное имя сложно, особенно когда английский не родной. И мозг в такой ситуации делает не то, что нужно, а то, что проще.

Вот как это выглядит изнутри. Пятница, шесть вечера. У тебя три задачи в работе, одна из них горит. Нужно назвать новый компонент — тот, что обрабатывает отчёт по НДФЛ. Мозг в режиме экономии не ищет точное слово. Он ищет хоть какое‑нибудь. И находит самое доступное: вроде что‑то связанное с платежами, поэтому Pay, но посвящена повторным платежам, поэтому Repay. А дальше следует набор «бэйджей», чтобы было проще найти: NDFL, Report, Processing, Component. Ты не думаешь «это плохое имя» — ты думаешь «ну ладно, хотя бы понятно, о чём речь». Нажимаешь Enter.

А через полгода кто‑то другой открывает PayRepayNDFL6_2ReportProcessingComponent и не понимает ничего. Что такое 6_2 — версия? Номер формы? Второй квартал шестого года? Почему Pay и Repay стоят рядом — это два действия или одно? Что делает Processing — считает, отправляет, логирует?

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

И самое неприятное: это не лечится дисциплиной. Можно договориться «называйте понятно» — и через месяц всё вернётся, потому что проблема не в людях. Проблема в языке, на котором им приходится думать.

Когда английский теряет точность

Была у меня история с проектом для юристов. Я писал код и использовал due, deadline, expiry как синонимы — ну а что, все три про сроки. Пока на встрече юрист не объяснил, что :срок-исполнения, :срок-хранения и :срок-годности — это три разные вещи, и их нельзя путать. Одна относится к обязательствам, другая к документам, третья к товарам.

Я не полгода писал неправильный код. Я за пару недель накопил десяток мест, где использовал «не то» слово — и каждое потом приходилось править. Английский не давал мне точности, которую дал бы русский: в нём просто нет отдельных слов для этих трёх сроков.

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

1С: локализация как индустриальный стандарт

Первое, что приходит в голову, когда речь заходит о русском в коде, — это 1С. И не зря: здесь локализовано всё. Ключевые слова, типы (Число, Строка, СправочникСсылка, ПланВидовХарактеристик), ошибки (ОшибкаКонфигурации, НарушениеПравДоступа), документация.

Но дело не в переводе слов. 1С породила свою онтологию: РегистрСведений, Документ, ПланВидовХарактеристик — сущности, которых в английском просто нет. И это даёт тот эффект, которого не хватало: программист и бухгалтер говорят на одном языке. Не в том смысле, что бухгалтер читает код — а в том, что они используют одни и те же слова, когда обсуждают задачу. «Регистр сведений» — это не «information register», это понятие, которое бухгалтер знает по работе.

Локализация популярных языков — и особый случай Лиспа

Русскоязычные расширения появились почти в каждом популярном языке: алиасы ключевых слов в Python (если, пока, функция), русские идентификаторы в JS, Ruby, C#, юникод‑имена в Go. Всё это — попытки снизить налог, не создавая новый язык.

Именно в Лиспе локализация пошла дальше всех — потому что Лисп для этого и создавался: минимальное ядро, макросы, расширяемость. defun переименовывается в определить-функцию, домен описывается на родном языке без перевода. В Китае это стало одним из самых популярных решений в тусовке продвинутых программистов — именно за возможность описывать домен на своём языке, не переключаясь на английский в голове.

Локализация — не причуда. Это работающая практика, которая существует в разных парадигмах: в ООП (1С), в мультипарадигменных языках, в Лиспе. Вопрос не «возможна ли она», а «какой ещё парадигмы ей не хватает».

Марка: другая философия

Мы прошли три подхода: 1С, где локализация — это ООП‑парадигма; расширения Python, JS, Ruby, где она — надстройка; Лисп, где она — среда. Но есть ниша, которую никто не занял: функциональный, иммутабельный, data‑driven язык, где локализация — сама конструкция, а не перевод. Такого ещё не было. И вот здесь появляется Марка.

В статьях про Clojure есть известный эффект: когда все значения иммутабельны, ты перестаёшь бояться править код на лету. Нет страха, что где‑то в другом месте что‑то сломалось из‑за твоей правки, — потому что сломаться нечему, ты создаёшь новое значение, а старое остаётся нетронутым. Это меняет не синтаксис, а ощущение от работы.

С Маркой происходит похожая вещь, но по другой причине. Здесь предметка живёт не в комментариях и не в голове разработчика — она живёт в самом языке. Ты описываешь тип задачи, и этот тип становится частью кода, которую можно проверить, передать, вернуть из функции. Ты не держишь в голове соответствие «это поле значит вот это» — оно записано в типе, и язык его проверяет. Меняется не то, что ты можешь написать, а то, как ты думаешь, когда пишешь.

Это не «ещё один локализованный язык». Это другой режим работы — и он растёт из одной идеи: предметка должна жить в языке, а не в комментариях.

Один DSL для кода и типов — и типы как объекты первого порядка

Выражения языка типов и языка программирования — одни и те же. Типы можно передавать, возвращать, вычислять, валидировать в рантайме. Один язык для описания данных и для работы с ними.

lisp

тип Задача() :(
  :текст: Строка()
  :выполнено?: ?()
  :срок-исполнения: Дата())

фун обработать :(з: Задача()) Строка()
  разбор з Задача() :(
    ?+ : :готово
    ?- : :в-работе)

Предметка живёт не в комментариях, а в исполняемой спецификации. Разработчик и аналитик читают один и тот же код — и он валидируется машиной. Тип здесь — не декларация для компилятора, а значение, с которым можно работать в REPL. Проверить входные данные, собрать новый тип на лету, вернуть его из функции — всё это часть обычного цикла разработки, а не отдельного этапа сборки.

Русский язык в функциональной парадигме

А теперь самое интересное. В функциональном языке русский раскрывается иначе, чем в ООП.

В 1С локализация работает через сущности: РегистрСведений, Документ, ПланВидовХарактеристик. Это имена объектов, которые можно осязать. Русский здесь — язык предметной области, и он привязан к объектам.

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

Смотрите. В английском функция — это getUserName(user). Глагол, объект, субъект. В русском ты думаешь: «получить имя пользователя» — и это уже другая структура. А в функциональном стиле ты думаешь ещё иначе: «имя пользователя» — это данные, «получить» — преобразование. И язык позволяет выразить это напрямую:

lisp

>>> пользователь
  если-админ(замени-имя(пользователь, "Админ"))
  если-ошибка(логируй)

Читается как предложение на русском: «взять пользователя, если это админ, замени имя на „Админ“, если в процессе возникнет ошибка: логгируй». Не try {if (user.isAdmin()) then user.name = "Admin"} catch ... — а последовательность действий, описанная на языке предметки. Порядок слов в русском гибкий, и это идеально ложится на функциональные цепочки: ты можешь сказать «имя пользователя получить» или «получить имя пользователя» — и оба варианта будут звучать естественно.

Чужой код на Марке читается не как набор вызовов, а как текст. Ты не расшифровываешь getUserName(user) — ты читаешь «получить имя пользователя» и идёшь дальше. На длинных цепочках это ощущается как разница между чтением вслух и чтением по слогам.

Вот почему русский в функциональной парадигме — это не просто перевод ключевых слов. Это новый способ выражать преобразования данных. Английский в функциональном коде часто звучит как набор команд: map, filter, reduce. Русский позволяет описать то же самое как повествование: «возьми список, обнови каждый‑элемент, сверни‑в сумму».

И это работает не только на уровне синтаксиса. Типы ошибок, разбор, пайплайны — всё это в Марке звучит как русская речь. Потому что язык проектировался не как перевод, а как свой способ думать о данных.

Кстати, если вас заинтересовал этот проект, узнайте о нём больше на сайте marka‑lang.ru. Мы как раз сейчас в стадии активной разработки и интересуемся мнением программистов об этом инструменте.

Вместо вывода

Мы весь текст обсуждали когнитивный налог: сколько стоит думать по‑английски, когда код — про русскую предметку. Но если честно, это разговор про симптом, а не про болезнь.

Настоящий вопрос глубже: что если родной язык — не перевод поверх чужого опыта разработки, а органичная часть собственного? Когда язык, на котором ты думаешь, и язык, на котором ты пишешь, — один и тот же. И когда сам способ работы с кодом отличается от того, к чему ты привык.

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

Можно снижать этот налог по чуть‑чуть: переводить ключевые слова, локализовать ошибки, называть переменные по‑русски. А можно — построить язык, в котором налога нет с самого начала, потому что русский в нём не надстройка, а фундамент. И вместе с ним — другой способ работы с кодом, другая модель того, как ты проводишь день.

Это не про русский или английский. Это про то, что выбор языка — это выбор того, как ты думаешь. И этот выбор уже сделан — историей языка, на котором вы пишете сейчас.

А вы замечали, что тратите время на расшифровку английских имён в своей предметке? Сколько это — часов в месяц?

Комментарии (10)


  1. Kromster80
    05.10.2026 13:11

    То же справедливо для любой доменной области в которой не разбираешься - чем балка отличается от консоли, от перекладины, и от бруса. По незнанию легко всё перепутать точно так же.


  1. kablag
    05.10.2026 13:11

    Это сотни мелких заминок в день, каждая из которых длится минуту-другую — и вместе они съедают часы.

    это подкрепленно каким-то исследованием/статистикой или просто личные впечатления?

    И кроме того, в первом же примере на странице проекта

    загрузи список

    ;; Вычисление факториала числа n

    ;; n! = 1 2 3 ... n

    фун факториал :(n: Целое()) Целое()

        список.сверни(* 1

            список.интервал(1 n))

    факториал(5)

    нужно несколько раз переключить раскладку - посчитано время на это и количество получаемого раздражения ? :)
    Лично для меня вечная боль - локализованный Excel, где нужно в формулам переключаться постоянно с русского на английский


  1. Kartyge
    05.10.2026 13:11

    А через полгода кто-то другой открывает PayRepayNDFL6_2ReportProcessingComponent и не понимает ничего

    Можно подумать нафигаченное по тому же принципу скрепнопосконное платежпереплатежндфл123отчетпроцесскомпонент будет понятнее.

    Это лечится соглашениями об оформлении кода и именования переменных на проекте и кодревью, а не попытками играться в самобытность.


    1. pantagruel74 Автор
      05.10.2026 13:11

      На русском хотя-бы слова подобрать проще имхо.. Русский большинство русскоязычных программистов хотябы знают не на уровне В1..


      1. Kartyge
        05.10.2026 13:11

        ...впрочем да, инициативы по внедрению скрепнопосконного - дело благое. Чем больше вбухают средств в это ибд - тем меньше будет средств на настоящее развитие, которое тут явно вредно. Никакого тут не надо бусурманского ии, только сохи, лапти и бороды.


        1. pantagruel74 Автор
          05.10.2026 13:11

          Пишешь так, как будто кто-то денег просит..


  1. urbanizzz
    05.10.2026 13:11

    В английском алфавите 26 букв, в русском 33. На клавиатуре 7 "лишних" символов вытеснили с родных мест пару десятков спецсимволов:
    : ; ' " , . < > [ ] { } / ? \ | ` ~ @ # $ ^ &
    Половина из них поменяла расположение, вторая половина просто отсутствует в русской раскладке. И если с отсутствием, например @#$ можно смириться при создании нового ЯП, то замена различных скобок <>{}[] - уже проблема, с учетом современных стандартных структур данных. Значит либо этот ЯП будет обходиться без спецсимволов либо будет тратиться дополнительное время на переключение раскладки

    Кроме того русский текст занимает больше места (русские слова в среднем длиннее, символы шире), например https://habr.com/ru/companies/alconost/articles/197146/ приводит увеличение в 9% при переводе. Значит кодовая база минимум на 9% будет больше.

    Так что решение проблемы "когнитивного налога" (если допустить что такая проблема вообще существует) вызовет кучу новых неочевидных проблем.

    А если смотреть шире, то:
    1. Все врачи советуют тренировать мозги для сохранения ясности ума и предупреждения болезни Альцгеймера. Стандартный совет для этого - учите иностранные языки. И получается, что это уже не налог, а дополнительный фактор, помогающий сохранить ясность ума в пожилом возрасте.
    2. Знание английского языка для инженера-программиста, это стандартный маст-хэв. Не из-за англоязычного ЯП, а из-за технической документации, книг и статей на английском языке.
    3. Пресловутый когнитивный налог появляется не из-за английских операторов, а при подборе подходящих названий переменных и методов. Может у автора с этим проблем нет (сомнительно), а вот у меня есть, несмотря на то, что русский для меня родной.


  1. vitiok78
    05.10.2026 13:11

    Английский язык - это для программиста точно такой же инструмент, как и язык программирования. И если не хочешь владеть этим необходимым инструментом, то ты отрезаешь себя от всего мира, от всей литературы, от всех статей и видео. Это просто глупо.

    Это как если быть католическим монахом в средние века, и не знать латынь. Просто нонсенс.


  1. simonether
    05.10.2026 13:11

    Ваш же пример PayRepayNDFL6_2ReportProcessingComponent на русском был бы ПлатежПовторныйПлатежНДФЛ6_2ОтчетОбработкаКомпонент. Понятнее не стало, что такое 6_2 всё так же не ясно. Это набор ярлыков вместо описания что компонент делает, и язык тут ничего не меняет


  1. accXak
    05.10.2026 13:11

    получить-имя-пользователя(активныйПользователь). Спасибо, не надо