Стендап Сьогодні

Що я зробив, що я хочу зробити, і що це все значить.
Повсякденні здобутки в форматі стендапу.
Детальніше в статті

Підписатись на RSS
📢 Канал в Telegram @stendap_sogodni
🦣 @stendap_sogodni@shevtsov.me в Федиверсі

15.01.2026

Розширення можливостей помічника ШІ засобами MCP

Нарешті я дістався до MCP. Довгий час вІдкладав, бо це виглядало достатньо складно. Плюс, мені більш-менш вистачало того, що агент здатний досягнути з одними лише командами оболонки. Але, підійшов вдалий момент.

Для тих, хто не знає, MCP (Model Context Protocol) - це спосіб дати агенту ШІ нові інструменти. Типовий агент з коробки вміє редагувати файли, виконувати команди оболонки та шукати в інтернеті. А шляхом MCP до нього можна додати буквально будь-які функції.

Для того нам потрібний сервер MCP. Це допоміжна програма, яка спілкується з оболонкою агента пакетами JSON. Оболонка запускає сервер, забирає з нього набір доступних дій, та робить доступними для агентів. А коли агент звертається до певної дії, передає команди сервера MCP та той їх виконує. Сервер MCP є звичайною програмою та отримує доступ до локальних ресурсів — наприклад, може прочитати файл конфігурації. Також сервер запускається надовго, а значить, може мати власний стан — чи навіть підключення до інших сервісів.

Все це звучить помірно цікаво, якщо мова йде про загальні MCP. Ну може, такий, що вміє надсилати пошту. Ще й з чужим кодом всередині.

Але ось моя головна думка тут: не обовʼязково шукати чийсь незрозумілий MCP. Ти завжди можеш згенерувати собі свій, під конкретні обставини та задачі. Так, я відразу кажу “згенерувати”, а не “написати”, бо писати власноруч сенсу мало. А агент цілком здатний згенерувати MCP за твоїми вимогами.

Мій приклад такий: хотілося мати консоль Rails на стейджингу. Тоді значно спрощується перевірка невидимих частин логіки, бо агент може це робити власноруч. (Ба більше, оскільки він знає код проєкту, то що писати в консоль, теж добре розуміє.) Отже, згенерував MCP, який і знає, як на стейджинг потрапити, і де взяти ключі. Зручно надзвичайно.


14.01.2026

Google BigQuery

Я взагалі не люблю Google Cloud. В них все не як у людей. Але якщо є причина користуватися Google Cloud, то це буде BigQuery.

BigQuery - це база даних OLAP. Не потребує розгортування, тобто доступна як сервіс. Легка на підйом та безрозмірна. Заливаєш туди дані, робиш запити. Працює все швидко навіть на терабайтах даних.

Тут, мабуть, ще відступлю та скажу, що таке база даних OLAP. Така база спроєктована для виконання рідких складних запитів на великих обсягах даних. В протилежність базам OLTP - з якими звикли мати справу розробники — як PostgreSQL чи MySQL тощо. Важливо розуміти, що в базах OLAP завжди закладена “стартова ціна” та навіть на маленьких обсягах вони будуть дорожче та повільніше. Якщо база OLTP здатна грати роль OLAP, поки даних мало, то навпаки не вийде.

В BigQuery легко збирати дані — власне, для OLAP-бази це необхідність. Я навіть писав конектор через gRPC. Але того робити не обовʼязково — є купа вбудованих рішень — наприклад, через Cloud Storage. Або з журналів, звісно.

Зверху BQ є Looker Studio - платформа для звітів та графіків. Наші аналітики від всього цього в захваті. А інженерам важливо знати, чого хочуть аналітики.

Головний недолік BigQuery, для мене — це навіть не сама ціна, а те, що вона привʼязана до обʼєму оброблених даних. Та можна легко пробити дно навіть простим запитом, якщо він достатньо широко бере. Треба бути обережним.


13.01.2026

Вайб-видалення коду

Що, думаєте, LLM здатні тільки генерувати код? Поганий, брудний, зайвий код?

А якщо я скажу, що сьогодні видалив понад 1000 рядків коду — повністю через Cursor? Власноруч не видалив жодного рядка! Просто написав запит, зачинив очі, та — код зник!

Йдеться про певну застарілу функціональність, яка знята з використання ще три роки тому. Але видалити не було нагоди, бо ця тисяча рядків коду розкидана по багатьох частинах та шарах застосунку. Досі вона сиділа та чекала, поки в когось зʼявиться зайвий день, щоб її вичистити. (А не зʼявиться він ніколи.)

Аж от сьогодні робив подальший рефакторинг, та помітив, що зачіпляю цей застарілий код. Тож відклав поточну задачу та запустив агента на видалення.

Агент все знайшов за лічені хвилини. Причому це ж Rails, тому рядки треба шукати як BlueMoon, так і blue_moon, а на фронтенді ще й redMoon - бо функціональність колись перейменували. І тести вичистив. І маршрути. І всі згадки в інших моделях. Ще й Rubocop заспокоїв.

(До речі: що стосується Rubocop та інших інструментів, то я роблю так: запускаю, та якщо щось йде не так — виділяю весь вихід комбінацією Cmd+Shift+Up та надсилаю агенту: Cmd+L. Нехай розбирається.)

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


12.01.2026

Реверс-інжинірінг власної мети

Початок року — традиційний час, коли люди думають про майбутнє та ставлять цілі. Потім про них забувають, бо цілі надто розбігаються з реальністю.

Адже в реальності в нас і так завжди є певна мета. Тут, як на мене, важливо розрізняти мету політичну та фактичну. Перша — те, що ми проголошуємо назовні. Друга — керує нашим життям.

Тому, ось ідея. Замість того щоб шукати оту високу політичну (чи поетичну?) мету — знайти у своєму звичайному житті мету фактичну. Прийняти її. Та спробувати рухатися за цією метою, тільки вже свідомо.

Ну, наприклад, непогана мета - “забезпечувати сімʼю” чи “бути корисним на роботі”. Може, воно не так яскраво звучить, але в усвідомленні таких речей зʼявляється особиста свобода — далі ти їх робиш, бо ти хочеш, а не тому, що від тебе хочуть.

Втім, піти в спортзал та добре харчуватись теж завжди вчасно.

А ще на цю тему є комікс.


09.01.2026

Не люблю додавати сервіси

Знаєте, я колись грався в мікросервіси. Один раз. Вистачило.

Зараз в мене сувора нелюбов до створення сервісів. Нехай буде не так красиво, зате ефективно.

Та й де там красиво. Красиво — це поки не вглядаєшся. Та не думаєш про ціну розділення.

Інфраструктура — це найдорожче, що є. Мало того що буквально доведеться за неї платити. Але також підтримувати доведеться більше. Розгортування налаштовувати. Моніторинг. Забезпечити надійність.

Та й в коді ще один застосунок — теж ціна. Бо тепер доведеться окремо стежити за стилем. Повторювати базові речі. Оновлювати залежності.

А тепер ще й комунікувати з додатковим сервісом буде складніше. Треба API робити. Злагоджувати. Спрощувати інтерфейс: ніякого спільного стану, ніяких замикань.

Тому мені завжди хочеться обійтися мінімумом сервісів. Одним? Та ні, можна взагалі не робити власних сервісів та взяти щось на кшталт Firebase. Оце так!


08.01.2026

2 помилки в наступних діях у GTD

Сьогодні пощастило цілий день сидіти без світла. На роботі взяв вихідний, відкрив контекст “Вдома”, та поробив з нього все, що міг. Така вона, сила контекстів! (А також — обмеження часу за компʼютером.)

Отже, розповім про дві помилки в наступних діях, які мені часто допікають.

Нумер перший: дії ““розпланувати Х” чи “подумати над Y”. Коли не зрозуміло, як розпочати певний проєкт, кортить записати щось подібне та перестрибнути далі. Тільки таким діям бракує конкретики; а як ми знаємо, де немає конкретики на момент розбору — там ми будемо буксувати під час виконання.

Незрозумілості можуть бути на різному рівні. Може, сам проєкт недостатньо визначений чи ми погано про нього знаємо. Тоді допоможе щось як “Сформулювати 5 критеріїв успіху Х.” Або “Записати постановку задачі Y одним параграфом.” Допоможуть питання для продумування проєктів.

А може, задача ясна, але ти ніколи такого не робив та не вмієш. Тоді можна “Спитати в А, як він робив Х.” Чи “Знайти книжку про Y”. Чи, в наші часи, звернутися до LLM та розблокувати себе за мить.

Нумер другий: дії, для яких ніколи не буде часу. Типовий приклад — географічні дії: “відвідати таке-то місце”. Якщо воно не розташоване на звичному маршруті, то така дія — це цілий прихований проєкт з власним плануванням.

Отже, розмотуємо: напевно, відвідання треба запланувати, тобто записати в календар. Можемо визначитися та зробити це зараз? Чудово. Не можемо? Може треба домовитись з кимось? Або чого чекаємо? Тобто, за GTD, що запишемо в список очікування? Нічого конкретного, просто не хочеться зараз робити? То що, проєкт пересувається до мабуть/колись? От і зʼясували.

Взагалі треба бути готовим до того, що ефективним наступним діям вчишся поступово, тож нічого дивного, що спочатку будеш наче все робити за правилами, а тертя в системі залишиться.

Нагадую, що в суботу 10.1 о 16:00 за Києвом буде воркшоп з усієї цієї історії з GTD, а доєднатися до нього можна через Patreon.


07.01.2026

Проблема гуркітливого табуна

(Як звучить, га? Thundering herd, може, чули.)

Так називається ситуація, де багато споживачів одночасно звертаються до одного обмеженого ресурсу.

Певно, найтиповіший випадок — одночасний старт багатьох копій сервісу. Та, припустимо, цей сервіс зчитує з бази складну конфігурацію. Якщо сервіс один, все проходить непомітно. Але з декількома копіями база несподівано лягає. Під копитами гуркітливого табуна.

А якщо ви покладете конфігурацію в кеш, проблема не те щоб зникає. Бо все одно всі звернуться до бази, аж поки перший запит не завершиться та в кеші не зʼявиться значення. Так само буде й після вичерпання терміну придатності кешу.

Інший приклад: класична помилка планувати повторювані задачі на початок дня чи години. Чітко на нуль хвилин. Таке призводить до раптового вичерпання ресурсів системи. (Зокрема, поштові сервіси отримують пікове навантаження саме в рокові нульові хвилини.)

Порятунок від гуркітливого табуна, зазвичай, це розосередження викликів. Впровадження маленької випадкової розбіжності: 1 min + rand(5) s. Уникнення монотонності. Словами Франка Герберта, walk without rhythm and it won’t attract the worm.

Є й інший, значно складніший вихід. Але він допоможе, коли виклики відбуваються непередбачувано. Це згортання запитів (request coalescing або request collapsing.) Власне, потрібний посередник, який буде відстежувати однакові та одночасні запити, робити лише один, та роздавати результат усім. Наприклад, цим може займатися nginx з директивою proxy_cache_lock.


06.01.2026

OmniWOPE - тепер в Discord

На новорічних канікулах додав можливість виводити в Discord до OmniWOPE - мого рішення для кроспостингу.

Хотів ще до Patreon постити, але там, несподівано, не знайшлося для цього API. Постити можна тільки вручну. Ну, нічого не поробиш.

А в Discord все достатньо просто — є JSON API. Ним можна створювати пости із форматуванням, які чудово лягають під мій контент. Щоправда, доведеться кожному користувачу створити для себе застосунок та бота — адже запускається скрипт на їхньому компʼютері. Ну але то таке, розвага на один раз.

Звісно, ще простіше було реалізувати все через LLM, бо я практично не писав коду сам. Поточний підхід — ретельно пропрацювати план в Markdown, а потім запускати на виконання. (Це 100% тема для майбутнього воркшопу.) Причому LLM здатна пропрацювати всі аспекти — і дослідження, і тестування, і написання інструкції.

З цікавих моментів була ідентифікація каналу. Спочатку я збирався вказувати в конфігурації назву каналу. Бо ID каналу в UI ніде не світиться. Але назви недостатньо без ID спільноти (яка в API називається guild, до речі.) Тому знайшов прямий та в ретроспективі очевидний підхід: з каналу легко скопіювати посилання для поширення; це посилання і містить ID як каналу, так і гільдії. Люблю, коли URL дійсно є Універсальним Локатором Ресурсу, а не чимсь там іншим.

Хотілося б ще додати вихід у поштову розсилку. Може, навіть через Mailtrap.


05.01.2026

Страх, лінь та уникнення проєктів

Одна з ключових думок у GTD - те, що замість списку задач в нас зʼявляється окремий список проєктів та список наступних дій. Різниця в тому, що класичний список задач часто містить недодумані пункти, які неможливо виконати: або вони надто складні, або є невиконані та неявні передумови.

За GTD ми таку задачу перетравлюємо та окреслюємо двома протилежними точками: проєкт — це віха майбутньої мети, а наступна дія — це те, що ми можемо фізично виконати вже зараз. Та, нормативно такий підхід застосовується до кожної задачі, що перед нами стоїть.

Але. Завжди зʼявляються дрібні задачки, які ну неначе ніяк не потребують стільки церемонії. До того ж поняття проєкту в мене досі несе відчутну ментальну вагу, бо з одномоментної “задачки” набуває тривалість та місце в житті.

Тож я регулярно записую такі задачки в щоденний списочок, а не в систему. Деякі з них дійсно робляться швидко. А от інші застряють на багато днів. Починаєш думати реактивно, “треба сьогодні вже взятися і записатися на мийку”. Та не помічаєш, що це буквально першопричина практики GTD! Адже на мийку я не записуюсь, бо улюблена закрилася, а іншу ще треба обрати! Не можу я “записатися на мийку”, скільки б не розставляв пріоритети.

Вихід тут такий: до списку дрібних задач ставитися, як до списку наступних дій. Буквально. Якщо під час розбору задача дійсно складається з однієї фізичної дії — то чом би й ні, нехай буде. А як зʼявився “відрізок проєкту” - то прийми, що в тебе вже є складна задача — не в GTD, а в обʼєктивній реальності, та найкоротший шлях до її виконання — це розібрати, покласти у відповідні списки… та рухатись!


29.12.2025

Розкласти по фактах

Ще раз дякую за тему пану Степану.

В IT існує певний культ фактів. Де факти — там правда. Розмова про факти набуває академічної ваги. Люди, які оперують тими фактами — видаються неемоційними, неупередженими, та вартими довіри. Проблема в тому, що часто це тільки прикриття.

Інколи людина вже обрала рішення, та хоче, щоб його прийняли. Але асертивно сказати “я хочу зробити так і так” не вміє. Тоді факти стають маніпуляцією. Їх обирають так, щоб рішення було привабливим. Ключовим тут є те, що рішення вже обране. Та часто цей вибір обґрунтований зовсім іншими факторами — насамперед власними уподобаннями та досвідом.

Коли є двоє з суперечливими рішеннями — починається ще й боротьба фактами-маніпуляціями. Хто краще подасть факти — той і переможе. Це може виглядати, як чесний аналіз — втім, оскільки всі рішення вже обрані, факти не змінять нічию думку, а лише здатні задавити її.

Насправді коли рішення немає та впевненості немає, може трапитись ще гірше — факти служать прикриттям до цієї невпевненості. Я особисто ненавиджу приймати рішення суто по фактах. Мені треба, щоб я відчував, що роблю правильно. Та, звісно, факти можуть допомогти набути це відчуття. Але поки я дивлюся на варіанти та бачу про них тільки факти — обирати рано.

🎄 А зараз я йду в новорічну відпустку. Наступний пост буде 5 січня. З прийдешнім Новим роком вас! 🎅