среда, 29 февраля 2012 г.

На чем писать Ынтерпрайз проекты?

Немного грубого троллинга на утро :)

Давайте представим, что мы с вами собираемся начать крупный и серьезный Ынтерпрайз проект. И перед нами встает вопрос выбора основного языка (понятно, если у нас есть rich client нам понадобится Javascript / Flash в том или ином виде, для БД нам почти наверняка понадобится SQL, вероятнее всего с его процедурными расширениями и т.д.,  но речь об основном языке).

Википедия подсказывает, что языков программирования нынче развелось много - тысячи их. Но что можно использовать?

  • Прежде всего, отбросим unmanaged языки. Писать Ынтерпрайз софт в 2012 году на С или С++, возиться с указателями и ручным управлением памятью, закрашивать свежую седину после очередного хитрого бага вызванного разничной реализации того или иного поведения в разных версиях компилятора или чем-то подобным... Не тянет.  Будь это обособленная железка типа игровой консоли или PC для игр, будь это системные утилиты или что-то подобное, где совершенно критично выжать 99% возможного из доступной аппаратной конфигурации - да, один этот аргумент перевесил бы все остальные. Но в Ынтепрайз проекте я выжму 85%, а потом подбавлю серверов в кластер. Седобородые археологи и геронтофилы, прощу прощения, с глубоким уважением к вам... на выход.
  • Далее, отбросим динамические языки, такие, как Python, Ruby и им подобные. Даже не принимая во внимание скорость их выполнения (будем считать, что зрелые современные динамические языки имеют в той или иной степени развитый JIT), писать на них крупные проекты затруднительно именно из-за их динамической природы. Поддержка со стороны IDE (рефакторинги, статический анализ и миллион мелочей, из-за которых мы выбираем IndelliJ IDEA, а не windows notepad) существенно хуже, чем для языков с простой статической системой типов и простой строгой объектной моделью. Ряд вещей, концептуально крутых, может совершенно убивать саму возможность нормальной поддержки языка со стороны IDE - например, метаобъектный протокол. За исключением Kotlin (на F# близко не смотрел, возможно, там есть?), пока что я не видел, например, комбинаций языков и сред разработки, в которых поддерживалась бы полноценно умное автодополнение, подсветка и прочее внутри функциональных литералов (лямбда функций) в коде. В результате, там, где в языке с простой статической типизацией ошибки находятся фоновым процессом компиляции в IDE, в динамических языках надо писать unit test. Только не говорите мне, что писать их все равно нужно всегда и везде :) Сторонники динамических языков, аджайла, meet-up-ов.. Вы умные и часто прикольные, но сегодня не ваша ночь.
  • Отбросим C#, F# и группу языков, имеющих основные реализации на платформе .NET. Я не слишком верю в Mono и то, что это полноценный эквивалент для Microfost .NET под Windows, а идея писать Ынтепрайз софт, работающий только под Windows, мне представляется странной. Дотнетчики, я сам считаю эту платформу очень мощной, а C# - развивающимся, вполне продуманным, современным и мощным языком, но..увы-увы. До лучших дней.
  • Отбросим академические функциональные языки, языки, используемые для обкатки разных концепций в теории систем типов и новых парадигм, языки, используемые редкими исследователями-энтузиастами в университетах, языки, по которым нереально найти в проект 20 человек за сколько-нибудь разумное время. Отбросим с затаенным сожалением. Отбросим Haskell, OCaml, Erlang, Lisp...Покойся с миром, славный МакКарти, твои труды не забыты и еще сослужат добрую службу.. но не нам и не сегодня :(.
  • Отбросим языки, на которые просто писать нормальный поддерживаемый и понятный код нормальному человеку трудно. Перловики, просто бесшумно спрячьтесь под стулья.
И что остается? Правильно, Java.

BO-OO-O-OO-O-R-I-I-I-NG!!!

И вот именно поэтому, принимая решения о том, какой язык использовать в подсистеме крупного проекта, я посматриваю на языки на платформе JVM.
  • Groovy, который мы уже используем, и, надеюсь, будем использовать все больше и больше. 
  • Scala, ты загадочна, очаровательна и сложновата...Но в некоторых случаях пойдет. Ты все-же, приятнее Haskell-a :)
  • Closure? Lisp, я знаю, ты бессмертен, посмотрим, получится ли у этого твоего потомка взлететь.
  • Kotlin? Андрей Бреслав и прочие, ребята, вы делаете язык, который пофиксит две критические проблемы Groovy - более динамическая, чем статическая типизация типизация и, частично как следствие этого, плохая поддержка со стороны IDE. Получится у вас - повешу вашу фотку над рабочим столом.
  • Есть еще немало славных языков в этом семействе - Ceylon, Fantom и прочие. Каждый из них нелеп и крив  по своему, но у каждого есть какая-то изюминка.
Вот на них я и гляжу с некоторой надеждой :)