hacker-laws çš„çš„ä¸æ–‡ç¿»è¯‘。
对开å‘人员有用的定律ã€ç†è®ºã€åŽŸåˆ™å’Œæ¨¡å¼ã€‚(Laws, Theories, Principles and Patterns that developers will find useful.)
为了方便阅读,维基百科增åŠ?äº†ä¸æ–‡é“¾æŽ¥ã€‚英文链接表示 hacker-laws 项目尚未完æˆçš„主题。
ä¸å›½æ—?法访问维基百科说明
喜欢点 star ã€å…³æ³¨ç‚¹ watch ã€è´¡çŒ®ç‚¹ fork 。翻译错æ¼ä¹‹å¤„,欢迎指æ£ï¼
- 介ç»
- 定律
- 90-9-1 法则 (90–9–1 Principle or 1% Rule)
- 阿姆达尔定律 (Amdahl's Law)
- �窗效应 (The Broken Windows Theory)
- 布é²å…‹æ–¯æ³•则 (Brooks's Law)
- CAP å®šç† (CAP Theorem or Brewer's Theorem)
- 康å¨å®šå¾‹ (Conway's Law)
- åŽå®æ±‰å§†å®šå¾‹ (Cunningham's Law)
- é‚“å·´æ•°å— (Dunbar's Number)
- 费茨法则 (Fitts's Law)
- 盖尔定律 (Gall's Law)
- å¤å¾·å“ˆç‰¹å®šå¾‹ (Goodhart's Law)
- 汉隆的剃刀 (Hanlon's Razor)
- å¸å…‹å®šå¾‹ (Hick's Law or Hick-Hyman Law)
- 侯世达定律 (Hofstadter's Law)
- 哈伯特定律 (Hutber's Law)
- 技术æˆç†Ÿåº¦æ›²çº¿ (The Hype Cycle or Amara's Law)
- éšå¼æŽ¥å£å®šå¾‹ (Hyrum's Law or The Law of Implicit Interfaces)
- 柯林汉定律 (Kernighan's Law)
- 林纳斯定律 (Linus's Law)
- 梅特å¡å¤«å®šå¾‹ (Metcalfe's Law)
- 摩尔定律 (Moore's Law)
- 墨è²å®šå¾‹ (Murphy's Law / Sod's Law)
- 奥å¡å§†å‰ƒåˆ€ (Occam's Razor)
- å¸•é‡‘æ£®å®šç† (Parkinson's Law)
- 过早优化效应 (Premature Optimization Effect)
- 普特定律 (Putt's Law)
- 里德定律 (Reed's Law)
- 夿‚性守æ’定律 (The Law of Conservation of Complexity or Tesler's Law)
- 得墨忒耳定律 (The Law of Demeter)
- 抽象泄æ¼å®šå¾‹ (The Law of Leaky Abstractions)
- 帕金森çç¢Žå®šç† (The Law of Triviality)
- Unix å“²å¦ (The Unix Philosophy)
- Spotify 模型 (The Spotify Model)
- 沃德勒定律 (Wadler's Law)
- �顿定律 (Wheaton's Law)
- 原则
- 切斯特森围æ? (Chesterson's Fence)
- æ»æµ·æ•ˆåº” (The Dead Sea Effect)
- 呆伯特法则 (The Dilbert Principle)
- 帕累托法则 (The Pareto Principle or The 80/20 Rule)
- å½¼å¾—åŽŸç† (The Peter Principle)
- 鲿£’性原则 (The Robustness Principle or Postel's Law)
- SOLID
- å•一功能原则 (The Single Responsibility Principle)
- å¼€é—原则 (The Open/Closed Principle)
- é‡Œæ°æ›¿æ¢åŽŸåˆ™ (The Liskov Substitution Principle)
- 接å£éš”离原则 (The Interface Segregation Principle)
- ä¾èµ–å转原则 (The Dependency Inversion Principle)
- ä¸è¦é‡å¤ä½?自己原则 (The DRY Principle)
- KISS 原则 (The KISS Principle)
- ä½?ä¸éœ€è¦å®ƒåŽŸåˆ™ (YAGNI)
- 分布å¼è®¡ç®—的谬论 (The Fallacies of Distributed Computing)
- 阅读清å•
- 在线资æº
- 相关项目
- TODO
介ç»
å½“äººä»¬è°ˆè®ºå¼€å‘æ—¶ï¼Œä¼šèŠåˆ°è®¸å¤šå®šå¾‹ã€‚这个仓库收录了一些最常è§çš„定律。
定律
现在我们开始å§ï¼
90-9-1 法则 (90–9–1 Principle or 1% Rule)
90-9-1 法则表明,在诸如维基这æ?·çš„互è”网社区ä¸ï¼Œ90% 的用户åªçœ‹å†…容并ä¸å‚与互动,9% 的用户会å‚ä¸Žè®¨è®ºï¼Œè€Œåªæœ‰ 1% 的用户会创é€?内容。
现实世界的例å:
- 2014 年,对四个å¥åº·çš„æ•°å—社交网络进行的一项ç?”ç©¶å‘现,排åå‰ 1% 的人创é€?了 73% 的帖å,紧éšå…¶åŽçš„ 9% å¹³å‡å? 25%,其余的 90% 的人平å‡å? 2%。 (å‚考)
å‚è§ï¼š
阿姆达尔定律 (Amdahl's Law)
阿姆达尔定律是一个显示计算任务潜在åŠ?速能力的公å¼ã€‚è¿™ç§èƒ½åŠ›å¯ä»¥é€šè¿‡å¢žåŠ?ç³»ç»Ÿèµ„æºæ¥å®žçŽ°ï¼Œé€šå¸¸ç”¨äºŽå¹¶è¡Œè®¡ç®—ä¸ã€‚它å¯ä»¥é¢„测增åŠ?处ç†å™¨æ•°é‡çš„实际好处,然而增åŠ?处ç†å™¨æ•°é‡ä¼šå—到程åºå¹¶è¡Œæ€§çš„é™åˆ¶ã€‚
举例说明:如果程åºç”±ä¸¤éƒ¨åˆ†ç»„æˆï¼Œéƒ¨åˆ† A 必须由å•个处ç†å™¨æ‰§è¡Œï¼Œéƒ¨åˆ† B å¯ä»¥å¹¶è¡Œè¿è¡Œã€‚é‚£ä¹ˆå‘æ‰§è¡Œç¨‹åºçš„系统添åŠ?多个处ç†å™¨åªèƒ½èŽ·å¾—æœ‰é™çš„好处。它å¯ä»¥æžå¤§åœ°æå‡éƒ¨åˆ† B çš„è¿è¡Œé€Ÿåº¦ï¼Œä½†éƒ¨åˆ† A çš„è¿è¡Œé€Ÿåº¦å°†ä¿æŒä¸å˜ã€‚
下图展示了一些è¿è¡Œé€Ÿåº¦çš„æå‡æ½œèƒ½çš„例å:
(å›¾ç‰‡æ¥æºï¼šBy Daniels220 at English Wikipedia, Creative Commons Attribution-Share Alike 3.0 Unported, https://en.wikipedia.org/wiki/File:AmdahlsLaw.svg)
å¯ä»¥çœ‹å‡ºï¼Œ50ï¼… 并行化的程åºåœ¨ä½¿ç”¨å¤§äºŽ 10 个处ç†å•元之åŽçš„速度æå‡æ”¶æ•ˆç”šå¾®ï¼Œè€Œ 95ï¼… 并行化的程åºåœ¨ä½¿ç”¨è¶…过一åƒä¸ªå¤„ç†å•元之åŽä»ç„¶å¯ä»¥æ˜¾è‘—æå‡é€Ÿåº¦ã€‚
éšç€æ‘©å°”å®šå¾‹å‡æ…¢ï¼Œå•个处ç†å™¨çš„速度增åŠ?缓慢,并行化是æé«˜æ€§èƒ½çš„关键。图形编程是一个æžå¥½çš„例å,现代ç€è‰²å™¨å¯ä»¥å¹¶è¡Œæ¸²æŸ“å•个åƒç´?或片段。这也是现代显å¡é€šå¸¸å…·æœ‰æ•°åƒä¸ªå¤„ç†æ?¸å¿ƒï¼ˆGPU 或ç€è‰²å™¨å•元)的原å›?。
å‚è§ï¼š
�窗效应 (The Broken Windows Theory)
在ç?´çª—ç†è®ºä¸è®¤ä¸ºï¼Œä¸€äº›æ˜Žæ˜¾çš„犯罪迹象(或缺ä¹çŽ¯ä¿æ„识)会导致进一æ¥çš„ã€æ›´ä¸¥é‡çš„犯罪(æˆ–çŽ¯å¢ƒçš„è¿›ä¸€æ¥æ¶åŒ–)。
ç?´çª—ç†è®ºå·²åº”用于软件开å‘ä¸ï¼Œå®ƒè¡¨æ˜ŽåŠ£è´¨ä»£ç?(或 Technical Debt)å¯èƒ½ä¼šå½±å“åŽç»ä¼˜åŒ–的效率,从而进一æ¥é€?æˆä»£ç?劣化;éšç€æ—¶é—´çš„æŽ¨ç§»ï¼Œè¿™ç§æ•ˆåº”将会导致代ç?è´¨é‡å¤§å¹…下é™ã€‚
å‚è§ï¼š
例å:
- 《程åºå‘˜ä¿®ç‚¼ä¹‹é“:软件熵》(The Pragmatic Programming: Software Entropy)
- 《Coding Horror:�窗效应》(Coding Horror: The Broken Window Theory)
- 《开æºï¼šç¼–ç¨‹ä¹‹ä¹ - ç?´çª—效应》(OpenSource: Joy of Programming - The Broken Window Theory)
布é²å…‹æ–¯æ³•则 (Brooks's Law)
软件开å‘åŽæœŸï¼Œæ·»åŠ?人力åªä¼šä½¿é¡¹ç›®å¼€å‘得更慢。
这个定律表明,在许多情况下,试图通过增åŠ?人力æ¥åŠ?速已延期项目的交付,将会使项目交付得更晚。布é²å…‹æ–¯ä¹Ÿæ˜Žç™½ï¼Œè¿™æ˜¯ä¸€ç§è¿‡åº¦ç®€åŒ–ã€‚ä½†ä¸€èˆ¬çš„è®ºæ®æ˜¯ï¼Œæ–°èµ„æºçš„æ—¶é—´å¢žåŠ?å’Œé€šä¿¡å¼€é”€ï¼Œä¼šåœ¨çŸæœŸå†…使开å‘é€Ÿåº¦å‡æ…¢ã€‚而且,许多任务是密ä¸å¯åˆ†çš„,æ¢å¥è¯è¯´ï¼Œè¿™æ?·å¯ä»¥ä½¿æ›´å¤šçš„资æºä¹‹é—´èƒ½è½»æ˜“分é…,这也æ„å‘³ç€æ½œåœ¨çš„速度增长也更低。
è°šè¯ ä¹ä¸ªå¥³äººä¸èƒ½åœ¨ä¸€ä¸ªæœˆå†…生一个å©å 与布é²å…‹æ–¯æ³•则åŒå‡ºä¸€è¾™ï¼Œç‰¹åˆ«æ˜¯æŸäº›ä¸å¯åˆ†å‰²æˆ–者并行的工作。
这是《人月神è¯ã€‹çš„ä¸å¿ƒä¸»é¢˜ã€‚
å‚è§ï¼š
CAP å®šç† (CAP Theorem or Brewer's Theorem)
CAP 定ç†ç”± Eric Brewer æ‰€å®šä¹‰ï¼Œå®ƒæŒ‡å‡ºå¯¹äºŽåˆ†å¸ƒå¼æ•°æ®å˜å‚¨æ¥è¯´ï¼Œä¸å¯èƒ½åŒæ—¶æ»¡è¶³ä»¥ä¸‹ä¸‰ç‚¹ï¼š
- 一致性 (Consistency)ï¼šåœ¨è¯»å–æ•°æ®æ—¶ï¼Œæ¯ä¸ªè¯·æ±‚都会接收到 最新的 æ•°æ®ï¼Œæˆ–者返回错误。
- å¯ç”¨æ€§ (Availability): åœ¨è¯»å–æ•°æ®æ—¶ï¼Œæ¯ä¸ªè¯·æ±‚都会接收到一个 éžé”™è¯¯çš„å“应,但ä¸èƒ½ä¿è¯è¯¥æ•°æ®æ˜¯ 最新的 æ•°æ®ã€‚
- 分区容错性 (Partition Tolerance)ï¼šå½“èŠ‚ç‚¹ä¹‹é—´ä»»æ„æ•°é‡çš„网络请求失败时,系统能按预期继ç»è¿è¡Œã€‚
æ?¸å¿ƒè®ºè¯å¦‚下:å›?为æ—?法ä¿è¯ä¸ä¼šå˜åœ¨ç½‘络分区(å‚è§åˆ†å¸ƒå¼è®¡ç®—的谬论 (The Fallacies of Distributed Computing)),所以在分区的情况下,我们å¯ä»¥é€‰æ‹©å–æ¶ˆå½“å‰æ“作(增åŠ?一致性并é™ä½Žå¯ç”¨æ€§ï¼‰ï¼Œæˆ–者选择继ç»è¿›è¡Œè¯¥æ“作(增åŠ?å¯ç”¨æ€§é™ä½Žä¸€è‡´æ€§ï¼‰ã€‚
该定ç†çš„åå—æ¥æºäºŽä¸€è‡´æ€§ (Consistency)ã€å¯ç”¨æ€§ (Availability)ã€åˆ†åŒºå®¹é”™æ€§ (Partition Tolerance) çš„é¦–å—æ¯ã€‚请注æ„,这与 ACID 没有任何关系,å›?为其对一致性有å¦ä¸€ç§å®šä¹‰ã€‚最近å‘展出æ¥çš„ PACELC 定ç†ä¸Ž CAP 定ç†ç›¸æ¯”,增åŠ?了对网络 未 分区时(å³ç³»ç»ŸæŒ‰é¢„期æ“作时)的延迟和一致性的约æŸã€‚
大多数的现代数æ®åº“å¹³å°ä¼šé€šè¿‡å‘æ•°æ®åº“用户æä¾›é€‰é¡¹çš„æ–¹å¼ï¼Œæ¥é€‰æ‹©æ˜¯éœ€è¦é«˜åº¦å¯ç”¨çš„æ“ä½œï¼ˆæ¯”å¦‚â€œè„读 (dirty read)â€ï¼‰ï¼Œè¿˜æ˜¯é«˜åº¦ä¸€è‡´çš„æ“ä½œ(比如“法定确认写写入 (quorum acknowledged write)â€)——这间接地承认了这一定ç†ã€‚
现实世界的例å:
- Inside Google Cloud Spanner and the CAP Theorem - 该文详细介ç»äº† Cloud Spanner 是如何工作的,表é¢ä¸Šè¯¥å¹³å°ä¼¼ä¹Žèƒ½å¤Ÿä¿è¯ CAP 三者,但实际上ä¾ç„¶æ˜¯ä¸€ä¸ª CP 系统,å³åªæœ‰ä¸€è‡´æ€§å’Œåˆ†åŒºå®¹é”™æ€§ã€‚
å‚è§ï¼š
康å¨å®šå¾‹ (Conway's Law)
这个定律说明了系统的技术边界å¯ä»¥å应一个组织的结构,它通常会在改进组织时被æåŠã€‚康å¨å®šå¾‹è¡¨æ˜Žï¼Œå¦‚果一个组织被分散æˆè®¸å¤šå°è€Œæ—?è”系的å•元,那么它开å‘的软件也是å°è€Œåˆ†æ•£çš„。如果组织是更多地围绕以功能或æœåŠ¡ä¸ºå¯¼å‘çš„åž‚ç›´ç»“æž„ï¼Œé‚£ä¹ˆè½¯ä»¶ç³»ç»Ÿä¹Ÿä¼šåæ˜?这一点。
å‚è§ï¼š
åŽå®æ±‰å§†å®šå¾‹ (Cunningham's Law)
在网络上想得到æ£ç¡®ç”æ¡ˆçš„æœ€å¥½æ–¹æ³•ä¸æ˜¯æé—®é¢˜ï¼Œè€Œæ˜¯å‘å¸ƒä¸€ä¸ªé”™è¯¯çš„ç”æ¡ˆã€‚
æ®å²è’‚芬·麦克基迪说,沃德·åŽå®æ±‰å§†æ—©åœ¨ 20 世纪 80 年代早期的时候建议他,在互è”网上获得æ£ç¡®ç”æ¡ˆçš„æœ€å¥½æ–¹æ³•ä¸æ˜¯æé—®é¢˜ï¼Œè€Œæ˜¯å‘å¸ƒä¸€ä¸ªé”™è¯¯çš„ç”æ¡ˆã€‚麦克基迪称这为åŽå®æ±‰å§†å®šå¾‹ï¼Œè€ŒåŽå®æ±‰å§†ä¸ä»¥ä¸ºç„¶ï¼Œå¹¶è§‰å¾—这是“错误的引用â€ã€‚最åˆè¿™æ¡å®šå¾‹åªæ˜¯ç”¨äºŽæè¿° Usenet ä¸Šçš„ç¤¾äº¤è¡Œä¸ºï¼Œä½†åŽæ¥ä¹Ÿæ¸æ¸ç”¨äºŽå…¶ä»–的在线社区(如 Wikipediaã€Redditã€Twitterã€Facebook ç‰ï¼‰ã€‚
å‚è§ï¼š
é‚“å·´æ•°å— (Dunbar's Number)
é‚“å·´æ•°å—æ˜¯å¯¹ä¸€ä¸ªäººèƒ½å¤Ÿä¿æŒç¨³å®šç¤¾ä¼šå…³ç³»çš„人数的认知æžé™â€”—在这ç§å…³ç³»ä¸ï¼Œä¸€ä¸ªäººçŸ¥é“æ¯ä¸ªäººæ˜¯è°ï¼Œä¹ŸçŸ¥é“æ¯ä¸ªäººä¸Žå…¶ä»–人的关系如何。而对这一数å—的确切值则有ç€ä¸€äº›ä¸åŒæ„è§ã€‚邓巴指出,人仅能轻æ¾åœ°ç»´æŒ 150 个稳定的关系。这æ?·çš„关系在一个更社会化的背景ä¸ï¼Œä¾¿æ˜¯å½“ä½?碰巧在酒å§é‡Œç¢°åˆ°è¿™äº›äººæ—¶å€™ï¼Œä½?ä¸ä¼šå›?为åŠ?入他们而感到尴尬。邓巴数å—的估计值一般在 100 至 250 之间。
和人与人之间稳定的关系一æ?·ï¼Œå¼€å‘人员与代ç?库的关系也需è¦åŠªåŠ›ç»´æŠ¤ã€‚å½“é¢å¯¹å¤§åž‹ã€å¤æ‚çš„é¡¹ç›®ï¼Œæˆ–è®¸å¤šé¡¹ç›®çš„å½’å±žæƒæ—¶ï¼Œæˆ‘们会ä¾èµ–于约定ã€ç–略和建模过程æ¥è¿›è¡Œæ‰©å±•。邓巴数å—ä¸ä»…在办公室规模的扩大的过程ä¸ä¸¾è¶³è½»é‡ï¼Œè€Œä¸”在设置团队工作范围,或决定系统何时应该注é‡äºŽè¾…助建模和组织管ç†å¼€é”€è‡ªåŠ¨åŒ–çš„å·¥å…·æ—¶ï¼Œä¹Ÿæ˜¯éžå¸¸é‡è¦çš„ã€‚å°†é‚“å·´æ•°å—æ”¾å…¥å·¥ç¨‹å†…容ä¸è¿›è¡Œç±»æ¯”,那就是您能åŠ?入并有信心éšå«éšåˆ°è¿›è¡Œè½®æ¢çš„项目数(亦或是å•ä¸ªé¡¹ç›®çš„è§„èŒƒåŒ–å¤æ‚性)。
å‚è§ï¼š
费茨法则 (Fitts's Law)
该法则指出,移动到目æ?‡åŒºåŸŸæ‰€éœ€çš„æ—¶é—´æ˜¯åˆ°ç›®æ?‡çš„è·ç¦»é™¤ä»¥ç›®æ?‡å®½åº¦çš„函数。
(å›¾ç‰‡æ¥æºï¼šBy Foobar628 at English Wikipedia, Creative Commons Attribution-Share Alike 3.0 Unported, https://en.wikipedia.org/wiki/Fitts%27s_law#/media/File:Fitts_Law.svg)
费茨法则决定了在设计 UX 或 UI 时,交互元ç´?应该尽å¯èƒ½å¤§ï¼Œè€Œç”¨æˆ·æ³¨æ„力区域和交互元ç´?之间的è·ç¦»åº”该尽å¯èƒ½å°ã€‚这会对设计产生影å“,例如将相近的任务进行归类分组ç‰ã€‚
åŒæ—¶å®ƒè¿˜å°†â€œé”è§’ (Magic Corners)â€è¿™ä¸€æ¦‚念æ£å¼åŒ–,å³åœ¨è§’è½æ”¾ç½®å…³é”®çš„ UI å…ƒç´?,从而使得用户å¯ä»¥é€šè¿‡ç§»åЍé¼?æ?‡è½»æ¾ç‚¹å‡»åˆ°ã€‚Windows 的开始按钮便ä½äºŽé”角处便于选择,而有趣的是 MacOS æ°æ°ç›¸å,它的“关é—窗å£â€æŒ‰é’® ä¸å¤„于 é”角处,从而能有效å‡å°è¢«è¯¯ç‚¹å‡»çš„æ¦‚率。
å‚è§ï¼š
盖尔定律 (Gall's Law)
一个切实å¯è¡Œçš„夿‚系统势必是从一个切实å¯è¡Œçš„简å•系统å‘展而æ¥çš„ã€‚ä»Žå¤´å¼€å§‹è®¾è®¡çš„å¤æ‚系统æ?¹æœ¬ä¸åˆ‡å®žå¯è¡Œï¼Œæ—?法修修补补让它切实å¯è¡Œã€‚ä½?必须由一个切实å¯è¡Œçš„简å•ç³»ç»Ÿé‡æ–°å¼€å§‹ã€‚
约翰·盖尔 (John Gall)
ç›–å°”å®šå¾‹è¯´æ˜Žäº†è®¾è®¡é«˜åº¦å¤æ‚的系统很å¯èƒ½ä¼šå¤±è´¥ã€‚它们很难一蹴而就,更多是从简å•çš„ç³»ç»Ÿé€æ¸æ¼”å˜è€Œæ¥ã€‚
最典型的例å便是互è”网。如今的互è”ç½‘æ˜¯ä¸€ä¸ªé«˜åº¦å¤æ‚çš„ç³»ç»Ÿï¼Œè€Œå®ƒæœ€æ—©åªæ˜¯è¢«å®šä¹‰ä¸ºä¸€ç§åœ¨å¦æœ¯æœºæž„之间共享内容的方å¼ã€‚互è”网æˆåŠŸå®žçŽ°äº†æœ€åˆçš„ç›®æ?‡ï¼Œå¹¶ä¸”éšç€æ—¶é—´ä¸æ–演化,最终æˆå°±äº†å¦‚ä»Šçš„å¤æ‚ç¹è£ã€‚
å‚è§ï¼š
å¤å¾·å“ˆç‰¹å®šå¾‹ (Goodhart's Law)
å½“åŽ‹åŠ›æ–½äºŽå…¶ä¸Šä»¥è¿›è¡ŒæŽ§åˆ¶æ—¶ï¼Œä»»ä½•è§‚æµ‹åˆ°çš„ç»Ÿè®¡æ’æ€§éƒ½å€¾å‘消散。
查尔斯·å¤å¾·å“ˆç‰¹ (Charles Goodhart)
å¦è§ï¼š
当一个措施本身æˆä¸ºç›®æ?‡æ—¶ï¼Œå®ƒå°±ä¸å†æ˜¯ä¸€ä¸ªå¥½çš„æŽªæ–½ã€‚
玛丽莲·斯特拉腾 (Marilyn Strathern)
æ?¹æ®è¿™ä¸€å®šå¾‹ï¼Œç”±æµ‹é‡é©±åŠ¨çš„ä¼˜åŒ–å而å¯èƒ½å¯¼è‡´æµ‹é‡ç»“果本身的说æœåЛ䏋é™ã€‚盲目使用一些过度严æ?¼ç›é€‰çš„æ–¹æ³• (KPIs) å¯èƒ½ä¼šäº§ç”Ÿä¸€äº›ä¸è‰¯çš„å½±å“。人们会倾å‘于用“钻空åâ€çš„行为去åšå±€éƒ¨ä¼˜åŒ–ï¼Œä»Žè€Œæ»¡è¶³ä¸€äº›ç‰¹å®šçš„åº¦é‡æ?‡å‡†ï¼Œè€Œä¸ä¼šåœ¨æ„整体的结果。
现实ä¸çš„例å:
- Assert-free 测试å¯ä»¥è¾¾åˆ°ä»£ç?覆盖率的预期,但度é‡çš„目的应该是创é€?ç»è¿‡è‰¯å¥½æµ‹è¯•的软件。
- ç”± commits 的行数æ¥è¯„ä»·å¼€å‘人员的表现,从而导致了ä¸åˆç†çš„代ç?库扩增。
å‚è§
汉隆的剃刀 (Hanlon's Razor)
能解释为愚è?¢çš„,就ä¸è¦è§£é‡Šä¸ºæ¶æ„的。
罗伯特·汉隆 (Robert J. Hanlon)
这一原则表明,一个行为所产生的消æžç»“æžœå¹¶ä¸æ˜¯æ¶æ„。相å,消æžç»“果更有å¯èƒ½å½’咎于这些没有得到充分ç†è§£çš„行动或影å“。
å¸å…‹å®šå¾‹ (Hick's Law or Hick-Hyman Law)
å†³ç–æ—¶é—´å’Œå¯ä¾›é€‰æ‹©çš„选项数é‡å‘ˆå¯¹æ•°å¢žé•¿å…³ç³»ã€‚
William Edmund Hick and Ray Hyman
在下方的ç‰å¼ä¸ï¼ŒT 是åšå‡ºå†³å®šæ‰€èŠ±è´¹çš„æ—¶é—´ï¼Œn 是选项的数é‡ï¼Œb 是一个由数æ®åˆ†æžæ‰€ç¡®å®šçš„常数。
(图片å‚考:Creative Commons Attribution-Share Alike 3.0 Unported, https://en.wikipedia.org/wiki/Hick%27s_law)
该定律仅适用于选项 æŒ‰é¡ºåºæŽ’åˆ— 的情况,例如 ABCD。这éšå«åœ¨ä¸€äºŒä¸ºåº•的对数ä¸ï¼Œä¹Ÿå°±æ˜¯è¯´å†³ç–者本质上在进行 äºŒåˆ†æ³•æŸ¥æ‰¾ã€‚å®žéªŒè¡¨æ˜Žï¼Œå¦‚æžœé€‰é¡¹ä¸æ˜¯æŒ‰é¡ºåºæŽ’列的,那么所花费时间与选项个数将会呈线性增长关系。
这在 UI 设计ä¸ï¼Œè¯¥å®šå¾‹ä¹Ÿå¯ä»¥æœ‰æ•ˆåœ°ç¡®ä¿ç”¨æˆ·åœ¨æœç´¢é€‰é¡¹æ—¶æ›´è½»æ¾æ„‰å¿«åœ°åšå‡ºå†³ç–。
在 Speed of Information Processing: Developmental Change and Links to Intelligence 一文ä¸å¯è§ï¼Œæ™ºå•†å’Œå应时间之间的相关性也满足å¸å…‹å®šå¾‹ã€‚
å‚è§ï¼š
侯世达定律 (Hofstadter's Law)
å³ä½¿è€ƒè™‘到侯世达定律,它也总是比ä½?预期的è¦é•¿ã€‚
侯世达 (Douglas Hofstadter)
在估计需è¦å¤šé•¿æ—¶é—´å¼€å‘时,ä½?å¯èƒ½ä¼šå¬åˆ°æ¤å®šå¾‹ã€‚软件开å‘似乎有这æ?·ä¸€æ¡å®šç†ï¼Œå³æˆ‘们往往ä¸èƒ½å‡†ç¡®åœ°ä¼°è®¡éœ€è¦å¤šé•¿æ—¶é—´æ‰èƒ½å®Œæˆã€‚
è¯å‡ºã€Šå“¥å¾·å°”ã€è‰¾èˆå°”ã€å·´èµ«ï¼šé›†å¼‚璧之大æˆã€‹ã€‚
å‚è§ï¼š
哈伯特定律 (Hutber's Law)
æ”¹å–„å³æ¶åŒ–。
帕特里克·哈伯特 (Patrick Hutber)
这个定律说明了对一个系统的改进会导致其他部分的æ¶åŒ–;或者它会将其他的æ¶åŒ–éšè—èµ·æ¥ï¼Œå¹¶å¯¼è‡´ç³»ç»Ÿæ•´ä½“状æ€çš„退化。
例如,æŸä¸ªç«¯ç‚¹çš„å“应延迟å‡å°‘,就å¯èƒ½å¯¼è‡´è¯·æ±‚æµä¸çš„åžåé‡å’Œå®¹é‡é—®é¢˜è¿›ä¸€æ¥å¢žåŠ?,并影å“到å¦ä¸€ä¸ªå®Œå…¨ä¸åŒçš„å系统。
技术æˆç†Ÿåº¦æ›²çº¿ (The Hype Cycle or Amara's Law)
我们倾å‘äºŽè¿‡é«˜ä¼°è®¡æŠ€æœ¯åœ¨çŸæœŸå†…的影å“,并低估长期效应。
罗伊·阿马拉 (Roy Amara)
技术æˆç†Ÿåº¦æ›²çº¿æ˜¯é«˜å¾·çº³å’¨è¯¢å…¬å¸å¯¹æŠ€æœ¯æœ€åˆå…´èµ·å’Œå‘展的视觉展现。一图顶åƒè¨€ï¼š
(å›¾ç‰‡æ¥æº: By Jeremykemp at English Wikipedia, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=10547051)
简而言之,这个周期表明,新技术åŠå…¶æ½œåœ¨å½±å“通常会引å‘一阵浪潮。团队快速使用这些新技术,有时会对结果感到失望。这å¯èƒ½æ˜¯å›?为该技术还ä¸å¤Ÿæˆç†Ÿï¼Œæˆ–者现实应用还没有完全实现。ç»è¿‡ä¸€æ®µæ—¶é—´åŽï¼ŒæŠ€æœ¯çš„能力æé«˜äº†ï¼Œä½¿ç”¨å®ƒçš„实际机会会增åŠ?,最终团队也å¯ä»¥æé«˜å·¥ä½œæ•ˆçŽ‡ã€‚ç½—ä¼ŠÂ·é˜¿é©¬æ‹‰ç®€æ´åœ°æ€»ç»“了这一点:我们倾å‘äºŽé«˜ä¼°æŠ€æœ¯çŸæœŸå†…的影å“,并低估长期效应。
éšå¼æŽ¥å£å®šå¾‹ (Hyrum's Law or The Law of Implicit Interfaces)
当 API 有足够多的用户时,ä½?在åˆåŒä¸çš„æ‰¿è¯ºå·²ä¸é‡è¦ï¼šä½?系统的所有å¯è§‚察行为都将被æŸäº›äººæ‰€ä¾èµ–。
海伦·赖特 (Hyrum Wright)
éšå¼æŽ¥å£å®šå¾‹è¡¨æ˜Žï¼Œå½“ä½?çš„ API 有足够多的用户时,API 的所有行为(包括那些未囊括在公共说明ä¸çš„一部分)最终都会被其他人所ä¾èµ–。 一个简å•çš„ä¾‹åæ˜¯ API çš„å“应时间这ç§éžåŠŸèƒ½æ€§å›?ç´?ï¼Œè¿˜æœ‰ä¸€ä¸ªæ›´å¾®å¦™çš„ä¾‹åæ˜¯ï¼šç”¨æˆ·ä½¿ç”¨æ£åˆ™è¡¨è¾¾å¼åˆ¤æ–错误信æ¯çš„类型时,å³ä½¿ API 的公共说明没有说明消æ¯çš„å†…å®¹ï¼Œæ¥æŒ‡ç¤ºç”¨æˆ·é”™è¯¯çš„类型,一些用户也å¯èƒ½ä¼šä½¿ç”¨å¹¶æ›´æ”¹è¯¥æ¶ˆæ¯ï¼Œè€Œè¿™å®žé™…上会ç?´å API 的使用。
å‚è§ï¼š
柯林汉定律 (Kernighan's Law)
调试在一开始就比编写程åºå›°éš¾ä¸€å€ã€‚å›?æ¤ï¼ŒæŒ‰ç…§å®šä¹‰ï¼Œå¦‚æžœä½?的代ç?写得éžå¸¸å·§å¦™ï¼Œé‚£ä¹ˆä½?就没有足够的能力æ¥è°ƒè¯•它。
布莱æ©Â·æŸ¯æž—汉 (Brian Kernighan)
柯林汉定律是以布莱æ©Â·æŸ¯æž—汉 (Brian Kernighan) çš„åå—命å的,引述自柯林汉和普劳æ?¼ (P.J. Plauger) 的《编程æ?¼è°ƒã€‹ (The Elements of Programming Style) 一书ä¸çš„一å¥è¯ï¼š
æ¯ä¸ªäººéƒ½çŸ¥é“,调试在一开始就比编写程åºå›°éš¾ä¸€å€ã€‚那么,如果您在编写它时尽å¯èƒ½åœ°å·§å¦™ï¼Œåˆå¦‚何æ¥è°ƒè¯•它?
尽管这有些夸å¼?,但它æå‡ºçš„论点是,简å•的代ç?ä¼šæ¯”å¤æ‚的代ç?æ›´å¯å–,å›?ä¸ºè°ƒè¯•å¤æ‚代ç?的过程ä¸å‡ºçŽ°çš„ä»»ä½•é—®é¢˜éƒ½ä¼šå分棘手,甚至æ—?法解决。
å‚è§ï¼š
林纳斯定律 (Linus's Law)
足够多的眼ç›ï¼Œå°±å¯è®©æ‰€æœ‰é—®é¢˜æµ®çŽ°ã€‚
Eric S. Raymond
简å•地说,能够看到问题的人越多,有人解决过相关的问题或事情的å¯èƒ½æ€§å°±è¶Šé«˜ã€‚
最åˆè¯¥å®šå¾‹æ˜¯ç”¨æ¥æè¿°å¼€æºæ¨¡åž‹å¯¹äºŽé¡¹ç›®çš„价值的,并适用于任æ„çš„è½¯ä»¶é¡¹ç›®ã€‚åŒæ—¶å®ƒä¹Ÿå¯ä»¥æ‰©å±•åˆ°å¼€å‘æµç¨‹ä¹‹ä¸â€”—更多的代ç?å®¡æŸ¥ã€æ›´å¤šçš„陿€åˆ†æžå’Œå¤šé‡æµ‹è¯•å¯ä»¥è®©é—®é¢˜æ›´åŠ?明显和容易识别。
林纳斯定律的一个更æ£å¼çš„说法如下:
如果有足够大的测试员和è”åˆå¼€å‘人员基础,那么å‡?乎æ¯ä¸ªé—®é¢˜éƒ½èƒ½å¾ˆå¿«è¢«ç‰¹å¾åŒ–,从而让以å‰é‡åˆ°è¿‡ç±»ä¼¼é—®é¢˜çš„人解决。
è¿™æ¡å®šå¾‹æœ€æ—©å‡ºçŽ°åœ¨ Eric S. Raymond 所著书 "The Cathedral and the Bazaar" ä¸ï¼Œå¹¶ä»¥ Linus Torvalds çš„åå—命å以作纪念。
梅特å¡å¤«å®šå¾‹ (Metcalfe's Law)
在网络ç†è®ºä¸ï¼Œç³»ç»Ÿçš„价值约ç‰äºŽç³»ç»Ÿç”¨æˆ·æ•°çš„平方。
这个定律基于一个系统ä¸å¯èƒ½çš„连接对数é‡ï¼Œå¹¶ä¸”与里德定律 (Reed's Law) å分相近。奥德利兹科 (Odlyzko) 和其他人认为,里德定律和梅特å¡å¤«å®šå¾‹å¤¸å¤§äº†ç³»ç»Ÿæœ¬èº«çš„价值,å›?为它们没有考虑到网络效应ä¸äººç±»è®¤çŸ¥çš„é™åˆ¶ã€‚
å‚è§:
摩尔定律 (Moore's Law)
集æˆç”µè·¯ä¸çš„æ™¶ä½“管数é‡å¤§çº¦æ¯ä¸¤å¹´ç¿»ä¸€ç•ªã€‚
è¿™æ¡å®šå¾‹é€šå¸¸ç”¨äºŽè¯´æ˜ŽåŠå¯¼ä½“和芯片技术æé«˜çš„ç»å¯¹é€Ÿåº¦ã€‚从 20 世纪 70 年代到 21 世纪å‰åå¹´ï¼Œæ‘©å°”çš„é¢„æµ‹è¢«è¯æ˜Žæ˜¯é«˜åº¦å‡†ç¡®çš„。 è¿‘å¹´æ¥ï¼Œè¿™ç§è¶‹åŠ¿ç•¥æœ‰å˜åŒ–,部分原å›?å—到é‡å隧穿效应影å“。然而,并行化计算的进æ¥ä»¥åŠåŠå¯¼ä½“技术和é‡å计算潜在的é©å‘½æ€§å˜åŒ–,å¯èƒ½æ„å‘³ç€æ‘©å°”定律在未æ¥å‡?å年内继ç»ä¿æŒæ£ç¡®ã€‚
墨è²å®šå¾‹ (Murphy's Law / Sod's Law)
凡是å¯èƒ½å‡ºé”™çš„事就一定会出错。
出自 爱德åŽÂ·AÂ·å¢¨è² ï¼Œ 墨è²å®šå¾‹ 说明了如果一件事有å¯èƒ½å‡ºé”™ï¼Œé‚£ä¹ˆå°±ä¸€å®šä¼šå‡ºé”™ã€‚
这是一å¥å¼€å‘人员间的俗è¯ï¼Œåœ¨å¼€å‘ã€æµ‹è¯•甚至在生产ä¸éƒ½æœ‰å¯èƒ½ä¼šå‘ç”Ÿä¸€äº›ä»¤äººæ„æƒ³ä¸åˆ°çš„事情。而这一定律也å¯ä»¥å‚考在英å¼è‹±è¯ä¸æ›´ä¸ºå¸¸è§çš„ ç´¢å¾·å®šç† ï¼š
如果æŸä»¶äº‹å¯èƒ½å‡ºé”™ï¼Œé‚£ä¹ˆå®ƒä¸€å®šä¼šåœ¨æœ€ç³Ÿç³•的时候å‘生。
这些定律常常用于幽默嘲弄。但是,类似于 Confirmation Bias å’Œ Selection Bias 的现象很容易导致人们过分强调这些定律(å³åœ¨å¤§éƒ¨åˆ†æƒ…况下,一件事的æˆåŠŸä¼šæ˜¾å¾—å¸ç©ºè§æƒ¯ï¼›è€Œå¤±è´¥æ‰ä¼šå¼•起更多的注æ„和讨论)。
å‚è§:
奥å¡å§†å‰ƒåˆ€ (Occam's Razor)
如æ—?å¿…è¦ï¼Œå‹¿å¢žå®žä½“。
奥å¡å§†çš„å¨å»‰ (William of Ockham)
奥å¡å§†å‰ƒåˆ€æŒ‡å‡ºï¼Œåœ¨å‡?ç§å¯èƒ½çš„解决方案之ä¸ï¼Œæœ€æœ‰å¯èƒ½çš„解决方案便是概念和å‡è®¾æœ€å°‘的那个。å›?为这个解决方案最为简å•,åªè§£å†³äº†é—®é¢˜ï¼Œå¹¶ä¸”没有引入é¢å¤–çš„å¤æ‚度和å¯èƒ½çš„è´Ÿé¢åŽæžœã€‚
å‚è§ï¼š
- ä½?ä¸éœ€è¦å®ƒåŽŸåˆ™ (YAGNI)
- 没有银弹:软件工程的本质性与附属性工作
- No Silver Bullet: Accidental Complexity and Essential Complexity
例å:
å¸•é‡‘æ£®å®šç† (Parkinson's Law)
在工作能够完æˆçš„æ—¶é™å†…,工作é‡ä¼šä¸€ç›´å¢žåŠ?,直到所有å¯ç”¨æ—¶é—´éƒ½è¢«å¡«æ»¡ä¸ºæ¢ã€‚
基于官僚机构的ç?”究背景,该定律被应用于软件开å‘ä¸ã€‚该ç†è®ºè®¤ä¸ºï¼Œå›¢é˜Ÿåœ¨æˆªæ¢æ—¥æœŸä¹‹å‰æ•ˆçŽ‡ä½Žä¸‹ï¼Œç„¶åŽåœ¨æˆªæ¢æ—¥æœŸå‰èµ¶ç´§å®Œæˆå·¥ä½œï¼Œä»Žè€Œä½¿å®žé™…æˆªæ¢æ—¥æœŸå˜å¾—éšæ„。
将这个定ç†ä¸Žä¾¯ä¸–达定律相结åˆï¼Œåˆ™ä¼šèŽ·å¾—æ›´åŠ?悲观的观点:为了在规定时间内完æˆå·¥ä½œï¼Œå·¥ä½œå°†å¢žå¤šï¼ŒèŠ±è´¹æ¯”é¢„æœŸæ›´é•¿çš„æ—¶é—´ã€‚
å‚è§ï¼š
过早优化效应 (Premature Optimization Effect)
过早优化是万æ¶ä¹‹æºã€‚
在高德纳的《goto è¯å¥çš„结构化编程》论文ä¸ï¼Œä»–写到:“程åºå‘˜ä»¬æµªè´¹äº†å¤§é‡çš„æ—¶é—´åŽ»æ€è€ƒæˆ–者担心他们的程åºä¸çš„éžå…³é”®éƒ¨åˆ†çš„速度。而在考虑调试和维护的时候,这些所谓æé«˜æ•ˆçŽ‡çš„åšæ³•实际上å分ä¸å¦¥ã€‚我们应该放弃å°çš„æ•ˆçŽ‡ç‚¹ï¼Œå¹¶ä¸”è¦åœ¨ 97% 的时间æé†’自己,过早优化是万æ¶ä¹‹æºã€‚而且连那关键的 3% 也ä¸èƒ½å¤Ÿæ”¾è¿‡ã€‚â€
然而,过早优化 (简而言之)å¯ä»¥å®šä¹‰ä¸ºåœ¨æˆ‘们知é“需è¦åšä»€ä¹ˆä¹‹å‰è¿›è¡Œä¼˜åŒ–。
普特定律 (Putt's Law)
技术由两类人主导,一类是纯粹的管ç†äººå‘˜ï¼Œ 一类是纯粹的技术人员。
普特定律常常éµå¾ªæ™®ç‰¹æŽ¨è®ºï¼š
æ¯ä¸€ä¸ªæŠ€æœ¯å±‚次,å‡ä»¥æ—¶æ—¥ï¼Œèƒ½åŠ›å°†é€†è½¬ã€‚
这些结论表明,由于å„ç§é€‰æ‹©æ?‡å‡†å’Œç¾¤ä½“组织的趋势,技术组织的工作层é¢å°†æœ‰ä¸€äº›æŠ€æœ¯äººå‘˜ï¼Œä»¥åŠä¸€äº›ä¸äº†è§£å¤æ‚性和挑战的管ç†äººå‘˜ã€‚è¿™ç§çŽ°è±¡å¯èƒ½æ˜¯ç”±äºŽ å½¼å¾—åŽŸç† (The Peter Principle) 或 呆伯特法则 (The Dilbert Principle) é€?æˆçš„。
但是,应该强调的是,诸如æ¤ç±»çš„定律是一ç§å¹¿æ³›çš„æ¦‚括,å¯èƒ½é€‚用于æŸäº›ç±»åž‹çš„组织,而ä¸é€‚用于其他组织。
å‚è§ï¼š
里德定律 (Reed's Law)
大型网络,尤其是社交网络的效用会éšç€ç½‘络的大å°å‘ˆæŒ‡æ•°çº§æ‰©å¢žã€‚
这一定律基于图论,图论ä¸çš„æ•ˆç”¨ä¸Žå¯èƒ½çš„å组数é‡å‘ˆæ£æ¯”,并且该增长速度会比å‚与者的数é‡å’Œå¯èƒ½çš„连接对数é‡è¦å¿«ã€‚奥德利兹科 (Odlyzko) 和其他人认为,里德定律夸大了系统本身的价值,å›?为它们没有考虑到网络效应ä¸äººç±»è®¤çŸ¥çš„é™åˆ¶ã€‚
å‚è§:
夿‚性守æ’定律 (The Law of Conservation of Complexity or Tesler's Law)
该定律表明系统ä¸å˜åœ¨ç€ä¸€å®šç¨‹åº¦çš„夿‚性,并且ä¸èƒ½å‡å°‘。
系统ä¸çš„æŸäº›å¤æ‚性是æ—?æ„的。这是由于结构ä¸è‰¯ï¼Œé”™è¯¯æˆ–者糟糕的建模é€?æˆçš„ã€‚è¿™ç§æ—?æ„çš„å¤æ‚性å¯ä»¥å‡å°‘æˆ–è€…æ¶ˆé™¤ã€‚ç„¶è€Œï¼Œç”±äºŽå¾…è§£å†³é—®é¢˜å›ºæœ‰çš„å¤æ‚性,æŸäº›å¤æ‚性是内在的。这ç§å¤æ‚性å¯ä»¥è½¬ç§»ï¼Œä½†ä¸èƒ½æ¶ˆé™¤ã€‚
该定律有趣的一点是,å³ä½¿ç®€åŒ–æ•´ä¸ªç³»ç»Ÿï¼Œå†…åœ¨çš„å¤æ‚性也ä¸ä¼šé™ä½Žã€‚å®ƒä¼šè½¬ç§»åˆ°ç”¨æˆ·ï¼Œå¹¶ä¸”ç”¨æˆ·å¿…é¡»ä»¥æ›´å¤æ‚的方å¼è¡Œäº‹ã€‚
得墨忒耳定律 (The Law of Demeter)
别和陌生人讲è¯ã€‚
得墨忒耳定律åˆç§°æœ€å°‘知识原则,是一æ¡ä¸Žé¢å‘对象è¯è¨€æœ‰å…³çš„软件设计原则。
该定律表明,软件的一个å•元应该åªä¸Žå…¶ç›´æŽ¥åˆä½œè€…交谈。比如对象 A 引用了对象 B,对象 B 引用了对象 C,则 A å¯ä»¥ç›´æŽ¥è°ƒç”¨ B 的方法,但ä¸åº”直接调用 C 的方法。所以如果 C 有一个 dothing() 的方法,A ä¸åº”该直接调用,而是使用 B.getC().doThis()。
éµå¾ªè¿™ä¸€å®šå¾‹å¯ä»¥é™åˆ¶ä»£ç?æ›´æ”¹çš„èŒƒå›´ï¼Œä½¿å…¶ä»¥åŽæ›´å®¹æ˜“ç»´æŠ¤ã€æ›´å®‰å…¨ã€‚
抽象泄æ¼å®šå¾‹ (The Law of Leaky Abstractions)
在æŸç§ç¨‹åº¦ä¸Šï¼Œæ‰€æœ‰éžå¹³å‡¡çš„æŠ½è±¡éƒ½æ˜¯æœ‰æ³„æ¼çš„。
乔尔斯·波尔斯基 (Joel Spolsky)
è¯¥å®šå¾‹æŒ‡å‡ºï¼Œé€šå¸¸ç”¨äºŽç®€åŒ–å¤æ‚系统的抽象,在æŸäº›æƒ…况下将底层系统泄æ¼å‡ºæ¥ï¼Œä½¿å¾—抽象表现出æ„外的行为。
例如åŠ?载文件并读å–其内容。文件系统 API 是较低级别内æ?¸ç³»ç»Ÿçš„æŠ½è±¡ï¼Œå®ƒä»¬æœ¬èº«æ˜¯ä¸Žç£ç›˜ï¼ˆæˆ– SSD 的闪å˜ï¼‰ä¸Šçš„æ•°æ®æ›´æ”¹ç›¸å…³çš„物ç†è¿‡ç¨‹çš„æŠ½è±¡ã€‚åœ¨å¤§å¤šæ•°æƒ…å†µä¸‹ï¼Œå¤„ç†æ–‡ä»¶ï¼ˆå¦‚äºŒè¿›åˆ¶æ•°æ®æµï¼‰çš„æŠ½è±¡å°†èµ·ä½œç”¨ã€‚但是,对于ç£ç›˜é©±åŠ¨å™¨ï¼Œé¡ºåºè¯»å–æ•°æ®å°†æ¯”éšæœºè®¿é—®å¿«å¾—多(由于页é¢é”™è¯¯çš„开销增åŠ?)。但对于 SSD 驱动器,æ¤å¼€é”€ä¸ä¼šå‡ºçŽ°ã€‚éœ€è¦ç†è§£åŸºç¡€ç»†èŠ‚æ¥å¤„ç†è¿™ç§æƒ…况(例如,数æ®åº“索引文件的良好结构å¯ä»¥å‡å°‘éšæœºè®¿é—®çš„开销),开å‘人员需è¦åˆç†çš„æŠ½è±¡ï¼Œæ¥å¤„ç†ä¸åŒçš„细节。
当引入更多的抽象时,上é¢çš„例å会å˜å¾—æ›´å¤æ‚。Linux æ“作系统å…许通过网络访问文件,但在本地表示为普通文件。如果å˜åœ¨ç½‘ç»œæ•…éšœï¼Œè¿™ç§æŠ½è±¡å°†ä¼šæ³„æ¼ã€‚如果开å‘人员将这些文件视为普通文件,而ä¸è€ƒè™‘它们å¯èƒ½ä¼šå—到网络延迟和故障的影å“,那么解决方案就会出错。
æè¿°è¯¥å®šå¾‹çš„æ–‡ç«?表明,过度ä¾èµ–抽象,åŠ?上对底层过程的ç†è§£ä¸è¶³ï¼Œå®žé™…上使得问题在æŸäº›æƒ…况下更åŠ?夿‚。
å‚è§ï¼š
真实的例å:
- Photoshop å¯åŠ¨ç¼“æ…¢ï¼šæˆ‘è¿‡åŽ»é‡åˆ°è¿‡ä¸€ä¸ªé—®é¢˜ï¼Œå°±æ˜¯ Photoshop å¯åŠ¨ç¼“æ…¢ï¼Œæœ‰æ—¶éœ€è¦å‡?åˆ†é’Ÿã€‚é—®é¢˜å¥½åƒæ˜¯ Photoshop å¯åŠ¨æ—¶ï¼Œä¼šè¯»å–当å‰é»˜è®¤æ‰“å°æœºçš„一些信æ¯ã€‚ä½†æ˜¯ï¼Œå¦‚æžœè¯¥æ‰“å°æœºå®žé™…上是一å°ç½‘ç»œæ‰“å°æœºï¼Œåˆ™å¯èƒ½éœ€è¦å¾ˆé•¿çš„æ—¶é—´ã€‚å°†ç½‘ç»œæ‰“å°æœºä¸Žæœ¬åœ°æ‰“å°æœºå½“ä½œåŒæ?·çš„æŠ½è±¡ï¼Œå¯¼è‡´è¿žæŽ¥ä¸è‰¯çš„æƒ…况下出现问题。
帕金森çç¢Žå®šç† (The Law of Triviality)
è¯¥å®šç†æ˜¾ç¤ºï¼Œç¾¤ä½“将给予更多的时间和注æ„力æ¥å¤„ç†çç¢Žçš„é—®é¢˜ï¼Œè€Œä¸æ˜¯ç”¨æ¥å¤„ç†ä¸¥è‚ƒè€Œå®žè´¨æ€§çš„问题。
常è§çš„è™šæž„ä¾‹åæ˜¯å§”员会批准æ?¸ç”µç«™çš„è®¡åˆ’ï¼Œä»–ä»¬å¤§éƒ¨åˆ†æ—¶é—´éƒ½åœ¨è®¨è®ºè‡ªè¡Œè½¦æ£šçš„ç»“æž„ï¼Œè€Œä¸æ˜¯ç”µåŽ‚æœ¬èº«ç‰æ›´ä¸ºé‡è¦çš„设计。如果没有大é‡çš„专业知识或者准备,很难给éžå¸¸å¤§çš„夿‚主题讨论æä¾›å®è´µçš„æ„è§ã€‚但是,人们希望看到更多æ„è§ã€‚å›?æ¤ï¼Œä»–们倾å‘äºŽå°†å¤§é‡æ—¶é—´é›†ä¸åœ¨å¾ˆå®¹æ˜“推敲,但ä¸ä¸€å®šè¢«çœ‹é‡çš„å°ç»†èŠ‚ä¸Šã€‚
由上é¢çš„虚构例å产生了 Bike Shedding 的说法,以形容在ç碎细节上浪费时间这一行为。
Unix å“²å¦ (The Unix Philosophy)
Unix 哲妿Œ‡è½¯ä»¶ç»„件应该很å°ï¼Œå¹¶ä¸“注于åšä¸€ä»¶ç‰¹å®šçš„事情。将å°è€Œç®€å•以åŠå®šä¹‰è‰¯å¥½çš„å•元组åˆåœ¨ä¸€èµ·ï¼Œè€Œä¸æ˜¯ä½¿ç”¨å¤§è€Œå¤æ‚的多用途程åºï¼Œå¯ä»¥æ›´è½»æ¾åœ°æž„建系统。
åƒå¾®æœåŠ¡æž¶æž„è¿™ç§çŽ°ä»£å®žè·µå¯ä»¥è®¤ä¸ºæ˜¯è¿™ç§å“²å¦çš„åº”ç”¨ï¼Œå…¶ä¸æœåŠ¡å¾ˆå°ï¼Œé›†ä¸äºŽåšä¸€ä»¶ç‰¹å®šçš„事情,由简å•的构建å—组æˆå¤æ‚的行为。
Spotify 模型 (The Spotify Model)
Spotify æ¨¡åž‹æ˜¯å›¢é˜Ÿå’Œç»„ç»‡ç»“æž„çš„ä¸€ç§æ–¹æ³•,已被 Spotify 实验室推广开æ¥ã€‚åœ¨æ¤æ¨¡åž‹ä¸ï¼Œå›¢é˜Ÿå›´ç»•åŠŸèƒ½è€ŒéžæŠ€æœ¯è¿›è¡Œç»„ç»‡ã€‚
Spotify 模型还普åŠäº†éƒ¨è½ã€è¡Œä¼šä»¥åŠç«?节的概念,这些是组织结构的其他组æˆéƒ¨åˆ†ã€‚
沃德勒定律 (Wadler's Law)
任何è¯è¨€è®¾è®¡ä¸ï¼Œè®¨è®ºä¸‹é¢åˆ—è¡¨ä¸æŸä¸ªè¦ç´?所花费的总时间与其ä½ç½®æˆæ£æ¯”。
- è¯ä¹‰ (Semantics)
- è¯æ³• (Syntax)
- è¯æ³• (Lexical syntax)
- æ³¨é‡Šè¯æ³• (Lexical syntax of comments)
(简而言之,在è¯ä¹‰ä¸ŠèŠ±è´¹ä¸€ä¸ªå°æ—¶ï¼Œå°±è¦åœ¨æ³¨é‡Šè¯æ³•ä¸ŠèŠ±è´¹å…«ä¸ªå°æ—¶ï¼‰ã€‚
与 帕金森çç¢Žå®šç† ç±»ä¼¼, 沃德勒定律指出,在设计è¯è¨€æ—¶ï¼Œä¸Žè¿™äº›ç‰¹å¾çš„é‡è¦æ€§ç›¸æ¯”,花在è¯è¨€ç»“构上的时间过多。
å‚è§ï¼š
�顿定律 (Wheaton's Law)
ä¸è¦åƒä¸ªå‚»å一æ?·ã€‚
å¨å°”·æƒ?é¡¿ (Wil Wheaton)
è¿™æ¡å®šå¾‹ç”±å¨å°” · æƒ?顿(曾出演过星际迷航:下一代ã€ç”Ÿæ´»å¤§çˆ†ç‚¸ï¼‰åˆ›é€?,这个简æ´è€Œæœ‰åŠ›çš„å®šå¾‹æ—¨åœ¨ä¸“ä¸šç»„ç»‡å†…è¥é€?å’Œè°å’Œå°Šé‡çš„环境。它å¯ä»¥åœ¨ä¸ŽåŒäº‹äº¤è°ˆã€ä»£ç?审查ã€åé©³è§‚ç‚¹å’Œæ‰¹è¯„çš„æ—¶å€™æ´¾ä¸Šç”¨åœºã€‚è€Œä¸”é€šå¸¸æƒ…å†µä¸‹ï¼Œäººä»¬ä¹‹é—´çš„ä¸“ä¸šäº¤äº’ä¹ŸåŒæ?·é€‚用。
原则
原则通常是与设计相关的准则。
切斯特森围æ? (Chesterson's Fence)
在了解现有情况背åŽçš„原å›?之å‰ï¼Œä¸åº”该进行改进。
该原则与软件工程ä¸çš„æ¶ˆé™¤æŠ€æœ¯è´Ÿå€º (Technical debt) 相关。程åºçš„æ¯ä¸€è¡Œæœ€åˆéƒ½æ˜¯å‡ºäºŽæŸç§åŽŸå›?编写的,å›?æ¤æ?¹æ®åˆ‡æ–¯ç‰¹æ£®å›´æ?原则,在更改或åˆ?除代ç?之å‰ï¼Œå³ä½¿çœ‹èµ·æ¥ä¼¼ä¹Žæ˜¯å¤šä½™çš„æˆ–䏿£ç¡®çš„,也应该å°è¯•完全ç†è§£ä»£ç?的上下文和å«ä¹‰ã€‚
该原则的åå—æ¥æºäºŽ G.K. Chesterson 的一则故事。一个男人横穿马路ä¸å¤®çš„æ?…æ?,他å‘å¸‚é•¿æŠ±æ€¨è¿™é“æ?…æ?æ²¡æœ‰ç”¨è¿˜æŒ¡è·¯ï¼Œå¹¶è¦æ±‚拆除它。市长问他为什么è¦åœ¨é‚£é‡Œå»ºæ?…æ?,那个人回ç”说ä¸çŸ¥é“。市长接ç€è¯´ï¼šâ€œå¦‚æžœä½?ä¸çŸ¥é“它的用途,我肯定ä¸ä¼šè®©ä½?把它拆了。ä½?åŽ»æŸ¥æŸ¥å®ƒçš„ç”¨é€”ï¼Œä¹‹åŽæˆ‘å¯èƒ½ä¼šå…许ä½?拆掉它。â€
æ»æµ·æ•ˆåº” (The Dead Sea Effect)
"... 那些更有æ‰åŽï¼Œæ›´æœ‰æ•ˆçŽ‡çš„ IT 工程师最有å¯èƒ½ç¦»å¼€â€”—消失 ... (而那些倾å‘于)留下æ¥çš„“剩下的人â€â€”—是最没有æ‰åŽå’Œæ•ˆçŽ‡çš„ IT 工程师。"
Bruce F. Webster
æ»æµ·æ•ˆåº”表明,在任何一个组织ä¸ï¼Œå·¥ç¨‹å¸ˆçš„æŠ€èƒ½ã€æ‰åŽå’Œæ•ˆèƒ½å¾€å¾€ä¸Žä»–们在公å¸çš„æ—¶é—´å‘ˆå比。
通常情况下,技术好的工程师很容易在其他的地方找到工作,并且他们往往也会这æ?·åšã€‚而技能过时或技术薄弱的工程师则会留在公å¸ï¼Œå›?为其他地方很难找到工作。如果这些工程师在公å¸é‡ŒèŽ·å¾—äº†åŠ?薪,他们会更愿æ„留在公å¸ï¼Œå›?为在其他地方找到åŒç‰è–ªé…¬çš„工作会很有挑战性。
呆伯特法则 (The Dilbert Principle)
å…¬å¸ä¼šå€¾å‘于系统地将工作能力差的员工æå‡åˆ°ç®¡ç†å±‚,以使他们脱离工作æµç¨‹ã€‚
å²è€ƒç‰¹Â·äºšå½“æ–¯ (Scott Adams)
呆伯特原则是由å²è€ƒç‰¹Â·äºšå½“æ–¯ (Dilbert 漫画连环画的创建者) å¼€å‘çš„ä¸€ä¸ªç®¡ç†æ¦‚å¿µï¼Œçµæ„Ÿæ¥æºäºŽå½¼å¾—原ç†ã€‚æ?¹æ®å‘†ä¼¯ç‰¹åŽŸåˆ™ï¼Œå·¥ä½œèƒ½åŠ›å·®çš„å‘˜å·¥ä¼šè¢«æå‡åˆ°ç®¡ç†å±‚,从而é™åˆ¶ä»–们所能é€?æˆçš„æŸå®³ã€‚äºšå½“æ–¯é¦–å…ˆåœ¨ 1995 年《åŽå°”街日报》的一篇文ç«?ä¸è§£é‡Šäº†è¿™ä¸€åŽŸåˆ™ï¼ŒéšåŽåœ¨ä»– 1996 年的商业书ç±ã€Šå‘†ä¼¯ç‰¹åŽŸåˆ™ã€‹ä¸è¿›è¡Œäº†æ‰©å±•。
å‚è§ï¼š
帕累托法则 (The Pareto Principle or The 80/20 Rule)
生活ä¸å¤§å¤šæ•°äº‹æƒ…䏿˜¯å‡åŒ€åˆ†å¸ƒçš„。
帕累托法则å¯ä»¥å¸®ä½?认识到大多数结果æ¥è‡ªå°‘数投入:
- æŸä¸ªè½¯ä»¶çš„ 80ï¼… 代ç?åªå?äº†æ€»åˆ†é…æ—¶é—´çš„ 20%(相å,最难的 20ï¼… 代ç?部分å?用了 80ï¼… 的时间)
- 20% 的努力产生了 80% 的结果
- 20% 的工作创�了 80% 的收入
- 20% 的错误导致了 80% 的崩溃
- 20ï¼… 的功能导致了 80ï¼… 的使用é‡
在 20 世纪 40 å¹´ä»£ï¼Œå…¬è®¤ä¸ºè´¨é‡æŽ§åˆ¶ä¹‹çˆ¶çš„ç¾Žå›½ç½—é©¬å°¼äºšå·¥ç¨‹å¸ˆçº¦ç‘Ÿå¤«Â·æœ±å…°åšå£«ï¼Œå¼€å§‹å°†å¸•累托法则应用于质é‡é—®é¢˜ã€‚
这个原则也被称为二八法则,é‡è¦çš„少数法则和å›?ç´?稀ç–原则。
现实的例å:
- 微软 2002 å¹´çš„æŠ¥å‘Šè¡¨æ˜Žï¼Œä¿®å¤æœ€å¸¸å‡ºçŽ°çš„ 20ï¼… 错误,将消除 Windows å’Œ Office ä¸ 80ï¼… çš„ 错误和崩溃。报告地å€
å½¼å¾—åŽŸç† (The Peter Principle)
在ç‰çº§åˆ¶åº¦ä¸ï¼Œäººå¾€å¾€ä¼šè¢«æå‡åˆ°ä»–们的“æ—?法胜任的水平â€ã€‚
劳伦斯·彼得 (Laurence J. Peter)
这是由劳伦斯·彼得æå‡ºçš„ä¸€ä¸ªç®¡ç†æ¦‚念。彼得原ç†è®¤ä¸ºï¼Œæ“…长工作的人会得到æå‡ï¼Œç›´åˆ°ä»–们达到ä¸å†æˆåŠŸçš„æ°´å¹³ (å³ä»–们所“æ—?法胜任的水平â€)。基于æ¤ï¼Œç”±äºŽä»–们资历更高,被公å¸å¼€é™¤çš„å¯èƒ½æ€§è¾ƒå° (除éžä»–们表现éžå¸¸ç³Ÿç³•)ã€‚è€Œä¸”ä»–ä»¬å°†ç»§ç»æ‹…ä»»å‡?ä¹Žæ²¡æœ‰æœ¬èŒæŠ€èƒ½çš„èŒä½ï¼Œå³ä½¿é‚£äº›åŽŸæœ¬è®©ä»–ä»¬æˆåŠŸçš„èƒ½åŠ›åœ¨æ–°å·¥ä½œä¸å¹¶æ—?å¿…è¦ã€‚
有的工程师对æ¤ç‰¹åˆ«æ„Ÿå…´è¶£ï¼Œå®ƒä»¬æœ€åˆä»Žäº‹çš„æ˜¯æ·±åº¦çš„æŠ€æœ¯å·¥ä½œï¼Œä½†èµ°ä¸Šäº†ç®¡ç†å…¶ä»–工程师的èŒä¸šé“路——这æ„味ç€éœ€è¦ä¸€ä¸ªå®Œå…¨ä¸åŒçš„æŠ€èƒ½æ?‘。
å‚è§ï¼š
鲿£’性原则 (The Robustness Principle or Postel's Law)
在自己所åšçš„事情上è¦ä¿å®ˆ, 在接å—别人的事情上è¦è‡ªç”±ã€‚
通常应用于æœåŠ¡å™¨åº”ç”¨ç¨‹åºå¼€å‘ä¸ï¼Œè¯¥åŽŸåˆ™æŒ‡å‡ºï¼Œä½?å‘é€ç»™å…¶ä»–人的内容应尽å¯èƒ½æœ€å°ä¸”符åˆè¦æ±‚,并且处ç†ä¸ç¬¦åˆè¦æ±‚的输入。
该原则的目æ?‡æ˜¯æž„建稳å¥çš„系统。如果å¯ä»¥ç†è§£æ„图,它们å¯ä»¥å¤„ç†ä¸è‰¯çš„输入。但是,接å—错误æ?¼å¼çš„输入å¯èƒ½å˜åœ¨å®‰å…¨éšæ‚£ï¼Œç‰¹åˆ«æ˜¯æ¤ç±»çš„输入未ç»è¿‡å……分测试。
SOLID
这是一个缩写,指的是:
- S:å•一功能原则 (The Single Responsibility Principle)
- O:开é—原则 (The Open/Closed Principle)
- Lï¼šé‡Œæ°æ›¿æ¢åŽŸåˆ™ (The Liskov Substitution Principle)
- I:接å£éš”离原则 (The Interface Segregation Principle)
- D:ä¾èµ–å转原则 (The Dependency Inversion Principle)
这些是 Object-Oriented Programming 的关键原则。诸如æ¤ç±»çš„设计原则能够帮助开å‘人员构建更易于维护的系统。
å•一功能原则 (The Single Responsibility Principle)
æ¯ä¸ªæ¨¡å—或者类åªåº”该有一项功能。
SOLID çš„ç¬¬ä¸€ä¸ªåŽŸåˆ™ã€‚è¿™ä¸ªåŽŸåˆ™è¡¨æ˜Žæ¨¡å—æˆ–者类åªåº”该åšä¸€ä»¶äº‹ã€‚实际上,这æ„味ç€å¯¹ç¨‹åºåŠŸèƒ½çš„å•ä¸ªå°æ›´æ”¹ï¼Œåº”该åªéœ€è¦æ›´æ”¹ä¸€ä¸ªç»„件。例如,更改密ç?验è¯å¤æ‚性的方å¼åº”该åªéœ€è¦æ›´æ”¹ç¨‹åºçš„一部分。
ç†è®ºä¸Šè®²ï¼Œè¿™ä½¿ä»£ç?æ›´å¥å£®ï¼Œæ›´å®¹æ˜“æ›´æ”¹ã€‚çŸ¥é“æ£åœ¨æ›´æ”¹çš„ç»„ä»¶åªæœ‰ä¸€ä¸ªåŠŸèƒ½ï¼Œè¿™æ„å‘³ç€æµ‹è¯•更改更容易。使用å‰é¢çš„例å,更改密ç?夿‚性组件应该åªå½±å“与密ç?夿‚æ€§ç›¸å…³çš„åŠŸèƒ½ã€‚å˜æ›´å…·æœ‰è®¸å¤šåŠŸèƒ½çš„ç»„ä»¶å¯èƒ½è¦å›°éš¾å¾—多。
å‚è§ï¼š
å¼€é—原则 (The Open/Closed Principle)
实体应开放扩展并关é—修改。
SOLID 的第二个原则。这个原则指出实体(å¯ä»¥æ˜¯ç±»ã€æ¨¡å—ã€å‡½æ•°ç‰ï¼‰åº”该能够使它们的行为易于扩展,但是它们的扩展行为ä¸åº”该被修改。
举一个å‡è®¾çš„例å,想象一个能够将 Markdown 转æ¢ä¸º HTML 的模å—。如果å¯ä»¥æ‰©å±•模å—,而ä¸ä¿®æ”¹å†…éƒ¨æ¨¡å—æ¥å¤„ç†æ–°çš„ markdown 特å¾ï¼Œè€Œæ—?需修改内部模å—,则å¯ä»¥è®¤ä¸ºæ˜¯å¼€æ”¾æ‰©å±•。如果用户ä¸èƒ½ä¿®æ”¹å¤„ç†çŽ°æœ‰ Markdown 特å¾çš„æ¨¡å—,那么它被认为是关é—修改。
这个原则与é¢å‘对象编程紧密相关,让我们å¯ä»¥è®¾è®¡å¯¹è±¡ä»¥ä¾¿äºŽæ‰©å±•,但是å¯ä»¥é¿å…ä»¥æ„æƒ³ä¸åˆ°çš„æ–¹å¼æ”¹å˜å…¶çŽ°æœ‰å¯¹è±¡çš„è¡Œä¸ºã€‚
å‚è§ï¼š
é‡Œæ°æ›¿æ¢åŽŸåˆ™ (The Liskov Substitution Principle)
å¯ä»¥åœ¨ä¸ç?´å系统的情况下,用å类型替æ¢ç±»åž‹ã€‚
SOLID 的第三个原则。该原则指出,如果组件ä¾èµ–于类型,那么它应该能够使用该类型的å类型,而ä¸ä¼šå¯¼è‡´ç³»ç»Ÿå¤±è´¥æˆ–者必须知é“该å类型的详细信æ¯ã€‚
举个例å,å‡è®¾æˆ‘ä»¬æœ‰ä¸€ä¸ªæ–¹æ³•ï¼Œè¯»å– XML 文档。如果该方法使用基类型 file,则从 file 派生的任何内容,都能用在该方法ä¸ã€‚ 如果 file 支æŒå呿Ÿ¥æ‰¾ï¼Œå¹¶ä¸” xml è§£æžå™¨ä½¿ç”¨è¯¥å‡½æ•°ï¼Œä½†æ˜¯æ´¾ç”Ÿç±»åž‹ network file å°è¯•å呿Ÿ¥æ‰¾æ—¶å¤±è´¥ï¼Œåˆ™ network file å°†è¿å该原则。
该原则与é¢å‘对象编程紧密相关,必须仔细建模ã€å±‚次结构,以é¿å…让系统用户混淆。
å‚è§ï¼š
接å£éš”离原则 (The Interface Segregation Principle)
ä¸åº”强制任何客户端ä¾èµ–于它ä¸ä½¿ç”¨çš„æ–¹æ³•。
SOLID 的第四个原则。该原则指出组件的消费者ä¸åº”该ä¾èµ–于它实际上ä¸ä½¿ç”¨çš„组件函数。
举一个例å,å‡è®¾æˆ‘ä»¬æœ‰ä¸€ä¸ªæ–¹æ³•ï¼Œè¯»å– XML 文档。它åªéœ€è¦è¯»å–文件ä¸çš„å—节,å‘å‰ç§»åŠ¨æˆ–å‘åŽç§»åŠ¨ã€‚å¦‚æžœç”±äºŽä¸€ä¸ªä¸Žæ–‡ä»¶ç»“æž„ä¸ç›¸å…³çš„功能å‘生更改(例如更新文件安全性的æƒé™æ¨¡åž‹ï¼‰ï¼Œéœ€è¦æ›´æ–°æ¤æ–¹æ³•,则该原则已失效。文件最好实现 坿Ÿ¥è¯¢æµ 接å£ï¼Œå¹¶è®© XML 读å–器使用该接å£ã€‚
该原则与é¢å‘å¯¹è±¡ç¼–ç¨‹ç´§å¯†ç›¸å…³ï¼Œå…¶ä¸æŽ¥å£ï¼Œå±‚次结构和抽象类型用于ä¸åŒç»„ä»¶çš„ minimise the coupling。 Duck typing 是一ç§é€šè¿‡æ¶ˆé™¤æ˜¾å¼æŽ¥å£æ¥å¼ºåˆ¶æ‰§è¡Œè¯¥åŽŸåˆ™çš„æ–¹æ³•ã€‚
å‚è§ï¼š
ä¾èµ–å转原则 (The Dependency Inversion Principle)
高级模å—ä¸åº”该ä¾èµ–于低级实现。
SOLID 的第五个原则。该原则指出,更高级别的å调组件ä¸åº”该知é“å…¶ä¾èµ–项的详细信æ¯ã€‚
举个例å,å‡è®¾æˆ‘们有一个从网站读å–元数æ®çš„程åºã€‚我们å‡è®¾ä¸»è¦ç»„件必须知é“下载网页内容的组件,以åŠå¯ä»¥è¯»å–元数æ®çš„组件。如果我们考虑ä¾èµ–å转,主è¦ç»„件将仅ä¾èµ–于å¯ä»¥èŽ·å–å—节数æ®çš„æŠ½è±¡ç»„ä»¶ï¼Œç„¶åŽæ˜¯ä¸€ä¸ªèƒ½å¤Ÿä»Žå—节æµä¸è¯»å–元数æ®çš„æŠ½è±¡ç»„件,主è¦ç»„ä»¶ä¸éœ€è¦äº†è§£ TCPã€IPã€HTTPã€HTML ç‰ã€‚
è¿™ä¸ªåŽŸåˆ™å¾ˆå¤æ‚,å›?为它似乎å¯ä»¥å转系统的预期ä¾èµ–性(å›?æ¤å¾—å)。实践ä¸ï¼Œè¿™ä¹Ÿæ„味ç€ï¼Œå•ç‹¬çš„ç¼–æŽ’ç»„ä»¶å¿…é¡»ç¡®ä¿æŠ½è±¡ç±»åž‹çš„æ£ç¡®å®žçŽ°è¢«ä½¿ç”¨ï¼ˆä¾‹å¦‚åœ¨å‰é¢çš„例åä¸ï¼Œå¿…é¡»æä¾›å…ƒæ•°æ®è¯»å–器组件ã€HTTP 文件下载功能和 HTML å…ƒæ?‡ç¾è¯»å–器)。然åŽï¼Œè¿™æ¶‰åŠè¯¸å¦‚ Inversion of Control å’Œ Dependency Injection 之类的模å¼ã€‚
å‚è§ï¼š
ä¸è¦é‡å¤ä½?自己原则 (The DRY Principle)
系统ä¸ï¼Œæ¯ä¸€å—知识都必须是å•ä¸€ã€æ˜Žç¡®è€Œæƒå¨çš„。
DRY 是 Do not Repeat Yourself 的缩写。这个原则旨在帮助开å‘人员å‡å°‘代ç?çš„é‡å¤æ€§ï¼Œå¹¶å°†å…¬å…±ä»£ç?ä¿å˜åœ¨ä¸€ä¸ªåœ°æ–¹ã€‚最åˆç”±å®‰å¾·é²Â·äº¨ç‰¹å’Œæˆ´å¤«Â·æ‰˜é©¬æ–¯åœ¨ 1999 年出版的《程åºå‘˜ä¿®ç‚¼ä¹‹é“》ä¸å¼•用。
与 DRY 相å的是 WETï¼ˆåŠŸèƒ½å®žçŽ°ä¸¤æ¬¡æˆ–è€…å–œæ¬¢æ‰“å— Write Everything Twice or We Enjoy Typing)。
实际上,如果ä½?在两个或更多的地方有相åŒçš„功能,ä½?å¯ä»¥ä½¿ç”¨ DRY 原则将它们åˆå¹¶ä¸ºä¸€ä¸ªï¼Œå¹¶åœ¨ä»»ä½•ä½?需è¦çš„地方é‡å¤ä½¿ç”¨ã€‚
å‚è§ï¼š
- 《程åºå‘˜ä¿®ç‚¼ä¹‹é“》英文维基百科
- 《程åºå‘˜ä¿®ç‚¼ä¹‹é“》豆瓣
KISS 原则 (The KISS Principle)
ä¿æŒç®€å•和直白。
KISS åŽŸåˆ™æŒ‡æ˜Žäº†å¦‚æžœå¤§å¤šæ•°çš„ç³»ç»Ÿèƒ½å¤Ÿä¿æŒç®€å•而éžå¤æ‚化,那么他们便能够工作在最佳状æ€ã€‚å›?æ¤ï¼Œç®€å•性应该是设计时的关键指æ?‡ï¼ŒåŒæ—¶ä¹Ÿè¦é¿å…ä¸å¿…è¦çš„夿‚度。这个çŸè¯æœ€åˆå‡ºè‡ª 1960 年的美国海军飞机工程师凯利 · 约翰逊 (Kelly Johnson)。
这一原则的最好例è¯ä¾¿æ˜¯çº¦ç¿°é€Šç»™è®¾è®¡å·¥ç¨‹å¸ˆä¸€äº›å®žç”¨å·¥å…·çš„æ•…事。那时的他们æ£é¢ä¸´ç€ä¸€ä¸ªæŒ‘战,å³ä»–们å‚与设计的喷气å¼é£žæœºå¿…须能够让普通的机械师在战场上仅仅用这些工具进行维修,å›?æ¤ï¼Œâ€œç›´ç™½â€è¿™ä¸ªè¯åº”指的是æŸå的事物本身和修å¤ç”¨å·¥å…·çš„夿‚度两者之间的关系,而éžå·¥ç¨‹å¸ˆä»¬è‡ªèº«çš„能力水平。
å‚è§ï¼š
ä½?ä¸éœ€è¦å®ƒåŽŸåˆ™ (YAGNI)
这是 You Aren't Gonna Need It 的缩写。
åªæœ‰å½“ä½?éœ€è¦æŸäº›ä¸œè¥¿çš„æ—¶å€™ï¼Œæ‰åŽ»å®žçŽ°å®ƒä»¬ï¼Œè€Œä¸æ˜¯åœ¨ä½?预è§çš„æ—¶å€™ã€‚
Ron Jeffries 是æžé™ç¼–程的创始人之一以åŠä¹¦ç±ã€ŠExtreme Programming Installed》的作者。
æžé™ç¼–程原则告诫开å‘人员,他们应该åªå®žçް当剿‰€éœ€çš„功能,并é¿å…实现未æ¥éœ€è¦çš„åŠŸèƒ½ï¼Œä»…åœ¨å¿…è¦æ—¶æ‰å®žçŽ°ã€‚
éµå®ˆè¿™ä¸€åŽŸåˆ™å¯ä»¥å‡å°ä»£ç?库大å°ï¼ŒåŒæ—¶é¿å…时间和生产力浪费在没有价值的功能上。
å‚è§ï¼š
分布å¼è®¡ç®—的谬论 (The Fallacies of Distributed Computing)
åˆç§° 网络计算的谬误,这是一系列关于分布å¼è®¡ç®—的猜想(或者看法),这些猜想å¯èƒ½ä¼šå¼•起软件开å‘ä¸çš„失败。这些å‡è®¾æ˜¯ï¼š
- 网络å¯é?
- 延迟为零
- 带宽æ—?é™
- 网络安全
- 拓扑æ’定
- å•一管ç†å‘˜
- è¿è¾“æˆæœ¬ä¸ºé›¶
- ç½‘ç»œä¸ºåŒæž„çš„
å‰ 4 å„项目由 Bill Joy å’Œ Tom Lyon 于 1991 å·¦å³æå‡ºã€‚å¹¶è¢« James Gosling 首次归类于“网络计算的谬误â€ï¼›åŽ L. Peter Deutsch æ·»åŠ?了第 5ã€6ã€7 个谬误;90 年代末,Gosling æ·»åŠ?了最åŽä¸€ä¸ªè°¬è¯¯ã€‚
这些内容å—到了 太阳微系统 (Sun Microsystems) 内部当时所å‘生的事情的å¯å‘。
在设计弹性代ç?的时候,应该仔细考虑这些谬误,并å‡è®¾å…¶ä¸ä»»ä½•一个谬误都å¯èƒ½å¼•起处ç†åˆ†å¸ƒå¼ç³»ç»Ÿçš„夿‚性和现实性时的逻辑缺陷。
å‚è§:
- 寻找分布å¼è®¡ç®—的谬误(第一部分) - Vaidehi Joshion Medium
- åå¹´åŽï¼Œå¾·æ„å¿— (Peter Deutsch) 的谬论
阅读清å•
如果ä½?觉得这些概念很有趣,ä½?å¯èƒ½ä¼šå–œæ¬¢ä»¥ä¸‹ä¹¦ç±ã€‚
- 《æžé™ç¼–程安装》谷æŒé˜…è¯»åœ°å€ - 涵盖æžé™ç¼–程的æ?¸å¿ƒåŽŸåˆ™ã€‚
- 《人月神è¯ã€‹è°·æŒé˜…读地å€ã€è±†ç“£åœ°å€ - 软件工程的ç»å…¸ä¹¦ç±ã€‚这本书的ä¸å¿ƒä¸»é¢˜å°±æ˜¯å¸ƒé²å…‹æ–¯æ³•则 。
- 《哥德尔ã€è‰¾èˆå°”ã€å·´èµ«ï¼šé›†å¼‚璧之大æˆã€‹è°·æŒé˜…读地å€ã€è±†ç“£åœ°å€ - 这本书很难分类。侯世达定律 æ¥è‡ªæ¤ä¹¦ã€‚
- 《大教å?‚与市集》英文维基百科 - 一本关于开æºçš„æ–‡é›†ï¼Œæž—纳斯定律 (Linus's Law)æºäºŽæ¤ä¹¦ã€‚
- 《呆伯特原则》谷æŒé˜…è¯»åœ°å€ - 一本审视美国ä¼ä¸šçš„æ¼«ç”»ä¹¦ï¼Œå…¶ä½œè€…创é€?了呆伯特法则。
- 《彼得原ç†ã€‹è°·æŒé˜…è¯»åœ°å€ - 一本专注于大型组织和人员管ç†çš„æŒ‘战的漫画书,也是彼得原ç†çš„æ¥æºã€‚
- 《计算机程åºçš„æž„é€?和解释》谷æŒé˜…è¯»åœ°å€ - 如果ä½?是 MIT 或剑桥大å¦çš„ CSã€EE å¦ç”Ÿï¼Œè¿™æ˜¯ä¸€æœ¬ç¼–程的入门书,并且被称为“人生的转折点â€ã€‚
在线资æº
一些有用的资æºå’Œé˜…读资料。
- CB Insights: 8 Laws Driving Success In Tech: Amazon's 2-Pizza Rule, The 80/20 Principle, & More - è¿™æ˜¯ä»¥å‰æœ‰è¶£çš„æ–‡ç«?,介ç»äº†ä¸€äº›å¯¹æŠ€æœ¯ä¸Šäº§ç”Ÿäº†å¾ˆå¤§å½±å“的定律。
相关项目
- Tip of the Day - Receive a daily hacker law/principle.
- Hacker Laws CLI - List, view and see random laws from the terminal!
TODO
å—¨ï¼å¦‚æžœä½?读到这里,点击了一个我尚未编写的主题链接,我感到很抱æ‰ã€‚这是æ£åœ¨è¿›è¡Œä¸çš„工作ï¼
éšæ„ç»™ hacker-laws å’Œ hacker-laws-zh æ Issue 或者 Pull Request。

