Последнее время на ЛОРе только и слышишь, что-де «Java завоевала популярность исключительно благодаря маркетингу и низкому уровню вхождения». Давайте же, сознательно оставив за рамками дискуссии маркетинговые вопросы, разберемся природе распространенного мифа, каковым является вторая часть этого безапелляционного утверждения.
Сперва давайте полистаем спецификацию языка Java, третье издание. В книжке 684 страницы. Шестьсот восемьдесят четыре. (Если в этот момент у вас при словах «низкий уровень вхождения» начинается истерический хохот - не пугайтесь, это как раз свидетельствует о вашей нормальности; остальным же рекомендуется продолжить чтение.) Разумеется, многие могут парировать, что, мол, совершенно не обязательно читать всю книгу для того, чтобы начать программировать. Чтобы начать быдлокодить - возможно. Но чтобы начать эффективно решать задачи, используя для этого всю мощь языка - книжечку придется все-таки как следует полистать.
Ну, что же, спецификацию языка мы изучили. Что мы можем написать на Java? Да ровным счетом ничего, потому что мы еще не освоили работу со стандартной библиотекой или (иными словами, Java API). Стандартная библиотека Java версии 1.6 состоит чуть более чем из семи тысяч классов и интерфейсов и десятков тысяч методов. Предвосхищая повторное «и зачем надо въезжать во все 7000 сразу?» - отвечу, что таки да, пишущему десктопное приложение может не понадобиться какая-нибудь CORBA, а разработчику сетевых сервисов - Swing и так далее. Но если решаемая задача все же сложнее «Hello, World!», то ее предметной области будет соответствовать некое довольно объемное подмножество Java API, которое придется освоить в полной мере.
Вот мы и научились создавать desktop-приложения, несложные сетевые службы и middleware, работать с файлами и обрабатывать XML. Что же дальше? Давайте обратим наш взор на встраиваемые приложения, где Java давно прописалась, и с большим комфортом. Мобильные телефоны, PDA, set-top boxes, автомобильные компьютеры, диски Blu-ray - это все так называемая Java Microedition. Поскольку спектр устройств (и их возможностей) невообразимо широк, настолько же широк и спектр спецификаций («профайлов») JavaME, покрывающий их: CDC (Connected Device Configuration), CLDC (Connected Limited Device Configuration), MIDP (Mobile Information Device Profile), FP (Foundation Profile), PBP (Personal Basis Profile), PP (Personal Profile). Пусть каждый из «профайлов» и является подмножеством «старшего брата» (JavaSE), но каким именно подмножеством - потребуется изучить.
Наконец предположим, мы позволили себе замахнуться на Вильяма нашего Шекспира Корпоративную Информационную Систему. Что нас ждет в этом случае? А ждет нас изучение Java Enterprise Edition. В этом дивном новом мире нас ждут сервлеты и фильтры, JSP и JSF, Tomcat и GlassFish, JDBC и JPA, JCDI и JNDI, EJB, JTA, JMS, JAAS, JCE, JSSE, и много всяких прочих интересностей. Пытливый ум задаст вопрос: «А нафига мне весь этот блоат, если я хочу автоматизацию бизнеса? SQL в руки, и вперед!» - на что я отвечу ему следующее. Построение эффективной, производительной, масштабируемой, надежной и безопасной системы потребует задействования определенных, вполне известных техник. Техника «SQL в руки, и вперед» к ним не относится. Но вам повезло: большинство подобных техник уже реализовано для платформы Java, реализации имеют высокое качество и публикуются под свободными лицензиями. Большинство вышеприведенных аббревиатур имеют к ним прямое отношение. Это и реализации ORM/Persistence (Hibernate, EclipseLink), и контейнеры для трехзвенных приложений (GlassFish, JBoss), и веб-контейнеры (Tomcat), и кластерные коммуникации, и JMS message broker'ы, и так далее, и тому подобное. Поэтому для трезвомыслящего разработчика, который заботится о качестве продукта и о своем времени, путь один: изучать технологии, чтобы потом экономить время и повышать качество продукта. И да, это требует интеллектуальных и временнЫх вложений.
Резюмируя, скажу, что уровень вхождения, необходимый для написания хелловорлда, примерно одинаков для всех языков - от примитивного Visual Basic до зубодробительного Haskell. Для решения реальных задач потребуется поработать мозгами в любом случае. Для эффективного и продуктивного решения задач - придется поработать мозгами очень конкретно. В этом смысле Java дает некоторую поблажку разработчикам (по отношению к другим языкам), за счет огромного количества технологий, решающих подчас очень сложные инфраструктурные задачи (кластеризация, persistence, remoting и т.п.). Но это не отменяет необходимости их глубокого изучения (что, как правило, воздается сторицей).
Таким образом, утверждение о том, что «Java имеет низкий порог вхождения», выдает в заявляющем представителя одной из следующих категорий:
- люди, не имеющие отношения к Java и делающие суждения на основе утверждений, сделанных двумя другими категориями;
- тролли;
- адепты маргинальных языков, мучимые баттхертом из-за нераспространенности собственного идола.
Ну или любая из четырех нетривиальных комбинаций вышеперечисленного.