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

Никаких особых медицинских диагнозов мне не ставили, но мои умственные способности крайне ограниченны. Даже те задачи на Leetcode, которые попроще, вызывают у меня затруднения. Когда я читаю о самом обычном алгоритме консенсуса, у меня кипит мозг. У меня плохо получается отслеживать сложные зависимости в кодовой базе. Я не способен освоить модные языки вроде Rust (пытался, но по правде сказать, для меня это чересчур). Я терпеть не могу микросервисы и современный фронтенд: там слишком много движущихся частей, и уследить за всеми я не в состоянии.

Как же я выхожу из положения?

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

Внешние зависимости я ввожу по минимуму (в идеале вообще обхожусь без них). Проектирую модули с понятными API (и не употребляю слово «понятный» в том значении, которое ему придает Роберт Мартин), но почти никогда не перевожу их в микросервисы. Пользуюсь JSON-over-HTTP и ни в коем случае не GraphQL. Я не пожалел времени на то, чтобы изучить SQL, и активно его использую. Для устойчивости применяю самые базовые паттерны: таймауты, автоматические выключатели и обратное давление.

Стараюсь сводить количество компонентов ПО к минимуму. В идеале только само приложение, SQLite или PostgreSQL для хранения данных, а также Docker, приправленный shell, для развертывания. Nginx/HAProxy – по мере необходимости. Никаких API-шлюзов, никакого сегментирования, никаких распределенных кэшей, никаких очередей сообщений, никаких NoSQL/NewSQL/Graph/всевозможных баз данных, никакого обнаружения сервисов, никакой федерации, никакой ориентации на облако, никаких лучших практик уровня FAANG.

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

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

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


  1. Apv__013
    24.04.2024 08:53
    +230

    О, наконец то нормальный программист, а не выращенная маркетологами макака на стероидах. Спасибо!


    1. DenSigma
      24.04.2024 08:53
      +29

      "Макака, позиционирующая себя крутым программистом". Освоила стримы и реактивку, но еще не умеет их НЕ применять.


    1. bokhanych
      24.04.2024 08:53
      +14

      Я всегда пишу огромные мануалы по проделанной работе, указывая все мелочи, вплоть до версий пакетов, если эту работу предстоит делать в будущем, снова, потомкам. И, как правило, я и есть этот потомок ;) А так-же оставляю в коде ссылки на свой git\linkedin для вопросов тех, кто будет продолжать работу.

      Автор не тупой, а заботливый.


  1. vitslepukhin
    24.04.2024 08:53
    +55

    Просто эталон программистского благочестия. Сам себя не похвалишь - никто не похвалит.


  1. DenSigma
    24.04.2024 08:53
    +1

    О! Интересно. А как к принципам "Чистого кода" Мартина относишься? Для меня наоборот, это сильно упрощает понимание и работу с кодом (если пишу свой, конечно). Наследование имхо слишком сложно.


    1. Drucocu
      24.04.2024 08:53
      +9

      Это перевод, под заголовком есть ссылка на сайт автора.


    1. bear11
      24.04.2024 08:53
      +5

      Вот к этому самому "Чистому коду" надо на самом деле относиться с опаской. Бездумное применение его практик может приводить к внушительным потерям в производительности программ - именно из-за следования советам этой книги.

      Подробнее в статье на английском: https://www.computerenhance.com/p/clean-code-horrible-performance


      1. UranusExplorer
        24.04.2024 08:53
        +6

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


    1. isadora-6th
      24.04.2024 08:53
      +1

       "Чистого кода" Мартина слегка устарел, т.к. был написан под Java 5 и за пределами этой самой Java выглядит многословно.

      Ну и ряд тейков в книге у него было откровенно вредительских - типа функции которые в идеале не принимают аргументов и многопоточка не дает прироста по перфу. Самое смешное, это там где он привел листинг кода на 7 страниц книги с ремаркой внизу, что ~"реализовал тоже самое на питоне в 5 раз короче, а все потому-что Java многословный язык"

      Из прикольного, читал про Domain Driven Development, который выглядит адекватно и на самом деле это адекватный чисто-код с понятными плюсами и минусами.

      А "Чистокодить" за пределами Java, например в плюсах, это моветон


  1. Batalmv
    24.04.2024 08:53
    +4

    Все зависит от нефункциональных требований к приложению

    Если вам хватает (а почему бы и нет) - от ок. Но с какого-то уровня может не хватить


  1. CitizenOfDreams
    24.04.2024 08:53
    +12

    И с течением лет пришел к осознанию, что я не очень умный.

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


    1. Newbilius
      24.04.2024 08:53
      +18

      У меня есть сомнения, что именно разработчик лично решил сравнивать пассажиров именно так. Возможно программист таки рвался сделать всё правильно, но ТЗ есть ТЗ, и порой переубедить заказчика, что фигня получится - не так уж просто...)


      1. newintellimouse
        24.04.2024 08:53
        +28

        Из личной практики:

        — Вы хотите написать систему управления многоквартирным домом и хотите запретить регистрироваться в нём пользователю, если человек с таким же ФИО уже зарегистрировался в системе. Но вот смотрите, в моём доме живёт три человека с совпадающим ФИО...

        — Ну какая вероятность, что такое произойдёт вообще? Меньше одного процента? Мы пренебрежём этой возможностью совпадения.

        Полгода переговоров параллельно с разработкой ТЗ ни к чему не привели, требование ушло в работу :)


        1. tuxi
          24.04.2024 08:53
          +26

          — Ну какая вероятность, что такое произойдёт вообще? Меньше одного процента? Мы пренебрежём этой возможностью совпадения.

          О да! Классический шаг в бездну потенциального секса с проектом через полгода год. И каждый раз одна и та же картинка. Как только произносятся ключевые слова про "вероятностью в 1% надо пренебречь" можно смело планировать время на глубокий рефакторинг спустя полгода. И про "1% пронебречь" уже никто не вспомнит, а зачем нужен рефакторинг придется обосновывать.


          1. VYudachev
            24.04.2024 08:53
            +4

            Немножко подушню, а чем тут поможет глубокий рефакторинг, если это по определению "процесс изменения внутренней структуры программы, не затрагивающий её внешнего поведения" (с), а тут клюнул жареный процент и внешнее поведение не устраивает? Можно смело планировать время на переписывание проекта.


            1. tuxi
              24.04.2024 08:53
              +2

              глубокий рефакторинг != рефакторинг ... ну как то так)

              Если говорить серьезно, бизнесу же не важно, что там внутри. Может там совсем новая версия будет. Или старая, но теперь она (как в примере выше) умеет рассылать письма менеджерам с уведомлениями, что "вау! редкое событие таки наступило, чините парни руками прямо в бэдэшечке".


          1. SquareRootOfZero
            24.04.2024 08:53
            +4

            В программировании 1% - это ведь буквально овердохрена. Это значит, что столкнёшься с этим явлением а) обязательно; б) скоро; в) неоднократно. Если, допустим, запрограммировать Псалтырь, чтобы, в результате бага, произвольное слово с вероятностью 1% подменялось матерным ругательством - матерных ругательств там будет в среднем по одному-два на страницу, а не "спустя полгода пренебречь". Чтобы хоть в каком-то приближении можно было "пренебречь" (читай: "спихнуть, пока не заметили") - это какие-то сотые-тысячные доли процента должны быть, а не единицы.


        1. DvoiNic
          24.04.2024 08:53
          +33

          Лет пятнадцать назад читал одну историю (к сожалению, сейчас найти не могу). Смысл такой: программист бодался с менеджером (или постановщиком, или ключевым пользователем) по поводу ТЗ (какое-то деловое ПО ), и в алгоритме одна из ветвей "вела в никуда". Менеджер доказывал, что "такое сочетание событий не то, чтоб крайне маловероятно, но вообще никогда не может быть". Ну, договорились, что в этом случае будет приходить письмо на электронную почту этого менеджера. В общем, за неделю там накопилось несколько сотен писем...

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


          1. perfect_genius
            24.04.2024 08:53
            +3

            Похоже на закон Мёрфи.


            1. DvoiNic
              24.04.2024 08:53
              +1

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


            1. vkni
              24.04.2024 08:53

              Да, ими и надо руководствоваться в разработке. :-)


          1. franzose
            24.04.2024 08:53
            +12

            Ну, договорились, что в этом случае будет приходить письмо на электронную почту этого менеджера. В общем, за неделю там накопилось несколько сотен писем...

            А ведь это гениальная идея)


            1. StriganovSergey
              24.04.2024 08:53
              +1

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


          1. bat
            24.04.2024 08:53
            +1

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


            1. Ndochp
              24.04.2024 08:53

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


        1. Emulyator
          24.04.2024 08:53

          А какая альтернатива решающая проблему была предложена заказчику и почему он отказался?


          1. newintellimouse
            24.04.2024 08:53

            Не вводить это ограничение, как избыточное :) И относящееся к проблеме, которой нет. Полные тёзки в этой системе никаких проблем друг другу не создавали.


            1. Emulyator
              24.04.2024 08:53

              Но тогда получается, что можно одному человеку 100 раз регистрироваться, разве это нормально?


              1. VladimirFarshatov
                24.04.2024 08:53
                +3

                Вводятся дополнительные критерии - огграничители, к примеру "номер телефона", "год рождения", ИМЕИ и пр. данные конфигурации железки - источника запроса. Это просто "навскидку", там много можно чем дополнять ФИО.


                1. Emulyator
                  24.04.2024 08:53

                  Так вот и непонятно, были ли такие критерии в этом случае, или одних фио достаточно для регистрации.


              1. DaneSoul
                24.04.2024 08:53
                +7

                Но тогда получается, что можно одному человеку 100 раз регистрироваться, разве это нормально?

                Конечно нормально. Что мешает одному человеку выкупить несколько квартир в одном доме для сдачи внаем / инвестирования ?


                1. Emulyator
                  24.04.2024 08:53

                  А что мешает, имея одну квартиру, зарегистрироваться 100 раз?


                  1. releyshic
                    24.04.2024 08:53
                    +2

                    мешает тот, кто одобряет заявки или тот, кто потом администрирует эти учётки


                    1. Emulyator
                      24.04.2024 08:53
                      +2

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


                1. dsv180
                  24.04.2024 08:53

                  А почему нельзя несколькими квартирами под одной учеткой управлять?
                  ИМХО вообще людей на полезных сервисах надо через ЕСИА авторизовать...


              1. Evengard
                24.04.2024 08:53
                +1

                Если речь про регистрацию, которая "прописка", то кажется что номер паспорта неплохое ограничение. Не идеальное, но неплохое.


                1. iv660
                  24.04.2024 08:53
                  +2

                  Речь о "системе управления многоквартирным домом". Тут всё еще проще: номер квартиры.


                  1. rombell
                    24.04.2024 08:53

                    И тут внезапно отец и сын, полные тёзки, в пролёте.


                1. dsv180
                  24.04.2024 08:53

                  Ага, чтобы так сразу в 152ФЗ с головой нырнуть и не вынырнуть...

                  А еще паспорта могут менять...


                  1. dimykus
                    24.04.2024 08:53
                    +2

                    имена и особенно фамилии тоже могут менять, и только снилс неизменен(вроде)


                    1. Alterrus
                      24.04.2024 08:53

                      Опирайтесь на Инн.


                      1. Ndochp
                        24.04.2024 08:53

                        Меняется.


                1. papalesik
                  24.04.2024 08:53

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


        1. lamerok
          24.04.2024 08:53

          Тут странности со стороны менеджера. Обычно наоборот бывает, В данном случае, добавление такого условия, это очевидное добавление ефортов, так как надо отдельно обрабатывать ситуацию с одинаковыми именами.

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

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


          1. newintellimouse
            24.04.2024 08:53

            Финальная оценка уже после подготовки ТЗ была.

            И за эту штуку он заплатил в итоге, и она была реализована.


        1. VladimirFarshatov
          24.04.2024 08:53

          Год назад, работая в сфере ЖКУ я уже слышал такое. Ушел раньше начала написания по ТЗ .. нахер. Не одно ли это место, случаем? ;)


          1. newintellimouse
            24.04.2024 08:53
            +1

            То было ещё в 20 году :)


            1. vis_inet
              24.04.2024 08:53
              +2

              От Р.Х. ?


              1. Melirius
                24.04.2024 08:53
                +3

                От воцарения


        1. AlexV777
          24.04.2024 08:53

          Даже в пределах одной квартиры, не то что дома, ФИО могут повторяться


        1. NikRag
          24.04.2024 08:53

          Это ТЗ не значит ведь, что вы будете хранить пользователей в базе по уникальному ФИО? Ведь не значит?
          [падме.жпг]


    1. gxcreator
      24.04.2024 08:53
      +4

      Забавно, хабр выдал это по вашей ссылке на новость.


      1. Merkan
        24.04.2024 08:53
        +14


      1. tuxi
        24.04.2024 08:53
        +4

        Буквально вчера видел this.messages is null вместо ленты статей )))


        1. exTvr
          24.04.2024 08:53
          +2

          Да что-т глючит Хабр в последнее время, навигация по "F" через раз работает, ошибки сыплет и помечает все комменты прочитанными. @Boomburum что-то неладное творится, уровень счастья пользователей Хабра падает.


          1. Boomburum
            24.04.2024 08:53
            +4

            F вроде штатно работает ) ну или подробности в личку бы (с окружением итд).
            Насчёт остального мы в курсе, в процессе исправления — это следствие большого подкапотного обновления.


    1. seregamorph
      24.04.2024 08:53

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


      1. vis_inet
        24.04.2024 08:53

        Удивительно, как можно не смотреть на номер рейса?


  1. engine9
    24.04.2024 08:53
    +12

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


    1. vrytov
      24.04.2024 08:53
      +50

      И да, если вам хватило возможностей разума работать с кодом, то вы умнее 95% людей.

      Нет.


    1. releyshic
      24.04.2024 08:53
      +1

      он вместо того, чтобы разобраться.натренироваться - занимается избеганием и придумывает себе оправдания в виде тупости, хотя я уверен, что он совсем не разбирается в тупости


      1. engine9
        24.04.2024 08:53

        С чем именно вы не согласны? В чём суть вашего негодования?


    1. coresky
      24.04.2024 08:53
      +1

      Потенциально существует интеллект, для которого самые умные программисты - просто муравьи барахтающиеся в банке. Все люди разные. Самое главное: не переставать учиться и развиваться. Статья и ее резонанс не о чем.


  1. developer7
    24.04.2024 08:53
    +44

    Гениально! Я смотрю тут многие не поняли про что написано и давай хейт разводить. А смысл прост - писать просто настолько насколько можно. Выкинуть всё ненужное настолько - что бы программа выполняла только то что от неё требуют.

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

    А всё от того что написав свой код, спустя месяц ты на него смотришь, и что бы понять что там происходит тратишь день, а не 10 минут. Я не говорю про чужой код.

    В 99% случаях сложная иерархия классов на старте никому в последствии ненужна. А только будет доставлять неимоверный гимор в разработке. Опять же если проект растёт - то гораздо проще переписать уже устоявшуюся архитектуру с нуля, чем писать очередной костыль который будет бороться с изначально неправильной архитектурой.

    И такой подход имеет свою особенность. Код становится выглядеть "примитивным". Отсутствуют наследования, инъекции, полиморфизм - да вообще всё. Любой новичок посмотрев на такой код сразу понимает как он работает.

    Но как написали в статье: в "Гуглах" будут воротить нос.


    1. markoni
      24.04.2024 08:53
      +3

      Вполне нормальный подход. Недавно где-то глаз зацепился: после jquery пошел бурный рост и развитие разных framewors: react, node, angular, vue, svelte - а все равно 77% сайтов на настоящий момент используют jquery :) Не близко к тексту - но посыл был примерно такой.


      1. developer7
        24.04.2024 08:53
        +9

        Кстати добавлю как у меня получается писать "просто".

        Многие наверно подумаю что это же "просто"! А вот нифига. Написать "просто" - сложнее чем просто написать ))) Извините за каламбур.

        Короче я это делаю в 2 или в 3 подхода. Сначала пишешь как есть. Когда код работает - даёшь ему отлежатся. Плюс со временем в него добавляются новые фичи.

        Потом когда код перестаёт интенсивно расти - возвращаешься к нему и выкидываешь, склеиваешь функции по максимуму, упрощаешь логику.

        И да я описал банальный рефакторинг. Который в современном бизнесе совсем не ценится.

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

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

        Положительный момент - отлавливаются много упущенных багов.

        Отрицательный - бизнесу такое нафиг не нужно.

        P.S. И забыл добавить. Итерация 2 и 3 не привязаны ко времени. Они привязаны к ситуации. Т.е. происходят тогда когда они нужны. Тогда при рефакторинге ты находишься максимально в мейнстриме. И рефакторинг происходит максимально безболезненно. Имеется виду безболезненно для психики программиста. Никто же не хочет разгребать этот поганый легаси )))


        1. DvoiNic
          24.04.2024 08:53
          +5

          "усложнять - просто. Упрощать - сложно!"©Законы Мэрфи


          1. developer7
            24.04.2024 08:53
            +1

            "Всё гениальное просто" @


            1. DvoiNic
              24.04.2024 08:53

              на то оно и гениальное. Но гениального в жизни не очень много.


        1. movl
          24.04.2024 08:53
          +1

          Многие наверно подумаю что это же "просто"! А вот нифига. Написать "просто" - сложнее чем просто написать

          Еще у Паскаля было: "Письмо это вышло более длинным только потому, что у меня не было времени написать короче". В общем, это просто проблема оптимизации, которая обычно не решается за 2-3 итерации. За это время можно даже не успеть понять, что конкретно следует оптимизировать и в ущерб чему.


        1. VasiliyLiGHT
          24.04.2024 08:53
          +2

          У меня попроще - второй этап как третий, спустя полгода :D

          Вот сейчас как раз занимаюсь переписыванием того, что было реализовано год назад - половина кода стёрта окончательно (а не закомментирована, как до этого обычно делали), большая часть конструкций упростилась, entity framework пошёл лесом - SqlConnection хватает за глаза. Спасибо M$ за Minimal API - громоздкие контроллеры

          заменены несколькими строками

          Через какое-то время может быть ещё где-то можно будет упростить, но пока что мне кажется, что проще не сделать. Опыта всего ничего)


          1. YemSalat
            24.04.2024 08:53
            +1

            Через какое-то время может быть ещё где-то можно будет упростить

            Уберите префикс "Map.." из всех этих MapGroup, MapGet и тд


            1. VasiliyLiGHT
              24.04.2024 08:53

              Не убрать, это стандартная реализация https://learn.microsoft.com/en-us/aspnet/core/fundamentals/minimal-apis


          1. nronnie
            24.04.2024 08:53
            +3

            Удачи вам в ваших упрощениях. Уверен, придет время и вам придется все возвращать назад. Не зря ведь говорят, что простота она часто хуже воровства :) Все эти "minimal bla-bla-bla" они обычно только для примеров масштаба "Hello world" хороши.