王德生、张琼 著 · 第398卷 · 修订版v3.0

← 第十八章 使用者心中的封装第二十章 拆封、失效与再生 →

第十九章 封装的再组合

一、两个可靠单位为什么会组成不可靠的整体

设想一套文稿处理系统,第一项工具能够准确提取正文,第二项工具能够准确生成目录。分别检验时,两者都满足规定要求;连接以后,目录却指向错误章节。进一步检查发现,第一项工具重排了标题标记,第二项工具仍按原标记定位。局部能力没有消失,新连接却没有获得支撑。

这说明封装的再组合不是把可靠性直接相加。每个单位都在一定条件下承担工作,组合改变了输入、输出、时序和依赖。原来由使用者隐含补足的条件,进入自动连接以后可能无人处理。一个模块的成功结果,也可能不是下一个模块所需要的那种结果。

从SDE看,新整体具有自己的显露、差异序列和特征纠缠。不能只把下层各模块的检查报告堆在一起,就宣称上层S已经得到支持。组合使原来彼此分开的条件开始相互改变,因而需要在新层级重新研究价值怎样发生。

本章把这种新工作称为连接判断。它不要求重复每个模块已经完成的全部内部检查,而是要求检验组合新增的条件。连接判断做得好,既能继承历史能力,又能发现新问题;做得不好,就会在局部都正常的报告中留下整体失败。

二、输入输出相接,不等于意义相接

最简单的连接检查关注形式:前一模块输出的类型,是否符合后一模块输入要求。这项检查有用,却不足以保证语义连续。两个工具都接受文本,不意味着它们对文本的任务身份理解相同;两个数字都有相同格式,也可能使用不同单位或定义。

例如,第一模块给出的是候选来源列表,第二模块却把列表中的每一项当作已经核实的文献。形式接口完全兼容,证据身份却在连接时升级。失真不是生成模块单独造成,也不必由写作模块单独解释,而发生在候选与已核实之间没有被保留的区别。

因此,封装接口应当至少保留影响后续判断的语义信息。任务、条件、状态和依据不一定都要放在显眼文本中,但应当能够被下一环节实际读取。一个只传递漂亮结果、不传递完成范围的接口,会把必要判断推给无法知道缺口的后来者。

这种要求并不等于所有模块必须共享全部内部知识。恰当的接口正是选择哪些信息必须跨过边界,哪些实现细节可以继续封装。选择依据是下游任务需要,而不是默认越少越好或越多越安全。连接判断因此本身就是一种价值评估。

三、一个简单的逻辑模型

考虑两个经过证明的关系:A能够在条件P下给出Q,B能够在Q与R同时成立时给出T。仅有P,并不足以通过两者得到T,因为连接处还需要R。把两个引理的名称写在同一条箭头链上,不会使这个缺少的条件自行产生。

若另有依据说明P能够推出R,那么可以从P得到Q和R,再由第二个关系推出T。这个推理很简单,却揭示封装组合最基本的义务:下游要求的每一个承重条件,都要在当前连接中找到根据。它可以由上游产生,由初始条件提供,也可以通过独立检查取得,但不能由接口省略来替代。

对具有状态变化的技术过程,还要进一步区分开始时成立与调用时成立。设想R在初始状态为真,前一模块处理以后却可能改变相关对象,那么初始R不能未经保持性检查就当作后续R。组合不仅需要条件存在,还需要条件在适当时点继续成立。

这不是要求给所有日常行动写形式证明。逻辑模型的用途,是暴露一种常见的省略:把历史上或局部中成立的条件,直接传成当前整体条件。在数学证明中,这种省略可以明确检验;在技术与艺术任务中,也需要用相应领域的证据说明连接是否获得支撑。

四、局部正确性的范围会在组合中改变

一个模块在测试时接收整洁输入,部署到组合中以后却收到另一模块生成的模糊内容。即使它原先表现可靠,当前输入范围已经不同。不能把旧测试结论无条件搬过来,也不能因为新失败就否认旧结论在原范围内的意义。

这种变化可以通过接口契约来明确。上游承诺提供哪些属性,下游要求哪些属性,缺少时谁应停止或转交。契约不需要一次写出所有现实情况,但应优先保留决定当前使用的条件,并允许新案例促成修订。没有修订机制的契约,可能从保证变成掩盖未知的文书。

在证明系统中,上游提出的命题可能包含未定义术语,下游形式化模块为了继续工作自行补上定义。若这些定义没有回到研究者处确认,形式推导可以完成,原问题却在组合中改变。局部工具各自做出了合理选择,整体仍可能没有解决原任务。

因此,组合评估需要检查新整体的显露究竟是什么。最后得到的“完成”,必须说明包括哪些阶段、哪些目标和哪些证据。不能把各模块各自完成的不同任务,拼成一个看似统一却从未共同成立的整体成功。

五、共同依赖为什么比模块数量更重要

三个检查模块给出一致结论,听起来比一个模块更有说服力。但若它们都依据同一份错误摘要,一致可能只是共同依赖的结果。增加数量没有改变关键错误来源,反而可能让使用者误以为已经获得多重独立确认。

连接判断应当绘出真正重要的依赖,而不是只展示参与者名单。哪些模块使用相同数据,哪些共享同一目标解释,哪些依赖同一验证程序,哪些根据前一模块的结论继续?只有把这些关系显露,才能研究哪里有实际的相互校正,哪里只是同一判断的重复转述。

这不意味着共享依赖必然有问题。许多可靠工作正需要共同标准和工具。问题在于它是否被理解、是否获得适当支撑,以及高影响错误是否存在别的发现路径。共同依赖可以成为稳定条件,也可能成为共同失效点,不能凭“共享”这个词就预先褒贬。

再组合的成熟,因而不由模块数量决定。一个较小的组合若清楚保留条件和独立复核,可能比庞大却相互引用的网络更可靠;一个较大的组合若形成新的信息与检验关系,也可能提供真正增量。需要比较实际承接,而不是数量的外观。

六、概率不能被随意乘在一起

设想组合包含两个模块及它们之间的连接。把相关失败事件记为F一、F二和F连。若整体失败只可能来自这三类事件,那么失败概率不超过三者概率之和。这是事件并集的基本上界,不需要假定它们相互独立。它也提醒我们,连接本身必须作为可能的失败来源,而不是在计算中被删去。

但是,能够给各事件什么概率,仍然是经验与模型问题。某模块在独立测试中的失败率,不一定等于它在新组合实际输入下的失败率。若条件已经变化,直接把旧比例代入,数学公式仍然正确,应用却没有依据。可靠性推理需要同时检查公式和被代入的条件。

把各模块成功率直接相乘,则还需要相应独立性或条件概率关系。若一个失败会改变下游输入,或者多个模块共享同一数据缺陷,简单乘法就可能误导。不能因为结果保留许多小数,就把缺少依据的依赖假设隐藏起来。

本书使用这些简单概率关系,不是为复杂系统给出统一风险计算器,而是说明:模块已经有数字,不等于组合已有数字。新的关系需要新的判断,统计封装也需要保留适用范围。数学严谨性与发生诊断在这里相互需要,而不是相互替代。

七、顺序、并行与反馈会改变整体能力

相同的模块可以因不同连接形成不同能力。来源核对放在润色之前,可以让不支持的断言先被修改;放在全部排版之后,发现问题可能引起大范围返工。形式化与自然语言解释并行进行,可能早些显露语义差异;完全串行也可能便于追踪责任。没有一种次序在所有任务中自动最好。

六路径提供的是重新考虑入口和转向的方式。一个任务从已有候选结果进入,另一个从新的工具条件进入,后续模块不应只是照固定流水线执行,而需要允许新信息改变前面的安排。组合中的反馈若只能向前传,不能返回修改来源,很多问题就只能在末端被反复补救。

并行也需要相遇机制。两组各自完成报告,若没有针对分歧的比较,不能算作共同判断;若一组总被自动视为权威,另一组的差异也无法改变运行。要明确何种不一致触发复核,怎样保留不同依据,以及何时允许暂时不合并。

因此,组合的价值不是各模块能力的静态总和,而包含它们如何互相改变。新的D在连接中形成,新的E也由共同依赖和反馈关系生成;最终显露的S必须在这个新整体中接受检查。再组合本身就是一次发生,不是装配完成以后才开始判断。

八、一个文稿生产链的完整重组

考虑一条构造性的生产链:资料检索、内容起草、论证核对、语言编辑、格式装配。旧流程把前一项输出直接作为后一项输入,最终由作者通读。作者一旦无法逐句检查,未完成的依据就可能穿过全部环节进入正式文稿。

第一次修改是在检索与起草之间保留来源状态,让候选资料不能直接作为已核实依据。第二次修改是在起草与论证核对之间保留主张清单,使检查不必从全部文字中重新猜测承重断言。第三次修改是让论证问题返回材料或目标层,而不是全部交给语言编辑“写得更稳妥”。

语言编辑随后也有自己的范围:可以改善表达,但若改变假设、量词或结论强度,就应触发再次核对。格式装配则检查标题、编号和版本对应,不把版式成功当作知识完成。最终作者不必对每一项底层工作重新从头确认,却能够看到关键状态与尚未解决的问题。

这个组合尚不能凭描述就获得可靠性。它需要实际测试接口、异常与角色权限,也要比较是否真的减少重复劳动、提高问题发现。案例的贡献在于指出可以检查的连接,不是在纸上建立一个流程以后宣布生产质量已经提高。

九、组合怎样使旧能力发生新用途

再组合不仅制造风险,也能够形成新能力。一个原来用于局部检索的工具,与条件记录和依赖分析结合,可能支持研究者比较多条论证路线。一个原来用于文本校对的模块,与叙事结构分析结合,可能帮助作者发现语言调整与人物关系之间的联系。

这些新用途不能只由原模块说明书推出。它们需要在新任务中发生,经过试用与评估,才能成为新的封装。原来成熟的部分提供起点,新连接提供可能,当前对象决定哪些可能能够获得支撑。创新在这里不是凭空创造全部材料,也不是把旧材料任意堆积。

新的能力还可能反过来要求修改旧模块。例如,为了比较证明路线,原来的引理记录必须增加假设来源;为了追踪艺术修改,版本工具需要保存不只是字句差异,还有改动意图。上层任务进入下层封装,使历史能力在新的价值要求下重新组织。

这正是本书所说复合能力发生的一个具体结构。不是先测量人和每个工具的独立分数,再把它们相加,而是研究新连接改变了什么任务、什么差异能够显露、什么判断成为可能。增量需要在实际使用中展示,不能由“组合”一词自动保证。

十、组合的边界怎样保持可改变

当一个组合成熟以后,使用者可以把它作为整体调用。但如果所有内部模块因此被永久固定,新任务就可能被迫适应旧组织。封装需要稳定接口,也需要保留能够替换、拆分和重新连接的路径。稳定与可改变不是简单对立,它们服务不同时间尺度的任务。

模块替换尤其需要检验其承诺是否等价。新模块输出形式相同,不代表完成范围相同;速度提高,不代表保留原有检查;内部采用新方法,也不意味着旧的适用边界全部失效。需要依据任务合同逐项判断哪些可以继承,哪些必须重新确认。

这种工作可以优先围绕受影响的连接展开,而不每次重验所有内容。若边界与依赖记录清楚,改变的范围比较容易追踪;若过去只保留最后成品,任何更新都可能成为猜测。可维护性在这里不是后期便利,而是封装能否长期承接判断的一项条件。

对于使用者,重要变化也应进入适当提示。不能在内部条件已改变时,继续让他依据旧经验整体调用而没有任何说明。使用者侧的封装需要与技术侧一起更新,否则过去形成的信任会被用于支持一个实际上不同的复合体。

十一、新整体如何接受自己的价值评估

组合完成以后,需要在它自己的任务层级评估真、善、美。真涉及输出、过程与条件是否得到相互支撑;善涉及不同模块怎样承接当前任务,是否把负担不当外移;美涉及新的整体是否形成有效组织,以及是否保留重组和创造的可能。三者不能由下层各自的通过标记自动继承。

评估不必重新展开每一个内部细节。可以先检查承重接口、状态传递和新依赖,在发现异常时进一步定向展开。这样,封装提供了节省重复工作的基础,新的整体检查又避免把局部成熟误读为全局保证。两者共同构成分层判断,而不是互相取消。

新的组合若没有增量,也应当允许缩减。更多模块可能增加延迟、混淆状态或遮蔽责任。删去一个不能贡献独立判断的环节,可能使整体更有能力;保留一个看似重复却能触及共同盲点的环节,也可能是必要的。判断必须进入具体关系,不能靠模块数量或流程长度裁决。

组合的价值不由模块数量决定。一个多余环节可能放大共同误解,一个看似重复的核验却可能触及真正的盲点;应当保留哪一个,要看它实际承担了什么。新的整体因而不能只继承各部分的成功标签,还必须形成连接的依据。正是在这种重新检验中,旧封装可能继续可用,也可能需要局部拆开、整体重组或有理由地退出。

← 第十八章 使用者心中的封装第二十章 拆封、失效与再生 →