Войти в IT: Долгая дорога в Java
Друзья, рады представить статью из цикла «Войти в IT», который уже давно публикуется в нашем корпоративном блоге. Это не «серьезные» технические статьи (такие тоже будут), а рассказы наших синьоров об их становлении в IT. Ведь иногда хочется просто взглянуть на индустрию глазами коллег и понять, как именно из молодых практикантов и «зеленых» джуниоров получаются эксперты мирового уровня. Что ж, дадим слово одному из наших героев.
Всем привет! Меня зовут Родион Горковенко, и я… нет, не то, о чем вы подумали. Я — Senior Java Developer в компании DataArt. Хочу поделиться историей, как я дошел до жизни такой и, возможно, немного подсказать молодым специалистам, как выжить в беспощадных джунглях Java и стать полноценным цифровым хищником.
Введение (красивая заставка)
Сначала я программировал на C. Были и другие языки, но большую часть времени (несколько лет) я писал именно на C. Поэтому и моя карьера в IT началась с этого языка. Однако область применения его ограничена сравнительно низкоуровневым софтом — я писал на нtv для микроконтроллеров, когда разрабатывал электронику, и позже — для POS-терминалов.
Ответ на вопрос «куда двигаться дальше?» был для меня не очень ясен. Можно, конечно, было углублять изучение C++, но небольшой опыт работы в команде на C/C++ оставил несколько негативное впечатление. Альтернативой была Java. О ней я не знал почти ничего, разве что, пару тестовых приложений для мобильников с JavaME написал еще в институте — конечно, не разбираясь подробно в нюансах языка.
Что ж, в течение года посвященного POS-терминалам, у меня было немного свободного времени до и после работы. Гугление подсказало, что нужно скачать Java Development Kit (JDK) с сайта Sun (теперь java.oracle.com) и, в общем, можно начинать.
Изучение JavaSE (первый уровень, несложные монстры)
Тут отмечу, что наличие опыта в программировании очень полезно для изучения Java. Изучать ее в качестве первого языка — плохая затея. Java сразу бросает новичка в пучину целого ряда непонятных слов (пакеты, классы, методы, статические, абстрактные, ссылочные типы, коллекции — кто все эти люди?), в которой не очень легко найти дорогу если не знаком с аналогами из других языков.
Поэтому только начинающим программировать предложу потратить месяц-два на Python, например. Простейшая программа на нем будет состоять из одной строчки вместо десятка, и, в то же время, вы постепенно познакомитесь со всеми актуальными концепциями, которые присутствуют и в Java.
Итак. Имея уже некоторый опыт и установленную JDK, можно садиться и пробовать. Да, можно еще скачать одну из популярных IDE — сред разработки, в частности, NetBeans, Eclipse или IntelliJ IDEA. Однако знатоки рекомендуют первые программы писать «в блокноте», т. е. во встроенном редакторе Far Manager или Midnight Commander, в Notepad++ или gedit, а компилировать и запускать прямо из командной строки. Это очень хорошая рекомендация тем, кто действительно хочет чего-то достичь, а не просто жаждет сдать программу злому преподу в институте/школе и отвязаться.
Для начинающего программиста хорошая IDE — как многоразовый подгузник на стероидах, с подогревом, магнитолой и т. п. К сожалению, на работу в подгузниках не берут…
Что именно писать новичку? Сотни маленьких и бесполезных программ. Наша цель в этот период — освоить синтаксис, понять смысл классов, методов, полей — научиться работать с коллекциями, массивами, строками и т. п. Причем понять так, чтобы часть этих знаний из головы перекочевала на кончики пальцев.
Где взять идеи этих «маленьких и бесполезных программ»? Я пошел двумя путями:
Зарегистрировался на форуме javatalks.ru — думал, задавать вопросы буду, но на деле больше пытался отвечать на чужие (это, оказывается, здорово прокачивает скиллы а также позволяет быть в курсе важных событий J-мира).
Стал участвовать в минисоревнованиях на codeforces.ru — задачи двух самых нижних уровней (Div2 A и B) здесь вполне доступны «обычным» программистам, не страдающим бессонницей от словосочетания «спортивное программирование», хотя в целом подобные сайты, скорее, приучают писать быстро и безобразно… но несомненная польза — именно в смысле изучения «работы коллекций, массивов, строк, преобразований типов» и познания сотни приятных нюансов, где можно сделать глупые ошибки.
При этом из материалов я довольствовался в основном описанием API стандартной библиотеки (оно обычно выскакивает в гугле по сочетанию «java ИмяИнтересующегоКласса») и спецификацией языка ( ), которую мужественно читал в метро по дороге на работу и обратно. Конечно душеспасительные примеры из интернета на различные темы также всегда полезны. Стоит только отметить, что с информацией на русском всё обстоит не очень радужно, поэтому надо подтягивать английский. Хорошие новости, впрочем, в том, что английский для нужд программиста — пара сотен слов и общие представления об азах школьной грамматики: два настоящих времени и страдательный залог. Воодушевиться можно, например, вот этой статьей.
Можно также читать книжки. Например, Хорстманна или другие. Из тех, которые почти must-have для новичка, осмелюсь назвать две (это не самоучители или мануалы, а просто очень полезные, но неочевидные вещи):
- Джошуа Блох «Effective Java» (она тоненькая).
- Роберт Мартин «Clean Code» (можно прочесть первую треть и бросить).
Итак, спустя 6 – 9 месяцев мной написана уйма ненужных утилит, простеньких игрушек и других приложений, представляющих интерес только для автора. На вопрос «Знаете ли вы JavaSE?» могу уверенно ответить «хорошо» (исключение составляет обычно, разве что, конкурентность). Достаточно ли этого для трудоустройства?
Изучение JavaEE / Web (продвинутый уровень, какодемоны, кибердемоны)
Чаще всего — нет. Большинство промышленных Java-проектов — корпоративные или веб-приложения, основанные на десятке-другом популярных технологий работы с веб-мордами, веб-ресурсами, базами данных и т. п. По объему все это, как минимум, раз в десять больше того, что мы на текущий момент успели изучить.
Поскольку почти все промышленные приложения предоставляют пользователю веб-интерфейс, нужно получить (если их нет) познания о таких вещах, как HTML, HTTP, CSS, возможно, JS — мало того, нужно с ними потренироваться. Это несложно, и руководств хватает с избытком. Главное, чтобы представление создалось ясное.
Java используется в веб-приложениях для создания на лету новых HTML-страниц и обработки поступающих от них HTTP-запросов. Понять этот жизненный цикл новичку сложно… ну, мне точно было сложно. К счастью незадолго до этого пришлось освоить азы PHP. Это было довольно удобно: потратив несколько дней и написав сколько-то десятков скриптов, составил представление, как работает web, — гораздо более целостное, чем за все предыдущие годы. Проще всего получить опыт и с PHP и с MySQL установив, например, XAMPP, включающий и сервер Apache httpd и PHP-интерпретатор и сервер базы данных и т. п. — и проштудировав какой-либо самоучитель (в моем случае www.softtime.ru/bookphp/gl1_1.php).
Теперь, переключившись на Java, я смог гораздо легче воспринять: ага, вот Tomcat, это сервер, отдающий страницы и обрабатывающий запросы. Вот JSP-страницы — ну, это очень похоже на PHP. К ним в паре идут сервлеты, это уже не очень похоже, но тоже понятно. Связь с базой данных — после опыта с PHP и SQL это уже нетрудно, благо примеров хватает. Удобно было использовать встраиваемую базу данных на Java под названием H2.
Нельзя сказать, чтобы я далеко проник в Java EE / web на этом уровне, но, поскольку изучение шло тяжеловато, начал искать место Java-разработчика. В большинстве компаний мне не отвечали, в несколько позвали побеседовать. Тут главное — не отчаиваться.
Кстати, на этом этапе вы, вероятно, уже будете работать в IDE, однако очень-очень важно освоить также средства автоматизированной сборки — хотя бы Ant, а лучше Maven. Также строчки о знакомстве с системами контроля версий (SVN, Git например) сделают ваше резюме более привлекательным для работодателя (он скажет: «Уф, хоть этому учить не нужно»).
Итак, я рассылал резюме и иногда ходил по собеседованиям. В двух местах предложили выполнить тестовое задание.
Тестовое задание — это: оно позволяет вам понять, с какими технологиями и задачами работают, а им — посмотреть, как вы пишете код и т. п. К сожалению, дают его редко. Из около 30 собеседований, пройденных мной за последние годы, задания доставались где-то в пяти.
В приложении к этой статье я приведу пример тестового задания для тех, кому не везёт на них.
Первое задание предлагало написать веб-приложение с несколькими страничками для отображения данных из нескольких таблиц и требовало «использовать JSF и Hibernate» — меня прошиб холодный пот, т. к. ни одна из этих аббревиатур не была мне знакома. Тем не менее, попросив две недели на выполнение, я с задачей справился (сейчас бы за 3 – 5 часов написал, думаю). Второе задание познакомило меня с использованием Java Mail, что тоже было хорошо.
Приглашение получил в обе компании — тут, пожалуй, повезло что незадолго до этого я почитал про Java Code Conventions и приучил себя оформлять код примерно «как все», чтобы не пугать потенциальных работодателей.
В принципе, здесь можно закончить наше повествование — дальше мне уже подсказывали коллеги (и необходимость) — что изучать, что читать.
Первый проект я делал именно на JSF и Hibernate. Уже тут изучил основы Spring. Ну, а дальше — больше. Конечно, первый проект сейчас страшно вспоминать — ух, и начудил я в нём…
Главное — не забывать, попав на работу в компанию, что учиться надо и дальше, и больше. В Java множество невероятных и непонятных технологий. А кроме Java, есть и другие языки, и всяко-разные концепции, подходы, архитектурные решения и т.п. Я, пожалуй, был бы счастлив если бы знал «всё-всё-всё» хотя бы на 10%…
Приложение (редактор уровней)
Многие тестовые задания на позицию Java Junior сводятся к написанию небольшого веб-приложения. Будьте готовы, что оно займет у вас дни, особенно если вы не знакомы с какими-то технологиями и т. п.
Я не буду копипастить какое-нибудь известное мне задание — пусть это остается секретом предлагавших их компаний. Вместо этого вот, выдумаю свеженькое.
Написать веб-приложение, выполняющее функции банка. Пусть это будет банк в городке на Диком Западе насчитывающем 53 жителя и продолжающем расти.
Нужно хранить данные о:
- клиентах банка (идентификатор, имя — адрес, возраст по желанию);
- счетах (идентификатор, идентификатор владельца, количество денег);
- транзакциях — переводах денег между счетами или их поступлениях / списаниях.
Приложение по минимуму должно содержать три страницы:
- список клиентов банка, при щелчке по имени открываются счета выбранного клиента (плюс внизу форма для добавления нового клиента);
- список счетов заданного клиента (плюс внизу форма для добавления нового счёта);
- форма для перевода денег между счетами (и для пополнения / списания денег: затраты, покупки — м. б., это отдельные формы, на ваш вкус);
- страница со списком транзакций (сверху форма фильтра, чтобы можно было выбрать за период и/или по заданному пользователю);
- всякие дополнения — на ваш вкус, например, в списке клиентов можно сумму на всех счетах у каждого выводить и т. п.
Задание часто содержит перечень технологий, которые следует применить. Типичные наборы могут содержать, например:
- JSP (Spirng-MVC), Spring, Spring-jdbc и JQuery + UI для украшения фронтенда;
- JSF, Spring и Hibernate;
- JSF, EJB, GlassFish.
База данных может быть Postgres или MySQL, впрочем постарайтесь сделать так, чтобы работать можно было с двумя (например, с MySQL и H2), т. е. чтобы приложение можно было запустить со встроенной базой данных.
И так далее. Поизучайте гугл и форумы — обязательно найдете примеры заданий. Постарайтесь не забыть использовать Maven и в нем — плагины типа maven-jetty-plugin, чтобы приложение можно было максимально легко продемонстрировать, если попросят. Очень настоятельно рекомендую. Не забывайте сопровождать тестовые задания пояснительными записками. Будьте грамотны или используйте spell-checker.
Успехов!