《软件开发与网络经济:迈向零缺陷的未来》

软件开发的新视角:从产品到生产流程

在当今逐渐崭露头角的网络文化中,我们所创造的越来越多的东西——当然也是越来越多的财富——都与符号处理流程紧密相连。这些流程依靠的是代码而非实物。日本人对软件有着独特的见解,他们把软件视为一个生产流程而不是单纯的产品。这一观点犹如一盏明灯,照亮了软件开发领域新的思考方向。

C. K.曹大师的理念

软件可靠性大师C. K.曹曾向业界人士发出警示,不要将软件仅仅看作产品,而要将其视为一个便携式的工厂。当我们交付给客户一个程序代码时,实际上就如同给予他们一座可以随时制造出答案的工厂。这就意味着我们的任务不仅仅是编写出一段代码,而是要构建出能够稳定、高效地生产出零缺陷答案的“工厂”。就像建造生产完美可靠器件的工厂一样,创建这样的软件“工厂”也需要遵循特定的方法论。

零缺陷设计流程的独特之处

传统的软件编制通常包含三个中心化的关键步骤:首先是设计一个全景图,然后用代码实现细节,最后,在项目接近尾声时进行整体测试。然而,在追求零缺陷质量的设计流程中,整个过程发生了根本性的改变。它不再是几个大的关键步骤,而是被分散成上千个小步骤。这种分散化的工作模式仿佛是一个精密的机械系统,每个小工作间就像是一个小齿轮,每天都有成百个小工作间里的人员忙碌着各自的任务。

小循环工作模式

在这个体系下,“公司里的每个人都有一个客户”成为一种概括网络式经济的口号。这里的客户往往是你的工作伙伴,你需要像销售商品一样,将你负责的那个小循环(设计 – 编写 – 测试)做好后交付给他们。一旦工作成果被交付,你的工作伙伴会立刻对其进行检测,并及时反馈其中的错误信息,让你能够迅速修改完善。从某种程度上来说,软件这种自下而上的发展过程与罗德尼·布鲁克斯提出的包容结构有着异曲同工之妙。每个小步骤就像一个小的代码模块,确保自身正常运行,然后再叠加和测试更复杂的层级,就像搭建积木塔一样,每一块积木都要稳固才能继续往上搭建。

错误管理与防错机制

单靠这些小步骤并不能保证得到零缺陷的软件。“零缺陷”的目标背后蕴含着一个关键的概念区分。所谓的缺陷是指那些已经被交付出去的错误;而在交付之前被修正的错误则不被视为缺陷。根据新乡重夫的观点:“我们无法避免错误的发生,但我们有能力阻止错误变成缺陷。”因此,零缺陷设计的核心任务在于尽早发现错误并尽快改正错误。

Poka – Yoke防错系统

日本人在防错领域的经典发明是Poka – Yoke防错系统。这个系统就像是为人们的工作流程穿上了一层防护衣,使其对所犯的错误具有“免疫力”。例如,在装配线上设置一些巧妙简单的装置就可以防止错误的发生。像在放螺栓的托盘上为每一个螺栓设定特别的孔位,这样操作人员就能通过观察托盘上是否有剩余螺栓来判断是否漏装了一个螺栓。在软件生产中,类似的防错设计如“拼写错误检查器”,它可以阻止程序员输入任何拼写错误或非法命令。随着技术的发展,软件研发人员现在拥有越来越多非常精巧的“自动纠错程序”软件,用于在编写过程中检查程序,预防典型错误出现。还有顶尖级的研发工具能够对程序逻辑进行分析和评价,当逻辑错误一出现就将其清除。据一家软件业交易杂志报道,目前市面上有近百种检错和改错工具可供选择,其中最精致的一种就像优质的拼写检查软件一样,能为程序员提供合乎逻辑的改错选择。

模块化的重要性

除了上述的防错措施外,对复杂软件进行模块化也是一种非常重要的防错方法。1982年发表在IEEE《软件工程汇刊》上的一项研究表明,在其他条件相同的情况下,代码总行数相同的程序拆分为子程序后,错误数量会有所减少。例如,一个1万行的程序如果是一整块的话会有317个错误,而如果把它拆分为三个子程序,虽然代码总行数仍然是1万行,但错误数却减少到265个。这表明,尽管模块化不能完全解决所有问题,但它是一种有效的手段。进一步来说,当程序小到某个阈限以下时,甚至可以达到完全没有错误的状态。IBM为IMS系列编写的代码就是以模块化方式编制的,其中有3/4的模块达到了完全没有缺陷的状态。具体而言,在425个模块中有300个完全没有错误,而在剩下的125个有错误的模块中,超过一半的错误集中在仅仅31个模块上。从这个意义上说,程序的模块化就是程序的“可靠化”。

面向对象编程(OOP)的魅力

在软件设计领域,目前最热门的前沿是面向对象的软件。一个面向对象的程序(OOP)实际上是一个相对去中心化、模块式的程序。对于OOP来说,它的每个“碎片”都是一个独立且保持自身完整性的单元,可以与其他OOP“碎片”整合在一起形成一个可分解的指令结构。这种“对象”的概念限制了程序漏洞可能造成的损害。与传统程序不同,OOP有效地对功能进行了隔离,将每个功能限制在一个可控的单元内。这意味着即使一个对象崩溃了,程序的其他部分仍然能够继续运转,而传统程序如果一个地方出现问题,整个程序就会崩溃。程序员可以像更换汽车刹车片一样换掉坏掉的单元。此外,软件销售商还可以购买或者销售各种预先编制好的“对象”库给其他软件研发人员,后者基于这些库里的对象可以快速组装起大型软件,而不需要重新一行一行地编写新代码。到了需要升级这种大型软件的时候,只需要升级旧的对象或者加入新的对象即可。

OOP中的对象特性

OOP中的“对象”就好比乐高积木玩具中的小块,不过这些小块可能还带有一些微小的智能。一个对象可以类似于苹果电脑显示器上的文件夹图标,它知道自己是一个文件夹,并且能够响应程序要求所有文件夹列出内容清单的请求。OOP也可以是一张税表、某个雇员在公司的数据库或者某封电子邮件信息。这些对象清楚自己能做什么不能做什么,同时也在与其他对象进行横向交流。这种面向对象的程序使软件具备了中等程度的分布式智能,就像一个分布式存在的生态系统一样,具有一定的抗错性,能够通过删除对象实现快速修复,并且可以通过有效单元的组装实现扩展。

错误扎堆现象与质量管理

前面提到,在IBM的代码中有31处错误,而包含这些错误的模块充分体现了软件的一个特性——错误总是扎堆出现。我们可以利用这个特性来达到质量管理上的希格玛精度。《零缺陷软件》这本书指出:“你发现的下一个错误,极有可能出现在你已经找出了11个错误的模块里,而那些从未出过错误的模块,则可能会一直保持不败金身。”这种错误扎堆现象在软件中如此普遍,以至于被当作一条“魔鬼定律”:当你发现一个错误时,也就意味着还有另外一堆你没看见的错误在等待被发现。

《零经》中提到的补救方法是:不要浪费资源在错误百出的代码上,应该抛弃它!因为重写一段代码的代价与修补一个错误百出的模块的代价相差无几。如果软件的某个单元的错误率超过了某个阈限,就应该把它扔掉,另找一个开发人员来重写代码。如果正在编写的代码显示出某种容易出错的倾向,也应该放弃它,因为在前期出现错误就意味着后面还将不断出错。

应对软件复杂性的挑战

随着软件复杂性的迅速增加,在最后关头对其进行详细检测变得不可能。由于它们是非连续的系统,总会隐藏着某些诡异的个例或者致命的响应,其被激活的几率可能只有百万分之一,无论是系统化的测试还是抽样测试都无法发现它们。而且,尽管统计抽样能够告诉我们是否有出错的可能,却无法确定出错的位置。新生物学为我们提供了应对这种挑战的思路,即用一个个可以正常工作的单元来搭建程序,并在搭建过程中不断地进行检测和修正。然而,即便底层单元没有漏洞,在搭建过程中仍然可能发生意料之外的“突现行为”(即漏洞)。不过,我们现在可以在更高一级的层面上进行测试,因为底层单元已经被证明是没有问题的,所以是有希望做到“零缺陷”的,这比同时应对突现问题和深埋问题的情况要好得多。

关于零缺陷的不同声音

泰德是一位靠发明新的软件语言谋生的人,他是面向对象程序语言的先行者,曾经编写过SmallTalk和HyperCard,现在正在为苹果电脑研发一种“直接操作”式语言。当我问及苹果的零缺陷软件时,他只是简单地说:“我认为是有可能在产品化的软件中达到零缺陷的,譬如说你正在写的又一款数据库软件。只要你真正明白自己在干什么,就可以做到没有任何错误。”但是泰德也表示,他永远都不会认同日本那种软件作坊的做法。他说:“一个好的程序员可以对任何一个已知的、规律的软件进行重写,巧妙地减少代码。但是在创造性编程过程中,没有什么东西是已经被完全理解的。你不得不去编写自己也不太明白的东西……嗯,你是可以写出零缺陷的软件,但它会有好几千行超出所需的代码。”

自然界也是如此,它通过牺牲简洁性来换取可靠性。科学家们研究小龙虾尾部神经细胞时发现,这种回路是多么令人震惊地臃肿和丑陋。只要花点功夫,他们就能设计出一种紧凑得多的结构。然而,尽管小龙虾的尾部回路比实际需求冗余很多,但它却是不会出错的。零缺陷软件的代价就是它的“过度设计”,超量建设,多少有点浮肿——永远不会处在泰德和他的朋友们经常逗留的那种未知的边缘。它是用执行效率来换取生产效率。

我曾经问诺贝尔奖得主赫伯特·西蒙如何让零缺陷哲学与他的“满意化”概念相兼容。他笑着说:“哦,你可以去生产零缺陷的产品。但问题在于你是否能够以一种有利可图的方式来生产它?如果你关心的是利润,那么你就得对你的零缺陷概念进行满意化处理。”这又一次体现了在复杂性面前做出妥协的问题。

网络式经济的特点

网络式经济的未来在于设计出可靠的流程,而不是可靠的产品。与此同时,这种经济的本质意味着这种流程是不可能最优化的。在一个分布式的、半活性的世界中,我们的所有目标只能被“满意化”,而且这种满意也只能保持很短的一瞬。也许一天之后整个形势就完全变化了,正所谓“乱哄哄,你方唱罢我登场”。

分布式核心

公司的边界变得模糊。任务,甚至是财务和制造这样的核心任务,都通过网络分包给合同商,他们再进一步分包出去。所有的公司,无论规模大小,都变成了由所有权和地理位置都分散的工作中心组成的社会。例如,一家小型创业公司可能将部分业务外包给全球各地的专业团队,从而实现资源共享和成本降低。

适应性技术

在现代商业环境中,如果不能达到“实时”要求,企业就面临被淘汰的风险。条形码、激光扫描仪、手机等技术设备以及先进的配送货车等都在操控着商品生产。生菜的价格如同机票价格一样,在杂货店货架的液晶屏上闪烁变化着。这种即时性不仅提高了企业的竞争力,还满足了消费者对快速响应的需求。

灵活制造

如今,需求量较少的商品可以利用更小的机器在更短的周期内生产出来。过去,照片冲洗需要在全国少数几个中心花费数周时间完成,而现在则可以在街边的小机器上立等可取。模块化的设备、消失的常规库存以及计算机辅助设计使得产品研发周期从几年缩短到几周,大大提高了生产的灵活性和效率。

批量化的定制

流水线上生产的产品都是个性化定制的。例如,适合当地气候的汽车、按照用户习惯设定的录像机等都是按照个人特定需求生产的,但却是按照大批量生产的价格销售的。这种批量化的定制不仅满足了消费者的个性化需求,还为企业带来了更大的市场份额。

工业生态学

闭合回路、无废料、零污染的制造业以及可拆解回收的产品正在逐步成为主流。向生物兼容技术过渡的趋势也越来越明显。人们对违背生物学准则的行为越来越难以容忍,这促使企业在生产过程中更加注重环境保护和可持续发展。

全球会计

即使是小型企业也在某种程度上具有全球性。地理上不再存在未开发的、未知的经济“前沿”。竞争格局从传统的“零和游戏”转变为“正和游戏”,只有那些能够把系统看成统一整体的玩家才能获得回报。结盟、伙伴关系、协作——即使是暂时的甚至是矛盾的,也将成为行业根本和规范。

共同进化的消费者

公司培训和教育消费者,而消费者又反过来培训和教育公司。在网络文化中,产品变成了可改进的连锁经营店,它随着消费者的不断使用而不断改进和进化。例如,软件升级和注册就是一个典型的例子。公司成为共同进化的消费者的俱乐部或用户群。如果一家公司不能教育和培训消费者,也就无法从消费者那里学习到有价值的信息。

以知识为基础

联网的数据让所有工作都能更快、更好和更容易地完成。然而,数据是廉价的且大量充斥在网络上,甚至让人感到厌烦。真正的优势体现在如何运用知识对数据进行解读上。将知识运用到数据上才是无价之宝,例如通过对市场数据的深入分析制定精准的营销策略。

免费的带宽

接入网络是免费的,但接入与不接入的选择却非常重要。你可以在任意时刻给任意人发送任意东西,但选择给谁发送、发送什么以及何时发送,或者选择在什么时候接收什么则需要仔细考虑。选择不接入什么成为了关键决策点。

收益递增

拥有者、给予者、分享者以及先到者都能从网络效应中受益。一个网络的价值增长速度要超过其用户增加的速度。在非网络经济中,一个公司增加10%的客户可能带来10%的收入增长,但对于网络化的公司来说,增加10%的客户可能会带来20%的收入增长,因为新老客户之间的互动是呈指数增长的。

数字货币

数字货币正在逐渐取代传统的纸币,成为日常使用的支付手段。所有的账户都是实时更新的,这提高了资金流动的效率和安全性。

隐性经济

创造性的前沿和边缘区域得到扩展,并以一种不可见的方式联结到加密的网络中。分布式核心和电子货币是驱动这种隐性经济的力量。然而,这也可能导致不规范的经济活动四处萌芽,需要建立相应的监管机制来加以约束。


总之,软件开发朝着零缺陷的目标迈进的过程中,融合了许多创新的理念和技术手段。而网络经济的发展趋势也为各行各业带来了前所未有的机遇和挑战。在这个充满活力的时代,我们需要不断探索和创新,以适应不断变化的市场需求。

发表评论

人生梦想 - 关注前沿的计算机技术 acejoy.com