知行合一,事上磨练

关于函数式编程与scala

Posted on By Kenny Kong

初识

本人从2014年开始接触scala,当时是从学习akka框架结缘的,akka框架和我熟悉的另一门编程语言erlang的思路很像,处于好奇,也想把它用在项目上,研究了之后,写了个demo,后来由于这种并发思路太不一样了,需要全盘考虑,就作罢。

期间受某技术大牛的影响,了解了haskell函数式+类型编程的威力,又了解到scala也有相同的编程范式,又与主流java体系相容,于是对scala另眼相看,并考虑应用到实践中。

应用

后来到了2017年,我使用函数式编程的思想设计了风控引擎,当时出于时间和项目成员的接受度,用的是java+groovy,但是始终有一些缺陷groovy难以解决,比如说在引擎出错时,无法搜集到所有的错误信息,这对整体排查十分不利。

当时我正在学习《scala函数式编程》这本书,知道用applicative functor 模式+ validation 可以实现我所要的效果。但是正准备改进计划的时候,公司受到国家政策影响,业务被砍掉了。

难题

后来做了一个区块链项目,在做区块链的时候,区块链交易有3个非常极致的问题要解决:1.非常高的并发量和高频的交易速度。2,分布式环境下的高可用性。3,在高频,高并发并且高可用的场景下要保证数据尤其是资金的一致性。

在电商行业,满足上述任意两个条件都是非常有挑战性的,而区块链的交易要同时满足这3个条件实在是太有挑战性了!

曙光

这个时候接触了scala的另外两本书:《scala高性能编程》 和 《函数式响应式领域建模》。

前者描述了一个股票交易的场景,和我当时的业务极其相似,书中通过如何定义高性能(带宽和延时),如何测量性能瓶颈,如何优化类型,如何优化集合类,如何使用惰性,如何使用并发,到最后使用free monad将执行程序和解释程序彻底解耦,又同时淋漓尽致的把一切效果(如超时,异步,错误处理等)整合到一起的优势。这种编程范式使得程序逻辑清晰而又无比强大。

《函数式响应式领域建模》对我们长久以来的Java业务开发方式做了一次重新定义。这本书也是用了一个生动的案例来一步一步详细解释如何定义一个模型,如何使用不变性保持业务系统的纯粹性,如何定义代数结构映射到领域模型,如何有效的管理异常和异步,如何做到关注点分离,如何用free monad生成语法树,并由解释程序处理业务逻辑。其中的事件溯源模式很好的解决了高并发,高吞吐量下的数据一致性问题。

通过这两本书可以说是完美的解决了区块链交易中遇到的主要难题,也解决了长久以来开发业务代码遇到的:代码冗余,业务逻辑和非功能性代码相互夹杂导致项目越到后面维护越难的问题。

遗憾

但是,弊端也很明显,这个技术架构需要时间去研究和开发,在现今spring横行的企业级技术开发市场上,大多人疲于业务代码的堆砌,我也不例外,很难有时间去思考和实现这样的架构的。

攀登

Scala是一门先进的技术,也是一门复杂的技术,要有沉淀,要有氛围。Scala将优雅地解决编程中遇到的所有难点,这个信念已经在我心中根植。所以我会特别关注有scala技术氛围的公司,虽然都比较小众,国内的比如Tubi等。参加一些scala的研讨会和群。希望能将我这几年在scala积累下来的技术用于实践。同时,我也做好了充当布道者的准备。