Многих младших разработчиков просят задавать уточняющие вопросы во время части технических собеседований, посвященной структуре данных / алгоритму (или «белой доске»), но быстрый поиск в Интернете не выявил каких-либо ресурсов по

  • как задать уточняющие вопросы?
  • почему их так важно спросить?

В этом посте мы попытаемся ответить на оба эти вопроса.

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

  1. Чтобы понять, что интервьюер хочет увидеть из вашего ответа (например, какие ограничения существуют для вас, пока вы отвечаете на вопрос?)
  2. Чтобы дать интервьюеру возможность помочь вам или дать вам подсказку (особенно если вы идете по неверному пути или не в том, что сегодня интересует интервьюера)
  3. Если вы продемонстрируете, что знаете планирование, прежде чем писать код, вы станете лучшим разработчиком.
  4. Чтобы дать себе время собраться с мыслями и очистить голову
  5. Чтобы продемонстрировать свои коммуникативные навыки
  6. Чтобы продемонстрировать область знаний или опыт (например, соображения пространства и времени с использованием нотации Big-O, опыт Unicode и т. Д.)

Как задавать уточняющие вопросы при работе с доской

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

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

Что касается структур данных, я разделил вопросы на две большие категории:

  • Вопросы о вводе / выводе функции (подпись функции)
  • Вопросы о допустимых / предпочтительных методах решения (используемых в теле функции)

В-третьих, я рассмотрю особенности алгоритмов сортировки.

Ваши первые пояснения: ввод и вывод

Итак, вы находитесь в классной комнате, и интервьюер только что задал вам первый вопрос, который он хочет, чтобы вы ответили. Что вы делаете в первую очередь?

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

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

Затем я поясняю ввод и вывод функции, которую я собираюсь написать для интервьюера. Часто я буквально пишу это в верхней части доски. Например, если бы меня попросили написать функцию, которая возвращает, есть ли в слове повторяющиеся буквы, я бы написал String - › Bool, говоря: «Итак, мой ввод будет строкой, и я хочу вернуть Bool». Это дает интервьюеру возможность подтвердить. Теперь у вас есть строительный блок для написания сигнатуры функции.

Это может показаться простым, но представьте себе более сложную проблему, когда вы работаете с массивами словарей в качестве входных данных или вам нужно вернуть кортеж, набор или строку. Было бы важно уточнить, можно ли, например, вернуть строку в виде массива символов: [«a», «», «s», «t», «r», «i», «n», «G»] или строковый литерал со стандартными заглавными буквами и знаками препинания в предложении: «Строка».

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

Примечание об особых случаях

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

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

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

Примечание о деревьях и графиках

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

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

Уточняющие вопросы по структуре данных

Вопросы проверки ввода и вывода (подпись функции)

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

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

Примитивные типы

Числа

  • Ноль (0)
  • NULL или ноль
  • Отрицательные числа
  • Floats или Doubles (уточняет, только ли Ints?)
  • Мин. / Макс. Int

Струны

  • Пустой строки
  • NULL или nil (и Optionals, в зависимости от языка)
  • Пробелы (несколько слов или предложений или только один / несколько пробелов)
  • Пунктуация
  • Верхний, нижний или смешанный регистр (например, «stRiNg»)
  • Строки чисел (например, «12») Следует изменить на Int, Float или Double?
  • Разные языки (Диакритические знаки? Совместимость с Unicode? ASCII?)
  • Emoji 👍 (особенно если вопрос представлен как текстовое поле, введенное пользователем)
  • Длинная строка

Типы структур (коллекций) данных

Кортежи

  • Именованные элементы

Массивы

  • Пустой массив
  • Вложенные или не вложенные

Словари (хэш-карты)

Связанные списки (Стеки, Очереди, Деки)

Законные вопросы методологии (функциональное тело)

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

  • Встроенные функции разрешенного языка (например, .reverse)
  • Разрешены функции высшего порядка (например, сопоставление, фильтрация, сокращение)
  • Рекурсия: обычно на собеседовании вы начинаете с итеративного / грубого подхода, а затем оптимизируете его, но если вам удобна рекурсия и вы думаете, что она необходима, спросите, хочет ли интервьюер рекурсивное решение

Уточняющие вопросы по алгоритму сортировки

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

  • Вход уже отсортирован?
  • Входной обратный отсортирован?
  • Вход только один элемент? Если да, считается ли это «отсортированным» (если возвращается bool)?
  • Является ли ввод таким, что все элементы имеют одинаковую ценность?
  • Считается ли «пустая» версия ввода (NULL, nil или пробел) отсортированной (особенно важно, если вы возвращаете логическое значение)?
  • Есть ли ввод разных типов (например, числа и строки), которые трудно сопоставить друг с другом? Если это так, и вы сортируете только один из типов, следует ли удалить или сохранить другие типы? Если они сохранены, как они должны быть размещены (до или после сортированного типа) и должны ли другие типы сортироваться по отношению к себе?
  • Если вы планируете делать разбиение при выполнении алгоритма сортировки (распространенный метод), входные данные четные или нечетные?

Заключение

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

Интервьюер: напишите функцию, которая может определять, содержит ли строка все уникальные символы.

Вы: ОК, поэтому я беру строку в качестве ввода и возвращаю логическое значение (напишите на доске: «String -› Bool »).

Я: Верно.

Y: Можно ли получить в качестве ввода пустую строку, nil или NULL или просто пробелы?

Я да.

Y: (пишет «Необязательный» перед вводом / выводом, так что теперь он читается как «Необязательная строка -› Bool ») Как вы хотите, чтобы я поступил с такими случаями?

Я: Как вы думаете, как с ними обращаться и почему?

Y: Я бы вернул False для пустой строки и nil или NULL, и True, если есть только один пробел или только несколько пробелов.

Я: Ничего страшного.

Y: А пунктуация будет? Например, если во входных данных присутствуют два апострофа или амперсанда, должен ли я возвращать значение False?

I: Нет, вы можете проигнорировать знаки препинания в этой задаче.

Y: Будет ли ввод, содержащий прописную букву «А» и строчную букву «а», считаться в этом случае дубликатом?

I: No.

Y: И, наконец, следует ли мне беспокоиться о диакритических знаках и / или вводе языка, отличного от английского?

I: No.

Y: Хорошо, спасибо. Я готов начать.

Спасибо за чтение и удачи в интервью!

Пожалуйста, не стесняйтесь комментировать или обращаться, если вы видите какие-либо ошибки или у вас есть исправления / уточнения.