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