Ответ
Имею опыт прохождения технических собеседований как в роли кандидата, так и в роли интервьюера. Отлично понимаю структуру типичного собеседования: алгоритмическая часть, системный дизайн, знание языка и фреймворков, поведенческие вопросы.
Знаю распространенные алгоритмические задачи (поиск, сортировки, деревья, графы) и оптимизационные подходы. Например, для задачи TwoSum:
public int[] TwoSum(int[] nums, int target) {
var dict = new Dictionary<int, int>();
for(int i = 0; i < nums.Length; i++) {
if(dict.TryGetValue(target - nums[i], out var index)) {
return new[] {index, i};
}
dict[nums[i]] = i;
}
return Array.Empty<int>();
}
Готов обсуждать trade-off между разными решениями, оценивать сложность (O(n) в примере выше). Также разбираюсь в вопросах многопоточности, асинхронности, паттернах проектирования и архитектурных подходах.
Ответ 18+ 🔞
А, ну ты смотри, какой подкованный! Сам и на собеседованиях трепыхался, и других мучил. Ну, блядь, теперь ты знаешь эту кухню изнутри, как свои пять пальцев, ага?
Вот эти этапы, да? Алгоритмы, где тебе мозги выносят какими-нибудь деревьями, потом системный дизайн, где надо изображать из себя архитектора всея Руси, потом вопросы по языку, где пытаются поймать на какой-нибудь хуйне про дженерики, и в конце — поведенческие, где надо врать про «командную работу» с лицом кирпича.
Алгоритмы, ну да, классика жанра. Все эти поиски, сортировки, графы — пиздец, скукота, но без них нихуя. Главное — не тупить и сразу в лоб не лезть с решением за O(n²), а то тебя в пизду пошлют, не дослушав. Надо сразу про хеш-мапы вспоминать, как в этом твоём TwoSum.
public int[] TwoSum(int[] nums, int target) {
var dict = new Dictionary<int, int>();
for(int i = 0; i < nums.Length; i++) {
if(dict.TryGetValue(target - nums[i], out var index)) {
return new[] {index, i};
}
dict[nums[i]] = i;
}
return Array.Empty<int>();
}
Вот, видишь? Красиво, просто, за O(n). И главное — не забудь про trade-off сказать! Мол, да, память O(n) съедает, но зато время линейное, а если бы тупо двумя циклами, то было бы O(n²), но память O(1). Вот эта вот хуйня их всегда радует, они такие: «О, кандидат думает!».
А потом начинается самое интересное — системный дизайн. Тут уже надо не код писать, а языком молоть. «Спроектируйте мне Twitter на коленке за 45 минут». И вот ты начинаешь нести хуйню про шардирование, кеширование, репликацию, очереди сообщений, load balancer'ы, и смотришь, как интервьюер кивает с каменным лицом. А сам думаешь: «Бля, и как это всё в реальности-то работает, а не на доске?».
Ну и конечно, вопросы по языку. В C# это вечная песня про async/await, про то, чем Task отличается от Thread, про всякие using, yield, да про то, как работает GC. И паттерны эти долбаные — синглтон, фабрика, наблюдатель. Надо их так уверенно перечислять, будто ты с ними за руку здороваешься каждое утро.
Короче, суть в чём: чтобы пройти, надо не только знать, но и показать, что ты понимаешь, почему всё так работает. И не бояться говорить «не знаю», если реально не в курсе — лучше честно сказать, чем нести пургу. А то некоторые несут такую ахинею, что уши вянут, ей-богу.
Главное — не бздеть. Они тоже люди, они тоже когда-то сидели и пукали от страха на таких же собесах. Держись уверенно, но без понтов, и всё будет пучком. Ну, или не будет, хуй его знает, рынок-то сейчас — ёперный театр!