根据lawsofsoftwareengineering.com网站的分类体系,这些软件工程定律可以分为以下七大类别:
一、架构(Architecture)
- 康威定律(Conway's Law):组织设计的系统会反映其沟通结构
- 盖尔定律(Gall's Law):能工作的复杂系统必然从能工作的简单系统演变而来
- CAP定理:分布式系统只能保证一致性、可用性、分区容错性中的两个
- 海勒姆定律(Hyrum's Law):API用户足够多时,所有可观察行为都会被依赖
- 分布式系统八个错误假设:新分布式系统设计者常犯的八个错误假设
- 复杂系统变更定律:改变复杂系统时总会遇到意外
- 系统膨胀定律:小型成功系统往往被过度工程化的臃肿替代品取代
二、团队(Teams)
- 邓巴数(Dunbar's Number):一个人能维持约150个稳定关系
- 布鲁克斯定律(Brooks's Law):为延期项目增加人力只会让它更晚
- 团队规模与生产率:个人生产率随团队规模增大而降低
- 1%规则:总参与人数的平方根完成50%的工作
- 技术管理悖论:懂技术的人不管理,管理的人不懂技术
- 彼得原理(Peter Principle):员工会晋升到不胜任的层级
- 巴士因子(Bus Factor):项目陷入严重困境所需的最小团队成员损失数
- 无能晋升定律:公司倾向于提拔无能员工到管理层以限制其破坏
三、规划(Planning)
- 帕金森定律(Parkinson's Law):工作会填满所有可用时间
- 90-90规则:前90%代码占前90%时间,剩余10%占另外90%
- 侯世达定律(Hofstadter's Law):事情总比预期花更长时间
- 扎温斯基定律(Zawinski's Law):每个程序都会膨胀到能读邮件
- 古德哈特定律(Goodhart's Law):指标成为目标后就不再是好指标
四、质量(Quality)
- 过早优化:过早优化是万恶之源
- 童子军规则:离开时让代码比来时更好
- 破窗理论:不要留下未修复的破窗(坏设计、错误决策、差代码)
- 技术债务:开发软件时拖慢我们的一切
- 林纳斯定律(Linus's Law):足够多的眼睛能让所有bug变浅显
- 调试难度定律:调试比写代码难两倍
- 测试金字塔:项目应有大量快速单元测试、较少集成测试、少量UI测试
- 测试衰减定律:重复运行相同测试效果会随时间降低
- 软件演化定律:反映现实世界的软件必须演化,且演化有可预测限制
五、扩展(Scale)
- 阿姆达尔定律(Amdahl's Law):并行化加速受限于不可并行工作比例
- 古斯塔夫森定律(Gustafson's Law):通过增加问题规模可在并行处理中获得显著加速
- 梅特卡夫定律(Metcalfe's Law):网络价值与用户数平方成正比
- 测量重要性:任何需要量化的东西都能以某种方式测量,这比不测量好
- 墨菲定律(Murphy's Law):可能出错的事情总会出错
六、设计(Design)
- YAGNI原则:除非必要,不要添加功能
- 抽象泄漏定律:所有非平凡抽象在某种程度上都会泄漏
- 本质复杂性:每个应用都有固有不可减少的复杂性,只能转移不能消除
- 单一事实来源原则:每条知识必须有单一、明确、权威的表示
- KISS原则:设计和系统应尽可能简单
- SOLID原则:增强软件设计的五个主要指导原则
- 迪米特法则(Law of Demeter):对象只应与直接朋友交互,不与陌生人交互
- 最小惊讶原则:软件和接口应以最不令用户和其他开发者惊讶的方式行为
- 鲁棒性原则:对自己要保守,对他人要宽容
七、决策(Decisions)
- 斯特金定律(Sturgeon's Law):90%的东西都是垃圾
- 邓宁-克鲁格效应(Dunning-Kruger Effect):对某事了解越少,往往越自信
- 汉隆剃刀(Hanlon's Razor):不要归因于恶意,如果愚蠢或粗心能充分解释
- 奥卡姆剃刀(Occam's Razor):最简单的解释往往最准确
- 沉没成本谬误:因已投入时间或精力而坚持选择,即使放弃更有益
- 地图不是疆域:我们对现实的表征不等于现实本身
- 确认偏误:倾向于支持现有信念或想法的信息
- 阿马拉定律(Amara's Law):我们倾向于高估技术短期影响,低估长期影响
- 路径依赖:某物使用时间越长,继续使用的可能性越大
- 分治法:将复杂问题分解为最基本模块,然后从那里构建
- 逆向思维:通过考虑相反结果并反向工作来解决问题
- 帕累托法则(Pareto Principle):80%的问题来自20%的原因
- 坎宁安定律(Cunningham's Law):在互联网上获得正确答案的最佳方式不是提问,而是发布错误答案
这56条定律涵盖了软件工程从架构设计到团队管理、从项目规划到质量保证的全方位智慧,为开发者提供了系统性的指导框架。