内容提要
作者反驳“所有代码都是技术债”,认为代码是资产;技术债指软件内部模型与实际问题和心理模型不符,或接口未能减少假设。他以自身项目为例,说明增加代码反而能提升开发速度、降低技术债,并主张严格设计接口、减少假设、持续测试与重构,区分代码资产与代码负债。
延伸解读
技术债的重新定义:从代码量到模型错配
作者将技术债定义为软件及其内部模型与实际问题和心理模型不符,或接口未能减少假设。这一定义将焦点从代码行数转移到模型与问题的契合度上。读者可借此反思:技术债的根源往往不是代码多,而是假设多且未被严格管理。
增加代码也能降低技术债:一个反直觉的案例
作者以自身项目为例,在bc和dc中加入新关键字时,每个程序仅增加18行代码,开发速度反而提升。他通过自实现文件输入/输出系统解决命令行历史需求,减少繁琐问题。这表明,当新增代码精准匹配问题且接口设计得当时,代码量增加未必带来债务。
接口设计:减少假设的关键实践
作者强调接口应尽可能减少假设,并给出具体做法:严格定义接口的前提和后置条件,遵循接口编程,必要时调整接口或代码,持续迭代直至接口能轻松加入新功能而不影响已有功能。这为读者提供了可操作的技术债管理方向。
心理模型与持续测试:缩小认知偏差
作者认为程序错误是心理模型与软件实际表现之间的差异,因此通过模糊测试和修复错误来缩小差距,有时也调整心理模型。他还主张编码前先设计,构建问题的心理模型,以预防偏差。这提示读者,技术债的另一个维度是认知一致性。
Q&A
为什么说代码不是技术债?
作者认为代码本身是资产,技术债是指软件及其内部模型与实际问题和心理模型不符,或接口未能减少假设的情况。代码可能附带负债,但并非所有代码都是技术债。
技术债到底指什么?
技术债是软件与问题不契合的每一处,具体包括:代码与问题不相符、内部逻辑与问题不吻合、内部逻辑与用户及程序员思维不一致、内部逻辑与接口不协调,以及代码量超出解决问题所需。
增加代码怎么会反而降低技术债?
作者以自身项目为例,通过严格设计接口、减少假设,增加代码(如实现自定义文件输入/输出系统)解决了繁琐问题,从而降低了技术债,并提升了开发速度。
如何设计接口才能减少技术债?
作者建议:永远在自己的能力范围内编程;严格定义接口(包括前提条件和后置条件);严格遵循接口编程,必要时调整接口或代码;不断迭代直至接口近乎完美,使新功能能轻松加入而不影响已有功能。
心理模型与代码债有什么关系?
心理模型是软件在创造者和使用者心中的存在形态。代码债的另一方面是软件与心理模型之间的不一致。通过持续测试和修复错误,可以缩小这种差距,使模型与软件达到和谐统一。
如何避免代码变成负债?
作者的做法包括:在编码前先设计代码,构建心理模型;严格定义接口并减少假设;定期审查代码清除不必要的部分;持续测试和重构;果断削减不必要的功能。