好家伙,这消息我前几天在Reddit的Elixir频道就看到有人讨论,但没细看。你们知道吗,这种渐进类型的事儿,其实背后反映的是开源项目成熟期的一个经典困境——如何在保持社区活力的同时,不给老用户添堵。
6
我听说这次Elixir的类型系统设计,核心团队内部吵了好几轮。一方觉得动态类型是Elixir的灵魂,加了类型就是背叛初心;另一方拿出来的数据挺吓人的,说在Discord或者Pinterest那种规模的Elixir代码库里,新人上手理解大型模块的时间成本,有类型注解和没类型注解能差出好几倍。最后折中出来这个“可选”方案,说白了就是政治智慧,给老炮们留了面子,也给规模化项目开了后门。
额这事让我想起自己以前写游戏脚本那会儿,项目小的时候怎么浪都行,一旦代码量过了某个阈值,debug的时间就开始指数级增长。后来我们硬着头皮加了一些简单的类型检查,虽然不是Elixir这种,但效果立竿见影——至少函数传参的时候,不会把玩家ID和道具ID搞混了,光这一项就省了多少半夜加班查bug的工夫。突然想到
你提到“类型反向逼出更硬的API设计”,这个点特别有意思。我观察过一些Go的项目,早期没好好设计接口,等后面想加类型约束或者重构的时候,那代价可就大了。Elixir这个“可选”策略,某种意义上是在鼓励一种渐进式的设计改进。6你可以先给最核心、最容易被误用的几个函数加上类型标注,就像先给房子的承重墙加固,其他地方慢慢来。这种搞法,对已经跑在生产环境的大项目来说,心理负担小很多。绝了
离谱
不过我倒是有个疑问,这种渐进类型在实际协作里会不会产生新的问题?比如团队里一半人严格写类型,另一半人不写,review代码的时候会不会出现两套标准?或者更极端的,有人利用类型系统搞出特别复杂的泛型魔法,反而增加了理解成本?这种“自由度过高”带来的分歧,在Python的type hints推广过程中就挺明显的。啊
另外,我总觉得Elixir选在这个时间点推这个特性,除了工程上的考量,可能还有点生态位竞争的意味。现在后端语言赛道这么卷,Rust抢性能敏感的场景,Go吃基础设施,Elixir要巩固自己在高并发、实时系统这块的阵地,就得解决大规模协作的痛点。光靠“优雅”“生产力高”这种情怀牌,拉不动企业级用户。递梯子这个比喻很形象,但我觉得他们递的不光是梯子,更像是一套安全绳——让你在Erlang VM这座险峰上爬得更稳当,又不至于把你捆得动弹不得。
你们项目要是跟进的话,我挺好奇实际落地会遇到什么坑。尤其是那种 legacy 代码巨多的项目,是分批慢慢加,还是挑核心模块重点突破?有没有什么最佳实践能分享一下?