вторник, 13 апреля 2010 г.

[prog.flame] Попрограммировал на Java, делюсь впечатлениями. Часть I. Общие слова.

Несколько недель назад довелось попрограммировать на Java, а до этого в последний раз я писал на Java 2001-м году. Впечатлений много. Нашлось время часть из них описать.

Впечатление первое. Теперь я понимаю, почему Java-программисты такое большое значение придают IDE. Без продвинутой IDE в Java очень сложно. Сам язык такой многословный, что одно и то же в нем приходится повторять по нескольку раз. Например, если мне нужна локальная переменная типа StringBuilder, то имя StringBuilder мне придется писать дважды:

StringBuilder sb = new StringBuilder();

Тогда как в C++, за счет такой вещи, как создаваемые на стеке переменные, объявление требовало бы всего одного имени типа.

Другое проявление многословности и очень существенной помощи IDE – это директивы import. Насколько я понял, сейчас уже не принято импортировать все содержимое пакета. Т.е. вместо:

import javax.naming.*;

модно стало писать так:

import javax.naming.Context;
import javax.naming.InitialContext;

Не могу себе представить, как без помощи IDE делать import отдельных классов.

Еще одна сторона многословности: checked exceptions. Даже если оставить за рамками данной заметки сам смысл существования checked exceptions, то перечисление исключений в собственных методах, а так же перехват чужих исключений для того, чтобы преобразовать их в собственные исключения – все это, мягко говоря, тупая и механическая работа, которая с удовольствием отдается на откуп IDE.

Впечатление второе. Однопарадигменность языка после C++ и Ruby сильно… как бы это сказать… огорошивает. В C++ у  меня есть выбор – использовать ООП или старый добрый структурный подход, или же сделать решение через шаблоны и функторы. А в Java нет такого многообразия. Там есть только кастрированный ООП (по сравнению с тем же C++, не говоря об Eiffel или Ruby/Python). И все. Если тебе нужно что-то простое сделать – делай это через наследование. Даже если это потребует в полтора-два раза больше строк кода. Все равно делай через наследование. И как бы лично меня не раздражала такая ограниченность, я думаю, что именно в ней и запрятана сила Java. Но об этом позже.

Впечатление третье. По сравнению с тем языком, который я изучал и эпизодически использовал в конце девяностых, современная Java стала приятнее. Autoboxing, generics, цикл for для обхода контейнеров – вроде бы мелочи, но с ними Java стала сильно удобнее. Просто удивительно. Желание продолжить программировать на Java у меня, разумеется, не возникло, но плеваться приходилось меньше :)

Ну а теперь впечатление четвертое, оно же главное. Появилась у меня еще одна версия ответа на вопрос “В чем сила брат Java?”

Продвинутые IDE и огромное количество библиотек для Java – это да, этого у Java не отнимешь. Но это, я бы сказал, верхушка айсберга. Это следствие, на мой взгляд, главного качества языка – его примитивизма и сильно ограниченного множества выразительных средств. Да, та самая однопарадигменность на основе кастрированного ООП и есть главная положительная характеристика Java. Именно она позволила Java стать одним из самых успешных и широко применяемых языков программирования в истории.

Язык Java получился, с одной стороны, достаточно мощным, чтобы на нем можно было писать серьезные приложения. С другой стороны, он оказался достаточно безопасным, чтобы ошибки программиста не отстреливали ноги. Еще он оказался очень простым в освоении. Ну и еще – он не дает возможности развернуться любителям велосипедов с квадратными колесами. Вот сколько в C++ есть способов написать систему логгирования? На макросах, на основе ООП, на основе шаблонов – плюс невероятное количество сочетаний этих ингредиентов. А в Java – только через ООП.

Определенно, язык Java создавался для того, чтобы код одного разработчика был как две капли воды похож на код другого разработчика. И скудость возможностей языка этому очень сильно способствует – какие бы оригинальные идеи не рождались в голове программиста, после реализации они все равно будут сильно “усреднены”. Именно поэтому на Java не создают аналогов Boost.Lambda – язык просто не позволяет разработчику заниматься подобной ерундой.

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

Перед тем, как мне пришлось засесть за Java, я пытался читать книгу Programming Scala издательства O’Reilly. Я прочел почти 100 страниц книги, но так и не понял, как написать на Scala что-то сложнее “Hello, World” и очередного факториала. И это я – профессиональный программист с 16-ти летним стажем, который когда-то Scala изучал. Не могу себе представить, чтобы Scala успешно освоил какой-нибудь чайник, которому нужно быстро написать что-то специфическое для себя.

Тогда как из 100 страниц нормальной книги по Java можно не только узнать почти все о самом языке, но и много всего полезного о наиболее употребительных частях JDK. Т.е. я вполне могу себе представить студента-второкурсника, который за пару месяцев осваивает Java, после чего успешно подрабатывает в какой-нибудь аутсорсинговой шараге. Я могу себе представить какого-нибудь физика, которому нужно написать какую-нибудь программку для сохранения результатов эксперимента в БД. Или я сам за два-три дня узнал о Java достаточно, чтобы написать библиотеку для поддержки TLV-формата.

Это все потому, что Java, как язык программирования, налагает минимальные требования на новичков. А потом ее возможностей (с учетом IDE и библиотек) хватает с головой. От добра добра не ищут :)

Поэтому Scala не будет заменой Java. Уж если что-то и станет заменой Java на JVM, так это какой-то очень-очень близкий Java язык, который добавит в Java совсем немного новых хороших вещей (как это произошло с for-ами и generic-ами). Но при этом не будет тянуть груз синтаксической совместимости со старыми версиями Java. Но о том, какой лично мне хотелось бы видеть “новую Java” – в следующий раз.

Отправить комментарий