每个开发者都熟悉这条准则:分而治之,化繁为简。在计算机科学中,没有什么比将复杂任务拆解为更简单、更直观的单元更令人着迷——这是每个问题、每段程序、每行代码赖以建立的根基。

从这个观察出发,我想谈谈模块化与组合的魅力。我尝试在每个项目中贯彻这一原则,以便尽可能复用所写代码:我无法忍受一次性代码——为特定场景编写,运行后便弃之不顾。有些情境下这不可避免,但在能够避免的地方,我认为值得付诸努力。

打开网易新闻 查看精彩图片

当我称某物为"模块化",我并非仅指"被拆成碎片"。我指的是由自主单元构成,这些单元能够独立存在与演进,而不拖累整体。

对我而言,一个模块始终具备三个特质:

在实践中,模块化对我而言是一种降低长期变更成本的策略:若明日需要更新某一部分,我希望能够独立完成,而不破坏或重写其他一切。

当我在数字世界中思考模块化,有几个例子特别能体现其精神:不仅是"拆解",而是构建边界清晰、接口干净、拥有自身生命的积木——可以组合、替换或复用,无需从头开始。

我挑选的例子来自截然不同的语境——基础设施、前端、个人生产力——而这正是关键所在:模块化不是某种语言或框架的特性,而是一种思维方式,在堆栈的每个层级都会显现。在每个案例中,我喜欢观察两件事:

我喜欢将 Docker 容器想象成热插拔卡:封闭的、自包含的对象,无需关闭系统即可插入或拔出。每个容器携带自身代码、运行时、库与配置,仅通过干净的接口暴露自身:端口、卷、环境变量。

这一意象,我认为精准捕捉了 Docker 的模块化本质:

最有趣的部分在于思维转变:你不再"修复"服务器,而是像插卡一样替换组件。这一隐喻有其局限,而探索这些局限恰恰能澄清模块化所能承诺与无法承诺的边界。

但隔离性并不像隐喻暗示的那样彻底:容器共享宿主内核,可移植性则以镜像臃肿、构建缓慢、仍需关注的安全面为代价。

若 Docker 让基础设施模块化,Module Federation 则将同一精神带入前端:诞生于 Webpack 5,如今也通过插件在 Vite 中可用,它让多个应用