Как я провожу собеседования

Собеседование

  1. Общие технические знания
  2. Java core
  3. Java collections
  4. Алгоритмы
  5. JMM/Concurency
  6. JVM/GC
  7. SQL/NOSQL
  8. Spring

Общие технические знания
Обычно все начинается с вопросов о текущем используемом стеке и об известных библиотеках/фреймворках.
Я могу поспрашивать почему используется то или иное решение.
Задам вопрос про DevOps и спрошу - а принимал ли ты участие в организации поставок.
Спрошу что-нибудь из аббревиатуры SOLID
Спрошу про паттерны проектирования, может быть, про их типизацию, попрошу в деталях рассказать о парочке наиболее интересных из тех, о которых ты вспомнишь

Java core
Где-то обязательно будет вопрос про неизменяемость строк.
Основное путешествие начнется с equals и hashCode:
  • Я спрошу про контракт между ними
  • Спрошу про контракт на equals
  • Спрошу про тип данных, который возвращает hashCode
  • Спрошу про число байтов в int, о том, сколько может быть уникальных хэшкодов, может быть, попрошу представить это в десятичном виде
  • Где-то выше мелькнет слово коллизия - задел под хэшмапу
  • Спрошу как хэшкод считается по умолчанию, попробую подвести, что можно считать рандомом
  • Если был ответ «адрес в памяти» - спрошу про изменяется ли адрес объекта, спрошу про размер адреса, может быть, поговорим о выравнивании адреса и о том, сколько надо байт, чтобы адресовать кучи разных размеров (в том числе, про сжатые ссылки)
  • Могу спросить где храниться хэшкод 

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

Алгоритмы
Заход с того: а как отсортировать, например, лист.
Спрошу про то, какие типы сортировок используются в java, какие сортировки не хуже nlogn знаешь еще. Спрошу про то, как работает timsort/quicksort, про худший случай quicksort, как его оптимизировать, про его устойчивость. Если знаешь другие сортировки - спрошу про них

JMM/Concurency
Спрошу, что дает критическая секция. Что будет, если написать synchronized перед методом. Перед статическим методом. Зачем нужны wait, notify, notifyAll. Спрошу про порядок засыпания и пробуждения потоков и кто этот порядок может гарантировать. Может быть, попрошу спроектировать исполнение задачи в средпуле.
Спрошу, что дает volatile. Что за кэш? Через какие физические устройства происходит чтение из оперативной памяти - пока не доберемся до кэшей процессора. Спрошу про happens-before относительно volatile и какие еще бывают. 

Чем хороши атомики, кто больше потребляет ресурсов: атомики, критическая секция или volatile. 

TBD

Комментариев нет:

Отправить комментарий