Демонстрация: показать решение за пять минут
Зачем это нужно
Репозиторий в порядке, проект собирается из чистого клона. Осталось показать — и это отдельный навык, которому обычно не учат вовсе.
Показ идёт на волнении, на чужом времени и часто на чужом компьютере. Работает всё то, что подготовлено заранее, и разваливается всё, что делается «по ходу». Хорошая новость: подготовка занимает полчаса и почти целиком состоит из одного приёма — скрипта демонстрации.
Эта глава — про то, как построить пять минут показа, чем скрипт лучше кликов и какая ошибка в самом скрипте чуть не увела показ в неправильную сторону. Пример — тот самый dApp зачётки из блока про Waves, прогнанный вживую.
Пять минут: что за чем
Первые тридцать секунд — что за задача и что получилось. Одно предложение. Не история про то, как вы выбирали технологию, не список того, что не успели, — просто: «модуль ведёт зачётные книжки в блокчейне, оценки нельзя подделать задним числом, вот как это работает».
Следующие полторы минуты — главный путь целиком. От пустого состояния до результата, без объяснений по дороге. Эксперт должен увидеть, что работает, раньше, чем услышит, как устроено.
Минута — что защищено. Показать отказ. Ввести неверные данные, попробовать чужой доступ, нарушить правило. Работающая защита — это то, что отличает готовый модуль от заготовки, и сама она в глаза не бросается: её надо продемонстрировать намеренно.
Минута — как устроено. Два-три решения и почему так, а не иначе. Не архитектура целиком, а места, где вы приняли решение.
Минута — вопросы. Оставить её намеренно. Вопросы — часть показа, а не досадное дополнение: по ответам видно, понимаете ли вы собственный код.
Самая частая ошибка — тратить первые две минуты на «сначала я расскажу, как всё устроено». К моменту, когда доходит до показа, время кончилось, и эксперт так и не увидел, что решение работает.
Скрипт демонстрации
Главный приём — написать программу, которая проходит весь путь сама, с подписанными шагами:
const shag = (n, t) => console.log(`\n[${n}/4] ${t}`);
shag(1, 'сеть жива');
const h = await api('/blocks/height');
console.log(' высота цепочки:', h.body.height);
shag(2, 'приложение установлено');
const si = await api('/addresses/scriptInfo/' + DAPP);
console.log(' адрес:', DAPP);
console.log(' функции и их стоимость:', JSON.stringify(si.body.callableComplexities));
Живой прогон целиком:
[1/4] сеть жива
высота цепочки: 486
[2/4] приложение установлено
адрес: 3M52rTnLTitKusqJ9JCtJs4JCiptN9Yq4RX
функции и их стоимость: {"zavesti":19,"postavit":18}
[3/4] заводим зачётку и ставим оценку
заведена, блок 486
оценка поставлена, блок 486
[4/4] проверка защиты: балл вне диапазона
отказано: Ball vne diapazona 2..5
итоговое состояние: {"key":"z_z-demo-2_ball","type":"integer","value":5}
Двадцать секунд — и показан весь модуль: сеть, приложение, главный путь и работающая защита. Всё это время можно говорить, а не кликать.
Идентификатор в примере берётся из аргумента командной строки: node demo.cjs 2. Это важнее, чем кажется. Демонстрация, которую нельзя прогнать дважды подряд, на показе обязательно споткнётся о следы предыдущего запуска — а объяснять эксперту, почему «уже заведена», придётся вам.
Скрипт тоже может соврать
Вот настоящий случай из подготовки этой главы. Первая версия скрипта на четвёртом шаге напечатала:
[4/4] проверка защиты: балл вне диапазона
ПРОШЛО — это ошибка!
Паника на ровном месте: защита якобы не работает. А посмотрели итоговое состояние — там по-прежнему 5. Сеть отказала правильно; ошибка была в самом скрипте:
try { await broadcast(t3); console.log(' ПРОШЛО — это ошибка!'); }
catch (e) { console.log(' отказано:', …); }
Функция broadcast в этом проекте не бросает исключение, а возвращает пару из кода и тела ответа. Ветка catch не срабатывала никогда. Правильно так:
const r3 = await broadcast(t3);
if (r3.status === 200) {
console.error(' ПРОШЛО — защита не работает!');
process.exitCode = 1;
} else {
console.log(' отказано:', String(r3.body.message).split(': ').slice(-1)[0]);
}
[4/4] проверка защиты: балл вне диапазона
отказано: Ball vne diapazona 2..5
Отсюда два вывода. Первый: прогонять скрипт до показа обязательно — он ловит ошибки в себе самом. Второй: в скрипте демонстрации нужен process.exitCode = 1 на неудаче. Иначе «зелёный» вывод ничего не гарантирует, а именно на него вы и будете смотреть.
Что подготовить заранее
| Что | Зачем |
|---|---|
| Скрипт демонстрации | Пройти весь путь одной командой |
| Два прогона подряд до показа | Проверить, что второй раз тоже работает |
| Окно терминала с крупным шрифтом | Эксперт читает с расстояния |
| Заготовленные данные | Не набирать длинные адреса руками при всех |
| Открытый нужный файл | Одно окно редактора, а не двадцать вкладок |
| Ответ на «что бы вы улучшили» | Этот вопрос задают почти всегда |
Крупный шрифт — не мелочь. На показе смотрят на экран сбоку и с расстояния, и шрифт, удобный вам, эксперту не читается. Проверяется это за пять секунд: отойти от монитора на два шага.
Как отвечать на вопросы
«Почему выбрали именно это?» Назвать альтернативу и причину отказа от неё. «Взял состояние аккаунта, а не отдельный токен на каждую зачётку: токен стоит 1 WAVES за штуку, а запись — 0,001».
«А если сделать вот так?» Если предложение лучше — так и сказать. Признать хорошее решение — не потеря, а показатель того, что вы понимаете область.
«Что не успели?» Назвать честно и коротко, без оправданий, и сразу — что было бы следующим шагом.
«Не знаю». Законный ответ, если за ним идёт «но проверил бы так-то». Выдуманный ответ распознаётся мгновенно и стоит дороже незнания.
Вопросы почти всегда про границы: что будет при пустом вводе, при двух одновременных запросах, при отказе сети. Если вы прошли главы про недетерминизм, конфликты версий и проверки платежей — половина ответов у вас уже есть.
Типичные ошибки
Ошибка 1. Начинать с архитектуры.
Время кончится раньше, чем эксперт увидит работающее решение.
Ошибка 2. Кликать руками.
Забытый шаг, оставшееся состояние, невозможность говорить и кликать одновременно.
Ошибка 3. Не прогнать скрипт заранее.
Разобрано выше: ошибка бывает и в самом скрипте.
Ошибка 4. Показывать код вместо результата.
Код эксперт прочитает сам и внимательнее вас. Показ — про поведение.
Ошибка 5. Оправдываться.
«Тут не успел», «тут костыль», «вообще-то я хотел» — каждая такая фраза обращает внимание на слабое место, которое иначе могли и не заметить.
Ошибка 6. Не оставить времени на вопросы.
Вопросы — часть оценки, а не то, что после.
Шпаргалка по главе
| Что | Как |
|---|---|
| Структура показа | 0:30 задача → 1:30 путь → 1:00 защита → 1:00 устройство → 1:00 вопросы |
| Скрипт демонстрации | подписанные шаги, новые данные из аргумента, код возврата на неудаче |
| Проверить скрипт | прогнать дважды подряд до показа |
| Шрифт терминала | крупный; проверка — отойти на два шага |
| Показывать | ответ системы, а не свою уверенность |
| На вопрос без ответа | «не знаю, проверил бы так-то» |
| Недоделки | коротко и честно, без оправданий |
Словарь главы
| Термин | Что это |
|---|---|
| Скрипт демонстрации | Программа, проходящая весь путь решения одной командой |
| Главный путь | Сценарий от пустого состояния до результата |
| Показ защиты | Намеренная демонстрация отказа на неверных данных |
| Код возврата | Ненулевой при неудаче: делает «зелёный» вывод осмысленным |
| Идемпотентность показа | Свойство скрипта отрабатывать дважды подряд |
Цель: скорость ≥ 95 зн/мин, точность ≥ 90%
const shag = (n, t) => console.log(`\n[${n}/4] ${t}`);
Что должен уметь после главы
- построить пять минут показа в правильном порядке;
- написать скрипт демонстрации с подписанными шагами и честным кодом возврата;
- сделать скрипт таким, чтобы он отрабатывал дважды подряд;
- показать работающую защиту, а не только главный путь;
- подготовить рабочее место: шрифт, данные, открытые окна;
- отвечать на вопросы про границы и честно говорить «не знаю».
Проверка по главе
Сводная проверка по всей главе: 10 вопросов, 5:00 на всё, без подсказок по ходу. Вопросы показываются по одному, ответ изменить нельзя. Если время выйдет — экзамен завершится с тем, что успел ответить. Пересдавать можно сколько угодно раз.
Сводная проверка по 2 главам блока: 15 вопросов, 10:00 на всё, по одному вопросу, без возврата. Пересдавать можно сколько угодно раз.
Готовность: экзамены глав сданы 0 из 2. Блок можно сдавать и так, но шанс выше после всех глав.
Куда дальше: проверенные ресурсы
- Официальный сайт «Профессионалов» — правила, компетенции, документы чемпионата.
- Make a README — что и в каком порядке пишут в README.
- Документация git: gitignore — правила игнорирования.
- gitleaks — автоматический поиск секретов перед сдачей.
Комментарии
Обсуждение живёт в GitHub Discussions и грузится с чужого домена — поэтому только по нажатию.