如何像NASA頂級程序員一樣編程 —— 10條重要原則
引言: 你知道 NASA ***程序員如何編寫關(guān)鍵任務(wù)代碼么?為了確保代碼更清楚、更安全、且更容易理解,NASA 的噴氣推進實驗室制定了 10 條編碼規(guī)則。
NASA 的開發(fā)者是編程界最有挑戰(zhàn)性的工作之一。他們編寫代碼并將開發(fā)安全的關(guān)鍵任務(wù)應(yīng)用程序作為其主要關(guān)注點。
在這種情形下,遵守一些嚴格的編碼規(guī)則是重要的。這些規(guī)則覆蓋軟件開發(fā)的多個方面,例如軟件應(yīng)該如何編碼、應(yīng)該使用哪些語言特性等。
盡管很難就一個好的編碼標準達成共識,NASA 的噴氣推進實驗室(JPL)遵守一個編碼規(guī)則,其名為“十的次方:開發(fā)安全的關(guān)鍵代碼的規(guī)則”。
由于 JPL 長期使用 C 語言,這個規(guī)則主要是針對于 C 程序語言編寫。但是這些規(guī)則也可以很容地應(yīng)用到其它的程序語言。
該規(guī)則由 JPL 的***科學家 Gerard J. Holzmann 制定,這些嚴格的編碼規(guī)則主要是聚焦于安全。
NASA 的 10 條編寫關(guān)鍵任務(wù)代碼的規(guī)則:
- 限制所有代碼為極為簡單的控制流結(jié)構(gòu) — 不用 goto 語句、setjmp 或 longjmp 結(jié)構(gòu),不用間接或直接的遞歸調(diào)用。
- 所有循環(huán)必須有一個固定的上限值。必須可以被某個檢測工具靜態(tài)證實,該循環(huán)不能達到預(yù)置的迭代上限值。如果該上限值不能被靜態(tài)證實,那么可以認為違背該原則。
- 在初始化后不要使用動態(tài)內(nèi)存分配。
- 如果一個語句一行、一個聲明一行的標準格式來參考,那么函數(shù)的長度不應(yīng)該比超過一張紙。通常這意味著每個函數(shù)的代碼行不能超過 60。
- 代碼中斷言的密度平均低至每個函數(shù) 2 個斷言。斷言被用于檢測那些在實際執(zhí)行中不可能發(fā)生的情況。斷言必須沒有副作用,并應(yīng)該定義為布爾測試。當一個斷言失敗時,應(yīng)該執(zhí)行一個明確的恢復(fù)動作,例如,把錯誤情況返回給執(zhí)行該斷言失敗的函數(shù)調(diào)用者。對于靜態(tài)工具來說,任何能被靜態(tài)工具證實其永遠不會失敗或永遠不能觸發(fā)的斷言違反了該規(guī)則(例如,通過增加無用的 assert(true) 語句是不可能滿足這個規(guī)則的)。
- 必須在最小的范圍內(nèi)聲明數(shù)據(jù)對象。
- 非 void 函數(shù)的返回值在每次函數(shù)調(diào)用時都必須檢查,且在每個函數(shù)內(nèi)其參數(shù)的有效性必須進行檢查。
- 預(yù)處理器的使用僅限制于包含頭文件和簡單的宏定義。符號拼接、可變參數(shù)列表(省略號)和遞歸宏調(diào)用都是不允許的。所有的宏必須能夠擴展為完整的語法單元。條件編譯指令的使用通常是晦澀的,但也不總是能夠避免。這意味著即使在一個大的軟件開發(fā)中超過一兩個條件編譯指令也要有充足的理由,這超出了避免多次包含頭文件的標準做法。每次在代碼中這樣做的時候必須有基于工具的檢查器進行標記,并有充足的理由。
- 應(yīng)該限制指針的使用。特別是不應(yīng)該有超過一級的解除指針引用。解除指針引用操作不可以隱含在宏定義或類型聲明中。還有,不允許使用函數(shù)指針。
- 從開發(fā)的***天起,必須在編譯器開啟***級別警告選項的條件下對代碼進行編譯。在此設(shè)置之下,代碼必須零警告編譯通過。代碼必須利用源代碼靜態(tài)分析工具每天至少檢查一次或更多次,且零警告通過。
關(guān)于這些規(guī)則,NASA 是這么評價的:
這些規(guī)則就像汽車中的安全帶一樣,剛開始你可能感到有一點不適,但是一段時間后就會養(yǎng)成習慣,你會無法想象不使用它們的日子。
此文是否對你有幫助?不要忘了在下面的評論區(qū)寫下你的反饋。