среда, 21 июля 2010 г.

Лисп в промышленной разработке

Месяц с копейками на новой работе, уже можно делать кое-какие выводы по поводу применимости Коммон Лиспа в реальном деле.

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

Какие моменты хорошо заметны:
  • Код у людей пишется очень быстро.
  • Ошибок, связанных с динамической типизаций, практически не встречается. Даже если код пишет новичёк, то 99% производимых им косяков имеют алгоритмический характер, либо неправильное использование синтаксиса (!). Декларация типов при этом не используется совсем.
  • На предупреждения компилятора (warnings) мало, кто смотрит. Если компилятор не встал колом, то код считается рабочим и спокойно коммитится в репозиторий. В итоге, warning'и растут, как на дрожжах, и в вагоне шелухи не видно критических предупреждений, которые, по-идее, могли бы быть и show stopper'ами. Автоматическая посткоммитная сборка и посылка diff'а лога автору коммита не особо помогает. Правда, у нас уровень предупреждений повышенный стоит... Но факт есть факт: на warning'и никто не смотрит.
  • Предупреждения компилятора народу бывают сложными для понимания. Т.е. спрашиваешь человека, почему он не исправит эту фигню, а он отвечает, что не понимает смысл предупреждения. Это от того, что человек с концепцией языка не знаком, а прошлый опыт с вариациями C/C++ объяснить суть ошибки не может.
  • Настоящий фортрановский программист напишет фортрановскую программу на любом языке. Железячники пишут на Лиспе, как на VHDL или C. Студенты с академическим C++/Java бэкграундом пишут всё на классах. Только лисперы пишут на Лиспе, как на Лиспе. В итоге, встречаются вырвиглазные конструкции, вытащенные явно из железячной логики, или, там, множество вложенных хэш-таблиц с мильёном объектов на каждый чих, которые разбирать даже с помощью инспектора неудобно. А ведь можно было построить список, который очень просто рекурсивно обходится и паттерн-матчится... Но всё это говорит только о том, что порог вхождения в Лисп очень низкий, и писать на нём работающий код может человек с опытом программирования на любом языке.
  • Лисповый код очень просто рефакторится. Есть у нас большой человек с огромным опытом, и он, в числе прочего, причёсывает дизайн системы. Улучшения колоссальных размеров укладываются в очень мало изменённого кода (DSL на DSL'е :).
  • Люди без лиспового опыта предпочитают IDE Лиспворкса. Религиозные фанатики пишут в Емаксе (хотя Slime Лиспворкс не в полной мере поддерживает). Возможно, именно благодаря привычно выглядящему окружению (кнопки, тулбары, гуи) и мощному отладчику, даже начинающие пишут, пусть некрасивый, неканоничный, но рабочий код.
  • Люди с богатым опытом opensource-разработки и для проприетарных продуктов пишут хороший код. Одно удовольствие такой код читать.
В целом, ощущения полной неприменимости или какой-то значительной проблемности при использовании Лиспа нет. Даже при синтезе железа (привет, thesz!). Даже в такой критичной к ошибкам области, как биржи, где каждая миллисекунда простоя стоит денег ;)

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

    1. оч круто!

      что за контора, нужны ли сотрудники, сколько плотют?

      ОтветитьУдалить
    2. Одно удовольствие читать подобные вещи.

      ОтветитьУдалить
    3. Я правильно понял что ваша контора делает серверный софт для рынков?

      Тогда боюсь что это подтверждает мои наблюдения что пишет его сборише отморозков. А мы потом с клиентской стороны глюки отлавливаем.

      ОтветитьУдалить
    4. > Я правильно понял что ваша контора делает серверный софт для рынков?

      Нет.

      ОтветитьУдалить
    5. Класс! Побольше бы таких статей и дел - и мир определённо станет лучше! :)

      ОтветитьУдалить
    6. >Только лисперы пишут на Лиспе, как на Лиспе

      Всегда хотел узнать, как оно выглядит. Это когда из всего объема кода реального - 2% на неком DSL, а все остальные 98% - собственно реализация этого DSL на макросах? :)

      Я с Smalltalk/С++-вым бэкграундом тоже писал свою единственную CL-поделку на классах, частенько применяя смолтоковые идиомы (Method Class, например), и [пока] не вижу в этом ничего зазорного.

      ОтветитьУдалить
    7. Повышают на два порядка по сравнению с чем? С множественно-ориентированными БД или KDB+? "Ускорители БД" мне известны, а вы, значит, более биржеспецифичны? Очень интересно было бы услышать о ваших подходах к обработке бирж :-)

      ОтветитьУдалить
    8. > Повышают на два порядка по сравнению с чем?

      По сравнению с чисто софтовыми решениями цикла "принять сообщение, декодировать, учесть изменения, выполнить кое-какую логику, принять решение и, возможно, сделать заказ".

      Мне ещё надо разобраться в том, о чём я могу спокойно писать в блоге, а что попадает под NDA...

      ОтветитьУдалить
    9. > Всегда хотел узнать, как оно выглядит. Это когда из всего объема кода реального - 2% на неком DSL, а все остальные 98% - собственно реализация этого DSL на макросах? :)

      Это, например, когда для используемой локальной переменной делают let, а не setf. Или знают, что всё в лиспе - суть объекты, которые, например, можно спокойненько из функции возвращать, а не городить огород с return & co. И многое другое ;)

      ОтветитьУдалить
    10. > По сравнению с чисто софтовыми решениями цикла "принять сообщение, декодировать, учесть изменения, выполнить кое-какую логику, принять решение и, возможно, сделать заказ".

      Просто (AFAIK) часто в процессе принятия таких решений необходима помощь каких-то БД, а я почему-то подумал что "обработка финансовой информации" именно к ним относится.

      ОтветитьУдалить
    11. > Это, например, когда для используемой локальной переменной делают let, а не setf. Или знают, что всё в лиспе - суть объекты, которые, например, можно спокойненько из функции возвращать, а не городить огород с return & co. И многое другое ;)

      То есть писать в функциональном стиле или близком к нему? :)

      ОтветитьУдалить
    12. Очень интересно. Особенно подробнее хотелось бы узнать про рефакторинг. Как именно достигается малое изменение? И тому подобное.

      ОтветитьУдалить
    13. Малые изменения достигаются написанием DSL'я, заменяющим портянку кода на микропрограмму, состоящую из нескольких терминов этого DSL.

      ОтветитьУдалить
    14. > То есть писать в функциональном стиле или близком к нему? :)

      В принципе, да, это основное :)

      ОтветитьУдалить
    15. > Но факт есть факт: на warning'и никто не смотрит.

      Вот этот момент я не понял. Возможно, в LW по-другому, но sbcl варнингами отмечает действительно косяки: вызов неизвестной функции, обращение к неизвестной переменной там, явные конфликты выведенных типов (Asserted type ~ conflicts with derived type ~) и так далее.

      Практически в 90% случаев warning надо обязательно править, иначе программа неминуемо свалится в рантайме.

      ОтветитьУдалить
    16. Это смотря какую политику поставить. Можно ведь и такую, что компилятор будет ругаться на неиспользованые аргументы функции или зря объявленные переменные.

      ОтветитьУдалить
    17. > Это смотря какую политику поставить.
      > Можно ведь и такую, что компилятор будет ругаться на неиспользованые аргументы функции или зря объявленные переменные.

      Не нельзя :) Неиспользуемые переменные -- это STYLE-WARNING. Их действительно, в большинстве случаев можно игнорировать (хотя я предпочитаю исправлять).

      ОтветитьУдалить
    18. Поддерживаю swizard. Я считаю warning признаком проблемы и отношусь к ним болезненно. И неприятно, когда из чужих либ они настырно лезут...

      ОтветитьУдалить
    19. Блин, ну никто ж не говорит, что warning - это хорошо! :)

      ОтветитьУдалить
    20. >> Только лисперы пишут на Лиспе, как на Лиспе

      > Всегда хотел узнать, как оно выглядит.

      Полагаю, это когда программа в любом месте и на любой глубине абстракции написана в терминах данной конкретной предметной области. ^_^

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

    Архив блога