构建开发工具和设计C#:Facebook的Eric Lippert访谈

关于:埃里克·利珀特

埃里克·利珀特(Eric Lippert)在Facebook设计编程语言。 其他值得注意的工作包括在Coverity设计C#分析器,并在Microsoft开发Visual Basic,VBScript,JScript和C#编译器。 他在Twitter @ericlippert并写了关于在编码编程语言设计和其他神话般的冒险博客http://ericlippert.com

埃里克·利珀特(Eric Lippert)是我们最新课程“ 修复随机性:C#中的技术”的创建者。

在我的公司Educative中,我们可以与来自世界各地的开发人员聊天,了解他们的故事,他们是谁,以及是什么激发了他们成为开发人员并向周围的人传授知识。 今天,我和埃里克·利珀特(Eric Lippert)坐下来,开始了解有关他的职业以及C#令人兴奋的世界,system.random类和概率编程的更多信息。

简单介绍一下你自己。 您是如何开始编程的,现在正在做什么?

我一直对计算机着迷,即使在很小的时候也是如此。 我九岁那年开始编程,通过在纸上写一些小动画程序来使火箭飞船在屏幕上飞来飞去。 我必须用纸,因为我没有电脑。 放学后,我会在图书馆的Commodore PET上键入程序,看我是否正确。 我的小学图书馆馆员是一个非常友善和耐心的人,几十年后我们仍然偶尔有联系。

在那之后不久,我父母给了我Commodore 64,我开始认真编程。 我在一家编译器公司工作,当时是高中的暑假工作,在那里我对专业人员的编程方式有了第一认识。 之后,我在滑铁卢获得了计算机科学/应用数学的联合学位,最后作为合作计划的一部分,在Microsoft从事Visual Basic编译器的工作。 那时,对我来说选择加入Microsoft并继续从事语言工作非常容易。

我于2012年离开微软,并在Coverity工作,改进了他们的C#静态分析产品,为之工作了两年,现在我在Facebook上从事开发人员工具的工作。 从本质上讲,几十年来我一直在专门从事开发人员工具的开发。 使用自己想使用的各种工具非常有趣!

您正在Facebook设计哪种编程语言? 他们打算解决什么?

最近,我在Facebook上开发了各种开发人员工具。 我们已经发表论文的其中两个是“ GetAFix”项目,您可以在这里这里阅读有关内容,并且与我的课程更相关的是HackPPL概率编程语言

GetAFix是一个实验性的开发人员工具,我们在其中分析大量代码更改,我们认为这些代码更改是对特定缺陷的修复,然后尝试推断出常见的修复模式。 当呈现出可能包含类似缺陷的新颖代码片段时,我们推断出在语料库中看到的哪种修复模式最有可能解决该问题。 然后,我们向开发人员提供建议的解决方案,并且大多数时候他们都认为这是一个很好的解决方案。

HackPPL将概率编程添加到Hack,这是PHP的静态类型。 我在Hack编译器上做了一些架构工作,并帮助构建了PPL扩展的第一个原型。 从那以后它的发展一直很有趣。

您的课程针对的事实是,现代编程涉及统计,而工具尚未赶上。 您能详细说明一下吗?

绝对。 我们在现代编程中面临涉及统计或概率推理的各种问题,但是许多现代通用编程语言并没有提供任何统一,一致的方法来帮助开发人员解决这些问题。 例如,手机传感器存在一些与之相关的错误,因此即使回答一个简单的问题,例如“手机在移动还是静止?” 涉及一些概率推理,更不用说更复杂的问题了,例如“电话是否在会遇到施工延误的路线上移动?”。

我们在现代编程中面临的几乎所有问题都有某种不确定性。 考虑旅行管理中的一些概率问题。 用户将需要更改其路线,或者任何飞机将被延误导致错过连接的机率是多少? 在前三个选择中显示用户最想要的建议的可能性是多少? 可以肯定地说,许多问题都涉及对未知未来的预测,并且如果我们的工具能够立即支持有原则的统计推理,那么我们可以做出更好的预测。

您能解释概率编程吗?

正如面向对象的编程是使用对象进行编程,而功能编程是使用函数进行编程一样,概率编程也不是用概率进行编程。 但是您应该指出,这种重言式的回答并不能告诉我们很多有关这些编程范例的信息。

概率编程语言的基本思想是,我们在语言本身中构建了一个概念,即特定值可以表示可能值的分布,并且程序使用这些值来进行选择:

  • 该手机有90%可能向北移动,但在用户沿这条路线行驶的时间中,有50%会在下一个街区停下来吃午餐; 我们是否应该告知用户北面五个街区的施工延误?
  • 该用户有20%的可能性单击链接X,但有30%的可能性单击链接Y; 我们应该显示哪个链接? (请记住,与两个链接关联的值函数可能不同!)
  • 此代码片段90%可能具有空解除引用缺陷,而此修补程序很可能会消除该缺陷(如果存在); 我们应该提出解决办法吗?

然后,根据控制流,该程序会根据旧的组合推断出新的概率。 语言设计者的问题是:我们如何表示这些组合? 我们如何表示“所有电子邮件中有60%不是垃圾邮件,但是提到尼日利亚银行办公室的电子邮件中有99%是垃圾邮件”,并以此为基础来决定是否过滤传入的电子邮件? 这样的程序具体看起来是什么样的,我们如何使开发人员自然而轻松地编写这样的程序?

程序员能很好地表示序列,但不能很好地表示随机性的例子是什么? C#中的随机技术如何解决需求?

在许多现代语言中,我们创建了可提供统一,一致的方法来解决涉及数据序列的问题的工具。 考虑一下C#中的LINQ或Python中的序列理解。 我们是如何做到的?

我们首先提出了所有序列都具有的统一抽象,然后构建了允许开发人员以强大的方式组合这些抽象的语言元素。 一些数学抽象是如此“呼吸”,以至于我们甚至不再将它们视为抽象,例如加法或乘法。 C#中LINQ的天才之处在于,就像语言中对数字进行加法和乘法运算一样,对语言进行排序,过滤,分组,联接和项目运算也作为对序列进行运算。 就像你说的那样:

x = a + b * c;

并且对这意味着什么有一个自然的直觉,所以您也可以说:

results =  
  from c in customers
  where c . City == "London" 
  select c . LastName ;

即使您不是C#程序员,也很容易看到我们有很多客户,并且在问“伦敦客户的姓氏是什么?”。 这些操作被烘焙到语言中,就像添加了附加内容一样。

我们可以有一个相似的-实际上几乎是相同的! –类似地嵌入到编程语言及其库中的统计分布式数据的方法。 序列与分布之间的联系非常紧密; 考虑分布的一种方法是,它是一个无穷的值序列:六面骰子可以建模为无限制的辊序列,其中每个数字在一定时间内出现。

就是说:您通常在序列上执行的操作可能与您通常在分布上执行的操作有很大不同,因此,在将两个相似的事物视为相同的事物时,不要过分重要。 可以类似地将“从此分布采样”或“从此先验和此观察计算后验”之类的操作类似地抽象到类型系统中,然后由该语言的新功能来支持。 但是我们才刚刚开始看到这些功能以业务线语言出现。

您能否描述System.Random的某些缺点以及C#中的随机技术如何解决此问题?

在C#中,有一个名为System.Random的类,它为您提供两件事:或者0.0和1.0之间的分数均匀分布,或者上下限之间的整数均匀分布。 从历史上看,该类的实现非常糟糕,因为使用它编写一个有缺陷的程序非常容易。 我们希望使用库的自然,简便的方法也是正确的方法,但事实并非如此。

幸运的是,其中一些问题已在.NET Core中修复,但是真正的缺陷比糟糕的实现选择要深得多。 真正的问题是,我们远远不仅仅需要一个间隔上的均匀随机数源来采样; 我们必须解决的问题是使用概率要复杂几个数量级。

如果您遇到的问题是:“某个人群中某个随机人患病的概率为X%,而我们的诊断测试的正确率是Y%; 如果随机选择的人测试呈阳性,他们患病的几率是多少?”,答案既不是X也不是Y,而是我们可以用数学方法得出的两者的组合。

即使人们受过训练,这种推理也很难做到。 但是,如果我们在编程语言中具有表示先验概率,观测值和后验概率的元素,那么我们可以编写非常简单的程序来正确地为我们回答这些问题,就像我们可以编写一个简单的程序来表示“给我最后一个”伦敦的客户名称”。

这些领域在学术界的研究语言方面已经取得了很大进展; 考虑将这些想法转换为通用语言是一个令人兴奋的前景。 这个想法让我很感兴趣,因此我在自己的博客中写了一系列文章,探讨了一些可能性。 我对问题空间的介绍是抱怨System.Random的缺陷,所以我称其为“ Fixing Random”,尽管实际上是关于重新想象我们如何处理C#等语言中的概率数据。

您从事过C#哪些方面的工作?

当我在Microsoft的早期工作时,我就开始使用C#进行编程。 正如C#3的设计过程即将结束一样,我加入了C#编译器团队,在其中实现了许多语义分析器。 然后,我被邀请加入C#设计委员会; 我在Microsoft从事了大约7年的工作,从事C#4、5和6的设计,并实现了编译器的“ Roslyn”版本,再次主要致力于语义分析引擎。 对于在多个C#版本中进行重载解析和类型推断引擎的工作,我尤其感到高兴。 有一些有趣的问题要解决! 正如我之前指出的,我在Coverity工作了几年,是基于Roslyn的静态分析器,该分析器用于查找实际C#程序中的缺陷。

作为您最喜欢的语言,C#有什么意义? 您本可以朝任何方向前进。 为什么要使用C#?

首先,C#是迄今为止我最了解的语言。 我花了数千个小时仔细研究它,并思考它的设计和实现。 当遇到一个新问题时,我的思考过程通常始于“我将如何在C#中执行此操作?”。

但这不是我所喜欢的。 C#是由专业,务实的程序员为专业,务实的程序员设计的。 它牢固地属于OO语言家族,但设计并不是严格意义上的OO。 设计人员会研究在功能语言,声明性语言,研究语言等方面运行良好的方法,并结合这些语言中的最佳思想,而不会忽视使C#像C#一样的原因。 与该设计团队合作多年,这是一种荣幸。

在C#世界中花了很多时间之后,您如何看待C#的未来?

我对C#在C#8中的前进方向感到非常兴奋; 在语言设计方面,在语言中包含非空引用类型是一项非常大胆的举措,它将提高开发人员的工作效率并减少影响用户的错误。 但是,真正令人兴奋的是,微软对这种语言的开源精神的接受程度如何,以及如何鼓励这种语言在Windows生态系统之外传播到更广泛的软件社区。 进行这种过渡并不容易,我为同事们拥抱新的工作方式表示赞赏。

我完全没有证据表明C#的概率编程已成为设计团队的关注对象。 我希望是现在!

您拥有自己的博客,已编辑书籍,以及其他促使您教周围的人的因素是什么?

当我刚进入微软大学时,我得到了很多建议。 我在1990年代从事JavaScript的设计和实现工作,我的经理对我说:“我希望您成为Microsoft从事JavaScript工作的公认专家。 寻找问题来源并回答; 如果您不知道答案,请进行研究直到您知道。”。

当然,如今很容易在StackOverflow上找到关于某个主题的许多问题,但是在1990年代,我花了很多时间在JavaScript USENET组和内部Microsoft组中,以解决有关语言的问题。 我听取了经理的建议,每当有一个我知道答案的问题时,我都会发布完整且正确的答案。 如果有关于我的专业领域的问题,而我没有正确,完整的答案,我会进行研究,直到找到答案为止。 在很短的时间内,我实际上是Microsoft的JS语言语义专家。 这种跨组织的认可对发展职业生涯有很大帮助。

在2000年代初期,Microsoft发起了一项公司倡议,以改善公司在开发人员社区中的形象。 对于我们内心的那些专注于提高客户生产力的人来说,它显得面目全非。 强烈鼓励我们写博客并回答读者的问题,所以我做到了。 首先,转储我希望JavaScript文档所说的有关该语言的设计和实现的所有内容,然后继续讨论有关Office开发人员的Visual Studio工具的工作,然后再讨论C#团队。 通过发布大量扎实的内容并与开发人员社区进行非常良好的互动,发生了与1990年代几乎相同的事情:我的博客被称为获取有关C#的内部信息的地方。

因此,通过回答有关SO的问题,编辑有关C#的书籍等继续为用户提供支持是很自然的。 这很有趣,而且我从各种不同的角度学到了很多痛点在语言中的很多知识。 专家使用语言所遇到的问题与初学者所遇到的问题大相径庭,但它们都很重要。 通过改善许多初学者的学习经验,我们将培养下一代专家。

您曾提到Educative,“我想看到的是这种交互式的教学法,我认为它有可能破坏编程书籍市场”。 您如何看待像Educative这样的平台扰乱该市场?

我很长时间以来一直在编辑技术书籍,我自己也写了几本书。 我被要求相当频繁地写有关C#的新书,而我之所以推迟它,主要是因为我没有写书所需要的大量空闲时间。 但是,我推迟写新的计算机编程书籍的第二个原因是,对于我来说,我们在纸上写下计算机程序,并希望人们像我九岁时一样从中学到东西,对我来说似乎很奇怪。 现在不再是1980年代了。 计算机无处不在,实际上,现在有很多人专门在计算机设备上阅读。

十多年来,我已经在我的博客中解决了这种不足。 我真的更希望人们能够在浏览器中查看代码,并进行编辑和执行。 而且我经常想到,如果我要再写一本书,我会想像一本在线的完全互动式课程,而不是一本静态的,死树上的书。

像Educative这样的平台,可以在每节课中嵌入可运行的代码,是改善这种情况的一个很好的开始。 这是令人兴奋的,因为这是一个开始。 还有很多事情可以做,以使其更具交互性。 例如,我的课程中有很多图显示了不同的概率分布,但它们都是静态图像。 它们也可以是实时的和交互式的,以允许用户调整不同的参数并查看会发生什么。

自从我还是个小孩的时候,我们就一直试图弄清楚如何将计算机纳入教学法,结果充其量是混杂的。 我们最终可能会拥有必要的工具,以使教育工作者更轻松地以丰富且互动的方式与学生联系,从而达到顶峰。

修正随机性:C#技术

显然,如Eric所暗示的那样,用C#进行概率编程可能很困难,尤其是在使用system.random类时。

在Eric的课程“ 修复随机性:C#中的技术”中 ,向您展示了改善system.random类的不同方法。 如果您是C#的狂热者,希望在探索新的方法来使用该语言的同时进一步加深对概率编程的了解,那么您会发现本课程很有价值。

From: https://hackernoon.com/building-dev-tools-and-designing-c-an-interview-with-eric-lippert-241hf30a0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值