歡迎光臨
每天分享高質量文章

請不要嘗試簡化這些代碼

請不要嘗試簡化這些代碼!

Kubernetes 是 Google 開源的一個容器編排引擎,它支持自動化部署、大規模可伸縮、應用容器化管理。Kubernetes  簡稱 K8s,用「8」替代 K 和 s 之間的 8 個字母「ubernete」。

K8s  的 pv_controller.go 原始碼大約 1700 行(含註釋),其中包括:230+ 個 if 陳述句、30 個 else 陳述句、5 個 else if 陳述句嵌套在一起

https://github.com/kubernetes/kubernetes/blob/ec2e767e59395376fa191d7c56a74f53936b7653/pkg/controller/volume/persistentvolume/pv_controller.go#L323

乍一看,這代碼違背了 KISS (Keep it simple, stupid)原則。

 但是,K8s 的工程師們在註釋中用大寫英文標註:請不要嘗試簡化這些代碼!」並且還寫了兩遍。

為啥強調兩遍?K8s 他們在註釋中特意解釋了。大意如下:

這個控制器故意以一種非常冗長的風格編寫。你會發現:

1、每個 if 陳述句都有一個匹配的 else 陳述句(檢查客戶端 API 呼叫的簡單錯誤除外);

2、有很多被顯式地註釋的東西;

我們把這種風格叫做“航天飛機風格”。航天飛機的風格意味著,要確保每個分支和條件都得到考慮和說明。NASA 為航天飛機等應用程式編寫的代碼也是如此。

最初,這個控制器的工作被分成三個控制器。控制器是努力簡化 PV 子系統的成果。在此過程中,我們要確保在代碼中處理和解釋了每一個條件,即使這會導致無 op 代碼分支。

因此,控制器代碼可能看起來過於冗長、註釋過多和“分支”。但是,這裡記錄了大量的業務知識和背景關係,以便確保未來的維護者能夠正確地推斷系結行為的複雜性。因此,對這個檔案的修改,應該保留並增加航天飛機的風格。

程式員們的看法

12 月 8 日,這段特別的原始碼註釋在 Hacker News 上引發程式員們的熱議。「程式員的那些事」摘譯一些幾位國外程式員的評論:

Klathmon 的觀點:

我超喜歡!它就是軟體開發的「爵士樂」。雖然它打破所有的「規則」,但它目的明確,比遵循「規則」的結果還要做的好。

我第一眼看的時候,感覺頭都要炸了。原始碼檔案太大了,有太多的分支和嵌套的 if 陳述句,有很多只是描述一行或幾行是做什麼的毫無意義的註釋。而且註釋中還有很多「邏輯」,相比實際代碼,這些「邏輯」這可能很快過時或出錯。

然而!它們這種方式更利於維護和管理代碼,不需要把「邏輯」部分拆分成數十或數百個檔案。它已包含了要在該檔案中做的大量固有的複雜工作,並且註釋寫的又好又詳細,所以確保了以後有任何改動,註釋都能輕鬆地隨之更新。

nickharr 的觀點:

在用多種編程語言編寫、查看、註釋和評審代碼方面,我有 25 年的經驗,拋開編程「風格」如何如何,這都是很值得一看的東西。

退一步說,雖然我們都可以忽略代碼註釋,但是優秀的代碼註釋可以極大地提高生產力——對個人、團隊乃至企業都是如此。註釋可以幫助儲存庫知識(這往往是當前和以前的團隊/個人之間很容易丟失的東西),不應該將其誤認為查看代碼的人的智慧……

我花了太多的時間,試圖對沒有註釋或解釋的代碼進行反向工程。有時,經驗豐富的程式員/開發人員會走一些捷徑(經驗不足的開發者無法理解)。他們會根據自身的語言/領域知識,來壓縮程式和函式,但沒有解釋……

我認為,註釋應該:告知、教育、概括和幫助他人,來理解開發者在巨大壓力下時寫出的複雜程式或函式。

有些人認為,好的代碼不需要解釋。這個觀點,在某種程度上是對的,但並不是放之四海而皆準。代碼有時會變得複雜、笨拙、就像意大利麵條一樣,難以理解。

我一直在努力教經驗不足的開發者如何用幽默的方式(如果可能的話)寫良好、有效的註釋。它能讓我們快速理解代碼,欣賞前人的努力,笑對複雜挑戰。

就我個人而言,我並不真正關心代碼/註釋比率——這完全是在轉移人們的註意力。有時,代碼註釋可能比代碼本身更有價值。在其他時候,註釋只是幫助你完成工作。快速、高效、沒有問題,就是優秀的代碼。

@memories_on:if必須加個對應的else有時非常有用 在你要改動邏輯判斷的組合時就更有用了

@PreciselyPrecious:與KISS剛好相反

@柳煙堆雪這不是什麼代碼風格,而是當時做pv controller時 edge case實在太多,為了讓後續開發者能明白怎麼回事所以要故意往啰嗦里寫。kubernetes 專案開發者近兩千,這種作法和修飾其實能找到不少的。

@刻板的眼睛:《代碼之美》中有看到,在一些情況下是可以放棄一些編碼規則的,只要好處夠多

@D2942D4EADA2C788C171BC53B3A68D:這類編程工作的核心應該是邏輯表達清晰且代碼量盡可能少以減少犯錯概率。這恰恰是代碼生成器最擅長的地方,除了固定的優化和表達規則,不會自作聰明對邏輯進行等效裁剪。可以預見領域語言會是這類領域絕對的霸主。

    赞(0)

    分享創造快樂