Советы сеньоров: как прокачать знания junior Java

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

Павел Желнов, Senior Java Developer, 18 лет опыта Java разработки:

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

Язык необходимо знать досконально. Это фундамент, на котором строится проект, от небольшого веб-сайта до банковского энтерпрайза. Без этих знаний сложно создать гибкую, масштабируемую и безопасную систему, работающую стабильно и эффективно. Где их можно получить?

Документация классов Java

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

Книги

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

На моем столе лежат всего четыре:

  • Effective Java (Josh Bloch);
  • Clean Code (Robert Martin);
  • Design Patterns (Head First, O’Reilly);
  • Refactoring (Kent Beck & Martin Fowler).

Для начинающих стоит пролистать Thinking in Java (Bruce Eckel)

Гуглите и найдете

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

Практика

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

Собеседование

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

Рекомендую также перед собеседованием просмотреть ресурсы, похожие на этот и пролистать странички, касающиеся Java, Hibernate, Spring.

Ой, мне надо знать еще один язык?

Не все упирается в мастерское овладение языком Java. Ребром становится вопрос знания английского! Кратко, как можно прокачаться в этой сфере:

  • пополняйте свой словарный запас. Хоть техническую литературу не Чарльз Диккенc писал, все же вы себя будете чувствовать комфортнее, если вы знаете 3 тысячи слов, а не 200. Для этого нужно немного: книга уровня чуть выше вашего, словарик, ручка и тетрадка;
  • каждый день слушайте болтовню ребят с TED Talks, включайте новости BBC или просто старые записи Джорджа Карлина. Тренируйте свои способности слушать и понимать речь, это очень важно;
  • преодолевайте разговорный барьер: находите носителей языка и общайтесь с ними, не бойтесь ошибаться. Важно, чтобы вас понимали.

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

Становление самурая

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

Всегда ищите возможность общаться с людьми, которые знают больше вас. Идеальный вариант — поработать с этими людьми над общим проектом. Они могут вам открыть ту истину, которую ни в одной книге не напишут.

Даже если вы достигли звания Архитектор, не пренебрегайте возможностью общаться с более умными людьми.

Смахивайте ржавчину с мозга. Мозг — это оружие. И оно должно быть всегда заряжено. Держите это оружие в форме и оно вас не подведет:
www.codewars.com
www.codingame.com

Будьте проактивными и ваше развитие будет стремительным и уверенным!

Андрей Паславский, Team Lead, 13 лет опыта Java разработки:

Как «войти в ИТ» есть уже 100500 статей с кучей рекомендаций и советов, ссылок на курсы, школы и тому подобное. К сожалению, на данный момент сформировалась такая ситуация, когда программистов не хватает, но при этом у рекрутеров лежат стопочки с резюме потенциальных кандидатов, которые хотят «войти в ИТ». Грубо говоря, их три: те, кто хорошо прошли стажировку от компании или закончили школу и получили рекомендации; те, кто просто закончил школу, курсы, стажировку; и все остальные. В первую очередь, когда открывается позиция Junior, рекрутеры листают первую папочку, могут заглянуть во вторую, но до третьей практически никогда не добираются.

Мне кажется, основной вопрос не в том, как войти в ИТ. Основной вопрос: осознаю ли я, что это за работа и как выделиться на фоне всех остальных?

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

В этом плане помогут курсы стажировки, разные workshops и workgroups. Нужно уметь работать в команде. Здесь волки-одиночки никому не нужны (если только вы не Линус Торвальдс, Бьёрн Страуструп, Мартин Фаулер). Попробуйте скооперироваться с вашим соседом и написать калькулятор вместе (не надо придумывать МЕГА проект, просто калькулятор). Это окажется в разы сложнее и дольше, чем вы бы это сделали сами. Это и будет маркер: вы эффективнее один, чем в группе. Работайте над собой, над своими навыками коммуникации и кооперации. Учитесь работать в команде.

Сколько бы вы не работали в ИТ — всегда будете учиться. Не получится пройти курсы «столяра» и пойти «работать на завод». У каждого мозги работают по-разному, поэтому вы должны сами найти форму обучения, которая для вас будет максимально эффективной (я не могу сказать, что для вас будет лучше: пробовать писать свои Pet projects или проходить online курсы один за другим). Учите учиться. Навык самообучения необходим в нашей индустрии, т. к. и через 10 лет вы будете продолжать учиться.

Ходите/ездите на конференции, они нужны в первую очередь для Junior. Да, может быть дорого, но это даст понимание того, что сейчас в тренде; сможете завести полезные знакомства и окунуться в мир людей, которые занимаются ИТ уже годы/десятилетия. Может быть где-то встретите человека, который скажет, что у него есть работа для вас. И вообще это fun, нужно получать удовольствие от того, чем вы занимаетесь.

Заведите свой аккаунт на GitHub и выкладывайте туда свои Pet projects. Это важно! Работодатель сможет оценить, с какими языками работаете, какие технологии изучаете и как развиваетесь. Он сможет запостить какие-то баги, придирки, рекомендации и посмотреть, как общаетесь, как реагируете и как работаете над ошибками. Вас могут намеренно спровоцировать — учитесь работать с клиентами, они бывают «разные». Здоровый юмор тут приветствуется.

Также очень важно понимать разницу между разработчиком и программистом. Погуглите об этом, в интернете уже написано много статей на эту тему. Но отдельно я хочу выделить навык «транспонирования своего опыта». Невозможно освоить и изучить всё, но можно научиться проводить аналогии и применять свой опыт в области, где никогда не работали. Нужно научиться анализировать и видеть общие идеи. Этому научиться сложно, но попробуйте начать с patterns: Java Patterns, Design Patterns, Enterprise Patterns. Это многолетний накопленный опыт, который разложили уже по полочкам для вас. Не пренебрегайте этим!

Сделайте ИТ своим хобби, работайте над собой в этой области факультативно. Да, компания и проект, где будете работать, определят уже конкретный стек технологий и будет понятно, что нужно изучать. Но не останавливайтесь на этом. Как только станете выполнять свою работу от «забора до забора» — в какой-то момент перестанете развиваться, а ИТ-индустрия не любит этого. Через некоторое время не будете котироваться на рынке и потеряете квалификацию.

Андрей Слободяник, Tech Lead, 11 лет опыта Java разработки:

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

Вторым условием роста я вижу процесс Code Review. Недостаточно, чтобы код просто работал, для джуниора (и не только) необходим взгляд со стороны по поводу подходов, компоновки кода, фреймворков и т. д. Иначе есть риск быстро поймать эффект Даннинга-Крюгера. Технически опасные места также помогут отловить статические анализаторы кода — FindBugs, Sonar etc.

Про Unit Test-ы. При написании метода весьма желательно держать в голове мысль: а как же его тестировать? Это позитивно влияет на архитектуру. Если тест написать не удается или удается, но тест громоздкий, это симптом о том, что код, скорее всего, плохой, и, даже если работает сейчас, то будут проблемы потом с его переиспользованием и модификацией.

Пример из Java:

public void congrats() {
    Date today = new Date();
    if (today.getMonth() == 1 && today.getDay() == 1)
        System.out.println("Happy New Year!");
}

Тут баг, но куда бОльшая проблема в том, что непонятно, как проверить этот метод. Другая крайность — это написание слишком «открытых» классов. Найти баланс должен помочь предыдущий и следующий пункт.

Четвертое. Не копипастить! А стараться переиспользовать код. Идеи, как разбить его на части, черпаем в шаблонах проектирования.

Пятое. Использовать существующие библиотеки. Задуматься и загуглить, что задача, например, склейки строк через запятую, возможно, уже где-то решена. И на скорую руку кешировать какие-либо результаты в Map тоже не лучшая идея.

Шестое. Не генерировать код с помощью IDE и аналогичных утилит. Безусловно, он нужен, но зачем же загромождать им исходники проекта? Скорее всего, эту генерацию можно включить в сборку. Например, для getters/setters и других фич подключаем Lombok.

В общем, стараемся писать поменьше, читать и думать побольше.

Андрей Белицкий, Software Architect, 7 лет опыта Java разработки:

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

Касательно знаний: существует матрица компетенций программиста, ее легко найти в интернете, например, здесь (1 часть, 2 часть). Эти таблицы помогут примерно понять, где вы находитесь и в каком направлении стоит работать. Список литературы по ссылке смотреть не стоит — он там, судя по всему, для примера.

Из литературы по Java я бы порекомендовал «Effective Java» Joshua Bloch — было много изданий, лучше брать последнее (вроде есть на русском) и «Java Concurrency in Practice» Brian Goetz — книга 2006 года, но, на мой взгляд, до сих пор наиболее актуальная книга по многопоточности в Java (насколько я знаю, не переводилась на русский). По OOP/OOD я бы рекомендовал почитать GoF (есть на русском) или Head First Design Patterns — поскольку считаю, что знание паттернов для Java-разработчика — это must have. А для общего развития — «The Pragmatic Programmer» Andy Hunt и Dave Thomas (есть на русском). В ней в формате небольших заметок и советов описаны принципы и типичные проблемы с решениями, которые в целом есть в индустрии (не смотря на то, что книга издана в 1999, большая часть все еще актуальна).

Кейсы и полезные советы, на мой взгляд, не очень работают, поскольку невозможно получить опыт, самостоятельно не набив шишек. Единственное, что могу посоветовать, — читайте хорошие книжки и работайте по максимуму, любите то, что вы делаете, и тогда все получится. Это может звучать банально, но я встречал разработчиков с тремя годами опыта, у которых было больше знаний, чем у специалистов с 10-15 годами опыта. Весь вопрос в желании и, соответственно, временных инвестициях, в том числе и вне работы. Удачи!

Евгений Хист, Java Tech Lead, 7 лет опыта Java разработки:

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

Одним из таких проектов является Docker, который за последние годы произвел революцию в сборке, тестировании и развертывании приложений. Docker позволяет «упаковать» приложение со всем окружением и зависимостями в контейнер. Этот контейнер может быть запущен на любой системе, поддерживающей Docker, в разы быстрее и потребляя намного меньше ресурсов чем системы виртуализации. Используя Docker, запуск контейнера с RabbitMQ или Redis для интеграционных тестов и его остановка после их выполнения становится тривиальной задачей. Начать знакомство с Docker и его экосистемой можно с бесплатных интерактивных браузерных курсов Katacoda. На этой площадке также можно найти интерактивные курсы по системе контроля версий Git, Continuous Integration и Continuous Delivery с использованием Jenkins и системой управления кластером контейнеров Kubernetes.

Spring Boot сегодня настолько популярен, что если вы до сих пор его не знаете, стоит ознакомиться. Официальная документация Spring Boot отлично подойдет для этого.

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

Начать я рекомендую с основ объектно ориентированного дизайна (OOD). В блоге Роберта Мартина есть отличные статьи о принципах дизайна классов SOLID и принципах свя́зности (cohesion) и зацепления (coupling) пакетов. Подробнее эти вопросы Роберт Мартин раскрывает в книге «Agile Principles, Patterns, and Practices in C#». Несмотря на наличие C# в названии книги, она будет полезна и Java разработчикам.

С выходом Java 8, помимо объектно-ориентированного подхода, распространение получил функциональный подход. Lambda выражения, java.util.Optional, java.util.Stream, java.util.concurrent.CompletableFuture и Flow API (java.util.concurrent.Flow) в JDK 9. Чтобы разобраться с этой темой рекомендую цикл статей «An Introduction to Functional Programming in Java 8». Также популярность набирает связанное с функциональным подходом реактивное программирование (Reactive Streams, RxJava, Reactor). Начать знакомство с этой темой можно с бесплатной мини-книги от InfoQ «The InfoQ eMag: Reactive Programming with Java».

Domain-driven design — это еще один набор принципов и подходов к проектированию ПО, который заслуживает внимания Java разработчиков. Начать знакомство с этой темой можно также с бесплатной книги от InfoQ «Domain Driven Design Quickly». Более подробнее об этой теме можно почитать в мини-книге Эрика Эванса «Domain-Driven Design: Tackling Complexity in the Heart of Software».

Говоря о проектировании ПО нельзя не упомянуть Мартина Фаулера и его книги. В блоге Мартина можно найти множество полезных статей о проектировании ПО. Также рекомендую к прочтению его книги «Patterns of Enterprise Application Architecture» и «NoSQL Distilled: A Brief Guide to the Emerging World of Polyglot Persistence».

Много полезных статей можно найти на IBM developerWorks. К таким можно отнести довольно старую, но все еще актуальную серию статей о стратегиях работы с транзакциями. Также о транзакциях в Java можно прочитать в бесплатной книге от InfoQ «Java Transaction Design Strategies».

«The Data Model Resource Book» — это серия книг в 3 частях о проектировании ПО, которая заслуживает внимания. «The Data Model Resource Book, Vol. 1: A Library of Universal Data Models for All Enterprises», «The Data Model Resource Book, Vol. 2: A Library of Data Models for Specific Industries», «The Data Model Resource Book, Volume 3: Universal Patterns for Data Modeling». Конечно, не обязательно один в один использовать модели данных, описанные в этих книгах. Знакомство с ними позволит лучше понять принципы проектирования модели данных, позаимствовать какие-то приемы и избежать ошибок.

Говоря о профессиональном развитии нельзя не упомянуть YouTube. Часто, пользуясь поиском, можно найти полезные видео с докладами и лекциями. Хочу порекомендовать 2 канала, на которых каждое видео заслуживает внимания: Devoxx Conferences и GOTO Conferences.

И, напоследок, лайфхак. Пользуйтесь шпаргалками DZone Refcardz, чтобы освежить в памяти библиотеки, фреймворки и подходы. Например, перед собеседованиями.

Евгений Годун, Senior Java Developer, 5 лет опыта Java разработки:

В карьере программиста я бы выделил три основных вектора развития, в сторону которых надо было начать работать еще вчера, так что после прочтения сразу приступай к делу!

Английский язык. Как и зачем?

Ну, во-первых, Java написана на английском языке. Если серьезней, то на stackoverflow, который будет вашим самым посещаемым сайтом на первых порах, гораздо больше ответов на английском. Плюс документация ко всем фреймворкам на английском. Плюс книги не так быстро переводятся, как хотелось бы. Плюс, если у вас распределенная команда, то ребята из Америки довольно редко общаются на русском (у меня есть такой знакомый американец, который заканчивает все митинги фразой «Dobriy vecher». Но это скорее исключение). Поэтому тут схалтурить не получится.

Во многих компаниях есть курсы английского для сотрудников (это хороший вопрос на собеседовании, когда hr-ы спрашивают, чего бы тебе хотелось узнать о нас). Из приложений я бы посоветовал Lingualeo, и так как самые лучшие инвестиции это в себя, я бы посоветовал купить премиум аккаунт, 22$ в год не такие большие деньги. Ну и после достижения определенного уровня — чтение книг в оригинале, а самый последний level — чтение профессиональных книг в оригинале. Дальше только Шекспир и Eminem в караоке.

Умение программировать. Как и зачем?

Может вам нужно будет съездить в командировку в Америку, и вы не будете знать что такое красно-черное дерево. Или (большая вероятность) на собеседовании вас будут спрашивать про алгоритм Дейкстры и его сложность. Или (маленькая вероятность) у вас будет проект, на котором вам понадобятся эти знания. В любом случае, решать подобные задачи, подбирать правильные структуры данных, это как кунг-фу, настоящий мастер должен знать, даже если никогда не применяет. Особенно это важно, если у вас нет профильного образования, а вы сразу начали изучать программирование с ООП.

По поводу алгоритмов недавно прочитал хорошую и не сложную книгу, в которой описываются основные алгоритмы и структуры данных: Грокаем алгоритмы. Ну и в принципе есть много курсов по данной теме на udemy и coursera.

Что касается практики — я бы посоветовал HackerRank, там есть довольно интересные задачи на разные алгоритмы, и для продвинутых: где требуется только ответ, но для того, чтобы ваша программа работала меньше пары часов придется потрудиться.

Практика, практика и еще раз практика. Как и зачем?

Читать книжки, смотреть видео и понимать, что происходит — это одно, написать работающий код — совсем другое. Не бойтесь «испачкать руки» и разбираться в технологиях, которые есть на вашем проекте, или востребованы по рынку, на маленьких проектах. Не обязательно поднимать громоздкие системы или рисовать красивый UI, чтобы понять, как работает autowiring или написать Restful API для своей сущности. Так вы наступите на полезные грабли, запомните, почему вот так, а не по-другому, и станете меньше верить в магию. Также очень полезно разбираться во всем пути запроса в системе: от клика или отправки формы до базы данных и обратно, понимание — залог успеха.

Берете и пишете:) Подумайте, какое приложение было бы вам полезно, составьте себе ТЗ, и вперед к работающему коду!

Можно еще долго растекаться мыслями по древу, но вот еще несколько пунктов, которые дополняют вышесказанное:

  1. Подготовьтесь к сертификации и сдайте ее. Это заполнит все пробелы в вашем понимании Java core и даст вам ощутимое преимущество.
  2. Не стесняйтесь задавать вопросы старшим товарищам, от вас не будут требовать многого, но вы должны уличить правильный момент, чтобы спросить — не сразу, как только что-то не получается, но и не спустя несколько дней после дедлайна.
  3. Книги: Чистый код и Java. Эффективное программирование. Также много чего можно искать в серии Heads first, если хотите попроще, будь то Javascript или Паттерны проектирования.
  4. Смотрите видео с конференций или ходите на конференции. Мой совет — ходите на докладчиков, а не на темы. Среди моих фаворитов — Николай Алименков, Евгений Борисов, Джош Лонг. А по итогу можно сделать еще и доклад внутри компании, чтобы лучше разобраться в теме.

Не прекращайте учиться и будет вам счастье!

Похожие статьи:
Вот и пролетел год со времени публикации моего анализа результатов ВНО-2016. Старшая дочь с отличием закончила 4-й класс обычной школы...
Запись на первое бесплатное занятие онлайн курса. Начало урока 27 мая в 19:30. Здравствуйте, дорогие друзья и будущие коллеги! Меня...
Когда: 29 июня 2016г.Время: 19:00-21:00 — будние дни, выходные дни 10:00-14:00 Войди в IT вместе с PHP-academy! Стань востребованным PHP-программистом...
Дорогие друзья! Мы рады сообщить, что итоги конкурса от компании Samsung были подведены. Напомним, что среди давших правильные...
Після років інтенсивного суперництва дві найбільші лабораторії з дослідження штучного інтелекту — DeepMind і Google Brain, які...
Яндекс.Метрика