计算机与信息 · 5/7
抽象与模块化Abstraction and Modularity
把变化留在模块内部,用稳定接口协作,让人无需懂全部也能掌控整体。
货物换一种运输工具,不必再把每件东西搬一遍。1956 年 4 月 26 日,美国新泽西州纽瓦克港,麦克莱恩推动改装的油轮“理想 X 号”载着 58 个集装箱驶向休斯敦。过去,码头工人要逐件搬运散货;这次,他们搬的是装好货的整只箱子。箱子到港后能转到配套的卡车底盘上,里面的货不用重新装卸。船和卡车各有自己的构造,却能通过同一只箱子接力。搬运者面对的是箱子的尺寸、重量和固定方式,无须围着每件货物重新安排装卸。
为什么成立
保留什么细节,要看你拿它做什么
收银员按下“退款”,系统退回钱并给出结果;他无须知道银行怎样记账。抽象就是保留完成任务所需的信息,把其余细节藏起来。模块化则把退款交给一个有明确边界的部件,让别的部件通过约定调用它。前者决定外部看到什么,后者决定内部由谁负责。
接口稳定,内部变化才能留在内部
接口是一份可依赖的约定:输入什么、返回什么、出错怎么办。退款还要说清到账时间,以及重复提交会不会重复退钱。满足这些约定,开发者就能替换内部实现,收银界面仍按原来的方式工作。隐藏细节能减轻负担,是因为接口保留了协作所需的保证。
按变化的原因划边界,才能少牵动别人
把银行协议封装在支付模块内,银行换协议时就集中修改这一处。若各个业务模块自行处理银行字段,一次改动就得追着多处修改。好的模块把因同一原因而变化的细节放在一起,让其他模块只依赖稳定的承诺。文件分开了,却互相读取内部数据,改动仍会到处传。
换掉一块还能运转,才说明边界有效
模块内部有人负责细节,外部的人只学习接口,理解和协作的负担便分散开了。检验方法是设想换一家供应商、换一种算法或换一个负责人:其他部分是否还能照原约定工作?若连交付格式和含义都得一起重写,就该重新划边界。
出处
这套方法在计算机科学的软件设计中逐步成熟,没有单一发明者。1972 年,戴维·帕纳斯发表《论将系统分解为模块的准则》,用关键词索引程序比较两种拆分方式。经典论证是:按处理步骤拆分会暴露内部依赖;围绕需要隐藏的设计决策拆分,更便于修改和独立开发。
换个领域看
技术
换机器保留程序
统一程序所依赖的机器规则,能把硬件升级与应用开发隔开。1964 年 4 月 7 日,IBM 发布 System/360 系列,用统一架构连接不同档次的计算机。遵守共同架构的应用程序,能随客户升级到更强的机型继续使用。工程师可以改变机器内部的实现,客户保留下来的是按接口编写的软件。
投资
拆开现金流来源
把不同业务拆成可核对的现金流,能看清估值由什么支撑。研究一家自有物业的零售商时,投资者把门店经营与物业出租分开估算,并让两边采用同一租金口径。门店扩张就更新经营预测;租金改变就同步更新两边。内部租金在一边是成本、另一边是收入,合并时抵消,不能凭拆分多算一份收益。
个人生活
让照护能够交接
把交接约定写清楚,家人轮班照护才不必每次从头询问。兄妹轮流陪行动不便的父亲生活,把买菜、陪诊和夜间照护分开负责。每次换班都交代已完成的事、下次预约和异常状况;谁跑哪家超市由当班的人决定。妹妹临时出差,哥哥凭同一份记录接手,家里也不必重排全部安排。
遇事时问自己
- 我眼下要完成什么任务,哪些细节会改变我的决定,哪些可以交给别人负责?
- 哪些细节会因同一个原因一起变化,应该放进同一个模块?
- 交接时必须约定哪些输入、交付结果、时间和出错处理?
- 换掉内部做法或负责人后,其他部分还能按原约定工作吗?
- 哪些风险必须穿过接口告诉使用者,不能藏在模块内部?
边界与误用
当各部分必须频繁共同调整时,硬拆模块会增加交接成本。飞机设计中,重量、结构与气动彼此牵动,优化一块就得让其他负责人参与。任务尚在摸索时,过早固定接口也会把错误假设写成约束。最常见的误用是把隐藏细节当成免除理解和责任:重量、危险品或故障不能因装进箱子就不再告知。接口必须暴露影响外部决策的风险。模块拆得越细,协调、测试和维护接口的成本越高;只有隔开的变化值得这些成本时,拆分才划算。
练一练
连锁健身房更换了会员数据服务商。新服务商仍按时交付同样的表格,字段名称也没变,但把“活跃会员”从“近30天到店过”改成了“近30天打开过应用”。运营主管看到人数上升,准备增加晚间教练排班。
哪种判断最站得住?
可依赖的交付不仅包括字段名称,还包括字段含义。口径变了,原来的决策规则就需要重新检验。
先执行再观察,似乎能减少更换服务商的停顿。但人数现在衡量的是打开应用,不能直接支撑到店排班。
沿用旧程序看起来最能保证连续性。但需要稳定的是指标含义和交付保证,计算程序可以不同。
门店经验确实有用。但让每家门店各自补救口径变化,会把同一个问题散到多处,也让排班依据难以核对。
这次更换保住了表格外形,却改变了数字的含义。外部能够继续使用原来的规则,依赖的是稳定的约定;只保持字段名称,并不能把内部变化隔开。
你准备投资一只量化基金。经理承诺不公开具体交易信号,每月只提供净值和收益率。进一步询问后,你发现两只收益曲线相近的候选基金,一只几乎不用杠杆,另一只大量借款,并持有难以迅速卖出的资产。
投资前最值得补充哪项要求?
把目标交给专业经理,能减少日常干预。但收益目标没有说明损失会怎样放大,也没有保证需要时能退出。
更频繁的数据有助于观察波动。但平稳的净值仍可能藏着杠杆和流动性风险,增加频率没有补上缺失的信息。
彻底看懂策略能带来掌控感。但投资判断未必需要全部实现细节,复现代码也不能替代对杠杆和退出条件的核查。
交易信号可以由经理负责,但会改变投资决定的风险必须对外可见。明确披露和通知要求,才有条件把具体操作交出去。
投资者可以不掌握每笔交易的实现细节,却必须知道自己承担什么风险。把专业操作交给别人,并不免除判断责任;收益率之外,还要保留影响投入和退出的信息。
你装修一间很小的厨房,分别请了橱柜、电器和水电团队。设计尚未定稿,洗碗机尺寸会改变柜体宽度,柜体位置又影响插座和排水。为了让三队独立推进,你准备立即锁定各自的尺寸,之后只验收各队是否符合自己的图纸。
此时哪一步最合适?
这些决定仍在相互牵动,先共同验证才能找到可靠的边界。等关键关系确定,再让各队按明确要求分别施工。
提前锁定图纸似乎能减少反复沟通。但尚未验证的尺寸会变成硬约束,连接问题可能到安装时才暴露。
指定一个团队先行,能让流程显得清楚。但现成电器和排水条件未必能迁就柜体,单向推进可能造成返工。
分工更细能减轻个人负担。但这里的难点是尺寸彼此依赖,增加负责人还会增加交接,不能消除共同调整的需要。
分别负责,不等于能够独立变化。这间厨房的关键尺寸仍然紧密相连,过早固定交接要求会把未经验证的假设锁进施工;先共同设计,才能判断哪些变化可以留在各队内部。