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

Kar*_*ngs 14 f#

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

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

  • 有什么陷阱?我们正在处理大量交互消息和大量更改状态,尽管这可能存在于某种类型的数据库云中.功能编程似乎在处理大规模并行和分布式计算方面有所突出,但似乎不鼓励改变任何类型的状态.

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

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

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

感谢您的时间.

Jon*_*rop 16

过去7个月我在F#中开发了一个大型真实世界的大量并发服务器.我不能给你准确的细节,但这是我公司有史以来最大的咨询合同.

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

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

有什么陷阱?

语言中有一些怪癖,但我遇到的唯一主要问题(阻止我的工作数周)是.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#份额仅在四个月内增长了两倍.

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

是的,很多.微软继续在Bing AdCenter和Halo 3中使用它,其他公司如E-ON,Grange和Credit Suisse似乎已经用它构建了大量的系统.我怀疑我们的客户会秘密使用它.

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

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

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

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


Dan*_*iel 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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

F#

type Person(name, age) =
    member this.Name = name
    member this.Age = age
Run Code Online (Sandbox Code Playgroud)

我想任何人都可以轻易地从:

foreach (var item in items) {
    //...
}
Run Code Online (Sandbox Code Playgroud)

至:

for item in items do
    //...
Run Code Online (Sandbox Code Playgroud)

并且大多数句法差异都是类似的.您可以在F#中编写C#-ish代码,然后慢慢进入功能特性,一路学习.一段时间后,您不仅会知道一种新语言,还会想到一种考虑编程问题的新方法.与此同时,我怀疑你会更富有成效.

  • 怎么样'type Person = {name:string; age:int}`?:-) (4认同)

Fls*_*Zen 9

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

  • 让一两个优秀的工程师在[试用F#教程](http://tryfsharporg.cloudapp.net/Tutorials.aspx)上花费几个小时.当它们完成时,它们将具有语法的核心.一些功能概念需要更长时间才能完全克服,但这不是火箭手术.如果你的一些人首先熟悉这种语言,你就可以更好地估计"提升"时间. (6认同)

Rob*_*sen 7

请阅读:企业中的F#

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


Tom*_*cek 6

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

  • 在F#中,您可以使用代理(aka MailboxProcessor)来构建程序.我在伦敦的F#用户组谈论了代理商,所以你可以在那里找到一些有用的资源.F#中的代理不会自动支持通过网络进行通信,但您可以实现(作为代理).但是,它们是构建并发应用程序的一种很好的方式,也可以分离关注点.

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

  • F#拥有一个活跃的社区,在伦敦,纽约和其他地方拥有大量用户群.有很多使用F#的公司(据我所知,有些人正在使用或考虑使用代理).Host-tracker.com是一个用F#编写的大型服务器端应用程序(参见他们的职位发布)