华山派曾有剑宗和气宗之分。双方你争我夺,势不两立。是权力之争,也是道统和武力之争。

咱编程界也有指令式程序(如,面向对象)和函数式编程两派。他们的关系虽不至于剑拔弩张,却也相当紧张。表面是语言风格之争,其实是方法论之争。

话说,当年高级语言诞生不久,场面就开始混乱了。面向对象派,又称bottom-up派,他们从底层硬件开始向上走,在不牺牲性能的前提下,逐步增加抽象层级,不断接近数学。Fortran, C/C++, Pascal, Java以及C#等等都属于这派。函数式编程派,又称top-down派,坚持从数学出发,逐渐减少抽象级别,以接近现实问题,并获得硬件支持,为了保持概念完整,牺牲了部分性能。其拥护者有Algo,Lisp,Smalltalk和Haskell等。

双方坚持信仰,互相揭短。top-down说,哎呀,别这么快向硬件妥协,那会把选择局限在少数几个不可逆的设计中;而且,mutable太可怕了,尤其是在并发情况下,冷不防就来个意外。bottom-up派则说,别给我套这么多数学,我很难兼顾垃圾回收、函数调用……而且,性能、性能、性能,我不能牺牲任何性能;immutable太理想化了,毕竟现实世界在变,试想,如果date和random不变,调用它们有什么意义?

计算机科学家Erik Meijer说,每当新语言出现时,他总会看看技术规范。这对他来说,也许就像喝着咖啡看报纸,轻松自如。但他在一次分享中说,有一门语言,他根本读不懂,一看就犯困,比什么安眠药都更有效。你可能会觉得那一定是门高深的语言,然而,这门语言就是很多人熟悉的Java8。他觉得lambda,method reference这些东西实在太复杂了。怎么办?每当碰到复杂的东西,他就听Leslie Lamport(图灵奖获得者)的话:“我们应该多用点数学。”

他知道,大部分程序员都惧怕数学,就更别说如何用数学理解语言,如何在编码中应用数学。所以他上台演示,分享了《Category Theory, The essence of interface-based design》。老头子精力十足,对照着讲数学概念和函数式编程中的语言概念,很是精彩。时不时揶揄下Java:lambda演算早在1928年就提出了,Java作者Gosling一度声称没必要支持lambda,但最终还是在Java8中支持了,这是为什么?因为我们畏惧数学。但我们不应该畏惧,搞数学的人都是很聪明的,我们应该从他们身上偷师点东西。

年迈的Java徘徊良久,终于接纳函数式编程;年轻的Scala和F#是与身俱来的多面手,两边讨好;新生的Kotlin长了一张面向对象的脸,却又兼俱一点函数式气质。争吵了近70年,两派终于开始弥合了。

纵是阳春白雪, 也有下里巴人的时候。多核时代下并发需求的普及,以及日益复杂的软件架构,使得指令式编程力不从心。我们需要更有力的武器。Brian Beckman说,我们将无可避免地接触monad,因为函数式编程正迎面呼啸而来。

这段历史似曾相识,关于剑气宗的高下,岳不群有段论述:

剑宗功夫易于速成,见效极快。大家都练十年,定是剑宗占上风;各练二十年,那是各擅胜场,难分上下;要到二十年之后,练气宗功夫的才渐渐的越来越强;到得三十年时,练剑宗功夫的便再也不能望气宗之项背了。

但我们是文明的现代人,何必争个你死我活。我们要融合,要扬长避短。总有一天,犹太教、基督教和伊斯兰教的朋友们会在他们共同的圣地——耶路撒冷,愉快地生活的,是不是?哦弥陀佛!

有个问题摆在所有程序员面前:如何提高软件质量?这是个可以写好几本书的话题。我敢打包票的是,这些书都会讲code review、unit test、 QA……其中单元测试(或者包括集成测试)的争议最大。写测试确实费时费力,又不一定讨好。我认识的人中就有坚决肯定和坚决否定两种极端。我认为这是个性价比的问题,如果能自动生成单元测试就好了。于是,一度想用AI搞个这样的项目(事实是确实有人在研究这个,比如randoop,曾测出了jdk的bug)。但转念一想,又打住了。

People are always more willing to work harder than they have to than to work smarter than they’re able to.

质量的关键并不在测试之类的防御性措施上。测试是有意义的,但就像公路两边的防护栏,能防止你掉下悬崖,却并不能把你带向目的地。我们应该回到业务本身,琢磨如何更优雅地设计和实现它,这是科学、艺术,是编程之美,也是我一直提倡design review的原因。但关于设计以及架构,我发现的更多是其中的“艺术”成分,也就是依靠经验和模仿习得的那些。是否有完整的章法和可言传的套路呢?我们需要更多科学来指导代码的设计和组织。与其说我们需要函数式编程,不如说我们需要更高的视角看待编程。

带着这个疑问,我撞见了category theory,中文叫范畴论,不知道这个鬼见了都犯愁的理论,能多大程度解决问题。但我愿意一试,没准某一天,我能以气御剑?

注:上面都是废话,本文重点是以下链接:

REF.

  • https://www.infoq.com/presentations/Simple-Made-Easy
  • https://www.youtube.com/watch?v=ZhuHCtR3xq8
  • https://www.youtube.com/watch?v=JMP6gI5mLHc
  • https://ykode.id/making-sense-of-category-theory-6f901e39fa3c
  • https://bartoszmilewski.com/2014/10/28/category-theory-for-programmers-the-preface/