Должен ли я выбрать F # для разработки распределенной серверной платформы?

В настоящее время я участвую в исследовательской фазе новой распределенной серверной среды, которая будет использоваться для моделирования в реальном времени (20 000 клиентов). Мы приняли решение использовать С#/.NET как нашу платформу, но кто-то недавно передал мне несколько статей о F #, и с поверхности это выглядит как отличный инструмент для разработки сервера. Я ищу некоторые мысли от кого-то, кто использовал F # для решения больших, реальных проблем, проблем.

  • Является ли F # хорошим инструментом для этого?

  • Каковы подводные камни? Мы имеем дело с множеством взаимодействующих сообщений и с большим изменением состояния, хотя это, вероятно, будет жить в облаке DB. Функциональное программирование, похоже, светит при работе с массивными parallelism и распределенными вычислениями, но, похоже, препятствует изменению любого состояния.

  • Будет ли F # придерживаться? Это касается меня, что это так ново, и я не хочу привязываться к умирающей платформе (J # кто-нибудь?)...

  • Существуют ли большие, реальные решения (предпочтительно серверы), которые используют F #?

  • Хорошо ли работает F # с большими командами инженеров? Я уверен, что ответ на этот вопрос прост, но я все еще очень незнакомый с языком/инструментами.

Спасибо за ваше время.

Ответы

Ответ 1

Я провел последние 7 месяцев, развивая большой реальный глобальный сервер в F #. Я не могу дать вам точные данные, но это самый крупный контракт на консультацию моя компания когда-либо приземлялся.

Я ищу некоторые мысли от кого-то, кто использовал F # для решения больших, реальных проблем, проблем. Является ли F # хорошим инструментом для этого?

Да. У меня нет проблем с разработкой конечных коммерческих продуктов в F # (я сделал это здесь и здесь), но наши клиенты часто очень впечатлены быстрым прототипированием с использованием F #. Например, недавно я нашел документ внутренней компании, который процитировал 3 человеко-месяца для реализации функции на С++, которая заняла у меня 4 часа с помощью F #!

Каковы подводные камни?

В языке есть некоторые причуды, но единственные серьезные проблемы, с которыми я столкнулся (которые заблокировали мою работу в течение нескольких недель), были ошибки в .NET и плохая поддержка драйверов Infiniband для Windows, ни одна из которых не имела ничего общего с F #. У меня были некоторые незначительные проблемы с ошибками в библиотеках F # (например, TryScan), но они были легко работать, как только я выяснил, в чем проблема. Команда F # всегда была очень хороша в предоставлении поддержки и принятии предложений.

Кроме того, обратите внимание, что я являюсь одним из немногих людей, которые впервые использовали эту технологию в промышленности, поэтому я ожидаю, что вы столкнетесь с меньшим количеством проблем, чем я, и решит их быстрее, потому что мы уже решили их для вас!

Мы имеем дело с множеством взаимодействующих сообщений и с большим изменением состояния, хотя это, скорее всего, будет жить в облаке DB. Функциональное программирование, похоже, светит при работе с массивными parallelism и распределенными вычислениями, но, похоже, препятствует изменению любого состояния.

Это распространенное заблуждение. В действительности почти все языки функционального программирования (например, Lisp, схема, Clojure, Scala, стандартный ML, OCaml, F #, Erlang) нечисты и полагаются на неконтролируемые побочные эффекты. Haskell - единственный сохранившийся чисто функциональный язык, и он совершенно не имеет значения.

На практике преимущества F # производительности больше связаны с выводами типов, сопоставлением типов и вариантами (из семейств языков ML) и другими функциями, такими как асинхронные рабочие процессы, процессоры почтовых ящиков, выражения последовательности, интероперабельность и так далее.

Будет ли F # придерживаться? Это касается меня, что это так ново, и я не хочу привязываться к умирающей платформе (J # кто-нибудь?)...

Мы используем F # в течение 4 лет, и он продолжает идти от силы к силе. Я думаю, что очень маловероятно умереть в ближайшее время, не в последнюю очередь потому, что Microsoft делает такое использование F # внутренне. Например, доля F # на рынке труда в Великобритании только утроилась всего за четыре месяца.

Существуют ли большие, реальные решения (предпочтительно серверы), которые используют F #?

Да, многие. Microsoft продолжает использовать его в Bing AdCenter и Halo 3, а другие компании, такие как E-ON, Grange и Credit Suisse, похоже, создали с ней существенные системы. Я подозреваю, что еще десятки используют его в тайне, как это делает наш клиент.

Хорошо ли работает F # с большими командами инженеров? Я уверен, что ответ на этот вопрос прост, но я все еще очень незнакома с языком/инструментами.

Если вы имеете в виду большие команды программистов F #, то я не знаю: я только когда-либо работал в группах до 4 человек, использующих эти языки.

Если вы имеете в виду, как введение F # в часть большой команды работает, я могу использовать своего клиента в качестве примера. У них не было F # 2 года назад. Сегодня две лучшие из наиболее результативных команд используют F #, и они решают проблемы, которые считались неразрешимыми до введения F # в компании. Количество людей, регулярно использующих F #, постепенно увеличивалось с одного человека два года назад примерно до двух десятков человек. Они прекратили нанимать разработчиков на С++ и начали требовать от F # базовых знаний для новых сотрудников.

Однако есть неизбежные политические проблемы. Моя производительность подняла брови по всей компании, и руководство начало задавать вопрос, почему я гораздо более экономически эффективен, оказывая большое давление на команды, использующие основные языки (С++ и С#). Следовательно, сейчас мы находимся под огнем и теряем бай-ин внутри компании, потому что мы заставляем других выглядеть плохо. Я был проинструктирован в пятницу, чтобы замедлить, чтобы избежать слишком многого, чтобы люди выглядели плохо! Поэтому я теперь назначен на несколько проектов и повторяю этот "успех".; -)

Ответ 2

Я перестану комментировать и сделаю свое настроение официальным. Я не собираюсь использовать преимущества функционального программирования, неизменности, простоты parallelism и т.д., Потому что эта земля хорошо покрыта в других местах на SO. Даже если вы не знаете в первую очередь функциональное программирование и собираетесь писать процедурный код OO, С# -ish, я бы по-прежнему рекомендовал F #.

С#

public class Person {
    private readonly string _name;
    private readonly int _age;

    public Person(string name, int age) {
        _name = name;
        _age = age;
    }

    public string Name {
        get { return _name; }
    }

    public int Age {
        get { return _age; }
    }
}

F #

type Person(name, age) =
    member this.Name = name
    member this.Age = age

Я думаю, что любой может легко перейти от:

foreach (var item in items) {
    //...
}

в

for item in items do
    //...

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

Ответ 3

Что-то еще, чтобы рассмотреть, было бы найти достаточно разработчиков, которые знают F #, чтобы создать большую команду инженеров. Поскольку это новый язык, это может быть самая сложная часть.

Ответ 4

Прочитайте это: F # на предприятии

Это документ (только что опубликованный) о преимуществах и тематических исследованиях из реального использования F #. Изучив язык, он становится утомительным, чтобы вернуться на С#. Я бы нажал на F # для такого проекта, но я, вероятно, столкнулся с некоторым сопротивлением.:)

Ответ 5

Другие уже ответили на большинство вопросов, касающихся F # в целом, и о разработке обычных объектно-ориентированных систем в F #. Я добавлю несколько конкретных вещей о распределенном программировании на стороне сервера.

  • В F # вы можете использовать агенты (aka MailboxProcessor) для структурирования ваших программ. У меня был разговор о агентах в группе пользователей F # в Лондоне, поэтому вы можете найти там некоторые полезные ресурсы. Агенты в F # не поддерживают автоматическую связь через сеть, но вы можете реализовать это (как агент). Тем не менее, они являются отличным способом структурирования параллельных приложений, а также отдельных проблем.

  • F # поддерживает асинхронные рабочие процессы уже - это важно для написания приложений, которые обрабатывают большое количество клиентов без блокировки потоков. Если вы не хотите ждать С# 5 (который получает функцию, вдохновленную F #), то F # является единственным вариантом для написания асинхронного кода.

  • F # имеет оживленное сообщество с большими группами пользователей в Лондоне, Нью-Йорке и в других местах. Есть немало компаний-финалистов, использующих F # (насколько я знаю, некоторые используют или думают об использовании агентов тоже). Host-tracker.com - это большое приложение на стороне сервера, написанное в F # (см. job-posting)

Ответ 6

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