Мені була потрібна Jira. Я відкрив сторінку з цінами, прикинув вартість для своєї маленької команди і закрив вкладку. Бюджет був нульовий — не «піду спитаю у фінансистів», а буквально нуль. І я зробив єдине, що робить упертий джун, коли не може купити потрібний інструмент: відкрив VS Code і вирішив зібрати клон Jira на React і Firebase з нульовим бюджетом — за одні вихідні, майже на чистій упертості.
Це була не Jira. І ніколи б нею не стала. Але вона була моя, і команда користувалася нею кілька місяців.
Стек, який не коштував нічого
Firebase дав мені бекенд без бекенду. Real-time-база, автентифікація, хостинг — усе на безкоштовному тарифі. React відповідав за інтерфейс. Ось і вся архітектура: жодних серверів, які треба піднімати, жодного рахунку в кінці місяця, деплой — безкоштовно. Для джуна без бюджету Firebase — великий зрівнювач. Ти отримуєш real-time-дані та auth, не написавши ні рядка бекенду і не заплативши за жодну VM, а сили витрачаєш на те, що справді важливо, — на продукт.
Drag-and-drop мене мало не вбив
Здається, що перетягнути картку з «To Do» до «In Progress» — тривіально. Поки не сядеш це писати. Стан має оновитися одразу у трьох місцях: колонка-джерело, колонка-приймач і саме поле статусу задачі. Помились із порядком — картки дублюються. Помились сильніше — зникають у порожнечу між двома рендерами, наче їх і не було.
Я вбив на цю одну фічу цілі вихідні. Переписував чотири рази. Перша версія воювала з рендер-циклом React. Друга гналася за підтвердженням запису в Firebase і мерехтіла на кожному дропі. Третя нарешті пояснила мені, навіщо потрібні оптимістичні апдейти: рухаєш картку в UI миттєво, звіряєшся з базою потім, а якщо запис впав — відкочуєш. Четверта просто запрацювала. Без дублів, без привидів, без карток, що падають у безодню.
Real-time-синхронізація та ролі
Коли дошка почала поводитися пристойно, решта пішла швидко. Задачі з пріоритетами та дедлайнами. Три колонки — To Do, In Progress, Done. Real-time-слухачі Firebase дозволяли двом рухати картки одночасно, не наступаючи одне одному на ноги: зміна з мого екрана з'являлася в колеги менш ніж за секунду. Додав автентифікацію Firebase з ролями, щоб не кожен міг знести всю дошку одним невдалим кліком. Справжній інструмент. Мій інструмент.
Різниця в тому, що залежиш від нього сам
Є особливе відчуття, коли збираєш інструмент, яким сам користуєшся. Кожен баг дратує особисто тебе. Кожна відсутня фіча — те, що ти реально помічаєш, бо впираєшся в неї у вівторок вранці, намагаючись зробити нормальну роботу. Ця злість робить тебе кращим інженером, ніж будь-який туторіал. Ти не викочуєш happy path і не йдеш — ти лагодиш те, що тебе бісить, бо тобі з цим жити завтра.
Чому це сильніше за туторіал на співбесіді
Найкращий проєкт у портфоліо — не туторіал, який ти пройшов до кінця. Це те, що було потрібно настільки, що ти зібрав це сам. На співбесіді ти говориш про справжні рішення: чому real-time-база, а не REST-полінг, навіщо оптимістичні апдейти, як обробляєш запис, що впав на півдорозі. Це твої рішення, а не туторіальні. Така історія звучить зовсім інакше, і будь-який тямущий інженер чує різницю секунд за тридцять.
Чого це мене насправді навчило
Кожна фіча навчила мене того, чого Jira не навчила б ніколи. Управління станом у React перестало бути концепцією і стало війною, яку я вів на кожному кліку. Real-time-бази поводяться так, як жоден REST-туторіал тебе не готує. Потоки автентифікації, доступ за ролями, UX перетягування — я вивчив усе це, бо продукт ламався, доки я не розберуся. Десять років потому я досі спираюся на інстинкти, зібрані за ті вихідні.
Тож: не можеш оплатити інструмент? Збери його. Саме так і з'являються інженери. Нульовий бюджет, одні вихідні, інструмент, яким я реально продовжив користуватися, — упертість один із найбільш недооцінених навичок в інженерії, і його не пишуть у вакансіях.