Вопрос с собеседования по программированию: как чувствовать себя достаточно комфортно, выполняя определенную задачу, которая, естественно, не будет случаться очень часто?

Я беспокоюсь, когда делаю код для интервью, и вопросы, которые я обычно мог бы ответить, я застреваю в сценариях интервью. Я прочитал этот вопрос о преодолении волнения перед собеседованием. Один из главных ответов, который он дает, — это практика. У меня только что было техническое собеседование, в котором не было указано, что практиковать, так как же можно подготовиться?

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

Мои мысли были:

1) Многие языки имеют библиотеку связанных списков с обратной операцией (по крайней мере, в Java, и это был используемый язык)

2) Даже если вам нужно реализовать связанный список и обратный метод, вам нужно будет сделать это только один раз для каждого проекта. Так как же можно быть хорошо знакомым с таким методом?

Я не спорю, хороший это или плохой вопрос, я спрашиваю, как можно узнать, что нужно изучать такие вещи перед техническим собеседованием? Даже если бы я прочитал о структурах данных, я бы все равно, вероятно, не запомнил такие функции. Тот факт, что интервьюер продолжал говорить со мной и велел мне объяснять вещи, помешал мне понять ситуацию в данный момент. В какой-то момент он спросил: «Зачем вам нужна эта переменная?» и я ответил: «Я не могу, я просто думаю», это был плохой ответ?

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

Здесь нет полного ответа, но если бы вы использовали онлайн-ссылку для ответа на вопрос в реальном мире, я бы обычно сказал, что разумно спросить интервьюера, можете ли вы его найти в Google (или найти в другом месте). В конце концов, если у вас есть навыки для выполнения задачи, вполне возможно, что это то, что они ищут.
взгляните на книгу Cracking the Coding Interview (связанную с веб-сайтом CareerCup). В книге есть примеры вопросов и ответов, а также более общие советы о том, как пройти собеседование. Как показывают некоторые из его отзывов об Amazon, это очень хороший ресурс для людей, уже работающих: если вы можете понять весь материал в книге, вы должны быть в состоянии сделать хорошую работу, а также получить работу.
Этот вопрос кажется не по теме, потому что это отраслевой вопрос, который относится к Programmers.SE.
Я не хочу вас оскорбить, но, по моему честному мнению, если вы не можете перевернуть связанный список в голове, то вы именно тот разработчик, которого они пытаются отфильтровать. Любой должен иметь возможность написать этот код во сне.
Рекурсивно, конечно
@BrianGordon Я знаю одного отличного разработчика («отлично» означает, что ему дается задание, уходит ненадолго, возвращается с выполненной задачей, в чем я не могу винить), который никогда не видел связанный список в своей жизни. Я бы нанял этого человека в мгновение ока.

Ответы (6)

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

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

  • Пройдите какие-нибудь онлайн-курсы по структуре данных и алгоритмам (например, на Coursera — они бесплатны) — я так многому научился на некоторых из этих курсов, которые должны были быть преддипломными, хотя у меня уже была степень — разница между разными университетами настолько большой, что вам абсолютно необходимо пройти некоторые из этих курсов, чтобы убедиться, что вы на высоте.

  • Потратьте некоторое время на конкурирующие сайты по программированию (например , HackerRank , CodeChef , Topcoder ).

  • Существует множество блогов и тому подобного (например, CareerCup и GeeksforGeeks.com ) о вопросах для интервью по кодированию — не читайте решения сразу, напишите фактический рабочий код на бумаге и засеките, сколько времени это займет у вас — ваша цель, скажем, под через час после того, как вы начнете читать вопрос, так как примерно столько времени обычно длится собеседование.

  • Stack Overflow конечно может помочь, конкретно теги алгоритма и структур данных - можно даже ничего не отвечать (сначала), можно просто прочитать вопросы, попробовать разобраться самому (попробовать написать код), а потом читать ответы. Хотя многие вопросы могут не относиться к вопросам интервью, такие вещи, как поиск ошибок в чужом коде, также помогут вам стать лучшим программистом.

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


С точки зрения общих советов по собеседованию - говорите.

Я понимаю, что некоторые люди лучше думают в тишине, но проблема с молчанием заключается в том, что интервьюер понятия не имеет, о чем вы думаете. Пройдитесь по тому, что вы планируете сделать. Если у вас есть какие-то идеи, даже если вы думаете, что они плохие или не сработают, просто поделитесь ими (вы даже можете сказать, что считаете их плохими — верьте или нет, но плохие идеи часто повышают ваши шансы, во многом ).

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

Однако вы должны ожидать ответа на вопрос в любое время — они могут спросить о вашей мотивации для принятия определенного выбора или попытаться направить вас в правильном направлении с помощью некоторых наводящих вопросов.

Имейте в виду, что «плохое», действительно очевидное решение лучше, чем отсутствие решения - для вашего примера, даже если вы просто пишете код для перехода по связанному списку и вставляете элементы в начало другого связанного списка, это приведет к перевернутому списку, это намного лучше, чем не дать решения. Если вы когда-нибудь застрянете, сделайте два шага назад и попытайтесь придумать какой-нибудь действительно неэффективный способ решить проблему — с вопросами на собеседовании он часто бывает.

Кроме того, не делайте никаких предположений — запросить разъяснения — это хорошо . Активно старайтесь не начинать писать код сразу — постарайтесь найти в вопросе хоть что-то непонятное, о чем можно спросить. Право летучей мыши - какой это тип связанного списка? Двойной или одинарный? Вы можете спросить о временной и пространственной сложности, но я бы не стал слишком беспокоиться об этом для начала, так как это может отвлечь внимание от несколько худшего решения, которое все еще может считаться приемлемым и в конечном итоге даст вам работу.


Что касается отработки реальных собеседований — найдите себе друга-программиста, который проведет с вами несколько реальных практических собеседований.

Возьмите доску (или блокнот тоже может подойти), попросите его/ее спросить вас что-то вроде «перевернуть связанный список» и написать фактический код на доске. Пусть он/она:

  • Убедитесь, что вы запрашиваете разъяснения
  • Убедитесь, что вы не молчите и ничего не делаете слишком долго (я не уверен, что это слишком долго, 30 секунд?)
  • Случайно задайте вопрос, почему вы сделали тот или иной выбор, или попросите объяснить код.

Они могут получить свои вопросы из блога о вопросах для интервью по программированию, поэтому вы понятия не имеете, что будет (это может быть намеренно заниженный вопрос, поэтому вам нужно попросить разъяснений (хорошо) или сделать массу предположений (плохо)) .

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


В заключение — потренируйтесь писать полностью работающий код без IDE, не тестируя его до того, как он будет полностью готов (а затем тщательно тестируйте его, чтобы убедиться, что он работает). Если вы не привыкли обходиться без всей помощи, которую предоставляет вам IDE, вам может быть трудно справиться только с этим аспектом.

Хороший ответ. Еще кое-что. Я наткнулся на этот веб-сайт, который предназначен для того, чтобы давать небольшие задания студентам / новым выпускникам, чтобы помочь им набраться опыта и иметь что-то, что можно продемонстрировать и получить признание в конце. riipen.com Что вы думаете? youtube.com/watch?v=YuOG1bPRuwg оно того стоит?
Спасибо. Никогда не слышал о нем, извините. Вы должны будете проверить это сами. Это может быть здорово, гигантская трата времени или хуже.
riipen.com оказался разочарованием
На работе вас попросят сделать то, чего вы раньше не делали, по крайней мере, не совсем таким же образом. Поэтому они задают вам вопрос, на который, надеюсь, вы еще не отвечали, чтобы посмотреть, как вы с ним справитесь, чтобы убедиться, что вы не совсем застряли, если ваша работа требует от вас самостоятельного создания алгоритма.

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

Мы, студенты, в конце концов поумнели и нашли ключ:

(1) хороший ночной сон. Серьезно. Если вы собираетесь находиться в состоянии сильного стресса, вы будете реагировать лучше и эффективнее, когда полностью отдохнете. Или настолько отдохнувшим, когда вы идете в инженерную школу :)

(2) Ожидайте неожиданного, но перестаньте об этом беспокоиться. Проблема/ограничение с чрезмерным изучением и недостаточным мышлением заключается в том, что вы не можете практиковаться на все случаи жизни. Вселенная потенциальных вопросов просто слишком велика. Что вы можете сделать, так это распознать элементы вопросов, которые вы изучали ранее, и двигаться дальше.

(3) Будьте полностью уверены в себе. Если ты облажался, то ты облажался. Но если ты считаешь себя умным, крутым и готовым на все, ты таким и становишься: умным, крутым и готовым на все. Вот как вы становитесь успешным. Потому что Богиня Успеха непостоянна в поверхностных привязанностях и любит тех, кто умен, силен и готов на все.

(4) Работайте над своими основами. Продолжайте работать над своими основами, пока не сможете выполнять их во сне. Дело не в запоминании и зубрежке, а в понимании и контроле над тем, что вы делаете.

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

expect the unexpected- отличная мысль, как обычно бывает...

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

Я предлагаю взять по крайней мере несколько довольно простых задач программирования, таких как обращение связанного списка, обращение строки, построение приоритетной очереди, решение Fizzbuzz, и рассмотрите возможность выполнения шагов по настройке вашего решения. Какие вопросы вы задаете заранее? Где вы ищете разъяснения относительно того, является ли время или пространство приоритетом для решения? Какие языки вы используете и есть ли другие, которые могут быть интересны, чтобы посмотреть, как будет выглядеть решение на тех языках, которые вы, возможно, не так хорошо знаете.

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

Если вам нужно что-то для сравнения, рассмотрите задачи по математике в школе. Во 2 классе достаточно правильно поставить число в конце, а в 7 классе важнее отметить, какой подход вы использовали для обоснования своего ответа. В то время как во 2 классе учитель знает ответ и может отметить ребенка, который его нашел, в старших классах важнее знать, почему что-то правильно, чтобы кто-то не оправдывался: «Ну, я просто думаю хорошо, поэтому я думал, что это сработает ...»

Ваша работа как инженера-программиста заключается не в том, чтобы писать код, а в том, чтобы решать проблемы. Если вы недавно не закончили колледж, я ожидаю, что вы (читай: любой компетентный человек, подающий заявку на работу программиста, требующую предыдущего опыта) разработаете, как обратить связанный список, если у вас будет немного времени. Почему? Потому что вам придется делать очень похожие вещи в своей работе, но не то, что уже существует в какой-то стандартной библиотеке.

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

Это может показаться суровым, но интервью не предназначены для вас, чтобы учиться на них. Они там, чтобы убедиться, что вы можете делать свою работу. Если вы не можете выполнять свою работу (решать случайные проблемы, потенциально находясь под давлением), то вам не следует браться за эту работу .

Учиться, чтобы пройти собеседование только для того, чтобы попасть на работу, где вы не можете учиться перед каждой новой проблемой, — это просто обрекать себя на неудачу.

Пункт 1: согласен. Параграф 2: (i) «Не говори мне ерунду о давлении на собеседовании», это кажется излишне резким, граничащим с оскорбительным. Откуда вы знаете, что ОП не страдает от ненужного беспокойства (многие люди страдают)? (ii) Некоторые рабочие места в области программного обеспечения требуют невероятно низкого давления: как вы можете быть уверены, на что OP претендует. Пункт 3 - согласен, если ОП не может выполнить работу, они не должны получать эту работу. Но при подготовке к собеседованиям я ожидаю, что кандидаты будут готовиться к ним так же, как к встречам с клиентами. Параграф 4, я понимаю вашу точку зрения, но умение проходить эти собеседования также помогает в работе.
@TooTone - Конечно, но первоначальный вопрос упускает суть ... Если у вас проблемы с проблемами на собеседовании, вам не следует изучать проблемы на собеседовании, вам следует изучать решение проблем.
Без обид, но чтобы сделать ваш ответ более полезным, почему бы не обсудить, как «изучать решение проблем»
@TooTone Я бы рискнул сказать, что большинство работ по программному обеспечению связаны с невероятно высоким давлением . Чаще всего какие-то ребята в костюмах нанимали каких-то «компьютерных парней», чтобы они «делали какие-то компьютерные штучки». И они будут преследовать вас до тех пор, пока вы не произведете именно то, что им нужно, независимо от того, сказали ли они вам, что это было.
@corsiKa По моему опыту, это намного разнообразнее. Моя самая первая работа (давным-давно) была в ИТ-отделе крупной фирмы и была настолько непринужденной, что постоянный сотрудник там признался, что мог бы выполнять свою работу вдвое быстрее, если бы ему пришлось. Между тем у меня было несколько ролей с высоким давлением, которые мне (в основном) нравились. Одна из причин, по которой я оставил свою предыдущую должность, заключалась в том, что она была слишком расслабленной: я мог получить то, что мне было нужно, чтобы казаться продуктивным, за несколько часов в день, почти никаких реальных последствий для совершения ошибок и так далее.
Я согласен, @TooTone, я часто вижу аргумент, что давление на собеседовании является показателем давления на работе, но это ошибка ложной эквивалентности. Это два очень разных типа давления, которые мозг обрабатывает по-разному. Давление прямого наблюдения/оценки может отвлечь внимание более значительно, чем надвигающийся крайний срок. Просто спросите того, кто не может мочиться, когда кто-то смотрит. Бьюсь об заклад, у них нет проблем, когда они просто спешат, но у них есть конфиденциальность.

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

Сказать «Я не могу, я просто думаю» было нормальным ответом, если вы сказали это вежливым тоном. Половина причин, по которым вы решаете подобную задачу, заключается в том, чтобы увидеть фактическую реализацию, которую вы сделали (вы использовали слишком много переменных? У вас было решение O (n ^ 4) там, где присутствовало решение O (n)? ). В этом случае сделайте все, что в ваших силах, и если вы обнаружите проблему в своем решении, вы можете сообщить им об этом (например, «На данный момент у меня здесь есть функция-заполнитель, я могу сделать ее более эффективной, если потратить немного больше времени. "). Однако другая половина — просто посмотреть, как вы работаете. Таким образом, ваш ответ дайте им знать об этом. Возможно, они спросили вас, потому что хотели увидеть, как вы подходите к проблемам и какие вещи вы продумываете. Если у вас есть интервьюер, который действительно сосредоточен на деталях и задает подобные вопросы,

При подаче заявления на должность «Старший инженер-программист» по-прежнему весьма вероятно, что мне зададут один из трех вопросов в какой-то момент во время собеседования (либо во время экрана телефона, либо на месте), а именно:

  • Реализовать двусвязный список.
  • Реализовать хеш-таблицу.
  • Реализовать бинарный поиск.

Мое предложение состоит в том, что в рамках подготовки к собеседованию (перед каждым собеседованием) вы применяете все три метода с соответствующими методами вставки, поиска и удаления.

Поначалу это будет утомительно, но через некоторое время вы запомните базовую структуру каждого из них и сможете просто печатать их (или писать на доске) по памяти.

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