Алексей Владыкин


Встреча со слушателями онлайн-курса по Java

18 февраля 2016

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

В этом посте я публикую почти дословно текст лекции.


Когда мне предложили прочитать вам дополнительную лекцию, то я задумался: о чем вам рассказать за эти 45 минут, какую тему выбрать? Крутились разные варианты: рассказать про еще какие-нибудь классы стандартной библиотеки Java или показать какие-то хитрости, тонкости…

Если условно изобразить ваше знание Java, приобретенное в течение курса, то получится какая-то область, эпсилон-окрестность ядра языка. Я мог бы взять и рассказать еще какую-то тему и тем самым немного прирастить ваше знание. Но точно такого же результата вы могли бы добиться, прочитав за те же полчаса статью на Хабре. И ехать бы никуда не пришлось.

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

Не претендую на истину в последней инстанции, но постараюсь рассказать так, как хотел бы, чтобы это рассказали мне лет 10-15 назад, когда я начинал.

Знаете, есть много книжек в духе «C++ за 21 день» или «Java за 24 часа». Это, конечно, очень привлекательно, но абсолютно нереалистично. Т.е. можно более-менее освоить синтаксис, но знание синтаксиса не равняется знанию языка и умению им правильно и эффективно пользоваться. На эту тему есть небольшой комикс:

teach yourself cpp

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

Питер Норвиг, ученый и директор исследовательского подразделения Google, написал статью «Teach yourself programming in ten years». 10 лет — это тот срок, за который можно достичь мастерства в чем-то: в музыке, в науке, в плавании, в программировании. (Другие говорят о 10 000 часов практики, но это сопоставимые величины.) Если ваша цель — стать мастером своего дела, то надо долго и методично, без спешки работать над этим.

Перескажу некоторые важные мысли из той статьи.

  1. Ваше дело должно быть вам интересно по-настоящему. Настолько, чтобы, занимаясь им 10 лет, вы не заскучали. Это не просто работа, способ зарабатывания денег, а что-то большее — увлечение, призвание. Выдающиеся программисты с удовольствием кодят что-то just for fun даже дома, после работы.

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

    samurai

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

  4. Работайте на проектами совместно с другими программистами. Попробуйте себя как в роли ведущего, так и ведомого. Учитесь у других. Смотрите, что и как они делают. Сейчас для этого существует огромное количество возможностей, т.к. полно проектов с открытым исходным кодом, в разработке которых можно участвовать. Наверняка среди программ, которыми вы постоянно пользуетесь, какая-нибудь разрабатывается в open source. Пойдите в ее багтрекер, выберите себе простую задачку и предложите разработчикам патч. Так постепенно и вольетесь в коллектив. А если так получилось, что вы не пользуетесь ни одной программой с открытым кодом, то просто пойдите на GitHub или BitBucket или SourceForge и выберите себе проект по вкусу.

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

    why

  6. Изучите несколько языков программирования, не зацикливайтесь на чем-то одном. Важно познакомиться с концептуально разными языками: объектно-ориентированными, функциональными, декларативными, с языками с акцентом на параллельное исполнение. Выбирая для каждой задачи наиболее подходящий язык программирования, можно сильно сэкономить свое время.

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

    binary keyboard

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

  1. Курс на Stepic дал вам неплохую базу, но это далеко не все, что есть в языке Java и в его стандартной библиотеке. Остались непокрытыми такие важные вопросы, как многопоточность, работа с реляционными базами данных (JDBC, JPA), с XML (DOM, SAX, StAX, JAXB), сетевое взаимодействие, графические интерфейсы (Swing, JavaFX). Это важные и востребованные темы, с которыми вы столкнетесь в любом реальном проекте, поэтому надо уделить им время. Не рассматривались особенности «большой» Enterprise Java и «маленькой» мобильной Java, в том числе Android. Если вам интересно двигаться туда, это надо изучать отдельно.

  2. Знание Java — это не только знание языка и стандартной библиотеки, но и знание виртуальной машины, ее особенностей и ограничений. Что делать, если программа падает с ошибкой нехватки памяти? Что делать, если долго работает сборщик мусора и программа из-за этого не отвечает?

    В состав JDK входят многочисленные инструменты для мониторинга работы JVM и диагностики различных проблем (VisualVM, Flight Recorder, Java Mission Control, jps, jstack, jmap, jhat). Эти инструменты могут обнаружить и понять проблему. А далее при помощи параметров командной строки (которых поддерживается огромное количество) можно влиять на разные аспекты работы виртуальной машины, добиваясь увеличения производительности. Тюнинг этих параметров — настоящее искусство. Впрочем, не любую проблему можно решить тюнингом. Может потребоваться переписать код более оптимальным образом.

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

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

    • YourKit, JProfiler

    • Eclipse Memory Analyzer

    • Checkstyle, FindBugs, PMD

    • JUnit, TestNG

    • Mockito, AssertJ, XMLUnit, HttpUnit

    • Java Microbenchmark Harness (JMH)

    • JCov, JaCoCo, Clover, EMMA

    • Ant, Maven, Gradle

  4. Довольно важная тема, связанная с объектно-ориентированными языками, не только с Java — это шаблоны проектирования и разнообразные принципы, эвристики, помогающие создавать хороший дизайн, архитектуру программы. Шаблоны проектирования — это устоявшиеся подходы к решению типичных задач. Знание шаблонов позволяет вам не только быстрее находить решения, но и более эффективно общаться с коллегами благодаря общему словарю. Вместо долгого и подробного описания, какие классы и методы вы реализовали, как они работают, вы можете просто сказать: «Здесь я использовал шаблон абстрактная фабрика, а здесь — шаблон visitor», и вас поймут.

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

    Несколько примеров шаблонов проектирования, названия которых на слуху: Abstract Factory, Proxy, Adapter, Builder, Visitor, Observer, Singleton.

    Что касается принципов проектирования, то один из них я упоминал в курсе. Это был принцип подстановки Лисков. Это важный, но не единственный принцип. Есть аббревиатура «SOLID», за которой скрываются пять наиболее важных принципов проектирования. Один из них — буква L — это как раз принцип подстановки. Про остальные буквы я сейчас рассказывать не буду, предлагаю вам их загуглить. (Говорят, информация, добытая самостоятельно, лучше запоминается :) ) Сюда же относятся аббревиатуры KISS, YAGNI и DRY.

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

    Примеры актуальных кубиков: Spring, Guice, Guava, Apache Commons, SLF4J, GSON, Hibernate, Netty, Akka, Lucene, Spark, Hadoop.

  6. И еще одна особенность современного программирования — командная работа и использование многочисленных вспомогательных инструментов. Это системы контроля версий (Git, Mercurial, Subversion), сервера непрерывной интеграции (Hudson, Jenkins, TeamCity), системы для code review (Crucible, Gerrit, Review Board), различные багтрекеры (BugZilla, JIRA, Redmine, TRAC) и внутренние wiki (Confluence, DokuWiki, MediaWiki).

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

  7. И еще — учите английский. Почти все самое свежее и интересное, связанное с программированием, находится на англоязычных сайтах. Если хотите быть на переднем крае, то без английского языка не обойтись.

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

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

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

  3. Подпишитесь на блоги/подкасты/рассылки про Java. Читайте Хабр. Послушайте «Разбор полетов». Заходите на StackOverflow, смотрите популярные вопросы, пробуйте отвечать сами. Это нужно, чтобы постоянно быть на острие, в курсе новостей, новых библиотек, новых возможностей Java. Она не собирается 10 лет стоять на месте.

  4. Узнайте, где тусуются Java-программисты. Будут ли в ближайшее время конференции или митапы JUG’а. Организуйте с друзьями/однокурсниками/коллегами свою онлайновую или офлайновую тусовку для обмена опытом.

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

Дерзайте. Успехов вам и нескучных 10 лет!

sparta

К оглавлению блога