Linux中國

如何像 NASA 頂級程序員一樣編程 —— 10 條重要原則

引言: 你知道 NASA 頂級程序員如何編寫關鍵任務代碼么?為了確保代碼更清楚、更安全、且更容易理解,NASA 的噴氣推進實驗室制定了 10 條編碼規則。

NASA 的開發者是編程界最有挑戰性的工作之一。他們編寫代碼並將開發安全的關鍵任務應用程序作為其主要關注點。

在這種情形下,遵守一些嚴格的編碼規則是重要的。這些規則覆蓋軟體開發的多個方面,例如軟體應該如何編碼、應該使用哪些語言特性等。

儘管很難就一個好的編碼標準達成共識,NASA 的噴氣推進實驗室(JPL)遵守一個編碼規則,其名為「十的次方:開發安全的關鍵代碼的規則」。

由於 JPL 長期使用 C 語言,這個規則主要是針對於 C 程序語言編寫。但是這些規則也可以很容地應用到其它的程序語言。

該規則由 JPL 的首席科學家 Gerard J. Holzmann 制定,這些嚴格的編碼規則主要是聚焦於安全。

NASA 的 10 條編寫關鍵任務代碼的規則:

  1. 限制所有代碼為極為簡單的控制流結構 — 不用 goto 語句、setjmplongjmp 結構,不用間接或直接的遞歸調用。
  2. 所有循環必須有一個固定的上限值。必須可以被某個檢測工具靜態證實,該循環不能達到預置的迭代上限值。如果該上限值不能被靜態證實,那麼可以認為違背該原則。
  3. 在初始化後不要使用動態內存分配。
  4. 如果一個語句一行、一個聲明一行的標準格式來參考,那麼函數的長度不應該比超過一張紙。通常這意味著每個函數的代碼行不能超過 60。
  5. 代碼中斷言的密度平均低至每個函數 2 個斷言。斷言被用於檢測那些在實際執行中不可能發生的情況。斷言必須沒有副作用,並應該定義為布爾測試。當一個斷言失敗時,應該執行一個明確的恢復動作,例如,把錯誤情況返回給執行該斷言失敗的函數調用者。對於靜態工具來說,任何能被靜態工具證實其永遠不會失敗或永遠不能觸發的斷言違反了該規則(例如,通過增加無用的 assert(true) 語句是不可能滿足這個規則的)。
  6. 必須在最小的範圍內聲明數據對象。
  7. 非 void 函數的返回值在每次函數調用時都必須檢查,且在每個函數內其參數的有效性必須進行檢查。
  8. 預處理器的使用僅限制於包含頭文件和簡單的宏定義。符號拼接、可變參數列表(省略號)和遞歸宏調用都是不允許的。所有的宏必須能夠擴展為完整的語法單元。條件編譯指令的使用通常是晦澀的,但也不總是能夠避免。這意味著即使在一個大的軟體開發中超過一兩個條件編譯指令也要有充足的理由,這超出了避免多次包含頭文件的標準做法。每次在代碼中這樣做的時候必須有基於工具的檢查器進行標記,並有充足的理由。
  9. 應該限制指針的使用。特別是不應該有超過一級的解除指針引用。解除指針引用操作不可以隱含在宏定義或類型聲明中。還有,不允許使用函數指針。
  10. 從開發的第一天起,必須在編譯器開啟最高級別警告選項的條件下對代碼進行編譯。在此設置之下,代碼必須零警告編譯通過。代碼必須利用源代碼靜態分析工具每天至少檢查一次或更多次,且零警告通過。

關於這些規則,NASA 是這麼評價的:

這些規則就像汽車中的安全帶一樣,剛開始你可能感到有一點不適,但是一段時間後就會養成習慣,你會無法想像不使用它們的日子。

此文是否對你有幫助?不要忘了在下面的評論區寫下你的反饋。

作者簡介:

Adarsh Verma 是 Fossbytes 的共同創始人,他是一個令人尊敬的企業家,他一直對開源、技術突破和完全保持密切關注。可以通過郵件聯繫他 — adarsh.verma@fossbytes.com

via: https://fossbytes.com/nasa-coding-programming-rules-critical/

作者:Adarsh Verma 譯者:penghuster 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國