medium翻译:Haskell In Production

这篇文章讲述我们为什么选择用Haskell构建the Hasura platform,以及为什么你也应该尝试将Haskell用于产品

(TL;DR)

我们构建了以 Hasura.io为名的微服务平台,Haskell是该平台的核心编程语言

这篇文章旨在说服那些还在纠结是否该用Haskell制作产品的人们。也并不是想把公司的所有代码都改头换面来宣扬Haskell神教。但四处都有一点点Haskell还是可以的。

文章完全没有具体代码案例,仅仅是定性分析

Our Background

我们的开发团队背景相当多元化。大多数成员的产品开发经历是使用主流编程语言,诸如 C, Java, Python, C++, C#, Javascript。当着手开发一个PaaS/BaaS的产品时,我们开始评估哪种语言和工具箱会最适合构建核心平台。

What Attracted Us To Haskell:

说真的,当看到下面这段说法时,我们这群年轻人一下就被点燃了热情:

Haskell是一门高级的纯函数式语言。作为一个超过20年的位于前沿领域的开源项目,Haskell允许健壮、简洁、标准的软件的快速开发。不仅支持与其它语言的集成,其还具有内建并发,查错、检查工具,丰富的功能库以及一个活跃的社区。Haskell使得开发灵活,可维护,高质量的软件变得容易了。
Source: wiki.haskell.org

纯函数式!20年的前沿研究!健壮、简洁、标准的软件!Haskell社区是如何奈斯我们也早有耳闻。

嘛,这的确是工程师的梦想。但是Haskell因其陡峭的学习曲线而臭名昭著。值得在商业需求上冒风险吗?它真的像人们声称那样困难吗?一言不合就讨论范畴论是要怎样?

直到我们看到了这个:Beating the averages

如果某些期望很难达成,但是它能带来非常好的效果并且容易改进,那么这个期望就相当合理。

我们毕竟都用Vim(笑)


First steps with Haskell

在对一些样例代码进行细致评估之后,我们开始在项目(web app)中完全使用Haskell(是的,微服务)。最先写的东西包括异步消息队列库、类型安全的CRUD自动生成、API查询和redis缓存层。

开发过程中使用的一些Haskell库是编程语言社区和Haskell狂教徒提供的。Haskell库的作者都显得经验丰富,能力强大。编写Haskell就仿佛在书写自然语言一般,这会让代码具有良好的架构、安全性和不错的性能。随着库版本号越来越高, Check the JSON parsing speed improvements 也有了!

每完成一个项目,我们就感觉炒鸡一流棒。积累的大量经验还可以用在其他地方。我们得python代码变得更加函数式、清晰和易于维护。


A Real World Problem: Expose a subset of SQL in JSON with fine grained permissions

我们需要建立HTTP server,适合Postgres的JSON解析以及接口的性能库。简单的语法树变换,能够正确推断以及容易增加新特性是满足开发的首先需求。毕竟,我们需要的是能够很好增量和有效应对将来成吨的IO的程序

Requirements: Flexible codebase, Scale up, Handle IO well

就是这样.

Language Programming ease/desire Memory footprint Concurrency
Java None High Mature
Node Ok, but programming with callbacks Ok Very Immature
Haskell Yes. Program synchronously and GHC handles the rest. Low Mature
Python Yes High Not easy

客观来说,Haskell是较好的选择.

最终我们敲定了下面三个性能库:

  • Warp- http server
  • Aeson — JSON parsing
  • Hasql — Postgres connections

快速做出原型并且在联调之前单元测试是很轻松的。项目做到一半时,我们不得不换到一个另外的Postgres数据库。我们需要改变的东西相当少,而且有很多提示,整个迁移花了大概几个工作日。

相当惊讶的是我们很快就搞定了。回想起来,耗费的大部分时间是那些在项目里初次遇到的问题。项目的代码与我们在草案中实际拟定的JSON to SQL 转换规则十分相似,Haskell很快就搞定了一切。


A Conclusion to the Ramble

为了总结一下这篇闲谈,我们可以回顾一下这门语言的维护者的声明,以及这些说法是怎样指导了我们。关于Haskell是怎样的讨论层出不穷。实际上,这个回答能够压服所有杂音:What is haskell actually useful for?

  1. 纯函数式: 我们可以推断编写的所有程序,代码几乎是思维的完美还原
  2. 代码简洁: 写下代码,立即重构。更细化的代码让你更为容易和快速的重构大型模块
  3. 健壮性: 静态类型和类型推断,以及强大的编译器(The Glorious Glasgow Haskell Compilation System)
  4. 测试: 就像所有人都用上了waxed poetic一样,类型系统显著减少了大量单元测试。通过为你的函数断言自动生成测试用例,快速检查(Quickcheck)让测试简单轻松。最棒一点是可以四处添加手动测试 (eg: IO related failures)
  5. 并发IO: GHC的线程抽象和IO管理让你能轻易考虑并发执行计算以及类似node基于事件异步的运行时的体验。GHC 非阻塞IO,支持多线程和多CPU(node不能多核),事件驱动。谁能和它比。
  6. 丰富的库: Haskell的lib都易于集成并且相当容易做安全地个性化修改(以及维护一个 fork版本)
  7. 部署: Haskell的私有云部署很简单,因为所有的库依赖都可以通过静态链接。这就一步搞定了版本控制和部署。

Some common roadbumps(一些坑)

  1. 类型错误 对初学者来说相当难搞, 错误提示没一点用.
  2. Documentation: 文档介绍简单类型时还不错,但是涉及到一些库 (ahem..lens),几乎没有关于类型声明的解释。使用这些库会花费大量的精力,还好最后有效并且能够通过返回值判断。
  3. Language extensions: 当找一个Haskell库时,你经常会看见GHC’s language extensions的用法,一些简单易懂 (OverloadedStrings, ScopedTypeVariables),一些则不然 (RankNTypes)。这让学习源码比较困难。

The Clincher(关键)

无论你做什么项目,用Haskell编程是一种享受。在编写了愈发高级的代码后,你会感觉良好。然后你会上瘾。有趣的Haskell代码如此之多,即便你夜以继日的专注于它们也不能完全理解,但是多用用就好。

用Haskell愉快地编程一天获得的满足感是无与伦比的,一天结束的时候,你会想,这才是编程的意义所在,不是吗?

Hasura平台上线了. 试着玩一下吧: https://hasura.io


如果你喜欢这篇文章, 还请在 mailing list 注册一下接受每日最新的内容推送。

文章翻译自medium
作者:Hasura
链接:from-zero-to-hipster-haskell-in-production

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容