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

Дейли

13 февраля, 10:58 — Начало рабочего дня

Проснулся после бурных выходных за две минуты до начала дейли и судорожно пытался вспомнить, какими задачами я сейчас занят и в каком они состоянии. Хорошо, что команда работает по Kanban: так я могу в любой момент зайти на нашу доску и выяснить, что же я все-таки успел сделать в пятницу. Этим, пожалуй, и стоит заняться. Доска эпиков, доска историй… Вот, доска с сабтасками, отлично. Стоп, что это за задача занимает теперь почетное первое место на нашей доске? И откуда на задачах бэка взялись флаги?

13 февраля, 11:00 — Дейли

Как обычно, собрались в Зуме на дейли. Большая часть сотрудников компании работает на удаленке, многие распределены по разным городам, так что по-другому поддерживать постоянную связь сложно. Приятным бонусом к созвонам идут домашние животные коллег: у одного парня кот сидит на плече на каждом дейлике — видимо, следит за выполнением задач. Кстати, о задачах… 

У меня большая продуктовая команда из 13 человек: 8 разработчиков, 2 QA-инженера и 3 менеджера. Рассказ каждого о себе и своих делах неэффективен, поэтому на дейликах мы говорим о задачах в порядке приоритета. Такая методика давно доказала свою эффективность: наши дейли длятся не больше 15 минут, за которые все участники встречи успевают осознать общий прогресс работ. 

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

Постепенно спустились по доске ниже. Оказалось, моя сабтаска прошла ревью и мне осталось передать ее на тестирование QA, которая подхватила ее заодно и рассказ по задачкам. И хотя по правилам Kanban нужно говорить о задачах справа налево, иногда мы забываемся и делаем наоборот.

Когда добрались до задачи стажера, поняли, откуда взялись сабтаски с флагами. Они оказались заблокированы из-за внезапного обновления API другой команды, которое сломало запросы нашего приложения к их сервису. Стажеру достаточно было подсветить это на дейли — и вот уже тимлид идет вместе с ним к другой команде,чтобы решить проблему с блокировкой.

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

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

Процесс работы — TBD, ревью

13 февраля, 11:45 — Кофе-брейк

Я считаю, что уже достаточно долго работал в поте лица над новой задачей — пора организовать себе третью за утро чашку кофе и небольшой перерывчик.

13 февраля, 12:00 — За дело

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

14 февраля, 13:28 — Корректирую оценку задачи

Вроде изян.

15 февраля, 14:32 — Работа, работа, еще раз работа

Как же я люблю TBD и все, что с ним связано… 

При трудоустройстве мне рассказали, что большинство команд работают в соответствии с этим самым Trunk Based Development — маленькие MR, частые релизы, быстрое тестирование. Все звучало просто как сказка. 

Мы и правда релизим в несколько раз чаще, чем те немногие команды, в которых еще не внедрена практика TBD, а тестирование задач занимает не больше дня. Но не бывает же все просто идеальным…

Вот и я, закопавшись в одной из практик TBD — Branch by abstraction, не смог придерживаться второй — маленького объема кода, отправленного на ревью. Казалось бы, этот самый Branch by abstraction несет здравую мысль: вводить изменения несколькими маленькими шагами вместо одного большого. 

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

Вот тот самый план по шагам:

  1. Ввести абстракцию. Тут все верно: я давно создал и слил новый интерфейс в основную ветку, ведь изменение-то небольшое и абсолютно безопасное.

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

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

  4. Итеративно делать новую реализацию… Так… Читаю: «Работать над новой реализацией нужно мелкими шагами: по возможности отдельно делать бизнес-логику, рефакторить, писать тесты. Главное, чтобы при этом ваш проект проходил тестирование и сборку на CI». 

А я забыл про то, что с итеративным подходом можно было и тесты писать отдельно, и рефакторить не все сразу. Забыл — и получил в результате огромный MR, где переписал львиную долю нашего кода по работе с аналитикой и сразу же тесты на все это накрутил! 

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

  1. Удалить старую реализацию и при необходимости абстракцию.

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

15 февраля, 16:04 — Ревью

Кажется, это было ошибкой.

15 февраля, 16:58 — Все еще ревью

Мое счастье, что такой большой MR вообще согласились посмотреть. Но количество комментариев… Мама, забери меня на ручки, погладь по голове и скажи, что я все сделал правильно.

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

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

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

А мой MR на 600 строк к таковым пока не относится, поэтому пойду дальше читать комментарии к нему и исправлять их… 

15 февраля, 17:04 — ████████████ комментарии

В смысле «это можно было уложить в две строки вместо 50»?! [ДАННЫЕ УДАЛЕНЫ]

3 амиго

20 февраля, 14:00 — Три амиго по [фиче]

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

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

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

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

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

Дежурства

22 февраля, 15:17 — Алерт! Алерт! Алерт!

Сидел, писал код, никого не трогал... Вдруг — бум! Прод немного взорвался, и посыпались алерты к нам в канал. 

Знаю-знаю, «фронтендер на дежурстве» — звучит как начало какого-то анекдота. Но я и в самом деле должен буду разобраться с этими алертами. 

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

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

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

Что сейчас и требуется доказать.

22 февраля, 15:50 — ЧТД

Просмотрел инциденты, удостоверился по графикам, что они действительно случились, и полез в логи нашего бэкенда. Исследовал несколько запросов, по самым длинным начал искать причину проблем на проде. Из логов нашел URL, ответы с которого были самыми долгими, сопоставил его с сервисами других команд и выяснил виновную систему. Сходил к ребятам в [другую команду] и надавал им по шее эскалировал проблему. 

Словом, чуть больше 20 минут моего времени — и проблема решена. Делов-то.

Планирование

24 февраля, 13:00 — Планирование

Очередной цикл двухнедельной разработки подходит к концу, а значит, настало время планировать дальнейшую работу. 

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

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

Что более важно, с переходом карточки в колонку «Запланировано» начинает тикать таймер LeadTime — того, сколько времени занимает разработка задачи от старта и до окончательной доставки на прод пользователям. Потом мы собираем статистику по этому значению, а по нему и ряду других метрик анализируем все наши рабочие процессы, пытаясь найти в них узкие места или какие-то проблемы. 

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

Ретроспектива

27 февраля, 16:00 — Нытинг

Древние пророчества из архивных каналов Слака гласили: «Придет век Зума и Конфлюенса, век Задач в Джире. Придет Час Вечернего Созвона и Доски на Miro, Час Безумия и Час Презрения, Час Конца. [Команда] умрет, погруженная в задачи, и возродится вместе с новым разработчиком». 

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

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

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

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

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

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

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

Вместо заключения

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

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

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

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


  1. Thomas_Hanniball
    29.06.2023 08:46

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


    1. nsbarsukov
      29.06.2023 08:46

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

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