Несколько недель назад довелось попрограммировать на 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” – в следующий раз.
>> Вот сколько в C++ есть способов написать систему логгирования? На макросах, на основе ООП, на основе шаблонов – плюс невероятное количество сочетаний этих ингредиентов.
ОтветитьУдалитьИ скажем не таясь: как не пиши получится в большинстве случаев весьма ублюдочно, потому что С++ весь из одних костылей состоит.
>И скажем не таясь: как не пиши получится в большинстве случаев весьма ублюдочно, потому что С++ весь из одних костылей состоит.
ОтветитьУдалитьСначала надо бы определиться, что такое C++: мощная пушка без предохранителя, случайный выстрел из которой отрывает сразу обе ноги, или же набор костылей :)
>> Сначала надо бы определиться, что такое C++: мощная пушка без предохранителя, случайный выстрел из которой отрывает сразу обе ноги, или же набор костылей :)
ОтветитьУдалитьОдного другого не отменяет. Можно себе костылём ноги перебить, а потом на других костылях передвигаться...
>Одного другого не отменяет
ОтветитьУдалитьА по мне, так отменяет. Бензопилой гораздо легче оттяпать себе ногу, чем ручной ножовкой. При этом можно утверждать, что бензопила -- это сборище костылей -- моторчик слабенький, без бензина не работает и пр. Тем не менее, бензопилами лес рубят так, что только щепки летят. Вот так же и с C++ -- это далеко не идеальный язык, но хорошие программы на нем писать не так сложно, как об этом говорят.
Если продолжать аналогию про пилы, то Java по сравнению с C++ -- это эдакий комбайн про прокладке просек: сам деревья пилит, пни выкорчевывает, а оператор сидит в хорошо защищенной и отапливаемой кабине. Только горючего этой комбайн жрет немерянно, и просеки только по прямой и только в сосновых лесах прокладывает. :)
Нет. Бензопила это не сборище костылей. Сборище костылей --- это бензопила без бензина и мотора, к которой приделали паровой котел и пилят лес.
ОтветитьУдалитьВот и С++ такой же. Когда смотришь на него во всей его совокупности фич и на то как все эти фичи используют, то понимаешь что язык это уродливый до невозможности.
>Вот и С++ такой же. Когда смотришь на него во всей его совокупности фич и на то как все эти фичи используют, то понимаешь что язык это уродливый до невозможности.
ОтветитьУдалитьНу что тут сказать. К C++фобам я не отношусь и кидаться в C++ гнилыми помидорами мне не интересно. C++ применяю давно и успешно. Альтернативы ему пока нет.
А кто здесь -фоб? Если вы на меня намекаете, то все совсем не так =)
ОтветитьУдалитьФобия --- это страх. У меня нету страха С++. Но отсутствие страха не означает трепетную любовь.
>Если вы на меня намекаете, то все совсем не так =)
ОтветитьУдалитьА со стороны, все-таки, лучше видно ;)
>Но отсутствие страха не означает трепетную любовь.
Сложно представить, как пользоваться инструментом и испытывать к нему такую ненависть ;)
Считать C++ сборищем костылей не конструктивно. За каждым "костылем", как правило, есть вполне разумное решение и/или компромис. Если встать на такую точку зрения, то C++ сборищем костылей уже не кажется.
Ненависти я тоже не испытываю. Она действительно неконструктивна.
ОтветитьУдалитьА пользоваться С++ не особо сложнее чем С (который я люблю). Сложно оказаться в команде с человеком, который начинает применять отрыжку типа mpl и плодить тонны каких-то леших шаблонов с 5 шаблонными параметрами. Ты смотришь на все это в унынии и вспоминаешь о том, как в школе тоже любил шаблонные метапрограммки и думал, что это круто. Но перегорел с тех времён...
>Сложно оказаться в команде с человеком, который начинает применять отрыжку типа mpl и плодить тонны каких-то леших шаблонов с 5 шаблонными параметрами.
ОтветитьУдалитьС этим согласен на 100%. C++ дает простор таким велосипедостроителям. Наверное, в 0.1% случаев это хорошо. В остальных -- это overkill. Однако, это не проблема языка, я считаю.
Интересно, попробовать что-ли на обероне пописать :)
ОтветитьУдалить2Rustam:
ОтветитьУдалитьВременами, когда смотришь, какой говнокод производят начинающие C++ники, хочется пересадить их на Modula-2 или Oberon.