微软Project Springfield团队的F#使用心得
Project Springfield是一个用于在软件中查找关键安全错误的模糊测试服务。微软Springfield团队首席软件工程经理William Blum介绍了他们团队如何利用F#来构建云服务。
简洁性经常被认为是F#的主要优点之一。Blum提供了一些Project Springfield相关的数据:
为了移除一些旧的依赖,我们将一个Perl脚本移植成F#程序,代码量减少了37%。在另外一个工作中,我们将1338行PowerShell脚本移植到F#只需要489行(小了2.7倍)。在这两种情况下,除了代码量的减少,最终的F#程序还在日志记录、可读性和可靠性方面得到了改进(部分由于静态类型检查的原因)。
Jet的软件工程师Rachel Reese在F#的简洁性方面持有相同的观点,她在“为什么电子商务公司选择F#”中提到:
所以,我们开始构建两种方案:C#方案和F#方案,来比较他们的效果。最后,我们选择坚持使用F#。主要原因在于F#使我们能够以更少的代码提供相同的功能,这显然更容易维护并减少了错误。
代码正确性也常常被Springfield团队和F#用户提到。例如,空引用,也被称为“十亿美元的错误”,在F#中是不允许的。在F#中,缺失的数据使用Option类型表示,其中值可以是Some valueOfAVariable或None。
可区分联合并不局限于Option类型,它们也可以表示复杂的对象,然后在模式匹配表达式中使用。下面的代码段演示了一个事件类型和调度它的函数。Blum解释说,代码被授权处理所有情况,因为它是由编译器执行的。
type CustomerId = System.Guidtype EventType =| MsgType1 of CustomerId| MsgType2 of CustomerId * string * int| MsgType3 of CustomerId * string * int option// 用模式匹配来处理信息
let dispatch msg =match msg with| MsgType1 -> ...| MsgType2 -> ...| MsgType3 -> ...
F#还增加了使用类型提供程序验证动态数据源的可能性。类型提供程序支持对数据源(如SQL数据库或JSON)在编译时完成验证,而不是在执行时。
Springfield采用动态分配计算资源的方式,因此需要在运行时生成JSON参数文件,这是一个容易出错的任务。使用F#类型提供程序,我们可以在编译时静态验证我们生成的模板参数是否有效。因为我们的ARM模板不断发展,这极大地加快了开发和调试过程。
Springfield团队还采用了F#来编写脚本。REPL环境F# Interactive提供了一种在没有预先编译的情况下执行F#脚本的方法,这是脚本语言的一个预期功能。
F#脚本的另一个优点是静态类型检查,这对脚本语言来说是不寻常的!实际上,这将大大节省调试时间。IDE中的智能感知功能会立即发现错误(如变量名称中的拼写错误或输入错误)。重构代码也会更加方便。这与我们团队以前采用的PowerShell脚本的脆弱性形成鲜明对比。
原文地址:http://www.infoq.com/cn/news/2017/01/fsharp-project-springfield
.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注
微软Project Springfield团队的F#使用心得相关推荐
- 从卓越工程的角度看微软中国开发团队的成长 (一)
在进入正题以前,我们来想象一下人类祖先在石器时代后期开始种植农产品的情景.最早发现农作物可以种植的人类祖先可能不小心把种子掉在地上,第二年春天雨季后发现长出了植物并结出果实,而秋天的收获激励他们有意识 ...
- WindowsForm如何实现类似微软project软件的甘特图?
在管理软件研发过程中,特别是涉及项目管理或者生产计划方面,都需要一款类似微软project的控件对项目下的分解任务进行图形展示(甘特图).下面介绍一下在WindowsForm下如何实现类似微软proj ...
- 青铜器RDM与微软Project计划进度管理对比分析
详细从功能.系统性.研发知识管理支撑.分级计划体系.系统开放性.扩展性.安全部署方便性对比分析微软Project与青铜器RDM之间的差别. # 比较项目 青铜器RDM MS Project Serve ...
- 微软Project Server 2016正式版下载:支持项目组合管理-搜狐
微软Project Server 2016正式版下载:支持项目组合管理-搜狐 微软Project Server 2016正式版下载:支持项目组合管理-搜狐 posted on 2016-06-13 1 ...
- Agile 正式升级为 Project ,打造团队卓越交付能力
PingCode Agile (敏捷开发管理)子产品正式升级为 project (项目管理). 此次升级,我们在敏捷开发的基础上增加了对瀑布开发的支持. 除此以外,伴随着 PingCode 从刚发布时 ...
- 微软拼音输入法团队博客搬家通知
因为Windows Live Spaces即将关闭,微软拼音输入法团队博客将迁往CSDN,地址如下: http://blog.csdn.net/mspinyin CSDN博客平台是一个面向IT专业技术 ...
- 开发以及团队管理方面的心得总结
本人有四年的工作经验,大学里也有不少项目经验,现在分享一些做事以及团队管理方面的心得总结: 开发方面的经验 在我看来,开发工作可以从如下几个角度去看: 1.不确定性的减少过程 就像以前华罗庚所说的读书 ...
- 关于团队管理的一些心得体会
从单打独斗到并肩作战再到团体作战,踏上工作岗位一年来,笔者实现了这样的初级转变.笔者忽然深深地感觉到,自身已然不是最初的独立战斗,而是逐步走向了团队合作,并且这种团队合作在项目开发过程中愈发凸显其重要 ...
- Failed to clean project: Failed to delete F:\x\x\target\xx\xxx.jar
前言: 我们在开发maven项目的时候,会经常开发打包,执行maven的指令:clean.install等.当有的时候我们执行maven的clean指令时,控制台会报如标题的一个错误,这篇文章讲解下怎 ...
最新文章
- SAP HUM事务代码HUMO里显示内层和外层HU信息
- ARC下带CF前缀的类型与OC类型转换
- [云炬ThinkPython阅读笔记]2.9 术语表
- memcache在ThinkPHP中的使用1---PHP下安装memcache
- php如何解释xml,PHP – 如何解析这个xml?
- LeetCode 2104. 子数组范围和(单调栈)
- python棋盘放米问题_Python基于回溯法子集树模板解决马踏棋盘问题示例
- 大学c语言电脑考试判卷,全国计算机等级考试判卷的玄机
- SpringBoot 集成 阿里的 FastJson
- 数据结构概念及连续存储数组的算法演示
- 【MCVRP】基于matlab模拟退火算法求解带多种容量的车辆路径规划问题【含Matlab源码 918期】
- 图邻接表拓扑排序算法c语言完整,在用邻接表表示图时,拓扑排序算法时间复杂度为()...
- 如何在 Codeforces 上出题?
- 2021总结:躺平的一年
- Baumer工业相机堡盟工业相机如何通过BGAPI SDK获取相机设备的各种固件信息如DeviceID或者SerialNumber等(C++)
- 程序员必备编辑器软件
- python excel数据分析画直方图 饼状图_Excel数据可视化应用(直方图、折线图、饼状图)...
- 4.25 使用图标集功能标识指定范围的数据 [原创Excel教程]
- 利用黑客手段一台手机“变”出千万台,新型诈骗技术曝光
- 电子设计应用超声波测距仪的设计
热门文章
- CMD、AMD、commonJs 规范的写法
- 独立开发一个云(PaaS)的核心要素, Go, Go, Go!!!
- nginx对websocket的支持及uliweb chatroom的测试
- 谈谈关于MVP模式中V-P交互问题
- asp.net 得到上一页地址
- 我将 20 年前开发的操作系统迁移到 .NET 6,竟然成功了!
- C# 使用阿里云发送短信
- Dapr牵手.NET学习笔记:Actor一个场景
- 讲师征集| .NET Conf China 2021正式启动!
- FastTunnel - 打造人人都能搭建的内网穿透工具