От программиста требуется способность обучаться, брать на себя ответственность за продукт

Фото: pexels.com

Говорить о том, что сегодня разработки на Java — мейнстрим разработок, не приходится. Количество проектов на этой платформе превышает все мыслимые пределы. Кажется, любое приложение, игра и вообще ПО не обходятся без участия «чашки с кофе». И нет этому ни конца, ни края. Насколько обоснован такой подход, где границы Java и для решения каких задач ее используют профессиональные разработчики, мы и поговорим с нашим экспертом Степаном Яковенко.

Расскажите немного о себе. Почему выбрали именно Java? Какие проекты из реализованных или актуальных считаете самыми интересными?

Коммерческим программированием я занимаюсь с 2004 года, первый проект, за который получил деньги, сделал ещё будучи школьником в 1996 году, но это был проект под MSDOS. Я автоматизировал учет производства печатных плат. Каждая заготовка проходит кучу этапов обработки, до внедрения моей программы все эти данные вносились в толстый бумажный журнал. Начинал я как программист С++, потом стал исследовать рынок труда и понял, что на тот момент (2006 год) самые большие зарплаты и ассортимент вакансий были у Java программистов. Я специально устроился на половину средней зарплаты почти без опыта Java, чтобы получить практические навыки. Правда, самый интересный проект у меня был всё-таки на С++: мы писали вычислительные алгоритмы для стереометрических задач. Матрицы, векторы, операторы — все это я очень люблю со времен университета. Из последних проектов могу похвастаться тем, что мой Java-код и вообще подход к решению проблемы работает в сервисе просмотра документов в почтовых ящиках Yahoo.

Что такое Java сегодня? Почему-то в сознании многих этот язык связывается в основном с играми и мобильными приложениями. Где помимо этих областей он используется?

Известно, что около 90% денег в IT крутится в корпоративном сегменте, поэтому большая часть вакансий — это разработка приложений для средних и крупных бизнесов: всяческий документооборот, базы данных, внутренние веб-порталы, системы учета данных. Важнейшее преимущество Java — стандартизация, переносимость, а также большое число проверенных, отлаженных библиотек и очень хорошие средства разработки.

Можете назвать наиболее интересные и успешные, с вашей точки зрения, проекты на нем (как отечественные, так и зарубежные)?

Лично меня больше всего впечатляют продукты питерской фирмы JetBrains — это такие среды разработки, как Intellij IDEA, WebStorm, а недавно была выпущена среда разработки для С++. Они все написаны на Java, но с помощью плагинов позволяют программировать практически на всех модных на сегодняшний момент языках. У intellij IDEA самый умный autocomplete, очень хорошо продуманный интерфейс. К сожалению, за это приходится платить производительностью, поэтому всем разработчикам желаю приобрести SSD.

Девизом Java часто называют «много платформ — один язык». Насколько это справедливо? Кроме того, насколько я понимаю, Java — это не только язык.

На практике решения, написанные и отлаженные под Windows, приходится тестировать на Линуксе, причем, если есть зависимости от сторонних компонентов, отдельно на каждом типе Линукса (Redhat, Debian, CentOS и пр.)

В Линуксе немного другие принципы работы с файловой системой, я сталкивался с разными ограничениями на количество открытых файлов, иным поведением сторонних библиотек из-за другой стандартной кодировки. Но в целом перенос решения на другую операционку существенно проще, чем, скажем, портирование С++ приложения. Большинство популярных сторонних библиотек Java лежит в едином репозитории maven. Если есть какие-то проблемы, почти всегда можно отыскать исходники и исправить их. Я вносил правки в опенсорсные проекты hibernate и mime4j. Даже если исходников нет, можно более или менее разобраться с помощью утилиты jad и, если время позволяет, исправить ошибку.

Перейдем к «философско-религиозному» вопросу извечной войны C# и Java: «решетку» нередко называют Java-killer’ом, а сторонники Шарпа предрекают ему скорую смерть за «моноплатформенность». Особенно часто этот вопрос возникает у новичков, решающих, какой из этих языков изучать. Позвольте узнать ваше мнение об этом холиваре.

Лично мне на данный момент довольно безразлично, на каком языке писать. Последние два месяца я делаю проект на nodejs, и мне это очень нравится. К сожалению, эта платформа довольно сырая, поэтому идеального отладчика я для неё не нашёл. Удовольствие от работы для меня определяется не языком программирования, а психологической атмосферой, которая сопровождает разработку проекта. Даже в условиях плохого кода, отсутствия документации и нечетких требований заказчика дружный коллектив, при наличии ресурсов, может так или иначе уладить имеющиеся проблемы.

Язык C# приятен тем, что там больше синтаксического сахара, проще вызывать виндовые DLL. Мы портировали большой проект с C# на Java и выяснили, что C# работает с файловой системой значительно быстрее; в Java чтение из файла по байтам — разорительная операция.

С другой стороны, Java — более открытая технология. Если у вас появилась проблема с компонентом или средой, то шансов открыть их и исправить самостоятельно больше, чем в случае с более закрытыми решениями Microsoft, хотя и там это тоже иногда возможно. Мне это тяжело сейчас оценивать, но раньше цена входа для новичка в C# была ниже.

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

Java очень любим и почитаем в среде молодых и быстрых стартапов. Он считается чуть ли не лекарством от всех бед: написал апплет и все заработало. Действительно ли Java так уж всемогущ? Могли бы вы описать границы применения Java?

Где-то в курсе математики доказывается, что все языки программирования эквивалентны. Ограничение Java как языка — это необходимость что-то делать чересчур быстро, например, потоково сжимать графику или работать с очень большими объектами, которые из-за накладных расходов лучше хранить в куче (heap) C/C++. Но если требования к производительности умеренные, то, в принципе, можно достигнуть высокой нагрузки и на Java. В одном проекте нам было очень нужно (и удалось добиться), чтобы веб-страница выдавалась быстрее, чем за 20 миллисекунд. Ради производительности сначала я избавился от hibernate, потом перевел все с MySQL на mongodb, а потом самые нужные индексы вообще загрузил в память Java машины и узким местом стал только доступ к винчестеру. Так что сам язык Java не был преградой по созданию lowlatency проекта. С другой стороны, бывает и наоборот: как я помню, разработчики сайта «ВКонтакте» написали свой компилятор PHP, который позволил сократить нагрузку на их сервера.

Расскажите немного подробнее об апплетах? Что это по сути, где используются?

Апплеты — устаревшая технология, когда Java запускается из браузера на стороне клиента. Очень часто сайт перед открытием апплета предлагает поставить последнюю версию Java, что очень неудобно и потенциально распугает всех клиентов, если они «живут» в интернете. С другой стороны, если есть возможность переиспользовать какие-то готовые наработки, а клиенты от вас зависят, можно навязать апплеты. Я немного участвовал в доработке программы просмотра рентгеновских снимков, которая загружалась через апплет. Но ближайшее будущее веб-программирования, конечно, за JavaScript и HTML5.

Другая частая претензия к Java связана с тем, что это мощный инструмент, который почти не требователен к начальным знаниям программиста, а, значит, может получиться «обезьяна с гранатой». Порог входа очень низок. Это так?

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

И все же, что должен знать и уметь действительно хороший java-разработчик, хотя бы на первом этапе?

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

В Академии Сухорукова вы читаете курс Java Developer. Можете рассказать о нем подробнее? Какова его программа? На кого он нацелен, в первую очередь?

Мы начинаем с простейших программ, потом объясняем, что такое ООП на примерах, заканчиваем разработкой простейшего веб-приложения (гостевой книги) с доступом к базе данных. Лучше всего курс помогает тем, кто хочет перейти с какого-то другого, не очень востребованного языка на Java. На практических занятиях люди поднимают руку, мы подходим к каждому человеку и подсказываем, почему программа не компилируется, почему валится с исключением, куда кликнуть в среде разработки, если что-то не работает.

Какая подготовка потребуется от слушателя для его успешного прохождения?

Очень желательно иметь опыт программирования на каком-нибудь процедурном языке, неважно каком — Паскале или PHP. Нужно понимать, что такое переменная, цикл, функция, иметь опыт написания каких-нибудь программ. После этого понять, что такое класс, объект и метод, не так уж и трудно.

Будет ли готов выпускник курса непосредственно приступить к работе? Или стоит еще попрактиковаться самостоятельно?

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

Что бы вы хотели пожелать будущим слушателям и всем тем, кто хочет развиваться в такой области как кроссплатформенная разработка?

Мы можем помочь вам избавиться от страха нового языка/среды разработки и помочь справиться с проблемами, которые преследуют новичка. Можем «на пальцах» или в виде живой демонстрации в среде разработки продемонстрировать, что обозначают все эти аббревиатуры, которые есть в вакансиях: Swing, MVC, JSP, RPC, JDBC, hibernate, JAXB, JUnit, ant, maven и прочие. Но ваши успехи определяются вашими способностями и, прежде всего, упорством и количеством времени, которое вы можете выделить на самостоятельную работу.

P.S. Степан, скажите: Джава или Ява? Как правильно его называют в профессиональной среде?

Затрудняюсь ответить, я говорю Джава.

Для того, чтобы получить профессию Java-разработчика записывайтесь на наш курс.