如何像 NASA 顶级程序员一样编程 —— 10 条重要原则
创始人
2024-03-01 20:53:46
0

引言: 你知道 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中国 荣誉推出

相关内容

卓易信息:通过多智能体协作...
证券之星消息,卓易信息(688258)07月04日在投资者关系平台...
2025-07-04 18:13:00
华为仓颉编程语言首个 LT...
IT之家 7 月 1 日消息,华为仓颉编程语言首个 LTS 版本 ...
2025-07-01 21:12:49
速递|谷歌“终端智能体”的...
图片来源:谷歌 谷歌正在推出一款新型 AI Agent工具,旨在...
2025-06-27 13:12:21
AI编程再突破,首个多智能...
曾经有着较高技术门槛的编程,正随着AI技术的普及加速成为人人可用的...
2025-06-24 17:13:18
昆仑万维正式发布并开源Sk...
人民财讯6月20日电,6月20日,昆仑万维发布软件工程(SWE)自...
2025-06-20 15:40:28
AI赋能理科教学:开发模拟...
AI是知识工作者的挖掘机,大幅提升教学与科研生产力。 ——...
2025-06-06 08:11:53

热门资讯

Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
JStock:Linux 上不... 如果你在股票市场做投资,那么你可能非常清楚投资组合管理计划有多重要。管理投资组合的目标是依据你能承受...
通过 SaltStack 管理... 我在搜索Puppet的替代品时,偶然间碰到了Salt。我喜欢puppet,但是我又爱上Salt了:)...
Epic 游戏商店现在可在 S... 现在可以在 Steam Deck 上运行 Epic 游戏商店了,几乎无懈可击! 但是,它是非官方的。...
《Apex 英雄》正式可在 S... 《Apex 英雄》现已通过 Steam Deck 验证,这使其成为支持 Linux 的顶级多人游戏之...
如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
2024 开年,LLUG 和你... Hi,Linuxer,2024 新年伊始,不知道你是否已经准备好迎接新的一年~ 2024 年,Lin...
什么是 KDE Connect... 什么是 KDE Connect?它的主要特性是什么?它应该如何安装?本文提供了基本的使用指南。科技日...
Opera 浏览器内置的 VP... 昨天我们报道过 Opera 浏览器内置了 VPN 服务,用户打开它可以防止他们的在线活动被窥视。不过...