Software Engineering Laws

把软件工程里的老问题,浓缩成一张判断清单。

这是一份中文导读版整理,按团队、计划、架构、质量、设计、规模与决策七个角度归类。 它不是逐字翻译,而是把每条定律整理成包含核心含义、常见场景和行动建议的知识卡片。

Dave 的头像
ENGINEERING

工程判断清单

把团队、架构、质量和决策问题整理成可以反复复盘的卡片。

许可 原站采用 CC BY-NC-ND 4.0 许可;这里提供中文导读与学习笔记,不分发原文全文翻译。
场景 适合评审、排期、架构讨论和事故复盘时快速检查盲点。
用法 先用分类建立地图,再点开原站查看更完整的英文说明、案例和延伸资料。

怎么使用这份清单

定律不是拿来背诵的,更适合在评审、排期、架构讨论和复盘时作为提醒。

做计划时

用它检查估算、范围、指标和交付节奏,避免乐观叙事压过真实约束。

做架构时

用它提醒复杂度、抽象泄漏、分布式假设和组织沟通都会进入系统形态。

做质量时

用它判断哪些债务会滚大,哪些测试能兜底,哪些小破损会慢慢改变团队标准。

做决策时

用它识别认知偏差、沉没成本、热潮误判和过度自信,让判断更接近真实世界。

56 条软件工程定律

每张卡片保留英文原名、中文译名、适用阶段和原站链接,并补充核心含义、常见场景和行动建议。

团队与组织

软件系统常常长得像它背后的沟通结构。

9 条
资深原文

康威定律

Conway's Law

核心系统架构会映射组织的沟通结构。团队之间如何协作、交接和争夺边界,往往会直接变成服务、模块和接口的形状。

场景微服务拆分、平台团队建设、跨部门需求交付、重构长期耦合系统时尤其明显。

行动先画清楚团队沟通路径和责任边界,再设计模块边界;如果架构目标变了,协作方式也要一起调整。

进阶原文

布鲁克斯定律

Brooks's Law

核心已经延期的软件项目,临时加人通常不会立刻提速,反而会增加培训、沟通和集成成本。

场景上线日期逼近、管理层想靠扩员补进度、团队需要快速接手陌生模块时。

行动优先缩小范围、切清依赖、减少并行冲突;只有任务可拆、接口清楚、有人能带时,加人才真正有效。

资深原文

邓巴数

Dunbar's Number

核心人能稳定维护的关系和上下文是有限的。组织变大后,靠“大家互相知道”维持协作会越来越脆。

场景团队从十几人扩到几十人、项目群增多、会议和群消息开始淹没真正的信息。

行动把团队拆成可独立交付的小单元,用文档、接口、节奏会议和负责人机制替代隐性关系网。

进阶原文

林格曼效应

The Ringelmann Effect

核心群体越大,个人贡献越容易被稀释;当责任不可见时,人会自然降低投入。

场景多人共同负责一个模块、大型评审会、没有明确 owner 的公共代码和流程。

行动让每项工作有明确 owner、明确验收结果和反馈周期;把“大家负责”改成“谁负责什么”。

资深原文

普莱斯定律

Price's Law

核心少数人往往贡献了大部分关键产出。工程团队中,核心维护者、架构判断者和高质量执行者的影响会被放大。

场景关键模块长期依赖少数人、评审排队、事故处理总找同几个人时。

行动保护高杠杆贡献者的深度工作时间,同时通过文档、轮值、结对和培训降低知识集中风险。

资深原文

帕特定律

Putt's Law

核心技术组织里,懂技术的人未必掌握管理权,掌握管理权的人也未必理解技术细节。

场景技术路线被非技术目标推动、管理层低估复杂度、工程师只讨论实现而忽视组织约束。

行动重大技术决策要同时呈现业务代价、技术风险和组织影响,让专业判断进入决策链路。

进阶原文

彼得原理

Peter Principle

核心人可能因为胜任当前岗位而被提拔,直到进入一个不再胜任的位置。优秀工程师不必然就是优秀管理者。

场景技术骨干转管理后疲惫、晋升只剩管理通道、团队失去一线技术核心时。

行动建立技术和管理双通道;晋升前验证目标岗位能力,而不只是奖励过去表现。

进阶原文

巴士因子

Bus Factor

核心如果一个关键系统只有少数人懂,团队就把连续性押在了个人身上。这个数字越低,组织越脆弱。

场景发布、运维、数据库脚本、核心算法、历史系统只有一个人能改时。

行动至少让两到三个人能独立接手关键链路;补齐运行手册、架构图、测试和演练。

资深原文

呆伯特原则

Dilbert Principle

核心组织有时会把不适合一线执行的人推到管理层,结果让管理岗位承担了错误的人才安置功能。

场景会议变多但决策变差、管理者远离真实问题、团队需要绕开管理层才能推进时。

行动用结果、判断质量和团队健康度评价管理者;不要把管理岗位当成“离开一线”的默认出口。

计划与估算

计划最容易输给范围、时间、指标和人类的乐观偏差。

6 条
入门原文

过早优化

Premature Optimization

核心没有证据就优化,容易把代码写复杂、把设计锁死,却没有解决真实瓶颈。

场景功能尚未稳定、数据规模未知、还没有 profiling,就开始为极端性能场景重构。

行动先让系统正确、清晰、可测;等真实数据暴露瓶颈,再针对热点做局部优化。

入门原文

帕金森定律

Parkinson's Law

核心工作会膨胀到填满可用时间。时间越松散,范围漂移和低效等待越容易出现。

场景项目没有中间验收、需求没有冻结点、排期只给截止日期不管过程。

行动把大目标拆成短周期交付,明确范围、验收标准和决策截止点,避免时间被自然消耗。

进阶原文

九十-九十法则

The Ninety-Ninety Rule

核心前 90% 看起来很快,最后 10% 往往吞掉同样多甚至更多时间。真正难的是集成、修边和上线。

场景Demo 很快完成,但权限、异常、兼容、迁移、监控和文档长期收不完。

行动估算时单独列出收尾清单,把集成、测试、发布、灰度和回滚作为一等任务。

入门原文

侯世达定律

Hofstadter's Law

核心复杂任务总会比预期更久,即使你已经考虑到它会更久。人对未知复杂度天然低估。

场景跨系统改造、遗留代码迁移、需求看似简单但牵动很多边界条件。

行动估算时用历史数据校准,设置缓冲,提前做技术 spike,并把不确定项显式列出来。

资深原文

古德哈特定律

Goodhart's Law

核心指标一旦变成目标,就会被优化、规避甚至扭曲。指标只能辅助判断,不能替代判断。

场景用代码行数、故事点、提交次数、缺陷数、响应时长作为单一绩效目标。

行动组合使用质量、结果和过程指标;定期检查指标是否诱导了错误行为。

进阶原文

吉尔布定律

Gilb's Law

核心无法清楚定义和衡量的目标,很难被可靠交付。模糊的“更好”会制造对齐幻觉。

场景需求写着“性能更快”“体验更顺”“稳定性更高”,但没有指标和验收方法。

行动把质量目标量化成可观察结果,例如响应时间、错误率、转化率、恢复时间或人工步骤数。

架构与复杂度

抽象、分布式系统和第二版野心,都会把复杂度重新带回来。

9 条
资深原文

海勒姆定律

Hyrum's Law

核心只要使用者足够多,任何可观察行为都可能被依赖,即使它没有写进正式契约。

场景API 改版、日志格式调整、排序规则变化、默认值改变、前端依赖后端“偶然行为”。

行动把兼容性当成真实约束;变更前盘点隐性依赖,提供迁移期、版本化和弃用公告。

资深原文

加尔定律

Gall's Law

核心能工作的复杂系统通常从能工作的简单系统演化而来,而不是一次性设计出来。

场景新平台、新中台、新架构蓝图试图一步到位覆盖所有未来场景。

行动先做最小可运行系统,验证关键路径,再在真实反馈中扩展复杂度。

进阶原文

抽象泄漏定律

Law of Leaky Abstractions

核心抽象可以降低日常使用成本,但不能永久隐藏底层事实;边界情况会把底层细节重新暴露出来。

场景ORM 性能问题、网络库超时、容器资源限制、云服务异常和并发 bug。

行动使用抽象时保留底层心智模型,关键链路要知道它最终如何存储、调用、失败和恢复。

资深原文

泰斯勒定律

Tesler's Law

核心复杂度不会凭空消失,只会被分配给用户、产品、工程或运维中的某一方。

场景为了让用户少填一步,后端需要推断、同步、校验和处理大量异常。

行动显式决定复杂度由谁承担,并评估这是否符合产品价值、团队能力和长期维护成本。

资深原文

CAP 定理

CAP Theorem

核心在网络分区出现时,分布式系统必须在一致性和可用性之间做取舍。

场景跨机房数据库、分布式缓存、订单库存、协同编辑和多区域部署。

行动按业务代价选择策略:哪些数据必须强一致,哪些可以最终一致,哪些场景宁可暂时不可用。

资深原文

第二系统效应

Second-System Effect

核心第二版系统很容易承载过多愿望,因为团队想把第一版遗憾一次性补完。

场景大重写、平台升级、产品 2.0、架构替换时功能边界迅速膨胀。

行动为重写设定更窄目标和迁移路径,优先解决一两个核心问题,而不是顺手重做一切。

资深原文

分布式计算谬误

Fallacies of Distributed Computing

核心分布式系统中,网络、延迟、带宽、安全、拓扑和运维成本都不能被假设为理想状态。

场景服务拆分后调用链变长,系统开始遇到超时、重试风暴、部分失败和数据不一致。

行动默认远程调用会失败;为超时、幂等、降级、熔断、观测和数据修复设计明确方案。

资深原文

意外后果定律

Law of Unintended Consequences

核心任何改变都可能触发预料外的副作用,尤其是在复杂系统和复杂组织中。

场景改一个缓存策略影响数据新鲜度,改一个激励指标改变团队行为,改一个接口影响下游。

行动上线前做影响面分析和预演,上线后用监控、灰度、告警和回滚机制快速收敛风险。

资深原文

扎温斯基定律

Zawinski's Law

核心通用软件常被诱惑不断扩展边界,最后变成“什么都想做”的平台。

场景工具产品不断加入聊天、通知、文档、工作流和数据看板,核心体验反而变重。

行动每次新增能力都问:这是核心价值的一部分,还是边界失控?能否通过集成而不是内置解决?

质量与演化

质量不是最后补上的工序,而是每天积累出来的系统习惯。

11 条
入门原文

童子军规则

The Boy Scout Rule

核心离开代码时,让它比你来时更好一点。持续的小改善能避免质量滑坡。

场景顺手修正命名、删除无用分支、补一个测试、把重复逻辑抽出来。

行动把改进控制在当前任务附近,避免借机大重构;每次提交都留下一个更清楚的局部。

入门原文

墨菲定律

Murphy's Law / Sod's Law

核心可能出错的地方终会出错。工程系统必须假设失败会发生,而不是假设一切顺利。

场景磁盘满、网络断、权限错、配置缺失、用户输入异常、第三方服务超时。

行动为失败路径写测试和处理逻辑;关键流程准备重试、降级、告警、备份和恢复手段。

进阶原文

波斯特尔法则

Postel's Law

核心对外接收可以适度宽容,对自身输出必须严格稳定。宽容输入能提升兼容性,严格输出能减少混乱。

场景API 解析旧客户端字段、导入历史数据、处理第三方回调格式差异。

行动输入层做清洗和兼容,输出层坚持规范、版本和 schema;不要让宽容变成无边界。

进阶原文

破窗理论

Broken Windows Theory

核心明显的问题长期无人处理,会降低团队对质量的默认标准,更多问题会被默许。

场景测试长期红着、lint 被忽略、临时代码一直留着、文档明显过期。

行动快速修复可见坏味道;如果暂时不能修,至少记录 owner、原因和处理时间。

入门原文

技术债

Technical Debt

核心为速度做出的技术折中会产生利息。债务不是罪,但不管理就会吞噬未来交付能力。

场景临时方案变长期依赖、测试缺失导致不敢改、架构捷径让后续功能越来越慢。

行动记录债务本金和利息,用业务语言解释代价,并把还债安排进真实迭代。

进阶原文

林纳斯定律

Linus's Law

核心足够多人用不同视角审视代码,问题更容易暴露。质量来自可见性和反馈密度。

场景开源项目、代码评审、安全审计、事故复盘和日志观测。

行动让关键代码更容易被审阅、运行和验证;建立评审文化,而不是依赖少数人的直觉。

入门原文

柯尼汉定律

Kernighan's Law

核心调试通常比写代码更难。如果写代码时已经用尽聪明才智,维护时就会更困难。

场景炫技式一行代码、复杂状态机、过度抽象、没有日志和测试的并发逻辑。

行动宁可写清楚一点,也不要写到只有自己当下能懂;为未来调试留下命名、日志和测试。

入门原文

测试金字塔

Testing Pyramid

核心测试组合应该有大量快速底层测试、适量集成测试和少量端到端测试。

场景只靠端到端测试导致反馈慢、易碎、定位困难;只靠单元测试又覆盖不了集成风险。

行动把业务规则放进快速测试,把接口契约和关键用户路径放进更高层测试。

进阶原文

杀虫剂悖论

Pesticide Paradox

核心同一批测试反复运行,能发现的新缺陷会越来越少。测试也会老化。

场景测试全绿但线上仍频繁出问题,说明测试覆盖的风险已经落后于系统变化。

行动根据事故、变更热点和真实用户路径更新测试;加入探索测试、属性测试或混沌测试等新视角。

资深原文

莱曼软件演化定律

Lehman's Laws of Software Evolution

核心被真实使用的软件会持续变化,并且在变化中自然变复杂。维护不是例外,而是常态。

场景产品上线后需求不断变、兼容旧数据、支持新平台、修复长期积累的边界问题。

行动把演化能力设计进系统:模块边界、测试、迁移脚本、可观测性和持续重构都要长期存在。

入门原文

斯特金定律

Sturgeon's Law

核心多数产物质量平平并不意外。好质量需要筛选、打磨和反馈,而不是自然出现。

场景代码、需求、文档、方案和会议纪要初稿质量不稳定。

行动建立评审和筛选机制,接受初稿粗糙,但不要让粗糙未经处理就进入生产。

设计原则

好的设计经常不是多做,而是知道哪些东西先不要做。

6 条
入门原文

YAGNI 原则

YAGNI

核心不要为了想象中的未来需求提前实现功能。提前设计常常带来真实的复杂度,却只服务假设。

场景提前做插件系统、多租户、复杂权限、抽象数据层,但当前产品还没有这些需求。

行动保留可演化空间,但延迟实现;等需求真实出现时,再用更准确的信息设计。

入门原文

DRY 原则

Don't Repeat Yourself

核心同一知识不应散落多处。重复会让修改变慢、行为不一致,并扩大维护成本。

场景相同业务规则在前端、后端、脚本和文档中各写一份。

行动抽出真正相同的知识来源;但不要为了表面相似过早抽象,避免把不同变化节奏绑在一起。

入门原文

KISS 原则

Keep It Simple, Stupid

核心简单不是简陋,而是减少不必要的概念、路径和依赖,让系统更容易理解和修改。

场景为小需求引入复杂框架、过多层级、难以解释的配置和抽象。

行动优先选择可读、可测、可替换的方案;复杂性必须为明确收益付费。

进阶原文

SOLID 原则

SOLID Principles

核心SOLID 是一组降低面向对象系统变化成本的设计约束,重点是职责、扩展、替换、接口和依赖方向。

场景类职责膨胀、继承层次混乱、接口过大、依赖具体实现导致测试困难。

行动用 SOLID 识别变化点和耦合点,不要机械套原则;目标是降低变更成本,而不是增加仪式感。

进阶原文

迪米特法则

Law of Demeter

核心模块应尽量少知道其他模块的内部结构。调用链越深入,耦合越隐蔽。

场景代码里出现类似 a.b.c.doSomething 的穿透式访问,说明调用方知道了太多内部细节。

行动让对象暴露更贴近意图的方法,把内部导航封装在拥有数据和规则的模块内。

进阶原文

最小惊讶原则

Principle of Least Astonishment

核心接口、交互和命名应该符合使用者预期。让人意外的行为会增加学习成本和事故概率。

场景按钮文案与结果不一致、API 默认行为反直觉、函数名看似查询却会修改状态。

行动按用户和调用者的心理模型设计;对危险行为使用清晰命名、确认和显式参数。

规模与网络效应

当系统变大,性能、并行和连接价值都会出现新的约束。

3 条
资深原文

阿姆达尔定律

Amdahl's Law

核心系统加速受限于无法并行的部分。并行资源再多,也绕不开串行瓶颈。

场景多线程、分布式任务、构建系统、数据处理流水线中,某个单点步骤拖住整体。

行动先量化串行比例,再决定是否扩容;优化最慢的不可并行部分通常收益最大。

资深原文

古斯塔夫森定律

Gustafson's Law

核心资源增加不只可以缩短时间,也可以让系统处理更大规模的问题。

场景机器学习训练、批量分析、渲染、搜索索引和大规模仿真。

行动评估扩展性时,不只问“能快多少”,也问“能不能在同样时间内处理更大问题”。

资深原文

梅特卡夫定律

Metcalfe's Law

核心网络价值会随连接数量增长而放大。节点越多,潜在连接和协作价值越高。

场景开发者生态、协作平台、插件市场、社交产品、知识库和内部平台。

行动不要只优化单点功能,也要降低连接成本:邀请、集成、发现、权限和协作体验都影响网络价值。

决策与认知

工程判断不仅是技术问题,也会被心理偏差和信息结构影响。

12 条
入门原文

达克效应

Dunning-Kruger Effect

核心能力不足时,人反而可能高估自己;随着理解加深,才会更准确地意识到问题复杂度。

场景新技术刚学会就全面引入、低估遗留系统、过度自信地承诺排期。

行动用评审、原型、数据和复盘校准判断;让不确定性明确进入方案和排期。

入门原文

汉隆剃刀

Hanlon's Razor

核心很多问题来自疏忽、误解、信息不完整或系统缺陷,不必第一时间归因于恶意。

场景接口被误用、需求理解偏差、线上事故、跨团队合作中的“对方为什么这样做”。

行动先查事实和流程,再判断动机;把问题转化为可修复的沟通、文档和系统约束。

入门原文

奥卡姆剃刀

Occam's Razor

核心解释力相近时,优先选择假设更少的方案。复杂解释需要更多证据。

场景排查 bug 时同时怀疑编译器、框架、网络和缓存,却忽视最近一次简单改动。

行动从最少假设、最容易验证的路径开始排查;逐步增加复杂度,而不是一开始就跳到稀有原因。

进阶原文

沉没成本谬误

Sunk Cost Fallacy

核心已经投入的成本不该决定下一步。继续投入要看未来收益,而不是过去付出。

场景平台重写失败但不愿停止、功能没人用但持续维护、方案错误却因为投入太多继续推进。

行动定期设置止损点,用未来价值、机会成本和替代方案重新评估,而不是用过去投入证明继续合理。

进阶原文

地图不是疆域

The Map Is Not the Territory

核心模型、图表、文档和指标只是现实的简化,不等于真实系统本身。

场景架构图很清楚但代码已偏离,需求文档完美但用户行为不同,仪表盘正常但体验很差。

行动把文档和指标当作导航工具,同时定期回到真实代码、日志、用户反馈和运行环境中校验。

进阶原文

确认偏误

Confirmation Bias

核心人会更容易注意和相信支持自己观点的信息,忽略反例。工程判断也会被立场牵引。

场景技术选型、性能优化、事故归因、产品假设验证时,只找支持已有结论的数据。

行动主动寻找反证,邀请持不同意见的人评审,并在实验前写清楚什么结果会推翻假设。

进阶原文

技术炒作周期与阿马拉定律

The Hype Cycle & Amara's Law

核心新技术短期影响常被高估,长期影响又容易被低估。热潮和低谷都不是最终答案。

场景AI、区块链、低代码、云原生等技术在组织内被快速神化或快速否定。

行动用小规模真实场景验证价值;既不盲追,也不因第一轮失望而忽视长期演化。

进阶原文

林迪效应

The Lindy Effect

核心经受时间考验的非易逝事物,往往更可能继续存在。稳定原则通常比短期潮流更可靠。

场景选择数据库、协议、语言、架构原则、基础工具和团队实践。

行动对基础层优先选择久经验证的技术;对新技术要求更明确的收益和退出方案。

进阶原文

第一性原理思维

First Principles Thinking

核心把问题拆回最基本事实,而不是沿用类比、惯例或行业模板。

场景面对新业务、新架构、新成本模型时,过去经验只能部分参考。

行动先列出不可变约束、真实目标和基本资源,再从这些事实重新推导方案。

进阶原文

反向思考

Inversion

核心不仅问怎样成功,也问怎样会失败。反过来看问题,能暴露乐观计划忽略的风险。

场景项目启动、上线准备、安全设计、可靠性设计和事故预案。

行动做 pre-mortem:假设项目失败了,列出最可能原因,然后提前消除或监控这些原因。

入门原文

帕累托原则

Pareto Principle

核心少数原因常带来大部分结果。影响通常不平均分布,工程投入也不该平均分配。

场景少数 bug 造成大部分事故,少数页面贡献大部分流量,少数模块消耗大部分维护时间。

行动用数据找高影响区域,优先处理最能改善结果的 20%,避免把精力平均撒开。

入门原文

坎宁安定律

Cunningham's Law

核心提出一个具体但可能不完美的答案,往往比空泛提问更容易获得修正和反馈。

场景技术方案讨论、PR 草稿、接口设计、文档初稿和社区求助。

行动别只问“该怎么做”;先给出草案、假设或最小实现,让别人能围绕具体对象改进。

延伸阅读

这份页面适合快速复盘;如果要引用、学习完整案例或查看英文资料,请回到原站。

许可说明

本站仅提供中文导读与重新整理的学习笔记,不复制或分发原站正文的完整翻译。