Еще один таск

Действующие лица:
Коуч - считай, личный тренер, который подсказывает и направляет во время обучения
Продукт оунер - человек, которому все равно, сколько времени ты потратил на фичу. Все, чего он хочет, - “чтоб все было хорошо и красиво”
Таск - сложная, на первый взгляд, задача от коуча
Трелло - доска с тасками, на которую страшно смотреть в конце спринта, поскольку там остаются в основном баги.
Спринт - время, за которое необходимо выполнить все задачи из трелло (обычно неделя)
Фикс - исправление бага, которое позволяет продукт оунеру увидеть все, сделанное непосильным трудом за неделю
Баги - баги

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

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

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

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

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

“... для этого вы подключите Elasticsearch”, - говорит коуч. “Что? Какой еще эластик?” - куда-то пропал внутренний дзен-буддист, которого ты взрастил в себе во время общения с тестировщиком. Теперь твой внутренний консерватор кричит: “Вы что, совсем рехнулись? Какой еще Elasticsearch? Мы только нормально разобрались в Redux, начали хорошо писать на NodeJS и составлять внятные запросы в постгресе. При этом все уже протестировано и работает. Ну куда еще ту штуку пихать? Нет, я не буду этим заниматься”. По какому-то невероятному стечению обстоятельств, у тебя почти не осталось задач с прошлого спринта, и па-па-пам - ты счастливый обладатель задачи сделать автокомплит, конечно же, помимо еще десятка более мелких тасков.

Проходит два дня. Базовых задач становится все меньше, а таск в трелло по Elasticsearch смотрит на тебя каждой буквой E немного осуждающе и ехидно. Ты все еще не хочешь перетягивать ее в колонку In progress. Ты знаешь, что как только ты это сделаешь, твоя жизнь перестанет быть прежней, и на дейли тебе придется придумывать, почему ты все еще разбираешься с ней, почему не написал еще ни одной строчки и... “Почему так жарко?” - мелькает у тебя в голове. Ноутбук греется и гудит на всех оборотах, еще чуть-чуть - и он, кажется, взорвется. В голове появляется мысль: “Если сказать, что с ноутбуком проблемы, то можно отдохнуть и выиграть пару дней”. 3, 2, 1 - рішення прийнято. Так и сделаю.

Спустя два часа ты осознаешь, что сообщение в чат ты так и не отправил. Где-то внутри ты понимаешь, что если ты не разберешься с таском, то это сделает кто-то другой. Нет, это не страшно, но кто-то другой будет красавчик: он взял и затащил, а у тебя “проблемы с ноутбуком”. “Нет, не могу так дальше”. Перетащил. Теперь таск в in progress, и назад пути нет. До конца спринта осталось три дня.

Что… такое... Elasticsearch. Гугл начинает накидывать вариантов, в основном предлагая ссылки на оригинальную документацию. Мало того, что там все на английском, так еще и непонятно, с чего начать. Да и зачем? База данных есть, поиск работает не так уж и плохо, по крайней мере, когда ищешь десяток-другой записей. А, ну и тестировщик не накинет багов, пока ничего нет.

Коуч подсказал флоу - будем записывать данные в две базы: и в Elastic, и в PostgreSQL. “Чееее?” - отправляешь соответствующий мемасик в ответ, но все же пытаешься понять, зачем это нужно. Ага, в одном месте у нас основные данные для отображения детальной информации об объекте, в другом - те, которые мы хотим мега-быстро искать (да-да, те самые 24 документа, которые были созданы как тестовые данные в самом начале существования проекта). Мозг скрежещет, кофе / чай допивается, а ты пытаешься понять, как сделать запрос в эластик из NodeJS. Браузер, гугл - решение найдено, и с отрывом в 3000 звезд от других библиотек с гитхаба побеждает та самая, в которой тебе обещают легко подключиться к Elasticsearch и начать работу.

Подключаешь библиотеку в свой код и пробуешь создать свою первую базу данных. Хм, там нет баз данных. Есть индекс. Начинаешь копать терминологию и потихоньку вникать, что к чему. На дворе уже темнеет, а ты все роешься в документации и пытаешь понять, что и как работает - час, два, три… Три часа ночи, и тебя озаряет! Нужно уже что-то пробовать на практике, а когда будет конкретная проблема - тогда ее и решать. Написав “Всем пока”, с чувством выполненного долга ложишься спать.

Четверг, 10 утра, ты понимаешь, что проспал дейли. Не то, чтоб критично, но да. Все будут смотреть на тебя косо, еще и вопросы начнутся - что делал, какие результаты, есть ли проблемы. А какие проблемы? Нет кода - нет проблем. Библиотека подключена, теперь нужно создать базу. Вчера ты вычитал о том, что настройки и маппинги данных лучше всего выставлять при создании базы - иначе будет тяжко. Так и сделал, написал логику для создания базы данных, вернее, индекса. Вау, так просто! Коммит, пуш - дело в шляпе. Теперь нужно переписать логику на бекенде так, чтобы данные появились и в Elasticsearch. Ты уже понял, что начинать нужно с малого. Просто дописал логики, чтобы сохранялось название объекта и картинка. Фух, неплохо, у нас уже есть данные. Пробуешь написать запрос на поиск объекта - по мануалу четыре строчки, в жизни - 6. Время пробовать, ты вбиваешь в поиске слово “Отель” и, о чудо, в автокомплите появляется список из двух элементов. Это успех, думаешь ты, сохраняешь изменения и перетаскиваешь таск в done.

“Цок-цок” - надоедливый месседж из слека, который сообщает, что тебя ценят, тебе пишут и тебя любят. Тестировщик. Не, ну я сейчас точно проверял, все работало. Но тестировщику не зашел способ, которым решена проблема. Подсказки в автокомплите появляются, если ввести целое слово, а если по кусочкам - то ничего не находит. “Блин, только взял новый таск”. Придется переключаться обратно.

Очередная порция кофе и попытка сделать хороший автокомплит. Читаем в документации: “Один из способов реализовать такую фичу - сделать кастомный анализатор”. Что же это еще такое? Ага, это внутренний механизм, через которые проходят сохраняемые и искомые данные… Если сохранить в индекс кусочки слова, а не целое слово, то система будет их находить, когда ты вводишь слово не полностью. Настройки нужно было выставить в самом начале, придется чистить базу - не хорошо. Параллельно изучаешь механизм копирования данных, который называется реиндексация. Скопировал данные в базу с новыми настройками. Логику менять не пришлось. Пробуешь автокомплит и просто не можешь не радоваться - работает. Подсказка появляется, как только ты вводишь два символа (да, ты ведь изучил дополнительные настройки и теперь знаешь, как можно кастомизировать поиск). Пробуешь еще раз, чтобы потешить свое самолюбие, как вдруг заскулила собака, - надо выводить гулять. Ладно, еще потестирую, как приду.

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

Нет, так не прокатит… Есть сосед, у него ноутбук, попрошу его по старой дружбе. 10 минут - и ты в деле. Быстро запустил проект - половина всего не работает - все решили смержиться в последний момент. После дейли по памяти быстренько накидал код, который еще вчера, казалось, был произведением искусства, но уже сегодня почему-то представлял из себя 20 строчек, половина которых скопирована из мануала. Коммит-пуш, проверяем - работает. Блин, хоть бы тестировщик снова не объявился...

Час до демо - никаких вестей от тестировщика, полчаса - тишина, 5 минут… Демо. Ну, поехали. “У нас уже работает быстрый автокомплит...” - говорит кто-то, ведь сегодня презентуешь не ты. Продукт оунер ввел первую букву в инпут - для тебя момент, пока не появились результаты, кажется вечностью, но в действительности результат появился практически мгновенно. Вместо слова “отель” по ошибке начали вводить “отед”, но результат также нашелся - буквально за два часа до демо добавил fuzzy search, - способ поиска, который позволяет делать ошибки при вводе. Фух, работает.

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

От автора:

Привет, меня зовут Богдан. Я закончил академию в 2014 году, а в последствии и сам проводил Академию по направлению JS в роли коуча. Когда наша команда делала проект в 2014 году, мы и сидели до 3 ночи, и ломали продакшн перед демо, и открещивались от задач, которые уже начинали делать другие, но по какой-то причине не закончили. Когда я вел академию как коуч, я замечал эти же моменты у других ребят и старался исправить те ситуации, через которые прошел сам. Но, наверное, некоторые вещи не меняются, и все набивают одни и те же шишки, которые впоследствии нельзя не вспомнить без улыбки.