思维模型格栅

计算机与信息 · 5/7

抽象与模块化Abstraction and Modularity

把变化留在模块内部,用稳定接口协作,让人无需懂全部也能掌控整体。

货物换一种运输工具,不必再把每件东西搬一遍。1956 年 4 月 26 日,美国新泽西州纽瓦克港,麦克莱恩推动改装的油轮“理想 X 号”载着 58 个集装箱驶向休斯敦。过去,码头工人要逐件搬运散货;这次,他们搬的是装好货的整只箱子。箱子到港后能转到配套的卡车底盘上,里面的货不用重新装卸。船和卡车各有自己的构造,却能通过同一只箱子接力。搬运者面对的是箱子的尺寸、重量和固定方式,无须围着每件货物重新安排装卸。

为什么成立

保留什么细节,要看你拿它做什么

收银员按下“退款”,系统退回钱并给出结果;他无须知道银行怎样记账。抽象就是保留完成任务所需的信息,把其余细节藏起来。模块化则把退款交给一个有明确边界的部件,让别的部件通过约定调用它。前者决定外部看到什么,后者决定内部由谁负责。

接口稳定,内部变化才能留在内部

接口是一份可依赖的约定:输入什么、返回什么、出错怎么办。退款还要说清到账时间,以及重复提交会不会重复退钱。满足这些约定,开发者就能替换内部实现,收银界面仍按原来的方式工作。隐藏细节能减轻负担,是因为接口保留了协作所需的保证。

按变化的原因划边界,才能少牵动别人

把银行协议封装在支付模块内,银行换协议时就集中修改这一处。若各个业务模块自行处理银行字段,一次改动就得追着多处修改。好的模块把因同一原因而变化的细节放在一起,让其他模块只依赖稳定的承诺。文件分开了,却互相读取内部数据,改动仍会到处传。

换掉一块还能运转,才说明边界有效

模块内部有人负责细节,外部的人只学习接口,理解和协作的负担便分散开了。检验方法是设想换一家供应商、换一种算法或换一个负责人:其他部分是否还能照原约定工作?若连交付格式和含义都得一起重写,就该重新划边界。

出处

这套方法在计算机科学的软件设计中逐步成熟,没有单一发明者。1972 年,戴维·帕纳斯发表《论将系统分解为模块的准则》,用关键词索引程序比较两种拆分方式。经典论证是:按处理步骤拆分会暴露内部依赖;围绕需要隐藏的设计决策拆分,更便于修改和独立开发。

换个领域看

技术

换机器保留程序

统一程序所依赖的机器规则,能把硬件升级与应用开发隔开。1964 年 4 月 7 日,IBM 发布 System/360 系列,用统一架构连接不同档次的计算机。遵守共同架构的应用程序,能随客户升级到更强的机型继续使用。工程师可以改变机器内部的实现,客户保留下来的是按接口编写的软件。

投资

拆开现金流来源

把不同业务拆成可核对的现金流,能看清估值由什么支撑。研究一家自有物业的零售商时,投资者把门店经营与物业出租分开估算,并让两边采用同一租金口径。门店扩张就更新经营预测;租金改变就同步更新两边。内部租金在一边是成本、另一边是收入,合并时抵消,不能凭拆分多算一份收益。

个人生活

让照护能够交接

把交接约定写清楚,家人轮班照护才不必每次从头询问。兄妹轮流陪行动不便的父亲生活,把买菜、陪诊和夜间照护分开负责。每次换班都交代已完成的事、下次预约和异常状况;谁跑哪家超市由当班的人决定。妹妹临时出差,哥哥凭同一份记录接手,家里也不必重排全部安排。

遇事时问自己

  1. 我眼下要完成什么任务,哪些细节会改变我的决定,哪些可以交给别人负责?
  2. 哪些细节会因同一个原因一起变化,应该放进同一个模块?
  3. 交接时必须约定哪些输入、交付结果、时间和出错处理?
  4. 换掉内部做法或负责人后,其他部分还能按原约定工作吗?
  5. 哪些风险必须穿过接口告诉使用者,不能藏在模块内部?

边界与误用

当各部分必须频繁共同调整时,硬拆模块会增加交接成本。飞机设计中,重量、结构与气动彼此牵动,优化一块就得让其他负责人参与。任务尚在摸索时,过早固定接口也会把错误假设写成约束。最常见的误用是把隐藏细节当成免除理解和责任:重量、危险品或故障不能因装进箱子就不再告知。接口必须暴露影响外部决策的风险。模块拆得越细,协调、测试和维护接口的成本越高;只有隔开的变化值得这些成本时,拆分才划算。

练一练

连锁健身房更换了会员数据服务商。新服务商仍按时交付同样的表格,字段名称也没变,但把“活跃会员”从“近30天到店过”改成了“近30天打开过应用”。运营主管看到人数上升,准备增加晚间教练排班。

哪种判断最站得住?

你准备投资一只量化基金。经理承诺不公开具体交易信号,每月只提供净值和收益率。进一步询问后,你发现两只收益曲线相近的候选基金,一只几乎不用杠杆,另一只大量借款,并持有难以迅速卖出的资产。

投资前最值得补充哪项要求?

你装修一间很小的厨房,分别请了橱柜、电器和水电团队。设计尚未定稿,洗碗机尺寸会改变柜体宽度,柜体位置又影响插座和排水。为了让三队独立推进,你准备立即锁定各自的尺寸,之后只验收各队是否符合自己的图纸。

此时哪一步最合适?