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

Итак, я провел большую часть утра во сне, и у меня не было сил для сопряжения, немного поработал администратором — наверстал несколько давно незавершенных дел — и позже в тот же день мне удалось потратить немного времени на кодирование в node/express/mongo, чтобы посмотреть, смогу ли я настроить что-нибудь, что могло бы стать основой для асинхронного бота для голосования или планирования покерного агента, о котором мы думали. Поясню, планирование покера — это процесс одновременного голосования по сложности задачи на собрании. Таким образом, задача может заключаться в том, чтобы добавить новый отчет с данными на страницу статистики, и у вас может быть 5 человек, и они будут делать пальцами камень, ножницы, бумагу, за исключением чисел, например. 1, 2 или 3, а затем все пять человек одновременно покажут свои пальцы, и вы получите голоса, скажем, за 1, 2, 2, 2, 3, а затем вы можете спросить людей, голосующих против большинства, почему они думал, что все более или менее сложно, а затем, после некоторого ограниченного обсуждения, вы можете пересмотреть, или выбросы согласятся с большинством.

Ценность, полученная в результате этого голосования, затем может быть прикреплена к билету, связанному с проблемой, и тогда это дает тому, кто собирается приступить к этой задаче, представление о том, что они берут на себя. Это также позволяет использовать такие инструменты, как Pivotal Tracker, для оценки времени выполнения различных задач. Еще одна центральная часть голосования заключается в том, что оно выявляет различия в предположениях между членами команды и обеспечивает структурированный способ относительно быстро разобраться в них. Мы давно занимаемся синхронным онлайн-голосованием в проектах AgileVentures. Обычно мы используем видеовстречу для координации встречи, а затем проводим одновременное голосование в чате. Следы этого часто можно увидеть в различных чатах AgileVentures в Slack, особенно после того, как мы поняли, что чат Google Hangout не сохранился.

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

@channel new async vote on "make doit mentions in map key be hyperlinks" https://www.pivotaltracker.com/story/show/122461371, discuss here, or in ticket and then DM me your vote of 1 2 or 3

а затем я получу индивидуальные DM от разработчиков, например:

Vote for https://www.pivotaltracker.com/story/show/122461371:   1

или иногда с небольшим пояснением

https://www.pivotaltracker.com/n/projects/742821/stories/122461371 seems like a 2, because it requires a bit of front-end and a bit of back-end, which means testing on both those fronts too
i’m not sure who wants to do this story, but my coworker seems interested in pairing with me on it

or

I guess the hyperlinks issue for "do-it" is not your run of the mill "link_to" type. It will involve JS so if that s the case I say 3.

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

@here we have 2 votes for "make doit mentions in map key be hyperlinks" https://www.pivotaltracker.com/n/projects/742821/stories/122461371

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

@channel we have two votes on https://www.pivotaltracker.com/story/show/122461371, we need one more vote to move forward - discuss here, or in ticket and then DM me your vote of 1 2 or 3

затем как только у меня будет достаточное количество голосов (на данный момент 3) я выкладываю результаты на канал:

@channel vote on https://www.pivotaltracker.com/n/projects/742821/stories/122461371 "make doit mentions in map key be hyperlinks" complete - @decareano 3, @johnnymo87 2, @marouen 1 - I'm just imagining that this is just a simple `link_to` or am I missing something - @johnnymo87 @decareano any thoughts on why this is more complex than a 1?

а потом у нас обсуждение в Slack-канале (или может быть в тикете):

@tansaku, did you read my comment in my vote? I had the same thought as @marouen but in reverse. Anyway, if it's a link_to my vote is 1.
@decareano thanks for your vote - we now have two votes of 1 for https://www.pivotaltracker.com/story/show/122461371 "make doit mentions in map key be hyperlinks" and a 2 from @johnnymo87 - @johnnymo87 happy to revise to 1 or is there some aspect of this we've missed?
oh, i thought that part of the UI was done in js. But I looked it up, and it’s not. I’ll revise to a 1, @tansaku

Потом ставлю смету на тикет и начинаем заново:

okay @here so that story is unanimous as a 1
@channel we have a new async vote on https://www.pivotaltracker.com/story/show/131062023 "Refactor Build marker service" - please DM me 1 (simple), 2 (medium) or 3 (hard) - discussion in ticket or here as you prefer :slightly_smiling_face:

Так что это был довольно тривиальный пример, но на самом деле это голосование выявило некоторые неправильные представления о рассматриваемом билете. Я думаю, что эти асинхронные голосования очень хороши для тех проектов, где члены команды не могут проводить синхронные видеовстречи. У меня довольно много логистических накладных расходов на его запуск (которые можно было бы автоматизировать в бота), а также, поскольку я «бот», для меня немного несправедливо голосовать. Если бы все это было автоматизировано, я тоже мог бы голосовать, и все могло бы происходить немного быстрее. Хотя, конечно, мы должны учитывать время, необходимое для автоматизации, и не выбросит ли автоматизация ребенка вместе с водой из ванны.

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

К сожалению, я думаю, что Slack до сих пор не поддерживает DM-ботов. По крайней мере, вы можете DM, но тогда все ответы уходят в slack-канал бота — вы не можете продолжать разговор один на один с ботом. В любом случае, этот процесс также позволил мне настроить «интерфейс», в котором чаты с разработчиками подняли несколько вопросов:

  1. Всегда добавляйте ссылку на тикет в любой пост
  2. Всегда указывайте название заявки в любой публикации
  3. Полезно включить инструкции для новичков, например: «Пожалуйста, напишите мне 1 (простой), 2 (средний) или 3 (сложный) — обсуждение в тикете или здесь, как вам удобнее».

И я подтвердил, что функциональность находит некоторое применение. Итак, помня обо всем этом, я начал рассматривать возможность тестирования приложения Node/Express. Я почти уверен, что мог бы написать что-то более быстрое на Ruby/Sinatra, но есть также идея, что нам нужно разнообразить приложения, которые мы используем в AgileVentures, чтобы привлечь более широкий круг разработчиков. Кроме того, после нашего опыта с AgileBot мне интересно посмотреть, станет ли после отказа от Hubot и CoffeeScript простое приложение Node/Express более управляемым.

Теперь я использовал TDD Node/Express раньше, но прошел год или около того, и я хочу быть в курсе лучших практик, поэтому я искал учебные пособия и тому подобное. Я нашел:

Теперь интересно, что Heroku был привлекательным, потому что важно получить что-то на стабильной конечной точке, но это не было TDDd, поэтому я выбрал последнее, которое в конечном итоге заработало, но немного разочаровало, потому что на самом деле это не было ТДД. У него были тесты, да, но функциональность не тестировалась. Теперь я заметил, что SemaphoreCI платит людям по 200 долларов за то, чтобы они писали туториалы… В пользу автора они сделали ссылку на полный код на https://github.com/rajzshkr/todoapi, что и позволило мне получить вещи работают. Само руководство имело недостатки в следующих моментах:

  1. код, отличный от рабочего примера
  2. тесты, введенные после кода, который они тестировали, т.е. не TDD
  3. фрагменты кода в учебнике, не связанные с конкретными файлами

В рамках работы с учебным пособием я установил и запустил mongodb, обнаружил некоторые уловки экспресс-отладки и потратил большую часть своего времени на то, чтобы понять, что подключаемый модуль Postman Chrome, который я использовал для тестирования конечной точки POST, необходим для предоставления необработанных данных. тело сообщения, которое будет обрабатываться этим приложением; form-data и x-www-form-urlencoded просто отображаются как пустое тело. К сожалению, последний элемент сжег время, которое я мог бы потратить на развертывание в Heroku. Итак, к концу я увидел более очерченную структуру приложения, чем я видел ранее с экспрессом, включая модели из Mongoose (модуль схемы MongoDB), контроллеры и маршрутизатор, все в отдельных файлах. По иронии судьбы я не знаю, насколько широко распространен этот конкретный макет, хотя, если я знаю экосистему узла, возможно, еще не существует какого-либо общепринятого стандарта.

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

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

но мы исчерпали пределы интеграции для нашего резерва AV, и я начал думать, что вместо того, чтобы беспокоиться о технических деталях, я должен заставить работать движок бота, не зависящий от любого из интерфейсов (снова InsideOut), и так Я закончил тем, что записал несколько историй о системе, которые вы уже поняли, потому что они изложены в первой части этого блога, но на всякий случай, если вам интересно, вот мои краткие заметки о взломе дня:

планирование покерного бота

/bot voice # необязательный URL билета

–› объявляет — у нас есть асинхронное голосование по URL-адресу тикета (первый из репозитория, если не указан) «заголовок», пожалуйста, напишите мне 1 (простой), 2 (средний) или 3 (сложный) — обсуждение в тикете или здесь как вы предпочитаете :слегкаулыбающеесялицо:

тогда нужно иметь возможность получать данные от людей — слабых прямых сообщений? или выставить веб-интерфейс (можно ли там отреагировать?), а затем опубликовать обратно в slack…

можно ли для начала сделать все это ненавязчивым, чтобы уменьшить сложность?

люди голосуют за билеты

Итак, у нас есть AsyncVote, который состоит из тикета с заголовком и URL-адресом, а затем есть несколько голосов, которые имеют ценность, поступают от человека и могут иметь объяснение, и когда количество голосов количество голосов достигает установленного значения (например, 3), затем раскрываются полные результаты, и устанавливается стоимость тикета, если есть согласие, или мы приглашаем к дальнейшему обсуждению….

Итак, я пришел к мысли, что должен ли я просто TDD что-то в узле, который будет работать в командной строке, а затем построить несколько различных интерфейсов поверх этого? Я хотел бы иметь время, чтобы сделать как версию Node/Express, так и версию Ruby/Sinatra, чтобы показать полные параллели и/или их отсутствие между ними… посмотрим, когда у меня будет еще один свободный день :-)

СВЯЗАННЫЙ КОД:

Первоначально опубликовано на http://nonprofits.agileventures.org/2016/09/28/fallow-day/