写点什么

使用 Elm 实现生产系统运行零异常

2017 年 6 月 05 日

QCon 伦敦 2017 大会上, Noredink 的软件工程师 Richard Feldman介绍了公司转向Elm 开发的决策过程,他们实现了一个具有10 万行代码的生产系统自2015 年以来运行零异常。Feldman 也是Manning 出版的《Elm in Action》一书的作者。下面,我们将概述Feldman 的主要观点。

Elm 是一种编译成 JavaScript 的纯函数式编程语言,它使用不可变数据和静态类型(Static Typing)创建基于浏览器的应用。Feldman 回顾了 Noredink 是如何从在小型非关键业务中采用 Elm,直至现在完全采用 Elm 这一过程。尤其是在完成一个为期数月的 React 开发项目后,他认识到:

采用 Elm 会缩短项目的实现时间。它不仅可以让公司减少开发人员上手及在公司技术栈中引入该项新技术的时间,而且最终结果也更易于维护。

Feldman 指出,使用 Elm 可以增加生产率和可靠性。其中的一些关键影响因素包括:

  • 在线编辑器 Ellie 。Ellie 是一种用于 Elm 的高级 REPL 环境,为开发人员编写、编译和呈现 Elm 代码提供了丰富的接口。
  • Elm 禁止null值在系统中自由传播,这避免了“十亿美元错误”(One Billion Dollar Mistake)的发生。 null值需要显式地使用Maybe类型值处理。
  • Elm 强制使用单一不可变(Single Immutable)值表示整个 UI 的状态。和 React 中一样,虽然模型不必是单一值,但是不存在关联到单个组件的状态。使用该模型,Elm 的行为类似于 Virtual DOM ,这是实际 DOM 的diff化,因此只应用与应用相关的更改。在 React 中使用了同样的方法维持性能,同时简化了对不可变值的处理。
  • 将 UI 表示为一个单一不可变值,这种做法最突出的优点在于,可以通过与 UI 更改相关联的不可变值集处理 UI 的一系列更改。在以调试模式编译时,Elm 可以通过简单地点击相应的模型值去查看 UI 的历史状态。此外,还可以导出这一系列值,这使得别的开发人员可快速地重建 UI 的异常状态和生成方式。
  • 静态类型检查是 Elm 的一个巨大卖点。据 Feldman 介绍,Elm 几乎完全适用“一旦编译,即可工作”原则。
  • Elm 的可靠性主要原因在于其处理 JavaScript 互操作性的方式。不同于其它大多数编译成 JavaScript 的语言,Elm 事实上强制使用了一种基于消息的方式,使得 JavaScript 代码运行于服务内部。这确保了无类型的 JavaScript 代码不会破坏由静态特性提供的可靠性保证。
  • 最后一点,虽然 Elm 的软件包管理工具不如 npm 那样包罗万象,但是它具有自身的强大之处。特别需要指出的是,它仅允许软件包中包含 Elm 代码,也就是说不允许任何的二进制文件,这使得其相比于 npm 更为安全。此外,它仅支持被正确编译的软件包,并自动强制使用了语义版本。

Feldman 总结为,JavaScript 确保了前端能更快地展示在屏幕上,而 Elm 确保了更快的整体开发速度。

报告最后提及了使用 Elm 这类语言时常能听到的反对声音,那就是难于找到可用的开发人员。Felman 指出,事实上 Noredink 从使用 Elm 中取得了两个优势:一方面,这使得公司的求职岗位脱颖而出;另一方面,公司吸引了那些对学习 Elm 特别感兴趣的开发人员。

查看英文原文: Zero Runtime Exceptions in Production with Elm

2017 年 6 月 05 日 19:001063
用户头像

发布了 226 篇内容, 共 59.5 次阅读, 收获喜欢 14 次。

关注

评论

发布
暂无评论
发现更多内容

陪你手撕源码系列之 STL set 相关算法

herongwei

c++ 算法 set stl

架构师训练营第 1 期第 12 周学习总结

好吃不贵

极客大学架构师训练营

性能优化练习

Mars

别再用智能合约时代的思维,去思考下一代区块链应用

CECBC区块链专委会

区块链 计算机

许可区块链是许多金融应用未来的关键特性

CECBC区块链专委会

比特币区块链

玛雅公约软件系统开发|玛雅公约APP开发

开發I852946OIIO

系统开发

架构师训练营 第八周作业

文江

【第十二周】课后作业

云龙

架构师训练营 2 期 - 第八周总结

Geek_no_one

极客大学架构师训练营

银行业大数据应用及HiveQLjoin分析

garlic

极客大学架构师训练营

可能会重塑未来移动支付市场的格局

CECBC区块链专委会

货币

推进工业互联网和区块链创新发展

CECBC区块链专委会

区块链 互联网

架构师训练营 2 期 - 第 8 周命题作业

Geek_no_one

极客大学架构师训练营

第十二周作业(作业二)

Geek_83908e

架构师一期

架构师训练营第 1 期 - 第 12 周课后练习

Anyou Liu

极客大学架构师训练营

数字人民币红包迎战“双十二” 六大行钱包全接入

CECBC区块链专委会

数字人民币

架构师训练营第三周”代码重构“作业

随秋

极客大学架构师训练营

FFmpeg使用基础(音视频开发入门)

赖猫

《社会中的数据可视化》PDF免费下载

计算机与AI

数据可视化

宝马区块链负责人:我们是如何让区块链技术与汽车产业结合的?

CECBC区块链专委会

大数据

架构之书:雄心与《C++语言的设计与演化》

lidaobing

c++ 架构

性能优化总结二

Mars

生产环境全链路压测建设历程之七: 淘宝网2012年双十一库存超卖问题的本质

数列科技杨德华

Codurance不太一样

sherlockq

架构师训练营第 1 期 week12

张建亮

极客大学架构师训练营

架构师训练营 1 期第 12 周:数据应用(一)- 作业

piercebn

极客大学架构师训练营

第十二周作业(作业一)

Geek_83908e

架构师一期

架构师系列9: 找出单向链表合并节点

桃花原记

第八周总结

孤星

架构师训练营第 1 期 - 第 12 周学习总结

Anyou Liu

极客大学架构师训练营

第八周作业

孤星

InfoQ 极客传媒开发者生态共创计划线上发布会

InfoQ 极客传媒开发者生态共创计划线上发布会

使用Elm实现生产系统运行零异常-InfoQ