Слогер Создать блог
Разработка

Как отлаживать чужой код на собеседовании: разбор одной ошибки без переписывания проекта

Что делать, если дали готовый проект с багом: зафиксировать контракт, проследить один запрос и доказать починку отдельным чтением.

На собеседовании по разработке иногда дают готовый проект с багом. Решение уже написано. Оно просто не работает: есть маршруты, которых вы не выбирали, слой хранения, который вы не проектировали, и падающий тест с почти издевательски простым описанием. Где-то внутри чужого кода изменение выглядит успешным, а после обновления страницы исчезает.

Практика полезнее, чем ещё один вечер на узнавание паттернов. Сначала надо решить, куда смотреть. Потом — что писать.

Главная ловушка — желание сразу быть полезным. Видите неуклюжую функцию, начинаете чистить, через десять минут код красивее, а исходная ошибка не объяснена. Для такого разбора я держу правило: каждое изменение должно опираться на конкретное наблюдение.

Сначала жалоба, потом один запрос

Пользователь меняет цену аренды машины с 80 на 60. В ответе приходит 60. Новый запрос возвращает 80.

Это учебный пример с выдуманными данными и упрощённым интерфейсом репозитория. Он не восстанавливает чужой приватный код.

До открытия всех папок запишите контракт: авторизованное обновление должно изменить сохранённую цену, а последующее чтение — вернуть это изменение. В примере чтение идёт в то же хранилище, других писателей нет.

Без последней оговорки устаревшая реплика, кэш или параллельная правка дадут похожий симптом по другой причине.

Теперь смотрите только один путь: запрос → аутентифицированный пользователь → обработчик → репозиторий → сохранённая запись → ответ.

Первый полезный вопрос: изменилась ли сохранённая запись. Если там по-прежнему 80, копайте запись. Если там 60, а чтение возвращает 80, копайте чтение. Поиск сузился без единой правки.

Ответ выглядит правильным, потому что ошибка в ответе

Функция editCar находит запись, собирает новый объект копированием и возвращает его. Вызова записи в хранилище нет. HTTP-обработчик может сериализовать этот объект в убедительный успешный ответ, пока сохранённая запись остаётся нетронутой.

Поэтому ожидаемый результат надо записать до чтения реализации. Ответ, совпадающий с входными данными, кажется доказательством, хотя доказывает мало.

Моя заметка о диагнозе состояла бы из четырёх строк:

  • Наблюдение: ответ на правку содержит 60; свежее чтение содержит 80.
  • Гипотеза: сервис меняет только возвращаемый объект.
  • Доказательство: этот путь вызывает метод чтения и ни разу не вызывает метод записи.
  • Починка для проверки: выполнить обновление с ограничением владельца, затем вернуть сохранённый результат.

Заметка короткая. Её можно объяснить вслух. И её легко оспорить.

Самая маленькая починка, которая возвращает контракт

В наброске у репозитория есть updateOwned. Контракт явный: совпасть должны и ID машины, и ID владельца; применить только проверенные поля; после успешной записи вернуть сохранённую запись. Если подходящей записи нет — вернуть null; при сбое хранилища — отклонить операцию.

Функция editCar вызывает updateOwned и возвращает saved.

Короткая функция — не достижение. Достижение в том, что репозиторий теперь выполняет операцию, которую обещает endpoint.

Это интерфейсный набросок, не готовая реализация базы. В реальном проекте проверьте фактический метод обновления: он возвращает старую запись, новую или только число затронутых строк? Может ли он сообщить об успехе, когда ничего не совпало? Обработчик должен перевести эти исходы в документированный ответ. И обработать отклонённую запись, а не объявить успех до завершения операции.

await ждёт, пока промис завершится. Он не превращает отсутствующую запись в реальную и не чинит репозиторий, который резолвится раньше, чем закончилась работа.

Ограничение владельца нужно внутри операции обновления. Предварительный поиск сам по себе не повод разрешать запись в любую запись с таким ID.

Доказать починку отдельным чтением

Проверка, которая смотрит только на ответ редактирования, приняла бы сломанную версию. Сильнее проверка, которая повторяет следующее действие пользователя.

  1. Создайте машину C1 с владельцем A и ценой 80.
  2. От имени A поменяйте цену C1 на 60 и дождитесь завершения запроса.
  3. Прочитайте C1 через обычный путь чтения приложения.
  4. Убедитесь, что и ответ, и сохранённая запись содержат 60.

Потом усложните проверку двумя способами. Попробуйте правку от пользователя B и убедитесь, что изменений нет. Сделайте запись в хранилище неудачной и убедитесь, что endpoint не возвращает успешно сохранённую запись.

Для кодов статуса используйте документированный контракт ошибок проекта. Заменять его своим любимым API-стилем посреди починки смысла нет.

Ловушка в тестовой обвязке: если фейковый репозиторий возвращает тот же объект, который хранит, случайная мутация может выглядеть как сохранение. Фейк должен воспроизводить важное поведение хранилища, включая отдельные копии при чтении, если так ведёт себя настоящий репозиторий.

Для сервиса на диске, который обещает сохранность после перезапуска, добавьте отдельную проверку. Два чтения из общего объекта в памяти не доказывают устойчивость к падению.

Другой симптом — другое расследование

Полезная привычка: найти первую точку, где фактическое состояние расходится с контрактом. Она работает и когда жалоба меняется.

СимптомГде смотретьЧто проверить
Новая запись не появляетсяХранилище и созданиеЕсли записи нет, проследите создание и его завершение. Если есть, сравните поля, по которым строит список, с тем, что реально сохранило создание. Несовпадение поля владельца может спрятать успешный insert.
В списке чужие записиАутентификация в запросеПроследите идентичность до запроса. Фильтрация в браузере недостаточна: сервер должен проверять доступ. Сверьте соседние пути получения, правки и удаления с тем же правилом владельца.
Изменение пропадает иногдаПорядок событийЗапишите порядок. Два запроса могут прочитать одно старое состояние, сделать разные изменения и перезаписать друг друга. await в каждом запросе не сериализует их между собой.
Данные в одном JSON-файлеПересекающиеся записиNode предупреждает об одновременных writeFile в один файл без ожидания. Даже отдельные завершённые записи теряют обновления, когда две последовательности read–modify–write гоняются. Координация должна покрывать всю операцию и всех писателей.

Это следующий шаг, когда доказательства ведут туда. Не повод менять маленький сервис на новую архитектуру до понимания исходного бага.

Сделать из этого тренировку

В публичном описании похожего упражнения по Node.js с арендой машин есть несколько жалоб: записи утекают между пользователями, новые записи пропадают, правки теряются после обновления. Исходного кода там нет, так что используйте описание для диагностики, а для практики возьмите небольшой локальный сервис.

Для 35-минутной тренировки я предпочитаю такую структуру. Это план практики, не оценка найма.

  • Первые 5 минут: прочитайте контракт API, запустите supplied checks и сопоставьте падения с затронутыми операциями. Убедитесь, что сервис использует нужное окружение.
  • Следующие 10 минут: воспроизведите один сбой на крошечной фикстуре. Проследите только нужный запрос и запишите первое неверное значение.
  • Ещё 10 минут: сделайте одну обоснованную починку. Проверьте исходный симптом и соседнее поведение, которое правка может задеть.
  • Последние 10 минут: перезапустите полный набор проверок, посмотрите на изменение и объясните причину, починку, доказательство и оставшуюся неопределённость.

Держите диагноз до открытия решения. Если используете разбор с подсказками, это шаг сравнения после своей попытки. Полезный вопрос — где ваше рассуждение разошлось, а не как быстро вы узнаёте объяснение после.

На реальном собеседовании следуйте его правилам насчёт ассистентов и внешних ресурсов. На тренировке ассистент может помочь найти путь вызова или предложить контрпример; объяснить, почему починка следует из доказательств, всё равно вам.

Оставить себе больше, чем зелёный экран

В конце сохраните короткую запись о починке: дано такое состояние → этот запрос должен вызвать такое изменение → это наблюдение доказало дефект → этот патч вернул поведение → эти проверки его защищают.

Если не можете заполнить наблюдение, возможно, вы угадали правильно, но не поняли ошибку. Если не можете назвать проверки, не показали, какое поведение защищает починка.

Не нужно понимать весь репозиторий, чтобы стать полезным внутри него. Нужно достаточно системы, чтобы сделать одно утверждение, найти доказательство и не сломать следующий запрос.

Перед следующей тренировкой возьмите небольшой проект и попросите кого-то посадить один баг. Сохраните ожидаемое поведение, спрячьте изменённую строку и объясните починку вслух, когда найдёте.

А если успешный ответ врёт?

По материалам: career. Текст переработан редакцией Слогера.

← На главную

Рекламное место — Конец поста
Реклама · Слогер

Комментарии (0)

Войдите, чтобы комментировать.

Пока нет комментариев. Будьте первым.

Карьера

Какие 30 слов в резюме рекрутер действительно читает — и как их переписать

Первый просмотр резюме длится около семи секунд. За это время в голову попадает примерно 30 слов, и большая часть — не про ваши достижения. Разбираем, какие строки править первыми.

Слогер 24.10.2026 ▲ 0
Карьера

Как разработчику в Канаде не потерять право на работу: разбор сроков рабочего разрешения

Что написано в вашем пермите, чем отличается поддерживаемый статус от восстановления и какие документы держать наготове, когда до истечения срока остаются недели.

Слогер 24.10.2026 ▲ 0
Стартапы

CRM Fluxs: платите только за то, что нужно бизнесу

Я был уверен, что онлайн-запись нужна автосервисам. Клиент выбирает время, мастер знает, когда его ждать. На практике один ремонт занимает два часа, другой четыре, и по фиксированным слотам это не расписать. Рассказал, где онлайн-запись работает хорошо, где не очень и почему в нашей платформе модули подключаются только по необходимости. Вопрос тем, кто работает в автосервисе или ремонте: как вы сейчас планируете запись, когда заранее не знаете, сколько займёт работа? Что у вас на практике работает?

Слогер 23.10.2026 ▲ 0
Fluxs lenta
Реклама · fluxs.ru
Карьера

Резюме для работы в общепите: шаблон и 15 готовых пунктов с цифрами

Как собрать резюме на часовую работу, которое пройдёт через автоматический парсер и убедит менеджера: пять блоков, формула «действие + цифра» и 15 формулировок, которые можно вставить почти без правок.

Слогер 23.10.2026 ▲ 0
Карьера

Как проходит AI-собеседование для разработчика и что на нём оценивают

Первый технический раунд всё чаще ведёт программа: она задаёт уточнения, смотрит, как вы думаете, и записывает каждый шаг. Разбираем формат — глазами кандидата и глазами нанимающей команды.

Слогер 23.10.2026 ▲ 0
Карьера

Как нанимать Forward Deployed инженера: разбор без алгоритмических собеседований

FDE — это не бэкендер, который иногда говорит с клиентом. Разбираем, какие задания действительно показывают уровень, как уложить оценку в час и почему общий балл за собеседование мало о чём говорит.

Слогер 23.10.2026 ▲ 0
AI

5% акций в фонд или по акции каждому ребёнку: разбор двух моделей, как ИИ-компании «делятся» с обществом

Anthropic отдаёт 5% акций в фонд общественной пользы, Маск обещает по акции SpaceX каждому американскому ребёнку. Это два разных механизма — и у каждого свои слабые места.

Слогер 23.10.2026 ▲ 0
Личный опыт

Человек общается как Змей Горыныч сегодня

Как сегодня меняется общение в обществе? Какие есть особенности взаимодействия с русским человеком? Почему мы часто делаем ошибки при первичной коммуникации? И что ожидать от общения в соцсетях? Наблюдениями о коммуникационных моделях в первой четверти XXI века поделился эксперт по международным коммуникациям, экскурсовод в Португалии, журналист, мой давний друг Алексей Кокорин.

Алла Надежкина 22.10.2026 ▲ 1
Fluxs lenta
Реклама · fluxs.ru
Карьера

Какие книги читать разработчику, чтобы они не устаревали вместе со стеком

Библиотеки и платформы обновляют по расписанию, а идеи, на которых держатся архитектурные и карьерные решения, часто остаются с юности. Разбор, как отличить работающий канон от приятных воспоминаний и что делать с обоими.

Слогер 22.10.2026 ▲ 0
Разработка

Разбор: почему ИИ-агент ломает архитектуру и как это лечит спецификация

Агент в редакторе снял барьер входа до трёх клавиш — и обнажил главную проблему: всё, что вы не записали, для него не существует. Разбираем подход, в котором код следует за спецификацией, и где он буксует.

Слогер 22.10.2026 ▲ 0
Карьера

Как пройти собеседование на TPM: разбор вопросов и того, что за ними стоит

Технического программного менеджера проверяют в двух ролях сразу — инженера, который видит риск в плане, и менеджера, который держит исполнение между командами. Что спрашивают на каждом раунде и как к ним готовиться.

Слогер 22.10.2026 ▲ 0
Стартапы

Автоматизация рабочих процессов компании: платформа Fluxs

Платформа Fluxs помогает выстроить и автоматизировать рабочие процессы компании: от заявки до отгрузки, от договора до подписи. Внутри мессенджер, чат и ИИ-чат на сайте, голосовой робот, поиск клиентов, онлайн-запись, конструктор сайтов. А что у вас сейчас держит процессы: CRM, таблицы, мессенджеры, бумага? И чего вам в этом не хватает больше всего?

Слогер 21.10.2026 ▲ 1
Fluxs lenta
Реклама · fluxs.ru