Эта статья является вкладом моего брата Сюэ Моу.Хотя интервью закончилось, сам брат все еще очень хорош, и я многому научился благодаря этому интервью.Я думаю, этого достаточно! давай! Не бойтесь провалить собеседование, хорошо тренируйтесь, подготовьтесь больше, и вы обязательно найдете работу, которая вас удовлетворит позже.
Многие ответы на следующие вопросы находятся в открытом доступе у автораGitHub.com/snail Climb/…([Java Learning + Interview Guide] Копия основных знаний, которые необходимо освоить большинству Java-программистов) доступна, и вам настоятельно рекомендуется ее прочитать.
задний план
Некоторое время назад что-то случилось дома, поэтому я уволился с работы и ненадолго отправился домой. Разобравшись с родным городом, я вернулся в Гуанчжоу, чтобы продолжить поиски работы. Вероятно, за несколько дней до Национального дня я отправился чтобы взять интервью у компании под названием Bigo (дочерняя компания YY)), позиция интервью для 3-5 лет разработки Java, и, наконец, пал на техническую сторону третьего раунда. Хотя есть некоторые сожаления и разочарования, я все же хочу вести блог, чтобы записывать свое интервью.
Личная ситуация
Давайте сначала поговорим о личной ситуации LZ.
Закончил в 2017 году вторую книгу, в настоящее время находится в Гуанчжоу, очень обычный программист Java-разработки с более чем двухлетним опытом разработки.
На самом деле, этот этап немного смущает, и он немного лучше, чем у младших программистов, но не может достичь продвинутого уровня. Кроме того, ИТ-индустрия сейчас близка к насыщению, и для многих должностей требуется как минимум 3-5 лет опыта разработки, поэтому спрос на опыт разработки около двух лет на самом деле относительно невелик, что глубоко ощущается в процессе LZ. ищу работу. Самое печальное, что общая обстановка в этом году нехорошая. Многие компании постоянно увольняют сотрудников, не говоря уже о наборе людей. Жестокая ситуация еще хуже для соискателей. Я думаю, что многие соискатели также испытывают это. Поэтому рекомендуется не говорить голышом, если только это не крайняя мера!
Биго Интервью
Должность на собеседовании: Java backend разработка
Требования к опыту: 3-5 лет
С тех пор, как я ходил брать интервью у Биго перед Национальным праздником, прошло уже больше месяца.Хотя у меня еще есть впечатления, есть также много вопросов интервью, которые я забыл, поэтому я могу только попытаться описать процесс интервью по своему Воспоминания Я не понимаю Пожалуйста, прости меня!
Одна сторона (сторона телефона WeChat)
Первым лицом bigo было телефонное интервью в WeChat.Первоначально я хотел провести прямое телефонное интервью, но интервьюер сказал, что нужны рукописные вопросы по алгоритму, поэтому его заменили на телефонное интервью в WeChat.
- Самостоятельное введение
- Давайте сначала разберемся с основами Java.Что такое утечки памяти и переполнения памяти? (Переполнение означает создание слишком большого количества объектов, что приводит к нехватке места в памяти, а утечка означает, что бесполезные объекты не перерабатываются)
- Как JVM определяет, что объект бесполезен? (Алгоритм поиска корня, начиная с GC Root, если объект не имеет ссылки, он считается бесполезным объектом)
- Какими объектами может быть корневой узел в алгоритме поиска корня? (объекты класса, объекты в стеке виртуальной машины, объекты, на которые ссылаются константы)
- В чем разница между перегрузкой и переопределением? (Перегрузка происходит в одном и том же классе, имя метода такое же, а список параметров разный; переопределение — это поведение между родительским и дочерним классами, имя метода и список параметров одинаковы, а процедуры в теле метода различны. разные)
- Есть ли ограничения на перезапись?
- Какие средства синхронизации есть в Java? (синхронизировано и заблокировано)
- Какая разница между двумя?
- Разница между ArrayList и LinkedList? (ArrayList основан на массивах, быстром поиске, медленном добавлении и удалении элементов, LinkedList основан на связанном списке, быстром добавлении и удалении, поиск неэффективен, потому что ему нужно перемещаться по элементам)
- Какая из двух коллекций занимает больше памяти? (В зависимости от ситуации, если ArrayList расширяется и элементы не заполняют массив, это будет занимать много места в памяти, но в целом памяти, занимаемой LinkedList, будет относительно больше, потому что каждый элемент содержит указатели на передний и задний узлы (указатель)
- Расскажите о базовой структуре HashMap (массив + связанный список, связанный список слишком длинный и превращается в красно-черное дерево)
- Почему HashMap не является потокобезопасным, и что не так с HashMap до версии 1.7 (многопоточная работа может привести к тому, что связанный список будет образовывать цикл во время раскрытия, а затем вызов метода get вызовет бесконечный цикл)
- Знаете о ConcurrentHashMap? Скажите мне, почему это потокобезопасно (с использованием блокировок сегментов)
- Какие методы должны заблокировать всю коллекцию? (при чтении размера)
- Из вашего резюме следует, что вы понимаете RPC, поэтому расскажите мне обо всем процессе RPC? (Запрос инициируется от клиента, передается в сокет, а затем сервер обрабатывает сообщение, и как его сериализовать.)
- После того, как сервер получит информацию об интерфейсе для вызова клиентом, как он может найти соответствующий класс реализации? (Отражение + аннотация, тут я не очень понимаю)
- Сколько алгоритмов существует для балансировки нагрузки dubbo? (случайный, циклический, минимальное количество активных запросов, согласованный хеш)
- Что случилось с наименее активным числовым алгоритмом, о котором вы говорите? (У провайдера есть счетчик для записи текущего количества одновременных запросов. Чем меньше значение, тем меньше нагрузка на сервер, и роутер отдаст приоритет этому серверу)
- Как сервер узнает алгоритм, который должен вызвать клиент? (Когда сокет передает сообщение, он передает стратегию алгоритма на сервер)
- Вы использовали Redis для распределенных блокировок, верно? Вы написали свой собственный инструментальный класс? (Нет, мы используем переиздание как распределенную блокировку)
- Как поток гарантирует, что он не заблокируется после получения ключа? (Добавьте срок действия к этому ключу)
- Что делать, если время экспирации истекло, а деловая программа еще не оформлена? (Э-э... вы можете гарантировать идемпотентность в бизнес-логике)
- Если несколько предприятий используют распределенные блокировки, каждый бизнес должен быть идемпотентным.Есть ли лучший способ? (Э-э... Подумав об этом, я пока понятия не имею. Интервьюер сказал, что я должен сначала пропустить его. удерживание снова сбрасывает время истечения)
- У вас есть бумага и ручка, вы пишете алгоритм и используете два стека для имитации постановки и удаления очереди. (Потому что у меня сложилось впечатление об этом вопросе, когда я просматривал его раньше, и я написал его быстрее, это заняло около пяти минут, а затем я сделал снимок и отправил его интервьюеру. Прочитав его, интервьюер сказал, что нет проблема и закончилось интервью. )
Первый вопрос был несложным, и все вопросы были простыми.Хотя ответы не были идеальными, процесс прошел относительно гладко. Несколько дней спустя отдел кадров Bigo пригласил меня в свою компанию на собеседование на месте.
две стороны
Приехав в компанию «Биго», дама пригласила меня в конференц-зал, подождав около получаса, вошел мужчина средних лет, очень вежливый, сказал, что прошу прощения за то, что заставил так долго ждать, и представил Бытие. сам технический менеджер, мы начали наш разговор.
- Как обычно, позвольте мне кратко представиться, и он также просматривает мое резюме во время этого процесса.
- Расскажите о проектах, с которыми вы больше всего знакомы. (Я начну с проекта электронной коммерции, которым недавно занималась моя предыдущая компания, от простого описания проекта до основных функций проекта и функциональных модулей, за которые я в основном отвечаю, бла-бла-бла... ... )
- Вы настолько хорошо знакомы с этим проектом, что нарисуйте схему архитектуры проекта в соответствии с вашим пониманием и расскажите, в какой части вы участвуете. (Эта тема до сих пор достаточно хлопотная. Ведь я давно ушел из компании, и структура этого проекта была немного расплывчатой. Конечно, в итоге пришлось стиснуть зубы и набросать примерный контур , начните доступ с фронтенда, а потом пройдите слой шлюза nginx, и наконец к конкретным сервисам и т.д., а также отметьте сервисные модули, в которых вы участвуете)
- В вашем проекте используется Spring Cloud GateWay, так как у вас уже есть nginx в качестве шлюза, зачем использовать этот шлюз? (nginx используется для балансировки нагрузки и как шлюз для клиентского доступа, gateWay — это шлюз для бизнес-уровня доступа, а также интегрирует фьюз Hystrix)
- Какова основная функция предохранителя Hystrix? (Чтобы предотвратить лавину обслуживания, вызванную сбоем вызова службы, его можно понизить)
- В вашем проекте используется Redis, как развернут ваш Redis? (Э-э... кажется, он развернут в режиме дозорного.)
- Расскажите, как вы понимаете Sentinel Mode? (Я мало что знаю о режиме Sentinel, поэтому я, вероятно, говорил о мониторинге Sentinel и тому подобном, а также о механизме сердцебиения, подобном команде ping, и о том, как определить, находится ли мастер в автономном режиме и т. д.)
- Так почему вы используете сторожевой режим? Почему бы не развернуть его в кластере? В начале, если он не мог понять свою точку зрения, он сказал, что сам Sentinel был развернут с несколькими экземплярами.Он объяснил это и сказал, что это план развертывания redis-cluster. (Э-э... Среда Redis создается специальным персоналом по эксплуатации и техническому обслуживанию, и приоритет должен отдаваться высокой доступности... Я начал чувствовать себя немного взволнованным, потому что я не знаю, почему)
- О, значит, вы думаете, что у кластера нет способа достичь высокой доступности? (Нет… Нет, я просто думаю, что режим Sentinel может быть более безопасным для репликации master-slave… Я не знаю, о чем говорю)
- Кластеры также могут обеспечить высокую доступность.Знаете ли вы, как они обеспечивают согласованность ведущий-подчиненный? (Ну тут я правда не знаю, могу только пропустить)
- У вас должен быть WeChat. Если бы вас попросили спроектировать WeChat Moments, как бы вы спроектировали элементы его атрибутов? (Ну... вам нужна таблица пользователей, таблица круга друзей, таблица друзей и т. д.)
- Ну, хорошо, вы также знаете, что существует почти 1 миллиард пользователей WeChat, поэтому он должен включать подбазу данных и подтаблицу.Если это вы, как спроектировать подбазу данных и подтаблицу? (Точка исследования для этого вопроса относительно велика, и мой ответ на самом деле средний, и интервьюер продолжал задавать вопросы в серии вопросов во время этого процесса, что привело к тому, что эта тема обсуждалась почти 20 минут. Из-за недостатка места ограничения, я не буду здесь подробно останавливаться.)
- Это почти готово. Наконец, напишите алгоритм. Есть набор несортированных целочисленных массивов. Вы разрабатываете алгоритм для объединения элементов массива в пары, а затем выводите логарифм наибольшей разности абсолютных значений и наименьшего абсолютного значения. разница.». (Когда я услышал этот вопрос, моей первой мыслью было использовать HashMap для сохранения, ключом является разница абсолютного значения между двумя элементами, значением является количество пар, если есть то же самое, добавьте 1, если нет, присвойте его в 1, а потом окончательно Карта сортируется, и выводятся значения максимального и минимального значения.После написания интервьюер сказал, что хотя результат был правильным, но не эффективным, потому что временная сложность обхода стала O (n ^ 2), а затем напомнил мне отсортировать это, я подумал об этом. У меня была идея. Я могу сначала отсортировать массив, затем сделать разницу абсолютного значения между первым элементом и вторым элементом, записать его как num , а затем зациклить первый элемент и вычислить следующие элементы, пока разница абсолютного значения не будет равна позиции num. , что намного быстрее, чем O (n ^ 2).)
После собеседования технический офицер спросил меня, есть ли у меня что-нибудь спросить у него Я спросил об обязанностях этой должности и стеке технологий, используемых в проекте, а затем попросил меня подождать, пока он проинформирует технического сотрудника о третьем боковая сторона. Честно говоря, вторая сторона вызвала у меня самые приятные ощущения, потому что интервьюер был очень любезен, процесс собеседования всегда был для меня положительным ориентиром и дал мне много советов по планированию карьеры, которые мне очень пригодились. хотя время интервью длилось полтора часа, но я не чувствовал, что оно было долгим.Весь процесс интервью был довольно комфортным, но из-за того, что это заняло много времени, я не мог вспомнить многие вопросы.
Три стороны
Через полчаса после окончания второго интервью начал заходить технический интервьюер с третьего интервью.По распределению количества волос на лбу можно догадаться, что он большая корова.Я сразу открыл вопрос , и я не очень хорошо отвечал в течение всего процесса, и вопрос интервьюера был не очень ясен, и часто приходилось повторять его с ним, чтобы четко подтвердить.
-
Вы понимаете бизнес? Подскажите, какие бывают уровни изоляции транзакций (на примере Spring, который я знаю лучше, я описал все четыре уровня изоляции транзакций Spring)
-
Если вы когда-либо занимались электронной коммерцией, вы должны знать, что вам нужно сократить запасы при размещении заказа, не так ли? Предположим, есть две службы A и B, которые управляют таблицей заказов и запасов соответственно.После того, как A сохраняет заказ , она терпит неудачу при вызове B для сокращения запасов. В это время A должен выполнить откат. Как должна быть организована эта транзакция? (Метод сокращения запасов службы B не выдает исключение, а вызывающая сторона, то есть служба A, выдает исключение)
-
Вы поняли разделение чтения и записи? (Эм... Я наверное немного знаю, то есть при записи входить в основную библиотеку, а при чтении читать подчиненную библиотеку)
-
Когда вы говорите чтение, ведомая библиотека читается.Теперь предположим, что есть таблица User с разделением чтения-записи, а затем есть поток ввнутри сделкиТаблица User обрабатывается сначала на запись, а потом на чтение.В это время данные не были синхронизированы с подчиненной базой данных.Как сделать так, чтобы при чтении можно было прочитать самые свежие данные? (После прослушивания я был немного сбит с толку и какое-то время не мог ответить. Позже интервьюер сказал, что ему следует найти способ гарантировать, что чтение и запись в транзакции выполняются в одной библиотеке.)
-
Rabbitmq используется в вашем проекте, так как вы справляетесь с потребительской стороной mq? (То есть после того, как потребитель получит сообщение, он сначала сохранит сообщение в базе данных, а затем будет регулярно запускать сообщение из базы данных)
-
То есть ваш mq сначала сохраняется в базе данных, а затем бизнес-логика заключается в том, чтобы прочитать сообщение из mq, а затем обработать его, верно? (Да)
-
Ваше сообщение уникально? (да, с уникальным ограничением)
-
Как вы можете гарантировать, что сообщение будет использовано? Или как сделать так, чтобы его можно было хранить в базе данных? (Здесь я начинаю паниковать, потому что я видел только часть логики доступа к mq, но лично не участвовал. Я ответил, исходя из своего понимания mq, он должен быть основан на механизме подтверждения ack Rabbitmq)
-
ОК, тогда вы разбираете всю логику обработки вашей потребительской стороны, а затем говорите мне, куда возвращается ваш акк (я слышу это, у меня на сердце немного холодно, я действительно не участвовал в части доступа mq, настаивайте Скальп нарисовал процесс по моему пониманию, а по факту полно лазеек)
-
Согласно вашему рисунку, если база данных вдруг выйдет из строя, как вы должны подтвердить, что ваше сообщение было получено? (Ээ... тогда можно сохранить сообщение при отправке сообщения... когда я отвечу, в моём сердце тысячи травы и грязи... Ладно, я ещё не играл. Уже.)
-
Что, если служба на стороне отправителя развернута на нескольких серверах? Когда вы сохраняете сообщение, база данных продолжает сообщать об ошибке уникальности? (Хорошо, ты выиграл... В конце концов, я только что сказал кое-что, ты сказал, что этот дизайн действительно плох...)
-
Забудьте об этом, пропустите это, теперь вы проектируете карту, а затем есть два потока для работы с картой, основной поток добавляет и удаляет элементы карты на высокой скорости, а затем асинхронный поток периодически удаляет основной поток в составить карту за 5 секунд Без удаленных данных, как бы вы спроектировали?
(Я плохо ответил на этот вопрос. После несложного размышления я сказал, что ключ карты можно пометить временной меткой. При обходе удаляются элементы, находящиеся менее чем за 5 секунд до текущей временной метки. Интервьюер Я, очевидно, не удовлетворен этим ответом, говоря, что этот обход повлияет на эффективность, ps: По этому вопросу, если у вас есть какие-либо идеи, вы можете сказать это в области комментариев!)
...есть и другие вопросы, но это все, что я могу вспомнить, так тому и быть.
После последнего вопроса интервьюер сказал, что процесс интервью окончен, и попросил меня вернуться и дождаться новостей. Услышав это, я знаю, что это, по сути, объявление результата. Оглядываясь назад, могу сказать, что моя работа в этом раунде интервью была действительно посредственной, плюс время тянулось очень долго: с 2:30 до 6:00 в тот день я был морально истощен. И действительно, через несколько дней hr WeChat уведомил меня, что я провалил третий раунд технического собеседования, и это собеседование закончилось провалом.
Суммировать
Выше приведен общий процесс интервью. Я должен сказать, что интервью на большой фабрике все еще очень техническое. Я многому научился во время этого процесса. Вот некоторые личные впечатления:
1,База!База!База! Важное сказано трижды, независимо от того, на какой стадии программисты, фундамент является самым важным. На собеседовании в каждой компании обязательно будут вопросы по базовым знаниям, если у вас некрепкий фундамент, вас могут исключить на первом же собеседовании.
2,Резюме нуждаются в правильной упаковке. Честно говоря, мое резюме должно быть упаковано, что также является важной причиной, почему у меня недостаточно рабочих лет, но я могу получить возможность собеседования Биго, поэтому необходимо правильно упаковать резюме, но помните одно, этоневозможно отделить от реальности, Например, у него было всего два года стажа, а он написал только три года. Небольшим фабрикам это тоже может сойти с рук, но для крупных фабрик это в основном сложно, потому что многие компании проверяют биографические данные, прежде чем присоединиться.
3.Ознакомьтесь с техническими моментами в вашем резюме. Упаковка резюме — это нормально, но вы должны быть знакомы с техническими моментами резюме.Например, если вы просто написали демо-версию rabbitmq, не пишите такие слова, как «знакомый», потому что многие интервьюеры будут задавать подробные вопросы. об очках навыков Глубоко культивируйте свое понимание этого очка навыков, как серийную пушку.
4.Будьте хорошо знакомы с пунктами в вашем резюме. Как правило, когда мы пишем резюме, нам нужно упаковать и украсить наши собственные проекты.Хорошо написанный проект может добавить много баллов к резюме. Но вы должны быть хорошо знакомы с проектом, и лучше не писать незнакомые модули. В этот раз автор понес большую потерю.В моем резюме есть проект электронной коммерции, и я написал об использовании rabbitmq для обработки заказов.Хотя я немного понимаю логику обработки той части заказа, я не сделал глубокое понимание, потому что я лично не участвовал. , Во время интервью интервьюер с трех сторон Биго был вынужден в конце концов потерять дар речи.
5.Совершенствуйте свое архитектурное мышление. Для младших и средних программистов ежедневная работа состоит в основном добавлении, удалении, изменении и проверке, и функция реализована.Такое мышление нельзя назвать плохим.Если вы просто хотите перейти на следующий уровень, вам нужно для обновления вашей собственной структуры в рабочее время Навыки мышления, например, если вас попросят взять на себя проект, как бы вы рассмотрели разработку проекта, от общей архитектуры до введения некоторых компонентов, до разработки конкретных бизнес-услуги, это все аспекты, которые необходимо учитывать при разработке проекта.Это хорошее упражнение для улучшения нашего архитектурного мышления, а также это важная часть проверки многих крупных компаний при опросе старших программистов.
6.Не будь голым. Это также мое самое простое предложение.Обстановка нехорошая, пойдем и лелеем ее, увы~~~~
В целом, это интервью с Биго было очень полезным.Хотя я немного пожалел,но мне не о чем было сожалеть.В конце концов,я хорошо подготовился к интервью.Если я плохо ответил на какие-то вопросы,значит,мне еще многое предстоит технических слепых зон. Если вы не понимаете, вы не понимаете, и вы не можете раздуть это вот так. Это можно расценивать как тревожный звонок для меня, вы все же нежны, хорошо тренируйте свои внутренние навыки, ведь овощи - первородный грех.
Рекомендация проекта с открытым исходным кодом
Другие рекомендации автора по проектам с открытым исходным кодом:
- JavaGuide: [Изучение Java + интервью] Обложка, которая охватывает основные знания, которые необходимо освоить большинству Java-программистов.
- springboot-guide: Учебное пособие по Spring Boot, подходящее для начинающих и опытных разработчиков (поддержка в свободное время, добро пожаловать в совместную поддержку).
- programmer-advancement: Я думаю, некоторые хорошие привычки, которые должны быть у техников!
- spring-security-jwt-guide:Начинать с нуля! Spring Security с JWT (включая проверку авторизации) бэкэнд-часть кода.