.NET
C#
F#
September 2018 26

Зачем изучать непопулярные языки. Пример сообщества F#



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

В разработке хорошие технологии тоже не всегда становятся массовыми. Например, F#. Все что я о нем знаю — это дико крутой, но совершенно непопулярный язык, после которого разработчики уже не могут просто так возвращаться к своим привычным языкам.

Я попытался узнать, в чем причина. И вообще — кто те люди, которые на нем пишут, и зачем они это делают, если язык не нужен бизнесу? Для этого я постучался поговорить в русскоязычное сообщество F# в «Телеграме». Здесь — наш круглый стол.

С чего начали изучать F#


Айрат Худайгулов (Szer): Я сам выходец из C#. Была у нас работа связанная с Akka.NET, которая портирована с Akka на Scala. Порт отличный, но к редким кейсам документации не было примеров, они всегда были в Scala-доке. Когда я читал эту доку, в голову лезли одни вопросы — почему в Scala всё записывается в пару строчек, а я страдаю на C#?

Выход был найден — F#. С тех пор и не слез.

Роман Лиман (kagetoki): Оказалось — это мощный инструмент для решения вполне реальных будничных проблем любого программиста. Те трудности, что считалось нормой и неизбежностью в ООП мире C# и Java, неизбежными вовсе не являются, и их можно легко предотвратить вместо того, чтобы превозмогать.

Фил Ранжин (fillpackart): Как-то на Хабре я прочитал большое интервью с Вагифом Абиловым. На тот момент я совсем не понимал функциональной парадигмы программирования, и любая информация о ней меня серьёзно раздражала. Так и то интервью.

Вагиф Абилов (VagifAbilov): Тот материал можно почитать здесь. Это было вскоре после моего выступления на московской конференции DotNext. Если в двух словах, то я начал изучать F# из желания писать более компактный код (меньше кода — меньше зла) и работать с неизменяемыми структурами данных. Конечно, никто не мешает программисту на C# или Java определять свои структуры данных как неизменяемые, но в основе языков, реализующих ООП, лежит возможность мутаций структур данных, и эта возможность никуда из этих языков не уйдет. Функциональное программирование позволяет не тратить усилия на защиту данных от некорректного изменения в многопоточной среде — данные сами о себе позаботятся, они неизменяемы.

Фил Ранжин: Вагиф всё говорил, что после церемониальных C# и Java, F# казался чем-то намного более подходящим для разработки. Я тогда не знал, кто такой Вагиф, но, естественно, сразу решил для себя, что ничего он не понимает. C# не церемониальный, C# именно такой, какой и должен быть. Мощный и красивый. Решил написать статью про то, какое всё-таки функциональное программирование нелепое. Взял простую задачу, и стал имплементить её на C# и F#, чтобы проиллюстрировать свою правоту. F# в процессе мне зашёл настолько, что статью я дописывать не стал. Я стал изучать эту технологию.

Роман Лиман: Многие вещи, которые в C# проверяются в рантайме, теперь перекочевали в компайл-тайм, так что ощущения словно впервые попробовал статическую типизацию — прям откровение снизошло.

Там, где на F# вам понадобится семь строк кода, на C# эквивалентный код развернется на 200–300, без преувеличения (и это считая только полезный код). Компилятор сам генерирует кучу бойлерплейта за вас, например, structural equality.

Фил Ранжин: Я ещё ни разу не дебажил F# код, потому что в моём F# коде все баги ловятся на этапе компиляции. Я не шучу.

Тяжело ли изучать F#


Роман Лиман: Насколько тяжело изучать? По мне вообще не тяжело. Единственное, в начале туговато идет, если впервые сталкиваешься с функциональной парадигмой и иммутабельными типами. Но это проблема не смены языка, а смены парадигмы.

Синтаксис поначалу не очевиден, так что браваду лучше оставить в стороне и почитать про язык, а не надеяться, что знаний C# хватит с головой.

Айрат Худайгулов: F# поддерживает всё, что есть в C# кроме goto (язык полностью expression-based, сделать императивный переход в вычисляемом выражении было бы странно) и ключевого слова protected (это by design, т.к. сделать его очевидно несложно). Всё остальное, любимое нами ООП — абстрактные классы, интерфейсы, авто проперти, юзинги, трай-кетчи — конечно есть. Для любителей посчитать байты тоже всё есть: ref/out параметры, мутабельность, спаны, unmanaged, pointers, stackalloc.

Все фичи в C# приходят с лагом в пару лет по сравнению с F# (дженерики, async/await + task, LINQ, паттерн матчинг и многое другое). А многие фичи вообще сомневаюсь, что когда-либо заедут (sum types в лице discriminated unions, нативный function currying). В свежий C# 8.0 обещают завезти рекорды и рекурсивный паттерн матчинг. Внимание вопрос — зачем ждать?

И другой вопрос: а зачем учить новый язык чтобы писать на нём точно так же? Чтобы получать преимущества которые даёт F#, но не даёт C#, придётся понять и другую сторону Силы. И это непросто.

Джон Доу: Как C# девелопер благодарен создателям F# за дженерики и асинхронность с человеческим лицом в C#. Если кто не знает, эти мегафичи появились в C# благодаря F#.

Вагиф Абилов: В известной книге «Прагматичный программист» разработчикам советуют каждый год изучать новый язык программирования. Не могу похвастать, что следую этому совету в точности, но главное, по-моему, что хотели им сказать авторы — программист постоянно должен быть готовым к пересмотру принципов написания своих программ.

Многие вообще слишком носятся с языками программирования, как жизненным кредо. Если перешел с Java на Clojure, порой отнесутся, как если бы христианин принял ислам. Почему, собственно, такое внимание? Изучение новых языков программирования зачастую позволяет переосмыслить наши привычки работы со старыми языками. Познакомившиеся с F# пишут на C# по-другому.

Роман Мельников (neftedollar): В F# ООП правильнее (хотя полностью совместимо с ООП в C#) т.к. подталкивает программировать на абстракциях-интерфейсах, вместо явных классов.

Что думают про создателей языка


Николай Матюшин: Однажды я поспособствовал поддержке тайп провайдеров на .NET Core. Довольно долгое время они не работали, и мы с одним человеком из русскоязычного сообщества решили разобраться, в чём беда. Поковырялись, увидели, что в .NET Core нет функции, которая сохраняет assembly (объект) в файл — эта функция использовалась провайдерами.

Мы потратили одну или две недели на прототип, который это делал. Получился жуткий костыль, но частично работающий. Всё это время общались в issue на гитхабе, а потом пришёл Дон Сайм, написал «Few hours of work», и починил тайп провайдеры.

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

Роман Лиман: Сайм — гений. Поразительно, но он создал всю эту красоту чуть ли не в одиночку.

Павел Смирнов: Он мой программистский кумир.

Айрат Худайгулов: Дон Сайм между прочим впилил дженерики в .NET, иначе сидели бы мы на C# и хардкастили всё из object и обратно, как это было (и частично есть) в Java. Сайм развивает язык с оглядкой на C#, на совместимость с его новыми фичами, что наверное стратегически правильно. Но это означает что отголосок плохих решений в С# может попасть и в F#. Также он против введения «заумных» ФП-фич (привет Scala), и переусложения языка, т.к. они могут отпугнуть других людей и раздуть стандартную либу (привет C++).

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

Почему язык не популярен


Роман Лиман: Язык не популярен, на мой взгляд, потому что в целом ФП менее популярно, чем ООП. Плюс, есть порог вхождения. А дальше — уловка 22. Проекты на F# не пишут, потому что программистов на рынке мало, а программисты не учат этот язык, потому что проектов на рынке нет.

Фил Ранжин: Я не знаю людей, которые практиковали бы функциональное программирование, но предпочитали бы объектно-ориентированное. Тут F# особенно не повезло — он подходит только тем, кто верит в симбиоз этих парадигм.

Павел Смирнов: Многие считали его мертворождённым из-за политики Microsoft — F# был всего лишь площадкой для обыгрывания фичей для C#. Но язык изначально позиционировался скорее для data science, чем для промышленной разработки.

Роман Мельников: Решарпер. Для C# это важная тема, и многие уже на него потратились. Без решарпера на C# писать больновато, нужно много ручками прописывать, типа подсветки аллокаций. И решарпер убирает кучу боли сишарперов. В F# этой боли нет, но те, у кого есть решарпер, не могут оценить все прелести языка, не полагающегося на тулинг.

Вагиф Абилов: На мой взгляд, причина отставания от успехов Scala лежит в доминировании Майкрософт, которая по-прежнему определяет, что является приоритетным на платформе Windows. При том, что F# разработан в Microsoft Research, он всегда позиционировался компанией как язык для энтузиастов. У Майкрософт есть метрики, показывающие экономическую обоснованность развития той или иной технологии в зависимости от текущих продаж, и разумеется, какой-нибудь SharePoint согласно этим метрикам выглядит более привлекательным, чем F#. Но капля камень точит.

Фил Ранжин: Я верю, что он выстрелит. Вся мощь .NET в паре с самым современным синтаксисом и самым идиоматичным подходом в истории не могут не выстрелить.

Роман Мельников: Перспективы потрясающие. F# постепенно заходит в анализ данных, благодаря провайдерам типов, например. Есть компиляторы в js и волшебная библиотека elmish (по сути Elm для .NET).

Мигель Де Иказа активно поддерживает F#, и в Xamarin его поддержка всегда была как у C#. Есть компилятор в ErlangCore, что тоже дико круто. На F# можно писать полностью бэкенд и фронтенд. SAFE-Stack чумовая вещь, с типизированными вызовами api, крутыми обертками поверх вебсокетов (Elmish.Bridge) и кучей еще всего.

Вагиф Абилов: Очень радует, что удается применять F#. Я работаю в проекте норвежского телерадиовещания, наша система закачивает в “облако” медиафайлы телевизионных и радиопрограмм, чтобы сделать их доступными для просмотра и прослушивания с компьютеров и мобильных устройств. Система написана на F# и использует Akka.NET. Это не единственный проект в нашей организации, где используется F#, и что особенно радует, это что число таких проектов растет, как и число разработчиков, готовых перейти на этот язык.

Для чего подходит F#


Фил Ранжин: F# идеально ложится на разработку ИИ. Этот язык буквально сделан, чтобы абстрагировать меня от сложностей и сосредоточиться на главном. Когда делаешь ИИ, твоя задача отмапить свой образ мышления на поведение машины. В таких кейсах код — ваш промежуточный язык, который не способен выразить слишком сложные вещи. Вот F# способен быть настолько абстрактным, что бы не мешать тебе и твоей машине творить историю.

Вагиф Абилов: Он применим к любым задачам, а ложится особенно хорошо на задачи доменного моделирования. В прошлогоднем интервью на Хабре я неосмотрительно сказал, что функциональные языки в большей степени применимы к алгоритмам и бэкенду, и в меньшей — к программированию интерфейса пользователя и веб-страниц.

Мне тогда в комментариях кто-то заметил, что есть такой функциональный язык Elm, который специально написан для программирования веб-страниц. Комментатор был совершенно прав. Я с тех пор начался пользоваться Fable, который позволяет писать веб-аппликации на F#, компилируя их в JavaScript. Потрясающие впечатления, комбинация F# + Fable (и еще библиотека Fable-Elmish) открывают доступ к веб-программированию для таких ничего не понимающих в CSS разработчиков, как я.

Павел Сирнов: Data driven development — лаконичный ФП язык, поддерживающий Type Providers. Actor model — MailboxProcessor в стандартной библиотеке это сказка.

Роман Мельников: Отлично решает задачи веба, интегрируется с react-компонентами. Решаются задачи анализа данных и машинного обучения (fslab.org), задачи ETL, задачи по проектированию бизнес логики — система типов позволяет писать так, чтоб неправильных состояний не было.
Потрясающе решаются задачи парсинга (Fparsec). Отлично подходит для написания своих языков. Тот же TypeScript изначально был написан на F#. Пишется код для GPU.
Сам я пишу на нем скрипты fsx вместо баш и пайтона для свой машины.

Да, под микроконтроллеры на нем не попишешь. Но думаю достаточно многие люди могут и без этого обойтись.

Где брать информацию


Книги



Интернет



Телеграм


  • fsharp_news
  • fsharp_chat

Пара слов о сообществе


Роман Лиман: Сообщество классное, всех объединяет желание писать на F# за деньги, поэтому всем новичкам сильно помогают, чтобы увеличить коммьюнити, повысив шансы найти работу.

Фил Ранжин: Опасные сектанты. Но они правы.

Павел Смирнов: Русскоязычное сообщество F# весьма уютное место. Больше всего нравится, что они неравнодушны к своему языку, также как это бывает в других более известных экосистемах.

Николай Матюшин: Может быть в силу того, что язык не сильно популярен, и токсичные люди не задерживаются.

Роман Мельников: Бывают свои драмы не влияющие на язык. Но жизнь делают интереснее.
+34
21.5k 114
Support the author
Comments 164
Top of the day