世界上最完美的两个软件,太厉害了!
今天给大家介绍两个软件,一个体现了人类在软件开发流程上的极致,另外一个则体现了程序员个体能力的巅峰。
01
航天飞机飞控软件
先来说第一个,航天飞机飞行控制软件,就是下图这个大家伙。
航天飞机重达120吨,还携带着2000吨的燃料。
它有四台硬件相同,软件也相同的计算机对发射过程进行精准控制,从几千个传感器中提取信息,每秒做出几百个决定,并且对每个决定进行投票。
第五台计算机,则运行着不同的软件,随时待命,准备替换其他发生故障的计算机。
这些计算机要确定什么时候对主发动机点火,什么时候下令固体火箭助推器点火,火箭姿态控制....
每次发射,软件都控制着价值40亿美元的设备,六名航天员的生命,以及国家的梦想。
这个软件不能崩溃,不能重启,最小的误差都不允许:一个三分之二秒的计时错误就会使航天飞机偏离航线近5公里。
洛克希德马丁公司的航天飞机小组实现了目标:软件几乎没有错误,接近完美。
软件的最后三个版本,每个版本(42万行代码)只有一个Bug。
最后的11个版本一共有17个错误,同等复杂度的商业程序有5000个。
这样的软件是如何炼成的呢?
答案是极为苛刻软件流程。
洛克希德马丁公司的航天飞机软件小组有260名员工,这些人创造了一种完全不同的开发文化。
没有超级明星程序员,开发软件的整个流程都是有意设计的,不依赖任何特定的人。
这个流程使得他们过上正常的生活,满足最后期限,交付完全符合其承诺的软件。
这个流程包含几个要点:
1. 软件的质量取决于软件的计划
在航天飞机软件开发小组,软件开发周期中有三分之一的时间不写代码,而是和NASA一起用来讨论需求:软件应该做什么事情。
即使是最微小的细节也要达成一致。不是口头达成一致,而是写下来,文档化,形成规范,非常专业和精确。
未经双方的同意,规范中的任何内容都不会更改。
没有良好定义的规范,程序员不会改任何一行代码。
例如让航天飞机使用GPS导航,这一变化仅涉及6366行代码,占程序总量的1.5%, 但是相关的文档长达2500页,涵盖了各种各样的条件,分支,几乎就是伪代码了。
而航天飞机系统的软件,总文档足足有30卷,40000页!
2. 两个百科全书式的数据库
一个是代码历史的数据库,每一行代码都有注释,显示每次的更改时间,更改原因,更改目的,有哪些文档详细说明了更改。
对于代码发生的一切都记录在这里,每一行代码的“祖谱”都可以立刻提供给每个人。
第二个是错误数据库,记录了软件在编写和运行时发生的每一个错误,可以追溯到近20年前。
每个错误都会记录下它被发现的时间,是谁发现了它,当时正在发生什么活动(测试,训练,飞行),错误是如何引入的,为什么逃过了设计阶段,开发阶段,测试阶段的严格审查.....
由于积累了如此多的数据,以至于他们开发了一个代码模型,能预测某个版本中可能有多少错误。
如果开发人员和测试人员发现的Bug太少,大家会重复流程,努力使得现实和预测相匹配。
3.不止要修复错误,要修复任何引入错误的东西
如果软件存在缺陷,那么编写它的方式一定存在问题。
在计划阶段没有发现的Bug,是如何逃过检查的?检查流程是否出了问题,是不是要在checklist上增加一项检查?
重要的是,不要将错误归咎于个人。流程要承担责任---启动一个分析的流程来发现Bug的原因。
航天飞机软件开发小组的流程是如此强大,不仅仅通过了SEI CMM5的认证,而且SEI的不少标准就来自于这个小组的各种实践。
洛克希德马丁开发了近乎完美的软件,大家肯定会想到一个问题:这种开发方式会不会扼杀创造力?
他们的回答是:会,因为大家必须按照手册上规定的流程去做,并且时时刻刻都有人在背后监督。
人们必须将创造力用于改变流程,而不是改变软件。
02
排版软件TEX
经典巨著《计算机程序设计的艺术》在程序员界可谓是无人不知,无人不晓了。
1973年,这部刚出到第三卷的书(计划写七卷)已被计算机界视为“神作”, 1974年美国计算机学会就“迫不及待”的把计算机界的最高奖图灵奖授予高德纳。
此时高德纳仅仅36岁 !只靠一套还没有完成的书就获得ACM图灵奖,不但是前无古人,估计也后无来者了。
然而令人大跌眼镜的是, 拿到图灵奖以后, 高德纳宣布暂停写作, 理由竟然是现有的计算机排版系统太差,破坏了书的美感 !然后单枪匹马开发出了革命性的排版系统TEX , TEX至今仍是全球学术排版的不二之选。
TEX功能强大,几乎无懈可击,其版本号也很有意思,不是数字(3.0, 3.1, 3.2....) 也不是年份(Windows 95, 98, 2000...),而是不断逼近的圆周率 (3.1415926...) ,这从侧面反映了软件几近完美,不需要做改进了。
高德纳曾表示“最后一次升级是(于我过世后)将版本数改为 π,那时任何余下的漏洞将被看作程序的功能!
有趣的是高纳德为此还设置了奖金,谁能从TEX 发现第一个Bug ,奖励2.56美元,然后每年翻一倍,5.12,10.24......
作为算法的大师,不可能不知道指数增长的可怕性,但高德纳对自己的代码质量非常有信心,事实上,当奖金达到327.68美元以后,基本上就没什么Bug报出来了。
那些找到Bug 的人收到高德纳签名的支票以后也不去兑换, 而是作为珍品收藏了 :-)
高德纳编程能力之强可以说是碾压硅谷的所有程序员,面向对象的发明人Alan Kay(2003年图灵奖)这么说过:
60年代末,当我在斯坦福从事AI项目时,每个感恩节我们都会和硅谷的编程高手们举行编程竞赛,McCarthy(人工智能之父,1971年获图灵奖)出题, 奖品是好像是一只火鸡。
高德纳参与的那一年,把我们都给虐了, 他的代码无论是程序执行和算法执行都是最快的,并且他用的是一台最慢的批处理机器!
我们问高德纳:“你是怎么做到的?”
他说:“当我学习编程时,如果每天有五分钟的时间使用机器,就高兴得不得了, 所以必须要让程序一次运行成功,没有错误,算法设计达到最佳。”
(完)
相关文章:
世界上最完美的两个软件,太厉害了!
今天给大家介绍两个软件,一个体现了人类在软件开发流程上的极致,另外一个则体现了程序员个体能力的巅峰。01航天飞机飞控软件先来说第一个,航天飞机飞行控制软件,就是下图这个大家伙。航天飞机重达120吨,还携带着2000吨…...
教你成为比卡卡西还牛逼的全能忍者,全拷贝与分割函数
如何成为一个集雷切,写轮眼侦查和拷贝与一身的卡卡西,下面教你! 目录 第一式——雷切! strtok 第二式——写轮眼侦查! strerror函数 第三式——写轮眼拷贝! memcpy 模拟实现memcpy函数 😎…...
【LeetCode】剑指 Offer(24)
目录 题目:剑指 Offer 47. 礼物的最大价值 - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 写在最后: 题目:剑指 Offer 47. 礼物的…...
javaEE 初阶 — CSS 元素的显示模式与盒模型
文章目录1. 元素的显示模式1.1 块级元素1.2 行内元素1.3 行内元素和块级元素的区别1.4 改变显示模式2. 盒模型2.1 边框2.1.1 边框的粗细2.1.2 边框的颜色2.1.3 边框的风格2.2 内边距2.3 外边距2.3.1 margin 的特殊情况1. 元素的显示模式 1.1 块级元素 常见的元素: h1 - h6 、…...
新星计划-我为什么要写博客?写博客的意义是什么
CSDN的各位友友们你们好,今天千泽要和大家交流一下写博客的意义,并且鼓励大家参加CSDN官方举办的新星计划,这个可以让我们更快的成长,十分有价值.接下来让我们一起开始吧!如果对您有帮助的话希望能够得到您的支持和帮助,我会持续更新的!🚩part1:自我介绍我是一名来自…...
嵌入式学习笔记——STM32的USART收发字符串及串口中断
USART收发字符串及串口中断前言字符串的收发发送一个字符串接收字符串需求利用串口实现printf中断中断是什么前言 上一篇中,介绍了串口收发相关的寄存器,通过代码实现了一个字节的收发,本文接着上面的内容,通过功能函数实现字符串…...
数据分析之Pandas(1)
3.Pandas 文章目录3.Pandas3.1 Pandas基本介绍3.1.1 Pandas的基本数据结构3.1.1.1 Pandas库的Series类型3.1.1.2 Pandas库的DataFrame类型DataFrame初始化DataFrame查看数据3.1.2 Pandas读取数据及数据操作行操作添加一行删除一行列操作增加一列删除一列通过标签选择数据条件选…...
17、江科大stm32视频学习笔记——USART串口协议和USART串口外设
目录 1、通信接口 2、 硬件电路 3、电平标准 4、串口参数及时序 5、USART简介 6、USART工作 (1)写操作 (2)读操作 (3)帧头和帧尾的添加和除由电路自动执行 (4)硬件数据控制…...
leetcode:有效地括号
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都…...
四等分list
Testpublic void s (){ int targ 4; List mList new ArrayList(); List<List> mEndList new ArrayList<>(); for (int i 0; i <34; i) { mList.add(“item” i); } // System.out.println(mList.toString()); if (mList.size() % targ ! 0) { for (int j …...
php连接sqlserver数据库
docker 安装sqlserver数据库sudo docker pull mcr.microsoft.com/mssql/server:2017-latestsudo docker run -e "ACCEPT_EULAY" -e "MSSQL_SA_PASSWORD<YourStrongPassw0rd>" -p 1433:1433 --name sqlserver --hostname sqlserver -d mcr.microsoft.…...
The 2019 China Collegiate Programming Contest Harbin Site F. Fixing Banners
Problem - F - Codeforces 翻译: 哈尔滨,这个名字最初是一个满语单词,意思是“晒渔网的地方”,从松花江边的一个小农村居民点发展成为中国东北最大的城市之一。1898年,随着中国东部铁路的到来,这座城市首先…...
Maven的下载和配置
一、前言 一般按要求下载jar ,但是jar 包版本不好控制。有时候就会jar版本不同导致项目运行的结果也有差异,这样在团队开发中,在多个项目开发的是,jar包还要进行拷贝,可能也会出现版本还jar损坏的情况,所以一个能统一…...
服务高并发、高性能、高可用实现方案
服务高并发、高性能、高可用实现方案 软件开发的三高指标:高并发、高性能、高可用。 高并发方面要求QPS 大于 10万;高性能方面要求请求延迟小于 100 ms;高可用方面要高于 99.99%(4个9) 一、高并发: 高并发是现在互联网分布式框架设…...
uniCloud在线升级APP配置教程
app在线升级背景实现思路流程流程背景 因用户需要添加手机h5页面来进数据操作实现思路流程 实现流程图流程 相关文档:帮助文档 https://uniapp.dcloud.net.cn/uniCloud/cf-functions.html 注册服务空间 https://unicloud.dcloud.net.cn/pages/login/login uni升级…...
idea常用的快捷键
idea常用的快捷键Alt回车 导入包,自动修正CtrlN 查找类CtrlShiftN 查找文件CtrlAltL 格式化代码CtrlAltO 优化导入的类和包AltInsert 生成代码(如get,set方法,构造函数等)CtrlE或者AltShiftC 最近更改的代码CtrlR 替换文本CtrlF 查找文本CtrlShiftSpace 自动补全代码Ctrl空格 代…...
全志V85x硬件设计大赛作品精选第一期,快来Pick你心目中的最佳方案
1、V853-智能交互摄像头开发板 该参赛作品基于全志V853开发板制作的一款类似眼镜外挂的小产品,可以对场景进行辅助识别,并通过云端交互实现物联网控制,进一步实现物联网与人机交互的融合。 开发板配置了摄像头和小屏幕接口,并外…...
博客系统(界面设计)
✏️作者:银河罐头 📋系列专栏:JavaEE 🌲“种一棵树最好的时间是十年前,其次是现在” 目录实现博客列表页预期效果导航栏页面主体左右布局左侧区域右侧区域完整代码实现博客详情页预期效果导航栏 左侧右侧完整代码实现…...
素材要VIP咋整?看python大展神通
前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 再我们缺少素材的时候,我们第一反应 我们肯定会去网上寻找,但是!! 有的素材需要VIP!这可咋整呢? 看我利用python大展神通,采集某图网图片…...
[ vulnhub靶机通关篇 ] 渗透测试综合靶场 DC-1 通关详解 (附靶机搭建教程)
🍬 博主介绍 👨🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…...
软件测试文档编写步骤
编写软件测试文档是软件测试中非常重要的一部分。以下是编写软件测试文档的一些常见步骤: 1.明确软件测试的目标和目的:在开始编写软件测试文档之前,需要明确测试的目标和目的。这包括定义测试的范围,测试的目标和测试的优先级。 …...
重新认识下网页水印
使用背景图图片 单独使用 css 实现,使用 backgroundImage,backgroundRepeat 将背景图片平铺到需要加水印的容器中即可。 如果希望实现旋转效果,可以借助伪元素,将背景样式放到伪元素中,旋转伪元素实现: &l…...
Unity脚本练习
在C# 中 class 是创建类的标志,要创建类的话得现有class上面这个的逻辑是 类的访问权限, 关键字,类名以及类继承的父类在Unity中创建一个脚本或者添加一个组件,就相当于在Unity命名空间中创建了一个可以访问的类。这些类能够直接在…...
二十分钟带你了解JVM性能调优与实战进阶
ZGC 诞生原因 Java生态非常强大,但还不够,有些场景仍处于劣势,而ZGC的出现可以让Java语言抢占其他语言的某些特定领域市场。比如 谷歌主导的Android手机系统显示卡顿。证券交易市场,实时性要求非常高,目前主要是C主…...
对比应用层和内核层区别
一、所使用的空间不同: 应用层使用的空间是0-3G的用户空间。 内核层使用的是3-4G的内核空间。 二、打印信息所用函数不同: 应用层使用printf打印信息。 printf("打印信息\n"); 内核层使用printk打印信息。 …...
Hadoop服役新服务器
目录 0、准备一台新服务器 1、修改主机名 2、配置静态ip 3、配置xshell登录 4、关闭并禁用防火墙 5、分发hadoop和jdk文件 6、分发环境变量文件 7、source 环境变量 8、配置ssh 9、删除105节点的data、logs文件夹 10、单节点启动并关联到集群 11、验证新节点是否有效 0…...
YOLOv8详解 【网络结构+代码+实操】
文章目录YOLOv8 概述模型结构Loss 计算训练数据增强训练策略模型推理过程网络模型解析卷积神经单元(model.py)Yolov8实操快速入门环境配置数据集准备模型的训练/验证/预测/导出使用CLI使用python多任务支持检测实例分割分类配置设置操作类型训练预测验证…...
Visual Studio Code 1.76 发布
欢迎使用 Visual Studio Code 2023 年 2 月版,其中一些亮点包括: 配置文件 - 活动配置文件徽章,通过命令面板快速切换配置文件。辅助功能改进 - 新的音频提示,改进的终端屏幕阅读器模式。可移动的 Explorer 视图- 将资源管理器放…...
Vulnhub靶场----3、DC-3.2
文章目录一、环境搭建二、渗透流程三、思路总结一、环境搭建 靶场下载地址:https://download.vulnhub.com/dc/DC-3-2.zip kali:192.168.144.148 DC-3.2:192.168.144.151 更改驱动器连接设置: 二、渗透流程 1、信息收集nmap -T5 -…...
Windows电脑密码忘记解决方法
目录 背景 方法一 方法二 方法三 方法四 方法五 背景 个人电脑忘记了密码,无法登录用户界面。 方法一 1. 开机时常按 F11,如果是Win10一下系统,就常按 F8,知道出现一下图状 2. 选择疑难解答,再选择高级选项 3.…...
网站被收录后又被提出了/东莞网站建设市场
工欲善其事,必先利其器。职场上亦是如此。Excel报表想要做得完美,首先肯定Excel要精通。做一份Excel报表,如果涉及到金额,当金额比较大,单位到底是用元还是万元,经常是大家纠结的一个问题。我们今天就来介绍…...
建设门户网站费用/公司营销网站建设
1. 远程连接linux(用Xshell) ssh 用户名服务器的ip ssh s18192.168.235.128 普通用户登录后系统的提示符:$ root用户登录后系统的提示符:# ssh rootip -p port 制定端口号 exit 退出用户登录 2. 查看服务器ip地址 ip addr ifconfig ens33: 网卡名3. 盘符…...
高校网站一般采用什么网页布局/互联网怎么赚钱
电脑A ip :192.168.1.186 电脑B ip :192.168.1.1 用电脑A 去链接电脑B的本地数据库 1.互相 ping 看能否访问 如图 (判断是否在一个局域网) 2.给电脑A授权创建用户 电脑B操作 允许用户myuser从ip为 192.168.1.186 的主机连接到mysql服务器&a…...
建个企业网站对公司宣传有用吗/手游推广渠道平台
golang开源项目如今已经狂奔了10年, Google的Go编程语言无疑已经名声大噪。 Go轻巧且易于编译,由于其慷慨的库和抽象可简化并发和分布式(读取:云)应用程序的开发,因此引起了广泛的关注。 但是,…...
网站建设交接协议书/站长工具seo综合查询官网
关联博客:《kubernetes/k8s CRI 分析-容器运行时接口分析》 《kubernetes/k8s CRI 分析-kubelet创建pod分析》 之前的博文先对 CRI 做了介绍,然后对 kubelet CRI 相关源码包括 kubelet 组件 CRI 相关启动参数分析、CRI 相关 interface/struct 分析、CRI…...
广州自助网站推广制作/企业官网seo
内联汇编使用“__asm”(C)和“asm”(C和C)关键字声明,语法格式如下所示,内联汇编支持大部分的ARM指令,但不支持带状态转移的跳转指令,如BX和BLX 指令 __asm("instruction[;instruction]&q…...