Часть I. Хакатон: пятница — утро субботы
Суббота, раннее утро. MS DevCon ещё не проснулся, а Eugen Valuev уже ставит эксперимент. Не торжественный, а почти бытовой: «А давай попробуем вот это». Он показывает коробке эталонный пример — новый навык, которого у коробки ещё нет. Не лекцию, не курс, а один пример. Один канонический образец, в котором всё сделано правильно.
И дальше происходит то, что потом будут пересказывать с недоверием: обучение занимает меньше секунды.
Но «меньше секунды» — это не фокус с исчезновением времени. Это три работы, сжатые в одно мгновение. Первая — реконструкция окружения: коробка воссоздаёт условия, в которых пример работает, — версии, настройки, зависимости, всё, без чего пример — просто текст. Вторая — контрольный прогон на случайных данных: коробка не верит примеру на слово, а проверяет его на данных, которых в примере не было, чтобы убедиться, что навык работает, а не повторяет заученное. Третья — пока ещё в тени, но она уже рядом: уточнение для Registry, о котором будет следующая глава.
Eugen смотрит на секундомер, потом на экран, потом снова на секундомер. На экране — готовый навык, проверенный, воспроизводимый. Он пробует ещё один пример, потруднее. Снова меньше секунды. Ещё один — из другой области, где, казалось бы, нужен опыт. Снова меньше секунды, снова реконструкция, снова контрольный прогон, снова случайные данные.
— Это же читерство, — говорит кто-то, кто подошёл посмотреть. Голос не злой, скорее растерянный. — Нет, — отвечает Eugen спокойно. — Читерство — это когда ты пропускаешь проверку. А здесь проверка внутри. Просто она очень быстрая.
И это ключевая реплика. Скорость здесь — не отказ от тщательности, а её следствие. Каскад, обученный на различиях, не перебирает всё подряд: он сразу видит, что в новом примере отличается от уже известных, и учится только этому отличию. Навигация Rewards показывает, где он находится, план Learning показывает, куда встраивается новый навык. Поэтому секунда — это не спешка, а точность. Медленно учится тот, кто не знает, что именно ему нужно выучить.
К завтраку субботы у коробки уже целая полка новых навыков, каждый — меньше чем за секунду, каждый — с контрольным прогоном. Eugen пьёт кофе и думает не о скорости, а о том, что теперь делать с освободившимся временем. Ответ придёт скоро: тратить его на то, что машинам не отдашь, — на выбор, на спор, на предложение.
Скорость языка — это не скорость речи, а скорость понимания.
В обычном диалоге мы путаем быстроту с поверхностностью: кто говорит быстрее, тот, кажется, меньше думает. Но в языке клиента и устройств всё наоборот. Быстрое понимание — признак того, что собеседники уже договорились о главном: о контексте, о критериях проверки, о том, что считается доказательством. Когда контекст общий, не нужно каждый раз объяснять всё с нуля. Достаточно указать на различие — и собеседник достраивает остальное.
Поэтому «меньше секунды» в истории Eugen — это языковое событие, а не спортивное достижение. Коробка понимает новый навык за секунду, потому что у неё уже есть язык для его описания: реконструкция окружения говорит «вот в каких условиях это работает», контрольный прогон на случайных данных говорит «вот доказательство, что это работает не только на примере», а каскад, обученный diff-based, говорит «вот чем это отличается от уже известного». Три высказывания — и навык усвоен. Без любого из них секунда превратилась бы либо в зубрёжку, либо в самообман.
Отсюда урок: хороший диалог экономит не время, а объяснения. Клиент не должен каждый раз пересказывать весь мир, чтобы устройство его поняло. Устройство не должно каждый раз притворяться, что поняло, не проверив себя на случайных данных. Когда обе стороны соблюдают этот договор, язык становится быстрым — не потому, что все торопятся, а потому, что никто не тратит слова зря.
И ещё одно следствие, важное для всей книги: освободившееся время — не пустота, а ресурс. Когда навык усваивается за секунду, у человека появляется время на то, что нельзя автоматизировать: на вопрос «а стоит ли это делать вообще?» Именно этот вопрос и поведёт историю дальше — к суверенному ядру, к спору с YAPL, к Indra Proposal.
Отдельно стоит отметить роль случайных данных в этой секунде. Контрольный прогон на тех же данных, что и в примере, ничего бы не доказал: это было бы повторение, а не проверка. Случайные данные — это новые собеседники, которых пример не готовил заранее. Если навык выдерживает встречу с ними, значит, он усвоен как правило, а не как цитата. Если не выдерживает, каскад тут же видит различие между ожидаемым и полученным — и учится уже на нём. Поэтому секунда у Eugen — это не один прогон, а прогон плюс столкновение с неизвестным, и именно столкновение делает скорость заслуживающей доверия.
Вспомните навык, который вы осваивали долго: язык, инструмент, программу. Что именно занимало время: само действие или восстановление контекста? Сколько раз вы теряли время на то, что забыли окружение — версии, настройки, исходные условия, — и начинали с нуля?
Теперь возьмите один маленький навык, который вы хотели бы освоить, и опишите его как Eugen описывал бы его коробке: 1) эталонный пример — один образец, где всё сделано правильно; 2) окружение — условия, без которых пример не работает; 3) контрольный прогон — как вы проверите навык на новых, случайных данных, а не только на примере. Если третий пункт отсутствует — придумайте его. Без него вы не учитесь, а повторяете.
Затем задайте себе вопрос: что в вашем описании — лишнее, а чего не хватает для того, чтобы другой человек понял навык с первого раза, без переспросов? Вычеркните лишнее, добавьте недостающее. Вы только что проделали то, что каскад делает за секунду: выделили различие между «я повторяю» и «я понимаю».
Почему обучение новому навыку у Eugen занимает меньше секунды, но при этом не является ни читерством, ни поверхностной зубрёжкой, — какие три работы внутри этой секунды делают скорость честной?