如何像NASA顶级程序员一样编程 —— 10条重要原则

引言: 你知道 NASA 顶级程序员如何编写关键任务代码么?为了确保代码更清楚、更安全、且更容易理解,NASA 的喷气推进实验室制定了 10 条编码规则。

NASA 的开发者是编程界最有挑战性的工作之一。他们编写代码并将开发安全的关键任务应用程序作为其主要关注点。

在这种情形下,遵守一些严格的编码规则是重要的。这些规则覆盖软件开发的多个方面,例如软件应该如何编码、应该使用哪些语言特性等。

尽管很难就一个好的编码标准达成共识,NASA 的喷气推进实验室(JPL)遵守一个编码规则,其名为“十的次方:开发安全的关键代码的规则”。

由于 JPL 长期使用 C 语言,这个规则主要是针对于 C 程序语言编写。但是这些规则也可以很容地应用到其它的程序语言。

该规则由 JPL 的首席科学家 Gerard J. Holzmann 制定,这些严格的编码规则主要是聚焦于安全。

NASA 的 10 条编写关键任务代码的规则:

  1. 限制所有代码为极为简单的控制流结构 — 不用 goto 语句、setjmp 或 longjmp 结构,不用间接或直接的递归调用。
  2. 所有循环必须有一个固定的上限值。必须可以被某个检测工具静态证实,该循环不能达到预置的迭代上限值。如果该上限值不能被静态证实,那么可以认为违背该原则。
  3. 在初始化后不要使用动态内存分配。
  4. 如果一个语句一行、一个声明一行的标准格式来参考,那么函数的长度不应该比超过一张纸。通常这意味着每个函数的代码行不能超过 60。
  5. 代码中断言的密度平均低至每个函数 2 个断言。断言被用于检测那些在实际执行中不可能发生的情况。断言必须没有副作用,并应该定义为布尔测试。当一个断言失败时,应该执行一个明确的恢复动作,例如,把错误情况返回给执行该断言失败的函数调用者。对于静态工具来说,任何能被静态工具证实其永远不会失败或永远不能触发的断言违反了该规则(例如,通过增加无用的 assert(true) 语句是不可能满足这个规则的)。
  6. 必须在最小的范围内声明数据对象。
  7. 非 void 函数的返回值在每次函数调用时都必须检查,且在每个函数内其参数的有效性必须进行检查。
  8. 预处理器的使用仅限制于包含头文件和简单的宏定义。符号拼接、可变参数列表(省略号)和递归宏调用都是不允许的。所有的宏必须能够扩展为完整的语法单元。条件编译指令的使用通常是晦涩的,但也不总是能够避免。这意味着即使在一个大的软件开发中超过一两个条件编译指令也要有充足的理由,这超出了避免多次包含头文件的标准做法。每次在代码中这样做的时候必须有基于工具的检查器进行标记,并有充足的理由。
  9. 应该限制指针的使用。特别是不应该有超过一级的解除指针引用。解除指针引用操作不可以隐含在宏定义或类型声明中。还有,不允许使用函数指针。
  10. 从开发的第一天起,必须在编译器开启最高级别警告选项的条件下对代码进行编译。在此设置之下,代码必须零警告编译通过。代码必须利用源代码静态分析工具每天至少检查一次或更多次,且零警告通过。

关于这些规则,NASA 是这么评价的:

这些规则就像汽车中的安全带一样,刚开始你可能感到有一点不适,但是一段时间后就会养成习惯,你会无法想象不使用它们的日子。

此文是否对你有帮助?不要忘了在下面的评论区写下你的反馈。 

原文发布时间为:2017-10-23

本文作者:Adarsh Verma

时间: 2025-01-20 12:50:14

如何像NASA顶级程序员一样编程 —— 10条重要原则的相关文章

国外程序员分享的10条编程经典语录

如果调试程序是移除臭虫(软件缺陷)的过程,那编写程序就是把臭虫放进来的过程.-- 迪杰斯特拉 09. The first 90% of the code accounts for the first 90% of the development time. The remaining 10% of the code accounts for the other 90% of the development time. – Tom Cargill 软件开发的时间通常是这样的:一开始的90%开发工作

c语言-编译器是否可以改变程序员的编程逻辑或意图

问题描述 编译器是否可以改变程序员的编程逻辑或意图 举例:用c语言,有一个整型变量a,在代码中明确表示a不会加一或减一,但是在调试时a却违背了程序员的意图出现了加一或减一的情况. 解决方案 不会,但如果是希望单步调试来跟踪变量的变化,最好将代码编译的优化选项关闭掉,否则优化后的代码与C的变量是不能一一对应起来的. 解决方案二: 编译器是程序,是程序就可以做任何事情.就在最近,就有人通过修改xcode附带的oc编译器,把恶意代码附加到使用这个编译器的所有程序上. 相关报道:http://digi.

程序员与编程——[侯捷老师的帖]

  程序员与编程--[侯捷老师的帖] 1.急功近利是大忌 一位读者写信给我,说他非常着急.他一个月挣300元人民币,家里情况又不好.他希望赶快把 VC/MFC 学会,进入 I T 产业挣钱.信写得很长,看着看着,我也不禁为他着急起来. 有许多读者,虽然情况没有那么急迫,燃眉之情却也溢于言表.不外乎都是希望能够尽快把某技术某技术学习起来. 但是哪一样东西哪一样技术是可以快速学成的呢?能够快速学成的技术,人才也就必然易取易得,根据市场供需法则,也就不可能有很好的报酬.所以诸君当有心理准备,门槛高的,

书摘:程序员成长的10个阶段

导读:本文节选自机械工业出版社<程序员成长路线图>一书.该书的作者N216.张磊和吉阳一起回忆和总结了自己几十年的程序员成长经历,对当前程序员关心的热点.重点.难点问题给出了自己的看法和建议.通过对程序员的成长阶段进行划分,使得各个阶段的程序员都可以"按图索骥",解决自己所遇到的问题. 图书封面: 我的程序员成长之路 程序员的成长经历往往很相似,大部分的人走过了最前面相同的一段路,而有的人则走得更远.总结自己这些年来的历程,这也许能让年轻的程序员少走一些弯路,成长得更快:或

深受Java程序员欢迎的10款Java IDE

Java是全世界最受欢迎的一门程序语言,它被广泛的应用于企业项目.游戏设计.安卓应用程序等开发领域.以下的列表是整理的近些年来深受Java程序员欢迎的10款Java IDE.(注:IDE意为集成开发环境,它不仅支持编辑和编译代码,还能够完成管理资源.提供部署.版本控制等工作.) NetBeans NetBeans是过去10年发展最好的IDE,它做到了完全的模块化 ,所有的IDE功能都被封装成包,并称之为模块.它提供了简单的方式来集成版本控制软件.由于它的源代码已经被Sun公司开源,因此在任意平台

程序员必备的10大健康装备! 我们要工作更要健康!_生活健康

前言 做为程序员,为了实现理想而奋斗不懈,每天对着电脑辐射坐在工位上拼搏8小时甚至更久,这种如同机器旁边的机器般的工作对于健康的损耗何其之大?再这么下去,还真得应了:"职务不高,工资不高,血压血脂血糖高:政治不突出,业务不突出,腰椎盘突出"这种亚健康状态,最可怕的是技术人员平均寿命都有点惊悚,就怕最后"出师未捷身先死,长使英雄泪满襟".是时候呼吁一下健康的问题了!废话不说了,进入正题吧.本次的带来的是:程序员必备的10大健康装备,Let's go! 装备1:沙袋 &

像谈恋爱那样去招顶级程序员吧!

本文编译自First Round Review,他们准备的文章既讲故事,还同时向创业者提供可操作的建议,以助力打造优秀的公司. Coursera的首席产品经理John Ciancutti在1999年加入Netflix担任工程师,那时候它只是由四个程序员组成的创业团队.在Netflix起步的阶段,他帮助这家当时籍籍无名的公司招来了上百个工程师,而在Coursera的两年时间里,他把技术团队由25人扩展到了如今的60人. 近日在First Round举行的CTO峰会上,他将自己多年招聘的经验分享出来

程序员:编程能力vs职业技能,哪个更重要

即便不是伟大的程序员,你也可以走的更远 每个程序员应该具备2种能力,即编程能力和个人的职业技能. 编程能力意味着你写的代码是可靠,高性能,易维护的.这跟程序员花费的时间,他的思维,以及广泛的阅读有关. 职业技能让你成为一个好的员工,好的同事.这需要反应敏捷,有良好的沟通,明白期限,及时公开的反馈,能清楚解释复杂的事物等能力. 一个极端的例子. 想象有2个人. Rodrigo是麻省理工的毕业生,在他的空闲时间里面他在编写一个编译器.他是Haskell核心的贡献者,并且开发了一些著名的Python

程序员获取编程灵感的十种方式

有时我会陷入读着编程书但编不了程的陷阱.我不能总是找到一个可工作的有趣项目,即使我知道有大量的机会.如果你有相同的问题,这里的一些提示可能会有所帮助. 1.与其他程序员聊天 这是最好的灵感来源,因为,他们会有一些你想不到的点子.即使是一些程序员朋友.一个编程小组或甚至是一个会议都行.将所有这些想法混合起来肯定会给你一个新的视角. 2.和非程序员一起聊天 首先,在那些让你觉得快乐或挑战思维的人身边,会让人健康,无论他们是否会写代码.第二,他们可以从用户的角度给你灵感.什么会让他们对计算机感到失望?