Всем привет!

Буквально на днях, спустя три недели после выхода на работу, мой новый программист пишет такой же код, как и трое моих других опытных разработчиков, которые на том же проекте около года.  В свою очередь эти трое создают единую архитектуру, дают одинаковые названия сущностям и пишут чистый код, что сильно упрощает проведение code review и облегчает всем понимание кода.

В этой статье я поделюсь своим опытом : за счет чего же я этого достиг. Я думаю мой опыт может быть вами  применен в любой сфере IT и не только!

Для *лидов +

Осторожно! Материал ниже составлен для тех, кто своей шкурой отвечает перед бизнесом за сроки и качество продуктовой разработки или просто результат работы команды. В общем *лидам или тем кто им планирует им стать.

Синдром утенка

Давным давно, на заре своей IT карьеры, порядка 10 лет назад, я был на должности руководителя группы отдела технической поддержки. В мои обязанности входило обеспечение техподдержки клиентов компании.  Нужно было принимать звонки и помогать клиентам. У нас в отделе было 2 группы. Одной управлял я, другой мой коллега. В каждой группе было где-то 8 — 10 человек. На тот момент мы оба были без опыта обучения и управления людьми, мы были из бывших сотрудников поддержки. Мы хорошо знали как все работает с технической точки зрения, но опыта  управления у нас не было. Соответственно нам никто ничего не объяснял, ничему не учил и не передавал опыт.  Как следствие мы управляли своим персоналом по наитию и по большому счету делали все то же самое, что делал с нами наш предыдущий «босс», когда мы были обычными инженерами. Так сказать в полной мере воплощали «синдром утенка», повторяли все за ним. Естественно, новых сотрудников нужно было обучать. И  следуя синдрому утенка, мы оба, как и наш предыдущий босс, когда всего было 6 человек в отделе, обучали своих подчиненных лично. Садились рядышком с обучаемым на стульчик и объясняли: “вот смотри, тут у нас …”.  И в таком режиме обучение проходило пара рабочих дней. Мне кажется, что мы таким образом обучали абсолютно всех инженеров около двух лет. За эти два года я даже умудрился расписать 2 листа А4, с порядка 40 вопросами, которые нужно успеть обсудить с учеником за эти 2 дня. И все бы наверное так и  шло своим чередом, пока где-то  спустя 2 года, один из моих инженеров подрос профессионально и в один прекрасный летний день спросил у меня: «А зачем ты им постоянно объясняешь одно и то же? Не легче ли описать мануал с типовыми вопросами и дать им читать, а потом что непонятно проговорить лично?». Я не доверительно отнесся к его словам, ведь разве люди способны сами понять такую “сложную” тему как протокол sip или работу с wireshark? Я был просто уверен что однозначно — нет. Но парень вызвался написать данный мануал сам и проконтролировать результаты с обучаемым, я согласился.

Правило Паретто.

Через 3 дня он мне прислал первый мануал по wireshark, с картинками и описаниями всех основных команд которыми мы пользовались и как в нем анализировать sip, rtp трафик и т.д. Я  рискнул, дал одному из новых сотрудников изучить работы с wireshark по данному мануалу. Затем они созвонились с обучаемым, и с час что-то обсуждали. После этого я стал проверять знания новичка. И вы знаете, мне понравилось.  Новичок действительно с помощью данного мануала  усвоил и применял на практике все основные, типовые моменты где-то 80%. Остальные 20% он узнавал от меня, либо при работе с коллегами или в интернете. То есть я на практике видел работу закона Паретто, 20% усилий ( проговорить основные моменты в работе) дают 80% результата. Убедившись в эффективности прокачки людей по гайдам, я перестал их обучать по  wireshark вообще, стал давать читать только данный мануал. 

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

После нескольких успешных обучений wireshark только по гайду, я стал размышлять на тему как так вышло, что я учил сотрудников 2 года лично, тратил на них свое время, силы, повышал на них голос, иногда грубил. Мне казалось что они сами не были способны изучить те темы, которым я их учил и единственный носитель истинности и правды это был - я  сам, именно вследствии этого  у меня было явное недоверие к тому, чтобы они обучались сами. Но как показала практика, они без меня , сами, прекрасно и спокойно обучились основным моментам, на которые уходило 80% времени. Как так? И тут мне пришла гениальная мысль «А если человек умеет читать, то возможно он способен понять что написано?», тем более мы целенаправленно брали на работу только людей с высшим образованием. А что еще студенты делают, как не читают книги и изучают их, а тем более делают это на результат, чтобы получить оценку? И тут меня осенило: оказывается, люди с высшим образованием способны прочитать материал и понять его.

Масштабирование.

Как только я это осознал,  я сразу понял, что подобные гайды просто необходимо масштабировать по другим  темам, которым я учил. Я написал порядка еще 7 гайдов, и сложил их в одну папку с говорящим названием «Система обучения». В итоге у меня так впервые за 2 года моей «управленческой карьеры» появилась папка, в которой были собраны основные моменты в работе, там было порядка 20 гайдов и практических заданий.

Делегирование

Мне понравился  тот момент , что новичок прокачался без моего участия, а также то, что его знания проверял не я. Я предположил , что данному опытному сотруднику было несложно обучить новичка, т.к новичок перед этим прочитал его гайд. Спустя месяц — два я решил опробовать данный эксперимент с другим опытным инженером. Объяснил ему ситуацию , показал гайд, и поставил задачу обучить очередного новичка wireshark. Особого негатива я у него не увидел, наверное потому-что задача была поставлена в четких рамках, уже был составлен мануал, и нужно было проверить , что человек его прочитал.  Результат был такой же, как и в первый раз. И тут меня осенило: оказывается, не обязательно учить людей самому, а можно это делегировать. А для того чтобы у «учителя» не было «молчаливого отрицания», всего-то  нужно ему предоставить  уже готовый материал и замотивировать. Мне это так понравилось, что я поставил это дело на поток. Теперь за обучение в моей группе отвечал самый опытный инженер, и я практически перестал заниматься этим лично.

Передача опыта.

Время шло, количество сервисов компании увеличивалось, как следствие увеличивалось и  количество гайдов. В папке стало лежать порядка  20 гайдов. Новым сотрудникам сложно было понять в какой последовательности что читать. Я стал группировать имеющийся материал по темам, также я смотрел сколько времени в среднем уходит на обучение той или иной темы и стал указывать это время в данном файле. Через некоторое время к нам в компанию пришел «бизнес тренер», который поделился со мной программой для обучения. В ней можно было составлять тесты и назначать их сотрудникам. Я стал пользоваться этим инструментом. В итоге у меня была теоретическая часть, практическая часть, проверка знаний с помощью тестов. В сумме на все первичное обучение требовалось порядка 10 рабочих дней. Оцифровка опыта облегчила мне  его передачу между инженерами.  С приходом нового инженера я давал ему гайды и через некоторое время он плюс - минус начинал обладать теми же знаниями, что и более опытные сотрудники. Также это делает возможным передачу в случае ухода из компании  сотрудника, который был источником знаний. Я просил самых опытных ребят проводить редакцию гайдов. Они делали дополнения, и в итоге весь их основной опыт оставался в компании, что развязывало мне руки при подборе персонала и ротации. Например когда уходил самый сильные инженер, то я давал задачу изучить материал способному инженеру на позицию ниже, и через месяц я получал +/- такого же специалиста. То есть ушедший инженер прокачивал своих последователей даже не зная об этом)

Что в итоге

В итоге, через 4 года  у меня была составлена система обучения инженера по первые 6 месяцев работы. Там были материалы на 2 недели, 1 месяц, 3 месяца, 6 месяцев. Чем больше инженер работал , тем более сложным становился материал. Все было описано в одном файле, с четкой градацией по темам и дня работы инженера. При выходе инженера ему автоматически назначались тесты. Отчеты по тестам приходили мне. Обучением занимались самые опытные инженеры, у них для этого был пункт в их системе мотивации.  Моего времени на прокачку стало уходить существенно меньше, посчитайте сами, у меня было где-то  9 инженеров со средним сроком работы 22 месяца. 22 / 9 = 2,4. То есть каждые 2.4 месяца мне раньше приходилось с нуля обучать людей, на протяжении нескольких дней — недель.

В итоге система обучения дала:

1) Освободило меня от обучения: я стал тратить больше времени на выстраивание других процессов и работу с персоналом. 

2) Предоставило бизнесу четкие сроки и критерии качества обучения новых сотрудников

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

4) Делала обучения всех инженеров единым, т.к у них был один источник знаний.

Переход в разработку.

Время шло, я стал заниматься разработкой софта для техподдержки и клиентов компании. Для своих разработчиков я никаких гайдов не составлял т.к ни я, ни они не понимали как правильно работать в том или ином фреймворке. Где-то через 3 года я прокачался как fullstack angular + node.js , и меня пригласили лидом на angular. Моя основная задача была - поднять качество разработки у разработчиков и сформировать архитектуру проекта. На проекте было 2 разработчика , еще 1-ого нужно было нанять. Когда я посмотрел на проект, то увидел кучу проблем, такие как:

1) Названия у сущностей не отображало их назначение

2) Отсутствие типизации, 60% кода было с any ). Т.к DTO бекенда генерировались через сваггер, это конечно было круто, но благодаря великому и могучему any эти DTOшки моментально расправлялись ни во что. 

3) некорректная работа с rxjs (  отсутствие отписок, вложенные подписки, подписки в changes,  так где должен был быть 1 эмит было тысячи и наоборот)

4) нарушение правил работы с фреймворком.

5) отсутствие архитектуры, несмотря на то, что ангуляр , как и любой другой фреймворк, отчасти диктует правила «игры», но все равно остается куча мест, в которых можно поступить по-разному. И эти два разработчика так и делали - каждый раз поступали по разному.

6) при работе  с массивами вместо .map .find .foreach  и т. везде был for (...)

7) Повторение за «другими». Проекту было уже 4 года и в нем работали все подряд,  в результате эти программисты просто копировали старые решения, хотя они были в корне не верные.

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

SMART

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

  1. S однозначное понимание: все ребята должны были также как и я 1х1 понимать как выглядит “качественный код” в моем понимании

  2. M измеряемая: ребята должны понимать, как именно я замеряю качество их кода, критерии оценки должны быть простыми для понимания и не иметь двояких трактовок

  3. A достижимая: ребята должны были понимать, за счет какого ресурса они смогут сделать качественный код

  4. R реальная: качественный код должен быть ими реально сделан

  5. T конкретные сроки: написание качественного кода должно занимать одинаковое время у всех программистов и должно быть согласовано всеми.

Цикл Шухарта–Деминга или PDCA

Было понятно, что нужен единый источник знаний. Я стал искать в интернете гайд «как лучше писать проект на angular» , «angular best practices», но нигде ничего не находил. Были разрозненные статьи на тему того, как поступать в той или иной ситуации, но так, чтобы был единый гайд, в котором был бы «оцифрован» весь лучший опыт, а именно  - расписан алгоритм построения монолита с указанием неймингов, структурирования папок, работой с rxjs, работой с фреймворком просто не было. Поэтому я стал формировать этот гайд сам.  Когда я начинал создавать гайд, у меня не было чувства страха и, как результат я не испытывал чувство прокрастинации , т.к еще при создании системы обучения саппорта я на своей шкуре работу цикла PDCA (планируй, делай, контролируй, корректируй) и понимал как эта штука работает. Суть цикла простая - любую процессную деятельность нужно периодически  контролировать и корректировать. В результате этого, а именно после корректировки, деятельность начнет расти. И что самое главное, так это то, что заранее не нужно знать как правильно или не правильно поступать, достаточно начать. Важно как можно проще подойти к  PLAN, DO и сделать их. PLAN у меня уже был, кидать в txt файлик кривой код. Осталось только начать, перейти к DO. Не нужно боятся сделать не правильно, главное сделать. Например поставить людям задачу, а когда они сделают "Г", посмотришь на нее в живую и мысли как ее улучшить прийдут сами собой, а если не прийдут, то обязательно какой-нибудь умник подскажет как ее улучшить (A), он есть в каждом коллективе, даже состоящим из 1 человека)

Как я сделал свой первый Do

Первым делом я создал на рабочем столе txt файлик ))))) - «Новый документ» и стал в него вносить ошибки в коде, которые я явно видел. 

1) В нем я стал помечать ошибки в коде. Каждый раз когда я проводил code review одного из программистов, я помечал в коде участок кривого кода фразой.  «// TODO CR Описание ошибки.“. Стоит отметить, что у нас были «ошибки» двух типов: обязательные и вкусовщина. По обязательным решение принимал я, за мной было последнее слово. Мы вместе обсуждали проблемные зоны, но конечное решение было за мной. Когда я не знал, как поступать в той или иной ситуации, я начинал исследовать проблему. Спрашивал у более опытных коллег в чатах, искал в интернете, воспроизводил проблемы в тестовом проекте. Когда я находил решение, я собирал ребят, показывал им решение и они обязывались его соблюдать в разработке , а я при code review. При вкусовщине мы принимали решение по большенству: как большинство решило , так мы и поступали.  

2) Затем я собрал ребят и объяснил им, как я буду проводить code review, например, как  помечаю ошибки в коде, а они обязаны до релиза их исправить. (это можно еще  делать в merge request , но было удобней так)

3) Я настроил фильтр TODO в своей IDE и показал ребятам как его настроить у них, чтобы он попадал в глаза. Стало выглядеть так.

Каждый раз когда я видел новую ошибку в коде , я ее полностью вставлял ее в текстовый документ, например: 

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

5) Иногда мы вырабатывали решение, но в процессе работы кто-то показывал что оно не работает, находил не рабочие кейсы или читал статью, что так нельзя делать, в итоге мы это решение переписывали и так больше не делали ( реализация CA из PDCA)

5) Я не всегда успевал скопировать пример “кривого» кода в файлик и тут мне на подмогу приходили коммиты, Каждый раз при указании тудухи я делал коммитит по одному и тому же шаблону «Номер таски Название таски Add TODO CR» и пушил коммит в бранч. В итоге в поиске  коммитов по слову «Add TODO CR» я всегда мог найти и просмотреть не учтенные мною коммиты, добавить их в файлик и потом обучить по ним ребят.  В принципе это все можно делать и в merge request  в вашей git системе, но мне было удобней так, т.к при review code в ide легче прослеживать всю логику решения.

6) Для того чтобы ребята не держали правила в голове и они были всегда под глазами, я перенес все данные из файлика с моего рабочего стола в “README.md” git репозитория и дал ссылку на него ребятам. В итоге у них появился единый источник знаний , на  который мы все обязаны были равняться.  Если какая-то наша договоренность становилась неактуальной, я всех собирал, и мы обсуждали новое правило, естественно, как следстви редактировали гайд. Таким образом , гайд всегда был в актуальном состоянии.

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

8) Настроили интеграционные тесты Cypress и встроили их в  CI

9) Правила мы составляли не только для кода, но и для тестов

10) Под часть правил мы стали настраивать линтеры и также их встроили в  CI

Результаты

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

В итоге гайд дал результаты, аналогичные тем, которым я получил в техподдержке, а именно:

  • я потратил минимум своего времени на обучение нового программиста

  • все мои программисты обладали одинаковыми знаниями и одинаково применяли его на практике

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

  • поднятие психологического климата в коллективе, т.к каждый знал, что сосед пишет такой же “качественный” код как и он сам.

  • облегчило работу с возражениями при постановке задачи на доработку, багфикс чужого кода.

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

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

Резюмируя

Прочитав вышеизложенное, я надеюсь, вы увидели, что просто позвать программиста и попросить его или наорать кодить нормально у вас не получится. Для этого вы должны объяснить ему все нюансы кодинга, причем именно так, как вы это понимаете сами, иными словами вам нужно поставить задачу по SMART, а не HATEy, STEBU или ORAT. Для того чтобы поставить задачу по SMART очевидно вам нужно оцифровать ваш опыт или передать опыт других людей, здорово если такой есть. Если у вас его под рукой нет, то вам придется его составлять самому. Как это сделать? По PDCA. Для этого вам нужно начать его оцифровывать, сразу написать гайд за 1 час у вас не получится, т.к вы не вспомните даже 10% тех кейсов с которыми сталкивается разраб. Что вам может в этом помочь? Конечно ваши merge request`ы , посмотрите на ту дичь которую люди пушили в бранч и перенести их в гайд, с комментарием “так мы больше не делаем, потому что…” Как часто это делать? Решать вам, периодически, это процессная деятельность. Любой процесс требует корректировки, написать один раз гайд, регламент и всегда почивать на лаврах у вас не получится. Дело в том, что бизнес процессы в компании, ваш личный опыт, опыт ваших коллег, обстановка на рынке, законодательстве, все это постоянно меняется. Поэтому подобного рода задачи нужно делать переодически, по PDCA. Иначе оно быстро устареет и превратится никому ненужную писанину. Лично я это делал 1 раз в  2-3 недели. В итоге у ваших кодеров будет всегда один, актуальный источник знаний, на который они будут равняться и корректировать свою работу синхронно. Все ли писать в гайде? Я считаю что нет, нужно придерживаться правила Паретто. Стараться описать те 20% кейсов которые перекроют 80% случаев с которыми столкнется разраб. Как вариант, для начала, вы можете описывать абсолютно все случаи, и раз в квартал или пол года, удалять лишнее.

Кому нужны гайды

Я считаю, что подобного рода гайды нужны, если у вас в подчинении 3 и более сотрудников и для вас важна долгосрочная поддержка проекта. В этом случае вы уменьшаете себе время на обучение сотрудников, так если у вас 3 сотрудника со средним временем жизни 24 месяца, то вы будете обучать нового каждые  8 месяцев  + время на его поиск. Я думаю, что на обучение и поиск вы будете минимум тратить 1 месяца. Итого каждый 9 месяц в году у вас в труху. А что если вы аутсорс, с более чем 20+ разработчиков на одном фреймворке, то у вас веселее, почти каждый месяц у вас новый разраб. Где же ваши гайды? Вынесите их в open source, где вы можете получить обратную связь для их улучшений. 

Также в гайде или базе знаний остается весь опыт вашего лида, что очень выгодно бизнесу. Т.к в случае ухода лида из компании весь его опыт остается внутри компании. Так же это развязывает руки при найме сотрудников, т.к когда у вас есть база знаний , вы можете брать сотрудника на уровень ниже на все позиции  Junior,Middle,Senior, Lead. Главное чтобы у кандидата было желание обучаться, остальному он научится сам по гайдам. Я считаю, что это особенно важно для аутсорс компаний, для которых критично нанимать слабых разработчиков, а выдавать за сильных. С гайдами их слабые разрабы через 3-4 месяца работы сильно вырастут.

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

Примеры гайдов

А где ваш гайд?

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


  1. LeshaRB
    23.02.2022 23:44
    +1

    Это я так понял Style Guide

    У нас в Idea за основу были импортированы Google Style, и немного измененные под наши нужды

    https://github.com/google/styleguide


  1. BugM
    23.02.2022 23:55
    +29

    Простенький стайлгайд это совсем не архитектура.

    Архитектура это что-то вроде правил:

    Сделали прием файлов от пользователей? Сливайте их в максимально надежную и максимально безразмерную трубу. s3 оптимальный вариант. Не забудьте подумать про максимальные размеры файлов и нагрузку. ООМы это реальность, потоковая обработка немного сложнее зато надежнее.

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

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

    Клиенты любят писать скрипты к вашему АПИ. Иногда они пишут плохие скрипты. Выдать 1000 рпс с одного компа можно вообще без проблем. Подумайте и защититесь заранее.

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

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


    1. barloc
      24.02.2022 00:32
      +4

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


    1. XaBoK
      24.02.2022 02:25
      +3

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


      1. victor_1212
        24.02.2022 03:07

        именно, тоже "стэк" весьма людям нравится прямо по Фрейду, надеюсь дожить услышать чего-нибудь типа "стэк архитектур" :)

        ps

        как там у Зощенко:

        "... посмотреть с точки зрения, вступить, так сказать, на точку зрения и оттеда, с точки зрения ..."


    1. Upravlenets Автор
      24.02.2022 09:40

      А кто ещё кроме вас это знает?


      1. BugM
        24.02.2022 22:14
        +1

        Сеньоры и лиды точно знают. На то они и сеньоры с лидами.

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


    1. amakhrov
      25.02.2022 00:59
      +1

      Ну, у фронтенд-приложения тоже может быть архитектура, разве нет?

      Речь, конечно, не о стиле написания кода и модификаторах доступа. А о том, как мы управляем общим состоянием, как осуществляется работа с api, как выполняется логирование и мониторинг. Как переиспользовать код между несколькими проектами, в конце концов.

      Организацию кода по файлам и директориям, в принципе, тоже сюда можно отнести.


      1. BugM
        25.02.2022 01:24

        Конечно. Может и должна.

        Я написал примеры из бекенда потому что я с ним работаю и его знаю.

        Если можете про фронт написать - пишите. Дело хорошее. Есть витающие слухи что у фронтов с архитектурой все плохо и эта статья типичный пример. Вместо архитектуры стайлгайд.


  1. mvv-rus
    24.02.2022 04:50

    Здравствуйте!
    Спасибо за статью — очень информативно. Однако по прочтении вашей статьи меня осталась пара вопросов, ответы на которые я не нашел в статье. Не могли бы вы ответить на них дополнительно?
    1.

    Для меня как менеджера, безусловно, эти профиты были на порядок выше, чем затраты на создание и поддержку гайда.
    Я понял про ваши выгоды. Но есть ли от такого режима работы какая-то выгода для разработчиков? Вы же, как хороший менеджер, вряд ли им позволите «большую часть времени заниматься именно тем, чем и должен заниматься каждый хороший менеджер, а именно своими делами, например просмотром хабра или ютуба» (то, в чем, по вашим словам, состояла часть вашей выгоды)?
    2.
    вы можете брать сотрудника на уровень ниже на все позиции Junior,Middle,Senior, Lead. Главное чтобы у кандидата было желание обучаться, остальному он научится сам по гайдам. Я считаю, что это особенно важно для аутсорс компаний, для которых критично нанимать слабых разработчиков, а выдавать за сильных. С гайдами их слабые разрабы через 3-4 месяца работы сильно вырастут.
    Я правильно вас понял, что таким образом вы фактически снижаете зарплаты своих разработчиков? Причем — не на 3-4 месяца, которые им понадобятся, чтобы вырасти, а на больший срок: потому как они вырастут только в проекции на нужды вашей фирмы, и ценность их на рынке труда, где нужды бывают сильно разные, от этого не повысится?


    1. Fen1kz
      24.02.2022 07:05
      +1

      Отвечу с позиции разработчика, к автору отношения не имею:


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


      — Ты делаешь неправильно, надо вот так.
      — Ну работает же.
      — Да, но это не поддерживаемо и не расширяемо.
      — Ну ведь работает.


      Пример для реакта — мы используем material-ui


      Стили там можно делать так:
      1) <div style={{flex: 1}} />
      2) <Box flex=1 />
      3) useStyles(theme => ({box: {flex: 1}})) + <div className={classes.box}/>
      4) styled('div')({flex: 1})


      Так вот он мешает все 3 подхода в абсолютно рандомном порядке и без оглядки. Есть конструкции вида <Box flex=1 className={classes.box} style={{...}}/>


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


      Или вот мы давным давно договорились, что хендлеры в параметрах мы называем onX. onAddButton, onEditButton. Недавно смотрю — конечно он сделал />


      В общем, стиль, нейминг, архитектура — беру всё.


      1. S-e-n
        24.02.2022 08:05
        +1

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


      1. Upravlenets Автор
        24.02.2022 09:39

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


      1. mvv-rus
        24.02.2022 21:20

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

        Вот именно выгоды — той самой, что измеряется в деньгах — я и не увидел: разрботчику ведь деньги платят за потраченное на работу время, не так ли? А если так, то какая ему разница, пишет ли лично он код быстро или, из-за плохого смежника, медленно.
        Так чего же ради волосы-то рвать?
        PS Не, про эстетическое чувство я в курсе, но в деньгах оно не измряется. А мой вопрос был чисто про деньги.


        1. Upravlenets Автор
          24.02.2022 22:36

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


          1. mvv-rus
            24.02.2022 23:48

            выгоды для лида,

            В выгодах для менеджера я и не сомневался. Я интересовался чисто про выгоды рядового наемного разработчика. Я их не вижу. Может, вы мне их способны показать?
            Каждый разраб нужен чтобы развивать бизнес.

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

            PS Вспомнил цитату на обсуждаемую тему.
            «Карась любит, чтобы его жарили в сметане». Это знают все — кроме карасей. Их даже и не спрашивали — не только насчет сметаны, но и любят ли они поджариваться вообще. Такова сила мнения.
            К. Прутков-инженер. Мысль № 12.


    1. Upravlenets Автор
      24.02.2022 22:34

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

      2) денег никто не понижает. просто вы сможете быстрей джуна вырости до мидла.


      1. mvv-rus
        25.02.2022 00:09

        1) выгода для разрабов в том, что у них есть готовое решение как поступать в большинстве кейсов им не нужно ломать голову что и как делать, также при ревью им придется меньше переделывать.
        Выгоды для разработчиков не вижу (я об этом уже писал в другом ответе, чуть выше): разработчикам платят не сдельно, а повременно, поэтому им объективно без разницы, сколько кейсов они решили, и их интересам совсем не противоречит в оплачиваемое время поломать голову, вместо того, чтобы ломать свои руки об клавиатуру и наживать себе туннельно-запястный синдром.
        Вы согласны?
        2) денег никто не понижает. просто вы сможете быстрей джуна вырости до мидла.
        Использование джуна вместо мидла на одной и той же позиции очевидно позволяет изначально снизить для этой позиции зарплату. Это, в общем-то, справедливо — но есть нюанс, именно про который я и спрашивал: когда джун вырастет до мидла, то будет ли ему увеличена компенсация до уровня того же самого мидла? Учитывая, что вырастает джун скорее всего только в том направлении, которое требуется фирме и никуда более (потому что гайды), я сомневаюсь, что такой специально выращенный «одомашенный» мидл будет столь же конкурентоспособен на рынке труда, как и выросший в естественной среде. А потому я сомневаюсь, что бизнес (в лице менеджера) согласится платить ему «по рынку» для его «грейда»: никаких объективных причин я для этого не вижу.
        Вы можете развеять мои сомнения?


  1. Keroro
    24.02.2022 08:41

    А эти гайды в итоге лежат в виде вордовских файлов в папке, да? Какую-то систему типа вики или bookstack не делали?


    1. Upravlenets Автор
      24.02.2022 09:43

      В саппорте были файлики и прога webtutor. Для кодеров у меня сейчас только репозиторий с ридми и примерами


  1. amakhrov
    25.02.2022 01:10

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

    • Хотите OnPush? Используйте prefer-on-push-component-change-detection .

    • Модификаторы доступа? explicit-member-accessibility .

    • Боритесь с null? Включите все strict настройки для компилятора (TS и Angular)

    • Что-то специфическое для проекта? Напишите тест или свое правило для eslint. Для случаев попроще можно обойтись правилом no-restricted-syntax (там очень гибкий синтаксис селекторов, можно много наворотить).

    И приправить официальным styleguide от Angular, в котором уже многие рекомендации расписаны (обычно, в более легкочитаемом виде, чем свой README файлик)


    1. Upravlenets Автор
      25.02.2022 10:44

      Супер, кто еще кроме вас знает что так можно?


      1. amakhrov
        25.02.2022 10:56

        В этом и прелесть автоматизации. Главное, чтобы про это знали pre-commit хуки и CI pipeline.

        А знакомиться с документацией Ангуляра и RxJS посылаем всех новоприбывших - потому что а как еще? Ридми этому не замена.

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

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


        1. Upravlenets Автор
          25.02.2022 10:59

          Описание и автоматизация дополняют друг друга, а не противоречат. У вас люди знают какие именно проверки вы в строили в си? Или пишут вам с вопросом почему папйп не прошёл? Обязательно нужно расписать кратко какие проверки в си, чтобы люди знали это до пуша.


          1. amakhrov
            25.02.2022 11:04

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

            Полностью согласен, что описание и автоматизация дополняют друг друга.


            1. Upravlenets Автор
              25.02.2022 11:06

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


            1. Upravlenets Автор
              25.02.2022 11:51

              Вот в этой ошибке линта кодеру что нужно сделать?

              29:9 error Expected blank line before this statement padding-line-between-statements


              1. amakhrov
                25.02.2022 12:16

                В идеале - ничего. Форматирование должно автоматически применяться - это последнее, что должно заботить разработчика.


                1. Upravlenets Автор
                  25.02.2022 12:32

                  .


              1. amakhrov
                25.02.2022 12:19

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


                1. Upravlenets Автор
                  25.02.2022 12:53

                  ага верно, вы прошли линт)