“ F#比实体框架或WPF更难掌握”:Scott Vlashin访谈



如果没有专门针对该语言的详细网站的人,我应该向谁询问F#? Scott Vlashin创建了许多Habra居民都熟悉的资源“ F#for Fun and Profit” :从Habré那里翻译了系列文章 “功能性思维”和文章 “面向铁路的编程”。

在11月,他将在莫斯科举行的DotNext会议上发表题为 “组合的力量”的演讲。 在期待这次演讲时,我们向他询问了F#和一般的函数式编程。

-让我们从头开始:在进行函数编程之前,您做了什么?如何来到F#以及如何创建站点?

-我是一个非常古老的人,当我上大学时,还没有单独的计算机科学程序。 我接受了数学教育,但不想学数学,所以大学毕业后,我从事各种工作约10年,包括木匠。

在1980年代后期的一个晴天,我父亲买了一台CP / M Kaypro电脑,上面装有少量的内存和5.25英寸的软盘用于工作。 这是在Windows出现之前,因此DOS站在上面。 我正是在此上开始编程的。 我从事数据库工作,起初是为父亲服务的,他需要这个。 然后我开始专业地做。

我的第一语言是Turbo Pascal,在1989或1990年我遇到了Smalltalk,我真的很喜欢它,它仍然是我最喜欢的语言之一。 一份工作取代了另一份工作,最后,我像大多数程序员一样,在一家大公司找到一份工作来编写无聊的业务应用程序(我称它们为“ BLOB”:无聊的业务线应用程序)。 很长一段时间他一直在这样做。

有一段时间,我用Python编写了大约10年的C#。 2011年,也就是不久前,我决定对工作感到厌倦,尝试一些新的东西会很好。 所以我想做函数式编程。 原来,我的Visual Studio已经具有一种功能语言,因此我尝试了解F#。 一开始它似乎很奇怪,我什么也听不懂,它与我以前合作过的一切都大不相同。

关于F#的博客很多,但其中很少,而且文档也不够。 结果,我的朋友们给了我很好的建议:如果您想适当地学习一些东西,请尝试开始教其他人,因为它可以使您很好地理解该主题。 另外,建议我创建一个博客,这使我在其他程序员中脱颖而出。

总的来说,在2012年,我开始写博客“ F#以获得乐趣和利润”,每当我了解F#的新知识时就开始在其中发表文章。 现在有几百页,并且它已经获得了很大的普及。 起初这只是一种爱好,我在业余时间从事这项工作。 大约三,四年前,我决定辞掉工作,成为一名自由顾问。 前一年,我写了一本书,也很受欢迎。 因此,我认识了F#。

-如何使用F#做自由职业者,或者不仅如此?

-基本上来说,F#尽管总的来说是他们要付的钱-这就是为什么我建议*笑* 。 如果我需要钱,但是有人在从事C#的开发,并且看起来很有趣,那我就接受。 去年,我使用Python工作了三个月。 对我而言,重要的不是语言,而是必须解决的特定问题。 我喜欢学习,当您被雇用来解决问题时,您必须成为(如果不是专家的话)至少要开拓一个新领域。

这样,我必须研究房地产经济学和保险风险。 我相信,只有对自己正在做的主题有充分的了解,才能写出好的代码,而不仅仅是写别人告诉您的内容。 对我来说,这是最有趣的-不是语言,而是问题。

-在俄罗斯,尽管有些开发人员对F#感兴趣,但是使用这种语言进行业务很困难:与C#相比,查找或替换开发人员更加困难。 与您合作的那些公司,如何在F#中解决?

-有两种最常见的情况。 第一种选择是当公司已经使用F#时,他们通常会有某种试点项目。 他们打电话给我,请我帮助他们启动这个项目并教他们使用该语言。 通常,他们准备在此类项目上花费大约六个月的时间,以了解是否要进一步这样做。

另外,我从事教授领域驱动设计的工作,在这里F#并不是人们关注的焦点,但是我将其用作语言。 我正在向习惯C#的程序员展示F#中的相同代码比C#中的代码短多少。 也就是说,我悄悄地推广语言。 它可以帮助您不必完全切换到F#,您可以用F#编写域模型,而其他所有内容都可以用C#编写。

-您说C#和F#可以一起使用。 但是在C#中,最常使用Entity Framework,NHibernate或类似的东西。 在使用F#的开发人员中,这种方法不那么受欢迎。 考虑到方法上的差异,如何混合使用这些语言?

-与我合作的公司之一使用实体框架。 他们试图切换到“端口和适配器”体系结构,即从体系结构的核心中删除所有输入/输出操作。 为此,实体框架非常糟糕。 在这种情况下,使用Dapper之类的东西会更加方便,它可以使您不必在代码中间处理SQL。 除其他外,这使测试更加容易。

让他们不要使用函数式编程,但是这种情况仍然迫使他们拥有程序的干净核心,并将数据库保留在外围。 如果思想已经转向这种格式,那么这是朝着放弃实体迈出的重要一步。 在这样的公司中,我实际上不会改变任何事情。 您不能强迫人们改变;他们必须自己想要改变。 我并不是想推销自己,而是以我认为最好的方式强加于人。 通常人们已经想改变,而我只是帮助他们实现这一点。 你明白我的意思吗?

-也就是说,您的客户是已经开始采用功能更强的方法的公司。

-即使使用C#,他们也会切换到功能更强大的C#,开始使用LINQ,不变数据结构,也就是说,通常朝这个方向发展。 因此,对于他们来说,切换到F#不再是一个大飞跃。

开发人员和木匠的职业是否相似


-您在Twitter上有一个有趣的话题,比较了程序员和木匠的工作。 我想从这个线程开始询问“功能主义”。 但是您能为我们的读者讲讲它的实质吗?

-开发人员喜欢将自己与工程师,软件开发以及建筑物或桥梁的建设进行比较。 关于编程是否真的接近这些活动,或者它们是否根本不同,存在很多争论。 就像,我们对项目的需求每天都在变化-当您架桥时,可能一切都完全错了吗? 还是真的如此吗?

但我认为,在这场争端中,没有一个正确的答案。 我从来没有当过工程师,但是我是木匠。 我可以说木匠的工作很多,格式也很不同,每个人都需要自己的方法。

例如,在其中一件作品中,我做了厨柜。 在美国,它们都是非常标准化的,大小相同,彼此定制,并且正在使用电动工具完成工作。 必须确保一定的质量,但是在美国,通常在房子更换所有者后就将旧厨房扔掉,也就是说,它不能长期使用。 因此,在这项工作中,一切都与速度和成本节省相关。

然后,我有另一项任务,我需要在建筑物的房间中间更换一根6英寸大的橡木横梁,该横梁已有400-500年的历史。 这里的一切是相反的:一切都是弯曲的,没有直角,要替换它,必须手动安装新的一块木头,使其形状与旧木头完全相同。 这需要很高的准确性。

最后,我完成了第三场舞台风景。 它们是用胶合板和很薄的木头做道具的。

我的想法是,每项工作都需要有自己的方法。 对于厨房橱柜,需要精度,电动工具的使用和可再现的结果。 在使用旧系统的老式木屋中,务必要小心,不要着急,不需要速度,而要保证结果的正确性。 最后,在装饰的情况下,您故意创建了一个不坚固的易碎结构,常常需要在几分钟内对其进行切割和重新组装,这种结构不会永远持续下去。

当他们说编程类似于工程时,这仅适用于某些类型的编程。 例如,如果您编写控制飞机的软件,则需要非常小心并达到非常高的准确性。 完全不同的是用于搜索文件的单行脚本,这更像是创建风景。 花20个小时证明该脚本有效并为此编写1000个单元测试是没有意义的。 所有工作不应超过5分钟。 而且,当您使用继承的系统时,您需要使代码尽可能适合现有的系统,此处不希望进行大型重构。

也就是说,在每种情况下,上下文都很重要。 有时您需要计划很多,对项目进行很多思考,编写大量测试。 在其他情况下,仅需鞭打即可。 许多人在这方面缺乏灵活性,他们认为,如果您不使用单元测试或不使用某种编程语言,那么您不是专业人员。 实际上,一切都取决于上下文的想法非常明显。 出乎意料的是,某些程序员坚持他们的想法多么顽固,如果您至少在某种程度上偏离了他们的理想,那么您会立即被列入黑名单。 我认为这很愚蠢。

-您说对于外部观察者来说,活动看起来是统一的,但是当您从内部观察时,会发现完全不同的情况。 我想问:函数式编程是否一样? 那些从外面看的人有一个共同的刻板印象,但实际上有巨大的差异吗?

-是的 从外部看来,所有“工作人员”的想法都是相似的,但是有许多不同的团体互相争论:Haskell,F#,Clojure和Elm的支持者。 即使在F#内部,对于该语言的发展方向也存在很大的分歧-您应该模仿Haskell还是应该优先考虑易用性。 因此,您是对的,该领域内的内容比外部观察者通常想象的要多样化得多。

-对于木匠工作的差异,您给出了非常清楚的例子。 您是否也可以通过具体示例来说明函数式编程中的差异?

-有一所函数式编程学校,它认为您需要尝试证明所有内容,从而使所有内容在数学上都是完美的。 这所学校使用大量的数学术语,例如“ monoids”或“ monads”。 这些主要是Haskell用户,并且学术环境非常有影响力。

还有一些对取得成果更重要的人。 他们对数学的兴趣不亚于不变性和对外围设备的I / O移除。 这种方法的最好例子是榆树社区。 它们主要参与Web应用程序的创建。 与第一组相反,这里他们没有自觉地使用数学术语,而是有意识地拒绝了Haskell中用户认为至关重要的部分功能。

另外,强类型和动态类型的支持者之间存在争议。 在外行看来,函数式编程类似于Haskell或F#,但除此之外,还有Clojure等语言具有动态类型和解决问题的完全不同的方法。 如果您将所有这些杂牌公司收集在一个房间里,他们会打架。 我认为所有方法都有其自身的原因,当我为某人工作时,我不会告诉他们他们的方法是错误的。

-许多人对所提到的“学术性质”感到恐惧(“ F#扎根于ML,这是为了提供严格的科学证据,但我在这里解决了真正的问题”)。 但是事实证明,人们害怕徒劳吗?

-一般来说,这么多人习惯于将学术视为消极的事情,这对我来说似乎很奇怪。 好吧,就是说,有人认为它是负面的,另一些人则是积极的。

事实是,我们现在在编程中使用的许多技术都是在学术环境中出现的,例如垃圾收集或类型。 因此,学术方法本身没有错。 另一个问题是,过度强调它们可能有害,因为科学家和程序员的目标不同。

尽管功能语言具有学术渊源,但在我看来似乎是正确的决定,那就是在F#和Elm等语言中隐藏这种逻辑。 因此,F#并非用于证明定理,而是用于解决实际问题,它是一种非常实用的语言。 现在,大学已改用更为复杂的语言,例如Coq,F *等。 它们更具学术性,用于证明定理。

就像我说的,科学家和程序员做不同的事情。 程序员大部分时间都花在读取和写入文件,使用数据库,在屏幕上显示数据,检查输入的数据,将其转换等方面。但是科学家对此并不感兴趣。 但是事实是,40年前纯粹是学术性的事情今天可能就不再如此。

-正如您自己对木匠的工作所说的那样,不同的方法在不同的情况下是好的,没有通用的方法。 特别是,F#也最适合某些任务。 这些任务是什么?

是的,这绝对不是通用语言,我绝对不建议所有人都使用它,这太愚蠢了。 但是在我看来,F#是C#的绝佳替代品-除了要求非常高性能的任务外。 F#中的编程基于完全不同的方法:抗扰性,结构相等性,显式依赖关系,F#不具有空值,等等。 在我看来,这种方法在解决日常编程问题时非常有用。

因此,如果一个人使用C#,他肯定应该询问F#,这种语言将有助于使代码更好。 至于其他应用领域,在我看来F#非常适合现在使用Python的许多任务。 F#和Python非常相似,在我看来F#在数据处理方面具有巨大潜力。 目前,在这方面还需要做更多的工作,但是也许几年后,人们将使用F#来处理与大数据和数据科学相关的各种事情,现在已经使用Python。

最后,F#与JavaScript一起使用非常方便。 通常,没有人希望直接使用JavaScript,因此有许多在JS中编译的语言:例如,ReasonML(在OCaml上运行)和Fable(在F#上运行)。 就个人而言,我更喜欢使用这些选项中的任何一个,而不是使用JavaScript,因此在前端上工作时,我会选择诸如Fable之类的东西。 因此,这是F#表现出最佳方面的三个主要方面。

-正如您在报告“针对C#开发人员的F#”中指出的那样,语言的主要内容不是语法,而是哲学。 但是对于那些想要快速理解“这种语言是否适合我”的人来说,这是一个难题。 通过快速介绍,您已经可以了解是否喜欢语法。 但是,了解语言哲学需要多长时间?

-用C#编写的人可以快速找出一种语言,例如Java或Go,因为大多数这些标准语言都具有一种命令式模型。 从它们转移到F#肯定需要付出很多努力,这使某些人停止了工作。 以我的经验,如果您暂时忘记了有关OOP的所有知识,则F#会更容易学习。 否则,您将开始将各种事物从C#转移到F#。

至于时间,经过两周的培训,已经可以开始编写工作代码了,要花上几个月的时间或多或少地习惯这种语言。 最后,要获得一个较高的所有权,您需要更多的时间(6个月或更长时间),这是我们正在讨论整理所有库,成语等内容的时候。

但老实说,切换到F#并不比切换到Entity或WPF困难。 他们还需要很多时间。 不要小看必要的努力,但有时他们会说这种过渡需要数年。 我再说一遍:为了开始编写代码,需要花费几周的时间才能适应-几个月。 我从我自己的经验以及与我交谈过的其他人的经验中讲这句话。

我需要在F#之前知道C#吗


-很明显,大多数使用F#的人都来自C#。 没有C#经验的F#有很多人吗?

-这样的人不是很多,而且对他们来说很难,因为所有的库都有C#的文档,因此各地的人们都会遇到C#的示例。但是仍然有这样的人,此外,F#在多所大学教授。

有些人正在尝试在Python之后学习F#。问题在于F#非常依赖于.NET,而.NET与C#相关联。与Visual Basic情况相同,C#中也有所有示例。希望在接下来的几年里,这种情况能够改变,并使语言更易于学习,现在这是重要的问题之一。

— C#, F#, , F# . ? LINQ , , , ?

— , , , , , : ? ? . , , , . , , , F# , Programming Theory Concepts - .

— C# , F# ?

— . , . , , . , - , Python JavaScript, .

, . JavaScript , F# . , . F# — , , C#, . F# .

— F# — «F# for fun and profit»? C#?

— F#, . F#, . , , Railway Oriented Programming, Property Based Testing . , TypeScript Ruby, , F#. , , C#.

Fun and profit


— «F# » («F# for fun and profit») - , «». , -, ?

— . . , F# , , . , , F#, , . F# .

- , — . , - Java . , , , . , , F# C# .

— «»: , , , .

— , . , , , . .

StackOverflow , , F# , . , , , , C#. , - , , 10 . .

, , F#, F#. F#, , . , . , F# .

— , F# . ? , , F# . F# ?

— , F# . , . - , . , , , . , . F# null; , ; . F# .

, F#, , , . C# — Visitor, Factory, Singleton, Bridge, F# , , , .

- . , , . , , , , , . Google Amazon — .

— , F# , — , , . ?

— , . , , C# , , C#. , C#, null, , - . F# . , , , .

- - , , , . C# F#, , , . , , . , , F#, .

— , Microsoft F# ( C# ). ?

— , Microsoft C#. , . — , Microsoft, , , Entity Framework Visual Studio. , Microsoft, Microsoft - — . , , Python Ruby. - , - , .

, F#, , , — F# , . Microsoft, . , Ionide, VS. , F# , Microsoft. , , , , , Microsoft . Microsoft , , .

— Haskell. F# — .NET-, ?

— , - , , Smalltalk, - . F# - , .NET. Java, Scala . , , C#, Java, F# , Scala, .

Haskell, . Haskell , , F#. F# , Haskell . , , , API Java, .NET JavaScript. API .NET , , API .

— . F#, , : , , ?

— , F# . , , , . , . F# , , C#. , Haskell, - , .

, , , .

F# , , . , -, .

, - , , — , ? , , , . F#, C#, , . . - , F#.

, F# , , .

DotNext «The Power of Composition». , F#: , , , . , .

Source: https://habr.com/ru/post/zh-CN469925/


All Articles