ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

hacker-laws 开发者必知定律、原理与模式大全:法文译本全量精读

hacker-laws 开发者必知定律、原理与模式大全:法文译本全量精读 文档知识库教程【免费下载链接】hacker-laws Laws, Theories, Principles and Patterns for developers and technologists.项目地址https://gitcode.com/GitHub_Trending/ha/hacker-laws点击查看免费下载hacker-laws 是一个面向开发者与技术从业者的开源参考仓库系统整理了软件工程领域中人们常挂在嘴边的定律、理论、原理与模式其法语译本 translations/fr.md 是内容最完整的本地化文档之一。本文以该法文译本为骨架逐条精读其收录的 28 条定律与 17 条原则并结合仓库配套资源图解、eBook 生成脚本进行深化讲解帮助你在架构设计、代码评审、团队管理与技术决策中准确理解并使用这些经典概念。项目概览hacker-laws 是什么hacker-laws 的英文 READMEREADME.md将其定位为开发者和技术从业者会发现的定律、理论、原理与模式集合而法语译本 translations/fr.md 完整继承了这一脉络从计算性能阿姆达尔定律、摩尔定律到组织管理布鲁克斯定律、彼得原则从分布式系统分布式计算的八条谬误到面向对象设计SOLID再到沟通协作惠顿定律、坎宁安定律覆盖面极广。需要特别强调的是仓库在引言中明确声明它只是解释这些定律、原理与模式并不倡导其中任何一条。它们是否适用于你的项目始终是一个值得讨论的问题且高度取决于你所处的具体工作场景。这是阅读本手册时最重要的前提——所有的定律都是一把思考的尺子而不是必须遵守的教条。仓库的配套资产除了核心文档仓库还提供了若干配套资源图解资产images/目录下存放了阿姆达尔定律、炒作周期、菲茨定律Fitts Law与希克定律Hicks Law等示意图网站页面assets/site/目录包含多版首页index.html、index2.html 等说明项目同时维护着 Web 呈现eBook 生成脚本scripts/prepare-markdown-for-ebook.sh可将 README 加工为带 YAML 元数据title、author、subtitle、version的电子书 Markdown并通过sed清理 emoji、翻译区块等内容。从脚本用法可以看出项目的发布流程以./scripts/prepare-markdown-for-ebook.sh README.md hacker-laws.md的形式调用要求设置VERSION环境变量并用DATE缺省为当天日期填充版本信息。第一部分定律Lois定律部分收录的是软件工程世界中关于不可避免的现实的观察与论断。以下逐条精读。阿姆达尔定律Loi dAmdahl阿姆达尔定律是一个展示计算任务潜在加速比的公式通过增加系统资源所能获得的加速受限于程序可被并行化的程度。它通常用于并行计算领域可预测增加处理器数量的实际收益。用一个经典例子说明假如一个程序由两部分组成——部分 A 必须由单个处理器串行执行部分 B 可以并行化——那么给系统增加多个处理器只能带来有限的收益它可能大幅加速部分 B但部分 A 的速度丝毫不会改变。图中可以清楚看到一个只有 50% 可并行化的程序在超过 10 个处理单元之后几乎不再获益而 95% 可并行化的程序即使使用超过一千个处理单元仍能获得显著的加速提升。在 摩尔定律 趋缓、单核处理器频率提升放缓的当下并行化成为性能改进的关键。图形编程就是绝佳的例子——基于现代 Shader 的渲染计算中每个像素或片元都可以独立并行渲染这正是现代显卡动辄拥有数千个计算核心GPU / Shader Units的原因。实践启示做性能设计时先评估代码中可并行化与必须串行的部分再决定投入多少资源做并行化改造——盲目堆核数对串行瓶颈毫无帮助。关联阅读布鲁克斯定律、摩尔定律。破窗理论Théorie de la vitre brisée破窗理论认为环境中可见的犯罪或无人照料的痕迹迹象会诱发更多、更严重的犯罪或环境的进一步恶化。这一理论被移植到软件开发中低质量的代码或者说技术债会让团队成员产生改进代码质量的努力不被重视、甚至被完全忽视的认知从而放任质量进一步下滑形成恶性循环导致代码质量随时间急剧劣化。实践启示在代码评审与日常维护中修好每一扇破窗——哪怕只是清理一个命名混乱的变量、补上一段缺失的注释也能传递质量是被珍视的信号遏制熵增。布鲁克斯定律Loi de Brooks向一个已经延误的软件项目增加人力只会让它更加延误。这条定律指出在很多情况下试图通过加人来加速一个已经滞后的项目反而会让交付更晚。布鲁克斯本人也明确承认这是一个高度简化但其背后的推理是新成员需要磨合期ramp-up time同时沟通开销随之增加因此在短期内团队的交付速度不升反降。更关键的是很多任务不可分割——无法简单地分配到更多人头上这进一步压低了潜在的速度提升。九个女人无法在一个月内生出一个婴儿这句广为流传的话正是对布鲁克斯定律的生动诠释某些工作本质上不可拆分、不可并行。这也是经典著作《人月神话》The Mythical Man Month的核心主题之一。实践启示项目延期时先诊断瓶颈是人力不足还是任务不可拆分/沟通内耗加人之前先评估磨合成本与沟通成本。康威定律Loi de Conway康威定律认为系统的技术边界会反映生产它的组织结构。它经常在组织改进的讨论中被引用——如果组织被划分为许多互不相连的小单元其产出的软件也会是零散的如果组织围绕功能或服务构建纵向的竖井结构软件系统也会同样呈现这种形态。实践启示当你想让软件架构变成某种理想形态例如微服务时往往需要先调整组织结构架构追随组织是设计团队结构与服务拆分时的第一性原理。关联阅读Spotify 模型。坎宁安定律Loi de Cunningham在互联网上获得正确答案的最佳方式不是提出一个问题而是发布一个错误的答案。据 Steven McGeady 回忆Ward Cunningham 在 1980 年代初对他说过这句话McGeady 将其命名为坎宁安定律尽管坎宁安本人否认这一归属称其为误引。这条定律最初描述的是 Usenet 上的互动现象如今被广泛用来解释 Wikipedia、Reddit、Twitter、Facebook 等在线社区的运作机制——错误答案会迅速引来纠错者从而更快地汇聚出正确答案。实践启示在技术社区提问时先摆出自己当前的可能是错误的理解往往能比干巴巴地提问更快获得高质量的纠正与讨论。邓巴数Nombre de Dunbar邓巴数是一个人能够同时维持稳定社会关系的最大人数上限——即一种知道每个人是谁、以及每个人与其他人的关系的人际关系。关于具体数字并无统一共识……[邓巴]提出人类只能舒适地维持约 150 段稳定关系。他还给过一个更生活化的描述你在酒吧偶遇对方时不会觉得尴尬而拒绝与对方同桌喝一杯的人数。学界对数字的估计通常在 100 到 250 之间。在工程语境中开发者与代码库的关系就像人际关系一样需要投入精力去维护。面对庞大复杂的项目或同时拥有多个项目时我们会借助约定convention、策略policy与标准化的流程modeled procedure来规模化。邓巴数不仅在公司规模增长时值得牢记在设定团队努力的边界、或者决定系统是否该投入工具来建模与自动化后勤开销时同样重要。从工程角度量化它可以理解为你有信心加入其 on-call 轮值去支持的项目的数量或单项目的归一化复杂度。实践启示为团队划定服务/项目归属时注意不要让单人或单团队拥有超出认知负载的项目数量工具化、流程化是突破 150 这条关系上限的手段。关联阅读康威定律。高尔定律Loi de Gall一个能正常运转的复杂系统几乎总是从一个能正常运转的简单系统演化而来的。一个从零开始完整设计的复杂系统永远不会运转也无法靠修补让它运转起来。你必须从一个能运转的简单系统重新开始。 ——John Gall高尔定律意味着试图一次性设计出高度复杂的系统失败概率极高。高度复杂的系统很少一步到位而是从更简单的系统逐步演化而来。最经典的例子是万维网World Wide Web。它当前是一个高度复杂的系统但最初只是被定义为在学术机构之间共享内容的一种简单方式。在成功达成这一目标之后系统才随时间推移不断变得复杂。实践启示不要试图大爆炸式地设计复杂架构先交付一个能跑通核心场景的简单系统再依据真实需求演化。这与 KISS 原则一脉相承。关联阅读KISS 原则。古德哈特定律Loi de Goodhart任何被观测到的统计规律性一旦被施加控制压力就会趋于崩塌。 —— Charles Goodhart更常见的表述是当一个衡量指标变成了目标它就不再是一个好的衡量指标。 —— Marilyn Strathern这条定律指出基于指标KPI的优化可能会导致指标本身失去价值。将一套过度精简的指标盲目套用到流程上会产生扭曲的效果——人们倾向于局部钻空子gaming the system去满足特定指标而忽视自身行为对系统的整体影响。文中的两个具体例子极具代表性通过编写不做任何断言assert-free的测试可以轻松刷到任意的代码覆盖率——尽管指标的本意是让软件得到充分测试用提交的代码行数衡量开发者绩效会导致代码库无意义的膨胀。实践启示设定指标时要时刻警惕指标反噬——指标应该服务于目标而不是取代目标组合多维度指标、定期审视指标与真实意图的偏差是缓解古德哈特定律的常用手段。汉隆剃刀Rasoir de Hanlon永远不要把可以用愚蠢充分解释的行为归因于恶意。 —— Robert J. Hanlon这一原则提示我们导致负面结果的行为未必源于恶意更可能的原因是行为本身及其影响没有被充分理解。实践启示代码评审、跨团队协作中先假设对方是不知道而不是故意使坏能显著降低沟通摩擦把精力集中在澄清事实与改进方案上。霍夫斯塔特定律Loi de Hofstadter事情总是比预期花更长时间即使你已经把霍夫斯塔特定律考虑在内。 —— Douglas Hofstadter你会在估算某项工作所需时间时听到这条定律。软件开发的常识是我们非常不擅长估算一个项目的完成时间。这条定律出自《哥德尔、艾舍尔、巴赫集异璧之大成》Gödel, Escher, Bach: An Eternal Golden Braid。实践启示在做工期估算时为不确定性预留缓冲霍夫斯塔特定律的递归性提醒我们——任何已经考虑了这条定律的估算本身仍然会偏乐观。赫特伯定律Loi de Hutber改善即恶化。 ——Patrick Hutber这条定律认为对系统某一部分的改进会导致其他部分的恶化或者掩盖其他的恶化最终从整体上造成系统状态的退化。例如降低某个端点end-point的响应延迟可能在更下游引发吞吐量与容量问题波及一个完全不同的子系统。实践启示任何优化都要放到全链路去看——局部最优不等于全局最优上线性能优化前评估其对下游队列、缓存、限流等环节的连带影响。技术炒作周期与阿马拉定律Cycle du hype Loi dAmara人们倾向于高估一项技术在短期内的影响而低估它在长期内的影响。 —— Roy Amara炒作周期Hype Cycle是对一项技术随时间推移的吸引力与发展的可视化描述最初由 Gartner 提出。用大白话来说新技术通常会出现一个兴奋峰值团队纷纷快速采用并寄予厚望随后却往往对结果感到失望——可能是因为技术成熟度不足也可能是因为技术落地的具体场景尚未被充分掌握。经过一段时间后应用机会与能力增长到足以让团队真正高产。Roy Amara 的名言更简洁地总结了这一点高估短期、低估长期。实践启示技术选型时理性评估新技术所处的周期阶段把炒作峰值与生产力平台期区分开避免在期望膨胀期做出过重的承诺。海勒姆定律Loi dHyrum隐式接口定律当一个 API 的用户数量足够多之后无论接口承诺了什么系统的所有可观察行为都会有人依赖。 —— Hyrum Wright海勒姆定律描述了这样一个事实当一个 API 拥有足够多的用户时API 的所有行为——包括那些并未在公共规格中定义的行为——都会被某些人依赖。一个琐碎的例子是 API 的非功能性表现比如响应时间一个更微妙的例子是有人用正则表达式匹配错误消息来判断错误的类型。即使 API 规格对消息内容只字未提某些用户仍会依赖这些消息——一旦消息内容变更对这些用户而言就等同于 API 被破坏。实践启示维护公共 API尤其是大用户量的时任何看似无足轻重的细节变化错误消息文案、时序、日志格式都可能构成破坏性变更变更前应评估隐式契约或者主动将关键行为显式化。关联阅读泄漏抽象定律、分布式计算的谬误。克尼汉定律Loi de Kernighan调试代码比编写代码难一倍。因此如果你在编写代码时已经尽可能地聪明那么按定义你就不够聪明去调试它。 —— Brian Kernighan克尼汉定律以 Brian Kernighan 命名源自他与 Plauger 合著的《编程风格要素》The Elements of Programming Style中的名句人人都知道调试比最初编写程序难两倍。所以如果你在编写时已尽可能狡猾那你又如何能调试它呢虽然略带夸张但克尼汉定律论证了这样一个观点简单代码优于复杂代码——因为复杂代码中出现的任何问题都将是代价高昂甚至无法调试的。实践启示写代码时把可调试性作为一等公民刻意追求精巧clever的写法最终付出代价的往往是调试者通常就是几个月后的你自己。关联阅读KISS 原则、Unix 哲学、奥卡姆剃刀。梅特卡夫定律Loi de Metcalfe网络的价值与用户数量的平方成正比。这条定律基于系统内部两两之间连接数量的计算与里德定律高度相关。Odlyzko 等人提出过反驳里德定律与梅特卡夫定律没有考虑人类智力的认知极限因而高估了系统的价值——参见邓巴数。实践启示评估平台型、网络型产品通讯工具、市场、社交网络时梅特卡夫定律是解释网络效应与赢家通吃的理论起点但也要警惕对规模的盲目信仰。关联阅读里德定律、邓巴数。摩尔定律Loi de Moore集成电路中的晶体管数量大约每两年翻一番。这条定律常被用来形容半导体与芯片技术演进之快。Moore 的这一预测在 1970 年代至 2000 年代被证明相当准确。不过近年来这一趋势已经放缓部分原因是元器件微型化触及了物理极限如量子隧穿效应。尽管如此并行化方面的进步以及半导体与量子计算领域潜在的颠覆性变化或许仍能让摩尔定律在未来数十年继续延续。实践启示在免费午餐单核频率提升终结的背景下软件性能工程的重心正转向并行、异构GPU/NPU与专用硬件架构选型时不再默认硬件升级就能解决性能问题。墨菲定律 / 索德定律Loi de Murphy / Loi de Sod凡是可能出错的事就一定会出错。由 Edward A. Murphy Jr. 提出的墨菲定律指出如果一件事可能出错那它就会出错。这是开发者耳熟能详的公式——意外总在开发、测试甚至生产环境中不期而至。该定律还可以与英国英语中更常见的索德定律Sods Law联系起来凡是可能出错的事就一定会出错——而且是在最糟糕的时刻。这些定律常以幽默的口吻被使用。然而认知偏差——例如确认偏差与选择偏差——可能让人们过分重视这些定律多数时候事情正常运转时我们不甚留意一旦出问题它就格外显眼并引发讨论。实践启示墨菲定律的真正工程价值在于防御性设计——为失败预留路径重试、回滚、熔断、降级把会出错当作默认假设而非小概率事件。奥卡姆剃刀Rasoir dOccam如无必要勿增实体。 —— William of Ockham奥卡姆剃刀告诉我们在多个可能的解决方案中最可能的是那个附带最少概念与前提假设的方案。它最简洁能在解决问题时不附带引入额外复杂性与潜在的负面后果。实践启示方案评审时哪个方案引入了最少的新概念/新依赖是重要的决策维度奥卡姆剃刀与 YAGNI、精益软件开发中消除浪费的思想同源。关联阅读YAGNI。帕金森定律Loi de Parkinson工作会膨胀直至填满所有可用的完成时间。在原始语境中这条定律基于对行政机构的研究。它可以被应用到软件开发项目中理论认为团队在临近截止日期前会低效运转然后赶工以赶上期限——这让截止日期变得或多或少有些武断。如果把这条定律与霍夫斯塔特定律叠加会得到一个更加悲观的前景工作膨胀到占据所有可用时间并且最终仍然比预期耗时更久。实践启示帕金森定律是截止日期设计的警示——没有明确验收标准的宽松排期往往会诱发效率下降反之把大任务拆成有明确边界的小里程碑可以对抗时间的膨胀效应。过早优化效应Effet doptimisation prématurée过早优化是万恶之源。 ——Donald Knuth在 Donald Knuth 的文章《Structured Programming With Go To Statements》中他写道程序员会把大量时间浪费在思考或担忧程序中非关键部分的速度上而这些追求性能的尝试在计入调试与维护成本后实际影响是强烈负面的。我们应该忘掉微小的效率提升可以说 97% 的情况下过早优化是万恶之源。然而我们也不应该放过那关键的 3% 中的机会。过早优化也可以更简单地定义为在还不确定是否需要优化之前就进行优化。实践启示先用 Profile 数据说话再动手优化把优化投入集中在真实热点那关键的 3%上而不是在冷路径上雕花。普特定律Loi de Putt技术被两类人支配理解自己并不管理的东西的人以及管理自己并不理解的东西的人。普特定律常伴随其推论出现任何技术层级迟早都会发展出一种能力倒置inversion of competence。这些论断暗示由于群体组织方式中的各种筛选标准与倾向一家技术公司里往往存在两类人——技术上胜任但不在管理岗的员工以及身处管理职位但对技术复杂性与难度理解不足的管理者。这可以归因于彼得原则或迪尔伯特原则等现象。需要说明的是这类定律属于概括generalizations只适用于某些组织类型而非全部。实践启示在技术团队中建立技术决策需由技术负责人背书的机制可以在一定程度上对冲管理岗与技术岗之间的能力落差。关联阅读彼得原则、迪尔伯特原则。里德定律Loi de Reed大型网络尤其是社交网络的效用随网络规模的增大呈指数级增长。这条定律基于图论网络效用随着可能形成的子群sub-groups数量而增长。Odlyzko 等人提出反驳里德定律没有考虑人脑的认知极限因而高估了网络效用——参见邓巴数。实践启示社交型产品、社区型产品的价值不只来自点对点连接更来自可形成的子群体——这解释了为什么兴趣小组/圈子类功能往往带来超线性增长。关联阅读梅特卡夫定律、邓巴数。复杂度守恒定律Loi de Tesler这条定律指出系统中存在一部分无法被减少的复杂度。系统复杂度的一部分源于疏忽——不良的结构、错误、或对问题的错误建模所致。这类复杂度可以被削减甚至消除。但另一部分复杂度是内在的intrinsic来自问题本身的性质它只能被转移而无法被消除。这条定律最有趣的启示是即使你把整个系统简化了内在复杂度并不会消失而是被转嫁给了用户——由用户来承担这部分补偿成本。实践启示API 与产品设计中的简化本质上是在系统复杂度与用户复杂度之间做转移决策承认复杂度必须存在才能理性地决定它应该待在系统里还是用户侧。泄漏抽象定律Loi des abstractions qui fuient所有非平凡的抽象都会或多或少地泄漏其底层细节。 ——Joel Spolsky这条定律指出计算机科学中用来简化复杂系统使用的抽象在特定情境下会把一部分底层系统泄漏出来。以文件读取为例文件系统 API 是对底层内核机制的一种抽象而内核机制本身又是对磁盘或 SSD 的闪存物理读写过程的抽象。大多数情况下把文件当作二进制数据流处理这一抽象会按预期工作。但在机械磁盘上顺序读取会显著快于随机读取因为磁头寻道代价高昂而在 SSD 上这种额外代价并不存在。由此可见为了高效处理这类场景开发者必须理解底层细节例如数据库的索引文件会按特定结构组织以降低随机访问的开销——抽象泄漏了部分实现细节而开发者可能需要了解它们。上述例子在存在额外抽象层时会变得更加复杂。例如 Linux 操作系统允许程序通过网络访问文件却把它们在本地表现得平平无奇。一旦网络出问题这一抽象就会泄漏如果开发者把这类文件当作普通文件处理而完全无视它们可能面临网络延迟或失败软件就会运行失常。Joel Spolsky 的文章还指出对抽象的过度依赖叠加对底层过程理解的匮乏会让问题在某些情况下变得更难处理。文中还给出了一个真实案例Photoshop 启动缓慢作者曾遇到的真实问题——Photoshop 启动极慢有时需要数分钟。根因是软件在启动时会读取默认打印机的信息而当该打印机通过网络连接时这一读取极其耗时。抽象把网络打印机伪装得与本地打印机无异正是它给网络状况不佳的用户带来了困扰。实践启示使用抽象框架、中间件、云服务时务必保留对底层关键行为的认知模型泄漏点往往就藏在性能、时延、一致性等非功能特性里。关联阅读海勒姆定律。琐碎定律Loi de futilité这条定律认为组织会把大量时间与注意力投入到琐碎或表面化的细节上而忽视那些根本性的、困难的问题。最常被引用的虚构例子是一个审批核电站建设计划的委员会把大部分时间花在讨论自行车棚上而不是核电站本身的设计。原因在于对宏大而复杂的议题没有深厚专业背景或充分准备的人很难做出有价值的参与但人们又希望显得自己在有效参与于是倾向于把焦点放在那些容易讨论但无关紧要的细节上。这个例子催生了术语 Bike Shedding自行车棚指在琐碎细节上浪费时间。另一个相关术语是 Yak Shaving剃牦牛毛指一项看似无用的活动它实际上是通往主任务的漫长前置链条中的一环。实践启示会议与评审中主动为高价值议题分配明确的讨论时长上限对自行车棚级细节用默认决策或后续异步讨论快速收场避免琐碎议题吞噬评审能量。Unix 哲学Philosophie dUnixUnix 哲学的核心主张是计算机程序应当小巧、只做一件事、并且把这件事做好。与构建庞大、复杂、多功能程序相比通过组合小而边界清晰的基本单元来构建系统通常更简单。诸如微服务架构等近期实践可以被视为这条哲学的一种应用服务足够小、职责单一从而允许用简单的积木组合出复杂的行为。实践启示模块/服务边界设计时优先考虑单一职责 可组合这既是 Unix 哲学也是微服务拆分的基本判据。Spotify 模型Modèle de SpotifySpotify 模型是一种由 Spotify 推广的公司与团队组织方法。在该模型中团队围绕功能而非技术来组织。Spotify 模型还推广了 Tribe部落、Guild行会与 Chapter章节等组织结构概念作为其组织体系的组成元素。实践启示团队编排时围绕功能组建跨职能小队 用行会/章节保持技术专长横向流动是一种被广泛验证的规模化敏捷组织形态它与康威定律形成呼应——组织形态会塑造软件形态。沃德勒定律Loi de Wadler在任何语言设计中花在讨论列表中某一项上的总时间与该条目所处位置的 2 次幂成正比。语义Sémantique语法Syntaxe词法语法Syntaxe lexicale注释的词法语法Syntaxe lexicale des commentaires 通俗地说每花 1 小时讨论语义就会有 8 小时花在讨论注释的语法上与琐碎定律类似沃德勒定律指出在设计一门语言时花在讨论不同方面上的时间与这些方面的重要性成反比。实践启示在语言/DSL/API 设计评审中警惕讨论时长与重要性倒挂——花最多时间争论的往往是最琐碎的表层问题缩进、命名风格、注释格式而真正决定成败的语义设计反而缺乏充分讨论。惠顿定律Loi de Wheaton别当混蛋Dont be a dick。 —— Wil Wheaton由 Wil Wheaton《星际迷航下一代》《生活大爆炸》演员提出的这条定律简洁、凝练而有力旨在提升职业环境中的和谐与尊重。它可以应用于与同事交谈、进行代码评审code review、反驳其他观点、提出批评以及大多数人与人之间的交互场景。实践启示代码评审是最直接的落点——把批评指向代码而不是人用提问代替断言惠顿定律是高效技术协作的最低社交契约。第二部分原则Principes原则通常是与设计相关的指导方针。以下逐条精读。迪尔伯特原则Principe de Dilbert公司倾向于系统性地提拔无能的员工以便把他们从工作流中移除。 —— Scott Adams这是由 Scott Adams漫画 Dilbert 的作者提出的管理概念灵感来自彼得原则。按照迪尔伯特原则从未在工作中展现出能力的员工会被提拔到管理岗位以限制他们可能造成的损害。Adams 最初在 1995 年的《华尔街日报》文章中阐述了这一原则并在其 1996 年的著作《The Dilbert Principle》中展开了这一概念。实践启示在晋升与人才盘点机制中明确区分专家路线与管理路线避免把技术不行的人送上管理岗止损成为默认路径。关联阅读彼得原则、普特定律。帕累托原则80/20 法则生活中的大多数事物都不是均匀分布的。帕累托原则指出在许多情形下少数原因产生了多数结果。软件开发的典型例子包括一个软件的 80% 可以在 20% 的开发时间内完成反过来最难啃的 20% 要花掉 80% 的时间20% 的努力产出了 80% 的结果20% 的工作带来了 80% 的收入20% 的 bug 导致了 80% 的崩溃20% 的功能支撑了 80% 的使用量。1940 年代被广泛视为质量控制之父的罗马尼亚裔美国工程师 Joseph M. Juran 博士开始应用帕累托原则解决质量问题。这一原则也被称为 80/20 法则、关键少数定律The Law of the Vital Few与因子稀疏原则The Principle of Factor Sparsity。文中的真实案例2002 年微软报告称修复被报告最多的那 20% 的 bug就消除了 Windows 与 Office 中 80% 的相关错误与崩溃。实践启示Bug 治理、性能优化、功能规划都可以先做 Pareto 分析——用数据找出关键的 20%把有限资源投在回报最高的那部分。彼得原则Principe de Peter在层级组织中人们倾向于晋升到自己不胜任的层级level of incompetence。 —— Laurence J. Peter彼得原则是 Laurence J. Peter 提出的管理概念在工作中表现出色的人会被不断晋升直到抵达一个他们不再成功的层级即不胜任层级。到达这一层级后凭借已有的资历他们不太可能被解雇除非表现特别糟糕于是便会停留在那个自己可能并不擅长、但难以被替换的岗位上。这一原则对工程师尤其有警示意义很多工程师从深度技术的岗位起步却逐渐转向管理岗位——而管理需要的是本质上完全不同的能力。实践启示职业规划中应把晋升与能力匹配分开评估组织在晋升制度中引入试点/带教/回退机制可以减少彼得原则造成的双输。关联阅读迪尔伯特原则、普特定律。鲁棒性原则Postel 定律宽容地接收be liberal in what you accept严谨地发送be conservative in what you send。该原则常被应用于服务端应用开发你发送给别人的东西应当尽可能最小化、符合规范但你应该愿意接收不规范的输入只要它们可以被处理。这条原则的目标是构建稳健的系统——只要输入尚可理解就能处理格式不当的输入。然而接受格式不当的输入存在潜在的安全隐患尤其是当对这些输入的处理没有得到充分测试时。更长远地看允许不合规的输入会削弱协议演进的能力因为用户迟早会开始依赖这种宽容性参见海勒姆定律。实践启示在宽容输入与严格校验之间做显式权衡——面向公网的入口层通常需要更严格的 schema 校验而协议内部实现可以适度宽容对畸形输入的测试要覆盖充分。SOLIDSOLID 是五个面向对象设计原则的首字母缩写S单一职责原则Single Responsibility PrincipleO开闭原则Open/Closed PrincipleL里氏替换原则Liskov Substitution PrincipleI接口隔离原则Interface Segregation PrincipleD依赖倒置原则Dependency Inversion Principle这些原则是面向对象编程的基石遵循它们可以帮助开发者构建更易维护的系统。以下分别精读。单一职责原则每个模块或类应当只有一个职责。作为 SOLID 的第一条原则它建议模块或类只做一件独特的事。换言之对程序某功能的一个小改动应当只要求改动一个组件。例如修改密码校验方式的改动应当只需要修改程序中的一个地方。理论上这会让代码更健壮、更易修改。知道自己正在修改的组件只有单一职责也意味着测试这一修改会更容易。沿用上面的例子修改密码校验组件应当只影响该功能而修改一个身兼数职的组件时要厘清影响范围则困难得多。实践启示划分类与模块时以改变的理由为唯一标准——一个类应当只有一个变更理由。开闭原则实体应当对扩展开放对修改关闭。SOLID 的第二条原则实体类、模块、函数等的行为应当可以被扩展但已有行为不应被修改。设想一个能把 Markdown 文档转换为 HTML 的模块它可以被扩展——例如添加对某种新 Markdown 特性的支持——而不必修改其内部运作方式同时它对修改是关闭的使用者无法改变已有代码的写法。这一原则对面向对象编程尤其重要多数时候我们追求设计出易于扩展、且已有行为不可被意外修改的对象。实践启示优先通过继承、组合、策略、装饰器等机制做扩展点而不是直接改已有实现对可扩展性敏感的场景库、框架、公共模块开闭原则是核心约束。里氏替换原则应当可以在不破坏系统的前提下用子类型替换父类型。SOLID 的第三条原则如果某个组件依赖于一个类型那么它应当能够使用该类型的任何子类型而不会导致系统崩溃也无需了解子类型的细节。例如假设有一个从文件结构中读取 XML 文档的方法。若该方法使用基础类型文件那么所有从文件派生的类型都应当能与该方法协作。如果文件支持从尾部向前搜索而 XML 解析器恰好使用了这一能力但派生类型网络文件并不支持从尾部搜索那么网络文件就违反了该原则。这一原则对面向对象编程尤其重要类型层级必须被精心设计以免让系统的使用者陷入困惑。实践启示检查继承层级时用行为契约而不是代码复用来衡量——子类必须兑现父类的全部行为承诺包括隐式承诺参见海勒姆定律。接口隔离原则任何客户端都不应依赖它不使用的接口方法。SOLID 的第四条原则组件的使用者不应依赖该组件中它们不会用到的功能。沿用从文件读取 XML的例子该方法只需要读取字节、在文件中前进/后退。如果当文件的一个无关功能例如文件访问权限模型更新变化时该方法却需要跟着更新那就违反了该原则。更好的做法是让文件实现一个 seekable-stream可定位流接口并让 XML 读取器只依赖这个接口。这一原则对面向对象编程尤其重要接口、层级与抽象类型被用来最小化耦合鸭子类型duck typing则通过消除显式接口来实践这一原则。实践启示接口按调用方视角切分而不是按实现方全貌切分——小而专的接口比大而全的接口更容易演化。依赖倒置原则高层模块不应依赖低层实现。SOLID 的第五条原则高层组件不应需要知道其依赖的细节。设想一个从网站读取元数据的程序它有一个主组件主组件知道一个负责下载页面内容的组件以及一个能读取元数据的组件。依据依赖倒置原则主组件应只依赖两个抽象一个能下载二进制数据的抽象组件以及一个能从二进制流读取元数据的抽象组件。主组件不必了解 TCP/IP、HTTP、HTML 等概念。这一原则之所以复杂是因为它看起来颠倒了系统内预期的依赖方向这正是其名称由来。实践上它还意味着某个编排者组件必须确保抽象类型被正确实现沿用上面的例子某个东西必须给元数据读取组件提供一个 HTTP 文件下载器和一个 HTML 元标签读取器。这就引出了控制反转与依赖注入等模式。实践启示让业务核心依赖抽象接口而非具体实现配合依赖注入容器/组合根来装配实现核心代码因此可独立测试、可替换实现。DRY 原则在一个系统中每一条知识都必须有唯一的、无歧义的、权威的表示。DRY 是Dont Repeat Yourself不要重复自己的缩写。该原则旨在帮助开发者减少代码重复把信息保存在唯一的位置。它由 Andrew Hunt 与 Dave Thomas 于 1999 年在《程序员修炼之道》The Pragmatic Programmer一书中提出。DRY 的反面是WETWrite Everything Twice 或 We Enjoy Typing即所有东西写两遍或我们喜欢敲键盘。实践中如果你把同一信息放在了两个或更多地方就可以运用 DRY 把它们合并并在所有需要的地方复用这一唯一实例。实践启示重复的知识业务规则、常量、校验逻辑应当收敛到单一权威来源但要注意——两段碰巧长得像但演化方向不同的代码强行 DRY 反而制造耦合需要结合语境判断。KISS 原则Keep it simple, stupid.保持简单笨蛋KISS 原则主张大多数系统在简单状态下比在复杂状态下运行得更好。因此简单应当是设计中的核心目标任何不必要的复杂都应被避免。这一原则源自 1960 年代的美国海军常被归于工程师 Kelly Johnson。这个原则最好的例证是 Johnson 的故事他给一队工程师一捧工具要求他们设计一种战斗机——必须能让普通机械师在战场上仅凭这些工具就能完成修理。这里的stupid指的是事物损坏的方式与可用于修理的工具之精巧程度之间的关系而绝非对工程师能力的贬低。实践启示设计评审时把最简可行方案作为默认基线任何新增复杂度都必须当场说明其必要性复杂度的使用者维护者、运维者决定了它是否值得。关联阅读高尔定律。YAGNIYAGNI 是YouAintGonnaNeedIt你不会需要它的的缩写。只在真正需要的时候实现东西而不是在你认为以后可能会需要的时候实现。 ——Ron Jeffries极限编程联合创始人《Extreme Programming Installed》作者这条源自*极限编程Extreme Programming, XP*的原则建议开发者只实现当下必需的功能避免试图预测未来而提前实现那些将来可能需要但很可能不需要的功能。遵循这一原则应当能减少代码库中未使用代码的数量避免把时间浪费在不能带来价值的功能上。实践启示需求评审中的黄金问题——这个功能现在的真实用户是谁——如果答案是未来可能会那就先不做YAGNI 与过度设计的斗争是架构演进的第一道防线。关联阅读阅读清单中的《Extreme Programming Installed》。分布式计算的谬误也被称为网络计算的谬误是一系列关于分布式计算的假设或信念清单这些假设可能导致软件开发中的问题。八条假设如下网络是可靠的The network is reliable网络延迟为零Latency is zero带宽是无限的Bandwidth is infinite网络是安全的The network is secure网络拓扑不会变化Topology doesnt change只有一个管理员There is one administrator传输成本为零Transport cost is zero网络是同构的The network is homogeneous前四条由 Bill Joy 与 Tom Lyon 于 1991 年左右列出并由 James Gosling 首次命名为分布式计算的谬误。 L. Peter Deutsch 补充了第 5、6、7 条Gosling 在 1990 年代末补充了第 8 条。这一清单的灵感来自 Sun Microsystems 当时的实践。这些谬误应当在设计健壮代码时时刻牢记每一条都可能带来与现实脱节的认知偏差从而低估分布式系统的真实复杂度。实践启示设计任何跨网络系统微服务、云原生、边缘计算时把八条谬误当作设计检查清单逐条过一遍——例如重试与超时对应 1、2、幂等与压缩对应 3、7、安全默认对应 4、多集群与容灾对应 5、6、8。第三部分延伸阅读清单À lire法文译本在正文之外还给出了一个精选书单供希望深入这些概念的读者继续研读《Extreme Programming Installed》——Ron Jeffries、Ann Anderson、Chet Hendrikson 合著覆盖极限编程的基础原则与 YAGNI 直接相关《人月神话》The Mythical Man Month——Frederick P. Brooks Jr. 著软件开发的经典之作布鲁克斯定律是其核心主题之一《哥德尔、艾舍尔、巴赫集异璧之大成》Gödel, Escher, Bach: An Eternal Golden Braid——Douglas R. Hofstadter 著一本难以归类的书霍夫斯塔特定律即出自该书《The Dilbert Principle》——Scott Adams 著以幽默视角审视美国企业界迪尔伯特原则的出处《The Peter Principle》——Lawrence J. Peter 著另一个以幽默视角审视管理与大企业挑战的著作彼得原则的源头。第四部分多语言翻译与协作生态作为开源项目hacker-laws 依靠贡献者网络维护了多个语言版本。在当前仓库中translations/ 目录下保存着下列本地化文档均为仓库内真实文件translations/pt-BR.md巴西葡萄牙语translations/fr.md法语本文主体translations/es-ES.md西班牙语translations/it-IT.md意大利语translations/lv.md拉脱维亚语translations/tr.md土耳其语translations/id.md印度尼西亚语translations/jp.md日语translations/pl.md波兰语translations/vi.md越南语从法文译本末尾的Traductions章节可以看到完整的协作机制各语言版本由社区指定的维护者moderator负责部分翻译通过 GitLocalize 平台进行持续同步与状态跟踪更新现有翻译可以通过提交 PR 完成而新增语言则通常需要先创建 issue 并接入翻译协作流程。对内容本身仓库欢迎两种贡献方式创建 issue以建议新增条目或修改或提交 Pull Request提出自己的文本。法文译本还提示正式贡献前应阅读项目维护者发布的贡献指南与行为准则以确保风格与内容符合项目要求。总结如何把定律手册变成决策工具精读 translations/fr.md 之后可以把这些定律与原则归纳为几个决策工具箱性能与架构阿姆达尔定律并行化收益边界、摩尔定律免费午餐终结、过早优化效应用 Profile 说话、复杂度守恒定律复杂度只能转移团队与组织布鲁克斯定律加人不等于加速、康威定律架构追随组织、邓巴数认知负载、帕累托原则抓关键少数系统与接口设计海勒姆定律隐式契约、泄漏抽象定律抽象必有泄漏、鲁棒性原则宽容输入与安全权衡、分布式计算的谬误八条检查清单、SOLID 五原则可维护的面向对象设计协作与沟通汉隆剃刀先假设无知、惠顿定律评审礼仪、坎宁安定律社区求答之道、帕金森定律与霍夫斯塔特定律时间估算的现实。正如仓库引言反复强调的这些定律与原则不是行为规范而是观察透镜。结合项目 README.md 与各语言译本translations/交叉阅读再回到你自己的项目语境中去验证——这才是 hacker-laws 真正的打开方式。赞分享文档知识库教程【免费下载链接】hacker-laws Laws, Theories, Principles and Patterns for developers and technologists.项目地址https://gitcode.com/GitHub_Trending/ha/hacker-laws点击查看免费下载相关推荐hacker-laws 全景解读开发者与技术人必知的法则、理论与原则hacker laws 全景解读开发者与技术人必知的法则、理论与原则 本文以开源仓库 hacker laws 的日文翻译版 translations/jp.m文档知识库教程Rich 日志处理详解用 RichHandler 让 Python logging 输出彩色的终端日志Rich 日志处理详解用 RichHandler 让 Python logging 输出彩色的终端日志 导读 Python 标准库 logging 输出单调乏文档知识库教程hacker-laws软件工程师必知的定律、理论、原则与模式全解析hacker laws软件工程师必知的定律、理论、原则与模式全解析 本篇技术指南以开源仓库 hacker laws 的土耳其语译本 translations/文档知识库教程上一篇MediaMTX 搭建指南10 分钟跑通零依赖流媒体服务器下一篇8 年编程经验 200 万粉丝鱼皮 ai-guide 免费 AI 知识库的完整上手指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表