Что должен знать java middle
Перейти к содержимому

Что должен знать java middle

  • автор:

Грейды в Java-разработке: junior, middle, senior

Какие бывают грейды в Java-разработке? В статье разбираемся, как происходит разделение на грейды, какие навыки нужны для каждого и как перейти из одного грейда в другой.

Евгений Хохлов
Tech Lead в Chatfuel, ex-CTO ICEBERG Sports Analytics

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

В данной статье мы рассмотрим:

  • наиболее частое разделение на грейды в Java-разработке
  • ключевые навыки, необходимые для каждого грейда
  • на какую зарплату можно рассчитывать в зависимости от грейда
  • как перейти из одного грейда в другой

Начнем с разделения. Чаще всего выделяют три основных грейда: Junior (начинающий разработчик), Middle (опытный разработчик), Senior (ведущий разработчик). И именно эти названия вы чаще всего увидите в описаниях вакансий. Это разделение достаточно условно, и разработчик не переходит с одной ступени на другую в одно мгновение (в конкретной компании таких ступеней может быть больше, чем общепризнанных). Обычно любую таблицу грейдов можно привести к обозначенным выше трем позициям.

Чаще всего Junior-разработчик:

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

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

Рассмотрим навыки, необходимые Junior Java-разработчику. Будем разделять навыки на две группы hard skills (технические) и softs kills (коммуникационные)

Hard skills Junior Java-разработчику нужны для решения небольших задач, поэтому понимание структуры проекта и глобальных архитектурных паттернов необязательно. Обычно для решения задач требуются:

  • основы объектно-ориентированного программирования
  • синтаксис Java
  • умение выбирать правильные коллекции для решения задач
  • базовые алгоритмы и структуры данных
  • базовые знания Git

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

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

Как было отмечено выше, основная ценность Junior-разработчика – это его потенциал развития. Поэтому компании проводят тщательный отбор на этой позиции. Чтобы увеличить шансы, часто требуется либо получить коммерческий опыт на стажировке, либо отточить навыки программирования на сайтах вроде leetcode или codewars.

Следующий и наиболее многочисленный грейд: Middle Java-разработчик. Middle-разработчик:

  • неплохо ориентируется в коде
  • может без поддержки реализовать проработанную и хорошо описанную задачу
  • может самостоятельно принимать небольшие проектные решения
  • помогает в поддержании документации / базы знаний проекта

Middle Java-разработчик обладает большим набором hard skills:

  • хорошо разбирается в основных библиотеках и фреймворках, которые используются в проекте
  • работает с инструментами логирования и мониторинга
  • настраивает систему сборки (обычно Gradle или Maven), может самостоятельно добавить новую библиотеку или поднять версию текущей

Со стороны soft skills добавляется взаимодействие со смежными командами. Поэтому важно уметь давать и получать конструктивную обратную связь. Уметь находить компромиссы.

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

Последний грейд – Senior Java-разработчик, требует большого опыта и налагает большую ответственность в принятии решений. Senior:

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

Senior-разработчик обладает примерно таким же набором хард скиллов, что и Middle, но обычно гораздо глубже понимает нюансы. Например, знает общепринятые подходы или известные проблемы в библиотеках.

Senior должен также владеть soft skills:

  • умеет планировать свое время
  • высоко инициативен
  • умеет убедить в своем видении
  • руководит и помогает развиваться младшим грейдам

Senior-разработчик высококвалифицированный специалист: он не только понимает, какое влияние на бизнес оказывает та или иная фича, но и может критически оценить риски, рассчитать трудозатраты и предложить улучшения.

Как повысить свой грейд?

Перейти с грейда на грейд не самая простая задача, надо приготовиться к тому, что поменяется не только ваша зарплата, но и задачи, которые вы делаете, и зона ответственности.

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

Второй шаг, существенно увеличивающий шансы: начать делать больше, чем от вас ожидается. Если вы Junior разработчик и вы разобрались в сложном месте в проекте – не поленитесь, обновите базу знаний, дополнительно подсветите те вещи, что были непонятны. Если вы Middle-разработчик – дополнительно задумайтесь, а как можно улучшить то, что я делаю, или как реализовать это быстрее.

На какую зарплату можно рассчитывать на каждом грейде?

Зарплата сильно зависит от многих факторов, прежде всего от города и от компании. Конечно, в рамках одной компании и одном городе junior разработчик будет получать заметно ниже, чем middle, а middle будет получать меньше, чем senior.

Но в среднем начинающие специалисты могут получать от 100 тыс. руб, а высококвалифицированные – от 300 тыс. руб.

На какой грейд можно перейти при смене языка программирования?

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

Грейды – удобный способ обозначить свой опыт и уровень знаний. Однако критерии отличаются в зависимости от компании и сферы реализации. От этого изменяется и заработная плата специалиста. В статье мы рассмотрели примерный уровень ожиданий и навыков для каждого из грейдов.

Полезные материалы

  • Канал по аналитике и разработке от ProductStar
  • Статья «7 причин стать Java-разработчиком»
  • Таблица навыков: Java-разработчик

Заинтересовала статья? Хотели бы стать Java-разработчиком с нуля? Советуем обратить внимание на курс от ProductStar «Профессия: Java-разработчик». На курсе опытные эксперты научат вас необходимым hard skills, менторы всегда будут на связи и смогут ответить на вопросы, вы сможете сделать свой проект и добавить к себе в портфолио, а Центр Карьеры подберет для вас стажировку с гарантированным оффером уже во время обучения.

16 вопросов мидлу: что должен знать Middle-разработчик

Аватарка пользователя Марина Александровна

Разобрались, что должен знать Middle-разработчик, какими hard и soft skills он обладает и не завышены ли требования сегодня.

Как считаете, завышены ли сегодня требования к Middle-разработчикам?
В пределах нормы
Они даже занижены

Что должен знать Middle-разработчик? Этот вопрос актуален как для тех, кто претендует на вакансию мидла, так и для тех, кто посматривает в сторону продвижения.

Стоит отметить, что несмотря на то что в IT выработана шкала для оценки программистов (trainee, junior, middle, senior, lead), с которой более или менее все согласны, с точным определением каждого уровня общего мнения среди компаний пока нет. Поэтому каждая компания устанавливает внутренние требования к навыкам каждого уровня.

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

Позиция Middle-разработчика предполагает не только уверенное знание языка программирования, но и широчайшие познания в смежных технологиях. Позиция Middle накладывает на специалиста ответственность не только программировать «всё что угодно», но и обучать, оптимизировать код, разбирать и поддерживать чужой код, как будто родной. Фактически сейчас для вакансий Middle-разработчика предъявляются требования, как несколько лет назад для Senior.

Мы выяснили, что должен знать Middle-программист в 2020 году, и собрали общие вопросы с собеседований, по ответам на которые работодатели определяют, «дорос» кандидат до мидла или нет.

Hard skills

Каков ваш уровень владения языком программирования и сопутствующими инструментами?

От программиста-джуна ожидается знание всех конструкций языка, знание большей части стандартной библиотеки. Знакомство с фреймворками (хотя бы с одним), инструментами коллективной разработки (систем контроля версий, таск- и баг- трекеров, естественно, IDE и др.). Требования к мидлам существенно выше. Как правило, ожидается доскональное знание базы (в том числе синтаксиса используемых языков), опыт работы и уверенные теоретические знания стандартных библиотек, необходимых фреймворков и инструментов.

В каких проектах вы участвовали? Сколько из них вели сами?

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

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

Каков ваш навык работы с базами данных?

Работаете с бэкендом? В таком случае вы должны свободно обращаться к базам данных, иметь навыки работы с одной или несколькими СУБД.

Знать и уметь строить оптимальную архитектуру БД. БД зачастую является самым узким местом производительности проекта. Менять архитектуру БД на живом проекте очень проблематично и дорого.

Это основное из того, что должен знать Middle-разработчик. Не стоит забывать и о нормализации, денормализации и характеристиках каждой нормальной формы.

Расскажите о своём уровне владения выбранной IDE

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

Другие технические навыки

Тут всё зависит от конкретной специальности, но эксперты сходятся в том, что знания должны быть продвинутыми: больше, чем одна библиотека и пара хинтов.

Что касается технических навыков Middle-разработчика по frontend JavaScript, то специалист такого уровня должен:знать один из популярных JS-фреймворков (Vue, Angular), а также популярную библиотеку (React);знать SASS/SCSS/Less/PostCSS;уметь самостоятельно настроить систему сборки проекта Grunt/Gulp/Webpack, работать с голым JS (ES5, ES6, ES7);знать и понимать RESTful интерфейсы;уметь пользоваться средствами совместного использования кода (Git + GitFlow).
Также есть дополнительные навыки, которые дают преимущества. Большим плюсом в работе будут:опыт разработки серверного кода под Node.js, TypeScript;понимание SOLID, Dependency Injection, знание Linux (Debian-like);опыт работы с TDD/BDD, тест-фреймворки (Mocha, Should, Chai, Jest);знание Docker (большим плюсом будет Kubernetes/Docker Swarm);опыт в PostgreSQL/MySQL etc.

Самое важное для мидла, это знать, как изнутри работает используемая тобой технология, твой фреймворк. Не то, как он производит рендер (с помощью VDOM и т. п.), а как код написан, как происходит магия. Открой GitHub, посмотри исходники React, как, например, this.setState заставляет компонент делать рендер.

Какие методологии разработки вы знаете? По каким из них работали?

Одной теории недостаточно. Вы уже должны были участвовать в проектах «под ключ» и понять, как работает та или иная методология. Хорошо, если у вас был опыт работы по нескольким методологиям: если так, обязательно проведите сравнение плюсов и минусов, исходя из практики.

Что ещё должен знать Middle-разработчик

Знать и уметь писать оптимальные запросы по выборке данных (DML-запросы).Немного знать про ACID, понимать, что это такое и зачем нужно.Знать три столпа ООП (наследование, полиморфизм и инкапсуляция).Знать, что такое шаблоны проектирования и зачем они нужны. Понимать различия между ними.Понимать, что такое SOLID и когда он уместен.Знать и понимать, что такое тестирование кода и как оно реализуется.Желателен опыт в написании тестов. Это заставляет мозг разработчика генерировать совершенно другой код. Я специально поставил этот пункт ниже SOLID и шаблонов проектирования: сначала SOLID и шаблоны, а только потом тесты. Тогда будет получаться код, который будет легче покрываться тестами.

Soft skills

Насколько вы коммуникабельны?

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

Думаю, что Middle-программист не должен принимать решения по архитектуре проекта, согласовывать требования с заказчиком и решать вопросы по блокерам, так как это входит в компетенции аналитика, PM и сеньора.

Несмотря на это, во многих компаниях перед мидлом часто ставится задача самостоятельно разобраться, чего хочет заказчик, как решить его проблему и какую архитектуру построить. На базе этих сведений формируется полноценное ТЗ, которое затем передаётся команде разработчиков.

Канадская компания выпустила AR-очки для пловцов

Ваши навыки работы в команде

С точки зрения soft скиллов Middle-разработчику, конечно, нужно осваивать компетенции: ведение переговоров, общение с командой, иметь представление об управлении командой. Эти навыки пригодятся в дальнейшем карьерном росте.

Умеете ли вы разрешать конфликты?

Этот навык также является частью коммуникации. Разногласия могут возникнуть и с заказчиком, и внутри команды. Если вам поручили роль наставника над младшими специалистами в проекте — в обязанности войдёт и урегулирование конфликтов.

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

Каков ваш уровень английского языка?

Уровень владения английским языком Middle-программиста должен быть не ниже Upper-Intermediate, так как этот специалист постоянно участвует в созвонах, конференциях, должен свободно читать и составлять техническую документацию.

Способны ли вы доступно доносить свои идеи, убеждать в их правильности?

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

Можно ли вас охарактеризовать, как внимательного человека?

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

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

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

На первом месте здесь стоит умение искать информацию. Перед собеседованием вспомните основные источники информации, к которым вы обращаетесь в первую очередь (после документации, разумеется).

Можете ли вы оценить время выполнения задачи?

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

Мидл уже имеет достаточный опыт работы, что позволяет ему декомпозировать задачи более-менее правильно. Мидл умеет декомпозировать, а значит он может точнее оценивать задачи. Он должен уметь соблюдать сроки. Это умение нельзя переоценить.

Планируете ли вы развиваться до сеньора или тимлида?

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

От новичка до тимлида: гайд по продвижению

Выводы

Так завышены ли сегодня требования к мидлам? На этот счёт мнения расходятся, но почти все специалисты сходятся во мнении, что каждая компания диктует свои правила, и то, что должен знать Middle-разработчик, будет напрямую зависеть в том числе от должности, на которую он претендует.

Не завышены ли требования к мидлам? Возможно, кто-то из IT-специалистов сталкивался с тем, что, уже несколько лет будучи мидлом, на собеседовании в какой-либо компании его оценивают как джуниора. Связано это, как правило, с двумя факторами: первое — разные требования в разных компаниях. Второе — часто в уровень квалификации, кроме перечисленных выше hard и soft skills, ещё включают погружённость сотрудника в предметную область, знание специфики бизнеса. Эти знания делают сотрудника ценным для текущей организации, но могут значить меньше в новой для него организации.

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

Что должен знать junior, middle, senior разработчик: отличия уровней и как расти

Кем ты видишь себя через 5 лет? Рекрутеры и HR-менеджеры не устают задавать это вопрос, а кандидаты продолжают скромно отвечать: middle, senior, team lead.

Но каким путем достичь этих профессиональных уровней? Что нужно сделать, чтобы выбраться из позиции junior и с гордостью написать в LinkedIn middle? И как выглядит дальнейшее карьерное развитие? Чем middle принципиально отличается от senior? Отвечаем на эти вопросы в статье и разбираем ключевые навыки разработчика на каждом этапе.

Как стать junior разработчиком?

Для начала разберемся в терминах. В общем понимании junior — это новичок с минимально необходимым багажом знаний для самостоятельного выполнения задач. Для лучшего понимания поделим junior-специалистов на 4 категории:

  1. Стажер (trainee) — Это человек, который находится на шаге до того, чтобы стать junior-разработчиком. Trainee уже знают основы языка программирования, однако применять его для решения реальных задач еще не умеют. Каждая задача должна быть разписана пошагово от А до Я. В основном, это стажировка. То есть trainee работает на опыте, но о фиксированной зарплате пока не идет речь.
  2. Junior-новичок. Это стадия, на которой junior получает первый оффер на фултайм, а вместе с тем свои первые реальные задачи. Такой разработчик имеет достаточно знаний, чтобы выполнять простые задачи без детального описания. Новичок умеет работать с документацией и находить в ней нужную информацию. Главные задачи на этом этапе — «набивать собственные шишки», учиться у опытных коллег и задавать много вопросов..
  3. Middle junior developer. На этом этапе уже можно покупать футболки с IT-шными приколами. Испытательный срок за плечами, а все процессы командной разработки уже понятны. Теперь этому специалисту можно давать задачу и не контролировать ее выполнение в течение дня. Самостоятельно декомпозировать задачи такой junior еще не умеет, но уже ставит более глубокие и конкретные вопросы.
  4. Strong junior. Это категория, на которой специалист по техническим навыкам уже middle или очень близкий к нему. Последнее, чего не хватает, — это существенный опыт в решении бизнес-задач.

Как стать middle developer?

Middle — это программист, который, в отличие от junior-специалиста, уже умеет решать свои проблемы самостоятельно. Но старшие коллеги могут помочь, если возникли трудности, с которыми middle не может до конца разобраться без помощи.

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

Hard skills

  • Понимание технологий, используемых в работе. Middle-специалист должен хорошо разбираться в программе, которую он пишет. Важно понимать, как работают определенные конструкции языка и уметь объяснить это другому человеку простыми словами.
  • Проведение code-review. Умение разбираться в чужом коде — прекрасный способ поделиться своим опытом. Кроме того, это позволяет понять общую структуру программы и увидеть места, которые можно улучшить.
  • Умение декомпозировать задачи. Обычно программист среднего уровня пишет код дольше, чем junior. Это связано с тем, что опытный специалист сначала должен разбить свою задачу на несколько последовательных этапов и ответить на вопросы, почему план выглядит именно так. В дальнейшем это поможет аргументировать свои решения. Также это тренирует умение разбираться в чужом коде.
  • Насмотренность и любопытство. Для того, чтобы принимать правильные решения, необходимо увидеть множество плохих и хороших решений других разработчиков. Специалист среднего уровня (вообще, как и специалист любого уровня) должен быть в контексте всего, что происходит в индустрии: технологии, практики, успехи и неудачи.
  • Понимание алгоритмов и того, где их можно применять. Мир программирования меняется очень быстро, но алгоритмы остаются стабильными. Важно понимать причинно-следственные связи работы определенных вещей, а также применять алгоритмы на практике, вместо того, чтобы мучить себя сухим заучиванием.
  • Умение писать понятный код. Опытный разработчик всегда пишет простой код, который будет понятен коллегам.

Soft skills

  • Самостоятельность
  • Умение видеть требования бизнеса
  • Понимание конечной цели проекта
  • Классные коммуникативные навыки
  • Уровень английского Upper-Intermediate и выше
  • Умение ясно доносить свои мысли
  • Стремление к дальнейшему карьерному росту

Как стать senior разработчиком?

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

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

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

Так что же нужно иметь/знать/уметь перед тем, как подаваться на performance review на этот профессиональный уровень?

  • Опыт. Главный показатель опытности — успешно запущенные IT-продукты, которые работают и решают определенную задачу бизнеса.
  • Технические навыки. Senior создает и продумывает архитектуру проекта, пишет инструменты для решения задач в разработке и фреймворки, которыми пользуются джуниоры и мидл-специалисты. От senior разработчика требуют не только найти решение, но и убедить в его правильности заказчика и команду.
  • Понимание всей картины проекта. Для одной задачи существует множество решений, но именно senior разработчик способен определить, какое является оптимальным в конкретном случае.
  • Коммуникативные навыки. Senior программист часто ведет проекты самостоятельно, поэтому очень важно уметь обрабатывать ТЗ (техническое задание) заказчика, задавать правильные вопросы, устанавливать сроки выполнения и строить план работ. Кроме того, работа в команде все еще остается очень важной составляющей. Senior умеет организовать рабочий процесс и не боится таких терминов, как Agile, Scrum и Kanban.
  • Навыкиментора и интервьюера. Подбор персонала и обучение новичков часто лежит на плечах senior-разработчика. Опыт позволяет выбрать, какие вопросы ставить, чтобы определить сильные и слабые стороны кандидата, а также как организовать рабочий процесс для тех, кто уже прошел собеседование.

А что дальше? Куди расти senior?

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

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

Куда может развиваться senior-разработчик?

Техлид (Tech Lead)

Также CTO (Chief Technical/Technology Officer) или CIO (Chief Information Officer). Это специалист, который строит архитектуру для всей команды и является самым сильным разработчиком в команде. Именно техлид выбирает техническое решение задачи: предлагает использовать определенные фреймворки, технологии и библиотеки. В обязанности также входит проверка кода и решение самых сложных или ответственных технических задач.

Тимлид (Team Lead)

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

Проект-менеджер (Project Manager)

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

IT-архитектор

Разработчик с большим опытом реализации коммерческих проектов, который умеет закладывать архитектуру (каркас) сложной IT-системы. Главная задача IT-архитектора — найти оптимальное решение между потребностями заказчика и возможностями команды.

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

Если тебе нравится IT сфера и ты только думаешь о карьере в айти, пройди наш профориентационный тест. Узнай, какая специальность подходит именно тебе. Или выбирай один из наших it курсов и успешно расти от Junior до Senior и выше ��

Java Middle Interview

Насколько насущный для людей уже имеющих какой-никакой опыт в Java вопрос о повышении уровня и движении дальше? Есть люди, которые выбирают долгий и тернистый путь Back-End разработчика штудируя все новые и новые для себя языки программирования, углубляясь в аппаратную или даже DevOps часть. Безусловно, это все полезные навыки и честь и хвала тому кто выбрал для себя этот путь. Но ведь есть и такие которые «всем сердцем любят» Java и хотят достичь высот именно с этим языком, не «отвлекаясь на всякие» Ruby-on-Rails, Python, C# или node.js.

При достижении определенного пика на уровне junior сложно понять, что именно надо знать и понимать для повышения своего скила. А ведь есть ряд вопросов которые, по моему мнению, являются базовыми, от которых уже можно «танцевать» и выстраивать логические цепочки в хитросплетениях этого богатого языка. Конечно это не отменяет того, что для повышения своего скила, а как следствие и уровня оплаты труда, полезно знать множество «сопроводительных» технологий, таких как ElasticSearch, Queue, AWS или GCS. Но это все специфика проекта на который вы собеседуетесь. А базовые знания для этого уровня, как ни странно, примерно одни. Это не значит что Вам можно «забить» на изучение других технологий и штудировать эти(либо подобные) вопросы — всю спецификацию проекта знать(или хотя бы понимать для чего и как используется та или иная технология) необходимо, однако знание базы на собеседовании даст вам необходимый плюс перед другими кандидатами.

И так, я бы выделил несколько тем которые следует знать, если не досконально, то хотя бы на достаточно высоком уровне: Java core, Java Collection Framework, Multithreading, OOP, SQL ну и конечно же Spring Framework. Каждая из этих тем встречается довольно часто и на собеседованиях на junior уровень, но для уровня middle нужны более углубленные знания. Там где junior скажет что в Java есть два типа памяти и каждая из них хранит свой тип данных, middle разработчик должен подробно объяснить структуру и принципы работы. В общем если junior должен знать что это такое, то middle уже должен еще и знать и понимать «с чем его едят». Естественно вопросы типа «Как перебрать все элементы HashMap?» должны вызывать у вас улыбку и незамедлительный и правильный ответ.

Java Core

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

Какие бывают типы памяти в Java?

В Java существует два вида памяти — heap и stack. Каждый из них хранит свой вид данных, имеет свою структуру и работает по своей схеме. Heap выделяет память под объекты и JRE классы, stack в свою очередь хранит ссылки на объекты и примитивы.

В чем разница между heap и stack?

Heap используется всеми частями приложения, в то время как stack используется лишь главным потоком выполнения программы.

Каждый раз когда мы создаем объект(практически всегда используя ключевое слово new ) — этот объект хранится в heap, а в stack хранится ссылка на этот объект:

Person person = new Person();

тут мы создаем новый объект Person(), после чего он сразу же помещается в heap, а person становится ссылкой на этот объект и хранится в stack.

Stack — упорядоченная структура и работает по схеме LIFO(Last-In-First-Out). у heap весь доступ к объектам происходит по ссылкам из stack.

Heap в разы больше stack, stack работает быстрее благодаря структуре, stack «живет» короткий промежуток времени, в то время как heap «живет» весь «жизненный цикл» программы.

Какая структура у heap?

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

Структура heap памяти.

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

Благодаря своей пирамидной структуре(если угодно — структура бинарного дерева) вставка/удаление элемента происходит за время O(logN).

Что такое packege access level?

В Java существует 4 модификатора доступа: 3 из них явных и один неявный. Private/public/protected — явные модификаторы, это означает что каждый из них нужно объявлять в коде. Так же существует четвёртый модификатор доступа — packege access level. Его необязательно объявлять в коде, данный модификатор означает что поле/метод будут доступны на уровне пакета или наследникам данного класса.

Что означает понятие JIT?

Аббревиатура JIT означает Just-In-Time. В JRE существует подобный компилятор, который компилирует байт-код в собственный машинный код прямо во время выполнения программы. Таким образом повышается производительность Java-программ. В свою очередь JIT компилятор повышает непредсказуемость работы программы и повышает сложность отслеживания причины багов и ошибок. Так же такому компилятору необходимо гораздо больше памяти в сравнении с интерпретируемой компиляцией.

Для чего нужна Double Brace инициализация в Java?

Double Brace инициализация используется в Java для наполнения коллекций(set, list, map, queue) одновременно с их объявлением. В случае если вам необходимо создать unmodifiable коллекцию, без Double Brace инициализации нам будет необходимо создать список, положить туда необходимое кол-во элементов и создать из этого списка unmodifiableList используя Collections класс. Используя Double Brace инициализацию мы имеем возможность «положить» в unmodifiableList все необходимые элементы сразу при объявлении.

Что такое WeakReference и SoftReference в Java? Какая разница между этими понятиями?

WeakReference и SoftReference упоминается в контексте сборки мусора.

SoftReference используется при кешировании внутри системы и будет удален сборщиком мусора в случае если осталось мало памяти, а на объект существуют только ссылки SoftReference. Это критично при кэшировании, так как наш сборщик мусора самостоятельно освободит нам память в критичной ситуации, но до этого момента не будет «трогать» эти объекты.

WeakReference — в случае если на объект ссылаются только через weak-ссылки, то объект будет удален сразу при обходе сборщиком мусора.

Это критические отличия между этими двумя типами ссылок.

Для чего используют слово static в Java? Возможно ли переопределить статический метод?

Ключевым словом static в Java можно пометить поле, метод, блок или внутренний класс и это будет означать что этот субъект принадлежит классу, а не объекту. Иными словами — при изменении субъекта, он одинаково изменится для всех объектов данного класса.

Мы можем перегрузить статический метод, но мы не можем его переопределить, так как он принадлежит классу.

Java Collection Framework

Так как Java язык для обработки большого количества данных, то и коллекции Вам знать просто необходимо! В целом, как правило, на этой теме внимания не заостряют, но Вы должны знать это и быть готовым вопросам сложнее чем просто «В чем разница между Set и List?» — это и так Вам должно быть известно и если Вам задали такой вопрос при собеседовании на должность middle, то стоит задуматься о квалификации того кто задал вопрос и о его компании в целом. Я выбрал несколько вопросов, которые помогут Вам более детально понять в каком направлении следует «копать».

В чем различия ArrayList и LinkedList?

В первую очередь в самой структуре — ArrayList «под коробкой» использует массив, следовательно, каждый раз при вставке элемента будет создаваться новый массив размера n+1(где n размер массива до вставки). Из-за этого для вставки элемента в середину списка потребуется сначала «освободить» место под новый элемент, «сдвинув» все элементы после места вставки влево. Вставка в конец массива происходит за константное время. Доступ же к элементам происходит быстрее благодаря индексу элемента.

В свою очередь в LinkedList каждый элемент «знает» своих соседей. Следовательно, что бы вставить новый элемент(удалить старый) в середину все что нам надо это записать ссылки на соседей и перезаписать у соседей. Однако для доступа по индексу необходимо «перебрать» все элементы и найти нужный индекс. Так же при использовании LinkedList следует помнить про затраты памяти на хранение связи между элементами.

В чем особенность Map в сравнении с Set и List?

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

В чем отличие между HashMap и Hashtable?

Hashtable потокобезопасна и синхронизирована, но из-за этого теряется производительность. Кроме того Вы не сможете записать парой ключ-значение null-null, в HashMap это доступно. У HashMap есть альтернатива — ConcurrentHashMap которая является потокобезопасной. В целом Hashtable более старый класс и появился в Java до введения Collection framework в целом и HashMap в частности.

Какая есть особенность у Queue? Какие порядки упорядочивания элементов Queue вы знаете?

Queue — коллекция, хранящая элементы в порядке очереди. Выделяют два порядка для упорядочивания элементов — LIFO(last-in-first-out) и FIFO(first-in-first-out) — основные отличия между ними в том что при LIFO элемент который был вставлен последний, первый же и будет возвращен/удален. При FIFO первый вставленный элемент будет возвращен(методы element() и peek()) либо удален(remove() и poll()).

Multithreading

Многопоточность — важнейшая тема при собеседовании на должность middle Java developer. Вот тут следует ждать и каверзных вопросов, вопросов с подвохами и перехода на более сложные темы. Крайне сложно вести разговор на равных по этой теме если Вы до этого не работали с многопоточностью или вся Ваша работа с ней заключалась в том что бы описать один поток и запустить его. Но понимание отдельных тем даст Вам необходимый баланс и Вы сможете произвести впечатление человека, который, если не досконально владеет темой, то как минимум не «плавает» в ней, а разбирается. Этот ряд вопросов поможет Вам сориентироваться в теме многопоточности и поможет Вам понять что нужно «подтянуть»:

Какими способами можно создать потоки в Java?

В Java доступны три варианта создания потока из класса — расширить класс Thread либо реализовать интерфейсы Callable или Runnable.

При использовании Thread мы запускаем поток методом start(), а описываем логику выполнения в методе run().

При использовании Runnable мы должны вызвать метод run(), а у Callable — метод call(). Так как и Runnable и Callable — интерфейсы, мы определим логику выполнения внутри их методов(Runnable и Callable являются функциональными интерфейсами которые имеют только один метод — run() и call() соответственно). Разница в этих двух интерфейсов в том что Callable возвращает результат.

Что такое монитор?

В случае если мы, например, имеем синхронизированный метод(помеченный ключевым словом syncronized ) и один из наших потоков заходит в этот метод, то этот поток блокирует этот метод для других потоков и любой другой поток которому нужно будет воспользоваться нашим методом будет «ждать» пока первый поток не закончит свою работу с методом. Про такую ситуацию говорят: «данный метод занят монитором». Монитор в Java — объект, который обеспечивает правильную работу в многопоточной среде — отметка что синхронизированный блок кода временно стал недоступен, отметка что блок кода стал доступен после выполнения, ожидание если синхронизированный блок занят другим потоком.

Какие есть способы синхронизации в Java?

В Java существует несколько способов синхронизации:

  • по методу/блоку инициализации — с помощью ключевого слова syncronized
  • по переменной — используя ключевое слово volatile
  • методы wait/notify/notifyAll
  • используя классы из пакета java.util.concurrent — в этом пакете собраны классы работа которых основана на атомарных операциях.

В чем разница между sleep() и wait(), notify() и notifyAll() методами?

Метод sleep() заставляет поток «заснуть» на определенное время(указывается в миллисекундах) после чего поток продолжит свою работу. Метод wait() освобождает монитор занятый потоком так что другие потоки могут использовать указанный блок кода и поток переходит в состояние waiting — поток будет ждать вызова метода notify() или notifyAll() другим потоком. Разница между notify() и notifyAll() в том что notify() «высвободит» один поток(какой именно определить нельзя) а notifyAll() «освободит» все потоки из состояния waiting в состояние running.

Что такое Dead lock?

Случай когда у нас выполняются два потока(A, B) и наш первый поток(А) заблокировал метод a() и второй поток(В) заблокировал метод b() и в то же время поток А пытается получить доступ к методу b(), а поток B пытается получить доступ к методу а() называют dead lock.

Зачем используют потоки-демоны в Java?

Потоки-демоны это «служебные» потоки, которые работают в фоновом процессе. Они служат для «обеспечения всем необходимым» основные потоки выполнения. В случае завершения всех основных потоков потоки-демоны завершатся автоматически, не дожидаясь окончания их выполнения.

Что такое Future в Java?

Future — это интерфейс Java который находится в пакете java.util.concurrent. Future представляет методы для определения того была ли задача выполнена, ожидание выполнения для получения результата, получение результата уже выполненной задачи. В глобальном плане Future можно описать следующим образом — мы определяем задачу для Future, Future выполняет эту задачу независимо от нас, мы получаем результат.

OOP

Java язык объектно-ориентированного программирования, значит и ООП будет рассмотрен уже под более детальным углом. Если на junior уровень вам было достаточно рассказать про три основные принципы ООП, то для middle Вы можете смело поправить собеседника фразой «А их разве всего три? Куда тогда деть абстракцию?». Ниже приведен ряд вопросов для того что бы Вы поняли чего Вы не знаете и что бы Вам стало понятнее что гуглить.

Дайте определение абстракции

Абстракция — процесс выделения общих значений и характеристик объекта, исключая незначительные, которые будут определены в конкретных наследниках.

В чем преимущество ООП?

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

В чем разница между композицией и агрегацией?

Агрегация — процесс при котором мы не строго связываем объекты, то есть наш корневой объект может существовать и правильно функционировать и без инициализации объектов-полей.

Композиция — процесс при котором мы связываем объекты строго, что значит что объект не только является частью другого объекта, но и не может быть частью других объектов.

Для полного понимания следует обратиться к примерам: наш корневой объект — машина( Car ). У машины есть двигатель( Engine ) и пассажиры( Passenger[] ). Мы можем высадить всех пассажиров(стереть массив Passenger , либо самому массиву, либо каждому месту передать значение null ) и машина будет функционировать и без них — это называют агрегацией. В то же время машина не может функционировать без двигателя и данный конкретный двигатель не может «обслуживать» другую машину — если наша Car Нonda Сivic, то у нее двигатель может быть только 2л и на Honda Accord мы его уже не поставим — это называется композиция.

Что такое динамическое связывание?

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

Что же такое динамическое связывание? Динамическое связывание означает что метод привязывается к конкретному коду в момент вызова, на этапе выполнения программы, на этапе создания объектов, а не при компиляции программы в байт-код.

Перечислите SOLID принципы

SOLID — это аббревиатура. Расшифровывается так:

  1. S — Single Responsibility — означает что класс должен отвечать только за операции одного типа.
  2. O — Open-Closed — описываемый класс должен быть открыт для расширения, но закрыт для изменений.
  3. L — Liskov Substitution — если наш класс А является наследником класса В, то любой объект класса В может быть заменен объектом класса А без негативных последствий и нарушения функционала.
  4. I — Interface Segregation — класс должен выполнять только те функции и задачи которые на него возложены, в ином случае это производит к потере ресурсов и появлению багов.
  5. D — Dependency Inversion — зависимости самого низкого уровня не должны зависеть от зависимостей высшего уровня и наоборот — зависимости высшего уровня НЕ могут существовать без зависимостей низшего уровня.

Что значит Liskov Substitution?

Рассмотрим ситуацию когда мы имеем класс А — пусть это будет класс грузовик( Truck ) и его наследник прицепной грузовик( Trailer ). Назначение что одного, что другого — перевозка грузов. Используя принцип подстановки Барбары Лисков мы можем заменить любой Truck на Trailer без потери производительности, без негативных последствий и нарушений функционала в любом месте в программе.

SQL

Java — язык для работы с большими объемами данных. Все эти данные хранятся в базах данных разного рода. Безусловно, NoSQL базы сейчас обрели популярность и встречаются в проектах все чаще. Но 80% существующих проектов работают именно с реляционной моделью. Секрет этого весьма прост — почти все Java проекты — высоконагруженные системы, требующие обработки большого количества данных и средства Java, в целом, конечно справляются с возложенными задачами, но аппаратная часть требует больших затрат на обработку этих данных. Тут нам и помогает SQL готовый принять на себя часть этих действий, тем самым облегчая жизнь для самой Java. Разные сервера баз данных предлагают разный функционал, но базовые вещи выделяются во всех и как раз они и приведены в этих вопросах:

Что такое хранимая процедура?

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

Какие вы знаете основные свойства транзакции?

Основные свойства транзакций баз данных сгруппированы и представлены в виде аббревиатуры ACID:

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

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

I — Isolation(Изолированность) — при выполнении одной транзакции параллельные транзакции не должны оказывать влияния на результат.

D — Durability(Надежность) — если система дала ответ об успешной транзакции, то мы не должны переживать о том что транзакция будет отменена при любом сбое. Транзакция успешно завершена, в ходе выполнения программы выпадает критическая ошибка, но транзакция уже выполнена и данные сохранены.

Что такое индексы? Как и где их применяют?

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

Что означает нормализация базы данных?

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

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

Разница между HAVING и WHERE?

Самое главное отличие — используя HAVING мы можем писать условие с использованием агрегатных функций. С HAVING мы должны использовать GROUP BY так как HAVING используется после формирований групп. То есть, сначала используется фильтр WHERE , затем формируются группы GROUP BY, после чего можно накладывать агрегации на условие HAVING . Следовательно — полностью заменить WHERE мы не можем так как на этапе исполнения WHERE мы еще не имеем групп по которым мы сможем фильтровать. А на момент выполнения HAVING мы уже имеем необходимые группы. Это спецификация выполнения SQL запроса.

Spring Framework

Spring хорош не только тем что дает нам необходимые механизмы для создания приложений(подчеркну — не только web! Сейчас Spring используется повсеместно и даже какие либо не сложные десктопные приложения лучше создавать используя Spring), но и сама концепция Spring, ее понимание, не только владение аннотациями Spring, а и понимание того как они вставляются, расширяет наш кругозор в Java. Например, IoC и DI — паттерны проектирования, которые используются не только в Spring. Знание того что использует Spring под коробкой даст вам необходимый уровень на собеседовании не только по теме самого Spring, но и Java в целом.

Что такое IoC? Как это используется в Spring?

IoC — один из принципов ООП. Расшифровывается как Inversion of Control и дает нам возможность просто описать класс, не заботясь о его инициализации. Иными словами — мы создаем классы, отдаем эти класс под управление системой, а система уже сама создает экземпляры этого класса и сама решает какой экземпляр и где его использовать.

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

Spring использует IoC-контейнер для инициализации классов, контроля за их использованием. Когда мы помечаем один из классов как @Service мы «отдаем» этот самый класс под власть Spring и дальше сам Spring будет отвечать за создание экземпляра этого класса и внедрение этого самого экземпляра в нужном месте.

Что такое AOP? Как это используется в Spring?

АОРаспектно-ориентированное программирование, парадигма программирования, призванное решить те задачи для которого ООП кажется избыточным. В основе идеи лежит выделение сквозной функциональности. Грубо говоря — мы выносим наш функционал, не относящийся к бизнес логике в отдельное место и даем ему набор правил когда и с кем работать. Сумбурно? Пример: мы не можем писать код без логов. Но логи — это не часть бизнес логики, это вспомогательный функционал. Мы можем описать всю логику логов в отдельном классе и затем каждый раз инициализировать этот класс для выведения лога или же мы можем создать отдельный класс(аспект) и навесить набор правил когда и где использовать этот код. Имеем класс Service, метод method() внутри и аспект LogAspect. Используя аннотации мы можем указать методам внутри LogAspect что они должны быть вызваны перед, либо после вызова Service.method(). Так же мы можем указать выполнение после возврата результата либо после ошибки.

Spring использует АОР, например, при проверке security при доступе на тот или иной эндпоинт.

Что такое Spring Bean?

Spring Bean — самый обычный объект Java. Можно сказать, что это обыкновенный POJO, с одной единственной оговоркой — этот объект управляется Spring и только им.

Жизненный цикл Spring Beans?

Жизненным циклом бина в Spring управляет контейнер Spring. После запуска контейнера он начинает создавать необходимые бины(компоненты) и внедрять зависимости. Когда контейнер завершает свою работу уничтожаются и бины связанные с ним. Весь цикл жизни бина можно разделить на 6 этапов:

  1. Инстанцирование объекта — технический старт жизни любого объекта, работа конструктора.
  2. Установка свойств и внедрение зависимостей — выполнение конфигурационных свойств бина и внедрение необходимых ему зависимостей.
  3. Уведомление aware-интерфейсов — если бин реализует Aware интерфейс, он будет вызываться путем передачи имени бина set*() метод.
  4. Пре-инициализация — метод postProcessBeforeInitialization() интерфейса BeanPostProcessor .
  5. Инициализация — сначала выполняется метод бина с аннотацией PostConstruct , затем метод afterPropertiesSet() в случае если бин реализует InitializingBean, метод init() .
  6. Пост-инициализация — метод postProcessAfterInitialization() интерфейса BeanPostProcessor .

Какие есть scope Spring Beans?

Scope бинов — области видимости бинов. Последняя версия Spring(на сентябрь 2022 — 5.3.19) включает в себя шесть областей видимости:

  • Singleton — область видимости установленная по умолчанию, в случае если не установлен никакая другая видимость. Работает как любой паттерн проектирования Singleton.
  • Prototype — означает что каждый раз при обращении к контейнеру будет возвращен разные объекты.
  • Request — создает бин для одного HTTP запроса.
  • Session — аналогичен Request, но работает на уровне сессии.
  • Application — жизненный цикл ServletContext.
  • Websocket — создает бин для сессии веб-сокета

У вас несколько бинов реализующих один интерфейс. Какой из них будет внедрятся?

Для правильного внедрения зависимостей существуют несколько способов и подходов. Самый первый из них — аннотация @Primary означает что данный бин будет внедряться по умолчанию. Так же существует аннотация @Qualifier — позволяет указать имя бина который необходим в данном месте. Так же мы можем внедрять list/map бинов. При указании имен для всех бинов-наследников одного интерфейса мы можем внедрить map где ключом будет имя бина, а значением сам бин. При внедрении list мы получим список всех бинов.

Как объявить сервис в Spring? Назовите все способы которые знаете

Сервис в Spring — часть бизнес логики, но на самом абстрактном уровне для самого Spring все бины мало чем отличаются — каждый из них это, в первую очередь, это @Bean который можно объявить в классе конфигураций. Далее мы можем объявить наш класс как @Component . Используя аннотации мы можем объявить наш класс @Service что «облегчит» работу Spring при инициализации бина(все бины инициализируются в очередности от тех кто не требует ни каких внедрений и до тех кто «не может жить» без зависимостей. Сервисные слои инициализируются «посередине» и мы даем явно понять Spring когда создавать этот бин). Кроме того мы можем объявлять бины используя xml конфигурацию Spring.

Какой класс в Spring отвечает за анализ входящих http-запросов и их направления в определенный контроллер?

В Spring за «разведение» http-запросов по соответствующим контейнерам отвечает класс DispatcherServlet. После получения запроса DispatcherServlet обращается к интерфейсу HandlerMapping, который и рассказывает DispatcherServlet какой именно котроллер отвечает за этот запрос. После обращения к контреллеру DispatcherServlet, получивший имя представления(View), обращается к ViewResolver для получения View по его имени. После создания View DispatcherServlet отправляет данные Модели в View который и отобразится в браузере.

Что такое Spring Security? В чем разница между авторизацией и аутентификацией?

Spring Security — часть Spring Framework представляющий механизмы для контроля за авторизацией пользователей. Для управления Spring Security необходимо создать конфигурационный класс-наследник WebSecurityAdapter.

Аутентификация — процедура проверки подлинности, например проверка подлинности пользователя путем сравнения введенного им пароля с паролем, сохраненным в базе данных

Авторизация — предоставление определенному лицу или группе лиц прав на выполнение определенных действий.

Подведем итог

Я не гарантирую что каждый из этих вопросов попадется Вам на собеседовании, но внимательно прочитав эту статью вы сможете определить ряд вопросов для себя и уменьшить круг поисков. Более того, возможно, на собеседовании уделяться время будет как раз таки другим технологиям — микросервисной архитектуре, работе облачными технологиями, работе с Docker, либо Вас будут гонять по NoSQL базам данных. Но будьте уверены — темы из в этой статьи будут затронуты тем или иным образом на собеседовании. Так же не затронул банальные вещи типа web, паттерны проектирования, логирование и тому подобные вещи которые Вы и так должны знать, более того Вы должны знать, что Вы должны это знать! Спасибо за внимание 🙂

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *