软件工程即知识工程:从知识传递视角重新理解研发过程
一、软件是载体,知识才是产品
理解软件工程的本质,需要先厘清一个根本问题:软件的真正产品是什么?
软件与书籍是同构的。书籍是载体,作家真正关心的是其中的人物、情节、观点和论据------内容才是产品,书籍只是内容的载体。软件同理:软件是载体,软件中所蕴含的知识才是真正的产品。
软件中最重要的知识是业务知识,包括业务流程、组织架构、行业规则、领域知识等。这些知识描述了软件如何帮助客户解决问题、企业如何运营业务。业务知识可以脱离软件存在,但软件不能脱离其内在知识而存在。
业务知识的载体不只是软件,还有人和组织。一个按公式计算报价的软件,其真正的产品是报价规则;掌握了这个规则的人,同样能完成报价工作。这个视角揭示了一个重要事实:当软件承担一部分业务知识时,或修改软件所承担的业务知识范围时,往往也会引起对应的组织变更。
除业务知识外,软件中还包含架构知识------关于"软件系统该如何实现"的知识。架构定义了系统中组件的类型及组件间的交互方式,有两个作用:帮助理解系统现状(显式知识),以及指导新需求的任务分解(不可言说知识)。
二、软件研发过程的认知模式分析
将软件研发过程映射到 Cynefin 框架,可以清晰地看到不同阶段的认知模式,从而理解效率差异的根本原因。
宏观研发过程:复杂模式
从宏观来看,软件研发是对业务知识的学习过程。在构造软件之前,我们无法 100% 确定所构造的软件是否能满足业务需求,是否能在现有知识结构下发挥作用。这是典型的"未知的未知",只能处于复杂认知模式。
这也是为什么主流研发流程都包含迭代元素:每次迭代都是一次**探测(根据已知情况构造软件)→ 感知(收集反馈验证软件是否有效)→ 响应(根据反馈改进方案)**的循环。
放大到产品生命周期,精益创业的"构建-度量-学习"循环与复杂模式完全对应:构建(Probe)→ 度量(Sense)→ 学习(Respond)。
业务需求转化:庞杂模式
进入交付流程之前,需要将业务知识转化为软件功能需求------按照目标解决方案(业务架构愿景)将业务知识映射为不同业务模块的软件需求。此时处于庞杂认知模式:感知(对要解决的问题已有初步理解)→ 分析(按照业务架构处理问题)→ 响应(得到各软件系统的需求)。
这里的"分析"能力,正是业务架构师积累的不可言说知识在发挥作用。
软件构造过程:庞杂模式
进入交付流程后,软件构造围绕质量展开,包括功能性质量(软件是否执行预定功能)和非功能性质量(性能、可靠性、可扩展性等)。
架构知识是从技术视角出发的解决方案,在任务分解过程中发挥作用------将软件需求在架构规定的组件范围内进一步分解为具体任务。这同样是庞杂认知模式:感知(理解要解决的问题)→ 分析(按照软件架构处理问题)→ 响应(得到针对不同架构组件的任务)。
架构腐化的本质:架构腐化不只是最终结果的问题,更多是在分解任务时架构无法有效起到指导作用,持续产生不正确的任务划分。当开发者无法用架构知识指导任务分解时,他们实际上处于复杂模式而非庞杂模式,这正是架构腐化的认知层面根因。
质量保障措施:不同模式对应不同效率
不同的质量保障措施对应不同的认知模式,效率差异显著:
代码审查处于复杂模式:探测(成员根据对架构的认知先完成功能)→ 感知(架构师或团队成员对已完成功能进行反馈,寻找不符合架构约束的地方)→ 响应(指明整改方向)。代码审查本质上是一种学习机制,表明开发者在探索架构约束的边界。
测试策略处于庞杂模式:感知(理解需求边界)→ 分析(将需求功能按不同边界分解为不同种类的测试)→ 响应(完成测试)。测试策略是基于分析的质量保障,效率高于代码审查。
这个对比揭示了一个反直觉的结论:Debug 是低效的复杂模式 (探测打断点 → 感知通过断点数据寻找问题成因 → 响应定位问题),表明开发者并不知道代码如何运转,正在学习当前代码库。而看起来"奇怪"的测试驱动开发(TDD)是庞杂模式,效率反而更高。
三、一个统一的视角
将软件研发过程理解为知识过程,可以得到一个统一的分析框架:
软件研发的宏观过程是业务知识的学习(复杂模式),进入交付后是业务知识和架构知识的应用(庞杂模式),具体的质量保障措施则根据其机制分别处于复杂或庞杂模式。
这个框架的实践价值在于:软件工程的优化方向,就是将复杂模式转化为庞杂模式,将庞杂模式转化为清晰模式。任何能够降低认知模式层级的实践,都是有效的效率提升手段。
对于 LLM 辅助软件工程,这个框架同样适用:LLM 能在庞杂模式和清晰模式下显著提升效率,但在复杂模式下,它只能作为探测工具,无法替代人的感知和响应过程------因为那个过程本身就是不可言说知识的学习机制。