Я часто критикую технологии, которые кажутся мне неправильными, и в ответ получаю не только аргументы, но и откровенную злобу, обиду, и даже в морду.
Уколы в адрес технологий разрабы воспринимают на свой счет. Культ инструмента — очень странная штука, которую не объяснить логически. Одни говорят, что культ есть у всех, потому что мышление плотно сплетается с япом. Другие говорят, это джунироская болезнь — ты впервые что-то написал, оно получилось, от восторга ты посчитал свой яп чудом божьим.
Чем бы оно ни было, я эту фигню не понимал никогда.
Сторонники культов кажутся мне непроходимыми тупицами. А я всегда пытаюсь понять, как тупицы стали тупицами, и почему тупицей не стал я. Начал думать и бам! — понял, что все-таки стал. Я тупица-культист, который восхваляет F#. И конечно за этим есть история.
Я начал карьеру как junior C# dev. Сырой тогда еще Xamarin, разработка под android. Первые шаги на первой работе были наполнены болью. Я в одиночку делал приложение по скриншотам и гифкам из iOS версии. Все билдилось через раз, проблем была куча, а единственный фидбек, который я получал — «а че не как на картинке?». Это был кошмар, и я быстро ушел.
Полгода учился дома разрабатывать, потом устроился в крупный аутстаф. Там все было как у людей — команда, менторы, экзамены, паттерны, кодревью, строгие линтеры, высочайшие требования к качеству, читаемости и производительности кода. Словом — взрослый подход. Я для себя точно решил — именно так и нужно работать. Но оказалось, это кошмар еще хуже.
Больше года мы целой командой делали модуль для инструмента, который работает с инструментами предназначенными для разработки инструментов. Возможно тех самых, которые нужны, чтобы мы делали модуль. Каждый день нас заставляли звонить то индийцами, то американцам, и отчитываться не понятно о чем.
В какой-то момент я заметил, что делаю все меньше и меньше, но ничего не меняется. На ломанном английском я откровенно врал: «ол паст вик ай серч фор баг. Стил ноу саксес. Вил континью»
«Ок, Фил, саундс грейт», говорили из-за океана.
Однажды в порыве стыда и отчаяния от своей бесполезности я пошел к начальству и попросил меня уволить, но мне зачем-то подняли зарплату. Про это я уже говорил. Мне не было ни смешно, ни радостно — это был убийственный сюр, как будто мир бесполезности победил мир логики.
Странное противоречие, но одновременно от скуки и супер-амбициозности я решил поиграть в крутого разработчика дома. В голове всегда роилась куча идей, как с помощью софтверных проектов сделать лучше мир и свой кошелек. Я все сделал как надо. ТЗ, архитектура, требования к системе, проект в VSTS. Все по-взрослому, прямо как у корпораций.
Нихера не получилось.
Решил — идея говно. Код на помойку, беру новую идею, бросаю, все повторяется несколько раз. Рассказываю коллегам, они недоумевают. Как же так? Ведь я же делаю все в точности так же, как и те, кто уже урвал свой кусок.
Человеку с моей самооценкой обычно легче жить, чем другим, но платить за это приходится дорого. Нужен качественный самообман, чтобы мириться со своими провалами. И я сказал себе: любой разработчик может сделать все, что угодно. Весь вопрос в том, как это будет сделано. И мои требования к этому «как» — слишком высокие. Они не подходят для домашних «стартапов» и они недостойны бесполезных бизнес-задач. Следующая мысль: «я не готов отказаться от своих стандартов качества». Даже если понадобиться сделать приложение, которое пердит по тапу на экран, я сделаю его настолько качественно и продуманно, насколько вообще могу.
В итоге я устроил локальный карго-культ бизнеса у себя дома. Притащил ритуалы, процессы, порядки, но не содержание. Просто поиграл в бизнес-разработчика без бизнеса, как папуас, который слепил из соломы взлетную полосу и вышки, а теперь ждет, что туда сядут железные птицы, как на соседнем острове у странных людишек.
Я писал невероятные кучи формального кода, которые не приближали меня к результату, а наоборот — я бродил вокруг и около. Моя карьера — это, блин, история фейлов и разочарований. Я плюнул на все, поставил на себе крест и просто смотрел на работе сериалы, пил по 16 чашек кофе и курил по пол дня.
Стукнувшись об самое дно, абсолютно случайно прочитал статью на Хабре про F#, попробовал, и такой: «Хм! Неплохо». Мой работодатель с удовольствием оплатил мне месяц обучения (он, правда, об этом не знает).
F# было не сложно изучать, у него тот же рантайм, что и у C#, а функциональный подход к программированию я и так ежедневно применял в TypeScript. И вот я понял, что могу перенести на F# любой свой проект. Оставим мой технический скилл за скобками, потому что скилл — штука относительная. В тех командах, где я работаю сейчас — я крутой, а в команде, скажем, разработчиков F# я мог бы претендовать, самое большее, на позицию помощника уборщицы.
Но на своем уровне я уже мог решать проблемы. Хотя в глубине души хорошо знал — ничего я не решу. Просто поворочаю мозгами и продолжу выкидывать знания на помойку. Я полностью растерял веру в разработку.
И в один из дней решил, что все это брошу нахрен. Была зима, холодно и темно. Я вышел из офиса на улицу, сел в тачку — она не заводится. Наконец двигатель затарахтел. Не знаю, что случилось раньше — то ли я почувствовал запах гари, то ли увидел дым. Потом из-под капота вырвалось пламя. Еще секунда, и я как псих бегаю по стоянке и ору всем, чтобы отгоняли свои машины подальше от моей.
Через пять минут паники и хаоса остался только старый обгорелый кусок дерьма и видюшки всяких оболтусов, которые потом набирали тысячи просмотров в местных «подслушано». Минус 30, я в осенней куртке человека, который собирался поехать домой в теплой машине. Задолбанный в конец, совершенно разбитый морально. Денег на такси нет, общественный транспорт для черни. Я пошел домой пешком, километров десять. Дома нужно помочь жене с ребенком, поесть, уложить их спать, сделать тысячу вещей. Но настает ночь, отвлекающие дела заканчиваются, отмазки тоже, и я остаюсь один на один с разочарованиями и бессонницей — я ни на что не годен, ничего ни с чем никогда не получится.
В этот худший вечер в жизни, еще толком не отогревшись, я решил дать себе последнюю попытку.
Я сел и решил писать маленький цифровой биом на F#, где юниты на машинном обучении будут взаимодействовать сами с собой, развиваться, а я буду крутить параметры и смотреть, во что они этот мирок превратят.
И да, возможно я тогда немного поехал рассудком.
Обычно я использую такую помесь нисходящего и восходящего подхода к проектированию. Описываю решение в общих чертах с помощью псевдокода. Затем начинаю реализовывать самые важные из деталей, которые, как самостоятельные модули, делаю уже наоборот. От деталей к общему.
Уже без псевдокода, я реализую пару тройку крупных модулей, и смотрю, а будет ли это все работать. Обычно, не работает, и я начинаю использовать итерации, повторяя этот процесс от начала и до конца до тех пор, пока оно не заведется. Но чаще просто забрасываю, итерации на пятой-шестой.
С F# я применил тот же подход. У меня было видение проекта, в общих чертах. В голове кирпичик за кирпичиком выстраивается реализация. Ты продумываешь один кейс за другим, и в какой-то момент понимаешь — все, ты уже знаешь, как это закодить. А потом садишься кодить, и понимаешь, что нет. Мысли не переносятся на ЯП, хоть тебе и казалось, что ты мыслишь как бы на нем. У меня так постоянно.
Но тут вышло по-другому. Я создал txt файл в VSCode, и написал псевдокод функции, которая описывает жизненный цикл моего приложения. И понял, что мой псевдокод — валидный F#. Ничего не нужно менять, я только что написал главную функцию проекта. Окей, поменял расширение у файла, добавил его в чистый солюшн. Вот есть функция жизненного цикла. Она принимает текущее состояние мира, штуку, которая его обрабатывает (собственно, сам мир) и выплевывает обновленное состояние, штуку, которая превращает состояние в набор параметров для ИИ и обратно, и сам ИИ, который получает свои параметры, и плюется принятым решением.
Дальше все просто. Взяли стейт, превратили его в ИИ параметры, скормили функции ИИ, результат превратили обратно в стейт, его в свою очередь отдали функции-игре, а результат отдали той же функции жизненного цикла. Божественная рекурсия, простой алгоритм, красивый код, весь GoF из коробки. Осталось реализовать все эти функции.
Но суть тут в том, что мне уже не нужно думать об архитектуре. Я пишу то, что у шарпистов-джавистов называется крутым термином Inversion of control container — функция, которая берет функцию жизненного цикла, и пробрасывает ей в параметры функции из моих модулей (II, Game). VScode подчеркивает ее красным, потому что ни модулей, ни функций в них еще нет. Но я получил главное — как только красные подчеркивания исчезнут, и проект можно будет сбилдтить — решение готово.
Просто беру, и по одному реализовываю эти модули, работая таким же образом. Весь проект — пять файлов. Файл с ИИ — 500 строк, много, но идиоматично. Прелесть подхода в том, что я смог написать рабочую функцию жизненного цикла — сердце моего приложения — не описывая больше ничего.
Вся архитектура — 10 строк кода, написанные за минуту. Никаких интерфейсов, абстрактных фабрик, Ioc-ов, всех этих DefaultInterfaceNameClass и прочей херни, которую мне в C# надо сделать еще до того, как я пойму, что я вообще хочу сделать. Ты берешь, и пишешь тупой код, который просто решает задачу, а он у тебя получается еще качественней, чем твои энтерпрайзные страдания на этих джавах-шарпах.
Я делал это, просто вбивая свои мысли в редактор, как будто я думал на F#. В местах, где на C# я бы писал план работы в комментах к коду, я фигачил работающие функции. Вместо описания десятков, а потом и сотен интерфейсов — один маленький файл с доменной моделью приложения. Сбилдил. Получил работающее решение. За ночь. С хорошим кодом, который потом не боялся показывать на собесах. Вот так просто.
Утром я написал на работу, что заболел, и погрузился с головой в проект на неделю, пока не понял, что идея-то моя — уже давно реализована и никому не нужна. Но я вернул себе веру, и это было главным.
Я не знаю, в чем тут дело — это F# охереннейшая технология, или просто она слишком хорошо подходит именно мне, или она создана именно для таких задач — какая разница? Важно то, что на тот момент я тонул, и мне нужен был спасательный круг. Жизнь кинула мне F#, и я выкарабкался. Теперь это для меня не просто бездушная технология — это огромный эмоциональный скоуп.
Когда кто-то при мне посмевается над F#: «Мертворожденная технология! Игрушка для задротов...» — тут же вспоминается зимняя темень, горящая тачка, сигарета, примерзшая к губам, подавленное состояние и F#, который меня из него вытащил. То есть, они как будто моего лучшего другана дерьмом обкидали. Моя реакция очевидна — мне обидно, и я зол.
Это выглядит странно со стороны, но если бы вы прожили тот день вместо меня, вы бы реагировали также. Думаю, что так у всех культистов технологий. Они влюбились в свои япы, потому что обстоятельства, при которых они с ними познакомились, очень остры лично для них. А я тут прихожу, и плюю им в душу. Ну и кто идиот? Я идиот. Надеюсь, больше не буду.
Если что, про F# тут.
Комментарии (121)
aikixd
15.01.2019 19:10+1Рад за вас. Функции хорошо выпрямляют мозги. Когда пообкатаете их, ваш ООП тоже станет лучше. Многие ОО разработчики за деревьями не видят леса. Вместо решения бизнес задачи, они решают проблемы объектов. Я тоже таким был, и тоже наткулся на F#. Сначала возненавидел ОО, но потом, когда пыль осела, внезапно стал намного лучше писать на объектах. Теперь люблю обе парадигмы, в обеих есть своя прелесть. Однако не идиоматичный ОО код теперь бесит чаще и сильнее.
sshikov
15.01.2019 19:33>весь GoF из коробки
И все это на f#? Похоже, вы что-то не договариваете…develop7
15.01.2019 20:09+2accu.org/content/conf2013/Tobias_Darm_Effective_GoF_Patterns.pdf
TL; DR: заиспользовав лямбды из C++11 и немного Boost, автор половину паттернов GoF просто выкинул, вторая половина сильно похудела (1 класс там, где было 2-3).sshikov
15.01.2019 20:21А вы думаете, я в исходном комментарии на что намекал? Ровно на тоже самое. Это сложно назвать GoF из коробки, потому что это уже другое.
develop7
15.01.2019 20:28+1Просто реализация большинства этих паттернов на F# настолько тривиальна, что давать им отдельное название, и уж тем более посвящать целый раздел в специальной книге становится как-то неловко: чувствуешь себя тем самым академиком из башни слоновой кости. КДПВ: imgur.com/6c6mZ82
sshikov
15.01.2019 20:36Я это понимаю. Поясню еще раз, потому что это очевидно осталось непонятым: когда вы пишете «GoF из коробки», это обычно означает, что реализация паттернов у вас есть готовая. А то, о чем вы рассказываете, это чуть иное — когда большая часть паттернов вам просто становятся не нужны.
Вы тут некую тонкую грань не ощущаете? Нет? Ну и не надо, забудьте.Cerberuser
16.01.2019 06:07+5Они не нужны, потому что де-факто содержатся прямо в языке, или я не так понял суть обсуждения?
ZXZs
15.01.2019 20:29+4Такие душевные переживания по поводу разработки. «Вера в разработку» уже звучит как-то возвышенно. А ещё говорят, что программирование !== не творчество :)
aensidhe
15.01.2019 21:59+5Некоторые люди говорят, что химия, физика и математика — не творчество. Зачем слушать необразованных людей? ;)
Portnov
15.01.2019 21:26+2Вызвало ассоциации с видео почти десятилетней давности…
erlang-mnesia-video.ru
;)
VanquisherWinbringer
15.01.2019 23:04+8У меня почему то после прочтения этой статьи тепло и хорошо на душе. Спасибо. Душевно так.
vassabi
16.01.2019 00:09:) теперь нужно попробовать хаскель
и понять — что все это у людей в головах, а не в языке. Что на любом языке можно так же написать, если только правильно сформулировать для себя.
mfursov
16.01.2019 01:54+2А пробовал ли автор Kotlin?
Я спрашиваю потому что рассказ похож на мои ощущения при переходе с Java на Kotlin.
При этом я практически не потерял в качестве инструментария, в Intellij IDEA Kotlin поддерживается не хуже Java (только что IDE помедленнее ворочается).
Вот тут есть пример как аналогичный код для F# выглядит на Kotlin
discuss.kotlinlang.org/t/equivalent-kotlin-code-to-my-f-functional-code/6578NerVik
16.01.2019 09:51+3Было бы странно если бы Котлин в idea поддерживался хуже, чем java. Все таки они его сами разрабатывают
SerVB
16.01.2019 15:44Имхо таки Kotlin поддерживается похуже, чем Java, по крайней мере полгода назад. Натыкался на менее умную работу статического анализа вроде определения всегда ложных/истинных условий с арифметикой. Код на Java подсвечивается предупреждением, а после встроенной фичи конвертации кода в Kotlin сообщений не видно. Конкретных кейсов не сохранилось, поэтому и сейчас проверить не могу...
И это не странно: Java поддерживают в несколько раз дольше, поэтому и поддержать успели больше...
tamapw
17.01.2019 07:40И это не странно: Java поддерживают в несколько раз дольше, поэтому и поддержать успели больше...
Просто дополнение:
Как по-мне, идея в принципе должна лучше поддерживать джаву и дело не столько в времени, а просто потому, что она изначально писалась именно под джаву. Основной упор был именно на джаву и она прожила с ней огромное количество времени. Какое количество инспекций и рефакторингов было написано под всевозможные версии, библиотеки, фреймворки, JEE и прочие радости жизни? Какое количество разработчиков пользуется котлином и какое джавой? Вопросы риторические.
И, если сейчас поддержка нового языка будет не хуже, то это будет как минимум странно. Команды разработки плагина для нового языка и команда разработки всевозможных инспекций и обработок для джавы, пусть и пересекаются, но у последней, скорее всего, просто больше людей, больше опыта с этим конкретным языком. И поэтому поддержка лучше.
У котлина она хорошая, спору нет, но ожидать такого же уровня поддержку, как в джаве — эээ.
Serg046
16.01.2019 15:35Я думаю похожие эмоции были бы при переходе с Java на C#. Kotlin, пока что, немного приятнее, но имхо совсем немного. Но зато у C# нет проблем, которые идут только из-за jvm и не могут быть нормально решены без изменений именно там. Так что проба F# кажется более внушительным шагом. В jvm стеке, полагаю, стоит называть Scala, а не Kotlin.
Mishkun
16.01.2019 15:40Имхо, Kotlin намного свежее выглядит и пишется, чем C#. А про какие проблемы JVM (кроме проблемы с дженериками, которые частично решаются модификатором reified в Kotlin) идет речь?
Serg046
16.01.2019 15:46+2Да, я про дженерики и вспомнил, reified к сожалению применим только к инлайн ф-циям, ну оно и понятно почему. Ну а насколько Kotlin временно обошел C# не буду спорить. Если бы не грядущий c# 8 с nullability, то сказал бы намного. Классная фича, которая должна была быть с рождения, как в Kotlin.
PsyHaSTe
16.01.2019 18:13Генерики все же более общая проблема, например попробуйте на JVM реализовать
class Foo : IFoo<Bar>, IFoo<Baz>
. Пример немного искусственный, и в некоторых случаях может решаться введением промежуточныхiFooBar : IFoo<Bar>
, но не всегда.
Второе — в C# экосистеме очень много используется всевозможных анализаторов кода в рантайме. Самый типовой пример: генерация SQL-запроса из
foos.Where().Select().ToList()
. Это наверно можно сделать на хитрых стримах, но возможности экспрешнов намного шире. Например, я мигрировал на MongoDriver 2.0 и там отсутствовала функция Save (upsert по сути), ну я взял, расчехлил экспрешны, и сделал обобщённый код, работающий со всеми типами. Тут есть вся вкуснятина, включая формирование функции-темплейта, в теле которой заглушка заменяется реальным значением, переданным пользователем (IdConstantVisitor
).
Третье — с появлением Roslyn очень распространены стали анализаторы кода на C#. Я не про анализ Java-кода всякими анализаторами, а про бытовые вещи. Например, тут человек просил в язык добавить модификатор видимости, чтобы делать белые/черные списки типов, которые могут вызывать некий код. Берем, тратим 20 минут, и анализатор реализующий функционал готов.
Ну и небольшой минусик лично от меня: аннотации. В C# почти всегда можно просто сделать goto атрибута и посмотреть, что именно он делает. А у меня коллеги-котлинисты постоянно жалуются, что висит десяток собак на классе или функции, и не понятно, что они вообще делают, и где правды искать.
merhalak
17.01.2019 03:40Я вместо множественного наследования для одного интерфейса с определенного момента стал использовать nested classes. Мне понравилось. Доступ к членам классов есть, что еще от жизни надо?)
Mishkun
17.01.2019 15:44Аннотации не идиоматичны для котлина, если ваши друзья пишут на котлине и у них на классе висит десяток собак, то они на самом деле скрытные джависты.
Roslyn скорее фича C#, чем минус Котлина :) Я точно так же могу сказать что дескать в C# нет property delegate или инфиксных функций.
Про генерацию я не очень понял пример, можно поподробнее?PsyHaSTe
17.01.2019 16:04Аннотации не идиоматичны для котлина, если ваши друзья пишут на котлине и у них на классе висит десяток собак, то они на самом деле скрытные джависты.
У них котлин со спрингом, и там этих собак тонны
Про генерацию я не очень понял пример, можно поподробнее?
Ну например вы пишете запрос
var foo = MyDb.Employee.Where(x=>x.Sex == Sex.Male).Select(x=>x.Salary).ToArray();
И он транслирует его в какой-нибудь SQL или в mongo-запрос, в зависимости от того, какое хранилище подключили.
Еще удобнее, когда где-то есть визиторы, которые этот экспрешн модифицируют, например, добавляют дополнительно
Where(x=>x.AccessRights == GetAccessRightFromCookies())
. То есть вы пишете обычные запросы, а где-то дополнительно навешиваются еще условия, что юзер получает только те данные, к которым имеет доступ. Или подменяется часть запроса, чтобы обработать некоторые случаи.
Atreides07
16.01.2019 04:26+6Задело за живое. К сожалению с F# есть одна проблема. Если повезет то ты просто не поймешь что за язык, или будешь пытаться писать на нем ровно так же как пишешь на С# (ставя везде mutable). А вот если не повезет то ты поймешь насколько это крутой и насколько недооцененный язык. Ты уже заразился, для каждой задачи ты уже видишь два решения: C# стиль (с кучой мусора на интерфейсах и DI) или F# стиль. Давным давно я когда то влюбился в C# после нескольких язков и я был счастлив. А сейчас: хорошая зарплата, начальство, риск менеджмент, кадровая политика и т.д. и т.п. прибивают разработку гвоздями к C# но я уже несчастлив. Эта бесконечная вереница интерфейсов, скобочек и безумного количества мусорного кода с пробрасыванием интерфейсов, наследования от интерфесов, где у 99,99% интерфейсов всего одна единственная реализаця. Слава богу есть Resharper, который хотя бы хорошо автоматизирует генерацию этого адского, бесползеного, не приносящего никакой прямой пользы мусора. Но ты понимаешь что можно было бы идти по другому пути — пути где не надо было генерировать и поддерживать этот мусор и ты несчастлив что смалодушничал и выбрал более теплый, мягкий, безопасный путь бесконечного мусорного кода типичной Enterprise разработки.
LMSn
16.01.2019 12:11+4Попробуйте писать на C# без этого мусора. Я, например, пишу на C# в крупный проект в крупной команде, где не пишут интерфейс, когда есть только одна реализация, где в DI ничего нигде не регистрируется в коде (все автоматически), и все, что DI пробрасывает по умолчанию — Singleton. Я был счастлив найти команду, которая не пишет интерфейс под каждый чих, которая не считает SOLID манной небесной и единственно верным путем.
OrangeCrusty
16.01.2019 13:42А юнит тесты как пишете?
На моём текущем проекте именно так ребята и писали несколько лет. В итоге у них у класса, который используется везде, для тестов есть метод GetDebugInstance, я не шучу. И чтобы протестировать одну строку приходится писать под 50-100 строк кода инициализации всего, что завязано друг на друга.
Я заменил ровно одно свойство на возвращение интерфейса вместо конкретного класса и юнит тест снова стал юнит. А вы как делаете?
Atreides07
16.01.2019 14:16Я работал во многих командах где на C# так и пишут. Но опять таки, как было замечено выше, на C# писать в таком стиле это боль. Когда тебе сдают проект с 1,3 млн. строк кода, без тестов, без организации без структуры (ну и естественно со всеми нарушениями принципа SOLID и DDD). Это боль. Очень большая боль.
Все эти SOLID, DDD, DI, интерфейс на каждый чих и т.п. получили популярность в Enterpise секторе не из за того что разработчики страдают мазохизмом а из за того что они решают конкретную проблему больших проектов.
Просто когда видишь что можно поменять мышление, можно по другому взглянуть на проблему и это позволит убрать этот мусор то уже трудно заставить писать все это.
И почему думаете что SOLID и ФП несовместимы? Если довести SOLID принципы до абсурда то у тебя практически получится функциональный подход. (на самом деле не совсем так но это тема отдельной статьи).
Возьмем например букву S. (Принцип единственной ответственности). Одна функция одна ответственность. Схожий принцип I (принцип разделения интерфейсов) — один интерфейс — один метод — одна функция и т.д. по всем остальным принципам.
Посмотрите еще насколько проще воплощается DDD на F# по сравнению с реализацией DDD на C#.
https://fsharpforfunandprofit.com/ddd/
В больших проектах SOLID и DDD это манна небесная которая реально спасает разработку. Но на F# эти принципы соблюдать еще проще чем на C#
alhimik45
16.01.2019 20:06Да, автоматический DI + singleton его же средствами и концептуально получаются некие микромодули которые содержат связанную функциональность и могут декларировать через иньекцию в конструктор свои зависимости от других "модулей".
И я рад бы писать это на функциональщине, но ведь там придётся каррировать руками каждую функцию и пихать необходимые аргументы, вместо "модулей"-классов.
Например некая хранилка документов с возможностью создать/получить/удалить документ. Всем трём функциям нужен клиент к БД. В ООП+DI я добавляю его в конструкторе и использую в методах. В ФП мне нужно объявить его аргументом у всех трёх функций, потом из каждой функции сделать каррированую версию для использования в других местах (сразу скажу, что я не особо писатель на ФП, больше читатель. И много где пишут, мол, используйте каррирование и всё будет хорошо, но может быть я что-то упускаю?).
Szer
16.01.2019 20:22Ну для начала вам никто не запрещает делать классы в ФП :)
Но если хочется чистоты и фпшности (в описанном случае смысла вижу мало упарываться), то делаем одну функцию с параметром dbClient, которая возвращает рекорд (тупль) из 3х функций (create/read/delete), которые работают с этой db. Во все три уже будет вшит dbClient.
Я бы так не делал.
alhimik45
16.01.2019 20:44классы в ФП
Да в F# думаю оптимальным будет структуру приложения делать на классах/интерфейсах, а мощь ФП использовать локально внутри.
Но вот в хаскеле классов нет :(
которая возвращает рекорд (тупль) из 3х функций
не, это упячка :)
Portnov
16.01.2019 21:08+1не, ну зачем сразу тупль. Надо либо record, либо экземпляр какого-то типа, который является инстанцией подходящего type class (это два подхода к реализации подобных вещей, у каждого есть плюсы и минусы, противники и сторонники, а по сути — баш на баш). Технически ничем не отличается от сишечных структур, содержащих функции.
data DbClient = DbClient { create :: Entity -> IO (), read :: PrimaryKey -> IO Entity, delete :: PrimaryKey -> IO () } realDb :: DbClient realDb = DbClient { create entity = ... } fakeDb :: DbClient fakeDb = DbClient {...}
Технически, дальше вам никто не запретит написать
-- объявляем класс (ну ладно, не класс, а структуру с методами) data SomethingInterestingDoer = SomethingInterestingDoer { dbClient :: DbClient, -- другие поля doSomethingInteresting :: IO () } makeDbClient :: ConnectionString -> DbClient makeDbClient = ... -- экземпляр класса с реализацией методов something :: ConnectionString -> SomethingIntestingDoer somehting connStr = doer where doer = SomethingInterestingDoer { dbClient = makeDbClient connStr, -- это мы "добавили в конструкторе" doSomethingInteresting = do create (dbClient doer) newEntity -- а это мы используем dbClient }
это 1-в-1 «оопэшное» решение. Только обычно так не пишут, если нет большой нужды. Обычно пишут проще:
doSomething :: ConnectionString -> IO () doSomething connStr = do let dbClient = makeDbClient connStr create dbClient myEntity
(я тут игнорирую кучу деталей, на данном уровне абстракции непонятно кто такой ConnectionString, makeDbClient должен зависеть от реализации самого клиента, итд)alhimik45
16.01.2019 21:33Только в таком решении всё равно нет автоматического резолвинга зависимостей, "добавленных в конструкторе" :)
Я видел какую-то реализацию автоматики на классах типов в хаскеле, но она работала за счёт того, что инстанс для каждого класса был один, но в такой реализации это в тестах довольно бесполезно.
John_Minority
16.01.2019 05:41+4Почти та-же самая история, только я к F# пришел из системной аналитики. Порой проще самому закодить чем объяснять как нужно. А когда изучил книгу fsharpforfunandprofit.com/ddd, то я начал чувствовать огромную легкость в выражении своих мыслей и реализации этого всего в коде.
У меня хороший опыт с R и я знаю что такое хороший DSL для работы с доменной областью, в R есть офигительная библиотека ggplot2 которая позволят описывать графики как ты хочешь их видеть, а не как они должны рисоваться, это очень удобно и легко. Ну и все библиотеки из tidyverse построены по этому принципу — предоставление удобного DSL для выполнения конкретной задачи.
Собственно понимание что на F# можно написать свой собственный DSL и решать свои задачи на нем меня в него и привело. И то, что я получил — это огонь.prospero78su
16.01.2019 08:59+2Когда МС попыталось оценить число программистов не на окладе — оказалось их было по всему миру как минимум 18 миллионов против 6 профессиональных миллионов. И эти 18 миллионов потому на 2005 год и существовали, что физик-теоретик не сможет за короткий срок объяснить программисту-профессионалу — как сделать правильно. Легче сделать самому. И ответственность за принятое решение тоже придётся нести самому. Советую посмотреть доклад старшего научного сотрудника доктора ф. м. наук РАН ВНИИ ЯИ (Троицк) Ткачёва Ф. В. со «Дня Оберона-2018», что проходил в Орле не так давно. Там вообще выступления есть очень сильные по этому поводу.
Deys85
16.01.2019 09:51+4Вот состояние прям как у меня сейчас :(
Тебе за 30, семья, дети, ипотека, ЗП не хватает(и к сожалению повышать не собираются), ты являешься не официальным разрабом при отделе(хоть и очень крупной компании РФ), твой культ Delphi/Pascal, но сейчас пишешь(уже только иногда) для офисного планктона макросики, да инструменты на VBA(Excel), поддерживаешь те оставшиеся инструменты, которые остались после оптимизации отдела, при этом ты владеешь PHP(но не имеешь опыта, кроме домашних поделок), базовое понимание SQL и умение проектирования БД(с нуля) в My/MS SQL, способность с нуля создать/сопровождать многопользовательскую систему, как говорится «из подручных» и доступных, в наших бюрократических условиях, средств. Но все попытки перевода в специализированные отделы разрабов сводятся к отсутствию опыта именно вот по тем новомодным технологиям которые нужны именно сейчас, хотя время на освоение не более месяца хватит для адаптации к этим «яйцам», ну а тонкости с опытом.
И вот сидишь и руки опускаются. У себя в отделе тебя ценят уважают, знают на что способен и как это оптимизировало процессы, но ЗП не могут поднять т.к. не от них зависит, а от долбанных стандартов и новой политики, нового руководства, а соседние отделы еще на этапе собеседования, смотрят на тебя как на студента-самоучку(выскачку) и впринципе опыт/умения не интересует т.к. это же Васик, не топовый язык. Вот тут руки и опускаются.
Спасибо. Очень воодушевила Ваша история. )))
П.С.: Сорри. Крик души…anaken
16.01.2019 11:02+1> базовое понимание SQL и умение проектирования БД(с нуля) в My/MS SQL
впервые вижу такое в одном предложении))) умение создавать таблички и накидывать в них новые поля — это еще не умение проектировать БД)
Попробуйте освоить какой нить новомодный язык программирования (типа Go или NodeJS), попрактикуйтесь в решении сколько нибудь серьезных задач, посмотрите как люди пишут производственные приложения или полистайте код на github. Сменить профиль IT не так сложно как кажется, поверьте.
arkamax
16.01.2019 20:36Может стоит уйти джуном в нормальную контору, где дадут возможность прокачаться разрабом? Если такое рассматривать, то лучше сейчас — к 40 будет куда сложнее. Брать проекты на стороне, не бояться отсутствия опыта и просто долбить в одно место, пока не заработает. Да, много времени уйдет, но результат будет. Все это говорю по личному опыту переквалификации из экономиста в web dev, потом в embedded electronics, потом обратно в web dev (не считая забегов в desktop, когда клиенты сильно просили).
LMSn
17.01.2019 15:54Опишу свою историю, может вас к чему-то подтолкнет.
Я в 24 года, после работы экономистом-бухгалтером, пришел в крупный банк на непонятную позицию (в новом подразделении, то ли аналитик, то ли недоразработчик-писатель макросов на VBA). И так сошлись звезды, что после принятия меня на эту должность, одновременно с начальником (отдел-то новый), он оценил, что я не подхожу под эту должность (не знал SQL) и направил меня на 4 платных майкрософтовских курса по MS SQL и разработке DWH на нем. Через несколько месяцев, сразу после последнего моего курса начальника уволили, взяли другого, но и тот убежал через 3 недели. Я уже тоже готовился писать заявление (было абсолютно не понятно что от нас хотят, но чего-то требовали), но решил остаться и посмотреть что будет дальше.
1. Следующие 7-8 месяцев я на практике изучал и игрался с MS SQL с правами админа. Параллельно работодатель оплачивал мне изучение языка C# на рабочем месте (как и у автора поста, работодатель про это не знал). Сначала писал легкие маленькие скриптики в MS SSIS, затем расширения для MS Excel. Ну и какую-то работу тоже работал.
2. Перешел в не ИТ-компанию даже с небольшим повышением в зп (искал специально, нашел совсем не сразу, отшивали из-за высоких запросов по зп) на стажера-джуна на C#.
3. Отработал там ровно 1 год и ушел в одну из крупнейших ИТ-контор в РФ на позицию middle+
Итого, на то, чтобы мутировать из экономиста, умеющего немного говнокодить на VBA, в middle+ C# разраба, у меня ушло чуть больше полутора лет. Вам, полагаю, стоит приступать сразу к пункту 2.alhimik45
17.01.2019 17:55+1/offtop:
Что за инвайт-рекурсия??Cerberuser
18.01.2019 07:09Это приглашение, полученное в честь запуска английской версии Хабра:
каждому пользователю с положительной кармой мы начислим сегодня по одному приглашению.
У меня, собственно, у самого такое же.
anaken
16.01.2019 09:51-4Так уж получилось, что «с детства» недолюбливаю .NET и все что с ним связано, особенно нелепо для меня выглядят решения реализованные с использованием .NET без контекста использования в среде Windows. Из текста статьи осмелюсь предположить, что автор до использования F# писал только C#, что в общем прискорбно.
Qui-Gon_ivanovich
16.01.2019 15:41+4Зачем устраивать холивар, если ты зашел под пост о технологии с которой ты плохо знаком, веди себя как гость
— rwx rwx r — -Vadem
16.01.2019 16:44+6Более того, это первый комментарий у этого пользователя на хабре.
Хотя зарегистрирован он в 2014 году.
Т.е. человек насктолько не любит дотнет, что не удержался и прервал пятилетнее молчание только для того, чтобы об этом написать)
Причём без каких-либо аргументов. Просто не люблю и всё тут)anaken
16.01.2019 18:55-3Я считаю, что такие инструменты как .NET равно как и Java с ее JVM уводят этот мир в бездну не оптимальности плодя монструозные приложения с детским кодом, но большим аппетитом к памяти и процессорному времени, которые потом считаются нормой. А потом мы видим статьи типа этой "Моё разочарование в софте". Да, не всем нравится писать приложения на не слишком дружелюбных языках типа C++, да и времени нет, все понятно. Но есть же такие творения как Go, которые еще вселяют надежду, что не все потеряно…
Vadem
16.01.2019 19:27+2Так и знал, что вы не удержитесь и всё-таки поведаете почему же вы так не любите дотнет)
Вы даже не замечаете насколько ваш комментарий нерелевантен по отношению к данной статье. Она ведь не про дотнет и даже не про F#. Она про то, как изучение нового языка/технологии/чего-то ещё может открыть второе дыхание у перегоревшего специалиста.
P. S.: Люблю Го, но вот за таких вот представителей его сообщества иногда стыдно.
helgisbox
16.01.2019 09:55+2Как это все знакомо, годы спустя тоже к этому пришел: «Но настает ночь, отвлекающие дела заканчиваются, отмазки тоже, и я остаюсь один на один с разочарованиями и бессонницей — я ни на что не годен, ничего ни с чем никогда не получится.»
igrishaev
16.01.2019 10:02+3Да хватит уже выгорать. Смотришь твиттер — этот выгорел, тот выгорел. Посты на три экрана. Проблема преувеличена.
я пошел к начальству и попросил меня уволить
А что еще делать начальнику? Надо не просить уволить, а увольняться. Иначе в его глазах вы выглядите как капризная телочка, которая не знает, что ей нужно. Насколько я понял, после этого вы не уволились, то есть подтвердили мнение начальника.
Кодить по ночам — отстой. Это нехватка сна, нерподуктивный день и возбуждение перед сном. Снова кодинг ночью, и так по кругу.
develop7
16.01.2019 10:21+1Проблема преувеличена.
депрессию вы, должно быть, тоже отрицаете?igrishaev
16.01.2019 10:32Я не писал, что отрицаю депрессию. Депрессию нужно лечить, бороться с ней. А ночной кодинг и примерзжая к губам сигарета этому не способствуют. Это инфантильный романтизм, упивание собственным страданием. Жаль, что на такое ведутся толпы людей. Срабатывает принцип "это обо мне", все считают себя тоже выгоревшими и пишут посты.
i360u
16.01.2019 12:34+2Экстраполяция себя любимого на весь мир — это наше все. Если я не испытываю от работы никаких эмоций — то это правильно и у всех должно быть так-же, да? Программирование, как вид деятельности, вполне располагает к "мукам творчества", если вы не человек-функция, клепающая одинаковые формочки. А для многих кодинг еще и базовое средство самовыражения, центр притяжения для всей жизненной философии. И не говорите, что это плохо.
igrishaev
16.01.2019 10:18+2И еще позвольте спросить — так вы пишете на F# в прод за деньги, или это хобби? Из поста это не понятно.
Пока это хобби, вы в пузыре и сами себе хозяин. Вас радует не язык, а свобода от надоевших правил. Начнете писать в прод — бОльшая часть проблем вернется на круги своя.
Спрашиваю, потому что знаю по опыту — даже самый экзотичный язык меркнет в повседневной работе. В моем случае это Clojure. Переключение на функциональный язык сперва окрыляет, но в итоге ты выигрываешь не так много, как думал сначале.
tamapw
16.01.2019 13:24Спрашиваю, потому что знаю по опыту — даже самый экзотичный язык меркнет в повседневной работе. В моем случае это Clojure. Переключение на функциональный язык сперва окрыляет, но в итоге ты выигрываешь не так много, как думал сначале.
Не думали написать статью об этом в разрезе Clojure? Статей про этот язык маловато, а статей о промышленном использовании, с примерами и проблемами и вовсе не припоминаю.develop7
16.01.2019 13:36с примерами и проблемами и вовсе не припоминаю
«Зря слона ругаешь — не продашь»
igorp1024
16.01.2019 10:44+5Я, конечно, понимаю, что тут поётся ода F#, но
Денег на такси нет, общественный транспорт для черни. Я пошел домой пешком, километров десять.
Для черни?
Daddy_Cool
16.01.2019 11:13+2Конечно же. Голубая кровь даже за два часа (10 км пешком) при температуре минус 30 не замерзает.
)))
DrGluck07
16.01.2019 11:55+2Я растерял веру в разработку, выгорел, но меня спас проект, который я начал делать в качестве хобби
Gorthauer87
16.01.2019 12:54+2Если абстрагироваться от деталей, то напоминает рассказы тех, кто ударились в религию после тяжелых событий.
Exponent
16.01.2019 13:12Психотип автора не подходит для разработчика, скорее для автора стартапа, т.е. он занялся не своим делом, потому все ему выглядит тупо и уныло.
justjeckill1993
16.01.2019 13:58Да черт возьми, как же Вы круто пишете!!! А данная статья вызвала у меня такие эмоции, как будто я читал ее не на рабочем месте в попыхах, пока прогружается среда, а дома с горячим чаем, удобно устроившись на диване)))
Ogoun
16.01.2019 14:02+2Но ведь никто не заставляет вас слепо следовать книгам, C# поддерживает все парадигмы программирования и не он заставляет делать инструменты ради инструментов.
Я пишу на C# уже 10 лет, но не столкнулся с тем что говорит автор и вы. Возможно потому что начал читать книги по нему, паттернам и подходам уже после того как дошел до middle уровня. В результате у меня есть набор библиотек применяя которые остается писать только чистую бизнес логику.
Даже приведу пример из тестового проекта, ниже весь код микросервиса. Для понимания, это второй сервис в цепочке, отвечает за преобразование сырых данных во внутренний формат, принимает сырые данные по транспортному соединению от сервиса читающего данные с сайта, после преобразования передает следующему сервису который отвечает за планирование доставки готового документа.
Program.csnamespace Adapter { class Program { static void Main(string[] args) { BusinessApplication.Startup<AdapterService>(args); } } }
MayRiv
16.01.2019 15:13Не совсем понятно, в истории, где вы выгорели и попросили себя уволить, вы писали, что вы честно исследовали сложный баг, и просто длительное время никуда не продвигались. И это вызывало у меня сочувствие.
Здесь же вы пишите «На ломанном английском я откровенно врал: «ол паст вик ай серч фор баг. Стил ноу саксес. Вил континью»»
То есть, раз врали, значит вы ничего и не делали по задаче? Честно говоря, под таким углом это выглядит совсем по-другому.
А если нет, то в чем ложь?
spam312sn
16.01.2019 15:41+2Это выглядит странно со стороны, но если бы вы прожили тот день вместо меня, вы бы реагировали также. Думаю, что так у всех культистов технологий. Они влюбились в свои япы, потому что обстоятельства, при которых они с ними познакомились, очень остры лично для них.
Как же я понимаю автора. В дни тяжёлой депрессии я просто беру свой старый проект на своём любимом языке программирования и просто пишу — один кусок, другой, придерживаюсь стандарта который беру за основу. Это ненадолго отвлекает и если заглушить в себе мысль "это никому не нужно", то можно просто помедитировать за написанием кода. Расслабляет лучше, чем алкоголь и всякие антидепрессанты
engine9
16.01.2019 20:02И вам я тоже хочу адресовать вопрос, что задал автору: «как должно быть, чтобы вы ощущали душевный подъем?»
spam312sn
17.01.2019 14:09+1Простите, я не торопился с ответом, потому что обдумывал весь вчерашний вечер, что же мне действительно приносит удовольствие в своей работе.
Как должно быть
Сложно на самом деле сказать. Это не какая-то определённая атмосфера или ритуалы. Просто я люблю программировать — мне нравится мой язык программирования, выбранный framework, нравится доходить до состояния осознания программы не как набора методов, классов, циклов и алгоритмов, а как непрерывного потока информации и данных, который я направляю в нужное мне русло. Из-за этого мне очень нравится Git — он напоминает реки кода, которые разливаются и сливаются вновь.
Для меня на первом месте чистота кода, его читабельность, логичность и компактность моих алгоритмов. Приведение своего произведения к максимально возможным показателям этих критериев приводит меня к некому умиротворению и осознанию логичности того, что я творю, на фоне нелогичности некоторых вещей в нашем мире — такой у меня способ медитации.
Так случилось, что слова автора...
Они влюбились в свои япы, потому что обстоятельства, при которых они с ними познакомились, очень остры лично для них
… глубоко запали мне в душу, потому что программировать я начал в 14, когда у меня действительно была глубокая депрессия и программирование до сих пор позволяет мне абстрагироваться от мира, от суеты и от людей, которые её создают — здесь всё логично, строго и никакого хаоса, кроме того, в котором повинен сам. Меньше
говнокодахаоса — больше умиротворения. Так что я полностью согласен с автором — культ инструмента действительно помогает не выгореть, не пропасть в депрессии и не сойти с ума, потому что работа с ним доставляет удовольствие
psycalc
16.01.2019 16:45-1Может попробовать собрать совместимых разработчиков, придумать интересный проект и на себя поработать. Можно дело в несовместимом коллективе? Может именно в этой не совместимости и есть суть профессионального выгорания? Может хочется над чем-то глобальным, своим работать? Проблема выгорания и человеческой несовместимости самое главная проблема. И вот походу ее решение psycalc.github.io
impwx
16.01.2019 16:55+2У вас получилась какая-то ложная дихотомия — либо «C# и уныние», либо «F# и процветание». И выходит как в известной картинке:
СпойлерStepan555
16.01.2019 19:00+1«Я часто критикую технологии, которые кажутся мне неправильными, и в ответ получаю… в морду»
На кого рассчитан этот текст? За 25 лет в ИТ передо мной сменились десятки технологий и сотни людей, и я ни разу не видел человека способного за критику технологий дать в морду. Автор переигрывает.
mAAriellla
16.01.2019 19:05Я начал карьеру как junior C# dev. Сырой тогда еще Xamarin, разработка под android. Первые шаги на первой работе были наполнены болью. Я в одиночку делал приложение по скриншотам и гифкам из iOS версии. Все билдилось через раз, проблем была куча, а единственный фидбек, который я получал — «а че не как на картинке?»
А кто-то, возможно, был бы счастлив так устроиться, но ему не предложат эту должность и он вынужден как в анекдоте: " A tester walks into a bar and orders a beer. Then he orders ten beers, negative one beer, zero beers "… и как-то же находят в себе силы люди этим заниматься и не месяц, не два а, например, несколько лет, десятки лет.
engine9
16.01.2019 19:59Для меня программирование это неведомый мир где общаются люди в серебристых одеждах на языках не похожих ни на один земной. Но очень интересно было следить за переживаниями автора. Хочется его спросить: автор, а что тебе нравится, что делает тебя счастливым? Какая деятельность?
mAAriellla
17.01.2019 12:01Если вы сами подтверждаете, что вы в программировании как в апельсинах, то что вы полезное можете сказать программисту с точки зрения специфики его работы? Зачем интересуетесь, и почему на ты? Вы не коллега, F# или D… для вас существует принципиальная разница, что в этом смысле приносит счастье человеку?
Szer
Та же история — C#, энтерпрайз, клин код, абстрактные фабрики синглтонов, вера в Фаулера, мрак, безысходность.
F# открыл для меня другой мир. Мир где всё логично (как матан) и просто (как LISP), но тем не менее функционально (во всех смыслах) и практично. И денег ещё за это платят больше чем за страдания на C#.
Чем ещё хорош F# — это практичный язык, который не претендует на звание чистого, как Хаскель. В нём можно наговнокодить как в C#! И ещё он примазался к одной из крупшейних экосистем — .Net, что сразу снимает кучу головняка, интеграции, SDK, драйвера, БД, ОРМы и пр. Azure и Visual Studio идут в придачу (мало кто из ФП языков может похвастаться поддержкой таких IDE и облака).
Но есть и минусы, самый большой связан с C# :) Он (C#) настолько хорош, то убедить бизнесы переходить с него — прям таки адски сложная задача. Стоит ли? Вопрос не праздный, ответа у меня нет, я-то уже перешёл и не испытываю проблем с поиском работы.
А вот существующему бизнесу на C# вряд ли оправдано бросаться в пучины F#.
Matisumi
> И денег ещё за это платят больше чем за страдания на C#.
Вот кстати очень редко вижу вакансии на F#, они вообще существуют в достаточном объеме?
Szer
Меня это немного смущало когда я на HH.ru не нашёл (2017) ни одной вакансии на F#, но резюме выложил. А звонки-то пошли! Из известных компаний где есть F# в РФ — Касперский и Microsoft. Звонили иногда из соображений — "F#? really?". Знающие работодатели хотели меня видеть у себя на C# позициях, но за большие деньги. В итоге я нашёл себе работу на чистом F#, хотя ни одной открытой вакансии в РФ на HH.ru на тот момент не было.
inv2004
А может есть какой-то транслятор F# => C#? Пишешь на F#, а на работу отдаёшь что требуют, понятно что иногда он возможно будет странно выглядеть, но всё же.
Szer
dotPeek :) Но качество трансляции не очень!
inv2004
надо улучшать! :)
AnutaU
А вот недавно обсуждали в одном чатике такую задачу: транслировать код из одного высокоуровневого языка в другой, при этом генерируя максимально идеоматичный результат. Дак вот, в общем случае это красиво сделать нельзя, всегда будут костыли и допущения, а F# и C# как раз сильно отличаются. Увы!
dmitry_dvm
Интересно, что внутри там одинаковый IL.
Рихтер в своей небезызвестной книге топит за то, что следует в одном проекте использовать разные языки по мере надобности и от этого одни плюсы.
PsyHaSTe
С одной стороны да.
С другой если есть кусок, написанный «Ф шарпистом», которого никто в команде не понимает, то автобусный коэффициент возрастает очень существенно.
Не считая времени на хлоивары «C# vs F#» на кухне, и различные взгляды на решение проблем «функциональный vs AdapterFacadeFactoryObserber»
vilinski
Тут есть, иногда работает: github.com/jindraivanek/cs2fs.
Но вообще не надо таким заниматься — чтобы поймать F# надо думать как F#! :) А этот тул, например, переводит один к одному, когда в F# есть много штук, которые делают тоже самое, но короче, надёжнее, читабельнее, итп.
Cerberuser
Нет, я так понял, речь об обратном шаге — писать "короче, надёжнее и читабельнее", а потом сконвертировать, чтобы начальство схавало.
Deosis
Примеры трансляции
Компилятор генерирует очень много бойлерплейта.
marshinov
Долго для самого себя искал аргументы, чтобы перейти с C# на F# в продакшн, но не нашел достаточного количества. Какие факторы стали решающими для вас?
Szer
Удачно опробовал F# на проекте с Akka.Net, но дальше меня внедрение языка не ушло)
Я не хотел полумер и стал целенаправленно искать работу на F#.
Оказалось что ее достаточно даже в РФ)
Как я уже говорил, готовому бизнесу нет смысла переходить. Специалистов немного, выгоды есть, но некритичные.
А вот захантить таких людей надо обязательно в любой проект на C#, они подтянут уровень кода и команды.
Я сейчас работаю в компании, которая начинала на F#. Думаю это единственный возможный вариант встретить энтерпрайз на этом языке.
nexmean
Но чистота очень даже практична. "Не практична" у хаскеля как раз сырая экосистема. Как язык хаскель всё же куда проще, понятнее и практичнее чем его "аналоги" из JVM и .Net мира.
Вон те же линзы, которые изобрели в хаскеле, ИМХО, самое практичное, что есть в программировании. На втором месте в моём топе практичности монады + tagless final, которые очень упрощают тестирование и переиспользование кода. Ленивость тоже практичная штука с точки зрения "писать декларативный код и заранее не париться об оптимизации".
Szer
Но монады не изобретение и не эксклюзив хаскеля. Как и таглесс. Как и линзы (которые вообще-то костыль для изменения вложенных иммутабельных структур, а никак не лучшее изобретение).
Линзы и монады есть и в F#. В виду отсутствия HKT это просто чуть менее удобно, но это с лихвой окупается экосистемой.
Нет, хаскель хорош. Для обучения тому самому ФП, голову сломать, мышление поменять. Работать на нём — нет спасибо, у меня семья)
nexmean
Линзы это не костыль а first-class аксессоры (на самом деле линзы это даже более общая штука), которые покрывают куда более широкий спектр задач. Например линзами можно удобно разбирать сложные JSON и XML, структура которых заранее не определена. Кроме этого можно обходить сложные структуры и делать в них довольно сложные изменения и иметь при этом простой и лаконичный код. Ну и банальное обращение через призмы проще, чем исользовать огромный паттерн-матчинг.
Насколько я знаю в шарпе нет трансформеров монад и уж тем более нельзя писать штуки вроде таких:
А это один из мощнейших инструментов для:
а) инверсии контроля, а соответственно тестирования и переиспользования кода
б) композиции разных алгебр в tagless final
в) контроля за эффектами по типу (поход в базу, запись в лог, генерация рандомного числа, етк)
Я бы не сказал, что это "просто чуть менее удобно".
Так не кто не говорит вам, что вы должны сейчас же бросить свою работу и идти искать работу на хаскеле. Более того, никто не говорит, что вы вообще хоть что-то должны. Я даже не говорю что хаскель в целом "практичен". Я говорю, что чистота, если абстрагироваться от конкретного состояния IT индустрии — штука вполне себе практичная, а стремление к чистоте не делает что-то непрактичным. Хаскель, например, непрактичным делает малое сообщество, недостаток качественных библиотек и тулинга.
Szer
Это всё от лукавого, гораздо проще разбирать неизвестные JSON и XML обычной динамикой, а не линзами. Вы не замечаете как Хаскель подсовывает вам заведомо более сложный и неудобный инструмент для простейшей задачи?
Я ж написал — HKT нет. И не уверен что будет.
Ещё в F# нет зав и лин типов. Хочется, конечно, но довольно редко.
А я бы именно так и сказал! Это действительно просто чуть менее удобно.
Например, Idris 2 Хаскелю насуёт по всем статьям, но что-то я не заметил чтобы хаскелисты бросили всё и на Идрис перешли массово) Хотя те же аргументы можно было применить и в обсуждении Haskell vs Idris.
Может кроме офигенных типов надо что-то ещё языку чтобы быть удобным?
Именно в этом мой поинт про семью и был. Вместо производства продукта, на Хаскеле я буду вынужден за 1 минуту нарисовать красивый хрустальный замок со всей мощью терката и оставшиеся 7ч59мин рабочего времени бороться с экосистемой. Я не люблю велосипеды, я не люблю кодить. Для меня это средство зарабатывания денег, поэтому чем меньше времени я трачу на решение задачи и доведения её до продакшна, тем больше времени у меня остаётся на личные дела.
0xd34df00d
Ну так насуёт. Библиотек действительно мало, пакетного менеджера нет (ipkg несерьёзно), баги в тайпчекере есть и немало.
Интереса ради, а в какой области вы занимаетесь? А то я бы не сказал, что я испытываю какой-то недостаток библиотек в хаскеле. Даже наоборот, хочешь что-то этакое запилить — а оно уже, блин, сделано :(
Szer
Я слишком общо сказал про "по всем статьям". Я имел в виду только систему типов и всякие мозговзрывные вещи. Как хасель умеет в монад трансформер по сравнению с F#, так и Идрис умеет много чего по сравнению с Хаскелем.
облачные микросервисы, ETL.
На прошлой работе Azure, на новой тоже Azure.
У F# фора — все SDK для Azure уже написаны)
Portnov
внезапно, hackage.haskell.org/packages/search?terms=azure (8 items). Большинство, правда, давно не обновлялось, но по-моему тут уже эффект положительной обратной связи: если бы на хаскеле писало больше народу, то библиотеки к ажуре обновлялись бы почаще.
ЗЫ: про amazon вон 180 items, включая обновлявшиеся совсем недавно.
Szer
Ясно же что этого недостаточно. там только способов аутентификации в облаке с десяток. Managed ID, AD, Azure AD, OAuth, ApiKey и пр… Видов сервисов несколько сотен, а тут всего 8 либ.
Очевидно что для работы с Ажуром на Хаскеле мне придётся велосипедить не один месяц.
Szer
3050 пакетов
https://www.nuget.org/packages?q=azure
1109 пакетов
https://www.nuget.org/packages?q=aws
Экосистема всё ж не пустой звук.
develop7
ага, я в руби уже насмотрелся на миллиарды Готовых Библиотек (которые между собой не компонуются без существенного переписывания)
0xd34df00d
А, ну это такое. ИМХО профит от перехода с F# на х-ль куда выше, чем с х-ля на идрис. Особенно с DataKinds, TypeInType и вот этим всем.
А, ясно. Я с облачками вообще не работаю просто. Мне вот какого-нибудь хупла, fgl или, не знаю, geniplate не хватать будет, думаю.
0xd34df00d
А что в ней сырого? ghc — компилятор вполне себе продакшен-качества (например, на баги в gcc или clang я натыкаюсь сильно чаще). stack тоже к продакшену готов и, судя по дискуссиям, местами даже превосходит то, что есть в других языках. Профилирование кода есть. С тестированием всё просто шикарнейше. Библиотеки — ну, смотря для какой области. Для статистики R вон до сих пор уделывает всех, и ничего, никто ж не говорит, что все остальные языки не готовы.
CuteDog
мне C# просто лёг на душу, красивый, интуитивно понятный и куда приятнее после дельфи.
ganqqwerty
По-моему, он даже после Джавы приятнее
ganqqwerty
Ой, а для тех, кто в танке — «точечка нет» за пределы винды вышла в промышленных масштабах?
Szer
Я для винды уже пару лет ничего не писал, всё кросс платформенное.
Даже не задумывался о "пределах винды", оно просто уже давно по умолчанию такое, вне виндовое.
VanquisherWinbringer
Asp.net core Xamarin и Unity давно запределами винды работают.