Допомагаємо ЗСУ за допомогою Claude Code
Привіт, мене звати Павло Поляков, я працюю Principal Software Engineer у Free2move, найбільшому каршерінгу в Європі. Хочу розповісти, як я з допомогою кодинг-агентів хочу допомогти ЗСУ. Я розробив бота!
Напевно, всі, хто дотичний до допомоги війську та бере участь у зборах, бачать, що збирати стає дедалі важче. Велика війна триває вже четвертий рік, і ти ніби й розумієш, що треба долучатися та допомагати, але водночас трохи втомлюєшся 🤷 Ну, буває. Але чи можна щось із цим зробити? Я подумав, що можна. Я розробив бота, який допомагає донатити регулярно. А що ще краще, то це те, що донатити будете не тільки ви! Так з’явився @DonationRaffleBot.
Як працює бот
Але це зараз, а давайте подивимося, як я до цього дійшов і чого навчився!
Агенти
Останніми тижнями я уважно придивився до кодинг-агентів і зрозумів, що зрушення сталися буквально за останні місяці. І софт, і моделі стали кращими, і тепер я не уявляю, як можу повернутися до роботи «по-старому», щось програмувати, набираючи код. Андрій Карпати у своєму нещодавньому дописі в X сказав:
Given the latest lift in LLM coding capability, like many others I rapidly went from about 80% manual+autocomplete coding and 20% agents in November to 80% agent coding and 20% edits+touchups in December.
І я погоджуюся з ним, світ розробки перевернувся. Це більше не вайб-кодинг, це просто розробка за допомогою агентів. Цей процес змінює те, як ми працюємо. Я не кажу, що він полегшує нашу роботу, можливо, навіть навпаки. Бо тепер ти можеш отримати якісний код швидше, але це також вимагає від тебе додаткових ментальних ресурсів. Адже весь цей код (багато) треба інтегрувати між собою, щоб у підсумку отримувати системи, які може підтримувати ШІ або людина.
Але я почав із простого. Я вирішив, що треба зробити Telegram-бота. Упевнений, що в багатьох, хто використовує Telegram як основний месенджер, є спільні чати з друзями. Ті, де ви час від часу ділитеся мемами, новинами та щось обговорюєте.
Я (ну майже я, мене трохи підштовхнули до цієї ідеї) подумав: а що, як це гейміфікувати й налагодити тоненький, але регулярний струмок донатів із таких груп? Механіка проста. Додаєте бота до групи, налаштовуєте, наприклад, запуск щодня о 09:00, і все. Тепер щодня бот випадково обиратиме того, хто донатить сьогодні. Невелика сума від 1 до 100 грн, але щодня. Ще й дружнє змагання, хто більше задонатить.
Для цього проєкту я обрав формат телеграм-бота не випадково. Це ідеальний greenfield: обсяг коду невеликий, і агент може тримати в контексті майже весь проєкт одночасно. Є таке спостереження, що сучасні моделі працюють найкраще, якщо ваш діалог відбувається в перших 40% контекстного вікна. Це так звана Smart Zone.
Зі статті Escaping the Dumbzone
І ми можемо досягти набагато кращих результатів у співпраці з агентами, якщо залишатимемося в цій зоні.
Claude Code vs OpenCode
Усі в захваті від Claude Code, і я теж. Це дійсно потужний інструмент, але він має одну суттєву ваду: ціну. Коли я щойно почав працювати з агентами в терміналі, придумав просте завдання: посортувати файли в папці Downloads, і Claude Code справді це зробив. Але це коштувало мені 2$. Ніби й вигідно, бо я не сортував ці файли роками! А втім 2$ — це 2$. Для pet-проєкту, де бюджет — це твій вільний вечір, хочеться чогось раціональнішого.
Я знайшов альтернативу: OpenCode. Досвід взаємодії та інтерфейс там можна порівняти з Claude Code, а ще є свобода вибору моделей. Оскільки в мене є підписка OpenAI, я просто підключив її до OpenCode й отримав доступ до моделі Codex. Результат мене приємно здивував: агент генерував хороший код. І ще дві переваги. Перша: ти вчишся працювати з одним інструментом і можеш використовувати будь-які моделі, навіть той самий Claude. Друга: усе, що я робив, без проблем вкладалося в ліміти Codex і не коштувало мені нічого, окрім моєї основної підписки.
Починаємо розробку
OpenCode, як і Claude Code, підтримує режим планування, який я рекомендую використовувати для більш-менш складних завдань. Тоді ти спочатку спілкуєшся з моделлю, і ви разом викристалізовуєте скоуп вашої задачі.
Плануємо із OpenCode
Я описав агенту, що хочу зробити. Під час діалогу також сказав, що хочу Node.js, fastify та використовуємо бібліотеку GrammY, з якою мав досвід раніше. OpenCode не просто кинувся писати код, він почав ставити уточнювальні питання.
Наприклад, виявилося, що Telegram API неможливо просто використати, щоб отримати список усіх учасників групи. А я думав, що віддає 🤷 Ось так непомітно ти починаєш вирішувати вже й бізнесові питання. Бо як реалізувати розіграш, не маючи списку «учасників»? Ми дійшли компромісу: бот реєструє в базі тих, хто пише в чат або явно натискає /register. Це навіть краще, адже в розіграші беруть участь лише активні члени групи.
Перша версія була аскетичною: всього два файли — index.js та storage.js, де дані просто серіалізувалися у JSON. Я швидко підняв Cloudflare Tunnel, створив тестову групу, додав бота і... виявив, що все працює! І справді, завдяки агентам це було зроблено швидше, ніж я б вручну просто налаштував новий Node.js-проєкт і перевірив, що він доступний на порту :3000.
Твоя експертиза vs ШІ
Цікавіше стало, коли я почав покращувати бота. Спочатку ми швидко накидали ще функціональність, логіка ставала складнішою, а файл index.js ріс як на дріжджах. Я зрозумів, що потрібно «фіксувати прибуток», а саме додавати тести, щоб те нове, що ми робимо, не ламало «старе».
Агент миттєво зробив рефакторинг, виніс логіку в модулі, щоб їх можна було тестувати ізольовано. Він написав unit-тести, але я хотів і integration-тести.
Тестувати GrammY — завдання з зірочкою. Свого часу, в доагентну еру, я поставив собі те саме питання: як тестувати? Рішення не було, тож я дослідив це сам і навіть зробив open-source приклад саме на цю тему. Яким же було моє здивування, коли OpenCode використав саме цей підхід для інтеграційних тестів. Great minds think alike, подумав я. Проте інтеграційні тести не запустилися «з коробки». Агент почав дебажити сам себе, аналізував логи помилок і за кілька хвилин таки видав робочий варіант.
Я передивився код тестів, і щось впало мені в око, щось виглядало трохи «не так».
const setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((fn, _delay, ...args) => {
if (typeof fn === "function") {
fn(...args);
}
return 0;
});
vi.spyOn(Math, "random").mockReturnValue(0);
Тоді я пішов до Gemini і спитав у цієї моделі про цей шматочок коду: «Analyse this code, is it good?». І Gemini підказав те, що вилетіло в мене з голови: у Vitest є чудовий vi.useFakeTimers(). Я сказав про це OpenCode, той мене швидко похвалив за «глибокі знання» і так само швидко переписав тести, використовуючи кращі практики.
Для мене це гарний приклад того, що все ще важливо стежити за процесом написання коду і продовжувати спиратися на свою експертизу, навіть на свої відчуття. Саме так можна дотиснути ті 20% продукту, які агент не зробить сам. І саме тому все ще важливо мати експертизу й розуміти, що взагалі відбувається, мати чітке уявлення: «а як би зробив я», бо тільки так ми можемо поставити агенту правильні запитання або надати правильні інструкції.
Більше фіч
Після того, як я був задоволений своїм MVP, додав бота до дружнього чату, і ми почали донатити. Також посипався зворотний зв’язок, і я почав імплементувати нові фічі, обробляти нові корнер-кейси й ускладнювати архітектуру бота.
З часом я подумав, що зберігати дані в JSON — це не дуже солідно, бо що буде, коли (ніколи) бота додадуть у 10 000 груп? Стандартне упередження розробника, який пише свій продукт: тобі здається, що він повинен витримувати навантаження, хоча ніякого навантаження зараз немає. Але тут агент проявився з іншого боку і став моїм спаринг-партнером. Ми разом побрейнштормили на тему, чим можна замінити JSON і чи варто це взагалі робити. Разом вирішили, що треба перейти на SQLite.
OpenCode як партнер по брейншторму
І перейшли. Що важливо, агент не тільки переписав усе зі зворотною сумісністю, а й розробив міграцію з JSON до SQLite. Із сучасними агентами код та зміни швидкі й недорогі. Код не коштує нічого, окрім твого часу. Тож було досить зручно додати цю міграцію прямо в код, викликати її на старті сервера, а потім наступним комітом просто видалити.
Десь за тиждень я подумав, що людству варто дати шанс дізнатися про бота, а сам Telegram — не найкраще для цього місце. Тож вирішив створити лендінг. Я зареєстрував домен donationraffle.app і швидко накидав першу версію. Просто сказав агенту, що хочу зробити лендінг для бота, попросив подивитися код бота та зрозуміти, що він уміє, і додав, що хочу використовувати Bulma. Вийшло одразу непогано. Я почав допилювати під свій естетичний смак.
І ось тут я ще раз відчув, що треба бути експертом, щоб отримувати те, що ти хочеш. А я зовсім не експерт у верстці та дизайні, тож коли захотів додати кнопку, яка веде на GitHub, то як не намагався пояснити OpenCode, що хочу бачити її справа зверху, але на одному вертикальному рівні з hero-блоком, не міг отримати бажаний результат. Тут проявив себе Claude Code, про який недарма кажуть, що з дизайном він порається краще. Буквально ті самі промпти дозволили мені перенести кнопку туди, куди я хотів, за пару хвилин.
Намагаюсь пояснити агенту, що я хочу
Хостинг
Окремо хочу коротко поговорити про хостинг. Коли прийшов час хостити бота, щоб він працював 24/7, а не тільки тоді, коли мій лептоп у мережі, я опинився на роздоріжжі. Я знав одну зручну платформу Render, але для стабільного рішення там уже була б потрібна підписка за 19$/міс 📉
Завжди є дешевий Hetzner за 5€, але я не хотів обтяжувати себе менеджментом VPS.
На щастя, друг порекомендував Railway (рефералка). Дуже зручна платформа з оплатою за фактичне використання ресурсів. Платиш буквально за секунди використання, тож виходить дешево. Базово це 5$ на місяць, а перший місяць узагалі безкоштовний. Можна швидко налаштувати деплой із GitHub, під’єднати свій домен. Мої три сервіси та база даних коштують значно менше цієї квоти.
Що я зробив буквально за 10 хвилин:
- Підключив
GitHub-репозиторій. - Налаштував змінні середовища.
- Додав
Volumeдля зберігання файлу бази даних. Це критично дляSQLite, щоб дані не затиралися під час кожного деплою. - Railway сам видав домен із
HTTPS.
Усе, бот онлайн! Ця платформа стала для мене справжнім відкриттям для моїх пет-проєктів, раджу придивитися.
Підсумуймо
Світ розробки змінився. І це справді сталося буквально в останні місяці. Це відбулося саме завдяки стрибку якості CLI-кодинг-агентів. Якщо ви ще не спробували працювати з ними, зробіть це сьогодні. Швидкість та інтенсивність роботи через Claude Code або OpenCode не можна порівняти з використанням агентів в IDE чи просто з чатом із AI. Навіть самі розробники програмного забезпечення це підтверджують і відмовляються від подальшої підтримки IDE-плагінів.
We think it’s no longer the future. We think the sidebar is dead.
Але давайте повернемося до бота! @DonationRaffleBot онлайн, більше прочитати про нього можна на сайті. Звісно, код відкритий, і фіч там уже набагато більше, ніж тільки ті, про які я розповів у статті.
Я знаю, що серед нас багато тих, хто допомагає ЗСУ. Будь ласка, розгляньте можливість підключити бота. Додайте його у свою групу друзів і донатьте потроху, але регулярно. У нашій групі вже зібрали 2978 грн донатів таким чином.
Також буду дуже вдячний, якщо розповісте про бота іншим, можливо, волонтерам. Це новий інструмент і нова механіка, щось нове, що може працювати вже сьогодні. Зворотний зв’язок вітається.
Якщо хочете більше дізнаватися про мій досвід розробки за допомогою агентів та отримувати інші інсайти, підписуйтеся на мій телеграм-канал Поляков Павло: технічне лідерство й не тільки.
Дякую за увагу! Разом переможемо 💙💛
Сподобалась стаття? Підписуйтесь на автора, щоб отримувати сповіщення про нові публікації на пошту.
3 коментарі
Додати коментар Підписатись на коментаріВідписатись від коментарів