1. Чому в коді немає кнопки Save/Load, як у іграх
Тьома кілька секунд думає й пише Льосі. І перше, що він видає, — навіть не питання, а обурене спостереження: те саме, що він за пів хвилини до цього сам намацав:
— Слухай, я не розумію одного. От я в будь-якій нормальній грі що роблю перед складним босом? Зберігаюся. Поліз у бій, помер — завантажився, наче й не вмирав. Одна кнопка. А з кодом я сиджу й плоджу папки вручну, як печерна людина. Чому в коді немає такого самого Save/Load?
Льоха явно задоволений питанням.
— А ти молодець, що сам до цього дійшов. Бо питання — в саме яблучко. Дивись, що таке сейв у грі? Це зафіксований стан, до якого ти можеш повернутися будь-коли. Запамʼятав, як було добре, — і відкотишся до цього «добре».
Він розвиває думку далі:
— А тепер головне. У коді точно так само бувають стани. От проєкт працював. От ти щось додав — інший стан. От зламав — третій. От полагодив — четвертий. Робота над кодом — це не одна точка, а низка станів, один за одним. І до вдалих хочеться вміти повертатися так само, як до сейву перед босом. Твої папки final2 — це й є спроба зробити сейви. Крива, але спроба.
— Стоп, — Тьома перебиває, бо в нього в голові щось нарешті складається. — Тобто я не ідіот, який навіщось плодить папки? Я насправді намагався зробити сейви для коду, тільки вручну й через одне місце?
— Саме так, — киває Льоха. — Потреба в тебе абсолютно правильна. Ти нутром відчув, що код проходить через стани і до вдалих треба вміти повертатися. Це інстинкт хорошого розробника. Кривим у тебе був лише спосіб — папки. А сама ідея — золото.
— Тобто лагодити треба не мене, а інструмент, — повільно промовляє Тьома. І сам чує, як це звучить: не «я тупий новачок», а «я взяв невдалий інструмент». Різниця величезна.
— От тепер ти зрозумів, — відповідає Льоха. — А інструмент — річ наживна.
2. Три біди копіювання папок
— Окей, потреба нормальна — це я й так знав, — Тьома відкидається, задоволений собою. — Але чим саме погані папки? Ну, настворював десяток, ну лежать. Подумаєш, бардак. Розгріб би за пʼять хвилин, якби треба було.
— Трьома речами, і кожна тебе сьогодні вкусила, — Льоха загинає по пунктах. — Перше: плутанина. Через тиждень ти вже не памʼятаєш, яка версія свіжа. От сьогодні ти відкрив final2, а там старе. Друге: не видно, що змінювалося. Дивишся на final і final2, а чим вони відрізняються — хоч трісни, не скажеш: назва нічого не говорить. Третє: захаращення. Десять повних копій проєкту жеруть місце й засмічують тобі екран.
І він підбирає образ, щоб стало зовсім ясно:
— Уяви, що в грі ти зберігався б не кнопкою, а щоразу копіював би весь диск цілком. Усю гру, з усіма файлами, в нову купу. Перед босом — копія диска. Після бою — ще одна копія. Через місяць у тебе сто копій диска, звалених у кутку, і спробуй розберися, в якій із них той самий сейв. Нісенітниця, правда? А з папками коду ти робиш саме це.
Тьома морщиться — упізнав себе надто точно.
— Тобто мені потрібне не «ще акуратніше розкладати папки». Мені потрібен зовсім інший механізм. Нормальна історія станів, а не склад копій.
— Сам сказав. І хороша новина: такий механізм є, і не один. З найпростішим познайомишся вже сьогодні.
3. Розбиваємо задачу на безпечні кроки
— Льохо, я готовий зараз вислухати будь-яку твою лекцію, — перебиває Тьома. — Тільки давай не про 2048. У мене від неї вже око сіпається. Я сьогодні разів двадцять переглядав код у різних папках. Доводилося навіть грати в них, щоб згадати, що саме робить гра в кожній окремій папці.
— Хочеш чогось складнішого? — радіє Льоха.
— Ні, дякую. Давай щось цікавіше. О, Тетріс хочу, — каже він. — Але ж він складніший. Там і падіння, і повороти, і швидкість, і лінії збираються. Якщо 2048 створила такий хаос, то Тетріс — удвічі більший. Ламати не варто.
— Ось тут пригальмуй, — Льоха ловить момент. — Якщо ти боїшся зламати все цілком, давай і не будемо робити все цілком. Велику річ не ліплять одним махом. Її розбивають на кроки. Дивись, як Тетріс лягає на сходинки.
Він розкладає створення Тетріса за порядком:
1. спочатку — просто стакан і одна фігура, що падає
2. потім — повороти фігур
3. потім — зникають заповнені лінії, ведеться підрахунок очок
4. потім — прискорення, ефекти, звук, теми
— Бачиш, що ми отримали? — продовжує Льоха. — Кожен завершений крок — це робочий стан. Природна точка збереження. Зібрав стакан із падінням, перевірив, що працює, — ось тобі й сейв. Поліз на наступний крок, накосячив із поворотами — відкотився до попереднього робочого. І ризик завжди маленький: ти втрачаєш не весь Тетріс, а лише один крок.
— А чому просто не зробити все одразу, а потім, якщо знадобиться, відкотити? — Тьома здогадується, куди веде Льоха, і пробує викрутитися.
— Гарне питання, і ось у чому підступ, — Льоха не відмахується. — Якщо ти навалив усе одним шматком і воно зламалося, відкочуєш увесь шматок — і добре, і погане разом. Пів дня роботи коту під хвіст. А якщо йшов маленькими кроками — відкочуєш лише останній невдалий крок, а все, що зібрав до нього, лишається цілим. Декомпозиція та відкат — це не різні речі, а команда: маленькі кроки роблять відкат дешевим. Чим дрібніший крок, тим менше ти втрачаєш, коли відкочуєшся назад.
— Це і є твоя «нормальна історія станів» у дії, — додає він. — Сам прийом називається декомпозиція — розбити велику задачу на маленькі безпечні шматочки. Сам по собі він корисний, а з ШІ-агентом — особливо: йому набагато легше добре виконати один зрозумілий крок, ніж одразу весь Тетріс від початку до кінця. Велику задачу він майже напевно десь зімне, а маленьку — витягне чисто.
Тьома вже бачить майбутнє ТЗ: не «зробіть мені Тетріс», а драбинка з кроків, і на кожній сходинці можна зупинитися й не впасти вниз. Але йому мало.
— Декомпозиція — це зрозуміло й круто. Але мені все одно потрібна сама кнопка. Та, що замінить мій зоопарк папок. Щоб відкотився — і кривих правок наче й не було.
— Буде тобі кнопка, — обіцяє Льоха. — Але спочатку покажу, як це влаштовано у професіоналів. Щоб ти розумів, куди твоя кнопка взагалі вбудована.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ