FGR>Я вижу много энтузиастов и просто любителей функционального подхода. FGR>Но что насчет корпоративного уровня? Готова ли, например, ваша компания для какого-либо нового проекта попробовать F# ?
Полгода делаем один из проектов на Nemerle, оставив на шарпе только GUI. Проект прошёл тестирование и в пред-продакшене, перспективы самые радужные. За всё время работы было найдено 2 глюка компилятора немерла (и не надо гнать что компилятор сырой, глюки были в синтаксических конструкциях которых в шарпе просто нет и вряд-ли будут, и в выводе типов, который у шарпа опять таки отсутствует — var это лажа а не вывод типов), оба исправил Дмитрий Иванков. Респект ему и уважуха. За время работы был написан всего один макрос, весь остальной код -- C# + новые фичи Nemerle.
Когда проект только начинался рассматривали F#, учитывали что за ним MS и бабло. За Nemerle были удобство программирования и фичи ФП.
Nemerle — power of advanced functional, object-oriented and imperative features in a single statically-typed NET language
[cut] _>Когда проект только начинался рассматривали F#, учитывали что за ним MS и бабло. За Nemerle были удобство программирования и фичи ФП.
Т.е. по-вашему в F# не хватает "фич ФП"?
Здравствуйте, hi_octane, Вы писали:
_>Полгода делаем один из проектов на Nemerle,
Если не секрет, то какого типа проект? Есть ли метрика — сколько классов, размер исходников, строк кода?
_>За время работы был написан всего один макрос, весь остальной код -- C# + новые фичи Nemerle.
Какие преимущества Немерле показались самые удобные?
_>>Когда проект только начинался рассматривали F#, учитывали что за ним MS и бабло. За Nemerle были удобство программирования и фичи ФП. К>Т.е. по-вашему в F# не хватает "фич ФП"?
Фич ФП наверняка у F# хватает (с тех пор как взялись за Nemerle, я на него забил, и куда он развивается уже не знаю), но вот удобства программирования и использования этих фич -- имхо, нет, особенно для программиста который писал на шарпе. Получалось что на Nemerle можно было сразу писать, и даже копипастить куски кода из уже имеющихся наработок, или натыренных из рефлектора, чуть-чуть их менять (большинство изменений -- замена имени типа на def, или перенос их на ": имя_типа" в объявлениях функций. С F# в плане копи-паста из существующего кода C# было слишком сложно.
Nemerle — power of advanced functional, object-oriented and imperative features in a single statically-typed NET language
L>Если не секрет, то какого типа проект? Есть ли метрика — сколько классов, размер исходников, строк кода?
Умный разбор данных поступающих с множества компов в VPN-сетке (в реале они могут быть очень далеко друг от друга). Умный наверное слишком сильно сказано, но есть даже небольшой движок уточнения и вывода новых значений из того что нам присылают, по-типу сильно упрощённого пролога.
L>Какие преимущества Немерле показались самые удобные?
Самое главное преимущество — плавность перехода с C#, и совместимость с C# кодом чуть-ли не на уровне синтаксиса. В контексте нашей задачи сильно помогала иммутабельность переменных по-умолчанию и локальные функции. При написании сильно асинхронного кода (в нормальной нагрузке ~100 активных коннекшонов, а у нас потоков лишь по 2-3 на один процессор + GUI) изменяемых переменных может быть одна на два экрана кода, да и сам код просто читается последовательно, будто это обычный синхронный -- супер-удобно.
Ещё очень помогает частичная подстановка аргументов, вот простой пример: есть метода запуска задач из внутреннего пула. Метод принимает Guid и функцию которую нужно запустить с одним параметром — строкой конфигурации типа сonneection string, указывающую, с какого компа брать данные. В шарпе примерно так:
void QueueTask(Guid id, StringVoidDelegate method)
{
где-то здесь вызывается
method(Provider.ConnectionString);
}
в Nemerle вот как (запись делегата, кстати, уже нагляднее):
QueueTask(id : Guid, method : string->void) : void
{
method(Provider.ConnectionString);
}
И кто-то это очень успешно вызывал из кучи мест, передавая свои string->void методы... Через два месяца понадобилось передать в функцию ещё параметр, например int. В шарпе пришлось бы выворачиваться через анонимный делегат (в лучшем случае лямбду), или делать специализированную версию метода QueueTask, а в Nemerle тот кто вызывает, делает так:
И не отходя от кассы получили параметризированный string->void из string*int->void. Существующие места работают как работали, параметр 10 подставлен, и когда функция будет вызвана -- она всё что ей передали получит и прочитает. Может на маленьком примере удобства этой фичи и не видно, но всю силу этого наверное только в реальной работе ощутишь. Например QueueTask вызывает InitContext, та вызывает ещё что-то, и все они внутри вызывают Log(...), а Log вообще ничего не пишет, а собирает все вызовы себя. Запись Log создаст только если внутри метода который вызвали вылетит исключение. В итоге каждый свободно добавляет свои параметры, а запись в логе при этом одна. Там где раньше городили цепочку получения IServiceProvider теперь расставляем _ в местах где аргументов пока нет и передаём дальше
После такого все выкрунтасы .NET в виде object context последним параметром во всяких Thread.Start выглядят столь убого, что для всего до чего руки дошли врапперы написали.
Nemerle — power of advanced functional, object-oriented and imperative features in a single statically-typed NET language
Здравствуйте, hi_octane, Вы писали:
_>Умный разбор данных поступающих с множества компов в VPN-сетке (в реале они могут быть очень далеко друг от друга). Умный наверное слишком сильно сказано, но есть даже небольшой движок уточнения и вывода новых значений из того что нам присылают, по-типу сильно упрощённого пролога.
А если не секрет:
1. Сколько человек работало над проектом?
2. Какой у них общий опыт программирования (функционального програм.)?
3. Сколько времени ушло на изучение Nemerle?
4. Проект внутренний/аутсорс/коробочный? Насколько критичный для вашей компании?
C>1. Сколько человек работало над проектом?
ПМ (я, упоминаю, потому что сам в код тоже лажу), 2 постоянно работают только с немерловым кодом, один человек пополам — GUI на C# и всё что нужно для этого GUI на Nemerle. Сейчас GUI можно и на Nemerle делать, но когда мы начинали поддержка WinForms в интеграции была в зачаточном состоянии.
C>2. Какой у них общий опыт программирования (функционального програм.)?
Общее представление о функциональном программирование было у всех, у одного программиста был опыт с SML.NET (некоммерческий, но приличный), и опыт программирования на lisp (~год, коммерческий). Он и посмотрел все языки кандидаты и сделал мини-презентации для остальных когда стоял вопрос выбора.
C>3. Сколько времени ушло на изучение Nemerle?
Сложно сказать. Сразу читали статьи и начали писать примерно как на C# + кто что понял из статей, т.е. времени отведённого на изучение как бы и не было. Просто единственный функциональщик в конце дня тратил час или два на ревью того что написали и объяснение того как можно ещё или как было бы лучше. Плюс я готовил одну "лекцию" в неделю для объяснения различных фокусов (не только Nemerle). Код рефакторили очень мало, во время рефакторинга было парное программирование.
C>4. Проект внутренний/аутсорс/коробочный? Насколько критичный для вашей компании?
Аутсорс. Для нас проект важный (контора маленькая, каждая просадка это проблема), но клиент постоянный. Если бы задержка в 1 месяц случилась — прошло бы спокойно. Если бы в первый месяц поняли что Nemerle не для нас — перешли бы к плану Б — всё на C#. По итогам сделаем постмортем и будем решать ограничиться подобными проектами или расширять использование Nemerle на всё подряд. Пока опережение сроков по сравнению с оценкой весьма существенное.
Nemerle — power of advanced functional, object-oriented and imperative features in a single statically-typed NET language
Здравствуйте, hi_octane, Вы писали:
_>Аутсорс. Для нас проект важный (контора маленькая, каждая просадка это проблема), но клиент постоянный. Если бы задержка в 1 месяц случилась — прошло бы спокойно. Если бы в первый месяц поняли что Nemerle не для нас — перешли бы к плану Б — всё на C#. По итогам сделаем постмортем и будем решать ограничиться подобными проектами или расширять использование Nemerle на всё подряд. Пока опережение сроков по сравнению с оценкой весьма существенное.
Спасибо за ответы
А клиент не возражал против Nemerle или ему язык реализации совсем безразличен?
C>А клиент не возражал против Nemerle или ему язык реализации совсем безразличен?
Их тех. директора и руководителя отдела внедрения предупредили что разработка будет вестись на языке который больше подходит для задачи (сами правда тогда ещё в этом уверены не были), но там всем, похоже, настолько всё равно, что их технические спецы даже не потрудились уточнить на каком. А мы для себя решили что если клиент таки будет возражать, и при этом окажется что Nemerle для нас очень подходит, то перед сдачей декомпилируем в C# и переименуем всё генерённое в КрасивыеИмена да приложим рядом реальный исходник с текстовиком на русском о том как именно был получен сорец на шарпе. Из расчёта что если дорабатывать будем не мы, но кто-то из соотечественников — то прочитают смогут понять и нас и Nemerle, и доработают спокойно. Если индусы/китайцы — то навалятся толпой и доведут шарповый сорец до обычного индусокода. Всё одно, 90% что дорабатывать будем мы же.
На деле никаких фокусов с перегоном в C# не понадобилось. Молча взяли архив, не уверен что даже проверили открывается ли.
Nemerle — power of advanced functional, object-oriented and imperative features in a single statically-typed NET language
Здравствуйте, hi_octane, Вы писали:
_>при этом окажется что Nemerle для нас очень подходит, то перед сдачей декомпилируем в C# и переименуем всё генерённое в КрасивыеИмена
Вам очень-очень повезло. Не родился ещё декомпилятор, способный разобрать то, что компилирует Немерль.
У него же нет statements, только expressions. Поясню, чем это чревато.
Вот такой код на C# невозможен:
bool b = 1 < 2? true: throw new InvalidOperationException();
И такой невозможен:
(if 1 < 2 true else false).ToString();
А для Немерля это всё нормально. А поскольку все декомпиляторы расчитаны на декомпиляцию c#, то от Немерля им плохеет на простейшем коде.
Попробуйте взять сейчас свой проект нв Немерле и прогнать его через Рефлектор, ДисШарп или Саламандер.
Компиляемый IL-код получить ещё можно, а c#-вого не получится.
Здравствуйте, hi_octane, Вы писали:
C>>4. Проект внутренний/аутсорс/коробочный? Насколько критичный для вашей компании? _>Аутсорс. Для нас проект важный (контора маленькая, каждая просадка это проблема), но клиент постоянный. Если бы задержка в 1 месяц случилась — прошло бы спокойно. Если бы в первый месяц поняли что Nemerle не для нас — перешли бы к плану Б — всё на C#. По итогам сделаем постмортем и будем решать ограничиться подобными проектами или расширять использование Nemerle на всё подряд. Пока опережение сроков по сравнению с оценкой весьма существенное.
Здравствуйте, hi_octane, Вы писали:
DG>>Как Maintanance продали? _>Ещё нет — сначала 3 месяца гарантийной поддержки и только потом отдельный договор на дальнейшую поддержку и развитие.
Т.е. на старте разработки не было разговора о поддержке? Хороший у вас заказчик. А если я хочу отдать поддержку другому сервис-провайдеру? Большие риски для бизнеса.