(Notes) Notes (2011 год)

JAVA welcome.

VM rating (рейтинг виртуальных машин)

Java - специфическая технология изобретенная компанией SUN (ныне поглощенная Oracle) и поддержанная компанией IBM. Этих двух монстров достаточно, чтобы эта технология была на гребне успеха уже долгие годы. Однако, JAVA существенно отличается от двух аналогичных платформ FLEX и NET. Платформы NET и FLEX поддерживаются ОДНОЙ крупной мега фирмой - Microsoft и Adobe соответственно. Развитие каждой их виртуальных машин FLEX и NET регулируется из своего единого центра, возможно даже из одного кабинета (находящегося в Adobe для Flex или в Microsoft для NET) - а вот JAVA развивается из сотен взаимноконкурирующих центров. Чем-то напоминает развитие Linux, но только каждый каждый центр действует на коммерческой основе.

Из-за этого на JAVA сложно работать. Для любого, даже простейшего механизма (например механизм развертывания приложений) - существует множество альтернатив. Ты можешь стать специалистом по развертыванию с помощью ANT, но вдруг сталкиваешься с приложением, которое развертывается с помощью MAVEN - и уже ничего не понимаешь в этом механизме.

Что касается более сложных механизмов, чем развертывание, то например всевозможных рабочих фреймворков для JAVA существуют десятки. Ты можешь потратить год на освоение Hibernate, но потом оказывается что в каком-то проекте тебе нужен Spring MVC - в котором ты уже ничего понять не можешь. А таких ORM существуют множество, вот довольно скромный списочек JAVA-фреймворков: Action Framework, Baritus, Barracuda, Bento, Bishop, Cameleon, Canyamo, Cassandra, Chiba, Click, Cocoon, Dinamica, Dovetail, Echo, Expresso, Folium, Genie, GWT, Helma, Jacquard, Jaffa, Japple, JATO, JBanana, Jeenius, JFormular, JPublish, jStatemachine, Jucas, JWAA, JWarp, jZonic, Macaw, Maverick, Melati, Millstone, MyFaces, Nacho, Niggle, OpenEmcee, OXF, RIFE, Shocks, Smile, SOFIA, Spring MVC, Stripes, Struts, Tapestry, TeaServlet, Turbine, Verge, Warfare, WebOnSwing, WebWork, wingS, Xoplon . У каждого из рабочих фрейморков существует множество пылких приверженцев, доказывающих что их любимый фреймворк самый лучший на свете. Эти фрейморки могут комбинироваться между собой - представляете какой простор тут возникает для ответа на любой вопрос - в каком порядке мне начать изучать JAVA или какая среда будет лучше для решения моей конкретной задачки?

Для сравнения в NET можно более ли менее четко выделить всего три среды для WEB-разработки. ASP.NET (которую я наиболее часто применяю), ASP NET MVC (которой я пользуюсь лишь иногда) и среда разработки с SilverLight (которой лично я не пользуюсь вообще никогда, ибо считаю ее мертворожденным глюком и вместо нее я пользуюсь Adobe Flash). Кстати любая из этих трех NET-сред гораздо ближе друг к другу чем вышеперечисленные рабочие Ява-фреймворки.

Даже сред разработки IDE существует множество - помимо двух основных бесплатных сред Eclipse и NetBeans, насколько я знаю многие профы пользуются платными IntelliJ IDEA и Oracle JDeveloper - но платных популярных сред тоже существует множество. Работа в каждой из них специфична. Например NetBeans сам запускает сервер приложений GlassFish, а чтобы его запустить при работе в Eclipse - надо еще попарится. В NetBeans можно настраивать GUI-конторолы как во FLEX или NET, а в Eclipse это невозможно.

Кроме того, исполняющая среда cкрипта JAVA может быть самая разная. Например в all-in-one сборку Eclipse для JEE входит внушительный список линков на 30 различный сред исполнения JAVA-скриптов. Причем этот список расширяемый до бесконечности. К примеру скриптом JAVA управляется сервер RED5 - и я дополнил свою среду разработки сервером RED5. Кстати, плагин для работы с RED5 существует только для Eclipse, а для NetBeans его нет и код управления RED5 надо вручную и правильно развернуть в RED5. Таких серверов, управляемых скриптами JAVA существуют, пожалуй не сотни, а тысячи. И если ты потратил год на детальное изучение работы сервера RED5, ты сможешь легко понять работу любого приложения для управления RED5 (например SIP приложения под RED5), но это не значит что ты сможешь съекономить время на изучение JAVA-управления каким-нибудь другим сервером, например JITSI SIP Communicator. Соответственно, любой публичный JAVA-хостинг должен предоставлять возможность захостить JAVA-приложения минимум в десяти различных серверах. Для сравнения .NET-приложения могут быть развернуты лишь в IIS и иногда в Apache (в виде MONO).

Даже JDK существует несколько - вот списочек 50-ти производителей виртуальных машин JAVA. Помимо (условно) основного JDK от SUN (ныне Oracle) существует и JDK от IBM и JDK от Apple, Java для Android, OpenJDK... Это похоже на то, что даже сам по себе NET Framework бы выпускали 50 конкурирующх фирм, причем у каждой фирмы была бы собственная линейка развития своего продукта и множество несовместимых версий.

Из-за таких сложностей лично я программирую на JAVA только на самом начальном уровне, хотя ИНОГДА и выполняю отдельные задачки на JAVA - ну вот например в 2010-м году мне потребовалось внести изменение в JAVA-прогу, устанавливающую VPN-тоннель с сервером Sabre. Для этого мне пришлось изменить рабочую версию виртуальной машины JAVA на 1.4 (в более поздних версиях нужные мне методы были исключены), доставить JAX-RPC плагин в NetBeans и лишь после этого внести все требуемые поправки в код. Эту задачку у меня решить получилось (как видите, это еще NetBeans 6.9.1 от 2010-го года) - и в итоге я отдал суппорту Sabre готовый экзешник (сделанный в launch4j) .

Я много лет программирую на NET (включая MONO) и недолго (но довольно успешно) программирую на FLEX - этого в принципе практически всегда хватает для решения любой задачки. Но все ж таки ИНОГДА у меня возникают проекты, для которых требуется знание JAVA-технологий - ибо как вы видите на диаграммах - условия применения этих трех виртуальных машин совершенно разные. Поэтому я решил сделать для себя этот небольшой конспектик JAVA-технологий.

Может быть мой конспектик будет полезен и кому-нибудь еще.


Титульная диаграмма этого топика отражает мое собственное понимание рейтинга (удобства работы и возможностей) трех ведущих виртуальных машин в различных областях применения. Небольшие пояснения к этой диаграмме:

Это мой ЛИЧНЫЙ взгляд на вещи, не претендующий на 100% достоверность. Может кому-то AIR кажется менее удобным на платформе LINUX чем JAVA, а может кто-то считает MONO столь же вылизанной платформой как и оригинальное NET - тогда столбики на этой диаграмме уплывут в соответствии с этими взглядами. Но мне удобство и возможности этих трех ведущих виртуальных машин видятся именно так.

На второй диаграмме рейтинги VM показаны не по областям примения VM, а по совокупной стоимости применения VM в жизненном цикле приложения.


VM rating (рейтинг виртуальных машин)

Синтаксически Ява практически совпадает с Flex - Ява лишь чуть-чуть крученее Flex- введеные кое-какие дополнительные элементы обьектного программирования, привычные любому Бейсик-программисту - например Дженерики. Впрочем, до Бейсика Яве далеко - даже по возможностям обьектного программирования, не говоря уже об основных фундаментных блоках Бейсика - начиная от обьектов анонимного типа (существующего с самой первой версии Бейсика), более развитой многопоточности и асинхронности, обьекта My для доступа к локальному кампутеру, элементарных операциях типа Redim preserve, более крученых управляющих конструкциях начиная от GoTo, более развитых контролах, втрое более обширном библиотечном фреймворке (VM JAVA 7 занимает 80 МБ, VM FLASH 4 - 140 МБ, VM NET 4 - 240 МБ), прямой манипуляцией памятью и указателями на фунции, более развитой работе с Native API системы, реестром и COM-обьектами, всякими извратами с динамической подзагрузкой библиотек по Reflection, условной компиляций и даже элементарных типов данных в Бейсике вдвое больше - и кончая всякими наворотами последних версий Бейсика типа Linq и анонимными функциями. В силу этого, для Бейсик-программиста - надо просто отказаться от 90% того, что знаешь и умеешь, используя лишь самые примитивные 10% возможностей Бейсика и все писать в синтаксисе Flex - и у тебя автоматически получится код на JAVA. Ну это грубовато, конечно - но для меня языковые возможности JAVA выглядят именно так. Кстати, существует и конвертер синтаксиса Бейсик -> JAVA.

Хотя JAVA - это тоже программирование для виртуальной машины (хотя и для более простецкой чем NET и более простецкими средствами чем Бейсик), но JAVA имеет множество особенностей и достоинств, которые совсем не лежат в плоскости языковых конструкций. Несомненно, опытные JAVA-программисты найдут достоинств больше чем я, но все же я попробую перечислислить то, что вижу я.

Главное достоинство - это полностью открытая и бесплатная среда программирования Eclipse и Netbeans - причем они по качеству ничем не уступают дорогущей Visual Studio 2010 (в полном варианте стоит почти 12 тысяч долларов). Впрочем и FLEX - тоже практически бесплатная среда. Хотя Adobe Flash Builder вроде бы стоит $50, но я написал письмо в Adobe и мне прислали бесплатно аж четыре ключа сразу (бесплатные ключи высылаются как минимум безработным и студентам).

Второе достоинство - на JAVA существуют горы FreeWare OpenSource софта (помимо собственно IDE). Вот например список софта, сделанного в NetBeans - списочек впечатляет. Почти половина софта - полностью свободная. Есть немало OpenSource CMS - а сколько-нибудь серьезное приложение никто не станет делать в платной системе с закрытым кодом. И дорого, и навечно завязываешься на разработчиков среды. Предельный вариант требований к качеству - криптография. Софт, который должен быть НАСТОЛЬКО надежным - никому не приходит в голову делать с закрытым кодом.

Третье неоспоримое достоинство JAVA - для мобильных приложений и всяких тонких клиентов виртуальные машины NET и FLASH слишком тяжелые. Но и для больших Enterprise-приложений NET и FLASH тоже никак не подходят. FLASH - конечно позволяет решат любые задачи общего назначения, но изначально это специализированная виртуальная машина для видео и графики, совсем не претендующая на Enterprise-применения. MONO может как-то конкурировать с JAVA для Enterprise-приложений (как и NET Compact может конкурировать с JAVA для мобильных приложений), но кто захочет связываться с насосом по выкачиванию денег под названием Microsoft? - при наличии ничем не худшей полностью бесплатной платформы JAVA (к тому же поддерживаемой как минимум такими монстрами как IBM и Oracle).

А вот великое множество конкурирующих вариантов применения JAVA-технологий - это и достоинство и недостаток. Смотря с какой стороны посмотреть.


Во FLEX в сущности существует только один старый компактный вид проекта (так создают обычно код опытные флешеры во FLASH PROFESSIONAL чтобы экономить обьем кода) - это класс, расширяющий дополнительным функционалом Sprite (или иной DisplayObject) и один новый вид проекта MXML - которых бывает два вида - для Web (FLEX) и для Desktop (AIR). Проект может состоять из пакетов (в котором может находится один доступный извне класс). Можно создать публичную библиотеку SWC (Flex Library), можно создать отображаемый контрол (MXML Component), можно разбить проект на отдельные модули (MXML Module) - чтобы динамически подзагружать каждый модуль по необходимости. Есть пару дополнительных компонентов проекта - ресурсы и скины для отображаемых элементов. Как видите, все предельно просто. Нет никакого развертывания. Все просто компилируется в SWF-файл, который исполняется виртуальной машиной FLASH. С учетом хорошей подсказки и справки во FLASH BUILDER, кучи примеров и того, что имена классов и функций в библиотеке клонируют имена в виртуальной машине NET, синтаксис совпадает с JavaScript, есть отличный отладчик - программировать на ActionScript можно легко и без напряга через пять минут после знакомства с FLEX.

Среда Бейсика выглядит намного крученее среды FLASH . В NET существует 7 основных видов Windows проектов (Windows Forms, Windows Forms Control Library, Console application, 4 вида WPF-приложений), проекты Class Library и Windows Service, 22 вида проекта для управления MS Office, 4 вида проектов Web-сервисов (в NET 4 и еще старые типы Web-сервисов из NET 3.5 и 2.0), несколько видов проектов изготовления SQL CLR сборок, проекты SSIS-пакетов, 4 вида проекта расширения Visual Studio, 6 видов инсталляционных проектов, 14 видов проектов для SharePoint, 3 вида проекта для Silverlight, 4 вида WorkFlow проектов, 10 видов каких-то проектов расширения, проект тестов, проект Asure, 10 видов проектов Web-приложений - как видите для Бейсика существует более 100 проектов разных типов. Причем это только инсталлированная у меня довольно таки минимальная конфигурация - ее можно в любой момент дополнить еще многими сотнями проектов разных типов. Плюс развертывание Бейсик-программ может быть выполнено в Linux, внутрь MS Office, внутрь SQL-сервера, в браузер (в виртуальную машину SilverLight), в саму Visual Studio, просто в IIS (обычные ASP.NET-приложения), в IIS с URL-редиректором, в IIS с SharePoint, в IIS для развертывания по ClickOnce. Впечатляет, не правда-ли? Ну помимо того, что языковые возможности Бейсика в десятикратно выше чем у Flex и Java (как и обьемы библиотек виртуальной машины) - об этом я уже говорил. Однако серьезный недостаток Бейсика - он принадлежит САМОМУ крупному в мире насосу по выкачиванию денег. Ну и плюс этот насос не желает поддерживать Бейсик нигде, кроме машин X86-X64 под Windows (MONO поддерживается лишь энтузиастами на некоммерческой основе). Напротив JAVA не принадлежит никому конкретно и поддерживается практически на любых платформах.


Вариантов JAVA-проектов, похоже, почти столько же как у Бейсика... Полностью описывать назначения всех вариантов проектов на Яве я наверное не решусь - ибо во-первых, я знаю среду JAVA не настолько хорошо, как Бейсик, а во-вторых это будет весьма обширное описание. Все что реально сделать в этой небольшой интернет-заметке, чтобы помочь тем, кто идет таким же путем как и я - это отослать к книгам, которые я читал (и снабдить эти книги некоторыми своими оценками) и дать сгрузить адаптированные примеры из этих книг, с которыми можно не возится, а открыть их в один клик. Ну собственно по этим примерам я сам пытался изучать Ява-технологии.

Во-первых, есть старинный четырехтомник Дейтела от 2002-2003 года. Он конечно устарел, но я изучал Яву именно по нему. Он достаточно подробный и снабжен огромным количеством проверочных упражнений. Если вы ответите на большинство вопросов к каждому разделу - смело можете попытаться трудоустроится тысяч на 150 в месяц. К достоинствам книг можно отнести их чрезвычайную подробность - куча кода, все разжевано до предела. К каждому разделу есть отличное краткое резюме и полный список всех сокращений и терминов. Эти книги сделаны как букварь и выглядят на голову выше, чем например обучение в современных книгах Хорстмана (хотя это лучшие современные книги). Эти резюме к каждой теме полезно выписать себе и вызубрить - если вы только начинаете работать с Явой. К недостаткам книг можно отнести то, что за 10 лет все это безнадежно устарело. Во времена написания этих книг еще не существовало ни NetBeans ни Eclipse, ни множества современных серверов приложений, никаких из вышеупомянутых фреймворков. Но эти книги дают глубокую академическую базу знаний по JAVA, с которой можно двигатся дальше. Примеры из этой книги (для Eclipse) вы можете сгрузить внизу отсюда.



Из более современных книг я бы порекомендовал двухтомник Хорстмана. Только учтите, что учит он лишь мизерной части Явы - только JAVA SE. Опять же никаких фреймворков, серверов приложений, никаких хитростей работы в IDE - там не ищите. Только самое начало. Но в принципе в JAVA SE все разжевано вполне основательно - это лучшие книги, что я видел (кроме устаревшего Дейтела). Примеры из этой книги (для Eclipse) вы можете сгрузить отсюда.



Наконец, среди большого потока книг о JAVA я бы хотел похвалить еще две книги. Левая книга - для меня идеальна. Видимо она соответствует моему нынешнему уровню пониманию JAVA-технологий - для меня эта книга читается как увлекательный роман. В отличие от книг Дейтела или Хорстмана, (которые я использую лишь как справочник). Примеры из этой книги (для Eclipse) вы можете сгрузить отсюда.

Вторая книга посвящена ActionScript. В принципе это нечто среднее между совсем нетипизированным JavaScript и полностью типизированной JAVA. Но она посвящена тому, что я называю ОБЬЕКТНЫМ ЭКСТРЕМИЗМОМ - стремлением проектировать программы только в парадигме обьектов. Причем лепить обьектные абстракции там, где их нет и в помине. Ведь код даже с GOTO трудно отлаживать - а насколько труднее понять код, написанный другим программистом, который все это представлял себе как-то в голове в виде только ему понятных обьектов! Причем брал какие-то шаблоны проектирования обьектов, комбинировал их между собой - проводил у себя в голове мысленные границы между уровнями в обектах. Это просто ад для отдладки и понимания того, что кто-то там наковырял в коде. Никакое GOTO не сравнится с адской мешаниной умозрительных конструкций в ЧУЖОЙ голове.

Хотя я достаточно активно пользуюсь обьектами в бейсике - как я уже говорил бейсик это САМЫЙ обьектный язык в мире, гораздо больше в нем инструментов для обьектного программироания чем в Яве, но в Бейсике можно программировать и вовсе без обьектов. Или с обьектами анонимных типов - подобных JavaScript. Некий клон анонимных типов Бейсика появился сейчас даже в убогом Шарпе - но Бейсик-программисты так ведь ПРИВЫКЛИ работать еще с начала 90-х годов. В VB6 (от 1998-года) - никто и не работал иначе, чем на анонимных типах. И кроме обьектов в Бейсике есть модули (то есть собственно запускающий обьект и его экземпляр создает сама среда Бейсика (давая возмножность программисту сосредоточится на собственно смысловом алгоритме). Из-за такой широты технологий Бейсика - применение обьектов везде и всегда выглядит маразмом. И например, PERL-программисты тоже способны решить ЛЮБУЮ задачку путем переработки входных данных в выходные лишь с помощью регулярных выражений - и для них тоже обьектные прикрутки выглядят явным маразмом. Но, увы, JAVA-код - это почти всегда объектный экстремизм. Но если вы хотите вникнуть в технологии объектного экстремизма (хотя бы чтобы понимать код других программистов) - то лучше правой книги не существует.



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




Comments ( )
Link to this page: //www.vb-net.com/Java-Welcome/index.htm
< THANKS ME>