Как я делал торговую площадку. Часть 2

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

Технолог тоже дизайнер

Ни один план не выдерживает встречи с реальностью, с дизайном та же история.

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

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

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

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

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

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

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

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

Тоже бекендер и девопс

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

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

У меня не получилось на 100% создать структуру с сине‑зелёным продакшеном и выделенным сервером под тестирование. Получилось примерно наполовину: мы ограничились CI/CD и прогонкой тестов в Travis.

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

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

Автоматизация также спасает от человеческой невнимательности. Если надо сделать несколько рутинных операций, человек всегда будет тупить проигрывать компьютеру. Люди ленятся идти по списку, делают что‑то неправильно, случайно (или неслучайно) пропускают пункты. Компьютер всегда выполняет инструкцию полно и правильно. Перестраховывайтесь от человеческого фактора.

Тоже редактор и маркетолог

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

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

Мы думали, как объяснить пользу этого экрана, показать принцип работы, как подписать «включатель» этой фичи. Потом то же — но для участников. Если бы за каждой кнопкой я бежал к дизайнеру за макетом, то мы, скорее всего, зарелизились бы году в 3019. Умейте работать с текстом, экономьте время и запускайте проекты быстрее.

Тоже менеджер

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

Мне по началу было трудно привыкнуть уделять время планированию и определению приоритетов, а не программированию. Но меня спасала аналогия с процессами в разработке — планирование же тоже автоматизация. Оно помогает на время забыть о том, «сколько всего надо сделать и не упустить бы ещё вот это».

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

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

Тоже эйчар

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

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

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

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

Я сильно закопался. Тогда на помощь пришёл Костя. Мы поняли, что собеседования превратились в конвейер, а я подзабыл, зачем это всё.

Мы с Костей проговорили цели, задачи и проблемы и решили, как именно надо искать нового человека. Снизили напряг, сократили ресурсы на поиск и фильтр кандидатов. В итоге я нашёл двух отличных ребят: Тимофея Аксенова и Романа Макарова. Сейчас весь фронт на них.

Тоже тимлид

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

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

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

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

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

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

Параллельно учился описывать задачи более понятно. Скудное описание демотивирует, потому что непонятно откуда брать нужные данные. Слишком объёмное — лень читать. Учился находить баланс.

И вообще кто угодно

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

Конечно, у меня тоже бывают моменты, когда я думаю «уф, это же не моя работа, почему я вообще должен этим заниматься?», но чаще всего — это от усталости. Работа может приносить удовольствие, если найти отчего прёт. Меня пёрла огромная амбициозная задача. Вроде, справился.

Список литературы, кек

О площадке:

Статьи, посты, доклады:

Я награфоманил:

Крутые ребята:

Психология влияния. Роберт Чалдини

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

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

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

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

Затем предупреждает, что…

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

…И показывает несколько примеров такого влияния.

Правило взаимного обмена

Первый (уж простите) эксплойт мозга, о котором пишет Чалдини, — это правило взаимного обмена, суть которого в том, что…

Мы обязаны постараться отплатить каким‑то образом за то, что предоставил нам другой человек

Этот обмен не всегда бывает справедливым.

Правило взаимного обмена может инициировать неравноценный обмен

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

И проблема в том, что это правило крепко в нас зашито.

…[Имеет] настолько сильное влияние, что «брало верх» над фактором, который обычно влияет на решение подчиниться просьбе, — над симпатией к просителю

Даже непрошеная услуга порождает обязательство

Правило взаимного обмена навязывает долги

Оно, например, может вынудить кого‑то купить продукт, который был не особо‑то и нужен:

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

Более того, из правила Чалдини выводит опасное следствие:

обязанность идти на уступку по отношению к тому, кто уступил нам. …«Отказ‑затем‑отступление» побуждает людей не только соглашаться с предъявляемым требованием, но и в действительности это требование выполнять и, кроме того, соглашаться на выполнение других требований

В качестве защиты от эксплойта Чалдини советует:

отвечать услугой на услугу; оно не требует, чтобы на трюки отвечали услугами

Обязательство и последовательность

Эта «дыра в прошивке» — та, которую я замечаю за собой особенно часто. Заключается она в том, что…

Коль скоро определенная позиция занята, люди становятся склонны вести себя последовательно

Желание быть (и выглядеть) последовательным представляет собой чрезвычайно мощное орудие социального влияния, часто заставляющее нас действовать явно вопреки собственным интересам

Автор объясняет такое желание тем, что…

Последовательность ассоциируется с интеллектуальностью, силой, логикой, рациональностью, стабильностью и честностью

Плюс, мозг — штука хитрая и ленивая, а на автомате…

Мы можем действовать без излишних размышлений

Последовательность может вынуждать нас уговаривать себя, что прошлый выбор, который перестал приносить пользу, на самом деле «не так уж и плох»:

[Люди] убеждают самих себя, что сделали правильный выбор, и… в результате их настроение улучшается

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

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

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

Люди, прошедшие через большие трудности или страдание с целью добиться чего‑то, склонны больше ценить свои достижения, чем люди, достигшие того же самого с минимальными затратами

Это, например, объясняет, почему существуют ритуалы инициации в некоторых университетах:

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

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

Человека, который только что согласился с тем, что Соединенные Штаты не совершенны, можно спросить, почему… это так. После этого его можно попросить составить список «проблем американского общества» и подписаться под ним… Зная, что он написал злополучный очерк без особого принуждения, человек менял представление о самом себе

Недостаточно просто вымогать обязательства у людей; нужно заставить этих людей принять на себя ответственность за свои действия

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

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

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

В качестве защиты от подобных «атак» Чалдини советует в ситуациях, когда вы чувствуете, что «что‑то не так», задавать себе вопрос:

Зная то, что я знаю сейчас, сделал бы я тогда тот же самый выбор?

…И рассказывать о своих наблюдениях «атакующему»:

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

Принцип социального доказательства

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

Согласно этому принципу, мы определяем, что является правильным, выясняя, что считают правильным другие люди

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

[Мы считаем, что] если что‑то делает масса людей, это правильно

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

Когда мы не уверены в себе, когда ситуация представляется нам неясной или двусмысленной, когда «правит бал» неопределенность, мы склонны оглядываться на других и признавать их действия правильными

Но…

Мы часто не обращаем внимания на один важный факт. Эти люди, возможно, также следят за нашими реакциями

Отсюда, например, — нерешительность в оказании помощи.

В случае присутствия нескольких потенциальных помощников на месте происшествия личная ответственность каждого индивида снижается

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

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

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

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

У этого принципа есть ещё одна особенность:

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

…И это работает даже в принятии жизненно важных решений.

Книга, главный герой которой, Вертер, совершает самоубийство, имела громадное воздействие на читателей. Она… вызвала волну самоубийств по всей Европе

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

Чтобы защититься от влияния этого принципа…

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

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

Благорасположение

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

Мы автоматически приписываем индивидам, имеющим приятную внешность, такие положительные качества, как талант, доброта, честность, ум

Мы охотнее всего соглашаемся выполнять требования тех, кого мы знаем и кто нам нравится

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

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

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

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

Также и наоборот:

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

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

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

Оттуда же и поведение спортивных болельщиков:

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

А ещё нам нравится, когда нам льстят. Даже когда лесть очевидная ¯\_(ツ)_/¯

Для защиты автор рекомендует:

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

Давящая власть авторитета

Чалдини пишет, что люди склонны «повиноваться авторитетам», потому что раньше это помогало выживать. Но…

Мы становимся подвержены влиянию не только авторитетов, но и их символов

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

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

Действительно ли этот авторитет является экспертом в данной области? Насколько правдивым он может оказаться?

Дефицит, контраст

На наши решения о покупке может повлиять не только качество товара, но и его дефицитность. Об этом говорит принцип дефицита.

Ценность чего‑либо позитивного в наших глазах существенно увеличивается, если оно становится недоступным

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

Угроза потенциальной потери оказывают сильное влияние на принятие решений

Возможность потери чего‑то является более сильной мотивацией, чем возможность приобретения чего‑либо равного по ценности

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

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

По мере того как нечто становится менее доступным, степень нашей свободы уменьшается; а мы ненавидим терять ту свободу, которая у нас есть

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

Печенье было более высоко оценено теми покупателями, которые вначале столкнулись с его относительным изобилием и только потом — с дефицитом

О свободе Чалдини пишет на примере двулетних детей (о том же писал Курпатов):

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

Для защиты от влияния дефицита автор советует помнить, что…

Удовольствие заключается не в испытании на опыте дефицитного товара, а в овладении им

Всякий раз, когда мы сталкиваемся с давлением принципа дефицита, мы должны задавать себе следующий вопрос: «Зачем нам нужен этот дефицитный предмет?

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

Генерализация, автоматизм, личная заинтересованность

Мы любим обобщать. Это даёт нам видимость контроля над ситуацией, ощущение, что «мы реально понимаем, что происходит». Но…

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

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

Противостоять шаблонам и стереотипам нам помогает личная заинтересованность и вовлечённость в проблему.

[Когда автоматическое реагирование] становится опасным, …когда встающая перед нами проблема является для нас важной… мы… начинаем бороться с соблазном автоматически прореагировать на один‑единственный… элемент имеющейся в нашем распоряжении информации

На мнение тех испытуемых, которые не имели личной заинтересованности… прежде всего повлияла компетентность [эксперта]… На тех же испытуемых, для которых данный вопрос имел личное значение, статус оратора практически не оказал влияния; они прежде всего отметили силу выдвинутых аргументов

Советуешь?

Ага.

Вот ссылка на книгу, а вот — список дополнительной литературы:

Как я делал торговую площадку. Часть 1

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

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

Контекст

Задача была в том, чтобы переписать фронт, обновить дизайн и добавить новые типы торгов.

Проект оказался сложным — я с таким уровнем до этого не сталкивался. Чтобы как‑то справиться, старался искать рекомендованные подходы, читать книги об организации кода и архитектуре и применять это всё по ходу дела.

Теперь вот рассказываю о граблях, которые насобирал.

Проблема 1. Один в поле

Я начинал писать фронт один. Писать сервис одному — значит страдать от недостатка ревью и обратной связи. Рефакторить трудно, спросить совета не у кого (исходники‑то под NDA).

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

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

Проблема 2. Проседающая мотивация

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

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

Но иногда и дробление переставало работать. Мне тогда помогало сесть и начать хоть что‑то делать. Начав с малого, можно втянуться и продолжать работать. Но именно «сесть и начать» бывает сложно.

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

Проблема 3. Отсутствие обратной связи

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

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

Проблема 4. Страх запуска

Итеративная разработка — это делаем фичу и деплоим её, когда она готова. Если что‑то пошло не так, узнаем об этом сразу, будет понятно, что вызвало проблему и как её исправлять.

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

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

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

Преодолевать страх — трудно.
Деплоить итерациями — спокойнее.
Понять это на своём опыте — бесценно.

Проблема 5. Фичеризм

Если пилите проект в закрытую, очень велик соблазн добавить как можно больше фич. «Раз уж мы не выкатываемся по частям, давайте сделаем всё‑всё‑всё.» Это — путь в никуда.

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

Занятно, что чем больше времени потрачено на разработку, тем легче согласиться на ещё какую‑нибудь фичу. Ведь «мы потратили столько времени, не страшно потратить ещё немножечко». Но из таких «немножечек» могут складываться недели и месяцы. Не надо так.

Проблема 6. Размер и сложность

Помнить всё — нереально; слишком дофига деталей и нюансов.

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

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

Проблема 7. Собственно запуск

В итеративной разработке релиз — это вполне обыденное дело. Сделали, зарелизили, работаем дальше.

В закрытой разработке релиз — это веха. Жизнь делится на до и после. После релиза, как правило, работы становится больше.

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

Это может стать стресс‑тестом и для вашего продукта, и для вас. А там — привет, пункт 2 ↑

Итог

Это было трудно. Наверное, это был самый сложный проект и по сложности системы, и по поддержанию ритмичной работы с самодисциплиной.

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

Юодкранте, Нида, Прейла, март 2019

Все три пункта находятся на литовской стороне Куршской косы. (Про российскую сторону у меня тоже есть пост.)

Юодкранте выглядит опрятно, хотя и как‑то сбито что ли.

Юодкранте

Побережье залива красивое.

Вид на побережье залива
Старые лодки
Два лебедя

Красиво.

Вид на лес

На горе ведьм ветер в кронах шумит очень похоже на звук моря.

Вход на гору ведьм
Дорожка, обрамлённая деревьями

Иногда встречается скульпт‑крипота.

Криповая скульптура — 1
Криповая скульптура — 2

Красиво — 2.

Снова вид на лес

В Ниде встречаются чёрные дома (напомню, что чёрный дома — кайф). Больше рассказать о ней нечего, не в сезон там вообще ничего не происходит :–)

Чёрный дом в Ниде

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

Дом на берегу залива
Вид на залив

Медитативненько получилось.

Тлеющие угли в гриле

Когда последовательность важнее правильности

Пост будет холиварный, читайте с осторожностью.

Представьте ситуацию: приходит задача дополнить валидацию данных пользователя, которую писали до вас. Вы открываете код и видите:

const validateUserData = (userData) => {
  const {socialNumber, email} = userData
  return validateSocialNumber(socialNumber)
    || validateEmail(email)
}

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

Вы открываете код функций validateSocialNumber и validateEmail и видите, что они возвращают истину, если в данных есть ошибка. Откуда делаете вывод, что и validateUserData возвращает истину, если есть ошибка (наверное, на то были причины ¯\_(ツ)_/¯). Беглый просмотр кодовой базы показал, что таких функций много, они встречаются в разных модулях, и быстро исправить всё не получится.

Ваша задача — добавить проверку почты и сделать это «ВЧЕРА!!!». Из‑за сроков отрефактироить код перед этим не успевается (напомню, подобных функций много). Вы понимаете, что правильнее — написать новую функцию так, чтобы она возвращала истину, если ошибок нет…

Но прямо сейчас последовательность — важнее правильности, и первый шаг — сделать по аналогии, сделать «неправильно»

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

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

↑ Позже Раньше ↓