程序員必讀職場(chǎng)15大定律和7大原則

hacker-laws 的的中文翻譯。https://github.com/dwmkerr/hacker-laws

對(duì)開發(fā)人員有用的定律除破、理論掸掏、原則和模式船殉。(Laws, Theories, Principles and Patterns that developers will find useful.)

為了方便閱讀,維基百科增加了中文鏈接炕桨。英文鏈接表示 hacker-laws 項(xiàng)目尚未完成的主題饭尝。

介紹

當(dāng)人們談?wù)撻_發(fā)時(shí),會(huì)聊到許多定律献宫。這個(gè)倉(cāng)庫收錄了一些最常見的定律钥平。

?: 這個(gè)倉(cāng)庫包含對(duì)一些定律、原則以及模式的解釋姊途,但不提倡其中任何一個(gè)涉瘾。 它們的應(yīng)用始終存在著爭(zhēng)論,并且很大程度上取決于你正在做什么捷兰。

定律

現(xiàn)在我們開始吧立叛!

阿姆達(dá)爾定律 (Amdahl's Law)

阿姆達(dá)爾定律是一個(gè)顯示計(jì)算任務(wù)潛在加速能力的公式。這種能力可以通過增加系統(tǒng)資源來實(shí)現(xiàn)贡茅,通常用于并行計(jì)算中秘蛇。它可以預(yù)測(cè)增加處理器數(shù)量的實(shí)際好處,然而增加處理器數(shù)量會(huì)受到程序并行性的限制顶考。

舉例說明:如果程序由兩部分組成赁还,部分 A 必須由單個(gè)處理器執(zhí)行,部分 B 可以并行運(yùn)行驹沿。那么向執(zhí)行程序的系統(tǒng)添加多個(gè)處理器只能獲得有限的好處艘策。它可以極大地提升部分 B 的運(yùn)行速度,但部分 A 的運(yùn)行速度將保持不變甚负。

下圖展示了一些運(yùn)行速度的提升潛能的例子:

image.png

(圖片來源: By Daniels220 at English Wikipedia, Creative Commons Attribution-Share Alike 3.0 Unported, https://en.wikipedia.org/wiki/File:AmdahlsLaw.svg)

可以看出柬焕,50% 并行化的程序在使用大于 10 個(gè)處理單元之后的速度提升收效甚微审残,而 95% 并行化的程序在使用超過一千個(gè)處理單元之后仍然可以顯著提升速度。

隨著摩爾定律減慢斑举,單個(gè)處理器的速度增加緩慢搅轿,并行化是提高性能的關(guān)鍵。圖形編程是一個(gè)極好的例子富玷,現(xiàn)代著色器可以并行渲染單個(gè)像素或片段璧坟。這也是現(xiàn)代顯卡通常具有數(shù)千個(gè)處理核心(GPU 或著色器單元)的原因。

參見:

破窗效應(yīng) (The Broken Windows Theory)

在破窗理論中認(rèn)為赎懦,一些明顯的犯罪跡象(或缺乏環(huán)保意識(shí))會(huì)導(dǎo)致進(jìn)一步的雀鹃、更嚴(yán)重的犯罪(或環(huán)境的進(jìn)一步惡化)。

破窗理論已應(yīng)用于軟件開發(fā)中励两,它表明劣質(zhì)代碼(或 Technical Debt)可能會(huì)影響后續(xù)優(yōu)化的效率黎茎,從而進(jìn)一步造成代碼劣化;隨著時(shí)間的推移当悔,這種效應(yīng)將會(huì)導(dǎo)致代碼質(zhì)量大幅下降傅瞻。

參見:

例子:

布魯克斯法則 (Brooks's Law)

軟件開發(fā)后期,添加人力只會(huì)使項(xiàng)目開發(fā)得更慢盲憎。

這個(gè)定律表明嗅骄,在許多情況下,試圖通過增加人力來加速已延期項(xiàng)目的交付饼疙,將會(huì)使項(xiàng)目交付得更晚溺森。布魯克斯也明白,這是一種過度簡(jiǎn)化窑眯。但一般的論據(jù)是屏积,新資源的時(shí)間增加和通信開銷,會(huì)在短期內(nèi)使開發(fā)速度減慢伸但。而且肾请,許多任務(wù)是密不可分的,換句話說更胖,這樣可以使更多的資源之間能輕易分配,這也意味著潛在的速度增長(zhǎng)也更低隔显。

諺語 九個(gè)女人不能在一個(gè)月內(nèi)生一個(gè)孩子 與布魯克斯法則同出一轍却妨,特別是某些不可分割或者并行的工作。

這是《人月神話》的中心主題括眠。

參見:

康威定律 (Conway's Law)

這個(gè)定律說明了系統(tǒng)的技術(shù)邊界可以反應(yīng)一個(gè)組織的結(jié)構(gòu)彪标,它通常會(huì)在改進(jìn)組織時(shí)被提及≈啦颍康威定律表明捞烟,如果一個(gè)組織被分散成許多小而無聯(lián)系的單元薄声,那么它開發(fā)的軟件也是小而分散的。如果組織是更多地圍繞以功能或服務(wù)為導(dǎo)向的垂直結(jié)構(gòu)题画,那么軟件系統(tǒng)也會(huì)反映這一點(diǎn)默辨。

參見:

坎寧漢姆定律 (Cunningham's Law)

在網(wǎng)絡(luò)上想得到正確答案的最好方法不是提問題,而是發(fā)布一個(gè)錯(cuò)誤的答案苍息。

據(jù)史蒂芬·麥克基迪說缩幸,沃德·坎寧漢姆早在 20 世紀(jì) 80 年代早期的時(shí)候建議他,在互聯(lián)網(wǎng)上獲得正確答案的最好方法不是提問題竞思,而是發(fā)布一個(gè)錯(cuò)誤的答案表谊。麥克基迪稱這為坎寧漢姆定律,而坎寧漢姆不以為然盖喷,并覺得這是“錯(cuò)誤的引用”爆办。最初這條定律只是用于描述 Usenet 上的社交行為,但后來也漸漸用于其他的在線社區(qū)(如 Wikipedia课梳、Reddit距辆、Twitter、Facebook 等)惦界。

參見:

鄧巴數(shù)字 (Dunbar's Number)

鄧巴數(shù)字是對(duì)一個(gè)人能夠保持穩(wěn)定社會(huì)關(guān)系的人數(shù)的認(rèn)知極限——在這種關(guān)系中挑格,一個(gè)人知道每個(gè)人是誰,也知道每個(gè)人與其他人的關(guān)系如何沾歪。而對(duì)這一數(shù)字的確切值則有著一些不同意見漂彤。鄧巴指出,人僅能輕松地維持 150 個(gè)穩(wěn)定的關(guān)系灾搏。這樣的關(guān)系在一個(gè)更社會(huì)化的背景中挫望,便是當(dāng)你碰巧在酒吧里碰到這些人時(shí)候,你不會(huì)因?yàn)榧尤胨麄兌械綄擂慰褚ぁ`嚢蛿?shù)字的估計(jì)值一般在 100 至 250 之間媳板。

和人與人之間穩(wěn)定的關(guān)系一樣,開發(fā)人員與代碼庫的關(guān)系也需要努力維護(hù)泉哈。當(dāng)面對(duì)大型蛉幸、復(fù)雜的項(xiàng)目,或許多項(xiàng)目的歸屬權(quán)時(shí)丛晦,我們會(huì)依賴于約定奕纫、策略和建模過程來進(jìn)行擴(kuò)展。鄧巴數(shù)字不僅在辦公室規(guī)模的擴(kuò)大的過程中舉足輕重烫沙,而且在設(shè)置團(tuán)隊(duì)工作范圍,或決定系統(tǒng)何時(shí)應(yīng)該注重于輔助建模和組織管理開銷自動(dòng)化的工具時(shí)撑柔,也是非常重要的辆沦。將鄧巴數(shù)字放入工程內(nèi)容中進(jìn)行類比蔚晨,那就是您能加入并有信心隨叫隨到進(jìn)行輪換的項(xiàng)目數(shù)(亦或是單個(gè)項(xiàng)目的規(guī)范化復(fù)雜性)累舷。

參見:

蓋爾定律 (Gall's Law)

一個(gè)切實(shí)可行的復(fù)雜系統(tǒng)勢(shì)必是從一個(gè)切實(shí)可行的簡(jiǎn)單系統(tǒng)發(fā)展而來的只怎。從頭開始設(shè)計(jì)的復(fù)雜系統(tǒng)根本不切實(shí)可行,無法修修補(bǔ)補(bǔ)讓它切實(shí)可行。你必須由一個(gè)切實(shí)可行的簡(jiǎn)單系統(tǒng)重新開始莲蜘。

約翰·蓋爾 (John Gall)

蓋爾定律說明了設(shè)計(jì)高度復(fù)雜的系統(tǒng)很可能會(huì)失敗昂秃。它們很難一蹴而就蚀腿,更多是從簡(jiǎn)單的系統(tǒng)逐漸演變而來磁玉。

最典型的例子便是互聯(lián)網(wǎng)厚柳。如今的互聯(lián)網(wǎng)是一個(gè)高度復(fù)雜的系統(tǒng),而它最早只是被定義為一種在學(xué)術(shù)機(jī)構(gòu)之間共享內(nèi)容的方式预吆∷藿福互聯(lián)網(wǎng)成功實(shí)現(xiàn)了最初的目標(biāo)返吻,并且隨著時(shí)間不斷演化,最終成就了如今的復(fù)雜繁榮纲辽。

參見:

古德哈特定律 (Goodhart's Law)

當(dāng)壓力施于其上以進(jìn)行控制時(shí)怠硼,任何觀測(cè)到的統(tǒng)計(jì)恒性都傾向消散。

查爾斯·古德哈特 (Charles Goodhart)

另見:

當(dāng)一個(gè)措施本身成為目標(biāo)時(shí)星澳,它就不再是一個(gè)好的措施盒至。

瑪麗蓮·斯特拉騰 (Marilyn Strathern)

根據(jù)這一定律,由測(cè)量驅(qū)動(dòng)的優(yōu)化反而可能導(dǎo)致測(cè)量結(jié)果本身的說服力下降沸移。盲目使用一些過度嚴(yán)格篩選的方法 (KPIs) 可能會(huì)產(chǎn)生一些不良的影響痪伦。人們會(huì)傾向于用“鉆空子”的行為去做局部?jī)?yōu)化,從而滿足一些特定的度量標(biāo)準(zhǔn)雹锣,而不會(huì)在意整體的結(jié)果网沾。

現(xiàn)實(shí)中的例子:

  • Assert-free 測(cè)試可以達(dá)到代碼覆蓋率的預(yù)期,但度量的目的應(yīng)該是創(chuàng)造經(jīng)過良好測(cè)試的軟件蕊爵。
  • 由 commits 的行數(shù)來評(píng)價(jià)開發(fā)人員的表現(xiàn)辉哥,從而導(dǎo)致了不合理的代碼庫擴(kuò)增。

參見

漢隆的剃刀 (Hanlon's Razor)

能解釋為愚蠢的在辆,就不要解釋為惡意的证薇。

羅伯特·漢隆 (Robert J. Hanlon)

這一原則表明,一個(gè)行為所產(chǎn)生的消極結(jié)果并不是惡意匆篓。相反浑度,消極結(jié)果更有可能歸咎于這些沒有得到充分理解的行動(dòng)或影響。

侯世達(dá)定律 (Hofstadter's Law)

即使考慮到侯世達(dá)定律鸦概,它也總是比你預(yù)期的要長(zhǎng)箩张。

侯世達(dá) (Douglas Hofstadter)

在估計(jì)需要多長(zhǎng)時(shí)間開發(fā)時(shí)甩骏,你可能會(huì)聽到此定律。軟件開發(fā)似乎有這樣一條定理先慷,即我們往往不能準(zhǔn)確地估計(jì)需要多長(zhǎng)時(shí)間才能完成饮笛。

語出《哥德爾、艾舍爾论熙、巴赫:集異璧之大成》福青。

參見:

哈伯特定律 (Hutber's Law)

改善即惡化无午。

帕特里克·哈伯特 (Patrick Hutber)

這個(gè)定律說明了對(duì)一個(gè)系統(tǒng)的改進(jìn)會(huì)導(dǎo)致其他部分的惡化;或者它會(huì)將其他的惡化隱藏起來祝谚,并導(dǎo)致系統(tǒng)整體狀態(tài)的退化宪迟。

例如,某個(gè)端點(diǎn)的響應(yīng)延遲減少交惯,就可能導(dǎo)致請(qǐng)求流中的吞吐量和容量問題進(jìn)一步增加次泽,并影響到另一個(gè)完全不同的子系統(tǒng)。

技術(shù)成熟度曲線 (The Hype Cycle or Amara's Law)

我們傾向于過高估計(jì)技術(shù)在短期內(nèi)的影響席爽,并低估長(zhǎng)期效應(yīng)意荤。

羅伊·阿馬拉 (Roy Amara)

技術(shù)成熟度曲線是高德納咨詢公司對(duì)技術(shù)最初興起和發(fā)展的視覺展現(xiàn)。一圖頂千言:

image.png

(圖片來源: By Jeremykemp at English Wikipedia, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=10547051)

簡(jiǎn)而言之拳昌,這個(gè)周期表明袭异,新技術(shù)及其潛在影響通常會(huì)引發(fā)一陣?yán)顺薄F(tuán)隊(duì)快速使用這些新技術(shù)炬藤,有時(shí)會(huì)對(duì)結(jié)果感到失望御铃。這可能是因?yàn)樵摷夹g(shù)還不夠成熟,或者現(xiàn)實(shí)應(yīng)用還沒有完全實(shí)現(xiàn)沈矿。經(jīng)過一段時(shí)間后上真,技術(shù)的能力提高了,使用它的實(shí)際機(jī)會(huì)會(huì)增加羹膳,最終團(tuán)隊(duì)也可以提高工作效率睡互。羅伊·阿馬拉簡(jiǎn)潔地總結(jié)了這一點(diǎn):我們傾向于高估技術(shù)短期內(nèi)的影響,并低估長(zhǎng)期效應(yīng)陵像。

隱式接口定律 (Hyrum's Law or The Law of Implicit Interfaces)

當(dāng) API 有足夠多的用戶時(shí)就珠,你在合同中的承諾已不重要:你系統(tǒng)的所有可觀察行為都將被某些人所依賴。

海倫·賴特 (Hyrum Wright)

隱式接口定律表明醒颖,當(dāng)你的 API 有足夠多的用戶時(shí)妻怎,API 的所有行為(包括那些未囊括在公共說明中的一部分)最終都會(huì)被其他人所依賴。 一個(gè)簡(jiǎn)單的例子是 API 的響應(yīng)時(shí)間這種非功能性因素泞歉,還有一個(gè)更微妙的例子是:用戶使用正則表達(dá)式判斷錯(cuò)誤信息的類型時(shí)逼侦,即使 API 的公共說明沒有說明消息的內(nèi)容匿辩,來指示用戶錯(cuò)誤的類型,一些用戶也可能會(huì)使用并更改該消息榛丢,而這實(shí)際上會(huì)破壞 API 的使用铲球。

參見:

柯林漢定律 (Kernighan's Law)

調(diào)試在一開始就比編寫程序困難一倍。因此晰赞,按照定義稼病,如果你的代碼寫得非常巧妙,那么你就沒有足夠的能力來調(diào)試它宾肺。

布萊恩·柯林漢 (Brian Kernighan)

柯林漢定律是以布萊恩·柯林漢 (Brian Kernighan) 的名字命名的溯饵,引述自柯林漢和普勞格 (P.J. Plauger) 的《編程格調(diào)》 (The Elements of Programming Style) 一書中的一句話:

每個(gè)人都知道,調(diào)試在一開始就比編寫程序困難一倍锨用。那么,如果您在編寫它時(shí)盡可能地巧妙隘谣,又如何來調(diào)試它增拥?

盡管這有些夸張,但它提出的論點(diǎn)是寻歧,簡(jiǎn)單的代碼會(huì)比復(fù)雜的代碼更可取掌栅,因?yàn)檎{(diào)試復(fù)雜代碼的過程中出現(xiàn)的任何問題都會(huì)十分棘手,甚至無法解決码泛。

參見:

梅特卡夫定律 (Metcalfe's Law)

在網(wǎng)絡(luò)理論中猾封,系統(tǒng)的價(jià)值約等于系統(tǒng)用戶數(shù)的平方。

這個(gè)定律基于一個(gè)系統(tǒng)中可能的連接對(duì)數(shù)量噪珊,并且與里德定律 (Reed's Law) 十分相近晌缘。奧德利茲科 (Odlyzko) 和其他人認(rèn)為,里德定律和梅特卡夫定律夸大了系統(tǒng)本身的價(jià)值痢站,因?yàn)樗鼈儧]有考慮到網(wǎng)絡(luò)效應(yīng)中人類認(rèn)知的限制磷箕。

參見:

摩爾定律 (Moore's Law)

集成電路中的晶體管數(shù)量大約每?jī)赡攴环?/p>

這條定律通常用于說明半導(dǎo)體和芯片技術(shù)提高的絕對(duì)速度。從 20 世紀(jì) 70 年代到 21 世紀(jì)前十年阵难,摩爾的預(yù)測(cè)被證明是高度準(zhǔn)確的岳枷。 近年來,這種趨勢(shì)略有變化呜叫,部分原因受到量子隧穿效應(yīng)影響空繁。然而,并行化計(jì)算的進(jìn)步以及半導(dǎo)體技術(shù)和量子計(jì)算潛在的革命性變化朱庆,可能意味著摩爾定律在未來幾十年內(nèi)繼續(xù)保持正確盛泡。

墨菲定律 (Murphy's Law / Sod's Law)

凡是可能出錯(cuò)的事就一定會(huì)出錯(cuò)。

出自 愛德華·A·墨菲 椎工, 墨菲定律 說明了如果一件事有可能出錯(cuò)饭于,那么就一定會(huì)出錯(cuò)蜀踏。

這是一句開發(fā)人員間的俗語,在開發(fā)掰吕、測(cè)試甚至在生產(chǎn)中都有可能會(huì)發(fā)生一些令人意想不到的事情果覆。而這一定律也可以參考在英式英語中更為常見的 索德定理

如果某件事可能出錯(cuò),那么它一定會(huì)在最糟糕的時(shí)候發(fā)生殖熟。

這些定律常常用于幽默嘲弄局待。但是,類似于 Confirmation BiasSelection Bias 的現(xiàn)象很容易導(dǎo)致人們過分強(qiáng)調(diào)這些定律(即在大部分情況下菱属,一件事的成功會(huì)顯得司空見慣钳榨;而失敗才會(huì)引起更多的注意和討論)。

參見:

奧卡姆剃刀 (Occam's Razor)

如無必要纽门,勿增實(shí)體薛耻。

奧卡姆的威廉 (William of Ockham)

奧卡姆剃刀指出,在幾種可能的解決方案之中赏陵,最有可能的解決方案便是概念和假設(shè)最少的那個(gè)饼齿。因?yàn)檫@個(gè)解決方案最為簡(jiǎn)單,只解決了問題蝙搔,并且沒有引入額外的復(fù)雜度和可能的負(fù)面后果缕溉。

參見:

例子:

帕金森定理 (Parkinson's Law)

在工作能夠完成的時(shí)限內(nèi),工作量會(huì)一直增加吃型,直到所有可用時(shí)間都被填滿為止证鸥。

基于官僚機(jī)構(gòu)的研究背景,該定律被應(yīng)用于軟件開發(fā)中勤晚。該理論認(rèn)為枉层,團(tuán)隊(duì)在截止日期之前效率低下,然后在截止日期前趕緊完成工作,從而使實(shí)際截止日期變得隨意。

將這個(gè)定理與侯世達(dá)定律相結(jié)合壮不,則會(huì)獲得更加悲觀的觀點(diǎn):為了在規(guī)定時(shí)間內(nèi)完成工作,工作將增多矩欠,花費(fèi)比預(yù)期更長(zhǎng)的時(shí)間。

參見:

過早優(yōu)化效應(yīng) (Premature Optimization Effect)

過早優(yōu)化是萬惡之源悠夯。

高德納 (唐納德克努特的中文名)

在高德納的《goto 語句的結(jié)構(gòu)化編程》論文中癌淮,他寫到:“程序員們浪費(fèi)了大量的時(shí)間去思考或者擔(dān)心他們的程序中的非關(guān)鍵部分的速度。而在考慮調(diào)試和維護(hù)的時(shí)候沦补,這些所謂提高效率的做法實(shí)際上十分不妥乳蓄。我們應(yīng)該放棄小的效率點(diǎn),并且要在 97% 的時(shí)間提醒自己夕膀,過早優(yōu)化是萬惡之源虚倒。而且連那關(guān)鍵的 3% 也不能夠放過美侦。”

然而魂奥,過早優(yōu)化 (簡(jiǎn)而言之)可以定義為在我們知道需要做什么之前進(jìn)行優(yōu)化菠剩。

普特定律 (Putt's Law)

技術(shù)由兩類人主導(dǎo),一類是純粹的管理人員耻煤, 一類是純粹的技術(shù)人員具壮。

普特定律常常遵循普特推論:

每一個(gè)技術(shù)層次,假以時(shí)日哈蝇,能力將逆轉(zhuǎn)棺妓。

這些結(jié)論表明,由于各種選擇標(biāo)準(zhǔn)和群體組織的趨勢(shì)炮赦,技術(shù)組織的工作層面將有一些技術(shù)人員怜跑,以及一些不了解復(fù)雜性和挑戰(zhàn)的管理人員。這種現(xiàn)象可能是由于 彼得原理 (The Peter Principle)呆伯特法則 (The Dilbert Principle) 造成的吠勘。

但是妆艘,應(yīng)該強(qiáng)調(diào)的是,諸如此類的定律是一種廣泛的概括看幼,可能適用于某些類型的組織,而不適用于其他組織幌陕。

參見:

里德定律 (Reed's Law)

大型網(wǎng)絡(luò)诵姜,尤其是社交網(wǎng)絡(luò)的效用會(huì)隨著網(wǎng)絡(luò)的大小呈指數(shù)級(jí)擴(kuò)增。

這一定律基于圖論搏熄,圖論中的效用與可能的子組數(shù)量呈正比棚唆,并且該增長(zhǎng)速度會(huì)比參與者的數(shù)量和可能的連接對(duì)數(shù)量要快。奧德利茲科 (Odlyzko) 和其他人認(rèn)為心例,里德定律夸大了系統(tǒng)本身的價(jià)值宵凌,因?yàn)樗鼈儧]有考慮到網(wǎng)絡(luò)效應(yīng)中人類認(rèn)知的限制。

參見:

復(fù)雜性守恒定律 (The Law of Conservation of Complexity or Tesler's Law)

該定律表明系統(tǒng)中存在著一定程度的復(fù)雜性止后,并且不能減少瞎惫。

系統(tǒng)中的某些復(fù)雜性是無意的。這是由于結(jié)構(gòu)不良译株,錯(cuò)誤或者糟糕的建模造成的瓜喇。這種無意的復(fù)雜性可以減少或者消除。然而歉糜,由于待解決問題固有的復(fù)雜性乘寒,某些復(fù)雜性是內(nèi)在的。這種復(fù)雜性可以轉(zhuǎn)移匪补,但不能消除伞辛。

該定律有趣的一點(diǎn)是烂翰,即使簡(jiǎn)化整個(gè)系統(tǒng),內(nèi)在的復(fù)雜性也不會(huì)降低蚤氏。它會(huì)轉(zhuǎn)移到用戶甘耿,并且用戶必須以更復(fù)雜的方式行事。

抽象泄漏定律 (The Law of Leaky Abstractions)

在某種程度上瞧捌,所有非平凡的抽象都是有泄漏的棵里。

喬爾斯·波爾斯基 (Joel Spolsky)

該定律指出,通常用于簡(jiǎn)化復(fù)雜系統(tǒng)的抽象姐呐,在某些情況下將底層系統(tǒng)泄漏出來殿怜,使得抽象表現(xiàn)出意外的行為。

例如加載文件并讀取其內(nèi)容曙砂。文件系統(tǒng) API 是較低級(jí)別內(nèi)核系統(tǒng)的抽象头谜,它們本身是與磁盤(或 SSD 的閃存)上的數(shù)據(jù)更改相關(guān)的物理過程的抽象。在大多數(shù)情況下鸠澈,處理文件(如二進(jìn)制數(shù)據(jù)流)的抽象將起作用柱告。但是,對(duì)于磁盤驅(qū)動(dòng)器笑陈,順序讀取數(shù)據(jù)將比隨機(jī)訪問快得多(由于頁面錯(cuò)誤的開銷增加)际度。但對(duì)于 SSD 驅(qū)動(dòng)器,此開銷不會(huì)出現(xiàn)涵妥。需要理解基礎(chǔ)細(xì)節(jié)來處理這種情況(例如乖菱,數(shù)據(jù)庫索引文件的良好結(jié)構(gòu)可以減少隨機(jī)訪問的開銷),開發(fā)人員需要合理的抽象蓬网,來處理不同的細(xì)節(jié)窒所。

當(dāng)引入更多的抽象時(shí),上面的例子會(huì)變得更復(fù)雜帆锋。Linux 操作系統(tǒng)允許通過網(wǎng)絡(luò)訪問文件吵取,但在本地表示為普通文件。如果存在網(wǎng)絡(luò)故障锯厢,這種抽象將會(huì)泄漏皮官。如果開發(fā)人員將這些文件視為普通文件,而不考慮它們可能會(huì)受到網(wǎng)絡(luò)延遲和故障的影響哲鸳,那么解決方案就會(huì)出錯(cuò)臣疑。

描述該定律的文章表明,過度依賴抽象徙菠,加上對(duì)底層過程的理解不足讯沈,實(shí)際上使得問題在某些情況下更加復(fù)雜。

參見:

真實(shí)的例子:

  • Photoshop 啟動(dòng)緩慢:我過去遇到過一個(gè)問題,就是 Photoshop 啟動(dòng)緩慢缺狠,有時(shí)需要幾分鐘问慎。問題好像是 Photoshop 啟動(dòng)時(shí),會(huì)讀取當(dāng)前默認(rèn)打印機(jī)的一些信息挤茄。但是如叼,如果該打印機(jī)實(shí)際上是一臺(tái)網(wǎng)絡(luò)打印機(jī),則可能需要很長(zhǎng)的時(shí)間穷劈。將網(wǎng)絡(luò)打印機(jī)與本地打印機(jī)當(dāng)作同樣的抽象笼恰,導(dǎo)致連接不良的情況下出現(xiàn)問題。

帕金森瑣碎定理 (The Law of Triviality)

該定理顯示歇终,群體將給予更多的時(shí)間和注意力來處理瑣碎的問題社证,而不是用來處理嚴(yán)肅而實(shí)質(zhì)性的問題。

常見的虛構(gòu)例子是委員會(huì)批準(zhǔn)核電站的計(jì)劃评凝,他們大部分時(shí)間都在討論自行車棚的結(jié)構(gòu)追葡,而不是電廠本身等更為重要的設(shè)計(jì)。如果沒有大量的專業(yè)知識(shí)或者準(zhǔn)備奕短,很難給非常大的復(fù)雜主題討論提供寶貴的意見宜肉。但是,人們希望看到更多意見翎碑。因此谬返,他們傾向于將大量時(shí)間集中在很容易推敲,但不一定被看重的小細(xì)節(jié)上日杈。

由上面的虛構(gòu)例子產(chǎn)生了 Bike Shedding 的說法朱浴,以形容在瑣碎細(xì)節(jié)上浪費(fèi)時(shí)間這一行為。

Unix 哲學(xué) (The Unix Philosophy)

Unix 哲學(xué)指軟件組件應(yīng)該很小达椰,并專注于做一件特定的事情。將小而簡(jiǎn)單以及定義良好的單元組合在一起项乒,而不是使用大而復(fù)雜的多用途程序啰劲,可以更輕松地構(gòu)建系統(tǒng)。

微服務(wù)架構(gòu)這種現(xiàn)代實(shí)踐可以認(rèn)為是這種哲學(xué)的應(yīng)用檀何,其中服務(wù)很小蝇裤,集中于做一件特定的事情,由簡(jiǎn)單的構(gòu)建塊組成復(fù)雜的行為频鉴。

Spotify 模型 (The Spotify Model)

Spotify 模型是團(tuán)隊(duì)和組織結(jié)構(gòu)的一種方法栓辜,已被 Spotify 實(shí)驗(yàn)室推廣開來。在此模型中垛孔,團(tuán)隊(duì)圍繞功能而非技術(shù)進(jìn)行組織藕甩。

Spotify 模型還普及了部落、行會(huì)以及章節(jié)的概念周荐,這些是組織結(jié)構(gòu)的其他組成部分狭莱。

沃德勒定律 (Wadler's Law)

任何語言設(shè)計(jì)中僵娃,討論下面列表中某個(gè)要素所花費(fèi)的總時(shí)間與其位置成正比。

  1. 語義 (Semantics)
  2. 語法 (Syntax)
  3. 詞法 (Lexical syntax)
  4. 注釋語法 (Lexical syntax of comments)

(簡(jiǎn)而言之腋妙,在語義上花費(fèi)一個(gè)小時(shí)默怨,就要在注釋語法上花費(fèi)八個(gè)小時(shí))。

帕金森瑣碎定理 類似, 沃德勒定律指出骤素,在設(shè)計(jì)語言時(shí)匙睹,與這些特征的重要性相比,花在語言結(jié)構(gòu)上的時(shí)間過多济竹。

參見:

惠頓定律 (Wheaton's Law)

不要像個(gè)傻子一樣痕檬。

威爾·惠頓 (Wil Wheaton)

這條定律由威爾 · 惠頓(曾出演過星際迷航:下一代、生活大爆炸)創(chuàng)造规辱,這個(gè)簡(jiǎn)潔而有力的定律旨在專業(yè)組織內(nèi)營(yíng)造和諧和尊重的環(huán)境谆棺。它可以在與同事交談、代碼審查罕袋、反駁觀點(diǎn)和批評(píng)的時(shí)候派上用場(chǎng)改淑。而且通常情況下,人們之間的專業(yè)交互也同樣適用浴讯。

原則

原則通常是與設(shè)計(jì)相關(guān)的準(zhǔn)則朵夏。

呆伯特法則 (The Dilbert Principle)

公司會(huì)傾向于系統(tǒng)地將工作能力差的員工提升到管理層,以使他們脫離工作流程榆纽。

史考特·亞當(dāng)斯 (Scott Adams)

呆伯特原則是由史考特·亞當(dāng)斯 (Dilbert 漫畫連環(huán)畫的創(chuàng)建者) 開發(fā)的一個(gè)管理概念仰猖,靈感來源于彼得原理。根據(jù)呆伯特原則奈籽,工作能力差的員工會(huì)被提升到管理層饥侵,從而限制他們所能造成的損害。亞當(dāng)斯首先在 1995 年《華爾街日?qǐng)?bào)》的一篇文章中解釋了這一原則衣屏,隨后在他 1996 年的商業(yè)書籍《呆伯特原則》中進(jìn)行了擴(kuò)展躏升。

參見:

帕累托法則 (The Pareto Principle or The 80/20 Rule)

生活中大多數(shù)事情不是均勻分布的。

帕累托法則可以幫你認(rèn)識(shí)到大多數(shù)結(jié)果來自少數(shù)投入:

  • 某個(gè)軟件的 80% 代碼只占了總分配時(shí)間的 20%(相反狼忱,最難的 20% 代碼部分占用了 80% 的時(shí)間)
  • 20% 的努力產(chǎn)生了 80% 的結(jié)果
  • 20% 的工作創(chuàng)造了 80% 的收入
  • 20% 的錯(cuò)誤導(dǎo)致了 80% 的崩潰
  • 20% 的功能導(dǎo)致了 80% 的使用量

在 20 世紀(jì) 40 年代膨疏,公認(rèn)為質(zhì)量控制之父的美國(guó)羅馬尼亞工程師約瑟夫·朱蘭博士,開始將帕累托法則應(yīng)用于質(zhì)量問題钻弄。

這個(gè)原則也被稱為二八法則佃却,重要的少數(shù)法則因素稀疏原則

現(xiàn)實(shí)的例子:

  • 微軟 2002 年的報(bào)告表明窘俺,修復(fù)最常出現(xiàn)的 20% 錯(cuò)誤饲帅,將消除 Windows 和 Office 中 80% 的
    錯(cuò)誤和崩潰。報(bào)告地址

彼得原理 (The Peter Principle)

在等級(jí)制度中,人往往會(huì)被提升到他們的“無法勝任的水平”洒闸。

勞倫斯·彼得 (Laurence J. Peter)

這是由勞倫斯·彼得提出的一個(gè)管理概念染坯。彼得原理認(rèn)為,擅長(zhǎng)工作的人會(huì)得到提升丘逸,直到他們達(dá)到不再成功的水平 (即他們所“無法勝任的水平”)单鹿。基于此深纲,由于他們資歷更高仲锄,被公司開除的可能性較小 (除非他們表現(xiàn)非常糟糕)。而且他們將繼續(xù)擔(dān)任幾乎沒有本職技能的職位湃鹊,即使那些原本讓他們成功的能力在新工作中并無必要儒喊。

有的工程師對(duì)此特別感興趣,它們最初從事的是深度的技術(shù)工作币呵,但走上了管理其他工程師的職業(yè)道路——這意味著需要一個(gè)完全不同的技能樹怀愧。

參見:

魯棒性原則 (The Robustness Principle or Postel's Law)

在自己所做的事情上要保守, 在接受別人的事情上要自由。

通常應(yīng)用于服務(wù)器應(yīng)用程序開發(fā)中余赢,該原則指出芯义,你發(fā)送給其他人的內(nèi)容應(yīng)盡可能最小且符合要求,并且處理不符合要求的輸入妻柒。

該原則的目標(biāo)是構(gòu)建穩(wěn)健的系統(tǒng)扛拨。如果可以理解意圖,它們可以處理不良的輸入举塔。但是绑警,接受錯(cuò)誤格式的輸入可能存在安全隱患,特別是此類的輸入未經(jīng)過充分測(cè)試央渣。

SOLID

這是一個(gè)縮寫计盒,指的是:

這些是 Object-Oriented Programming 的關(guān)鍵原則。諸如此類的設(shè)計(jì)原則能夠幫助開發(fā)人員構(gòu)建更易于維護(hù)的系統(tǒng)芽丹。

單一功能原則 (The Single Responsibility Principle)

每個(gè)模塊或者類只應(yīng)該有一項(xiàng)功能章郁。

SOLID 的第一個(gè)原則。這個(gè)原則表明模塊或者類只應(yīng)該做一件事志衍。實(shí)際上,這意味著對(duì)程序功能的單個(gè)小更改聊替,應(yīng)該只需要更改一個(gè)組件楼肪。例如,更改密碼驗(yàn)證復(fù)雜性的方式應(yīng)該只需要更改程序的一部分惹悄。

理論上講春叫,這使代碼更健壯,更容易更改。知道正在更改的組件只有一個(gè)功能暂殖,這意味著測(cè)試更改更容易价匠。使用前面的例子,更改密碼復(fù)雜性組件應(yīng)該只影響與密碼復(fù)雜性相關(guān)的功能呛每。變更具有許多功能的組件可能要困難得多踩窖。

參見:

開閉原則 (The Open/Closed Principle)

實(shí)體應(yīng)開放擴(kuò)展并關(guān)閉修改。

SOLID 的第二個(gè)原則晨横。這個(gè)原則指出實(shí)體(可以是類洋腮、模塊、函數(shù)等)應(yīng)該能夠使它們的行為易于擴(kuò)展手形,但是它們的擴(kuò)展行為不應(yīng)該被修改啥供。

舉一個(gè)假設(shè)的例子,想象一個(gè)能夠?qū)?Markdown 轉(zhuǎn)換為 HTML 的模塊库糠。如果可以擴(kuò)展模塊伙狐,而不修改內(nèi)部模塊來處理新的 markdown 特征,而無需修改內(nèi)部模塊瞬欧,則可以認(rèn)為是開放擴(kuò)展贷屎。如果用戶不能修改處理現(xiàn)有 Markdown 特征的模塊,那么它被認(rèn)為是關(guān)閉修改黍判。

這個(gè)原則與面向?qū)ο缶幊叹o密相關(guān)豫尽,讓我們可以設(shè)計(jì)對(duì)象以便于擴(kuò)展,但是可以避免以意想不到的方式改變其現(xiàn)有對(duì)象的行為顷帖。

參見:

里氏替換原則 (The Liskov Substitution Principle)

可以在不破壞系統(tǒng)的情況下美旧,用子類型替換類型。

SOLID 的第三個(gè)原則贬墩。該原則指出榴嗅,如果組件依賴于類型,那么它應(yīng)該能夠使用該類型的子類型陶舞,而不會(huì)導(dǎo)致系統(tǒng)失敗或者必須知道該子類型的詳細(xì)信息嗽测。

舉個(gè)例子,假設(shè)我們有一個(gè)方法肿孵,讀取 XML 文檔唠粥。如果該方法使用基類型 file,則從 file 派生的任何內(nèi)容停做,都能用在該方法中晤愧。 如果 file 支持反向查找,并且 xml 解析器使用該函數(shù)蛉腌,但是派生類型 network file 嘗試反向查找時(shí)失敗官份,則 network file 將違反該原則只厘。

該原則與面向?qū)ο缶幊叹o密相關(guān),必須仔細(xì)建模舅巷、層次結(jié)構(gòu)羔味,以避免讓系統(tǒng)用戶混淆。

參見:

接口隔離原則 (The Interface Segregation Principle)

不應(yīng)強(qiáng)制任何客戶端依賴于它不使用的方法钠右。

SOLID 的第四個(gè)原則赋元。該原則指出組件的消費(fèi)者不應(yīng)該依賴于它實(shí)際上不使用的組件函數(shù)。

舉一個(gè)例子爬舰,假設(shè)我們有一個(gè)方法们陆,讀取 XML 文檔。它只需要讀取文件中的字節(jié)情屹,向前移動(dòng)或向后移動(dòng)坪仇。如果由于一個(gè)與文件結(jié)構(gòu)不相關(guān)的功能發(fā)生更改(例如更新文件安全性的權(quán)限模型),需要更新此方法垃你,則該原則已失效椅文。文件最好實(shí)現(xiàn) 可查詢流 接口,并讓 XML 讀取器使用該接口惜颇。

該原則與面向?qū)ο缶幊叹o密相關(guān)皆刺,其中接口,層次結(jié)構(gòu)和抽象類型用于不同組件的 minimise the coupling凌摄。 Duck typing 是一種通過消除顯式接口來強(qiáng)制執(zhí)行該原則的方法羡蛾。

參見:

依賴反轉(zhuǎn)原則 (The Dependency Inversion Principle)

高級(jí)模塊不應(yīng)該依賴于低級(jí)實(shí)現(xiàn)。

SOLID 的第五個(gè)原則锨亏。該原則指出痴怨,更高級(jí)別的協(xié)調(diào)組件不應(yīng)該知道其依賴項(xiàng)的詳細(xì)信息。

舉個(gè)例子器予,假設(shè)我們有一個(gè)從網(wǎng)站讀取元數(shù)據(jù)的程序浪藻。我們假設(shè)主要組件必須知道下載網(wǎng)頁內(nèi)容的組件,以及可以讀取元數(shù)據(jù)的組件乾翔。如果我們考慮依賴反轉(zhuǎn)爱葵,主要組件將僅依賴于可以獲取字節(jié)數(shù)據(jù)的抽象組件,然后是一個(gè)能夠從字節(jié)流中讀取元數(shù)據(jù)的抽象組件反浓,主要組件不需要了解 TCP萌丈、IP、HTTP雷则、HTML 等辆雾。

這個(gè)原則很復(fù)雜,因?yàn)樗坪蹩梢苑崔D(zhuǎn)系統(tǒng)的預(yù)期依賴性(因此得名)巧婶。實(shí)踐中乾颁,這也意味著,單獨(dú)的編排組件必須確保抽象類型的正確實(shí)現(xiàn)被使用(例如在前面的例子中艺栈,必須提供元數(shù)據(jù)讀取器組件英岭、HTTP 文件下載功能和 HTML 元標(biāo)簽讀取器)。然后湿右,這涉及諸如 Inversion of ControlDependency Injection 之類的模式诅妹。

參見:

不要重復(fù)你自己原則 (The DRY Principle)

系統(tǒng)中,每一塊知識(shí)都必須是單一毅人、明確而權(quán)威的吭狡。

DRY 是 Do not Repeat Yourself 的縮寫。這個(gè)原則旨在幫助開發(fā)人員減少代碼的重復(fù)性丈莺,并將公共代碼保存在一個(gè)地方划煮。最初由安德魯·亨特和戴夫·托馬斯在 1999 年出版的《程序員修煉之道》中引用。

與 DRY 相反的是 WET(功能實(shí)現(xiàn)兩次或者喜歡打字 Write Everything Twice or We Enjoy Typing)缔俄。

實(shí)際上弛秋,如果你在兩個(gè)或更多的地方有相同的功能,你可以使用 DRY 原則將它們合并為一個(gè)俐载,并在任何你需要的地方重復(fù)使用蟹略。

參見:

KISS 原則 (The KISS Principle)

保持簡(jiǎn)單和直白。

KISS 原則指明了如果大多數(shù)的系統(tǒng)能夠保持簡(jiǎn)單而非復(fù)雜化遏佣,那么他們便能夠工作在最佳狀態(tài)挖炬。因此,簡(jiǎn)單性應(yīng)該是設(shè)計(jì)時(shí)的關(guān)鍵指標(biāo)状婶,同時(shí)也要避免不必要的復(fù)雜度意敛。這個(gè)短語最初出自 1960 年的美國(guó)海軍飛機(jī)工程師凱利 · 約翰遜 (Kelly Johnson)。

這一原則的最好例證便是約翰遜給設(shè)計(jì)工程師一些實(shí)用工具的故事太抓。那時(shí)的他們正面臨著一個(gè)挑戰(zhàn)空闲,即他們參與設(shè)計(jì)的噴氣式飛機(jī)必須能夠讓普通的機(jī)械師在戰(zhàn)場(chǎng)上僅僅用這些工具進(jìn)行維修,因此走敌,“直白”這個(gè)詞應(yīng)指的是損壞的事物本身和修復(fù)用工具的復(fù)雜度兩者之間的關(guān)系碴倾,而非工程師們自身的能力水平。

參見:

你不需要它原則 (YAGNI)

這是 You Aren't Gonna Need It 的縮寫掉丽。

只有當(dāng)你需要某些東西的時(shí)候跌榔,才去實(shí)現(xiàn)它們,而不是在你預(yù)見的時(shí)候捶障。

Ron Jeffries 是極限編程的創(chuàng)始人之一以及書籍《Extreme Programming Installed》的作者僧须。

極限編程原則告誡開發(fā)人員,他們應(yīng)該只實(shí)現(xiàn)當(dāng)前所需的功能项炼,并避免實(shí)現(xiàn)未來需要的功能担平,僅在必要時(shí)才實(shí)現(xiàn)示绊。

遵守這一原則可以減小代碼庫大小,同時(shí)避免時(shí)間和生產(chǎn)力浪費(fèi)在沒有價(jià)值的功能上暂论。

參見:

分布式計(jì)算的謬論 (The Fallacies of Distributed Computing)

英文維基百科

又稱 網(wǎng)絡(luò)計(jì)算的謬誤面褐,這是一系列關(guān)于分布式計(jì)算的猜想(或者看法),這些猜想可能會(huì)引起軟件開發(fā)中的失敗取胎。這些假設(shè)是:

  • 網(wǎng)絡(luò)可靠
  • 延遲為零
  • 帶寬無限
  • 網(wǎng)絡(luò)安全
  • 拓?fù)浜愣?/li>
  • 單一管理員
  • 運(yùn)輸成本為零
  • 網(wǎng)絡(luò)為同構(gòu)的

前 4 各項(xiàng)目由 Bill JoyTom Lyon 于 1991 左右提出展哭。并被 James Gosling 首次歸類于“網(wǎng)絡(luò)計(jì)算的謬誤”;后 L. Peter Deutsch 添加了第 5闻蛀、6匪傍、7 個(gè)謬誤;90 年代末觉痛,Gosling 添加了最后一個(gè)謬誤役衡。

這些內(nèi)容受到了 太陽微系統(tǒng) (Sun Microsystems) 內(nèi)部當(dāng)時(shí)所發(fā)生的事情的啟發(fā)。

在設(shè)計(jì)彈性代碼的時(shí)候秧饮,應(yīng)該仔細(xì)考慮這些謬誤映挂,并假設(shè)其中任何一個(gè)謬誤都可能引起處理分布式系統(tǒng)的復(fù)雜性和現(xiàn)實(shí)性時(shí)的邏輯缺陷。

參見:

閱讀清單

如果你覺得這些概念很有趣柑船,你可能會(huì)喜歡以下書籍。

TODO

嗨翎迁!如果你讀到這里,點(diǎn)擊了一個(gè)我尚未編寫的主題鏈接净薛,我感到很抱歉汪榔。這是正在進(jìn)行中的工作!

隨意給 hacker-lawshacker-laws-zhIssue 或者 Pull Request肃拜。

參考資料

https://github.com/nusr/hacker-laws-zh
https://github.com/dwmkerr/hacker-laws


Kotlin開發(fā)者社區(qū)

專注分享 Java痴腌、 Kotlin雌团、Spring/Spring Boot、MySQL士聪、redis辱姨、neo4j、NoSQL戚嗅、Android、JavaScript枢舶、React懦胞、Node、函數(shù)式編程凉泄、編程思想躏尉、"高可用,高性能后众,高實(shí)時(shí)"大型分布式系統(tǒng)架構(gòu)設(shè)計(jì)主題胀糜。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蒂誉,隨后出現(xiàn)的幾起案子教藻,更是在濱河造成了極大的恐慌,老刑警劉巖右锨,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件括堤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡绍移,警方通過查閱死者的電腦和手機(jī)悄窃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蹂窖,“玉大人轧抗,你說我怎么就攤上這事∷膊猓” “怎么了横媚?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)涣楷。 經(jīng)常有香客問我分唾,道長(zhǎng),這世上最難降的妖魔是什么狮斗? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任绽乔,我火速辦了婚禮,結(jié)果婚禮上碳褒,老公的妹妹穿的比我還像新娘折砸。我一直安慰自己看疗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布睦授。 她就那樣靜靜地躺著两芳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪去枷。 梳的紋絲不亂的頭發(fā)上怖辆,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音删顶,去河邊找鬼竖螃。 笑死,一個(gè)胖子當(dāng)著我的面吹牛逗余,可吹牛的內(nèi)容都是我干的特咆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼录粱,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼腻格!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起啥繁,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤菜职,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后旗闽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體些楣,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年宪睹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了愁茁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡亭病,死狀恐怖鹅很,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情罪帖,我是刑警寧澤促煮,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站整袁,受9級(jí)特大地震影響菠齿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜坐昙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一绳匀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦疾棵、人聲如沸戈钢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽右核。三九已至役电,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瞧柔,已是汗流浹背扳埂。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工容为, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恩溅,地道東北人痕囱。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像暴匠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子傻粘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360