【转】没有完美的软件:编程永远不容易

最近读了一篇文章 Software Runs the World: How Scared Should We Be That So Much of It Is So Bad?,这篇文章没什么可说,但是评论却很有趣,特别是很多计算机科学的博士表示,使用一些规范的方法,可以让软件变的更好,还有规范、认证、授权。

对于这些想法,我只能说“祝你好运”。我干码农干了30年,我可以很肯定的说“没有银弹”,没有神奇的方法或者论文可以保证让软件变得完美,没有bug。

事实上,我们甚至很难定义一个程序,就更别提如何开发一个完美的程序了。软件在太多领域存在,有太多的编程语言,业务需求,还有运行环境,并且要和各种不确定的系统交互。你觉得你的iPhone 游戏,股票交易系统,烤面包机还有火星登陆器有什么共同之处吗?你觉得给汇编,C,Java,PHP,Fortran,LIST和 Erlang 颁发证书可行吗?还有各种混合语言 web 应用,以及分布式系统。

你需要正式的描述太多的东西,光列出所有的编程语言似乎就不可能,更不用说如何用这些语言写出完美的程序了。

我喜欢人们拿程序和社会工程对比。建造一座桥的基础在过去的两千年中没有改变过:你需要考虑重力,风力,下雨以及炎热还有很多基本的材料。这些东西罗马的工程师就知道了。但是编程不一样,我们为每个程序创造一个独立的世界,或者说我们把各种世界元素整合在一个世界中,然后在这个世界中建造几百座不同的桥,它们要同时良好的工作,还要考虑到我们创造的世界会不可预知的改变。

还有,我们造一座桥需要经过几年的规划和建造,然后使用几十年,上百年而不用进行任何修改。而软件在一直的变化当中,不管是在开发的时候还是开发完以后。美国在过去的两百年间建造了60万座桥。但是过去五年中我们就创造了一百万个 iPhone 的应用。应用程序可以从几行到几千万行代码,并且在现代生活的每一个角落存在。

让编程如此困难的原因是它无处不在,可以影响一个人或者10亿人,可以运行几十年或者只需要运行一次。它跟造桥完全不一样。最近的火星登陆器是用几百万行C代码写的,并且只运行一次。而高速股票交易系统一秒钟就要被执行无数次。

认为世界上存在一套标准的方法可以让你保证开发的程序是完美的这种想法很可笑。即使这种完美的奇迹存在,它的开销也会让它无法实际实施。好吧,你可以证明一段代码没问题,但是它运行在哪里呢?你能控制操作系统吗?还是其他公司提供的WebService 接口?你不能控制用户的交互,你也不能控制CPU,那么你如何保证这段完美的代码可以完美的运行?

我宁愿相信你发明了时间机器也不愿意相信你的标准流程可以在这个混乱的世界行得通。

另外一个“善意的谎言”是我们可以通过标准的测试和认证来证明一个程序员可以编写完美的代码。程序员不是管道工,管道工和水,管道,气体还有阀门打交道。这些东西几乎不会改变。它们遵循物理规律,是经过认可的科学,它们不会莫名其妙的变成另外一个东西。

我认识一个程序员通过了各种 Java 认证,但是还是没有能力编写实际的应用程序。想象一下,要为一个人进行所有语言的认证,所有程序的认证,从面包机到宇宙飞船。要么你创造一些非常基础而无用的认证,或者非常细节的认证而没有人在乎。考虑到所有这些,还有不断变化的需求,当你需要开发一些新东西的时候你怎么办?把所有人炒了,然后雇佣新的人?

我在工作中和一位 UX 设计师一起培训一组 Java Web 程序员开发 iOS 程序。即使一个有经验的开发者突然做一些不一样的开发也是很困难的。但是假如我们一定坚持要正规的流程和经过认证的iOS 程序员才能在市场上竞争,那么我们可能已经关门了。

我们三个人花了两个月时间开发了一个新的 iPhone 应用。我们只有不断快速的迭代开发才能在不断变化的需求和竞争中胜出。期望一个正规的流程在发布前验证所有的代码是噩梦。在产品发布几年后公司可能都不存在了,谁有在乎这个程序是否被认证过呢?

现实是残酷的。30多年的编程经验,可以让我非常自信的说我写的代码还不错。在 1987-1994 年间,我领导开发并且要最终敲定发布的二进制码。我们通过软盘的形式发布了三个 Mac 应用,11个主要版本,没有一次大的事故(要知道每次发布的硬件成本就是100万美元)。我们发布的代码很完美吗?我们是经过认证的 Mac OS 开发者/设计师吗?不是!但这些应用解决用户的问题了吗?是的。

我说的这些能证明任何东西吗?不能。但是好的代码确实存在,并且常常出自没有证书,没有学历,没有被证明过的程序员之手。

也许有一天机器人可以代替人来开发软件,并且保证不出错。人类就可以幸福的生活在完美的软件创造的世界中了。

但是我更相信时间机器会先出现。并且软件是由人类编写的。