【问题标题】:Should I choose F# to develop a distributed server platform? [closed]我应该选择 F# 来开发分布式服务器平台吗? [关闭]
【发布时间】:2011-03-02 19:42:03
【问题描述】:

我目前正处于一个新的分布式服务器框架的研究阶段,该框架将用于实时模拟(超过 20,000 个客户端)。我们已经决定使用 C#/.NET 作为我们的平台,但是最近有人给我发了一些关于 F# 的文章,从表面上看,它看起来是一个用于开发服务器的好工具。我正在寻找使用 F# 解决大型现实世界问题的人的一些想法。

  • F# 是一个很好的工具吗?

  • 有哪些陷阱?我们正在处理大量交互消息和大量不断变化的状态,尽管它们可能存在于某种数据库云中。函数式编程似乎在处理大规模并行和分布式计算方面表现出色,但似乎不鼓励更改任何类型的状态。

  • F# 会继续存在吗?我担心它是如此新,我不想将自己束缚在一个垂死的平台上(J# 有人吗?)......

  • 是否存在使用 F# 的大型现实世界解决方案(最好是服务器)?

  • F# 是否适用于大型工程师团队?我确信答案很简单,但是我对语言/工具仍然非常陌生。

感谢您的宝贵时间。

【问题讨论】:

  • 我对 F# 一无所知,但是将任何相对较新的平台(尤其是您不熟悉的平台)用于您真正期望的项目似乎是愚蠢的(相当冒险)把事情做好。例如,我很想深入研究 scala,对于个人项目,我会的。但是对于工作中的项目,我将坚持使用经过验证且我熟悉的东西(在我的例子中是 java)。
  • Kevin - 我同意你的观点,在大多数情况下不会考虑这个。但是,我们正处于研发阶段,只要潜在回报大于风险,我就可以侥幸逃脱。
  • 去吧,卡尔!我已经使用 F# 几年了,与 C# 相比没有遇到任何限制。至少可以为您的开发人员节省大量打字时间。
  • FWIW - 我宁愿在 F# 中编写程序化、OO 代码。我认为 C# 是类定义的死亡。
  • 有关使用证据,您可以查看开发中心右侧栏中新的“企业中的 F#”部分:msdn.microsoft.com/en-us/fsharp

标签: f#


【解决方案1】:

在过去的 7 个月里,我用 F# 开发了一个大型现实世界的高并发服务器。我不能给你确切的细节,但这是my company 有史以来最大的咨询合同。

我正在寻找使用 F# 解决大型现实世界问题的人的一些想法。 F# 是一个很好的工具吗?

是的。我在 F# 中开发最终的商业产品没有问题(我做到了 herehere),但我们的客户通常对使用 F# 进行快速原型制作印象深刻。例如,我最近发现了一份公司内部文档,其中引用了 3 个人月来实现 C++ 中的一项功能,而我用 F# 花了 4 个小时!

有什么陷阱?

该语言有一些怪癖,但我遇到的唯一主要问题(使我的工作受阻数周)是bugs in .NET 以及对 Windows 上的 Infiniband 驱动程序的支持不佳,这两者都与 F# 没有任何关系。我在 F# 库中遇到了一些与错误有关的小问题(例如,TryScan 已损坏),但一旦我找出问题所在,它们就很容易解决。 F# 团队一直非常擅长提供支持和接受建议。

另外,请注意,我是业内少数几个率先使用这项技术的人之一,因此我希望您遇到的问题比我少,并且会更快地解决它们,因为我们已经为您解决了这些问题!

我们正在处理大量交互消息和大量不断变化的状态,尽管它们可能存在于某种数据库云中。函数式编程似乎在处理大规模并行和分布式计算方面表现出色,但似乎不鼓励更改任何类型的状态。

这是一个常见的误解。实际上,几乎所有函数式编程语言(例如 Lisp、Scheme、Clojure、Scala、Standard ML、OCaml、F#、Erlang)都是不纯的,并且依赖于不受控制的副作用。 Haskell 是唯一幸存的纯函数式语言,它完全无关紧要。

在实践中,F# 的生产力优势更多地与类型推断、模式匹配和变体类型(来自 ML 语言家族)以及异步工作流、邮箱处理器、序列表达式、互操作性等其他功能有关。

F# 会继续存在吗?我担心它是如此新,我不想将自己束缚在一个垂死的平台上(J# 有人吗?)......

我们使用 F# 已有 4 年了,而且它还在不断发展壮大。我认为它不太可能很快消亡,尤其是因为微软在内部很好地利用了 F#。例如,F# share of UK job market just tripled in only four months

是否有使用 F# 的大型现实世界解决方案(最好是服务器)?

是的,很多。微软继续在 Bing AdCenter 和 Halo 3 中使用它,而 E-ON、Grange 和瑞士信贷等其他公司似乎已经用它构建了大量系统。我怀疑还有很多人像我们的客户一样秘密使用它。

F# 是否适用于大型工程师团队?我相信这个问题的答案很简单,但是我对语言/工具仍然很陌生。

如果您指的是大型 F# 程序员团队,那么我不知道:我只曾在最多 4 人的团队中使用过这类语言。

如果您的意思是如何将 F# 引入大型团队工作的一部分,我可以将我的客户用作案例研究。 2 年前他们没有 F#。今天,效率最高的两个团队都在使用 F#,他们正在解决在公司引入 F# 之前被认为无法解决的问题。经常使用 F# 的人数从两年前的一个人逐渐增加到今天的两打左右。他们已经停止招聘 C++ 开发人员,并开始要求新员工具备 F# 基础知识。

虽然存在不可避免的政治问题。我的生产力引起了整个公司的关注,管理层开始质疑为什么我的成本效益如此之高,这给使用主流语言(C++ 和 C#)的团队带来了很大压力。因此,我们现在受到抨击,并失去了公司内部的支持,因为我们让别人看起来很糟糕。周五我被指示放慢速度,以免让太多人看起来很糟糕!所以我现在被分配到多个项目并在那里重复这个“成功”。 ;-)

【讨论】:

  • 正是我想要的。谢谢。
  • 没问题。顺便说一句,我与这里最大的 F# 团队的负责人讨论了这个问题,他说他更关心他们对 Rx 的使用,而不是 F#,而且事实证明 Silverlight 比 F# 更麻烦。总的来说,F# 在这里被认为是一个巨大的胜利。我们还有两个新项目使用它来制作潜在产品的原型,以评估商业可行性。祝你好运!
【解决方案2】:

我将停止评论并正式发表我的观点。我不会讨论函数式编程、不变性、易于并行性等的好处,因为在 SO 的其他地方已经很好地涵盖了这一点。即使您不了解函数式编程的第一件事,并且打算编写过程式、OO、C#-ish 代码,我仍然会推荐 F#。

C#

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
    //...

并且大多数语法差异都遵循相似的路线。您可以在 F# 中编写 C#-ish 代码,然后慢慢融入功能特性,并在此过程中学习。一段时间后,您不仅会了解一门新语言,还会了解一种思考编程问题的新方法。与此同时,我怀疑你的工作效率会更高。

【讨论】:

  • 同意,尽管缺少breakcontinue 会使大多数命令式程序员望而却步。
  • @ildjarn - 这就是 F# 慢慢开始吸引你的地方。接下来你知道你是一个 monad 工厂。
  • @ildjarn:如果你需要breakcontinue,你想得太迫切了。我已经使用 F# 几年了,从来不需要从循环中提前返回,而且很少(如果有的话)需要写 for x in y do ...
  • @Juliet :我在回复“您可以在 F# 中编写 C#-ish 代码并慢慢融入功能特性,并在此过程中学习”,这表明我认为 C# 程序员的唯一障碍缺少breakcontinue当然不会想得太急迫。 ;-]
  • type Person = {name:string; age: int} 怎么样? :-)
【解决方案3】:

其他需要考虑的事情是找到足够多的了解 F# 的开发人员来组建一个庞大的工程师团队。由于它是一门新语言,这可能是最困难的部分。

【讨论】:

  • +1,好点。我们的系统工程师的“加速”时间应计入总风险/成本中。
  • 让一两个更好的工程师在Try F# Tutorials 上花费几个小时。当他们完成时,他们将掌握语法的核心。一些功能概念需要更长的时间才能完全理解,但这不是火箭手术。如果您的一些人首先熟悉该语言,您将更好地估计“加速”时间。
  • @Joel Mueller “火箭手术”——喜欢它。
【解决方案4】:

请阅读:F# in the enterprise

这是一篇关于 F# 实际使用的好处和案例研究的论文(刚刚发表)。 学习了这门语言后,不得不回到 C# 有点累。 我会为这样的项目推动 F#,但我可能会遇到一些阻力。 :)

【讨论】:

    【解决方案5】:

    其他人已经回答了关于 F# 的一般性问题以及关于在 F# 中开发通常的面向对象系统的大部分问题。我将添加一些关于分布式服务器端编程的具体内容。

    • 在 F# 中,您可以使用代理(又名 MailboxProcessor)来构建您的程序。我在伦敦有一个talk about agents at F# user group,所以你可以在那里找到一些有用的资源。 F# 中的代理不会自动支持通过网络进行通信,但您可以实现它(作为代理)。然而,它们是构建并发应用程序和分离关注点的好方法。

    • F# 已经支持异步工作流 - 这对于编写处理大量客户端而不阻塞线程的应用程序至关重要。如果您不想等待 C# 5(它正在获得受 F# 启发的功能),那么 F# 是编写异步代码的唯一选择。

    • F# 拥有一个活跃的社区,在伦敦、纽约和其他地方拥有大量用户群。有不少金融公司在使用 F#(据我所知,有些公司也在使用或考虑使用代理)。 Host-tracker.com 是一个用 F# 编写的大型服务器端应用程序(参见他们的job-posting

    【讨论】:

      【解决方案6】:

      您还可以在俄亥俄州哥伦布市找到有关 Grange Insurance 的 case study,这是一本好书。我遇到了一位来自 Grange 的人,他对他们决定用 F# 编写代码感到非常高兴。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-25
        • 2016-10-12
        • 1970-01-01
        • 2011-03-04
        • 2011-05-29
        • 1970-01-01
        • 1970-01-01
        • 2017-07-20
        相关资源
        最近更新 更多