Когда «готово на 99%» — это ноль

Недавно я проходил первый этап собеседования в одну голландскую HFT-компанию. Мне заранее озвучили формат: онлайн-тест на HackerRank, 2 часа, C++.

Я ожидал, что это будет именно тест на знание языка. Перед началом даже немного волновался, потому что чувствую, что отстал от C++23/26. Думал, сейчас начнутся вопросы про новые тонкости стандарта, и будет больно. Вместо была одна большая алгоритмическая задача.

Перед стартом я поставил галочку, что обещаю не использовать AI-инструменты. Такой вот формальный барьер от вайбкодинга. Думаю, HackerRank ещё и таймлайн написания кода умеет показывать, так что отличить живое решение от копипасты из AI, наверное, можно.

Условие оказалось длинным и мудрёным. Мне потребовалось около 20 минут, чтобы понять, что вообще дано, что надо сделать и где в этой задаче задача. Потом примерно за 10 минут я придумал решение. Сейчас, уже после разбора, я знаю, что оно было правильным. Никакого rocket science там не было. Большой leetcode medium/hard: считать данные, разложить их по структурам, переложить в другие структуры, проверить несколько условий, а потом отвечать на запросы.

Через полчаса после старта у меня было решение и оставалось полтора часа на реализацию. Казалось, что времени достаточно.

Но кода надо было написать много. Я писал его руками, по старинке, постепенно сверху вниз. И в какой-то момент заметил, что до конца осталось 40 минут, а код ещё не дописан. При этом ощущение было нормальное: я продвигаюсь, всё под контролем.

Тестировать я начал за 15 минут до конца. И вот тут стало понятно, что 15 минут — это катастрофически мало. Сначала я исправлял ошибки компиляции. Потом оказалось, что программа не проходит даже примеры из условия 😱 Потом я понял, что она вообще ничего не выводит.

За минуту до конца мне уже ничего не оставалось, кроме как отправить тот код, который есть. Код не прошёл ни одного теста 😔

После теста я спокойно разобрался, в чём была проблема. Надо было не только считывать входные данные, но и проверять их на валидность. Я чуть неправильно валидировал ввод, и из-за этой ошибки любые входные данные признавались некорректными 😕

После исправления этого места код прошёл все тесты, которые у меня были.

То есть алгоритм был придуман. Решение было реализовано. Основная логика работала правильно. Мне не хватило буквально 15-20 минут на отладку парсинга.

И вот это неприятное место 🤦🏻‍♂️ Нас часто учат не быть перфекционистами. Не полировать бесконечно код. Не ждать идеального состояния. Доставлять ценность итерациями. Но есть ситуации, где всё, что не 100%, — это ноль.

Если программа из-за одного бага в парсинге не проходит ни одного теста, никого не волнует, что внутри у неё правильный алгоритм. Никто не будет разбираться, что там почти всё сделано. Система видит: тесты не пройдены. До свидания.

Эмоционально это странный опыт. С одной стороны, очень обидно. Такое ощущение, что Акела промахнулся. Я привык проходить скрининги и воспринимал это как подтверждение, что я всё ещё в форме.

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

То есть конкретная попытка провалилась. Но из этого не следует, что провалился навык.

Пожалуй, главный вывод для меня такой: на timed coding task важно не просто придумать решение. Важно достаточно рано получить хоть что-то работающее и оставить себе нормальное время на отладку. Потому что между «почти решил» и «решил» иногда лежит не 1% — иногда там лежит весь результат.

Вам доводилось сталкиваться с подобным?