Уже почти двадцать лет Java входит в топ-3 самых популярных языков программирования. Она имеет широкий спектр применения: с ней делают и сервера, и сайты электронной коммерции, и игры (Minecraft), и приложения под Android. Java регулярно модернизируется и работает на всех платформах.
Спрос на Java-разработчиков очень большой. На hh.ru находится свыше 500 вакансий по запросу «Junior java» и более 10 000 вакансий «Java developer». В базе Rubrain.com около четверти исполнителей уровня Middle+ тоже указывают Java как один из своих основных языков программирования.
Поиск it специалистов нацелен не только на тех, у кого есть образование. Некоторые компании проводят собеседования с разработчиками даже не изучая их резюме, основываясь только на практических знаниях.
Перед тем, как нанять в команду разработчика, проводится собеседование. Чаще всего в 2 этапа:
- общение с рекрутером;
- общение с главным it-специалистом и руководителем;
Начинающим джуниорам с опытом работы 0-2 года задают общие вопросы: устройство языка, алгоритмы, структура данных, ООП, немного SQL и баз данных. А IT-рекрутеров в первую очередь интересует ваша мотивация, способность к быстрому обучению и работа в команде.
Категории вопросов, которые вам зададут почти в любой компании:
- ООП. Три принципа нужно знать обязательно. Это инкапсуляция, наследование и полиморфизм. Дополнительно к “трем китам” можно отнести и абстракцию, хотя у новичков на собеседовании такое спрашивают редко.
- Коллекции. Нужно хотя бы общее понятие того, что это и как работает. Знать основные интерфейсы. То, как они реализуются. Их преимущества и недостатки.
- Многопоточность. Довольна сложная тема — треды, семафоры, блокировки. Зависит от специфики работы, может быть важным пунктом, а может и не быть вовсе.
- Структуры данных. Что такое дерево и граф, их отличия. Что такое АВЛ деревья? Чем стек отличается от очереди? Касаемо java: какие классы в java реализуют стек или очередь? Чем LinkedList отличается от ArrayList? Что такое HashSet и его отличие от TreeSet?
- Понимание разницы между типами объектов. Например, чем абстрактные классы отличаются от интерфейсов; какие модификаторы являются общедоступными, а какие — частными?
- Библиотека JAR: что это такое, как она используется и как ссылаться на нее в вашем коде.
- Hibernate и Spring Framework. Это самые популярные фреймворки Java. Большинство компаний стараются нанять разработчика, который умеет использовать фреймворки Spring. Такие как Spring Boot, Spring MVC и Spring Cloud для разработки веб-приложений. Фреймворк Hibernate также очень популярен для сопоставления объектно-ориентированной модели предметной области с реляционной базой данных.
Также хорошо понимать основы HTML и CSS, XML, и иметь общие понятия о СУБД.
Большинство этих тем 100% встретятся на интервью. Некоторые из них (например, вопросы про деревья и графы) на практике редко могут пригодится, но знать о них нужно. На собеседовании от вас скорее ожидают хорошие знания базовых вещей. Но не теряйтесь, если у вас спрашивают термин, который вам не знаком. Так и скажите, вы не можете знать все.
5 примеров вопросов, которые могут задать на собеседовании
1. Какие типы garbage collectors существуют в Java?
Garbage collectors помогает в неявном управлении памятью. C помощью ключевого слова new вы можете динамически создавать объекты, которые после создания потребляют некоторую память. Когда работа выполнена и на объект больше не осталось ссылок, Java использует garbage, уничтожая объект и освобождает занимаемую им память.
Существует четыре типа сборщиков мусора:
- Серийный Garbage Collector
- Параллельный Garbage Collector
- CMS Garbage Collector
- G1 Garbage Collector
2. Как в Java остановить поток?
В Java есть три метода остановки выполнения потока:
- Блокировка. Используется для перевода потока в заблокированное состояние. Выполнение возобновляется, как только выполняется условие блокировки. Например, ServerSocket.accept () — метод блокировки, который прослушивает входящее соединение с сокетом и возобновляет заблокированный поток только после того, как соединение установлено.
- Сон. Используется для задержки выполнения потока на некоторое время. Поток, в котором используется метод sleep (), входит в состояние сна. Время, в течение которого поток должен перейти в состояние сна, указывается в фигурных скобках метода sleep (). Это статический метод.
- Ожидание. Метод wait () может быть вызван только из синхронизированного блока.
3. Непрерывные ячейки памяти обычно используются для хранения фактических значений в массиве, но не в ArrayList. Почему?
В случае ArrayList хранение данных в виде примитивных типов данных (например, int, float и т. д.) невозможно. Объекты данных, представленные в ArrayList, имеют ссылки на объекты, расположенные в различных местах в памяти. Таким образом, сохранение фактических объектов или непримитивных типов данных (например, Integer, Double и т. д.) происходит в различных ячейках памяти.
Однако это не относится к массивам. Значения объектного или примитивного типа могут храниться в массивах в непрерывных ячейках памяти, поэтому каждый его элемент не требует ссылки на следующий элемент.
4. В чем разница между ошибкой и исключением?
Ошибка — это неисправимое состояние, возникающее во время выполнения. А исключение — это условия, которые возникают из-за неправильного ввода.
Например, ошибку OutOfMemory невозможно исправить во время выполнения. Хотя она и может быть обнаружена в блоке catch, выполнение приложения будет остановлено и не может быть исправлено.
FileNotFoundException будет сгенерировано, если указанный файл не существует. Или возникнет исключение NullPointerException, если вы попытаетесь использовать нулевую ссылку. В большинстве случаев после исключения возможно восстановление (например, предоставив пользователю обратную связь для ввода правильных значений).
5. Чем HashSet отличается от TreeSet?
Хотя и HashSet, и TreeSet не синхронизируются и гарантируют отсутствие дубликатов, существуют определенные свойства, которые отличают HashSet от TreeSet.
Для HashSet хэш-таблица используется для хранения элементов в неупорядоченном виде. Однако TreeSet использует красно-черное дерево для хранения элементов в отсортированном виде.
Сложность/производительность. Для добавления, извлечения и удаления элементов сложность, амортизированная по времени, составляет O (1) для HashSet. Временная сложность выполнения тех же операций для TreeSet немного выше и равна O (log n). В целом производительность HashSet выше по сравнению с TreeSet.
Методы: hashCode () и equals () используются HashSet для сравнения объектов. И наоборот, методы compareTo () и compare () используются TreeSet для облегчения сравнения объектов.
Фриланс для программистов
Начинающие разработчики пробуются на различных фриланс-биржах. Некоторым компаниям иногда требуется нанять программиста для специфических проектов. Таким образом можно набить руку и получить неплохой начальный уровень в it-разработке.
Несколько полезных фриланс-бирж для начинающих и опытных программистов:
- UpWork. Необходимо знание английского языка, для того, чтобы со временем брать крупные заказы. На этой бирже зарубежные компании часто пользуются услугами опытных программистов, но предпочитают общаться лично, поэтому на одном гугл-переводчике далеко не уедешь.
- Kabanchik. Не самая популярная биржа, но подойдет для начинающих программистов. Заказчиков много, особенно тех, кто хочет получить работу подешевле. Зато можно сделать себе портфолио и получить хороший опыт. Единственный минус — большинство заказов на веб и мобильную разработку.
- GlobalFreelance. Для новичков — самое то. Много разных и достаточно простых заданий. Надолго тут не задержишься, зато и руку можно набить, и денег заработать, пока ищешь постоянную работу.
- Rubrain.com. Подходит, если уже есть опыт. Мы предлагаем программистов топовым российским компаниям («Яндекс», Сбербанк, X5) и зарубежным стартапам. Чаще всего это работа по проектам. Аутсорсинг программистов Java компаниям, которые в них нуждаются. Совсем джунов не берем, но постепенно можно пробовать пройти отбор.
- Pchel.net. Подходит и новичкам, и более опытным специалистам. Есть Pro-аккаунты, но можно работать и бесплатно. Заданий хватает для всех, но крупные проекты попадаются крайне редко.
Несколько советов для новичков:
- Постоянно учитесь. Самый важный и самый сложный пункт. В программировании нельзя один раз выучить и забыть. Технологии развиваются очень быстро, придется осваивать новые библиотеки, новые приложения. Чем дальше рост — тем больше разных специфик. Даже самые опытные сеньоры продолжают сталкиваться с проблемами, изучают новые технологии. Компаниям нужны услуги программистов, которые умеют находить выход из любых форс-мажорных ситуаций.
- Практикуйтесь. На одной теории далеко не уедешь. Курсы и книги — это очень полезно, но там редко бывают практика, над которой нужно действительно думать. Решайте задачки, пишите несложные программки, пользуясь документацией и вспомогательными материалами. Например, есть очень полезная платформа Codewars. Вы выбираете язык, уровень и она генерирует задачу, а рядом нужно вписать ответ. Чем она хороша? Во-первых, набивается рука — а это очень полезно новичку. Во-вторых, вы получаете практический опыт использования теории не по примерам из книг. Задачи нетипичные, иногда чтобы решить — надо потратить кучу времени. В результате, через несколько недель практики, глядя на задачу вы будете уже сразу представлять, как ее решить.
- Гуглите! Нет ничего постыдного в том, что вы будете искать решение или ответы в интернете. Даже самые опытные программисты могут что-то забыть. К примеру, некоторым просто лень писать большой блок, и они просто копируют уже чей-то готовый код, и просто переписывают его под свой проект. На собеседовании вам необходимо знать и уметь использовать базу. Но когда вы уже приняты — можно (и даже нужно) быстро и эффективно находить информацию любыми способами. Кстати, очень часто сами интервьюеры помогают кандидатам. Они дают намеки, реагируют на идеи и могут направить в нужное русло. Не бойтесь задавать вопросы. Если вы знаете решение, но что-то подзабыли — спросите.
Получить работу junior-разработчиком Java может быть непросто. Конкуренция жесткая, и большинство компаний озабочены поиском специалистов с определенным опытом. Покажите им, что вы разбираетесь в программировании, можете быстро учиться, работать над своими ошибками и стараться не допускать их в дальнейшем.
Обращайтесь в Rubrain.com, если вам нужны java-девелоперы или если вы хотите получить работу java-программистом.