Показаны сообщения с ярлыком язык Haskell. Показать все сообщения
Показаны сообщения с ярлыком язык Haskell. Показать все сообщения

среда, 25 июля 2018 г.

[prog.flame] И вот для этого стоило осваивать Хаскелл?

Люди сообщают с мест:

Компания называется Restaumatic, Польша. Пишем сервисы для ресторанов: заказ еды, системы скидок, сайты, вот это вот все. Обычный web, CRUD, фронтенд на PureScript, бэкенд на Haskell. На самом деле, переписываем потихоньку эту функциональность с RoR и добавляем новую.

Цинк: cpp_stm_free: монадическая STM библиотека для параллельного программирования.

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

Мне, например, нравится использовать C++ в вещах, связанных с низким или более-менее низким уровнем. Протоколы какие-нибудь реализовывать, устройствами какими-нибудь управлять, писать ядра СУБД или MQ-брокеров, ресурсы экономить (выжимать тактики из битиков, как кто-то когда-то хорошо сказал). Но это прежде всего потому, что сами эти задачи мне нравятся. А C++ оказался весьма хорошо приспособлен для таких задач.

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

А тут Web-приложение с бэкэндом на Хаскелле, которое суть складской учет, который во времена оные отлично покрывали dBase-ами и Clipper-ами... Нужно, наверное, очень сильно любить Хаскелл ;)

PS. Интересно было бы лет через 5-10 узнать, чем все закончилось. А то вспоминается пример Sociomantic-а, в котором когда-то выбрали в качестве языка реализации D1, а потом столкнулись с тем, что есть большая и работающая кодовая база на D1, который уже никому не нужен, и есть совсем другой D2, который с D1 не совместим ни на уровне языка, ни на уровне библиотек. Но там хотя бы выбор шустрого D был оправдан требованиями к скорости реакции. Ради чего выбирать Хаскелл для рядового Web-приложения -- это вопрос.

вторник, 12 сентября 2017 г.

[prog] А что, кстати говоря, с хайпом вокруг Haskell?

Сегодня довелось наткнуться на довольно старую презентацию Engineering Large Projects in Haskell: A Decade of FP at Galois и подумалось, что еще несколько лет назад хайп вокруг Haskell-я был достаточно заметным. А что сейчас? Поутих? Или это просто мне на глаза больше ничего подобного не попадается?

PS. Понятно, что язык применяется. И что там, где он успешно применялся, он продолжает использоваться. Интересует именно хайп вокруг языка, т.е. количество восторженных отзывов и всяческий статей типа "Я открыл для себя Haskell и мои волосы стали мягкими и шелковистыми..."

четверг, 5 февраля 2015 г.

[prog.flame] Microsoft Bond, а унутри у ней Haskell. Ахиреть, куда катится этот мир?!!!

Microsoft Bond, конкурент Google Protobuf и Apache Thrift. Для сборки транслятора bond-описаний в C++ или C# нужен Haskell! Не вру, ей богу:

In order to build Bond you will need CMake (2.8.12+), Haskell (ghc 7.4+ and cabal-install 1.18+) and Boost (1.54+).

Мля, когда я кому-то говорю, что для сборки C++ проекта нужен Ruby или Python, то мне, в принципе, обоснованно, замечают: "а ты не *банулся, часом?"

А тут даже не Ruby или Python, а Haskell...

Понимаю, конечно, что мучудакам из мелкософта было проще налабать свой мегатранслятор на няшном Хаскелле, ну модно на него дрочить, если не дрочишь на Хаскелл, то какой же ты хакер? Но, ёшкин жеж кот! Если вы делаете инструмент для людей, то сделайте его для людей.

Upd. Как оказалось, там Haskell-евского кода всего около 2K строк (1996 по показаниям cloc-а). Блин, даже если на C++ код в пять раз объемнее, транслятор был бы всего 10K строк. Ну, ёлки, это же совсем не о чем.

И таки да, имею право говорить такие вещи. Т.к. еще десять лет тому написал что-то подобное на C++. Может не такое навороченное, как bond. Но STL-ные контейнеры из коробки поддерживаются. И наследование для сериализуемых типов. Включая множественное и виртуальное множественное. А так же расширяемость типов. И все это на обычном C++.

четверг, 9 января 2014 г.

[prog.flame.humour] Маленький совет популяризаторам Haskell-я

Навеяно комментарием к предыдущей заметке :)

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

paths s = case dropWhile (== '/') s of
            "" -> []
            s' -> w : words s''
    where (w, s'') = break (== '/') s'

Просто поверьте, что тем, кому приходилось поддерживать на плаву промышленный код с 10+ летней историей, только в кошмарном сне приснится перспектива разбираться с тем, чем же отличается s' от s'' ;)

пятница, 27 сентября 2013 г.

[prog.flame] Про отчет "менеджера" об использовании Хаскеля

Ссылку на Хабровскую статью "Haskell в продакте: Отчёт менеджера проекта" нашел в ЖЖ ув.тов.grundik. В том же ЖЖ у меня состоялся очередной спор с тов.thesz. А уже в процессе спора оформились претензии к тексту Хабровской статьи, которые я решил оформить в виде отдельного поста.

Итак, изложенное ниже является не критикой использования Хаскеля. А критикой описания этого использования. Написанной с точки зрения человека, который имел отношение к управлению разработкой, формированию команд, выбору инструментов, выпуску релизов продуктов и получению/раздече пендалей после обнаружения проблем в запущенном в эксплуатацию софте. Именно этот опыт и позволил мне взять слово менеджер в кавычки в заголовке поста. Поскольку хабравская статья была явно написана не ПМом. Тим-лидом, может быть. Начальником отдела разработки, возможно. Но не ПМом. А именно ПМовского взгляда на произошедшее и не хватало.

Ну а теперь пойдем по-порядку.

Во-первых, в статье не указан объем и характер задачи, размер и состав проектной команды. Для чего применялся Хаскель? Для проекта, который в течении двух лет писала команда из 50 человек? Или для мелких утилит, которые три человека время от времени клепали по просьбе сисадминов? Какова важность этой разработки для компании? Насколько жесткие дедлайны для релизов? Каковы последствия от дефектов в ПО после его запуска в эксплуатацию?

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

Во-вторых, в статье не говорится о целях, которые ставились перед новой разработкой на Хаскеле. Т.е. из статьи следует, что какую-то из ранее написанных на Питоне систему переписали на Хаскеле. Но зачем, почему? Это не праздные вопросы для ПМа и руководства. Ведь в предыдущую версию было вложено время и деньги компании. Сейчас требуется повторное вложение денег. Чем оно обосновывается? Были ли какие-нибудь альтернативы? Делались ли какие-то прикидки по срокам/трудозатратам различных вариантов (сопровождение версии на Питоне против разработки новой версии на Хаскеле)? Если делались, то какие еще параметры рассматривались в сравнении? Учитывались ли какие-нибудь риски и если да, то какие?

Если здесь попробовать сложить озвученные выше "во-первых" и "во-вторых", то версию о том, что на Хаскеле стали писать что-то большое и важное, можно отбросить сразу. Поскольку я не могу себе представить, как разработку, в которую было вложено, скажем, 100 человеколет (т.к. 2 года работы команды из 50 человек) просто так взяли и стали переписывать на Хаскеле. При всем моем скептическом отношении к профессионализму российских ТОП-менеджеров, я слабо себе представляю, как кто-нибудь из ТОП-ов пошел бы на перечеркивание предыдущих затрат и новые инвестиции в разработку в таком же объеме.

Следовательно, речь идет о неких мелких приложениях/утилитах, и совсем небольшой проектной команде. Косвенно подтверждение этому можно найти в комментариях, где приведены сравнительные размеры реализаций одного из приложений на Хаскель и Питоне: 212 против 263 строк.

Эта информация очень важна для руководителей проектов и проектных команд. Т.к. она позволяет таким читателям спроецировать опыт автора статьи на свою ситуацию. И если мне, скажем, нужно управлять разработкой компонента в 300KLOC то выводы из статьи я сделаю несколько другие, чем если бы мне приходилось управлять разработкой нескольких утилит, по 5KLOC каждая.

В-третьих, в статье не говорится не только о целях, которые преследовала новая разработка на Хаскеле, но ничего не сказано о том, что получилось в итоге. Были ли цели достигнуты? Результаты превысили все ожидания? Или же заявленных целей достичь не удалось вовсе?

Когда нет четкого представления о тех целях, которые руководитель разработки ставил перед командой, приведенный в статье перечень сравнений Хаскеля с другими языками/платформами, лично мной воспринимается не очень хорошо, с преобладанием нецензурных выражений :) Могу расписать это подробнее.

Скорость исполнения. Блин, кто в здравом уме будет сравнивать скорость исполнения компилирующегося в нативный код Хаскеля с Питоном?!!! В ваших задачах нужна производительность? Так с какого хера там Питон (да еще без C/C++ных вставок для самых ресурсоемких операций)? А если скорость работы ваших Питоновых компонентов вас устраивает, то зачем тогда приводить сравнение производительности с Хаскелем?

Про указанные в статье проблемы с многопоточностью Питона и его GIL-ом ничего сказать не могу. Имхо, тот, кто на языках вроде Питон или Руби начитает серьезно использовать многопоточность для увеличения производительности (нет, серьезно, производительности на Питоне/Руби?!), тот сам себе...

Отдельно доставила часть фразы "Быстрее Erlang/Java (и других vm-based языков)". Уровнять Эрланг и Джаву по производительности, это сильно.

Использование памяти. Вообще смешно. В качестве примера приводится потребление памяти написанным на C демоном -- 0.15Mb. При этом их устраивает расход памяти Питоновских и Хаскелевских демонов -- от 9 до 20Mb. Ребята, да вам расход памяти вообще пох! Зачем же вы об этом пишете?

Настоящие исполняемые файлы. Во-первых, у автора статьи по этому поводу, похоже, какой-то пунктик. Во-вторых, если бы это действительно было важно, дальше C/C++ у них бы дело никогда и не пошло бы. А так у них, похоже, и Джава, и Эрланг, и Питон жили, живут и будут жить без проблем. Значит нифига этот параметр не важен, вычеркиваем ;)

Качество кода. Тут какой-то детский сад. Сравнение динамической типизации со статической (да еще и очень строгой статической типизацией). Кто-то ожидал какого-то другого итога?

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

Не, тут меня занесло. Обычные ПМы, которые знакомы только с MS Project-ом и способны разве что сроки задач в диаграммах Ганта передвигать, а таковых в нерезиновой туева хуча, совершенно точно не будут знать об особенностях разработки на динамически типизированных языках программирования. Прошу прощения, мы тут в себя в провинции привыкли работать иначе, подотошнее, тащетельнее ;)

А где, интересно, количественные показатели изменения качества кода при переходе с Питона на Хаскель? Наверняка в разработке не использовались системы баг-трекинга, поэтому статистику по дефектам в Питоновском и Хаскелевском вариантах вряд ли можно вообще озвучить. Но вот хотя бы показатели количества строк в приложениях/библиотеках и тестах можно было представить. Мол, на Питоне столько-то строк прикладного кода и столько-то строк в тестах, а в Хаскеле столько-то и столько-то. Почему этих показателей нет? Сильно подозреваю потому, что как такового процесса тестирования не было организовано вовсе. И это прямая вина ПМа.

Тут, кстати, можно еще раз вернуться к теме причины перехода с Питона на Хаскель. Если одной из причин было количество дефектов в Питоновской версии, но нормального процесса тестирования не было, то это вина ПМа. И, следовательно, ПМ виноват в том, что компания еще раз тратит деньги на разработку того же самого, но на другой технологии.

Сложность сопровождения. Выше я уже задавал риторический вопрос об оценке рисков. Вот это и есть воплощение одного из рисков. "Поиск программистов является проблемой, как бы апологеты Хаскеля и не говорили об обратном. Даже вариант «переучить» является проблемой, потому что под функциональное программирование, особенно с «комонадами» и template haskell, нужно сильно мозги повернуть." Это ПМу проекта стало очевидно только в процессе разработки проекта? А до старта проекта это как-то учитывалось? И, что более важно, как эту проблему собираются решать в будущем?

Скорость разработки. Тут, признаюсь, я в сильном замешательстве. У меня сложилось впечатление, что проектом на Хаскеле занимались те же люди, что и проектом на Питоне. Т.е. не опытные Хаскель-разработчики. А раз так, то неизбежно должно было тратится время на накопление опыта, овладение инструментом, привыкание к несколько иным подходам к проектированию программ. Это не могло не сказаться на скорости разработки. Поэтому, с одной стороны, я не удивлен тому, что время разработке на Хаскеле не лучше, чем на Питоне (серебрянной пули нет и нет инструментов, которые бы увеличили скорость разработки на порядок). С другой стороны, явно в последующих разработках сроки должны быть лучше в пользу Хаскеля.


Если резюмировать, то у меня сложилось такое впечатление. Есть небольшая компания, в которой есть небольшая группа разработчиков, пишущих какие-то небольшие внутренние приблуды. Может групп разработчиков там больше, но конкретно та группа, которая занималась описанной в статье разработкой, маленькая, полагаю, 3-5 человек. Эта команда работает в довольно неформальной обстановке. У них прямое и неформализованное общение с бизнес-подразделениями, а так же с техническими службами/сисадминами. Задачи на разработку вряд ли формализуются в виде документов, заверяемых подписями представителей всех заинтересованных подразделений. Возможно, зачастую задачи спонтанно возникают в результате общения руководителя сисадминов с тим-лидом и кем-то из бизнеса. Какой-то более-менее "взрослый" процесс разработки проектов (со стадиями написания и согласования ТЗ, проектирования, реализации, документирования, тестирования, прохождения приемо-сдаточных испытаний) отсутствует как класс. Как отсутствует и использование соответствующего инструментария (Project, Bug-Tracking, Continous Integration, репозиторий документов). В принципе, для небольших сплоченных коллективов это нормально и естественно.

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

Ну а начинающим программистам, в особенности, любителям Хаскеля, статья должна понравится. Ну как же, Хаскель был успешно применен в продакшене! :)

суббота, 17 декабря 2011 г.

[prog] Где прозвучала фраза avoid success at any cost?

Прочитав вот этот комментарий, в частности следующие предложения:

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

попытался вспомнить, где именно я видел высказывание “avoid success at any cost” по отношению к Хаскелю.

Если не ошибаюсь, вот в этой презентации Саймона Пейтона Джонеса – Wearing the hair shirt. A retrospective on Haskell.

пятница, 24 июня 2011 г.

[prog] Чем может отличаться sequence от sequence_?

В программировании есть (как минимум) две фундаментальные и неразрешимые проблемы – предсказание сроков разработки и выбор имен для классов/функций/переменных. С первой проблемой хоть как-то пытаются бороться. А вот вторую, складывается впечатление, только стараются усугубить.

Помнится, несколько лет назад на RSDN я защищал короткие имена методов, принятые в стандартной библиотеки Ruby – вроде to_i (а не ToInteger), to_a (а не ToArray) и пр. Поскольку у меня большой C/C++ опыт, то ничего страшного в to_i по сравнению с strcpy не видел и не вижу. Тем не менее, сейчас я сам оказался в ситуации своего тогдашнего оппонента. Но смолчать не смогу :)

Читаю статью Beautiful Concurrency Саймона Пейтона Джонса. Дохожу до примера в разделе 4.3 на стр.17:

sequence_ [ elf elf_group n | n <- [1..10] ]

Конструкция в квадратных скобках – это list comprehension, т.е. формирование списка элементов вида [elf elf_group 0, elf elf_group 1, ...,elf elf_group 10].

Намного интереснее функция sequence_. Делает она простую вещь – перебирает последовательно элементы переданного ей списка. И возвращает, грубо говоря, void. Т.е. имеет прототип:

sequence_ [IO a] :: IO ()

В принципе, ее цель понятна. Но почему название такое, с подчеркиванием на конце? А потому, что уже есть sequence без подчеркивания с прототипом:

sequence [IO a] :: IO [a]

которая берет один список и возвращает второй список. А не void.

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

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