当下,千万行代码级别的软件俯首皆是,拿我们熟悉的操作系统而言,Windows Vista的代码行数达到了5000万行,Windows XP为3500万行,亿行级代码的应用程序也不再遥远。当计算机程序膨胀到几十亿行代码时,即使是维护程序、保持正常运行本身就会成为一个主要负担。有太多的经济活动和人的生命会依赖于这些程序,因此不能让它们有哪怕片刻的失效,可靠性和无故障运行时间将成为软件的首要任务。最近读书看到一个观点,说随着软件越来越大,软件自身的生存也越来越重要、越来越困难,要想在日复一日的使用中存活下来,就意味着必须能够适应和进化。“进化”这个生物学范畴的词,用在软件工程上,很是新奇,分享如下。
“进化”的观点认为,软件只有不断分析自己的状况、修正自己的代码以适应新的需要、净化自己,排除异常情况,并保持适应与进化,才能生存下来。计算必须有生命力和活力,可称之为“软件生物学”或“活力计算”。程序员即使24小时手机开机待命,也不能确保数十亿行的代码能够不出故障。人工进化也许是唯一能使软件保持生命力和活力的方法。
但进化是有代价的,要达成进化的效果,我们必须放弃某些控制。一个进化出来的活系统,如果发生故障了,没有人能够排除、解决,因为这个系统的运行机理是不可表述、没有被理解的,就应用软件而言,可能若干服务节点以一种错综复杂、相互依赖、相互影响的方式共同运行在一个局部网络中,没有人可以完全理解(这好像与现在微服务的理念相悖)。因此出问题时,大多数情况下只能依赖于它的自我修复。
当然,进化并不会完全超出人类的控制,放弃某些控制是为了更好的利用软件整体。现状我们在软件工程中引以为傲的东西----精密性、可预测性、准确性以及正确性,都将为进化所淡化。这些东西也必须被淡化,因为真实的世界是一个充满不测风云的世界,是一个千变万幻的世界,生存在这个世界里,需要一点模糊、松弛、更多适应力和更少精确度的态度。生命是无法控制的,活系统是不可预测的(一个具体的例子就是一瓶培养液,最终会生出哪些菌种,达到怎样的稳定态,是不能完全预测的)。“正确”是小系统的特性,在巨大的变化面前,“正确”将被“生存能力”所取代。说一个系统是正确的,更像是官话、空话,人们评判一个系统,是根据其对以外情况的反应力以及应对措施的创造性。与其正确,不如灵活,不如耐久,所谓“好死不如赖活着”。小而专且真确的程序就像蚂蚁,对身处的世界贸然无知,而反应灵敏的程序往往是失控的庞然大物,对其而言,可能只有1%的精力花在要解决的问题上,虽然不是最优,但足够管用。
对于进化而言,我们能控制的,是得到我们想得到的东西,但进化本身不是最简的,是冗余的行为,在创造出我们想要的东西的同时,是否会带来我们不想要的东西?这个是无法控制的,首先的一个实际问题就是没人能说清“不想要的东西”是什么,它可能是一个永远也列不完的清单。列都列不完,说都说不清的“黑名单”,从根本上就不具备可实施性。
这就是进化的交易,也是软件工程的未来。
网友评论