我应该选择F#来开发分布式服务器平台吗?

时间:2011-03-02 19:42:03

标签: f#

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

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

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

  • F#会坚持下去吗?我担心它是如此新颖,我不想把自己绑在一个垂死的平台上(J#有人吗?)......

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

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

感谢您的时间。

6 个答案:

答案 0 :(得分:16)

过去7个月我在F#中开发了一个大型真实世界的大量并发服务器。我无法向您提供准确的详细信息,但这是my company迄今为止最大的咨询合同。

  

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

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

  

有哪些陷阱?

语言中有一些怪癖,但我遇到的唯一主要问题(阻止我的工作数周)是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和Credit Suisse似乎已经用它构建了大量的系统。我怀疑还有几十个人在我们的客户那里秘密使用它。

  

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

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

如果您的意思是如何将F#引入大型团队的一部分,我可以将我的客户端用作案例研究。他们在2年前没有F#。今天,排名前两位最具生产力的团队都使用F#,他们正在解决在公司引入F#之前无法解决的问题。经常使用F#的人数从两年前的一个人逐渐增加到今天的二十几人。他们已经停止雇用C ++开发人员,并开始要求F#作为新员工的基本知识。

但是存在不可避免的政治问题。我的工作效率引起了整个公司的注意,管理层开始质疑为什么我更具成本效益,给使用主流语言(C ++和C#)的团队施加了很大的压力。因此,我们现在受到抨击并且在公司内部失去了支持,因为我们让其他人看起来很糟糕。星期五我被指示放慢速度以避免让太多人看起来很糟糕!所以我现在被分配到多个项目,并在那里重复这个“成功”。 ; - )

答案 1 :(得分:11)

我会停止发表评论并使我的情绪正式化。我不打算从功能编程,不变性,易于并行等方面获益,因为在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代码,然后慢慢进入功能特性,一路学习。一段时间后,您不仅会知道一种新语言,还会想到一种思考编程问题的新方法。与此同时,我怀疑你会更富有成效。

答案 2 :(得分:9)

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

答案 3 :(得分:7)

请阅读:F# in the enterprise

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

答案 4 :(得分:6)

其他人已经回答了大部分有关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

答案 5 :(得分:4)

你也可以在俄亥俄州哥伦布找到关于格兰奇保险的case study这是一件好事。我遇到了一位来自Grange的人,他对他们决定用F#编写代码感到非常高兴。