軟件工程VS編程
軟件工程就是隨時間不斷集成的編程。
思考:編程是需要考慮時間維度的,軟件的生命長度決定了編程時需要考慮的方面,這是因為軟件會隨時間產(chǎn)生變化。優(yōu)秀的編程能對任意有價值的變化做出反應(yīng),這些變化包括但不限于:
- 依賴
- 業(yè)務(wù)
- 人員
- 規(guī)模
- 數(shù)據(jù)
- 外部因素(技術(shù)/社會等)
有變化就會有風(fēng)險,如何管理這些風(fēng)險(或風(fēng)險預(yù)期),是軟件工程重要的研究對象。
海勒姆定律
“當(dāng)?個 API 有?夠的?戶的時候,在約定中你承諾的什么都?所謂,所有在你系統(tǒng)??被觀察到的?為都會被?些?戶直接依賴。” ---- 海勒姆定律
理解:如果你正維護(hù)一些被其他工程師使用的項目,需要考慮到他們(其他工程師)不僅會使用承諾的內(nèi)容(比如API文檔中的說明),還可能會依賴其它未顯式發(fā)布的屬性會行為(e.g. hack)
碧昂斯規(guī)則
“如果一個產(chǎn)品由于基礎(chǔ)設(shè)施的變更出現(xiàn)中斷或其它問題,但是在我們的持續(xù)集成(CI)系統(tǒng)中的自動化測試用例并沒有發(fā)現(xiàn)這個問題,那么就不應(yīng)該又負(fù)責(zé)基礎(chǔ)設(shè)施的團(tuán)隊承擔(dān)責(zé)任。” ---- 碧昂斯規(guī)則
- 規(guī)則名字來源
"If you liked it then you shoulda put a ring on it" --- <Single Ladies (Put a Ring On It)> Beyoncé
理解:是應(yīng)對“海勒姆定律”風(fēng)險的一種手段,定義“向后兼容”的“后”是什么。這樣可以減少基礎(chǔ)設(shè)施維護(hù)者的升級成本(否則,任何升級都會無可避免的變得痛苦不已,且隨用戶數(shù)量而增加);另一方面在自己的程序中設(shè)置過多的隱性依賴也是不負(fù)責(zé)任的。
左移思想

越早發(fā)現(xiàn)問題,成本越低。安全性不能推遲到開發(fā)過程結(jié)束才檢測。
理解: 將問題檢測提前可以節(jié)省成本。這要求從產(chǎn)品設(shè)計,原型設(shè)計,測試用例設(shè)計,開發(fā)設(shè)計等階段都引入檢測機(jī)制(在我的工作經(jīng)驗中,評審是非常重要的一環(huán))。
權(quán)衡與成本
在谷歌內(nèi)部,人們強(qiáng)烈反感“我說了算”。重要的是,任何議題都要有一個決策者,當(dāng)決策錯誤的時候,要有明確的改進(jìn)路徑,但目標(biāo)是“共識”,而不是“一致”。我們希望看到一些 "我不同意你的衡量標(biāo)準(zhǔn)/評價,但我知道你是如何得出這個結(jié)論的 "的情況。所有這一切的內(nèi)在含義是,每件事都是需要一個理由的?!熬褪沁@樣,沒有理由”、“因為我說了算”或“因為其他人都這樣做”是潛在錯誤的決策。 只要這樣做是有效的,當(dāng)我們面對兩個工程選項的總成本而需要做出決策時,應(yīng)該給出相應(yīng)的解釋。
理解:決策需要考慮的是成本與收益,而不同成本之間有一些是可以總結(jié)出相互“轉(zhuǎn)換比較”關(guān)系的,如:
- RAM 和 CPU資源 (硬件成本)
- 緩存 和 訪問速度 (產(chǎn)品成本)
- 14人天的投入(工程師的時間成本) 和 如果不做這個,這14人天能做點別的(機(jī)會成本)
但另一些問題則沒有簡單的答案:
- 究竟要花多少時間合適?
- 如何度量糟糕設(shè)計的工程成本?
- 產(chǎn)品決策的社會影響?
這些問題更多依靠經(jīng)驗、領(lǐng)導(dǎo)才能和先例來協(xié)商。
需要意識到,不是所有都是可以量化(衡量、預(yù)測)的。