суббота, 30 июля 2011 г.

Типы задач, с которыми Lisp справляется лучше других языков

На днях решил потроллить обсудить на #lisp@irc.freenode.net тему применимости Lisp на практике. Поскольку у меня есть некоторый опыт разработки на лиспе, а также несколько законченных хобби-проектов, разговор получился интересный. Ниже -- мои впечатления и выводы.
Во-первых, самое любопытное, что я для себя обнаружил: лисперы довольно болезненно относятся к вопросам, вроде что мощнее: Lisp или Java+J2EE (от бана меня спасло только заверение, что люблю лисп и терпеть не могу жаву). Что как бы намекает на сами понимаете что: J2EE на своей "территории" -- абсолютный чемпион, и лисп там не конкурент.
Во-вторых, на лиспе пишут во многом из-за тех положительных впечатлений, которые получает программист от использования лиспа. Если конкретнее, все, кто попробовал Lisp, Slime, Emacs и прочие вкусности, на других языках программируют с отвращением.
В-третьих, присутствовашие тогда высказались, что если хочешь разработать "просто еще одно веб-приложение" или что-то в этом роде -- то лучше использовать готовые фреймворки вроде J2EE, .Net или Ruby on Rails, т.к. тогда быстрее получишь готовое приложение.
В принципе, согласен. Для того, чтобы разработать довольно простой блог на Clojure (http://clojure-blog.herokuapp.com) от меня потребовались значительные усилия. И это на Clojure, где есть доступ ко всему набору java-библиотек! А ведь у scheme или CL с библиотеками гораздо хуже! Приложение такого размера на Ruby on Rails я написал бы за полчаса, на J2EE -- чуть дольше. И, честно говоря, я думаю, будь приложение побольше, то разница в количестве усилий на J2EE и Clojure была бы еще заметней.

Так есть ли вообще задачи, с которыми Lisp справляется лучше других языков? По общему мнению оказалось, такие задачи есть. И это самые лучшие и самые интересные задачи! Они:
1) не до конца формализованы, нечетко поставлены; конечный результат, возможно, еще не ясен и станет понятен только в процессе разработки приложения;
2) у задачи нет типового решения или типовых компонентов для ее решения;
3) задача носит инновационный или даже исследовательский характер.

Действительно, когда Пол Грэм делал свой ViaWeb пятнадцать лет тому назад, разве было что-то хоть отдаленно похожее на J2EE6 или Ruby on Rails? Существовавшие способы разработки веб-приложений были примитивны; многое делалось вручную; типовых компонентов было очень мало, и они не обладали достаточным функционалом. Разве есть готовые алгоритмы/компоненты/способы для предсказания задержек самолетов, на чем так преуспел Flightcaster? (http://flightcaster.com/). Впрочем, продолжать можно долго, но желающие могут убедиться сами: проекты, в которых задействован лисп, носят, как правило, инновационный характер. Это далеко не то же самое, что быстро сделать еще один интернет-магазин или блоговый движок.
http://dev.clojure.org/display/community/Clojure+Success+Stories
http://www.lispworks.com/success-stories/
http://www.franz.com/success/

Надо сказать, что и мой опыт (пусть и небольшой, пока) говорит, что чем более задача непонятна, тем удобнее для ее решения использовать лисп. А как только задача становится еще и немного исследовательской, то тут вообще лучше отказаться от Java или даже Python, не говоря уже о C/C++. Лисп удобен, во-первых, из-за классной технологии Slime+Emacs, позволяющей на лету экспериментировать с работающим приложением. Достаточно что-то проверить в Slime, и уже не нужно пересобирать приложение, перезапускать REPL, писать тесты или даже лезть в дебагер.
Выразительность лиспа позволяет производить существенные архитектурные изменения за считанные минуты, не боясь нарушить всю логику приложения. Возможность строить очень высокоуровневые абстрации метапрограммированием позволяет получить исходник без повторяющихся фрагментов, а значит -- значительно снизить цену внесения изменений.

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

11 комментариев:

  1. На самом деле, для индивидуального разработчика, одинаково хорошо знающего обе платформы, (Common) Lisp лучше J2EE. И, кстати, отсутствие библиотек — это миф (http://www.quicklisp.org/beta/releases.html - тут достаточно всего для старта). Другой вопрос, что для команды Java (или же C, Python,...) — это определенный общий знаменатель: как сказал один мой знакомый, "все плюются на Java, но все на ней пишут, поскольку все знают". Lisp для многих неприемлим по культурным соображениям, для большинства же — из лени учить что-то новое.

    (Пишу сейчас на Java+Clojure. Тем не менее, если буду начинать практически любой проект сам, использую CL).

    ОтветитьУдалить
  2. Круг приложений, который можно написать на CL с использованием библиотек из репозитория quicklisp-а значительно меньше, чем можно сделать, например с тем же J2EE. Веб -- самый показательный пример. Да, кое-как можно сделать сайт и на лиспе. Но он будет хромой, немасштабируемый и не особо функциональный. Причина все та же: отстутвие достаточного количества библиотек.

    ОтветитьУдалить
  3. > Да, кое-как можно сделать сайт и на лиспе.

    Почему кое-как?

    > Но он будет хромой, немасштабируемый и не особо
    > функциональный.

    Это ещё почему?

    ОтветитьУдалить
  4. >> Да, кое-как можно сделать сайт и на лиспе.
    > Почему кое-как?

    Потому что отсутствие большого количества готовых компонентов значительно усложняет разработку сайта. Например, я могу взять те же JSF и PrimeFaces и быстро сделать страничку с красивыми, функциональными и хорошо оттестированными компонентами. То же самое на лиспе, даже с привлечением JQueryUI или других библиотек компонентов, потребует больших усилий. Я уже не говорю о более современных технологиях, таких как Server Push или GWT: сколько потребуется времени, чтобы реализовать такое на лиспе? Существенно больше. А поскольку лисперы обычно одиночки, то врядли у них есть время, чтобы реализовывать что-то подобное на те же PrimeFaces да еще и с таким же качеством.

    >> Но он будет хромой, немасштабируемый и не особо
    >> функциональный.
    >Это ещё почему?

    А как Hunchentoot относится к большой нагрузке?

    ОтветитьУдалить
  5. > JSF, PrimeFaces, GWT

    Мнение о целесообразности использования данных технологий очень сильно зависит от подхода к веб-разработке, та же JSF это просто устаревший динозавр, а GWT по крайней мере весьма спорна.

    > А как Hunchentoot относится к большой нагрузке?

    Намного лучше, чем решения на PHP/Python/Perl/Ruby. Высокая производительность для веб-приложений это как бы отдельная песня, но поскольку PHP (или даже Ruby) может быть использован для высоконагруженных сайтов, то CL тем более.

    ОтветитьУдалить
  6. >А как Hunchentoot относится к большой нагрузке?
    Да, давайте сравним с Рельсами 8)

    ОтветитьУдалить
  7. >>А как Hunchentoot относится к большой нагрузке?
    >Да, давайте сравним с Рельсами 8)

    А не за чем с ними сравнивать. Приложения, которые делают на рельсах, редко попадают в нишу Enterprise.
    Enterprise -- это, как правило, J2EE или .Not. Причина как раз во все той же масштабируемости, стабильности, секьюрности и возможности интегрироваться с существующей инфраструктурой заказчика. Сколько, например, уйдет времени на реализацию логина через ActiveDirectory? Если нет готовой библиотеки, то ты просто бросишь это дело, даже не начав. Между тем, интеграция с такими сервисами на J2EE или .Not -- повседневная рутинная задача.

    >> JSF, PrimeFaces, GWT
    >Мнение о целесообразности использования данных технологий очень сильно зависит от подхода к веб-разработке, та же JSF это просто устаревший динозавр, а GWT по крайней мере весьма спорна.

    JSF 2.0 -- далеко не такой уж и динозавр. Что до целесообразности использования, то повторяю опять. Чтобы реализовать приложение с нормальным юзабилити на J2EE я просто беру библиотеку, например, PrimeFaces. На лиспе -- эту библиотеку надо написать. Аккуратно подогнать все CSS и нарисовать красивые изображения. Извлечь общую функциональность. Протестировать.
    И это придется делать, если приложение превышает уровень сайта-визитки или небольшого бизнес-приложения вроде тех, что делают на 37signals.com. Между прочим, кроме интернет-магазинов или блоговых движков, существует масса более сложных и интересных задач. Например, посмотрите какие решения есть для автоматизации документооборота:
    MS Sharepoint, Alfresco, Filenet P8. Это все приложения, которые невероятно сложно реализовать на языках вроде lisp, ruby, python, php. Но приложения на этих монстрозных системах документооборота стоят десятки, если не сотни тысяч долларов. А сайты на php -- ... ну сами знаете. Во много раз меньше.

    ОтветитьУдалить
  8. > Сколько, например, уйдет времени на реализацию
    > логина через ActiveDirectory?

    mod_auth_kerb

    > Если нет готовой библиотеки, то ты просто
    > бросишь это дело, даже не начав.

    Да, никак не допишу реализацию на CL без использования Apache, но просто мне это не очень нужно (использую mod_auth_kerb) и никак не доведу до рабочего состояния (вспоминаю об это иногда). Там на самом деле работы по хорошему на пару дней.

    > MS Sharepoint

    Исключительно дерьмовый продукт, ага. Я не вижу в чём сложность его реализации на описанных языках. С другими системами не знаком. Но тем не менее сложность мне не понятна.

    > А сайты на php -- ... ну сами знаете

    Знаем, милиарды же (facebook). Большинство высоконагруженных сайтов написанное именно на PHP. И это просто свидетельствует что для веб-разработки все технологии по своим возможностям равны.

    > Чтобы реализовать приложение с нормальным
    > юзабилити на J2EE я просто беру библиотеку,
    > например, PrimeFaces.

    А когда там нет необходимого компонента? Если нужно типа такого: http://www.youtube.com/watch?v=f6b0sQpDGVM? Вообще для той же JQuery есть сейчас масса компонентов, так что я не вижу здесь каких-то особых проблем, не зависимо от языка.

    ОтветитьУдалить
  9. >Да, никак не допишу реализацию на CL без использования Apache, но просто мне это не очень нужно (использую mod_auth_kerb) и никак не доведу до рабочего состояния (вспоминаю об это иногда). Там на самом деле работы по хорошему на пару дней.

    В этом-то и проблема. Когда такой функциональности "на пару дней" набирается много, то проект значительно дорожает. Конечно же дело не в одном только AD. Но по факту получается, что тебе нужно реализовывать самостоятельно, а мне -- подключить готовое решение. Кто справится быстрее?

    ОтветитьУдалить
  10. > Кто справится быстрее?

    Не, ну я же делают это чиcто для fun, ибо просто заюзал mod_auth_kerb, которая обеспечивает "прозрачную авторизацию", как у людей.

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

    ОтветитьУдалить
  11. > Не, ну я же делают это чиcто для fun

    Как я уже и говорил, я очень уважаю то, что ты делаешь. Именно благодаря таким как ты, lisp жив и развивается. Just do it! :-)

    ОтветитьУдалить