關(guān)于一瞬
發(fā)布者:APP開發(fā)時(shí)間:2021-01-23來源:APP開發(fā)
1
剔除無(wú)效狀態(tài)
我把這一點(diǎn)排第一,是因?yàn)槲艺J(rèn)為它是最重要、最強(qiáng)大的原則之一。
你可能在定義類型時(shí)聽到過這個(gè)詞,但其實(shí)這個(gè)原則適用于所有與表示數(shù)據(jù)相關(guān)的地方——例如數(shù)據(jù)庫(kù)設(shè)計(jì)。
它不僅可以減少系統(tǒng)的狀態(tài)數(shù)量(從而變得更簡(jiǎn)單),還能減少無(wú)效狀態(tài)的數(shù)量!你的系統(tǒng)不需要處理這些無(wú)效狀態(tài),因?yàn)樗鼈冊(cè)谀愕某绦蛑袑?shí)際上是不可表示的。
這不只是一個(gè)小技巧,它可以極大簡(jiǎn)化你的系統(tǒng),并防止出現(xiàn)各種類型的 bug。這有一些例子。
2
數(shù)據(jù)一致性讓系統(tǒng)更簡(jiǎn)單
對(duì)數(shù)據(jù)施加一致性規(guī)則,減少了系統(tǒng)需要處理的狀態(tài)數(shù)量。這是從上一個(gè)原則派生而來的。
定義
這里說的是一致性的普遍含義:即數(shù)據(jù)遵循某些規(guī)則,并且在任意時(shí)刻都始終遵循這些規(guī)則。這一定義與 ACID 有關(guān),但不要與 CAP 混淆起來了。
規(guī)則可以是任何東西,例如,你的信用永遠(yuǎn)不能變成負(fù)數(shù),或者私密的帖子不應(yīng)該被其他人看到。它不僅限于外鍵或惟一索引,盡管它們也是有效的規(guī)則。
和數(shù)據(jù)庫(kù)一樣,應(yīng)用程序也可以通過使用 ACID 事務(wù)來加強(qiáng)一致性。如果能在數(shù)據(jù)庫(kù)級(jí)別強(qiáng)制保持一致性是最好的,但在實(shí)際中,對(duì)稍微復(fù)雜一點(diǎn)的東西來說,這樣做并不常見。
實(shí)用建議
任何限制或損害一致性的行為都會(huì)導(dǎo)致復(fù)雜性。這就引出了以下這些實(shí)用的建議:
讓系統(tǒng)更簡(jiǎn)單:
更少的數(shù)據(jù)庫(kù) (理想情況下是一個(gè))
規(guī)范化,減少冗余數(shù)據(jù)
一個(gè)“好的”數(shù)據(jù)庫(kù)設(shè)計(jì)
ACID 事務(wù)
更多的數(shù)據(jù)約束
讓系統(tǒng)更復(fù)雜:
多個(gè)數(shù)據(jù)庫(kù)
冗余或非正規(guī)化數(shù)據(jù)
糟糕的數(shù)據(jù)庫(kù)設(shè)計(jì)
較少(或沒有)數(shù)據(jù)約束
當(dāng)然,有時(shí)候讓系統(tǒng)變復(fù)雜也是有正當(dāng)理由的,我并不想讓復(fù)雜性變成一個(gè)“骯臟的”詞。請(qǐng)參閱后面的一個(gè)原則“殺雞不要用牛刀”。
我認(rèn)為這個(gè)原則是當(dāng)今軟件工程中最被低估的原則之一。一致性問題經(jīng)常被忽視。很多問題,我敢說大多數(shù)問題,基本上都是一致性問題——數(shù)據(jù)不符合某些期望。
參見附錄,了解不一致性是如何導(dǎo)致復(fù)雜性的。
3
數(shù)據(jù)設(shè)計(jì)先行
這個(gè)問題,“代碼還是數(shù)據(jù)?”,哪一個(gè)在 10 年后更有可能繼續(xù)存在。
代碼可以被丟掉重寫,但數(shù)據(jù)很少會(huì)這樣。
數(shù)據(jù)比代碼更重要。代碼的唯一目的是轉(zhuǎn)換數(shù)據(jù)。
在設(shè)計(jì)新系統(tǒng)時(shí),最好先從數(shù)據(jù)庫(kù)和數(shù)據(jù)結(jié)構(gòu)開始,并在此基礎(chǔ)上開發(fā)代碼。要考慮可以在數(shù)據(jù)上施加的約束并實(shí)施它們,理想情況下是通過表示數(shù)據(jù)的方式進(jìn)行的。
代碼設(shè)計(jì)是數(shù)據(jù)設(shè)計(jì)的下一步。數(shù)據(jù)模型越簡(jiǎn)單、越一致,代碼就會(huì)越簡(jiǎn)單。
你們把流程圖給我看,但把表藏起來,我就一頭霧水。你們把表給我看,通常我就不需要你們的流程圖,它們會(huì)不言自明?!?Fred Brooks
糟糕的程序員關(guān)心代碼。好的程序員關(guān)心數(shù)據(jù)結(jié)構(gòu)和它們之間的關(guān)系?!?Linux 之父 Linus Torvalds
4
殺雞不要用牛刀
這是軟件開發(fā)人員最常犯的錯(cuò)誤。
這個(gè)原則是說,當(dāng)你在做需要付出復(fù)雜性代價(jià)的權(quán)衡時(shí),要確保權(quán)衡的必要性得到經(jīng)驗(yàn)證據(jù)的支持。
常見錯(cuò)誤:
試圖構(gòu)建一個(gè)復(fù)雜的“可伸縮”系統(tǒng),可以伸縮到你可能永遠(yuǎn)都不需要的規(guī)模。
在不考慮需求或成本的情況下,讓服務(wù)盡可能地小。
在非性能瓶頸的地方優(yōu)化性能,增加不一致性或復(fù)雜性。
建議:
盡可能從最簡(jiǎn)單、最正確的系統(tǒng)開始
對(duì)性能進(jìn)行度量
如果不能解決實(shí)際問題,就不要付出復(fù)雜性代價(jià)或違反其他原則。
有些優(yōu)化可以不進(jìn)行度量,因?yàn)樗鼈兊某杀痉浅5突驗(yàn)榱?。例如,為了保證你想要執(zhí)行的操作具有你想要的性能,使用正確的數(shù)據(jù)結(jié)構(gòu)。
的確,有時(shí)候經(jīng)驗(yàn)本身就能告訴你是否做出了正確的權(quán)衡。但如果你能證明,那就更好了。
當(dāng)你必須做出選擇時(shí),請(qǐng)選擇正確性和簡(jiǎn)單性,而不是性能。
在某些情況下,正確而簡(jiǎn)單的代碼是性能最好的代碼!
真正的問題是程序員在錯(cuò)誤的地方和錯(cuò)誤的時(shí)間花了太多的時(shí)間在擔(dān)心效率上。過早優(yōu)化是編程中所有(或者至少是大部分)罪惡的根源?!?jì)算機(jī)科學(xué)家 Donald Knuth
5
避免為了局部簡(jiǎn)單性而增加全局復(fù)雜性
也就是避免為了讓系統(tǒng)的一部分變得更簡(jiǎn)單,而導(dǎo)致整個(gè)系統(tǒng)變得更復(fù)雜。
這種交換通常是不平等的。追求局部的簡(jiǎn)單性會(huì)導(dǎo)致全局復(fù)雜性的增加,而且是數(shù)量級(jí)的。
例如,使用較小的服務(wù)可以讓這些服務(wù)變得更簡(jiǎn)單,但一致性的降低和對(duì)更多進(jìn)程間通信的需求讓系統(tǒng)變得更加復(fù)雜。
6
識(shí)別內(nèi)在的復(fù)雜性
有時(shí)候事情本身就很復(fù)雜,你不能把問題簡(jiǎn)單化。
任何這樣的嘗試都只會(huì)讓系統(tǒng)變得更加復(fù)雜。
7
使用的技術(shù)越少,系統(tǒng)就越簡(jiǎn)單
深入理解一小部分技術(shù)要比只是表面理解很多技術(shù)好。
更少的技術(shù)意味著更少的東西要學(xué)習(xí)和更少的運(yùn)維復(fù)雜性。
8
集中精力學(xué)習(xí)概念,而不是技術(shù)
不要太關(guān)心技術(shù)的復(fù)雜細(xì)節(jié),因?yàn)槟憧梢噪S時(shí)查閱它們。你要學(xué)習(xí)底層的基本概念。
技術(shù)會(huì)變化,概念卻是永恒的。你學(xué)到的概念將被用在更新的技術(shù)中,你就可以更快地學(xué)會(huì)新技術(shù)。
例如,不要太關(guān)注 React、Kubernetes、Haskell、Rust 的表面細(xì)節(jié)。
重點(diǎn)學(xué)習(xí):
純函數(shù)式編程
關(guān)系型模型
規(guī)范的方法
邏輯編程
代數(shù)數(shù)據(jù)類型
類型類 (通用的和特定的)
借位檢查器 (仿射 / 線性類型)
依賴類型
Curry-Howard 同構(gòu)
宏
同像性(Homoiconicity)
VirtualDOM
線性回歸
......
9
代碼一致性很重要
有時(shí)候,具有一致性的代碼比“正確”的代碼更重要。如果你想要改變代碼庫(kù)中某些代碼的行為,就要修改它所有的實(shí)例。否則的話,就只能忍受。
代碼的可讀性更多地與一致性(而不是簡(jiǎn)單性)有關(guān)。人們通過模式識(shí)別來理解代碼,所以請(qǐng)重復(fù) (和記錄) 模式!
10
分享原則很重要
如果你和隊(duì)友之間的共同原則越多,就能越好地在一起工作,而且你會(huì)越喜歡和他們?cè)谝黄鸸ぷ鳌?
11
附錄:不一致性導(dǎo)致的復(fù)雜性
這是我能想到的最簡(jiǎn)單的例子,希望能毫不費(fèi)力地與現(xiàn)實(shí)問題聯(lián)系起來。
假設(shè)一個(gè)數(shù)據(jù)庫(kù)有兩個(gè)布爾變量 x 和 y,你的應(yīng)用程序有一個(gè)規(guī)則,即 x = y,可以通過使用一個(gè)事務(wù)修改這兩個(gè)變量來執(zhí)行這個(gè)規(guī)則。
如果這個(gè)規(guī)則被正確執(zhí)行,那么數(shù)據(jù)只有兩種狀態(tài):(x = True,y = True) 或 (x = False,y = False)。
基于這個(gè)規(guī)則的函數(shù)“toggle”就非常簡(jiǎn)單。你可以讀取其中一個(gè)值,并將兩個(gè)值都設(shè)置為反向值。
現(xiàn)在,假設(shè)你將這兩個(gè)變量放到不同的數(shù)據(jù)庫(kù)中,并且不能再被一起修改,那么會(huì)發(fā)生什么?
因?yàn)槟悴荒艽_保 x = y 的一致性,所以數(shù)據(jù)可以有兩種以上的狀態(tài):(x = True,y = False) 或 (x = False,y = True)。
如果你的系統(tǒng)處于這些狀態(tài)中的一種,你應(yīng)該使用哪個(gè)值?
當(dāng)處于其中的一種狀態(tài)時(shí),“toggle”函數(shù)的行為是怎樣的?
在寫入新值時(shí),如何確保兩次寫入都成功?
這些問題沒有正確的答案。
當(dāng)然,如果我們一開始就遵循“剔除無(wú)效狀態(tài)”的原則,那么將只有一個(gè)變量!
聯(lián)系一瞬
全國(guó)服務(wù)電話400-622-6167
郵箱liujunlei@net532.net
傳真0532-66087188
23-01建設(shè)什么樣的網(wǎng)站才算是好網(wǎng)站
23-01如何建設(shè)價(jià)值高的網(wǎng)站
23-01如何加強(qiáng)網(wǎng)絡(luò)營(yíng)銷藥品的監(jiān)管和規(guī)范
23-01化妝品代理的網(wǎng)絡(luò)營(yíng)銷策略
23-01為什么要做網(wǎng)絡(luò)營(yíng)銷?
23-01網(wǎng)絡(luò)營(yíng)銷的成功路徑
23-01家居建材行業(yè)新媒體營(yíng)銷是怎么做
23-01新媒體營(yíng)銷賦能推動(dòng)鄉(xiāng)村振興
23-01汽車廠商新媒體營(yíng)銷行為特點(diǎn)
青島一瞬網(wǎng)絡(luò)提供青島網(wǎng)站建設(shè),青島網(wǎng)絡(luò)營(yíng)銷,青島網(wǎng)絡(luò)推廣,青島網(wǎng)站優(yōu)化,青島移動(dòng)營(yíng)銷,青島電商托管,青島網(wǎng)絡(luò)公關(guān)等多種服務(wù)!
在線
客服
服務(wù)時(shí)間:9:00~16:00
客服
熱線
400-622-6167
關(guān)注
微信
關(guān)注我們
返回
頂部