版上无数大佬声称OOP比FP更加符合人类的思维方式,俺个土鳖来唱个反调.
所有的程序,不管采用什么模式,架构, 其最终目的都是IO+persistence, 70%以上的应
用仅仅是CRUD外加个包装而已. 大多数应用的persistence是tabular database, 这包
括mysql这类ACID数据库, 也包括big table/cassandra这类的分布式数据库. 当然也有
OO database, 但普及率/接收度/性能都不如前者.
我们不妨回想在电脑诞生之前, 人类对一个复杂问题是如何建模与解决的.复杂问题千
奇百怪,比如生物学家要对物种进行门纲目科属种的划分, 这种划分能够体现各物种之
间的异同程度. 再举个例子,统计学家要做个人口普查,那就要建立个大表格,每一行都
对应一个人, 行中记录包括生日/性别/籍贯等等各种信息,这样我们从一个表里就可以
得到籍贯分布,人口年龄结构,地域与受教育程度的关联等等.
事实上在OOP普及以前,人类对事物种类的划分是有限的, 因为现实中存在的东西就那么
几样, 人们也不大需要过研究什么抽象物体. 可OOP发明后就不一样了, 程序员们几乎
把脑子里所有的概念都抽象成物件了. 譬如一个bank account是一个物件, 每个
account有自己的private state,比如余额/利息率, 每个account还有自己的动作,比如
deposite/withdraw/query. 一个bank account被码农们想象成了能跑能跳的活物,50年
代的建模家一定觉得这帮人都疯了.
而对于列表型的问题, 我们的思维基本没变, 电脑只不过是让我们的表越做越大而已.
让我们回到IO+persistent的现代世界. OOP在处理IO时得心应手, 可在persistent那边
却很头痛, 因为复杂的OO类型很难嵌入到tabular数据库里, 写惯了OO的猴子们很不习
惯sql的思维方式,于是各种OO relational mapping被捣鼓出来,被OO猴子们奉为神器.
而FP则正好是另一个极端, FP在IO方面是漏洞百出, 可在persistent上却得天独厚, 因
为表格是FP的bread&butter, SQL语言甚至就是FP的一个DSL. SQL的理论基础,
relational algebra在FP里面可以完美表达. 利用FP的composibility, FP的猴子们用
一个fmap, 就能直接把一个int-> int这种简单函数变为table->table这种函数, 而且
完全不需要考虑异常(Maybe Monad自动解决). OO猴子绝大部分时间在做boxing/
unboxing + exception handling, 而FP在语言级别就解决了.
我同意FP很诡异,现阶段(也或者是永远)难以让主流所接受, 但我不同意OO更接近人类
思维方式, 至少是不同于pre computer时代人类思维方式.