Ретроспектива Рейка. Как Самописное Решение Оказалось Лучше Платного

Привет! Меня зовут Алексей Пьянков, я главный программист «Спортмастера».

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

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

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

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

Скорее, это рефлексия о проделанной работе.

Были такие особенные моменты, которые повлияли на нас как на команду – они нас объединили, укрепили и проверили на прочность.

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



Ретроспектива Рейка.
</p><p>
 Как самописное решение оказалось лучше платного

И я начну с 2012 года.

В 2012 год я пришел с главной на тот момент целью — работой над нашим флагманским сайтом.

На тот момент это был «монстр Франкенштейна»: часть команды работала с нашей старой системой, которая не очень хорошо справлялась с нагрузками (Битрикс), а другая часть команды (в том числе и я) пыталась внедрить новую систему.

, который был выбран по критерию «Раз это самая дорогая электронная коммерция в мире, давайте возьмем ее».

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

Мы много работали, но двигались черепашьими темпами.

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

Это неплохо, для этого и созданы кастом-теги.

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

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

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

Но просто так, в самой дорогой системе! Это было в пятницу.

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

Сказано - сделано.

Мы сделали пилот, в котором заложили основу для разработки нового сайта «Спортмастер».

Многие из этих идей прижились и сейчас на сайте активно циркулирует их продолжение.



?Этапы и сроки пилотного проекта

2 дня.

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

Вуаля! В той же купленной системе эта настройка «съела» 2 недели.

И вот – буквально за пару часов! И это также работает быстрее.

И это на порядок быстрее.

2 недели.

Мы вырезаем прототип и добавляем функционал для адекватных персонализированных результатов.

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

С акциями не все так просто.

Например, купил лыжи, сейчас действует скидка 40% на кепку, но при этом отменяется приветственная скидка 10% на весь заказ.

Да-да, это реальный случай :) И чтобы настроить такую акцию в системе закупок, были оплачены 3 консультации с поставщиком, в результате чего мы получили множество примеров того, как делать разные другие акции.

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

Мы показали бизнесу подробную демонстрацию.

Пообещали быстро собрать пилот и сразу взялись за дело.

2 месяца.

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

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

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

А это значит, ребята, держите команду, ребята, держите бюджет. Прохладный! 2 года.

Запуск сайта в производство.

Да, надолго.

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

Два человека легко образуют слаженную команду.

А задачи, которые мы «щелкали», были по большому счету небольшими дополнениями к «Hello World» в новых технологиях.

Мы легко генерировали новые гипотезы, быстро их проверяли, не успевали привязываться и поэтому без сожаления «убивали» их.

Когда нас было 10 человек, мы по инерции экстраполировали свою скорость работы на всех остальных.

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

Обычная ситуация? :) Тогда вы уже знаете, что будет дальше?

Ловушка №1. "Ээкстраполятор-крутой"

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

Итак, вот оно.

Берем библиотеку и пишем кучу кода приложения.

Мы считаем юнит-тесты обузой (мы тут крутые и работаем на сверхзвуковых уровнях, код современный и так далее).

Мы постоянно на ходу меняем и улучшаем API — какие там тесты, серьёзно.

И всё это под лозунгом «сильно оптимизировали процесс разработки» (да, сейчас даже страшно это описывать).

И тут все совершенно очевидно.

Мы выпускаем новую сборку на uat. Ребята из бизнеса с радостью собираются все это дело тестировать и нажимать кнопочки.

Иногда довольно креативно нажимают - что-то отваливается.

Я хотел бы пойти сюда и узнать, что они для этого сделали.

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

Для него это просто «не работает».

А это значит, что он несчастен.

Спроси его и он расскажет страшный недоволен!

Ретроспектива Рейка.
</p><p>
 Как самописное решение оказалось лучше платного

Тогда, чтобы воспроизвести ошибку, вам придется пойти и перебрать все.

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

Они отказались от запланированных задач, но «потушили пожар».

Итак, мы вырыли себе следующую яму.



Ловушка №2. «Стахановец»

Вы получили не очень приятный баг.

Вы начинаете понимать.

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

Несколько кружек кофе, и все повторяется.

12-14 часов работы подряд – это почти норма.

И вот, когда уже все на пределе – бац, вдохновение!

Ретроспектива Рейка.
</p><p>
 Как самописное решение оказалось лучше платного

Возможно, со стороны оценка эффективности такого дня видна хорошо и правильно.

Но изнутри все может быть по-другому.

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

Не всегда сознательно, но бессознательно – всегда! И ты на это подсаживаешься, без шуток.

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

Это, пожалуй, самая страшная ловушка.

Тогда будет легче и веселее :)

Ловушка №3. «Сила Привет, мир»

Наш стек технологий того периода: ElasticSearch, Hazelcast, Pentaho, freemarker (и проверенные Java, Spring, Tomcat, nginx).

Freemarker не предоставил очень информативных сообщений об ошибках.

А вот ElasticSearch, Hazelcast, Pentaho приходилось патчить несколько раз — мы блестяще находили случаи, когда они работали не так, как указано в документации.

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

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

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

Конечно, в проверенных продуктах можно найти «кривое», но в новых гораздо проще.



Ретроспектива Рейка.
</p><p>
 Как самописное решение оказалось лучше платного

Несмотря на все трудности, мы приступили к производству.

Да, с лагами.

Да, не очень стабильно.

Но в целом никаких катастроф.

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

  1. "Ээкстраполятор-крутой" .

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

  2. «Стахановец» .

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

    Дела, которые нельзя делать.

  3. «Сила Привет, мир» .

    Мы спешим внедрить в производство все самое новое и интересное.



Почему все получилось?

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

Такая запись ошибок помогает избежать их в будущем.

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

Условие № 0 .

Здоровый климат в компании.

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

Условие №1 .

Верьте в то, что вы делаете.

Серьезно, я не думаю, что у нас были бы какие-то шансы, если бы мы взяли на себя пилота, не разобрав купленную систему «до болтика» — то есть отступив и подсознательно зная, что эта система круче и нас побьет. Что мы сделали: 1) разобрались с системой закупок, с ее помощью решили основные запросы бизнеса 2) составили список задач, которые не только существуют сейчас, но и будут существовать в обозримом будущем 3) выбрали решение, которое подходит лучше.

И тогда наша оценка решения была оценкой экспертов.

Дали бы нам что-нибудь, если бы мы просто пришли и сказали: «Ребята, все херня, мы не хотим этим заниматься и решили сделать свое с нуля»? Едва ли.

Причем ответ будет получен в таком виде, чтобы его хорошо запомнить :) Условие №2 .

Первый шаг делаем с малого.

Давайте сгенерируем первую гипотезу и проверим ее.

Вы также можете потратить на это свое личное время.

Если вы не хотите тратить свое время, то вообще не стоит браться за такое дело.

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

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

Кстати, в истории с созданием админки повороты сюжета были на уровне бразильских сериалов, ведь в команде были ребята, уже ставшие к тому времени ветеранами, настоящими «тёртыми булочками».

Условие №3 .

Мы делаем MVP и ищем боли в лице, принимающем решения.

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

Но все равно.

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

Условие № 4 .

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

Но их не существует. Так что просто сделайте один из палочек.

Условие №5 .

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

А если вы классический стартапер, то это тот самый момент, когда вам нужно со свистом уйти.

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

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

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

Это вызовы, и рост навыков происходит именно на этом этапе.

Спасибо за прочтение.

С Новым Кодексом! Теги: #программирование #Управление проектами #разработка электронной коммерции #психология программирования

Вместе с данным постом часто просматривают: