Акт I

Все началось на нашей обычной встрече с пончиками в среду утром. Я старательно слизывал хлопья яблочных оладий со сгибов пальцев, когда Аарон, лидер нашей группы по программному обеспечению из десяти человек, начал совещание. Он объяснил, что новый потенциальный клиент хотел пересмотреть свою систему отслеживания рабочих элементов. К концу года они хотели получить работающую демонстрацию пользовательского интерфейса, чтобы принять окончательное решение. За последние несколько месяцев команда разработчиков ПО Коллинеар Групп потерпела несколько потерь, от контрактов, которые ускользали из наших пальцев, до многообещающего внутреннего проекта, который так и не был реализован из-за кадровых проблем. Этот проект был похож на поиск давно потерянного джедая на планете Татуин; это была новая надежда. Для стандартной agile-команды из 5 человек потребуется от двух до пяти лет работы; это, наконец, позволило бы нам выполнять проектную работу, которую наша группа программного обеспечения пыталась получить в течение многих лет, и установило бы бесценные связи для последующей работы. Естественно, мы стремились зацепить клиента хорошими вещами.

Была только одна проблема. На самом деле проблем было как минимум 4. У нас не было контракта на руках, а был уже конец ноября. Прототип нужно было написать на ReactJs, и у нас был ровно один человек (Джордж), у которого было всего несколько месяцев опыта в этом. Он только что начал работать с новым клиентом и не мог внести свой вклад. Осталось два доступных инженера; надежный веб-разработчик по имени Стивен и новый сотрудник по имени Пейти. Что касается практики программного обеспечения, у нас коллективно был некоторый веб-опыт, такой как Bootstrap и AngularJs, но у нас никогда не было специализированных пользовательских интерфейсов или инженеров по пользовательскому опыту. С этим ограниченным набором навыков и доступности случилось еще одно несчастье: клиентский контракт на демонстрацию был выполнен молниеносно, и дедлайн демо был назначен на 21 декабря.

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

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

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

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

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

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

Акт II

В безумной панике мы запустили Jira board и начали писать истории. Или лучше сказать эпические? Джейсон сделал несколько серий макетов, показывающих общий поток приложений. Стивен, Пейти и я начали программировать и изо всех сил старались изучить ReactJs.

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

Почти ежедневно мы получали новую информацию от клиента. С каждым падением данных наше понимание того, как эти данные менялись, менялось. Мы начали понимать, какие данные наиболее важны, а какие данные часто модифицируются. В типичном Agile-спринте правило «никаких изменений в требованиях» является частью церемониального закона, наказуемого пожизненным заключением за исправление ошибок. Когда до демо-версии осталось две недели, законов нет. Возможно, это урок. Единственный закон состоит в том, чтобы дать бойцам на передовой ясное видение и достижимые цели. Это часто сводится к приоритетам. Даже когда у вас есть десять дней на выполнение, если вы знаете, что система должна сосредоточиться на функциях, а не на форме, или что фильтрация данных важнее, чем навигация по данным, или что реалистичные данные важнее, чем фальшивые данные, тогда ваши разработчики смогут увидеть видение. и принимать ежечасные решения, которые в конечном итоге улучшат результат.

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

Акт III

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

За день до этого мы сделали короткую демонстрацию с клиентом. Это было предвестником нового набора приоритетов и историй (если их вообще можно так назвать) и, конечно же, кардинально отличающихся мокапов. К ним относятся входные данные формы, которые автоматически заполнялись «с реальными данными, если это возможно, пожалуйста и спасибо». До демонстрации оставалось шесть рабочих дней.

К четвергу, 14 декабря, Стивен обновил формы данных, и я снабдил нас заглушкой для автозаполнения форм. К пятнице Пейти просмотрела несколько файлов данных и извлекла реальные данные из макета. В понедельник мы катапультировались к финальной истории, которая заключалась в том, чтобы предоставить пользователю элегантный, интуитивно понятный способ просеивать свои данные с помощью элементов управления масштабированием и фильтрацией. Это была самая важная часть демонстрации. Мы должны были показать клиенту, что «Да, мы поняли ваши данные. Да, мы можем создавать современные пользовательские интерфейсы. Да, мы можем сделать это за то время, которое требуется «нормальной» команде для двухнедельного спринта». Эта навигационная схема действительно оживила прототип, поскольку он перемещался по древовидной структуре данных так же элегантно, как вы ищете близлежащие пиццерии в Бенде, штат Орегон, на Google Maps.

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

Акт IV

Часы пробили восемь раз. Пока я сидел на диване с открытым ноутбуком, дети проскользнули мимо, чуть не врезавшись в рождественскую елку. Я много раз говорил им, что неразумно бегать со скакалкой, привязанной к их талии, но на этот раз я почти ничего не заметил. Мои блестящие, мертвые глаза смотрели в глубокую паутину моих собственных мыслей. Я подумал, смогу ли я доставить неряшливую кашу спагетти и назвать ее прототипом. Конечно, прототипы по определению являются «первой, типичной или предварительной моделью чего-либо, особенно машины, из которой разрабатываются или копируются другие формы». Но тем не менее, учитывая годы потенциальной работы над этой демонстрацией, мог ли я позволить клиенту заметить незавершенные концы? Могу ли я позволить себе сбой приложения в середине демонстрации? Внезапно мой сын встал передо мной, выполняя свою перед сном рутинную рев, как монстр. Именно тогда я вспомнил, как смотрел Комментарий режиссера к детскому фильму «Корпорация монстров». В сцене, полной активности и драматизма, комментаторы упомянули внимание к деталям, которое было уделено куче меха, которая лежала на полу и была выбита ногой. драка. Они назвали это «шлифованием дна комода». В глубине души я знал, что эта демонстрация будет действительно превосходной только в том случае, если мы предоставим код, который будет превосходным во всех отношениях, а не только в важнейшей функции фильтрации данных.

Я позвонил Стивену и сказал: «Я приду». Я не совсем уверен, что он ответил, но когда он открыл дверь в свою квартиру, его компьютер и монитор были установлены на столе, готовые к работе. Мы объединили все, что Пейти закончил до того, как он ушел на ночь, и начали длинный список ошибок. В среднем мы совершали девять коммитов в час, подпитываемых Irish Death, Childish Gambino’s Redbone и Eggs (авокадо еще не созрел). Несколько друзей сидели на диване позади нас и играли в видеоигры.

Наконец, примерно в 3:15 мы переместили последнюю ошибку из столбца «Выполняется» на доске Jira в «Готово». Осторожно, как только могли быть кривые руки, мы сделали последний проход тестирования, чтобы убедиться, что ничего не сломали, уделив особое внимание флагманской функции навигации и фильтрации данных. До демонстрации оставалось всего семь часов. Я поспешил домой и выспался, сколько мог.

На следующее утро в 9:30 я поднялся наверх с кофе в руке, чтобы набрать демоверсию.

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

Вот когда это случилось. Мои худшие опасения оправдались, когда клиент вежливо ответил: «Да… за исключением того, что на самом деле это не фильтрация данных».

Я замерла, кофе все еще лился в рот.

«О да, — нервно сказал Аарон, — посмотри на это… должно быть проблема с данными». В потрясенном ступоре я позволил кофе вылиться мне на колени. Скажем так, хорошо, что я был без звука. Отбросив кофе в сторону, я начал копаться в коде в поисках проблемы. В этой последней отчаянной попытке сделать приложение презентабельным я каким-то образом нарушил основную функциональность приложения: современную навигацию и фильтрацию. Через несколько мгновений я обнаружил виновника. Как и все жуки из внутренних кругов ада, которые сидят у ног Дьявола и выполняют его личные приказы, это была острота. В разногласии прошлой ночью я переписал функцию, которая создавала новые объекты данных. В Javascript нужно быть осторожным при глубоком копировании. Излишне говорить, что мы этого не делали. Так что в каком-то смысле Аарон был прав, говоря о проблеме с данными. Три дня разработки алгоритма и пользовательского интерфейса, и все это рухнуло у меня на глазах. Я плакал.

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

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