metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-02-28 08:14 am

функциональщина-срач

http://it-talk.org/post76648.html#p76648
Лень там регистрироваться и сраться некогда, все равно ничего нового там не скажут.

А насчет использования функциональных языков: лично у меня в хаскеле основной проблемой было отсутствие либ для интеграции с внешним миром (или наличие, например, на hackage 100500 вариантов для одной и той же цели, ну вот когда с этим разбираться?).
С Clojure все оказалось на порядки проще - там даже ORM не то, чтобы нужен - clojure.java.jdbc работает со свистом с жабским провайдером Firebird.

Мне, собственно говоря, от языка для серверной опердени требовалось следующее:
0) Немногословность. Т.е. чтобы было по крайней мере сравнимо с изготовлением того же на SQL/хранимых процедурах. Сразу языки вроде C# и Java отпадают - "многословные".
1) Наличие нормальных либ доступа к Firebird - есть Jaybird. Кривоват в плане обработки ошибок и кидаемых исключений - но все работает.
2) Наличие нормального низкоуровневого веб-сервера или фреймворка. Т.е. никаких страниц, скаффолдингов, генерации целых сайтов - только хендлеры "запрос-ответ" привязанные к роутам. compojure+ring - идеально. А, и чтобы сервер запускался отдельным приложением, без интеграции в IIS/Apache/чорта лысого.
3) Наличие нормального типа для денег. Чтобы для суммирования не нужно было кастить вдоль и поперек. BigDecimal, 100500.0M
4) Наличие нормальных типов для даты и времени. org.joda.time + clj-time
5) Чтобы при баге в либе я мог ее пофиксить или как минимум найти, не сломав себе глаза.
6) Наличие единообразного, общепринятого подхода. В хаскеле с этим, простите, пиздец. Кто в лес, кто по дрова - у кого вычисления на типах, у кого template haskell, кто-то кидает исключения, кто-то ErrorT, кто пихает IO во все поля, у кого-то это вынесено в параметры.

Из вариантов рассматривались: C#/Java/F#/Haskell/Python. А сделано все в итоге было на clojure. Наименее многословный, либы устроены ПРОСТО, удобно работать с БД, метапрограммирование, можно использовать всю жабью инфраструктуру.

C# - много мусорного синтаксиса, привязан строго к виндам. В mono я не верю. Адова интеграция в винды, GAC, бесит.

Java - проще оказалось посмотреть, как ее использует [livejournal.com profile] artureg, разобраться сначала с инфраструктурой, а потом использовать из clojure. Потому как сам язык еще более отсталый чем C#. Зато инсталлируется в лоб.

F# - всем хорош, но ждать 3 версии, пока допилят type providers, некогда. И, внезапно(!), для моих задач в нем функции постоянно разрастались в количестве параметров, вплоть до нечитабельности. Вывод типов в нем не очень, много где нужно аннотировать, иначе не работают конструкции вида s.Trim() - он просто не может догадаться, что s это строка. Но тем не менее - используется сейчас в двух мелких проектах и еще в одном не сильно мелком внутреннем, для кодогенерации.

Haskell - нет либ доступа к FB, бардак ада на Hackage, кровавый матан в либах.

Python - сделал один проект на нем, но как следует не осилил.

Опять же - синтаксис "с отступами" по итогам - не совсем удобная вещь, т.к. код приходится располагать так как удобно компилятору, причем иногда бывают невнятные эффекты с этим (сталкивался в F# и хаскеле).

Clojure рассматривалась как единственный вариант с внятным метапрограммированием для совсем другого проекта, в прошлом году. Сделал несколько тестов, проверил что все работает с FB, проверил на предмет производительности и забросил. А сейчас, когда понадобилась срочная доработка опердени, причем с совсем дурной логикой, которую иначе как на декларативных языках описывать сложно - достал из загашника, случайно нашел веб-фреймворк под это дело, за 15 минут (не зная языка!) добился "веб-сервер выполняет запрос к БД и отвечает json-ом на клиент" и пошел пилить на нем со страшной скоростью.

[identity profile] theiced.livejournal.com 2012-02-28 05:27 am (UTC)(link)
ша придут дурачки и объяснят тебе что ты ничего не понимаешь. надо было сначала сходить в лучший супермаркет маськвы и потом сразу написать всё на хаскеле. а если у тебя задачи сложнее чем генерация бесконечного списка простых чисел, то ты сам дурак.

[identity profile] metaclass.livejournal.com 2012-02-28 06:05 am (UTC)(link)
Так если бы было время и было бы нехуй делать - я бы написал для хаскеля собственных либ, но это пиздец от входа.

[identity profile] acerv.livejournal.com 2012-02-28 06:15 am (UTC)(link)
Какую IDE юзал? как вообще с помогалками\юзабельностью?

[identity profile] conwor.livejournal.com 2012-02-28 06:23 am (UTC)(link)
Scala?

[identity profile] metaclass.livejournal.com 2012-02-28 06:26 am (UTC)(link)
Никакой.
Far для редактирования, leiningen для зависимостей-сборки-запуска-repl (и то - разобрался как запускать руками и наделал батников для этих целей)

[livejournal.com profile] artureg использует Idea, [livejournal.com profile] theiced утверждает что надо emacs+slime+swank, но мне лень их настраивать)

[identity profile] metaclass.livejournal.com 2012-02-28 06:26 am (UTC)(link)
Не пробовал, не дошли руки.

[identity profile] kurilka.livejournal.com 2012-02-28 06:36 am (UTC)(link)
Ну вот https://github.com/bos , к примеру, так и делает

[identity profile] acerv.livejournal.com 2012-02-28 06:41 am (UTC)(link)
Ну и в итоге, как все задеплоено? Копия на удаленный хост, жмак по экзешнику?

[identity profile] metaclass.livejournal.com 2012-02-28 06:54 am (UTC)(link)
Я ему даже баг в аттопарсеке отрепортить толком не могу, по причине того, что у меня на репорт одного бага в одной либе хаскеля уйдет больше времени, чем сделать целиком ядро опердени на clojure.

[identity profile] blackyblack.livejournal.com 2012-02-28 06:55 am (UTC)(link)
Ещё эрланк по многим пунктам подходит. Но советовать не буду, потому что деплоить сложновато и с датой/временем думать надо.

[identity profile] c-a-s-u-s.livejournal.com 2012-02-28 06:55 am (UTC)(link)
Хм, критерий - специалистов на этом языке можно в случае чаго найти на рынке труда, не рассматривался вообще?

[identity profile] metaclass.livejournal.com 2012-02-28 06:58 am (UTC)(link)
Кидаю туда исходники (вообще по фтп, если бы не полная огороженность - то меркуриалом бы делал), там собираю (del /s /q classes ; lein compile) в тестовом варианте, проверяю работу с продакшен-базой, затем копирую classes в рабочую папку и рестартую сервис.

Для clojure, говорят, распространение в таком виде не рекомендуется, типа все равно компилирует на ходу - но мне удобнее таким образом.

[personal profile] alll 2012-02-28 07:02 am (UTC)(link)
Казалось бы утверждение

> за 15 минут (не зная языка!) добился "веб-сервер выполняет запрос к БД и отвечает json-ом на клиент" и пошел пилить на нем со страшной скоростью.

закрывает вопрос немногим менее чем полностью. :)

[identity profile] artureg.livejournal.com 2012-02-28 07:08 am (UTC)(link)
желающих писать на лиспе оказалось очень много, больше чем предложений

[identity profile] artureg.livejournal.com 2012-02-28 07:09 am (UTC)(link)
Idea + La Clojure, который я сейчас дописываю, ибо там кое где черви, и вылазит ядовитая жаба :)

[identity profile] metaclass.livejournal.com 2012-02-28 07:10 am (UTC)(link)
Айсед есть, его сосед по дому есть, артурег есть - этого хватит, чтобы мою опердень с нуля переписать за пару месяцев :) Там больше вопрос в знании предметки, чем в языке.

И самое основное - мое руководство вопрос "где искать специалистов" вообще не рассматривает, несмотря на мои неоднократные объяснения, чем грозит использование не-мейнстримных языков. Поэтому я использую то, что наиболее удобно/хорошо подходит под предметку, вне зависимости от мейнстримности.

[identity profile] theiced.livejournal.com 2012-02-28 07:20 am (UTC)(link)
и это только уютный чятик. а так мы вам лисперов грузовиками можем подвозить, их есть ;]

[identity profile] craneop.livejournal.com 2012-02-28 07:23 am (UTC)(link)
По цене 35 баксовза пучокв час?

[identity profile] artureg.livejournal.com 2012-02-28 07:28 am (UTC)(link)
один лиспер заменяет целое стадо - профит

[identity profile] kurilka.livejournal.com 2012-02-28 07:33 am (UTC)(link)
Про деплой это фантазии.
При использовании того же ребара (хотя можно и руками то же изобразить) весь деплой сводится к upgrade.sh VNS1 (для сборки релиза), затем scp proga-VSN2 hostX:/release_path плюс ./proga admin upgrade VSN2 на hostX (ес-но при желании можно в скрипт из 3 строчек запихать, если прям сильно хочется в одно действие, лучше, конечно, релиз тестировать на "препроде")
Касательно дат пользовался https://github.com/daleharvey/dh_date (правда хитрожопых операций не требовалось, ну и таймзон вроде как нет)

[identity profile] theiced.livejournal.com 2012-02-28 07:33 am (UTC)(link)
вы не путайте толстого айседа с 15ью годами опыта почти и обычного девелопера ;]

[identity profile] craneop.livejournal.com 2012-02-28 07:35 am (UTC)(link)
Как давно ты на лиспе пишешь?

[identity profile] theiced.livejournal.com 2012-02-28 07:35 am (UTC)(link)
ага. scp, .sh. щаз.

[identity profile] theiced.livejournal.com 2012-02-28 07:36 am (UTC)(link)
неделю чоле.

[identity profile] artureg.livejournal.com 2012-02-28 07:44 am (UTC)(link)
две :)

Page 1 of 3