«Тролли потроллили, хомячки порадовались…»

3 апреля 2012
Денис Цыплаков, Solution Architect

Спасибо Сергею Бабакову за заголовок статьи

Я очень люблю изучать новые языки программирования. Пытался посчитать, вышло, что с 1988 года в той или иной степени писал программы на 20 с лишним языках. В каком-то случае все закончилось 1000 строк, а, например, на Java, думаю, больше 100000 набралось. С годами пришло понимание, что, во-первых, язык сам по себе – это еще не все. Большое значение имеют платформа и используемые библиотеки. Во-вторых, все языки, широко используемые сейчас в коммерческих проектах, более или менее похожи.

Возникает вопрос: нужны ли новые языки программирования, или все уже давно придумали? В самом деле, такой модный и популярный в наши дни Python начали придумывать в середине 80-х, т. е. за некоторое время до того, как родилась довольно большая часть его нынешних поклонников.

Для наиболее нетерпеливых читателей, пожалуй, дам ответ сразу, а потом запущу в текст несколько абзацев с обоснованием, почему именно.

Да, новые языки нужны, отсутствие движения == смерть. Хуже того об одном из новых языков я хочу коротко рассказать несколькими экранами ниже. Теперь детали.

Для начала давайте посмотрим на наш ресурсный пул. Набор технологий, которые DataArt держит в «стойле», достаточно хорошо отражает состояние индустрии. За некоторыми исключениями, мы стараемся, чтобы технологический пул адекватно отражал текущий спрос. Итак, что у нас есть:

 

Java

Универсальная убер-платформа, на ней можно сделать все и даже немного больше, работает на всех ОС, обладает громадной community, придумана в середине 90-х, между последним и предпоследним релизом прошло 5 лет, при этом Java 7 отличается от Java 6 очень и очень мало, а Java 6 от Java 5, по большому счету, как язык вообще не отличается.

При этом компании, которая все это запустила, больше с нами нет.

При всей моей безграничной любви, надо наверное признать, что новой или “динамично развивающейся” Java на текущей момент никак не является.

Тут есть одно “НО”. Есть несколько новых языков таких как Scala и Groovy которые выглядят весьма перспективно, базируясь при этом на хорошо проверенной платформе Java.

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

  1. Если ты изучаешь что-то новое, то часто хочется чего-то радикально нового. Фраза “базируется на старой Java-платформе” может отпугивать.
  2. Платформа сама по себе все таки накладывает некоторые ограничения и иногда эти ограничения подрезают крылья фантазии разработчиков нового языка.

.NET

Серьезная платформа от большой компании, созданная с оглядкой на Java и с учетом всех ее недостатков. Создана в 2002 г., относительно ровно развивается, в 2009 г. для .NET появился даже MVC-фреймворк (не прошло и семи лет). Если забыть старые споры между яверами и дотнетчиками, .NET действительно очень хорошая платформа, подходящая для решения широчайшего спектра задач, но последние нововведения выглядят, скажем так, спорно, и к решению задачи упрощения и удешевления создания приложений, например, функциональный язык F# приближает слабо. Даже м. б. немного отдаляет.

PHP

Мегакиллер для веба на все времена, версия 3, собственно, заложившая основы текущего положения дел, вышла в 1998 г. С тех пор разработка для web-а плотно ассоциируется с PHP. Думаю многим яверам и дотнечикам доводилось отвечать на вопрос “О! А почему Java/.Net? Почему не на PHP?”

Безусловно, на PHP можно решать широкий диапазон задач, PHP-сообщество в DataArt последние несколько лет активно развивается. Но назвать платформу новой или “вдохновляющей на новые инженерные идеи”, наверное, все-таки нельзя. Платформа проверенная, надежная, хорошо позволяет решать бизнес задачи, но явно не cutting edge веб-разработки.

JavaScript

На нем пишут почти все. Приложение с унылыми статичными страницами назвать новым не получается никак, любому сайту нужна хотя бы малая доля витамина JS.

Появился во второй половине 90-х. Стандарт де факто. Как почти любой стандарт де факто, обладает множеством недостатков и, скажем так, странностей. Просто как пример:- JavaScript не является объектным языком в привычном нам смысле этого слова. В разных браузерах реализация языка пусть немного, но отличается.

Как написано в одном учебнике по JavaScript, “в ходе изучения языка многие вещи покажутся странными. Не спешите искать скрытый смысл. Многие вещи тут действительно странные”.

C++

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

Но, как это ни парадоксально, именно существование такого сложного языка, как С++, явилось причиной появления Java.

Когда Джеймс Гослинг обосновывал руководству, зачем хочет придумать новый язык, объяснение звучало примерно так: “Нам нужен язык достаточно простой и однозначный, чтобы каждый член команды мог посмотреть на блок кода и сказать, что же здесь, собственно, имелось в виду”.

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

Flex/AIR

Очень перспективная технология создания Rich Internet Applications, а, если вспомнить об Adobe AIR, то и desktop приложений.

Основную проблему Flex отражает вопрос заказчика на мое предложение сделать часть клиента в браузере на Flex: “Мы что, будем рисовать мультики?”

К сожалению, Adobe так и не удалось доказать человечеству, что на ActionScript можно делать не только баннеры, мультики и игры, но и что-то серьезное для бизнеса.

Ruby

Последнее время я стал обращать внимание, что веб-сервисы, которые делают для наших мобильных приложений разработчики из других компаний, все чаще написаны на Ruby. Это действительно достаточно любопытный язык, и платформа Ruby on the Rails делает веб-разработку весьма быстрой. Синтаксис выглядит интересно, все бы ничего, но, если верить википедии, первая версия появилась в 1994 г., последняя ветка кода – в 2007 г. В общем, тоже новичком не выглядит. Также, если верить вики, у Ruby – врожденные проблемы с производительностью. Для веб проектов это как правило не так важно, но в целом применимость языка это может ограничивать.

Как пример критики см. http://wonko.com/post/5_things_i_hate_about_ruby.

Python

Как инструмент для веб разработки отмечен вниманием самого Гугла. Гугл можно любить или не любить, но то, что они понимают толк в разработке веб-сервисов, думаю, неоспоримый факт. С другой стороны, разработка питона была начата в конце 80-х (я в тогда еще в школу ходил, а веба не было вообще). Сугубо личное мнение: мне кажется, что язык в котором control flow выражается отступами, в наше время вызывает стойкое ощущение... м-м-м... винтажности. Если честно, на ум приходит только один аналог – Fortran.

Чего не хватает в этой таблице? Мобильных технологий. Они последние четыре года – очень горячая тема, но в статье про языки программирования я их намеренно не рассматриваю по очень простой причине. Платформа iOS стала столь популярной совершенно точно не благодаря языку ObjectiveC (появившемуся в начале 80-х, к слову говоря). Т. ч. хочу попросить прощения у всех мобильных разработчиков – речи об iOS и Андроиде тут не пойдет (ну, или почти не пойдет). Обе платформы, безусловно, чудо, но чудо, в первую очередь, инженерно-техническое и дизайнерское. На мой взгляд, выдающегося с точки зрения языков программирования и API тут нет, просто хорошая, добротная работа с тем, что уже присутствовало на рынке.

Вроде бы ничего не упустил? Вышеперечисленные технологии все вместе и каждая по отдельности – очень и очень хороши. Но как вы вообще считаете, в 2100 г. люди будут писать программы на них же? Или мы надеемся, что сразу после Питона будет изобретен искусственный разум, который поработит всех людей и проблема новых языков отпадет сама собой как неактуальная? Если отбросить в сторону научно-фантастические сюжеты, между сейчас и 2100 г. таки должен появиться хотя бы один, а, м. б., чем черт не шутит, и целых два новых языка программирования.

Есть ли какие-то причины, почему тот новый, замечательный язык не может появиться сегодня? Почему бы и нет? Где он может появиться? Я имею ввиду не точку на карте и не компанию, а область применения. Наверное, в области которая бурно развивается в последнее время. Что тут приходит на ум

  1. iOS – на мой взгляд, ObjectiveC – не самый лучший в мире язык. И не самый современный. Может быть, у Apple что-то шевельнется в душе, и они придумают здесь что-то новое
  2. Andriod – Java-машина в качестве горячего сердца, бьющегося в груди каждого андроидофона, безусловно, чудо как хороша. Но у нее есть ряд проблем:
    1. Она принадлежит “Ораклу”, и это изрядно добавляет головной боли Гуглу. Хуже того, ближайшая альтернатива, .NET, принадлежит Microsoft, у которого есть своя мобильная платформа.
    2. Видимо, надо признать, что Java такая, какая она есть сейчас, и другой на мобильниках она уже, видимо, и не станет. Напомню: сейчас все программы для Andriod пишутся на Java language level 5 образца 2004 г. Т.е. на языке, ни байт не изменившемся за последние восемь лет...
    3. В общем, у Гугла есть существенный материальный стимул сделать что-то по этому поводу.
  3. Web – не уверен, что все обратили на это внимание, но за последние 3-4 года произошло достаточно интересное событие - перезапуск web-приложений. Выглядит это так: AJAX и DHTML основательно окопались на занятых позициях, вытеснив Flash, Silverlight и даже Java applets. Добавилось много интересных вещей, CSS3, HTML5, но в основе всего все так же лежит все тот же язык JavaScript, придуманный, по признанию его создателя, за 10 дней. На нем пишутся десятки тысяч строк кода, при том, что изначально его создатели думали, может быть, максимум о нескольких сотнях строк “для склейки ресурсов”.

На мобильных платформах сейчас идет гонка железа, и, пока она не закончится, нового языка тут видимо ожидать не приходится. А вот web, кажется, как раз созрел для перемен. И они, эти перемены, стучатся в дверь, зовут их, например, так:

  • CofeeScript.
  • JavaScript 2.
  • Go.
  • Dart.

О последнем я как раз хотел рассказать подробнее.

Dart был впервые анонсирован 12 сентября 2011 г., а первая версия, которую можно было “потрогать”, появилась 18 ноября 2011.

Задачи, поставленные перед разработчиками языка:

  • Создать структурированный и в то же время гибкий язык для веб-программирования.
  • Сделать язык похожим на существующие для упрощения обучения.
  • Высокая производительность получаемых программ и в браузерах, и в иных окружениях, от смартфонов до серверов.

В результате появился язык достаточно легкий в освоении для любого, кто знает Java или C#. На Dart можно писать, например, так

  	main() {  	  var number   = 42;  	  var text     = "The value of number is";  	  print("$text $number.");  	}  

Или так

  	bool isOdd(num i) => i % 2 == 1;  	List ages = [1,4,5,7,10,14,21];  	List oddAges = ages.filter(isOdd);  

Что еще есть вкусного?

Вкусного много, более подробно можно прочитать например здесь http://dl.dropbox.com/u/5396691/What_is_Dart_.pdf

С одной стороны язык, выглядит знакомо и не надо напрягаться, чтобы понять, что тут делается, с другой – мы видим много полезных вещей, которых, например, в Java не было и, м. б., не будет никогда.

Разработчикам удалось привлечь на свою сторону Джошуа Блоха, который работает над core-библиотеками и уже начал писать свои знаменитые puzzles.

Сугубо субъективно мне Dart нравится. Объясню, почему:

  1. Создатели руководствовались очень конкретными, прагматичными соображениями. Под каждой из целей создания я готов лично подписаться.
  2. Язык действительно выглядит лаконичным и решает ряд неудобств и проблем, которые были, например, в Java.
  3. Он действительно простой и понятный. Код легко читается. Действует принцип: “как, кажется, должно работать, так оно и работает.”
  4. Он достаточно мощный, и вместе с тем его можно скомпилировать и эффективно и быстро выполнять.
  5. То, что Джошуа Блох начал писать puzzles, и, очевидно, обсуждать их с командой разработчиков до выхода финальной версии language spec, дает надежду, что странных и неочевидно читаемых мест будет не много.

В общем, м. б., из этого что-то получится, м. б., нет. Но, в любом случае, посмотреть на Dart стоит – хотя бы просто для общего развития и лучшего понимания проблем современных web-платформ. Если с момента, когда вы изучали новый язык программирования, прошло более трех лет, Dart – хорошая возможность расширить кругозор.

С анонсом Dart связана одна достаточно поучительная история, краткое резюме которой вынесено в заголовок статьи.

Гугл с релизом первой, пробной версии Dart, по-видимому, совершил ошибку, которую очень хорошо описал Михаил Завилейский фразой: “Дуракам полработы не показывают”. Рассказываю по порядку.

  • Гугл придумал язык, который потенциально, по задумке Гугла, д. б. заменить JavaScript и нативно исполняться в браузере. На мой взгляд задумка хорошая и имеет реальные шансы выстрелить. Ну, в самом деле, 95-процентное владычество JavaScript для динамики веб-страниц в браузерах последнее время – явный перебор. Фактически для браузера как для программной платформы сейчас нет альтернатив в выборе языка программирования.
  • При создании языка, как водится, инженеры уделяли внимание многим вещам: удобству, лаконичности, гибкости, понятности. В общем, думали в первую очередь над языком, что для ранней стадии, когда еще даже спецификация пока не устаканилась, выглядит логично.
  • Первый рабочий вариант выложили в сеть, снабдив каким-то компилятором в JavaScript. Ну, просто чтобы хоть как-то можно было выполнить код. При этом в момент анонса было недвусмысленно сказано, что компилятор потом будет сильно лучше, а еще через какое-то время добавится нативная поддержка Dart в браузерах (как минимум в Chrome, а там думаю и плагины для FireFox и IE появятся).

Сразу после первого анонса народ бросился играть с новой игрушкой, и буквально в тот же день кто-то очень дотошный, посмотрев на размер JavaScript, сгенерированного для HelloWorld-программы, ужаснулся и запустил гулять по просторам интернета очередной мем https://gist.github.com/1277224 (если коротко – там HelloWorld компилируется в 17 тысяч строк кода за счет того, что тащит за собой кучу библиотек, совсем как Delphi в старые добрые времена).

После этого попытка сколько-нибудь широкого обсуждения нового языка сводится к следующему диалогу:

– Посмотрите, какой новый, интересный язык придумал Гугл.

– И не подумаю, я слышал, что https://gist.github.com/1277224, и мне этого достаточно.

Буквально в течении 2-3 месяцев инженеры Google выпустили специальный компилятор frog который генерирует очень компактный код, по выражению одного из блоггеров “примерно там я бы и сам написал”. Т.е. простая программка из 5-10 строк компилируется примерно в те же 5-10 строк. Но об этом широкие массы общественности уже не узнали ибо в голове четко запечатлелось Dart = https://gist.github.com/1277224

История эта более чем поучительна для нас с двух точек зрения:

Во-первых, полработы действительно не надо показывать дураку. И, к сожалению, надо признать, что современное web development community и есть такой обобщенный “дурак”. Немного грустно, но факт есть факт. Если у вас есть какие-то сомнения – попробуйте почитать комментарии к статье http://habrahabr.ru/post/130064/. При этом наивно думать, что это такая строго специальная хабропублика, существующая в параллельном мире, и в реальной жизни мы с ней не сталкиваемся. Увы, желание поднять свой авторитет за счет высмеивания кого-то большого у нас в крови:

- Не знаю, что все носятся с этим Карузо, по-моему, дутая величина.

- О! Вы были на концерте самого Маэстро!

- Да нет, мне вчера Иванов по телефону напел – ни слуха, ни голоса.

“Во-вторых” плавно вытекает из “во-первых”. Если вы кого-то критикуете, прежде чем сказать, всегда старайтесь понять, а чью мысль вы хотите высказать? Свою или чужую? Ничего плохого в высказывании чужих мыслей нет, но только если вы хорошо понимаете, о чем говорите. Не стоит уподобляться сетевым хомячкам.

Выводы. Статью я, пожалуй, закончу достаточно традиционными для себя выводами:

  1. В мире вокруг много интересного.
  2. Кто не меняется, тот умер.
  3. Будьте осторожны, используйте голову. 100.000 плохих людей хотят, чтобы вы головой не пользовались, а повторяли то, что они скажут – давайте их всех обманем.