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

Однажды, тёплым, майским утром, ко мне пришёл PDM с предложением проекта, от которого невозможно было отказаться - аффилированная компания, которой, обычно отдавали такие работы, была занята до конца года, а в начале лета, требовалось провести процедуру Performance Review в большом подразделении нашей компании.

Требования были выданы "на словах" и они были ОЧЕНЬ нереальными:

  1. авторизация через LDAP

  2. возможность авторизовать "сторонних" участников ревью (из смежников, или подрядных компаний)

  3. доменное имя первого уровня в компании

  4. 3 недели срока

Пришлось огорчить, на дворе стоял 2022 год, Имперская Безопасность - лютовала, так, что простое получение, обозначенного, доменного имени, заняло бы более месяца, с обоснованиями и согласованиями,... да и "сторонние" участники, внутри контура компании, для авторизации LDAP, выглядели, просто, бельмом на глазу.

PDM погрустнел,... но, как в сказке, я предложил ему заглянуть утром: "утро вечера мудренее". А пока, озадачил свою команду небольшой идеей. Были, кое-какие намётки, а как говорил мой учитель физики: "каждый экспромт, должен быть хорошо отрепетированным". До вечера немного поин��естигировали, помитинговали, поштурмили, и к утру, экспромт был готов.

Встретившись с PDM я погрузил его в идею: мы пишем ПОЧТОВОГО РОБОТА, который будет рассылать сгенерированные экселевские файлики, где разрешено менять только некоторые поля.

Эта архитектура закрывала все пункты исходных требований:

  1. почта решала вопросы с авторизацией пользователя

  2. "сторонние" участники, естественно, имели почту и вопрос с их подключением внутрь контура - отпадал

  3. доменное имя - не нужно, так как веб морды у сервиса нет вообще

  4. 3 недели - вполне реалистичный срок, что бы наваять этот сервис на питоне

Получив ДОБРО, мы засели за проектирование небольшой БД, что бы хранить результаты и набора команд, на которые будет откликаться сервис.

Идея очень простая и состоит из нескольких шагов:

  1. подготовка структуры подразделения

  2. первоначальная рассылка где каждый участник описывает свои достижения и выбирает ревьюверов

  3. в соответствии с этим списком, происходит формирование писем ревьюверам, для запроса обратной связи

  4. подготовка и отправка обратной связи

  5. поведение результатов

Набор команд был сформирован для администрирования сервиса:

  1. прислать текущий граф иерархии участников ревью

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

  3. закрыть первый этап и провести проверку

  4. разослать письма для ревьюверов в рамках второго этапа

  5. проверить, от кого не пришло откликов и направить напоминание

  6. закрыть второй этап и сформировать результирующую оценку

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

  1. отсутствие циклов

  2. отсутствие отдельных (висячих) элементов

Первоначальный этап, в результате выглядел так:

  1. формируется дерево подразделения, на основе входящего списка

  2. для каждого участника, формируется Excel файл (использовали openpyxl)

  3. с использованием служебного аккаунта на MS Exchange генерировали письмо, с вложенным файлом с прошлого шага (использовали exchangelib) и отправляли его участнику

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

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

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

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

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

Мы сели обрабатывать первые проблемы:

  1. опечатки в фамилиях или email адресах, из-за чего кто-то задваивался, или письма уходили в никуда,... естественно, с ошибками - добавили обработку некорректных адресов

  2. кто-то был в отпуске и у него был установлен ООО,... что воспринималось, как неверный ответ, о чём шла нотификация, на которую опять приходил ООО,... (что бы понять рекурсию, нужно понять рекурсию)

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

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

Вот тут, учитывая, два предыдущих этапа, всё было уже скучно...

И, хотя, PDM подгонял нас и просил сделать: "хоть как-нибудь, ведь это же на один раз", моя установка команде была: "делать, как для себя"... Поэтому я не удивился, ни тому, что в ноябре пришло немного новых требований на развитие сервиса, ни тому, что он жив и развивается до сих пор, а прошло уже больше 8 ревью.