这篇文章讲述我们为什么选择用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是较好的选择.
最终我们敲定了下面三个性能库:
快速做出原型并且在联调之前单元测试是很轻松的。项目做到一半时,我们不得不换到一个另外的Postgres数据库。我们需要改变的东西相当少,而且有很多提示,整个迁移花了大概几个工作日。
相当惊讶的是我们很快就搞定了。回想起来,耗费的大部分时间是那些在项目里初次遇到的问题。项目的代码与我们在草案中实际拟定的JSON to SQL 转换规则十分相似,Haskell很快就搞定了一切。
A Conclusion to the Ramble
为了总结一下这篇闲谈,我们可以回顾一下这门语言的维护者的声明,以及这些说法是怎样指导了我们。关于Haskell是怎样的讨论层出不穷。实际上,这个回答能够压服所有杂音:What is haskell actually useful for?
- 纯函数式: 我们可以推断编写的所有程序,代码几乎是思维的完美还原
- 代码简洁: 写下代码,立即重构。更细化的代码让你更为容易和快速的重构大型模块
- 健壮性: 静态类型和类型推断,以及强大的编译器(The Glorious Glasgow Haskell Compilation System)
- 测试: 就像所有人都用上了waxed poetic一样,类型系统显著减少了大量单元测试。通过为你的函数断言自动生成测试用例,快速检查(Quickcheck)让测试简单轻松。最棒一点是可以四处添加手动测试 (eg: IO related failures)
- 并发IO: GHC的线程抽象和IO管理让你能轻易考虑并发执行计算以及类似node基于事件异步的运行时的体验。GHC 非阻塞IO,支持多线程和多CPU(node不能多核),事件驱动。谁能和它比。
- 丰富的库: Haskell的lib都易于集成并且相当容易做安全地个性化修改(以及维护一个 fork版本)
- 部署: Haskell的私有云部署很简单,因为所有的库依赖都可以通过静态链接。这就一步搞定了版本控制和部署。
Some common roadbumps(一些坑)
- 类型错误 对初学者来说相当难搞, 错误提示没一点用.
- Documentation: 文档介绍简单类型时还不错,但是涉及到一些库 (ahem..lens),几乎没有关于类型声明的解释。使用这些库会花费大量的精力,还好最后有效并且能够通过返回值判断。
- 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