Joy of Programming

Я давно не получаю удовольствия от своей работы (какой бы она ни была). Вероятно, это характерно для любой профессиональной деятельности. Большая часть того, что я делаю — это допиливание и подхачивание уже существующих систем. Редкий проект начинается с нуля, а если и начинается, то посвящен он какой-то прагматичной области, где нет особого фана. Зато за это платят деньги, и платят хорошие деньги.

На прошлой неделе я чот приуныл, потому что уже давно забыл когда мне было в удовольствие что-то покодить, и решил внести немного разнообразия в ежедневное ковыряние легаси джавы и ямля кубера. В голове как раз прочно села навязчивая идея сделать бота, который будет автоматически модерировать телеграм чат — в базовой вариации выдавать предупреждения за использование обсценной лексики и переводить человека в режим read-only. Воображение тут же нарисовало SaaS где за $5 администраторы чатов смогут подключить моего бота, конфигурировать блеклисты, смотреть статистику по блокировкам, кастомизировать сообщения, и использовать еще тысячу и одну функцию. Надо было делать.

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

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

Утром я убедился что бот не падает (код рабочий) и вывел его из беззвучного режима. Естественно, общественность (точнее небольшая ее часть) моментально возмутилась и начала тестировать бота на предмет того, какие же слова он знает. Получился такой эффект Стрейзанд :) Еще посреди разработки я понял что идея не взлетит, алгоритм определения слов я сделал слишком глупым (простое вхождение символов) — пользователи могли бы маскировать слова разделяя буквы пробелами или другими способами, но решил добить до конца. Уже через 5 минут после запуска я окончательно убедился что в базовом виде бот не работает — под раздачу попадали еще и обычные слова, где поиск находил негодные подстроки.

Стало понятно, что нужно прикручивать NLP и прочий датасаенс с машинлёрнингом, учиться определять “тон” сообщений и действовать более интеллектуально, иначе чат превратится в цирк тестировщиков бота а не в место для культурного общения.

Потратив еще пару часов я сделал другую функцию — рейтинг пользователя. Сделав ответ со строкой “+1” или “-1” можно увеличить рейтинг пользователя и потом посмотреть таблицу лидеров. Хабр в миниатюре. Функция тоже не зашла и дальнейшую разработку я прекратил.

На всё про всё я затрекал 8 часов. Непосредственная работа с пользователями, быстрый цикл обратной связи, непродолжительная борьба щита и меча принесли мне кучу удовольствия. 10 из 10 буду делать еще :)


У меня несколько проблем с мотивацией.

Первая — мне тяжело работать, если то, что я делаю, никому не интересно, не особо нужно, или если меня регулярно не пинают по статусу. Тяжело идут всякие рефакторинговые задачи, которые не дают отдачи и не приносят видимого результата (нет привязки производительности к конверсии пользователей). Если меня не пинать, то я начинаю на задачу забивать, потому что не чувствую, что она кому-то нужна. Дело даже не в ежедневном созвоне, ежечасном сообщении в скайп “ну как там”, а просто в ощущении что задача не является важной для “заказчика” (под этим термином я понимаю того, кто дал мне работу, не обязательно конечный заказчик).

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

Кто-то назовёт это синдромом студента, который все курсачи сдает в последний момент, но я не соглашусь. У меня есть несколько направлений, беклог от разных заказчиков на пол-года вперед, бери и делай. Лучше всего работа идет, когда она действительно нужна, потому что иначе есть риск сделать решение, положить на склад, а потом переделывать. Или сделать, положить на склад, а потом, в момент окончательной интеграции доставать его, сдувать пыль и опять загружать контекст задачи. Двойную работу я делать не хочу, поэтому стараюсь выдавать точно в срок или немного позже. Наверное это скорее плохо нежели хорошо, потому что “в срок” часто, хоть и не на много, продалбывается.

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

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


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

Не так давно я в очередной раз переехал на другую систему писательства (Evernote -> Simplenote -> (Notion) -> Fibery). Fibery это сильно кастомизируемая система для управления чем угодно. В базовой версии есть шаблоны для управления софтверными проектами, управления хайрингом, отпусками, маркетингом и так далее. Я взял маркетинговый шаблон и подпилил немного под себя. Ключевым и очень важным параметром поста для меня является количество символов. Я стараюсь влезать в 2000 знаков — так, чтобы вы, читатели, могли просмотреть текст за несколько минут, по дороге на работу, или прокрастинируя и залипая в телефон. Всё, что больше 3000 знаков, нужно бить на несколько частей, иначе никто не дочитает (впрочем, это всего лишь мои домыслы, основывающиеся ни на чём).

Evernote и Simplenote умеют считать количество знаков, Notion умеет считать только ASCII знаки (позор разработчикам), Fibery не умеет вообще. Зато Fibery даёт возможность делать кастомные кнопки которые можно программировать с помощью JS API. Я пробежался по диагонали по документации, добавил себе в объект “Пост” кастомное поле “Количество знаков”, добавил кнопку с тремя строками джаваскрипта которая брала текст, подсчитывала его параметры и обновляла соответствующее поле, и был таков.

Радости моей не было предела. Я только что сам для себя расширил продукт! Я даже написал фаундеру Fibery письмо где описал свой “кейс”. Короче, получил кучу позитива от нескольких строчек JS.

Большое влияние на удовольствие от работы для меня имеет визуализация. Кнопка — нажималась и визуализировала количество символов. Бот (которого я писал в трех постах ранее) — в сообщениях визуализировал статистику пользователей. Увы, в большая часть работы моя — бекенд который максимум в консоль будет рисовать, и то, вряд ли что-то хорошее.

На одном из проектов у меня была задача ускорить CI/CD. Для того, чтобы понять, что нужно ускорять, я вначале смотрел в цифры времени выполнения джоб на GitLab, а потом решил что так дело не пойдет, пошел читать документацию к API, и в результате сообразил скрипт на питоне который визуализировал весь пайплайн в виде sequence-диаграммы, по которой сразу было понятно, какие шаги нужно ускорять чтобы ускорить весь процесс, а какие не будут влиять на общее время потому что не находятся на критическом пути. Пока я делал скрипт у меня в голове уже родилась идея SaaS который будет профайлить ваши гитлаб пайплайны, показывать где нужно ускориться, с помощью ML предсказывать загрузку кластера и автоматически масштабировать его, и давать рекомендации по оптимизации (например если у вас всё время ставятся одни и те же пакеты то продукт посоветует вынести всё в отдельный образ). (Дарю идею стартапа бесплатно — думаю она очень хорошо может взлететь, а то и будет куплена самим гитлабом.)

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


Сподобалось? Долучайтеся до мого телеграм каналу: https://t.me/full_of_hatred