В программировании (как и в написании HDL кода и подобных профессиях) есть две школы мысли: чистолисты (строят свою архитектуру с чистого листа и пишут так чтобы поменьше отлаживать) и кодокопатели (отлаживают что есть, дополняя мусором из интернета, чтобы поменьше писать). На это накладывается менеджмент, который пытается комбинировать чистолистов и кодокопателей, иногда неправильным образом, то есть ставит чистолистов править то, что налабали кодокопатели. Это происходит потому, что кодокопатели постоянно выглядят занятыми отладкой, а чистолист часто смотрит в потолок обдумывая дизайн, поэтому менеджмент думает что первые работают быстрее чем вторые, и пытаются соптимизировать “быстроту-качество” вот таким образом.

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

У этой школы мысли есть большой плюс: если что-то сделано, то оно как правило работает. И три минуса:

  1. И продукт, и подкомпоненты многократно переписываются прежде чем достигнута прочная и при этом гибкая структура. Это нервирует менеджмент.

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

  3. Вся структура может не выдержать новой крупной фичи. После чего у чистолиста встает дилемма: все переписывать или бежать. Менеджмент требует скрестить ежа с ужом, для юного чистолиста это предательство идеалов, и даже для опытного - некомфортная операция, от которой он будет пытаться отлынивать частичными решениями или обманом менеджмента.

В другой школе мысли, назовем ее “кодокопатели”, проект начинается с того, что программист лихорадочно гуглит и сваливает у себя кучу кода со всяких свалок, из которого пытается что-то склеить, после чего это склееное отлаживает. Собственно именно отладка является у кодокопателей главной деятельностью - смотреть на чистый лист и на нем что-то писать они очень не любят и пытаются избегать любыми способами.

На одной из предыдущих работ был товарищ, назовем его Вася, который сначала работал как application engineer в маркетинге Raspberry Pi, а потом был поставлен делать образовательный проект с процессором на FPGA плате. Он очень боялся прикасаться к коду. Для него написать страницу кода для реализации valid-ready AXI каналов было страшнее, чем нагуглить на opencores два студенческих моста двадцатилетней давности и слепить кентавра из Wishbone и AHB-Lite, только чтобы не писать самому.

Продукт не был особо принят на рынке, потому что у всех кто это видел сразу вставал вопрос “на фига тут многослойное это, тем более что в индустрии все делается проще и работает эффективнее”. Предсказуемо, что этот человек потом стал основателем no-code стартапа, а теперь гоняет на AI. Теперь вы понимаете, откуда такие люди берутся.

Как я уже сказал, бывает некомпетентный менеджмент, который принимает лихорадочное гугление и слепление за быстроту и дает склейщику кодокопателю карт-бланш что-то наваять, а потом ставит чистолиста это чистить. Это вызывает реакцию “тут надо все переписать”, что в свою очередь бесит менеджмент, который думает, что надо только внести пару правок перед отправкой заказчику.

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

У меня был ровно такой случай в середине 2000-х. Чтобы вы поняли масштаб проблемы, скажу что в налабанном коде товарищ, назовем его Петей, использовал трехмерные массивы там где нужно было использовать дерево, и их в разных местах кода тройным циклом обходил. Когда этот товарищ уходил из компании, он спросил меня советов о будущем. Я открыл рот и начал намекать что ему нужно научиться программировать, но он меня перебил, и пояснил свою мысль: он решил что программирование для него слишком просто, поэтому он хочет стать основателем стартапа. И, так как я был основателем сфинансированного венчурными капиталистами стартапа в 1990-х, он хотел совет именно по этой линии.

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

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


  1. vkni
    29.04.2026 17:37

    @YuriPanchul

    1. Спасибо, интересная тема.

    2. Предпоследний абзац повторяется дважды, дважды.

    Вообще, есть т.н. «спиральный подход» для «чистолистов», когда прототип выбрасывается нафиг. А для того, чтобы это не бесило, и проще было делать прототипы, есть языке с развитой системой типов — Хаскель, к примеру.

    И там прототип делается на типах — которые можно рассматривать как очень маленькую дублирующую приблизительную реализацию. Соответственно, когда мы пишем прототип только на типах, оставляя кругом undefined, мы пишем мало, это легко выбрасывать и переписывать. А потом дырки undefined уже можно заполнять.


    1. YuriPanchul Автор
      29.04.2026 17:37

      Дважды поправил, спасибо.

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


      1. vkni
        29.04.2026 17:37

        Ну да. Вообще для разных подсистем можно писать каскад прототипов.

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


        1. mvv-rus
          29.04.2026 17:37

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

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


      1. apevzner
        29.04.2026 17:37

        Я, обычно, свой код как деревце выращиваю

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

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


  1. wladislawmsk
    29.04.2026 17:37

    Исключительно плохие примеры любителей отладки выставляют тут их (нас) в плохом свете и, на мой взгляд, несправедливо.

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

    Я сам предпочитаю как можно скорее запустить приложение, чтобы начать отлаживать. Пусть даже оно полностью состоит из заглушек, но главное, что все, что я пишу после того, как оно запущено - я могу потрогать, проверить любое предположение, поиграться со структурой данных и отладить, если что-то пошло не так. В целом в руках подержать то, что пока получается. При этом я редко использую готовый код и предпочитаю обходиться минимальным набором инструментов, когда возможно, а архитектура решений, которые получаются в итоге ничем (я надеюсь) не выдает того, что я не чистолист. Просто подход в том, чтобы думать и делать чередуя, а не разделяя эти процессы.


    1. YuriPanchul Автор
      29.04.2026 17:37

      Я тоже стемлюсь запустить быстрее, но делаю для этого законченную версию с подмножеством фич. А потом иду на другой круг спирали, и делаю версию с большим количеством фич. Стараюсь избегать заглушек и копипасты того что не планирую иметь в будущем.

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


    1. apevzner
      29.04.2026 17:37

      Тут намечается классификация разработчиков по ещё одному признаку

      Одни способны придумать архитектуру из головы, а потом описать её в коде. Ну, по крайней мере, они говорят, что так могут. Живьём я такого не видел (чтобы архитектура при этом получилась удачная), но стандартные практики менеджмента считают такой сценарий развития желательным

      Другим надо потрогать вещи руками, чтобы мысли стали на место. А без этого как-то не получается.

      Часто выход для этих вторых в написании прототипов перед написанием настоящих реализаций.

      Я тоже вру иногда, что делаю прототип, чтобы от меня отвязались. Но почему-то в конечном итоге прототип и становится финальной реализацией :)


  1. D_T
    29.04.2026 17:37

    Пришел я в начале 2000х на проект, где было заявлено что MySQL так крут что индексы не нужны, студенты писали, проект в продакшене заметно тупил, изучил запросы, добавил индексы и все залетало. Кто я был тогда? чистолист или кодокопатель?


    1. YuriPanchul Автор
      29.04.2026 17:37

      Вы переосмыслитель-рационализатор, это отдельная роль. Я такое вчера сделал на работе, показал как некий процесс (синтез проекта на Synopsys Fusion Compiler) можно реорганизовать, чтобы он для решения проблемы разработчика (меня) занимал 15 минут, а не 4 дня на итерацию.


  1. devmargooo
    29.04.2026 17:37

    Ахах, узнала в себе образцового чистолиста :D пока мои друзья обсуждают новый фреймворк, на котором «легче и быстрее» писать, я хвастаюсь за голову, понимая, сколько там будет дебага с такими призрачными ограничениями


  1. serp2002
    29.04.2026 17:37

    К счастью авиация очень консервативная отрасль, до сих пор NOTAM через сеть AFTN передаются, то есть по факту через телеграф. А вы говорите ИИ ))


  1. Yura_PST
    29.04.2026 17:37

    1. Изучил задачу;

    2. Написал реализацию;

    3. Исправил опечатки;

    4. Работает!

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


  1. apevzner
    29.04.2026 17:37

    И продукт, и подкомпоненты многократно переписываются прежде чем достигнута прочная и при этом гибкая структура. Это нервирует менеджмент.

    Я - явный чистолист, но в целом обхожусь постоянным вялотекущим рефакторингом вместо многократного переписывания. В остальном всё сходится.

    Отладчиком иногда пользуюсь в качестве калькулятора :)


  1. codecity
    29.04.2026 17:37

    Вот классификация - в точку. Именно так все и происходит в реальной жизни. Но термины такие "чистолисты" и "кодокопатели" (хотя они и передают суть - претензий нет) - ранее не встречались.


  1. mvv-rus
    29.04.2026 17:37

    У меня по жизни сложилось впечатление, что написание своих программ и понимание чужих программ (оно же - программная археология) - это два разных навыка. А объединяет их только необходимость понимания, как работают программы: вообще или на конкретном языке, и приемов программирования. А дальше для написания собственных программ требуется умение творить: создавать абстракции и делать из них архитектурные решения, а для чтения чужих - умение понимать: реконструировать ход мысли другого человека, выделять используемые им абстракции и прояснять для себя созданные на их основе архитектурные решения. IMHO эторазные умения, хотя и некоторым образом связанные: например, знание типовых приемов программирования помогает в обоих случаях.


  1. eao197
    29.04.2026 17:37

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

    Конкретно в этой истории самым интересным является то, как Петя прошел испытательный срок и как ему позволяли творить такую дичь в коде.