Примерно в марте 2017 года меня попросили сделать код-ревью продукта перед запуском. У той компании были проблемы с утечками памяти, спонтанными сбоями, медленной загрузкой, скачками потребления CPU, а релиз был запланирован через несколько недель. Возможно, вы уже слышали эту историю — не от меня и не об этой компании. Она на удивление типичная.

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

Когда я общался с разработчиками, они казались умными людьми. Единственной очевидной проблемой было отсутствие опыта. Я сталкивался с этим раньше. Это распространённое и вполне нормальное явление. Но в этом случае наблюдался гнусный изъян: опыта не хватало всем разработчикам.

Отдел разработки создали недавно, а команду нанимали в отсутствие технического директора. Даже технарю сложно проверить другого программиста — я даже не могу представить себе проверку без технических знаний. Они наняли первого разработчика, он проверил второго разработчика — и так далее, пока не сформировалась команда.

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

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

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

Что же делать новому разработчику?

Кажется естественным поискать ответ в интернете. Оказывается, это невероятно эффективно.

Но это также невероятно опасно.

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

Однажды моё внимание привлёк один фрагмент кода. Я мог поклясться, что видел его раньше. Конечно, загуглив строку, я нашёл точную копию кода в одной блогозаписи. Естественно, я прочитал всю статью — вплоть до абзаца, в котором говорилось: «Не делайте этого в продакшне».

Но вот эти строчки смотрят на меня прямо из кодовой базы в продакшне.

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

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

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

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

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

Проблема не в людях.

Я сильно сочувствую разработчикам, которые находятся в таком положении. У них больше информации, чем им когда-либо понадобится, но она полностью дезорганизована. Это похоже на попытку собрать паззл из десяти частей, только нужно найти их в куче из 10 000 000 штук, где все кусочки квадратные, а конечный результат неизвестен. Удачи.

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

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

Подведём итог.

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

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


  1. anamnian
    22.08.2018 17:48
    +2

    Было бы неплохо привести пример упомянутого

    <<Не делайте этого в продакшене>>
    кода в статье.


    1. Cryvage
      22.08.2018 18:03
      -2

      Чтобы кто-нибудь скопировал его себе в продакшен?


    1. DSolodukhin
      22.08.2018 18:14
      -2

      Не делайте этого в продакшне

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


      1. bogolt
        22.08.2018 21:17
        +1

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


      1. Free_ze
        23.08.2018 11:26

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


  1. barbos6
    22.08.2018 19:01

    Передовые паттерны, лучшие практики, мировые тенденции — наше всё…
    Знания, здравый смысл — а зачем мне это?


    1. zodchiy
      22.08.2018 19:27
      +2

      А сотрудников ищут не по здравому смыслу и почти не интересуются опытом, сейчас
      сотрудников подбирают вопросами, сколько «реализаций паттерна *имя_паттерна* на *ЯП* вы знаете».


  1. Imbecile
    22.08.2018 19:37
    +6

    Даже будучи посредственным разработчиком можно нанять хорошую команду. Но
    1. Нужно отдавать себе отчёт, что ты так себе разработчик.
    2. Заниматься организацией, а не разработкой.
    Проверено на себе.


    1. m03r
      22.08.2018 22:10
      -5

      Комментарий отлично сочетается с юзернеймом.


  1. x893
    22.08.2018 22:17

    Да фиг с ним с кодом. Не в нём счастье.
    Люди при деле. Молодой дружный коллектив. Это главное.
    Перейдут в другую контору и будут дальше творить.


    1. witka
      23.08.2018 01:23

      надеюсь, что это был сарказм


      1. Stas911
        23.08.2018 01:56

        Дык подучатся под руководством гуру же


      1. x893
        23.08.2018 02:23

        Конечно — просто не все понимают.


  1. Arbane
    23.08.2018 03:02

    Аптекарь проговорился: всего одна ложка этого средства поможет от…


  1. hdfan2
    23.08.2018 07:58

    ломайте вещи

    Переводчику (этому и другим) на заметку: слово «thing» далеко не всегда нужно переводить как «вещь»; более того, его не всегда нужно вообще переводить. В данном случае это скорее «ломайте всё подряд».


  1. lightmaann
    23.08.2018 15:01

    На самом деле, кто заставляет разработчика приходить на позицию, если он в этом деле некомпетентен? (Со стороны разработчика) А тем более ему же потом нанимать себе людей в команду. Лично для меня это очень странно звучит, потому что я 50 раз подумаю перед тем, как вписаться во что-нибудь и 100 раз подумаю перед тем, как брать ответственность за другого человека.

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