Вайб-кодинг синхронизатора календарей

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

Дофаминовый цикл вайб-кодинга

Обычно я стараюсь найти час-два на компьютерные игры в большинство рабочих дней, плюс иногда получается поиграть на выходных. Но прошлым летом это время стало уходить на кодинг, точнее - на “вайб-кодинг”, или еще точнее - на кодинг с помощью AI (потому как я всё-таки смотрел на сгенерированный код и трогал его руками). В этом процессе есть свой дофаминовый цикл из серии “ещё один промпт”, который хорошо знаком по видеоиграм (Heroes 3, anyone?).

Я попробовал несколько AI-инструментов для кодинга - Zed Editor, GitHub Copilot, и с их помощью сделал небольшой проект и выложил его в опенсорс. Скорее всего мой проект не будет интересен никому кроме меня, но именно он привёл к перезапуску блога, потому что мне хотелось написать о нём в качестве завершающей точки.

Проблема

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

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

Решение - CalSync1on1

Результат - CalSync1on1, небольшая CLI-утилита на Swift для macOS, которая использует EventKit для синхронизации системных календарей. Одно из ограничений - мне нужно было сохранить рабочий календарь приватным: я не могу (и не должен) расшарить его напрямую.

Утилита смотрит в мой рабочий и в личный календарь на macOS. Она отсматривает события в заданном периоде (по дефолту - текущая и следующая недели) и синхронизирует ивенты, которые распознаёт как one-on-one. Логика определения простая: если в ивенте ровно два участника (включая меня) - это one-on-one. Чуть сложнее с периодическими митингами из-за их другой внутренней организации, но они тоже обрабатыватся.

Есть несколько фильтров поверх этого - пропускаются ивенты на весь день, ивенты с определёнными подстроками в тайтле, плюс приватные ивенты. Синхронизированные ивенты получают чистый и настраиваемый заголовок вроде 1:1 with [Name], чтобы ничего лишнего из рабочего календаря не утекало.

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

Утилита запускается автоматически через macOS launchd и синхронизирует календари раз в 30 минут, так что мне не приходится о ней думать - всё происходит само.

Про AI-кодинг

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

Утилита работает и делает то, что должна, так что я не чувствовал особой необходимости что-то в ней обновлять после создания. Оглядываясь назад, интересно отметить, как круто AI-инструменты для кодинга эволюционировали даже за последние 6-9 месяцев со времени ее написания. С современными инструментами почти кто угодно может создавать всё более сложные и полезные штуки для упрощения работы и жизни. Примерно как Twitter Bootstrap в свое время позволил суровым бэкенд-разработчикам делать прилично выглядящие сайты - AI-кодинг делают похожую вещь для перехода между “у меня есть идея” и “у меня есть работающий сервис” :)

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

Ну а пока - первый пост после перезапуска готов :)