вторник, 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” – в следующий раз.

12 комментариев:

Unknown комментирует...

>> Вот сколько в C++ есть способов написать систему логгирования? На макросах, на основе ООП, на основе шаблонов – плюс невероятное количество сочетаний этих ингредиентов.

И скажем не таясь: как не пиши получится в большинстве случаев весьма ублюдочно, потому что С++ весь из одних костылей состоит.

eao197 комментирует...

>И скажем не таясь: как не пиши получится в большинстве случаев весьма ублюдочно, потому что С++ весь из одних костылей состоит.

Сначала надо бы определиться, что такое C++: мощная пушка без предохранителя, случайный выстрел из которой отрывает сразу обе ноги, или же набор костылей :)

Unknown комментирует...

>> Сначала надо бы определиться, что такое C++: мощная пушка без предохранителя, случайный выстрел из которой отрывает сразу обе ноги, или же набор костылей :)

Одного другого не отменяет. Можно себе костылём ноги перебить, а потом на других костылях передвигаться...

eao197 комментирует...

>Одного другого не отменяет

А по мне, так отменяет. Бензопилой гораздо легче оттяпать себе ногу, чем ручной ножовкой. При этом можно утверждать, что бензопила -- это сборище костылей -- моторчик слабенький, без бензина не работает и пр. Тем не менее, бензопилами лес рубят так, что только щепки летят. Вот так же и с C++ -- это далеко не идеальный язык, но хорошие программы на нем писать не так сложно, как об этом говорят.

Если продолжать аналогию про пилы, то Java по сравнению с C++ -- это эдакий комбайн про прокладке просек: сам деревья пилит, пни выкорчевывает, а оператор сидит в хорошо защищенной и отапливаемой кабине. Только горючего этой комбайн жрет немерянно, и просеки только по прямой и только в сосновых лесах прокладывает. :)

Unknown комментирует...

Нет. Бензопила это не сборище костылей. Сборище костылей --- это бензопила без бензина и мотора, к которой приделали паровой котел и пилят лес.

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

eao197 комментирует...

>Вот и С++ такой же. Когда смотришь на него во всей его совокупности фич и на то как все эти фичи используют, то понимаешь что язык это уродливый до невозможности.

Ну что тут сказать. К C++фобам я не отношусь и кидаться в C++ гнилыми помидорами мне не интересно. C++ применяю давно и успешно. Альтернативы ему пока нет.

Unknown комментирует...

А кто здесь -фоб? Если вы на меня намекаете, то все совсем не так =)

Фобия --- это страх. У меня нету страха С++. Но отсутствие страха не означает трепетную любовь.

eao197 комментирует...

>Если вы на меня намекаете, то все совсем не так =)

А со стороны, все-таки, лучше видно ;)

>Но отсутствие страха не означает трепетную любовь.

Сложно представить, как пользоваться инструментом и испытывать к нему такую ненависть ;)

Считать C++ сборищем костылей не конструктивно. За каждым "костылем", как правило, есть вполне разумное решение и/или компромис. Если встать на такую точку зрения, то C++ сборищем костылей уже не кажется.

Unknown комментирует...

Ненависти я тоже не испытываю. Она действительно неконструктивна.

А пользоваться С++ не особо сложнее чем С (который я люблю). Сложно оказаться в команде с человеком, который начинает применять отрыжку типа mpl и плодить тонны каких-то леших шаблонов с 5 шаблонными параметрами. Ты смотришь на все это в унынии и вспоминаешь о том, как в школе тоже любил шаблонные метапрограммки и думал, что это круто. Но перегорел с тех времён...

eao197 комментирует...

>Сложно оказаться в команде с человеком, который начинает применять отрыжку типа mpl и плодить тонны каких-то леших шаблонов с 5 шаблонными параметрами.

С этим согласен на 100%. C++ дает простор таким велосипедостроителям. Наверное, в 0.1% случаев это хорошо. В остальных -- это overkill. Однако, это не проблема языка, я считаю.

Rustam комментирует...

Интересно, попробовать что-ли на обероне пописать :)

eao197 комментирует...

2Rustam:

Временами, когда смотришь, какой говнокод производят начинающие C++ники, хочется пересадить их на Modula-2 или Oberon.