{"id":14277,"url":"\/distributions\/14277\/click?bit=1&hash=17ce698c744183890278e5e72fb5473eaa8dd0a28fac1d357bd91d8537b18c22","title":"\u041e\u0446\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u0442\u0440\u044b \u0431\u0435\u043d\u0437\u0438\u043d\u0430 \u0438\u043b\u0438 \u0437\u043e\u043b\u043e\u0442\u044b\u0435 \u0443\u043a\u0440\u0430\u0448\u0435\u043d\u0438\u044f","buttonText":"\u041a\u0430\u043a?","imageUuid":"771ad34a-9f50-5b0b-bc84-204d36a20025"}

Как запускать проекты без жиры и прочей скукотени: вот наши главные принципы

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

список поддерживаемых игр и турниры

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

безудержная радость команды перед запуском

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

Люди-винтики vs люди-механизмы

Менеджеры большинства ИТ-команд до сих пор строят их по принципам времён промышленной революции. Программисты ходят в офис или сидят в слеке с 9 до 18, ходят на дейли, работают по чётко прописанным ТЗ в Жире. Обычно они несут ответственность за время, которое -простояли за станком- просидели в IDE, а не за конечный результат.

труд на заводе в годы промышленной революции

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

Мы с Саматом отбираем в свои команды ребят, которым некомфортно в привычном контексте, которые хотят больше ответственности за результат. Такие программисты не любят оценивать задачи (читайте об этом подробнее здесь), часто пристают к бизнесу с неудобными вопросами и не требуют сложного обвеса в виде технический заданий, системных аналитиков, QA- и HR-менеджеров. Они не хотят быть винтиками — они хотят быть целым механизмом. На собеседованиях такие программисты обычно спрашивают об устройстве бизнеса и свободе в настройке CI, а не о печеньках и ДМС.

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

Оставайтесь маленькими

Команды больше 7 человек — это сложные системы, которые расходуют ресурсы не только на написание кода, но и на свое содержание. Чтобы не держать всё в голове, лидер нанимает тим-лидов, для экономии времени на найме и конфликтах — нанимает HR-менеджеров, а чтобы быть уверенным, что команда соблюдает правила игры — делает сложные флоу в Жире и заставляет менеджеров писать ТЗ.

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

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

Ну а ещё небольшие команды здорово обеспечивают недостаток ресурсов.

Недостаток ресурсов

Начать фичу очень легко — можно просто написать команде письмо «теперь делаем Х». А вот сделать фичу, а тем более поддерживать её — тяжкий труд. Люди любят начинать и не любят доводить дела до конца. Даже в MVP. Вот и получаются к дедлайну продукты с хорошо продуманной регистрацией, валидацией форм, UI-китом, но с интерфейсными тупиками и без конкурентных преимуществ.

Самое хорошее средство от бесконечных начинаний — это недостаток ресурсов. Недостаток ресурсов не обязательно должен быть измеримым (не будем же мы эстимейтить таски на этапе MVP), это скорее вопрос ментального настроя людей, принимающих решения. Когда мы подключаемся к планированию MVP, мы стараемся переключить команду из режима «хорошо бы сделать Х» в режим «а мы точно не запустимся без Х?» или ещё лучше: «А какая минимальная функциональность должна быть у Х, чтобы мы запустились?».

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

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

Недельные планы и демо

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

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

примеры недельных обещаний. Какой кайф, что всё отмечено как «готово»!

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

Вот пример такого демо от нашего дорого фронтендера Бори

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

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

У нас настроен CI/CD, так что всё, что сделал программист, сразу же могут посмотреть другие члены команды, на живую. Вот как это работает:

почти все изменения оформляются как пул-реквесты в гитхабе

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

весь CI/CD у нас сделан на прекрасном CircleCI

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

Правильно выбирать инструменты

В нашем детстве у каждой уважающей себя семьи был свой огородик за городом. На этом огородике сажали огурцы, копали картошку, обрабатывали грядки от сорняков и делали ещё кучу ручной работы. В 2020 году все поменялось — даже в «Пятёрочке» можно найти нормальные овощи, которые вырастили профессионалы с комбайнами, сеялками и практическим подходом. Несмотря на такое разделение труда, до сих пор сохраняются бабушки, которые ездят (и таскают внуков!) на эти свои огородики.

«первым делом я поднимаю gitlab и sentry»

В ИТ, даже в начинающих компаниях, огородики цветут пышным цветом: люди заводят собственные гитлабы вместо (бесплатного!) гитхаба, разворачивают собственные версии sentry, youtrack, поднимают свои кластеры kubernetes ради двух подов. То есть вместо того, чтобы пойти и купить готовые сервисы за условные 5$ в месяц — городят свои огороды, которые, если посчитать полную стоимость владения (TCO), оказываются в разы дороже.

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

Федя как-то консультировал одну команду, которой достался грант Microsoft Azure для стартапов. Выданного гранта хватало как раз на две виртуалки, на одной из них ребята сделали прод, а на другой разместили огородики — gitlab, sentry, какие-то рассылали почты вроде postfix. Для CI мощностей одной виртуалки не хватало, поэтому ребята разместили воркеры на обоих тачках — надо ли говорить, что когда ребята много билдили, у них тормозил прод, а когда шла большая нагрузка на прод — не могли билдить?

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

Чтобы составить свой — начните с free-for.dev: это хороший каталог ресурсов, которые дают бесплатные лицензии для маленьких проектов. Бесплатность лицензий — не самое важное в этом сервисе, гораздо интереснее смотреть на таксономию и разбираться, какие инструменты автоматизации в принципе существуют в мире. К примеру когда-то именно оттуда я узнал, как работают APM (application performance monitoring) и автоматическое тестирование на удалённых мобилках а-ля BrowserStack.

Если вам было лень все это читать, вот основные принципы:

  1. Программисты, способные закрывать бизнес-задачи и спорящие о пользе с бизнесом, а не просто прогающие, что укажут;
  2. Желание оставаться маленькой командой как можно дольше;
  3. Недостаток ресурсов как механизм принятия правильных продуктовых решений;
  4. Еженедельные обещания программистов и видео-демо, которые они записывают с презентацией своей работы;

Всё это — жестко холиварные темы. Результата можно добиться и с заводом на 100 человек, которые делают задачи по 10-мегабайтным. DOC-файлам из жиры. Жира тоже работает, но это гроб гроб кладбище как скучно, к тому же, это медленнее, а значит — дороже. Дополнительная проблема завода — привычные правила игры создают чувство безопасности: «я делаю всё по правилам, плохой результат — не моя вина».

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

Вы программист и хотите работать с нами? Пишите Фёдору Борщёву на [email protected].

Хотите заказать наши услуги? Пишите Самату Галимову, [email protected] и @samatg в телеграме.

0
52 комментария
Написать комментарий...
Dmitry Dmitriev

А как хранятся требования к продукту, если ТЗ суть зло и заводить задачи скучно? Вот начинаем мы делать фичу №73 через год, а она, вроде, косвенно начинает влиять на фичу №14 сделанную где-то на старте. Как это разрулить без чётко прописанного требования? Собрались обсуждать и сообразить как эти фичи должны работать вместе, но вот помнят все первую фичу по разному, ибо её потом ещё патчили пару раз и дорабатывали... как тут быть?

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

Ответить
Развернуть ветку
Samat Galimov

Короткий ответ: тестами! Если ты сломаешь предыдущую фичу - то узнаешь от этом в своём CI. Не все можно покрыть тестами, конечно. 

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

Поэтому, лучше тестов для этого, кажется, человечество ещё ничего не изобрело.  

Ответить
Развернуть ветку
Dmitry Dmitriev

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

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

В классическом подходе подразумевается, что у нас остается некая документация, которая как-то сводит вещи воедино. Что-то вроде описания "модель данных Х используется для .... форм для заполнения 4. Вот список кому где и как они доступны:..."

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

Грубо говоря, тратим время не на описание того, что только что сделали, а на обновление сведений в тот момент, когда они реально требуются?

Ответить
Развернуть ветку
49 комментариев
Раскрывать всегда