当120吨重的航天飞机坐在近400万磅火箭燃料的包围下,喷出有毒的烟雾,明显不耐烦地反抗重力时,它的机载计算机起到了指挥作用。四台相同的机器,运行相同的软件,从数千个传感器中提取信息,做出数百毫秒的决定,对每一个决定进行投票,每秒相互检查250次。安装了不同软件的第五台计算机待命,以便在其他四台计算机出现故障时进行控制。
在T-6.6秒,如果压力、泵和温度是额定的,计算机就会命令点燃航天飞机的主引擎-三个引擎中的每一个恰好相隔160毫秒点火,成吨的过冷液体燃料涌入燃烧室,飞船在发射台上摇晃,只有螺栓才能固定在地面。当主引擎的推力达到一百万磅时,它们的排气就会变成蓝色的火焰菱形。
然后,也只有在T-0秒,如果计算机对发动机正常运转感到满意,他们就会发出点燃固体火箭助推器的命令。在不到一秒的时间里,他们就获得了660万磅的推力。就在同一时刻,计算机发出了爆炸螺栓的命令,450万磅的航天器雄伟地离开了发射台。
这是一次令人惊叹的硬件能力展示。但没有人按下按钮来实现这一点,也没有宇航员操纵操纵杆将航天飞机送入轨道。
正确的东西是软件。该软件发出命令,对主引擎进行万向节,执行航天飞机在离开塔楼后不久所做的戏剧性的腹部翻滚。该软件对发动机进行节流,以确保飞机不会加速太快。它跟踪航天飞机的位置,命令固体火箭助推器离开,进行微小的航向修正,大约10分钟后,将航天飞机引导到100英里以上的轨道。当软件对航天飞机在太空中的位置感到满意时,它会命令主引擎关闭-开始失重,一切都开始漂浮。
但这款软件做了多少工作并不是它的非凡之处。它的不同寻常之处在于该软件运行得非常好。这个软件从来不会崩溃。它永远不需要重新启动。这个软件没有错误。它是完美的,就像人类所达到的那样完美。考虑一下这些统计数据:程序的最后三个版本-每个420,000行-都只有一个错误。该软件的最后11个版本总共有17个错误。相当复杂的商业程序将有5000个错误。
这个软件是260名男女在休斯顿东南部德克萨斯州克利尔湖的约翰逊航天中心街对面的一座匿名办公楼里开发的。他们为洛克希德·马丁公司太空任务系统部门下属的“机载航天飞机集团”工作,他们的实力举世闻名:航天飞机软件集团是世界上仅有的四家获得联邦政府软件工程学院(SEI)令人垂涎的5级排名的公司之一,这是一项衡量他们工作方式的复杂性和可靠性的指标。事实上,SEI基于其标准的部分原因是观察机载航天飞机小组的工作。
这个团队写的软件之所以这么好,是因为这就是它必须要做的事情。每次它启动航天飞机,他们的软件就控制着一台价值40亿美元的设备,控制着六名宇航员的生活,控制着这个国家的梦想。即使在太空中最小的误差也可能产生巨大的后果:在轨道上的航天飞机以每小时17,500英里的速度飞行;一个仅导致三分之二秒的计时问题的错误会使航天飞机偏离航线3英里。
美国国家航空航天局(NASA)知道这个软件必须有多好。在每次飞行之前,机上航天飞机小组的高级技术经理泰德·凯勒(Ted Keller)都会飞往佛罗里达州,在那里他签署了一份文件,证明该软件不会危及航天飞机。如果凯勒不能去,一条正式的继承线规定谁可以取代他的位置。
过去22年来一直致力于太空飞行软件的比尔·佩特(Bill Pate)[/url]表示,该团队明白其中的利害关系:“如果软件不完美,我们一起参加会议的一些人可能会死去。
在人类科技史上,没有什么比软件变得如此重要。
几乎所有的东西-从国际货币体系和主要发电厂到搅拌机和微波炉-都运行在软件上。在办公楼里,电梯、灯、水、空调都是由软件控制的。在汽车里,变速器、点火正时、安全气囊,甚至门锁都是由软件控制的。在大多数城市,红绿灯也是如此。几乎每一份比明信片更复杂的书面交流都依赖于软件;每一次电话交谈和每一次隔夜包裹递送都需要软件。
“这就像前苏美尔文明,”布拉德·考克斯(Brad Cox)说,他是乔治梅森大学(George Mason University)教授,为史蒂夫·乔布斯Next Computer编写软件。“我们构建软件的方式正处于狩猎-采集阶段。”
爱达荷大学(University Of Idaho)软件工程师兼计算机科学教授约翰·芒森(John Munson)就不那么慷慨了。“洞穴艺术,”他说。“这是原始的。我们应该教计算机科学。这里根本没有科学。“。
软件可能会为后工业化世界提供动力,但软件的创造仍然是工业化前的贸易。根据SEI的研究,近70%的软件组织停留在SEI复杂程度的前两个级别:混乱和略好于混乱。形势如此严峻,来自微软等公司的几位软件先驱已经离开,开始教授软件创作的艺术(参见“Drop and Code Me 20!”)。
SEI技术协会的高级成员马克·保尔克(Mark Paulk)表示,软件的成功使其弱点变得更加戏剧性。他说:“我们已经开发出极其复杂和强大的软件产品。我们严重依赖它,“鲍尔克说。“然而,每个人都抱怨软件有多么糟糕,有所有的缺陷。如果你买了一辆有5000个缺陷的车,你会很不高兴的。“
在这片软件沼泽中,机载航天飞机群脱颖而出。十年前,航天飞机群被认为是世界级的。从那时起,它已经将自己的错误率降低了90%。
要做到这一点,机上的穿梭班组必须非常不同-与通宵工作、披萨和滚轴曲棍球软件程序员截然不同,他们已经抓住了公众的想象力。要做到这一点,机上航天飞机团队必须非常普通-与任何专注、纪律严明、管理有条不紊的创意企业没有什么区别。
事实上,该组织提供了一套教科书课程,通常同样适用于程序员,特别是程序员和制作人。看一看他们建立的文化和他们完善的流程,就会发现如果软件要实现其承诺,软件编写必须成为什么样子,并说明几乎任何基于团队的运营都可以做些什么来提高其性能,以获得近乎完美的结果。
“航运地狱今天还在继续。磨,磨,磨。我们永远也赶不上了。我已经说过了吗?为什么我们总是低估我们的船期?我就是不明白。上午9:30进来;晚上11:30出去吃晚饭。还有三杯健怡可乐。“。
不,不是机上班车。这是道格拉斯·库普兰(Douglas Coupland)的“小农奴”(Microserf‘s),一部逼真的虚构故事,讲述了软件快车道上的生活。这是软件开发界的主导形象:X世代人穿着T恤,神情恍惚,在太少的时间里挤进了太多英雄代码编写的时间;溜冰鞋和山地自行车被塞在角落里;披萨盒和星巴克杯子被丢弃在会议室里;砸南瓜、阿拉尼斯·莫里塞特(Alanis Morrisette)和逃亡者(Fugees)的决斗曲调。这个世界因Sun Microsystems、Microsoft和Netscape的故事而出名、浪漫,甚至不可避免。
这不是机上航天飞机小组的故事。他们的宿舍是白领步行者的书房。最引人注目的是他们看起来是多么的普通。除了偶尔的一些穿梭纪念品,你可以在任何小公司或政府机构的办公室里。每个人都有自己的小办公室,办公室里有桌子、个人电脑和稀疏的个人物品。人们穿着讲究的衣服去上班,整洁但不浮华,当然也不肮脏。
严格来说,这是一种8点到5点的地方--有熬夜的情况,但他们是例外。程序员很紧张,但很低调。他们中的许多人要么为IBM(在1994年之前一直是穿梭集团的所有者)工作多年,要么直接开发穿梭软件。他们是成年人,有配偶和孩子,他们的生活超越了他们非凡的软件程序。
这就是一种文化:机上航天飞机小组生产成人软件,他们的方式是通过成人来做到这一点。这可能不性感,也可能不是编码自我之旅--但这是软件的未来。当你准备好迈出下一步时--当你不得不写出完美的软件而不是仅仅够好的软件时--那么就是时候长大了。
48岁的泰德·凯勒(Ted Keller)是该组织的高级技术经理,看起来和听起来都像一所小型私立高中的校长。凯勒的工作是确保软件按时交付,发挥其所有功能,而不考虑地盘之争。他身材矮小,秃顶,有点爱管闲事,有点吹毛求疵,这是任何宇航员都会感到放心的品质。他有一种温和、极客的幽默感,与其说是与外人打交道,不如说是与他的人群打交道。
它是在软件小组成员和NASA同行之间的一次会议上公布的。会议在一间挤满了22人的小会议室里举行,还有一台投影仪。有几次,在房间后面,凯勒对代码传递的速度或某些规格的细节发表了嘲讽的评论,房间里顿时笑声四起。
除此之外,长达一小时的会议是清醒的,发人深省的,是了解文化的短暂窗口。首先,房间里的22个人中有12个是女性,其中许多是高级经理或高级技术人员。机上航天飞机群以其稳定性和专业性,似乎对女性程序员特别有吸引力。
另一方面,这是一种有条不紊、细节分明、有条不紊地重复的练习。这次会议是美国国家航空航天局(NASA)的经典表演--为几周后几乎完全相同的会议进行排练。它包括遍历一个巨大的数据包和视图,这些数据和视图逐行描述软件的进度和状态。除了凯勒偶尔的旁白,他的语气是公事公办的,几乎是正式的,视图图形以他们能读到的速度飞快地闪过,缩略词、图表和图表的模糊不清。
这里正在进行的是一种具体的工作,它定义了追求团队完美的动力-一种对自我驱使的能人非常不能容忍的动力。在航天飞机集团的文化中,没有超级明星程序员。整个软件开发方法都是有意设计的,不依赖于任何特定的人。
文化也同样不能容忍创造性,个人编码的繁荣和风格是通宵软件世界的标志性特征。“人们问,这个过程不是扼杀了创造力吗?凯勒说:“你必须严格按照手册上说的去做,而且有人在你身后看着你。”“答案是,是的,这个过程确实扼杀了创造力。”
而这正是问题的关键-你不能让人们自由选择驾驶宇宙飞船的软件代码,然后,在人们的生命依赖它的情况下,一旦它进入轨道,就试图给它打补丁。“休斯顿,我们有问题了”可能会成为一部好电影;这不是写软件的办法。“人们必须将他们的创造力引导到改变过程中,”凯勒说,“而不是改变软件。”
团队实践的严格约束会让摇滚乐软件界的诱惑难以抗拒。34岁的奎恩·拉森(Quinn Larson)去年1月离开公司,前往爱达荷州博伊西的美光科技(Micron Technology)工作,自动化微米内存芯片的制造,当时他已经在航天飞机软件方面工作了7年。
在美光,拉森的任务是将锯子自动化,将成品晶片切割成合适的尺寸。搞砸了程序,你就毁了有价值的晶片。
“该做什么由我决定,”拉森说。“没有开会,也没有记录。”他获得了自由,这是一次真正的打击。但在拉森看来,文化并没有关注于,嗯,正确的东西。“速度是最重要的,”他说。“工程师们会说,这些是我们的首要任务,我们需要尽快拿到它们。”但拉森得到的印象是,工程师们似乎并不太关心完成的软件实际工作得有多好。“基本上,他们想要的是快速软件--只要把它扔到门外就行了。”
拉森于8月中旬回到航天飞机小组工作。“这里的人都是最优秀的,”他回到克利尔湖的第一天说。
答案是,这是一个过程。该团队最重要的创造不是他们编写的完美软件,而是他们发明的编写完美软件的过程。
这个过程让他们过上正常的生活,设定他们实际达到的最后期限,保持预算,交付完全履行承诺的软件。正是这个过程定义了这些住在休斯顿东南部平坦平原上的程序员所知道的,软件界的其他每个人都还在摸索的东西。这一过程为任何一个创意企业提供了一个模板,这些企业正在寻找一种方法来产生始终如一的质量-并不断提高-质量。
1.产品的好坏取决于产品的计划。在机载航天飞机小组,大约三分之一的软件编写过程发生在任何人编写一行代码之前。美国国家航空航天局(Nasa)和洛克希德马丁公司(Lockheed Martin)的团队在新代码应该做的每一件事上都达成了最细微的一致-他们把这种理解写到了纸上,就像通常在蓝图中发现的那样具体和精确。未经双方同意和谅解,规格中的任何内容不得更改。如果没有仔细描述更改的规范,任何程序员都不会更改一行代码。以软件升级为例,允许航天飞机使用全球定位卫星导航,这一更改只涉及程序的1.5%,即6366行代码。这一变化的说明书长达2500页,比一本电话簿还厚。当前程序的规格填满了30卷,运行了40,000页。
“我们的需求几乎是伪代码,”为NASA管理软件项目的威廉·R·普鲁特(William R.Pruett)说。他们说,你必须这样做,完全这样做,考虑到这个条件和这种情况。
爱达荷大学的约翰·芒森说,单是这个仔细的设计过程就足以让航天飞机组织本身达到一流水平。大多数组织甚至在启动大型项目时,都没有像蓝图一样详细地计划软件必须做什么。因此,在程序员已经开始编写程序之后,客户正在忙于更改其设计。其结果是混乱、成本高昂的编程,即使在设计代码时,代码也会不断更改,并受到错误的影响。
“大多数人选择把钱花在这个过程的错误一端,”曼森说。“在现代软件环境中,80%的软件成本都是在第一次写完软件之后花掉的--他们第一次就做不对,所以花时间兜售。在航天飞机上,他们第一次就做对了。如果不改变蓝图,他们不会改变软件。这就是为什么他们的软件如此完美。“。
2.最好的团队合作是健康的竞争。在软件组中,有子组和亚文化。但在其他组织中可能引发分裂的办公室政治实际上是这一过程的关键部分。
中心组分为两个关键团队:编码员-坐下来编写代码的人-和验证者-试图找出代码中的缺陷的人。这两个组织分别向老板汇报,并在相反的行军命令下运作。开发团队应该交付完全没有错误的代码,非常完美,测试人员根本找不到任何缺陷。测试小组应该用飞行场景和模拟来猛烈抨击代码,尽可能多地揭示缺陷。结果就是汤姆·彼得森所说的“友好的敌对关系”。
“他们在竞争谁来发现错误,”凯勒说。“有时他们像猫和狗一样打架。开发人员希望捕获他们自己的所有错误。验证者发疯了,‘嘿,放弃吧!你在占用我们测试软件的时间!';“。
开发人员甚至已经开始了他们自己的正式的代码检查,他们希望这是一次严格的校对,希望能让测试人员感到困惑。反过来,验证者争辩说,他们甚至在开始测试之前就发现了一些错误,这是值得称赞的。“从验证小组的角度来看,”高级经理帕特·麦克莱伦(Pat McLellan)说,“我们意识到,如果没有独立的验证小组,开发人员往往会更加松懈。光是我们这群人的出现,就让他们更加小心翼翼。“。
这种友好竞争的结果是:航天飞机小组现在在正式测试开始之前就发现了85%的错误,在项目交付给NASA之前发现了99.9%的错误。
3.数据库是软件的基础。这就是软件。然后是软件下面的数据库,两个巨大的数据库,它们的全面性是百科全书式的。
一个是代码本身的历史-每一行都有注释,显示每次更改、为什么更改、何时更改、更改的目的以及详细说明更改的规范文档。程序中发生的一切都记录在它的主历史中。每行代码的系谱-它之所以是这样的原因-可以立即提供给每个人。
另一个数据库-错误数据库-是机上航天飞机小组开展工作方式的一种纪念碑。这里记录了近20年前在编写或使用该软件时所犯的每一个错误。对于这些错误中的每一个,数据库都会记录发现错误的时间;显示错误的命令集;发现错误的人;发现错误时正在进行的活动-测试、培训或飞行。它跟踪错误是如何引入到程序中的;错误是如何设法滑过在每个阶段设置的过滤器来捕获错误的-为什么在设计期间没有捕获到它?在开发检查期间?在验证过程中?最后,数据库记录错误是如何纠正的,以及类似的错误是否可能从相同的孔中溜走。
该组织积累了大量关于其工作方式的数据,以至于他们编写了模拟代码编写过程的软件程序。就像计算机模型预测天气一样,编码模型预测团队在编写软件的每个新版本时应该犯多少错误。一如既往,如果编码员和测试人员发现的错误太少,每个人都会进行这个过程,直到现实和预测相匹配。
“我们从不放手,”高级经理帕蒂·桑顿(Patti Thornton)说。“我们做的恰恰相反:我们让一切都困扰着我们。”
4.不要只是修正错误--首先修正任何允许的错误。
这个过程是如此普遍,任何错误都会受到指责-如果软件中存在缺陷,
..