{ "index": 82, "slug": "editorial-2025-09-field-engineering-interviews", "title": "Как калибровать техническое интервью по фактам, а не по впечатлению", "excerpt": "Два reviewer-а могут прочитать один технический ответ по-разному. Разбираем, как найти первую точку расхождения на synthetic-пробе, проверить её и остановить опасный переход от учебной записи к выводу о человеке.", "contentHtml": "

Два reviewer-а читают один технический ответ. Один видит аккуратную гипотезу. Другой — недостаток глубины. Через пять минут спор уже идёт о впечатлении, а не о тексте. В журнале нет ссылки на строку, где началось расхождение.

\n

Цена ошибки высока. Команда меняет rubric после самого громкого мнения. Кандидат или сотрудник получает вывод, который нельзя проверить. Следующий review повторяет тот же спор. Калибровка не исправляет это обсуждением в конце встречи. Она должна сначала зафиксировать одинаковый вход, независимые факты и границу того, чего проба не показывает.

\n

Тезис: технический review калибруется через цепочку «наблюдение → неизвестное → интерпретация → следующий запрос». Reviewer-ы не обязаны прийти к одинаковой интерпретации. Они обязаны показать, на каких фактах она стоит и где заканчивается evidence. Если в записи появляется score, ranking или вывод о личности, процесс должен остановиться.

\n

Механизм: разделить факт и объяснение

\n

Возьмём учебную карточку с ответом на вопрос об устаревшем API-ответе. В тексте есть max-age=0, маршрут /v1/report и описание симптома. Правило origin-сервера не указано. Это намеренный пробел. Он позволяет проверить, умеет ли reviewer отделить видимое от неизвестного.

\n

Observation отвечает только на вопрос «что видно в sample?». Например: «В заголовке указан max-age=0». Unknown отвечает на вопрос «чего здесь нет?»: «Правило, по которому origin формирует cache-control, не показано». Interpretation связывает эти записи: «Нужен запрос правила origin; изменение cache policy пока не доказано». Такой порядок не запрещает гипотезы. Он не даёт гипотезе притвориться фактом.

\n
СлойДопустимая записьЗапрещённый скачок
ObservationВ sample есть max-age=0.«Сервис неправильно настроен».
UnknownOrigin rule не показано.«Автор не понимает кеширование».
InterpretationНужно запросить правило origin.«Reviewer B глубже разобрался».
Hand-offЗапросить один отсутствующий факт.Создать score, ranking или hiring outcome.
\n

Независимость нужна до обсуждения. Каждый reviewer получает тот же sampleId, ту же role rubric и те же критерии. Он сначала пишет факты и неизвестные, затем интерпретацию. Если начать с общей беседы, участники быстро выровняют формулировки, но потеряют момент, где они увидели разное.

\n

Конкретный пример: безопасный hand-off

\n

Ниже — учебный TypeScript-подобный код. Он работает с объектом в памяти. Он не обращается к сети, не пишет файл и не создаёт оценку человека. В production этот пример ничего не доказывает.

\n
type ReviewRecord = {\n  sampleId: string;\n  criterionId: string;\n  evidenceRef: string;\n  kind: 'observation' | 'unknown' | 'interpretation' | 'hand-off';\n  text: string;\n};\n\nfunction acceptHandOff(record: ReviewRecord) {\n  const safePrefix = 'hand-off:';\n  const forbidden = /score|ranking|hiring|person|candidate/i;\n\n  if (record.kind !== 'hand-off' || !record.text.startsWith(safePrefix)) {\n    return { accepted: false, action: 'stop-and-repair-boundary' };\n  }\n  if (forbidden.test(record.text)) {\n    return { accepted: false, action: 'stop-and-repair-boundary' };\n  }\n  return { accepted: true, action: 'request-missing-evidence' };\n}\n\nconst next = acceptHandOff({\n  sampleId: 'api-cache-fixed-v1',\n  criterionId: 'evidence-boundary',\n  evidenceRef: 'sample.headers.cache-control',\n  kind: 'hand-off',\n  text: 'hand-off: request the origin cache rule',\n});
\n

Вызов возвращает учебный запрос недостающего evidence. Он не разрешает менять конфигурацию. Ветка с текстом hiring: reject должна вернуть stop-and-repair-boundary. Это отрицательный путь, а не дополнительная функция: он показывает, что процесс заметил незаконное расширение задачи.

\n

Проверять нужно не только результат функции. Сверьте четыре поля: один sampleId, существующий evidenceRef, применимый criterionId и допустимый тип hand-off. Пустая ссылка, общий ярлык или другой sample делают запись непроверяемой. В таком случае правильное действие — остановка, а не попытка угадать недостающий факт.

\n
\"Цикл
Учебный цикл возвращает неопределённость в проверяемый запрос. Стрелка stop блокирует personal outcome и production effect.
\n

Симптомы и действия

\n
СимптомПричинаПроверкаДействие
Reviewer-ы спорят о «глубине».Критерий не описывает наблюдаемое поведение.Найдите строку sample, на которую ссылается каждый.Сузьте criterion до проверяемого признака.
Оба reviewer-а используют одинаковые слова, но делают разные выводы.Они смешали observation и interpretation.Перепишите записи в два отдельных поля.Запросите недостающий факт вместо решения.
В hand-off появляется score или ranking.Учебная проба пересекла границу оценки человека.Проверьте текст и допустимые типы записи.Верните stop-and-repair-boundary; не сохраняйте outcome.
После калибровки меняют сразу sample, rubric и инструкцию.Нельзя понять, что исправило расхождение.Сопоставьте первую непарную запись с изменённым артефактом.Измените один артефакт и повторите тот же sample.
Reviewer просит данные из сети или реального разговора.Проба не содержит нужного evidence и маскирует это.Проверьте boundary и список разрешённых источников.Остановите прогон или замените sample на явно новый учебный кейс.
\n

Порядок короткой calibration session

\n
  1. Заморозьте вход. Создайте synthetic sample с идентификатором, фиксированными литералами и описанием того, чего в нём нет.
  2. Опишите критерий. Запишите observable behaviour и исключённые измерения. Слова «сильный», «слабый» и «системный» без признака не подходят.
  3. Раздайте одинаковые условия. Передайте reviewer-ам один sample, одну rubric и одинаковый порядок чтения. Не начинайте с общей дискуссии.
  4. Соберите независимые записи. Каждый reviewer фиксирует observation, unknown и interpretation с ссылками на evidence.
  5. Найдите первую развилку. Сначала сравните sample id и факты. Затем сравните criterion. Только после этого обсуждайте interpretation.
  6. Классифицируйте расхождение. Разные факты указывают на проблему sample или чтения. Одинаковые факты и разные трактовки указывают на rubric. Разные hand-off указывают на неясную границу действия.
  7. Измените один артефакт. Исправьте sample, criterion или инструкцию, но не все сразу. Старую версию оставьте как учебный контрпример без связи с человеком.
  8. Повторите тот же прогон. Убедитесь, что прежняя развилка стала видимой, а hand-off по-прежнему не создаёт score, ranking, personal record или production effect.
\n

Когда этот метод не подходит

\n

Synthetic-проба проверяет процесс чтения и границу доказательства. Она не измеряет производительность инженера, качество найма, способность работать в команде или результат реального проекта. Нельзя переносить её вывод на человека. Нельзя называть отсутствие расхождения доказательством валидности rubric.

\n

Один fixed sample быстро устаревает. Изменился API, критерий или рабочая задача — изменился и смысл пробы. Набор из нескольких sample требует отдельного дизайна: иначе команда начнёт сравнивать разные задачи как одну шкалу. Если нужен реальный отбор, его должны спроектировать владельцы процесса с учётом применимых требований. Учебный журнал не заменяет такую процедуру.

\n

Метод также не спасает от плохого критерия. Если criterion требует «понять намерение автора», его нельзя проверить ссылкой на текст. Если sample скрывает несколько причин, reviewer-ы будут расходиться по делу, а не из-за плохого review. Сначала уменьшите область утверждения. Потом добавляйте сложность.

\n

Проверяемый критерий готовности

\n

Сессия готова, если независимые записи можно открыть без устного пояснения и ответить на четыре вопроса: какой sample читали; какой факт увидели; какое неизвестное осталось; почему hand-off разрешён или остановлен. Для каждого расхождения указан один артефакт, который изменили. Повторный прогон использует тот же идентификатор пробы и не создаёт score, ranking, personal outcome, сетевой запрос или production effect.

\n

Минимальная проверка — прогнать положительную и отрицательную ветки. Положительная ветка принимает только hand-off с ссылкой на существующий evidence и запросом одного недостающего факта. Отрицательная ветка отклоняет текст с оценкой человека, невалидную ссылку и неизвестный критерий. Если хотя бы одна ветка проходит без явного результата, материал не готов к использованию даже как учебный пример.

\n

Проверяемые источники

" }