Пособие для будущего Java разработчика. Основы Java
Disclaimer. Эта статья не претендует на то, чтобы быть истиной в последней инстанции. Эта статья — квинтэссенция личного опыта автора. Автор путем проб и ошибок, путем синяков от собственных граблей, велосипедов и хеллоувордов сам прошел и проходит и дальше через этот ад под названием саморазвитие. Не пытайтесь повторить это дома. Haters gonna hate. Элвис жив.
Впервые пишу статью, поэтому попытаюсь объяснить все максимально доходчиво. У каждого программиста — не важно, Java или любого другого языка — есть шанс оказаться в конце паровоза. Если перестаешь учиться, читать книжки, туториалы и смотреть курсы — рано или поздно придет момент, когда ты поймешь, что уже ничего не соображаешь ни в новых фреймворках, ни, тем более, в нововведениях последних версий Java (бей тревогу, если тебя уже пугают лямбда-выражения и stream API в Java 8).
Как-то тихим субботним вечером ко мне в skype постучался старый приятель, который 2 года назад устроился джуном, и сообщил мне «приятную» новость о том, что он уже метится на сеньора. В нашей славной СНГ уже и
Поэтому эта статья для тебя, мой дорогой друг, и для всех тех, кто хочет как минимум стать уверенным junior/middle разработчиком. У меня не было ментора, но были хорошие люди в проектах, которые помогали советами и best practice. Этот путь, мой юный падаван, каждый должен пройти сам.
Сегодня я расскажу про саму Java. Когда человек пишет в резюме, что он знает Spring, Hibernate и еще тучу других фреймворков, меня инересует скорее то, насколько уверенно он плавает в самой Java. Эта информация всегда в приоритете.
Beginner
Я не пытаюсь с пеной во рту доказывать, что нужно помнить каждый метод I/O API, как «Отче наш». Куда более важно понимать, как организована ООП-составляющая Java.
Брюс Эккель — настоящий эстет этого дела, он достаточно увлеченно, со всеми нюансами и тонкостями описал это в своем труде «Философия Java» (и не только ООП!)
Когда я был еще сопляком интерном и ревностно смотрел на то, как многие коллеги пишут прекрасный код, мне все советовали «Философию Java» Брюса Эккеля. Для человека, который вообще пытался понять, какая же Java красавица, мне было сложно оценить ее величие в кругу философов. Я чувствовал, что нахожусь в кругу взрослых. Вроде бы и понимал верхушку айсберга, но чего-то постоянно не хватало. Мне на помощь пришел старый добрый Хортсманн, который хорошо был переведен на русский язык. Поэтому для любого начинающего Java разработчика, на мой взгляд, двухтомник Хортсманна — самое идеальное пошаговое руководство. Есть еще Шилдт. Выберите любой для вас удобный вариант.
(кстати, серия книг Хорстманна «для нетерпеливых» — очень интересная, рекомендую)
Как правило, эти книги советуют любому начинающему. Еще есть небольшие туториалы от самой Sun/Oracle.
Это всё понятно, но у меня есть кое-что на десерт. Сама жемчужина познания Java, как это ни удивительно, совсем рядом. Более того, я, с чувством гордости и небольшой ухмылкой, скажу вам, что это знание находится прямо перед вашим носом, сразу после того, как вы установите ваш первый JDK. Угадали? Имя этой жемчужины — src.zip. Грубо говоря, сорсы ☺. Исходный код Java SE. Да-да, именно, лучший способ изучения Java — исследовать элегантные sources самого языка.
Более того, я открыто заявляю, что именно sources в Java помогут научить:
— писать красивую и понятную документацию
— писать приятный и чистый код
— понимать best practices и паттерны, которые используются повсеместно в JDK. Стоит только вспомнить Декоратор, который применяется в java.io
— ну и, само собой, прикоснуться к таким легендам Java-вселенной как Brian Goetz, Joshua Bloch, Doug Lea, непосредственно изучая их код в JDK, и т.д
Именно сорсы для меня стали отправной точкой в понимании того, как именно должен быть организован подход к любому инструменту, который ты хочешь выучить досконально, будь то язык или фреймворк. Вы можете применить эту практику не только к изучению JDK. Если вас заинтересовала какая-то библиотека, и вы просто горите от любопытства, как же это всё устроено, не спешите искать туториалы и книги в интернете. Начните с того, доступен ли исходный код. Попробуйте найти интересующую вас либу на таких ресурсах как grepcode.com.
Вы также можете углубиться в изучение Java, если попросту будете использовать ваши примеры в Debug режиме. Наблюдая в дебаггере вашей любимой IDE за структурой объектов и потоков, которые будут выполняться в ваших примерах из книжек, вы можете существенно улучшить свое понимание внутренних процессов.
Super Low Level
Этот абзац для тех, кто прочел вышесказанное и подумал, что, наверное, это сложно — стать разработчиком, я ничего не понимаю, открыл книгу — вижу фигу и т.д.
Стыдно признать, но так было и со мной — читая «Философию Java» 7 лет назад как первую книгу по Java, я думал, что нахожусь в дремучем лесу, не зная его. Я был тревожен и переживал, что, программирование — это не мое. К счастью, мне посоветовали youtube канал одного парня, который рассказывал о программировании на java с самого нуля. Это канал — theNewBoston, и вот плейлист его курса. Можно еще попробовать курсы от Lynda.com.
Ну, и самое элементарное, что мне приходит сейчас в голову (кроме детских книжек по программированию) — это серия подробно иллюстрированных книг по разработке Head First от O’Reilly и сама книга «Изучаем Java» (Head First Java).
Если это вам тоже покажется непонятным, тут два варианта: либо вы плохо стараетесь/не хотите стараться понять/изучить, либо я разговариваю с котом (:
Intermediate
Давайте наберемся храбрости и попробуем спуститься на уровень ниже. Если бы на собеседованиях спрашивали только основы по Java, мир состоял бы исключительно из добрых людей, верно? Но увы, это не так. Боюсь, ответив тишиной на вопрос «Что вы знаете о CountdownLatch?», вы не произведете должного впечатления. Кто-то плюнет в монитор и скажет, что никогда и не использовал этот-как-его-там-Latch и знать не знает, что это такое, а работает уже сеньором, и, может, будет прав. Но давайте попробуем быть честными в первую очередь по отношению к себе и попытаемся пролить свет на следующий интересный момент в карьере каждого разработчика.
Есть ли смысл учить что то новое, если это не используется в проекте?
Поверьте, таких ребят больше, чем вы можете себе представить. Пройдя интервью и попав на работу джуном/миддлом, наш экспонат просто-напросто расслабляет булки сразу после того, как внедряется в работу. Может быть, всё было бы так, если проект — это 24/7 система по охране китайской стены. К сожалению, жизненный цикл любого «современного, не такого как у всех, супер интересного» проекта у разработчика не длинной в вашу жизнь. Сразу после того, как проект закроется и ваше самолюбие вылетит из уютного бизнес-центра с печеньками и приветливой девушкой на рецепции, наступит «легкое похмелье», и далеко не от того, что вы перебрали прошлым вечером, а от того, что поймете, что вам потребуется куда больше времени, чтобы подговиться к следующему интервью, где в требованиях будут присутствовать уже новые фреймворки и тайные стороны Java, о которых вы даже и не догадывались.
Как кто-то сказал на DOU, что если бы мы питались от фотосинтеза... Сколько же было тогда настоящих developer’ов?
Намного легче людям, которые глубоко копают, и тем, кто постоянно учится по вечерам и в перерывах на работе, и еще куда легче тем, кто ловит от этого чистый кайф (true programmer). Да, жена/девушка будет страдать и ставить ультиматумы: я или ноутбук, тут вы уже сами должны решить и подходить к этому ответственному вопросу сбалансировано (хорошо, когда девушки это понимают — этот бокал вина за вас!). Именно такие черты как любознательность и трудолюбие помогут вам не отставать от стремительно летящего по рельсам паровоза технологий, о котором я говорил в начале статьи.
English
Немного про английский. Все книги в пункте «Beginner» были переведены на русский. Я хотел поднять эту тему в отдельной колонке, но все-таки решил оставить именно здесь. Ведь после прочтения основных книг, которые, прошу заметить, не всегда изобилуют прекрасным переводом, у многих начинается легкая паника: английский они знают недостаточно хорошо, чтобы читать и понимать техническую документацию/книги по Java и не только, а они есть повсеместно в интернете.
Но что, если я скажу вам, что ваша проблема — это не английский, а самая обычная...лень? Именно, вы просто невероятно ленивы и не верите в свои силы, чтобы оставить в сторонке прекрасные труды, которые вряд ли вообще когда-либо переведут. Так что встаем с кровати, берем самый обычный словарь, заводим тетрадку (для портативного варианта: Google Translate и notepad для записывания слов). Открываем книгу любой сложности и переводим со словарем (если ваш английский невероятно слаб, переводим каждое слово).
В начале процесса вы подумаете: «Господи, да я годами буду читать эту главу, пойду лучше поиграю в доту!». Осмелюсь сказать вам, что черепаший темп не будет длиться вечно, когда-то память и опыт возьмут своё, и вы осознаете, что без труда прочитали тот или ной абзац. Другая сторона медали заключается в том, что переводят у нас с опозданием. Без английского вы лишены возможности черпать актуальную и свежую информацию.
Прошу вас вбить следующее в голову тремя восклицательными знаками: английский — это MUST для айтишника любого профиля и просто для человека, который живет в 21 веке. Это — ваш путь роста в сфере Software Engineering и даже больше. Другого варианта попросту нет. Не тешьте себя самолюбием, что вам Хортсманна достаточно. Придет момент, и вы столкнетесь с задачей, о которой не знаете ровным счетом ничего (это у всех бывает) и в переведенных книжках об этом не написано. Могу еще добавить, что Философия Java Эккеля куда приятней читается именно на английском. Это относится абсолютно ко всем книгам. Английский должен стать вашим вторым языком после родного. Ну, а третьим, само собой, — Java :)
Concurrency
Раз уж мы вспомнили про CountDownLatch. Тема многопоточности поверхностно освещенна практически в каждом источнике, который я привел выше. Но достаточно ли хорошо? Конечно, нет. Сталкивались ли вы с моментом, когда не понимали, как ваши старшие коллеги так искусно работают с потоками, разрабатывая непонятные вам конструкции с применением java.util.concurrent.* библиотек? «Опыт», — скажете вы, и будете правы. Вот только подобный опыт строится на хороших знаниях фундаментальных основ этой области. Мой коллега по цеху Bogdan Shyiak почти год назад написал хороший дайджест по Concurrency, который до сих пор не потерял своей актуальности. От себя лишь добавлю опыт знакомства с многопоточностью.
Вы можете прошерстить package java.util.concurrent.* и попробовать применить на практике большую часть API, которую вам предлагают — и, наверное, это будет самый оптимальный и быстрый способ познать concurrency. Лично я больше искал опыт и подачу, которые с лихвой покрывались в книжках, которые я опишу чуть ниже.
Да-да, «Concurrency In Practice!» — крикнет кто-то из-за угла. — «Что еще надо?» Боюсь, что она была слишком сложна для меня в качестве первой книги по многопоточности. Именно эта проблема терзала меня первое время, было невероятно сложно найти оптимальную книгу для начинающих по Java Concurrency, чтобы объяснили практически с нуля. Я удивлю вас, но я нашел ее. Это Java Thread Programming by Paul Hyde. Не смотрите на то, что книга 1998 года. Наверное? это самый лучший вводный курс по работе с потоками, автор достаточно серьезно разжевывает и раскладывает по полочкам сложные вещи и уходит немножко дальше, за горизонт.
Давайте идти от простого к сложному. Дальше идет Concurrent Programming In Java by Doug Lea. Я настоятельно рекомендую вам познакомиться с ней сразу после первой книги. Дуглас Ли, Профессор Computer Science, популярный в Java Community, стремительно погружает вас Concurrency API и буквально на примерах легко показывает все нюансы. (Ах, как элегантно написан Семафор под его руководством — java.util.concurrent.Semaphore!)
Ну, а затем уже идет многим знакомая книга «Concurrency In Practice», написанная Brian Goetz. Пожалуй, самая популярная по рекомендациям книга после Effective Java. Много про нее говорить не буду, скажу лишь, что это сборник лучших best practice и рекомендаций. Как говорится, must have.
Замыкая круг книжек по многопоточности, я порекомендовал бы Art Of Multiprocessor Programming by Maurice Herlihy, которая, на мой взгляд, должна быть в самом конце списка ввиду ее глубины. Все примеры написаны на Java с кучей задач после каждой главы и иллюстраций, отличный самоучитель и задачник. Рекомендую вам купить ее в печатном виде, блестящая книга!
Collections
Про коллекции много не напишешь, тем более, изучив внимательно основные интерфейсы List/Set/Map, можно иметь уже основное представление о том, как работать с ними. Оставлю для вас, дорогой читатель, несколько рекомендаций. Желательно идти ровно в том хронологическом порядке, который указан здесь:
Сначала пройдите Sun/Oracle туториалы по Collections API
Затем, на хабре есть прекрасная серия статей про коллекции в картинках: ArrayList, LinkedList, HashMap, LinkedHashMap.
Из книжек я могу выделить две. Первая поможет вам заодно и разобраться с Generics.
Java Generics and Collections by Philip Wadler:
Вторая — Java Collections by John Zhukovski:
Хорошим советом является использование временного счетчика в процессе изучения коллекций. Используйте System.currentTimeMillis(); для того чтобы понять, к примеру, насколько быстрее работа с массивом по сравнению с обычным ArrayList и почему? Используйте этот инструмент в каждом примере, заодно и исследуете нюансы производительности в области коллекций.
Вот и всё для обучения Colllection API. Единственное, есть небольшая рекомендация: когда вы будете переписывать каждый пример, (а это очень важно для обучения каждой книги, где есть код) опять повторюсь, используйте это в Debug режиме. Отладчик вашей IDE очень наглядно показывает изменения в структурах данных. Perfecto!
I/O
В принципе, Брюс Эккель в «Философия Java» глубоко освещает I/O API. Добавлю, что каждому начинающему разработчику нужно обязательно попрактиковаться в следующем:
— создайте консольный квест с помощью использования Scanner
— попробуйте в своих мини-проектах манипулировать файлами и папками
— изучите паттерн Декоратор на примере Java I/O
— напишите простенькую базу данных (какие-то незамысловатые CRUD-операции через консоль)
Если по долгу службы вам необходимо детально использовать в проектах I/O, обратите внимание на книгу Java I/O by Elliotte Rusty Harold:
Это достаточно полноценный, информативный обзор I/O API.
Others
Я специально остановил свое внимание на Concurrency, Collections and I/O, потому что считаю их неотъемными компонентами Java платформы на любом проекте. Несомненно, в эту область также входит очень много нужных базовых библиотек. Я полагаю, что после прочтения вышеизложенных ресурсов у вас должно возникнуть свое виденье, как вам дальше изучать JDK — где-то глубже копнуть, где-то прикоснуться, а где-то высокомерно пройти мимо.
Давайте попробуем вскользь пройтись еще по нескольким: обязательно нужно изучить механизм работы Reflection API — по большому счету, вполне достаточно просмотреть исходники и первые туториалы с Google поиска на эту тему. Куда более захватывающее занятие — узнать, как используется Reflection API в Spring AOP.
Из книг я знаю только одну — Java Reflection In Action by Ira R. Forman. Приготовьтесь вспомнить/выучить UML для полного понимания.
По Networking очень кратко тут, и хорошая книга Java Network Programming by Elliotte Rusty Harold. По фундаментальным основам networking мы пройдемся в специальной для этого будущей части по Computer Science.
JDBC. Помимо Sun’овского туториала, есть еще и хорошая книга от них же. Это JDBC API Tutorial and Reference by Maydene Fisher.
Ну, и можно полистать под чашечку кофе Database Programming with JDBC and Java by George Reese. Помимо самого JDBC он касается таких JDK компонентов как Сериализация, JNDI, RMI, что тоже будет очень полезно.
В принципе можно на этом остановиться, иначе статью не осилит прочитать даже я. Перестанем спойлерить и оставим темные уголки пытливым умам.
Java 8
Наконец-то мы дошли до одной из модных тем. Очень много материала, который был рекомендован вам, относился к старым версиям Java. Учитывая backward compatibility, 95% информации актуальна и по сей день. В СНГ находится очень много проектов, которые еще не поддерживают новую версию Java. Возможно, это вопрос времени, но я со всей ответственностью готов заявить, что вам полезно, а иногда и просто жизненно важно изучить большинство вышеизложенных ресурсов для того, чтобы понять общую картину, да и хотя бы для того, чтобы просто понимать происходящее вокруг вас в проекте.
Для изучения нововведений я рекомендую прошерстить туториалы в интернете на тему Лямбда-выражений и нового Stream API. Кстати, тем, кому интересно Security — посмотрите, что нового появилось в восьмой версии.
Есть маленькая интересная книжечка «Лямбда-выражения в Java 8» Ричарда Уорбэртона:
Не переживайте, если у вас нет опыта в функциональных языках, этой книги хватит с лихвой, чтобы понять лямбда-выражения. Главное — это практика.
Затем, можно плавно приступать к «Java SE8. Вводный курс» (она же Java 8 для нетерпеливых) Хортсманна.
Обратите внимание, что Кей Хортсманн не так доходчиво все объясняет, как в своем прошлом двухтомнике по изучению Java. Он просто знакомит вас с основами фичами Java 8 на достаточно быстрой скорости (изучили пример — перебежали на другой). Относитесь к этому как краткому мини-курсу.
Заканчивая обзор книг по Java 8, можно упомянуть Manning версию Java 8 in Action by Raoul-Gabriel Urma.
По моему мнению, это достаточная информация, чтобы спокойно смотреть на нововведения Java 8 в ваших проектах, особенно когда новые версии IDE автоматически исправляют некоторые старые решения на новые. (как нож в спину, не правда ли?!)
Видеокурсы
Я практически не упомянул о русскоязычных видеокурсах. Скорее всего, это связано с тем, что мой опыт обучения не был связан с просмотром видео наших коллег с СНГ. Специально для вас я опросил часть своих знакомых, и они порекомендовали двоих людей:
1. Юрий Ткач — «Java для тестировщиков».
2. Иван Головач — курсы по Java (к примеру, Junior Level)
Если у вас есть рекомендации по подобным курсам , которые могут быть полезны (например, JUG или Лекториум), я буду очень признателен если вы оставите их в комментариях.
Заключение
Вот я и заканчиваю первую часть цикла. Я считаю, что этого материала вполне хватит, чтобы познакомиться конкретно с Java, настолько близко, насколько это вообще возможно. Конечно, капот JVM не был освещен здесь, об этом, я думаю, мы будем упоминать в последних статьях серии.
Для тех, кто в корне не согласен с тем, что я изложил здесь, я напомню великолепную цитату: «В жизни нет ничего лучше собственного опыта». Этот набор книг и ресурсов до сих пор остается эталонной рекомендацией для меня другим людям вот уже на протяжении 5 лет и постоянно, как вы видите, наполняется новыми интересными книгами. Считайте, что это проверенный материал.
Для тех, кто только ступает на путь Java программиста.
Внимание, минутка мотивации — читать под музыку из фильма Рокки.
Мой юный zero, отбрось все домыслы о том, твое это или не твое, из-за денег ты туда идешь или изменить мир, самый тяжелый момент в карьере будущего junior java developer’a — это впервые устроиться на работу после успешного собеседования (об этом мы будем говорить в последней, седьмой части моей статьи). Верь в себя, не слушай людей, которые говорят, что ты не потянешь. При грамотном подходе и невероятном желании/упорстве человек любого возраста и любой профессии может стать программистом (да и вообще космонавтом). В нашей стране всегда может быть плохо, экономика, разруха и так далее. Двигаться нужно не завтра или как только ты уволишься с прошлой работы, а сейчас! Удачи тебе и попутного ветра!
В следующей части мы поговорим о чистоте кода, рефакторинге, javadoc, интересных тулзах по улучшению кода и основных незаметных проблемах в коде, которые возникают у каждого в процессе ежедневной работы.
Большое спасибо за внимание.
Следующие части цикла:
— Пособие для будущего Java разработчика. Элегантный код.
— Пособие для будущего Java разработчика. Enterprise — часть 1.
— Пособие для будущего Java разработчика. Enterprise — часть 2.
— Пособие для будущего Java разработчика. Enterprise — часть 3.
— Пособие для будущего Java разработчика. Новые горизонты.
— Пособие для будущего Java разработчика. Собеседование и карьера.
78 коментарів
Підписатись на коментаріВідписатись від коментарів Коментарі можуть залишати тільки користувачі з підтвердженими акаунтами.