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

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

  • автор:

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 используется лишь главным потоком выполнения программы.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Java Collection Framework

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

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

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

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

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

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

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 существует несколько способов синхронизации:

по методу/блоку инициализации — с помощью ключевого слова syncronized

по переменной — используя ключевое слово volatile

используя классы из пакета java.util.concurrent — в этом пакете собраны классы работа которых основана на атомарных операциях.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

S — Single Responsibility — означает что класс должен отвечать только за операции одного типа.

O — Open-Closed — описываемый класс должен быть открыт для расширения, но закрыт для изменений.

L — Liskov Substitution — если наш класс А является наследником класса В, то любой объект класса В может быть заменен объектом класса А без негативных последствий и нарушения функционала.

I — Interface Segregation — класс должен выполнять только те функции и задачи которые на него возложены, в ином случае это производит к потере ресурсов и появлению багов.

D — Dependency Inversion — зависимости самого низкого уровня не должны зависеть от зависимостей высшего уровня и наоборот — зависимости высшего уровня НЕ могут существовать без зависимостей низшего уровня.

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

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

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

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

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

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

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

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

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

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

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

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

Самое главное отличие — используя 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 будет отвечать за создание экземпляра этого класса и внедрение этого самого экземпляра в нужном месте.

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

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

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

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

Инстанцирование объекта — технический старт жизни любого объекта, работа конструктора.

Установка свойств и внедрение зависимостей — выполнение конфигурационных свойств бина и внедрение необходимых ему зависимостей.

Уведомление aware-интерфейсов — если бин реализует Aware интерфейс, он будет вызываться путем передачи имени бина set*() метод.

Пре-инициализация — метод postProcessBeforeInitialization() интерфейса BeanPostProcessor .

Инициализация — сначала выполняется метод бина с аннотацией PostConstruct , затем метод afterPropertiesSet() в случае если бин реализует InitializingBean, метод init() .

Пост-инициализация — метод postProcessAfterInitialization() интерфейса BeanPostProcessor .

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

Singleton — область видимости установленная по умолчанию, в случае если не установлен никакая другая видимость. Работает как любой паттерн проектирования Singleton.

Prototype — означает что каждый раз при обращении к контейнеру будет возвращен разные объекты.

Request — создает бин для одного HTTP запроса.

Session — аналогичен Request, но работает на уровне сессии.

Application — жизненный цикл ServletContext.

Websocket — создает бин для сессии веб-сокета

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

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

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

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

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

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

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

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

Beyond coding: a list of Java Developer’s typical tasks on a project

John Selawsky

Coding is all the rage nowadays. No surprises here: it pays well, is in high demand, and is easy to pick up from the comfort of your home. Sounds great, if it was not so confusing.

Software developers keep talking about all these meetings, reviews, bug fixing, documentation… whilst you as a newbie might’ve thought that being a coder is about writing code. Well, it is that, too, but the responsibilities of an average developer go beyond that. But don’t panic! In this article, you’ll discover the daily routine of Java developers. That way, you’ll know if becoming one is right up your alley.

Let’s check out typical tasks of a Java developer on a project. But first of all, let’s set a baseline and define what Java developers are there in the programming world, from the perspective of their experience and skill sets.

The Developers’ Hierarchy

It goes without saying that the following categories are quite smudgy. As a programmer you can be Middle/Senior as a highly skilled specialist in a narrow development, or a T-shaped specialist (with skills from different areas). Still, it’s good to know the general rules.

Level 1: Junior Developer

The junior position is a stepping stone, the beginning of your journey as a Java developer. At that stage of your career, you probably haven’t worked on a commercial product.

As a junior, you’ll be fixing minor bugs and working on existing features. Chances are, the company will also attach a senior developer to you who will act as your mentor. A mentor would be the one whom you address all your questions, concerns, and confusions. If you think that this sounds more like studying than actual work, you’d be correct. Indeed, the junior developer’s footprint on the released product is minimal. That does not mean that you should not take your responsibilities seriously! By performing well at this level and demonstrating a can-do attitude, you’ll become a middle developer in no time!

Level 2: Middle Developer

As evident by the title, middle developers are halfway between juniors and seniors. They are neither clueless greenhorns nor code ninjas that can solve problems by staring at them. Juniors become middles once they show the mastery of the frameworks and tools that the company uses (colloquially called “stack”) and that you are competent enough to independently finish small and middle-sized tasks without the mentor’s constant supervision. How long it will take you to get that coveted promotion is hard to gauge — it all depends on your goals and the company’s criteria.

Regardless of when you’ll become middle, your responsibilities will increase, and there will be less hand-holding. Writing tests, maintaining documentation, iterating upon existing code, taking the initiative to devise efficient solutions for the problems, sometimes even mentoring junior colleagues — these are some of the many new expectations that you will have to fulfill. Congratulations, you are now a fully-fledged member of the team!

Level 3: Senior Developer

Senior devs are the cream of the crop — they define the functionality and the scope of the project. They always see the task in a big picture mode and that makes them crucial contributors to the project.

As they usually understand the project’s scope and how all bits of the program interconnect, senior devs gain a few unique responsibilities. These include reporting the project’s progress to the upper management and clients, discussing the business end of the software development, and ensuring that the business and developing process work in cohesion.

Keep in mind that there is no universal certification that makes a developer a junior, middle, or senior. A senior from one’s company might be middle elsewhere. It all comes down to the company’s criteria. With that said, let’s now take a look at the responsibilities shared by all Java developers.

Daily Routine of a Java Developer

Let’s not dive deep into responsibilities of a Junior developer in their first days / months on the project and focus on the daily tasks of an experienced Java developer, whom you can become pretty fast, if you put in some effort. This things-to-do list is vast and requires hard and soft skills.

Designing New Solutions

No matter how complex or trivial the task is, all solutions begin their lives at the design stage. Coding is about complex logical problems that do not have predefined solutions. It’s up to you to devise fast and efficient solutions. You might stumble at the beginning, either relying on slow solutions or copying algorithms that you do not understand to look more intelligent. You will have to find balance, and that can only come due to practice. It is okay to fail as long as you are going to remain open-minded and receptive to criticism. Being stubborn is one of the worst traits that an aspiring software developer might have.

Writing New Functionality

Once you have settled on the initial solution, it is time to make it a reality. Efficiency is the name of the game in the coding world, and workflow ain’t an exception. All software companies use an application to assign tasks and track progress, the most popular one being JIRA. Your team leader will assign tasks to you most of the time. Ditto for time estimates, although it is a more flexible ordeal. You can argue for altering an estimate if you believe that the task demands less/more time.

Don’t fret too much if you fail such a “deadline.” They are called estimates for a reason, and the more tasks you finish, the better your assessment of the required time will become. Also, keep in mind that the task is not finished after you mark it as such. What comes next is a process of testing, code review, and potential rewrites.

Writing Tests

Uh-oh. “Everything worked fine on my PC,” but the code reviewer points out that your code failed a few tests. Tests? Yeah, tests. That you should have written before. I am not saying that you did not, but it is a task that not many developers enjoy doing. Thus, they might try to dodge these responsibilities as often as possible. While writing tests might feel like mundane chores, they are a necessity that ensures that programs run smoothly. Commercial applications are immense, and it is not feasible to manually check for every potential point of failure that your functions will have. Hence, tests.

So don’t slack and write your tests.

Finding and Fixing Bugs

Writing new functionality is not everything that devs have to do. Fixing bugs (caused by you or someone else) is another routinely assigned task that you’ll have to wrestle with. Here is how it works: Quality Assurance (QA) Engineers check the code for bugs by running a series of automated tests. Once they find these errors, they create a task in JIRA with the bug’s description and steps to reproduce it. An assigned dev then spends some time figuring out the root issue behind the bug and tries to fix it.

How much time it’ll take depends on many factors: the developer’s skills, whether they wrote that part of the code, and the obscurity of the bug in question. Sometimes, it can be as simple as “someone forgot to put a semicolon somewhere.” Other times, a bug can be so elusive that you will have no other option but to send the ticket back to QA because you cannot reproduce it. As with everything else in the world of Java — you guessed it — it becomes easier with experience.

Code Review

Remember that feeling of dread, getting your essay back glowing red from all the teacher’s remarks? Guess what, this feeling is back, coding edition! Yep, once you submit your code, it won’t get pushed to the main branch without a review from your supervisors. You will usually go through any issues together, using code review tools.

Highlighted issues can range from some obscene errors in logic that must be fixed before code will get greenlit to something inconsequential as suggestions on more efficient solutions. Although, you’d be wise to heed the latter kind of comments as well, as it is an easy way to improve your skills.

Code Analysis

Everyone has recognizable handwriting, and the same is true for their coding style. Indentation, methodologies, and approaches blend into a beautiful mess that requires regular maintenance. Companies conduct periodical code analysis, looking at parts of code to figure out its shortcoming and how to improve them. A common practice is to review the code at the end of the development process. By that point, the dev team has a better picture of what they had to do than initially. Thus, they can improve upon the existing code while it is still fresh in their memories.

Refactoring Code

Refactoring is like applied code analysis. Commercial software can be maintained and kept up to date for years. As developers’ practices and knowledge improve, they realize that old code does not hold up against modern standards. Enter refactoring, a process of rewriting the existing code from scratch without changing how it functions.

Essentially, imagine a messy and dirty office desk. Refactoring is akin to tidying the desk up. By the end of it, it would be the very same office table, although much easier to navigate and a lot more pleasant to look at.

Writing Documentation

Not all companies hire a technical writer — an employee who creates and maintains the documentation about the product’s functionality and code. In such a scenario, it would be up to you to document all the functionality that you introduce into a project. You will probably use tools like Confluence to collectively share and maintain the project’s documentation.

It might not be the most exciting endeavor, but in the future you will thank them when they’ll have to do some work on an old project, and they’ll have a concise description of the project’s functionality. Likewise, whenever you are first assigned to a new project, checking out the documentation is the best thing you can do, as it’ll contain answers to many of your questions.

Participating in Various Meetings

Traditionally, every morning begins with a stand-up: the team gathers in a circle (or in a Zoom call, if working remotely) and talks about what they did yesterday and what they are planning to do today. Stand-ups keep everyone up-to-date with the project’s status. They also streamline team leader’s decisions on whether they need to alter the tasks’ priority in any way.

The number of meetings and calls throughout the day will depend on your current task and your seniority. You might have meetings with QAs so that they can demonstrate how to reproduce a particularly intricate bug. If you are a senior developer, you might be asked to conduct a technical interview with a potential hire. The rule of thumb is that the higher you climb in your career, the more meetings you’ll have.

Key Skills of a Java Developer

Regardless of whether you end up using any of the resources above, here is one final cheat sheet of the key skills that any aspiring Java developer should have in their arsenal.

Technical Skills

  • Syntax
  • OOP
  • Collections
  • Generics
  • Streams
  • Multithreading and serialization

2. Spring Framework:

  • Spring Boot
  • Spring MVC
  • Spring Clouds

4. Testing tools:

  • JUnit
  • Mockito

5. APIs and Libraries.

6. JVM Internals.

7. Design Patterns and Architectural Patterns.

  • Jenkins
  • Docker
  • Kubernetes

9. IntelliJ IDEA.

  • Maven
  • Gradle

12. SQL and Databases:

13. Web/App Server:

  • Tomcat
  • JBoss

14. Web services:

  • REST
  • Big JAX-WS
  • JAX-RS

15. A little bit of HTML, CSS, JavaScript.

Soft Skills

1. Communication Skills.

2. Being Open to Learning.

5. Interpersonal Skills.

How to Become a Java Developer

That seems like a lot of things to do, eh? Well, if these tasks did not dissuade you, you are probably wondering — how can I become a Java developer? There are so many lesson plans, books, and guides that it might be hard to choose a single one. Don’t worry. I have prepared some materials that you can use as a guideline to get you started.

Keep in mind that while reading books and watching videos is always a good thing, the best way to learn coding is by, well, writing a lot of code. So, don’t slack on practice, whether it is doing some fun exercises on the web or writing small applications, whatever strikes your fancy!

1. Choose the course to solidify your Java fundamentals knowledge and get hands-on practice. I advice you to choose among online sources, so that you can learn at your own pace:

  • CodeGym: a gamified learning course devoted strictly to Java, from zero to hero level of expertise. It uses a futuristic narrative and motivational features to bring you back to learning again and again. But the strongest point there is practice: with hundreds of tasks on writing your solutions, fixing or retyping code, it may be chosen as the major platform for your practice. : an online interactive platform that offers free and low cost coding classes in web development, programming, computer science, and data science. Of course, Java basics is among them. The interface is user-friendly, and the level of complexity suits well for total beginners in coding.

2. Don’t forget about well-structured theory. Read Java tutorial for beginners (besides, it’s free):

3. Read professional Java-related blogs:

4. For a change of pace, watch Java videos on YouTube, like:

5. Join discussion boards where you can ask specific questions:

And finally…

Becoming a Java developer is not an easy task, but you will be aptly rewarded for sticking with this path. It is a profession that offers many growth opportunities, and it will keep you engaged with the variety of tasks that you’ll have to do each day.

Even if you figure out that it is not for you, after all, there is no hurt in trying out. Who knows, maybe becoming a software developer is something that you have been looking for all these years!

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

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

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

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

  • наиболее частое разделение на грейды в 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 грейд, особенно, если стек технологий будет знакомый

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

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

Java-разработчик: как им стать и сколько зарабатывает

IT — одна из самых популярных отраслей для переподготовки. Она привлекает высокими зарплатами, возможностью удаленной работы и карьерными перспективами. Заинтересовались? Расскажем все о профессии Java-разработчик.

Программирование — основа IT. Самые высокооплачиваемые и востребованные вакансии обычно связаны именно с ним. А Java — популярный язык программирования. На нем пишут сайты и приложения, которыми мы пользуемся каждый день.

Почему он стал таким востребованным?

Что такое Java

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

Он был создан в 1995 году и с тех пор стал третьим по популярности языком программирования в мире, согласно индексу TIOBE . Большинство крупных компаний и обычных людей ежедневно используют программы на Java.

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

Что такое фронтенд и бэкенд

Основные особенности Java для выбора языка программирования:

  1. Универсальность . Пусть он и сложнее, чем другой популярный язык Python, зато применяется в разработке буквально чего угодно. Он подходит и для фронтенда, и для бэкенда, и для мобильной разработки. Выучив Java, можно с легкостью найти подходящую сферу для трудоустройства и развития.
  2. Надежность . Почти все банковские приложения и бэкенд крупных сервисов написан на Java. Полностью переписать их с нуля почти нереально. Например, на морально устаревшем еще в 80-е языке Cobol до сих пор работает стратегически важное ПО в банках и на бирже. По большей части потому, что плавно перейти со старых решений на новые не получится. У Java такие же перспективы, только помноженные на масштаб. Количество важных сервисов, написанных на нем с 90-х, в разы больше. Так что без вакансий Java-разработчики не останутся.
  3. Относительно высокий порог входа . У Java сложный синтаксис и структура. Начать писать на нем тяжелее, чем на других популярных языках. Также для полноценной работы на Java требуется выучить не только сам язык, но и популярные фреймворки. Это шаблоны — готовые решения для различных задач. За счет этого для полноценной оплачиваемой работы, даже в роли начинающего специалиста, нужно запомнить много информации. Но чем выше порог входа, тем ниже конкуренция. А в перспективе, с освоением больших объемов данных, она дополнительно уменьшается.
  4. Работа в команде . Java используется для крупных проектов, а типичный разработчик на этом языке получает отдельную небольшую задачу. Таким образом Java-разработчику придется уметь работать в команде и сотрудничать с коллегами. А фрагментированные задачи в узкой сфере часто становятся причиной выгорания, так как работнику сложно увидеть результат своего труда.
  5. Поддержка сообщества . Java входит в топ-3 самых распространенных языков для коммерческой разработки. За счет этого вокруг него сформировалось огромное сообщество, в котором активно делятся информацией. С одной стороны, легко получить поддержку. С другой — среда вокруг языка отличается динамичностью, необходимо регулярно следить за обновлениями и повышать квалификацию.

Обязанности Java-разработчика

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

Начинающий Java-разработчик — junior должен уметь:

  • написать простой код на отдельной взятой задаче;
  • исправить ошибки, на которые укажут старшие товарищи;
  • протестировать написанное — по минимуму;
  • составить документацию.

У Java-разработчика уровня middle задач больше, он должен уметь:

  • заниматься разработкой новых решений;
  • планировать внедрение и разработку;
  • быть наставником для начинающих Java-разработчиков.

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

Уровень дохода Java-разработчиков

По данным Хабр.Карьеры за 2022 год, этот язык программирования продолжает быть одним из самых востребованных и высокооплачиваемых.

Медианная зарплата Java-разработчиков в 2022 году в зависимости от уровня:

  • junior — 79 000 рублей;
  • middle — 168 000 рублей;
  • senior — 250 000 рублей;
  • тимлид (руководитель команды разработчиков) — 270 000 рублей.

Нужно принять во внимание и регулярный рост зарплат программистов. По сравнению со вторым полугодием 2022 года они выросли:

  • у junior на 22%;
  • у middle на 12%;
  • у senior на 11%;
  • у тимлидов на 4%.

Что касается медианной зарплаты Java-разработчиков, то она составляет 165 000 рублей, для сравнения: средняя — 179 830 рублей в месяц. То есть можно констатировать, что специалисты по отрасли в целом зарабатывают равномерно неплохо.

Востребованность у Java-разработчиков также высокая. На hh.ru размещено 4500 вакансий, что больше, чем на любом другом языке программирования. Среди них ищут junior в почти половине случаев. Правда, нужно учитывать, что джуниор — это не специалист без опыта, а просто начинающий.

Один из главных плюсов карьеры Java-разработчиков — невысокий разброс зарплат по географическому признаку. В Москве, Санкт-Петербурге и других крупных городах уровень зарплаты примерно одинаковый.

Специальность Java-разработчика хорошо подходит тем, кто не хочет переезжать в большой город ради достойной оплаты.

Кроме того, для IT-специалистов в России есть много льгот, которые доступны сотрудникам аккредитованных компаний. Например, выгодная ипотека. С ее помощью можно быстро и недорого решить квартирный вопрос.

Трудитесь в IT-сфере? В Совкомбанке вы можете оформить ипотеку по льготной ставке от 3,9% на срок от трех до тридцати лет! Рассчитайте свой ежемесячный платеж и оставьте заявку на ипотеку прямо сейчас!

Что должен знать начинающий Java-разработчик

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

  1. Знание алгоритмов . Это основы программирования как явления, поэтому их стоит изучить всем, кто в принципе хочет работать в сфере ИТ. Одновременно с этим нужно освежить и знания базы информатики. Для изучения подойдут общие пособия. Например, «Грокаем алгоритмы» от Адитья Бхаргава, «Алгоритмы: построение и анализ» от Томаса Кормена или «Структуры данных и алгоритмы Java» от Роберта Лафоре.
  2. Синтаксис языка . Если алгоритмы можно сравнить с правилами, то синтаксис — это конкретные слова и выражения, которые позволят «разговаривать» на Java. Изучать синтаксис лучше, сочетая теорию и практику. То есть использовать конкретные учебные пособия, объясняющие те или иные особенности синтаксиса, а одновременно заниматься на тренажерах или курсах. Из книг начать можно с самых простых пособий, например, «Java. Руководство для начинающих» Герберта Шилдта. Затем перейти к его же книге «Java. Полное руководство» или к «Эффективному программированию» Джошуа Блоха.
  3. Паттерны и парадигмы . Паттерны — популярные шаблоны, которые программисты используют в написании кода. Есть как стандартные паттерны, которые должны знать все, так и более сложные. Подробнее о них можно прочитать в книге Элизабет и Эрика Фримена «Паттерны проектирования». Затем нужно перейти к парадигмам и чистоте кода. Они нужны для того, чтобы написанные программы были читаемы для других. Узнать об этом можно из книги Роберта Мартина «Чистый код».
  4. Базы данных . Информация в приложениях хранится в базах данных. По сути, это огромные таблицы. А работать с ними помогает отдельный язык SQL. Он отвечает за навигацию, поиск и внесение изменений. Без знаний SQL пройти собеседование на любого разработчика практически невозможно. Узнать об этом языке можно из пособия Алана Бьюли «Изучаем SQL». А закрепить информацию нужно будет практикой. Например, на Stepik есть много платных и бесплатных курсов по SQL и базам данных.
  5. Фреймворки . Необходимый минимум разработки на Java — знания хотя бы одного из популярных фреймворков. Например, Maven или Gradle. Изучая их, необходимо понять, как на практике собирать проект и как работать с внешними библиотеками готового кода. Особое внимание нужно уделить жизненному циклу сборки. Эту информацию часто спрашивают на собеседовании на вакансию Java-разработчика.
  6. Git . Это система управления версиями приложений. Она нужна для совместной работы нескольких программистов. Самый понятный аналог — Google.Docs с функцией группового редактирования и возможностью выделять правки. Советуют сразу использовать консольный Git, чтобы запомнить популярные команды, о них тоже любят спрашивать на собеседованиях.
  7. JDBC и JPA . Эти технологии нужны для соединения между базой данных и приложением на Java. Первая сложнее, вторая — проще, но имеет несколько реализаций. С обеими стоит уметь работать на базовом уровне.
  8. Spring . Платформа фреймворков, которые используются в современной разработке на Java. Знать их все новичку не обязательно, но изучить основные придется. Чем лучше знания и больше опыта с этими фреймворками, тем выше вероятность успешно пройти собеседование.

Список выглядит внушительным. Но не стоит пугаться, обучение на Java-разработчика занимает в среднем год при фулл-тайм загрузке.

Хотите найти более интересную и высокооплачиваемую работу? Приходите в Совкомбанк!

Работа в Совкомбанке — это возможности для самореализации и достойная заработная плата; это интересные проекты и неформальное общение; это ДМС для сотрудников и детей и коворкинг на море. Хотите так же? Ищите подходящие вакансии в вашем городе и присоединяйтесь к команде мечты!

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

Кому подойдет профессия Java-разработчика:

  1. Склад ума . Есть мнение, что для программирования не обязательно знать математику. Но если человеку было сложно понимать алгебру и геометрию на школьном уровне, то вряд ли у него получится заниматься коммерческой разработкой. Для оценки своих возможностей можно попытаться решать задачи из школьного курса информатики.
  2. Память . Java-разработчик должен не только понимать логику языка, но и чисто механически запоминать большие массивы информации. Без хорошей памяти тут не обойтись.
  3. Умение учиться . Даже опытные разработчики постоянно занимаются самообразованием, изучают фреймворки и учатся пользоваться новыми инструментами. IT — динамичная сфера, без регулярного обучения работать в ней нельзя.

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

Зависит ли уровень заработка от наличия высшего образования

Заключение

Профессия Java-разработчика — одна из самых востребованных в IT. Сейчас по ней максимальное количество вакансий по сравнению с другими языками программирования.

Медианная зарплата Java-разработчика — 165 000 рублей, а начинающего специалиста — 79 000 рублей.

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

В среднем обучение Java-разработчика занимает год, за это время нужно освоить алгоритмы, синтаксис, паттерны и шаблоны языка, изучить популярные фреймворки, научиться работать с Git и SQL.

Вся информация о ценах актуальна на момент публикации статьи.

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

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