Press "Enter" to skip to content

为什么编写有用的软件总是困难的

我之前的两篇文章都在讨论有效与高效的软件工程的区别,以及它与偶然与必要复杂性的关系。我对人工智能如何改变编程行业在未来几十年的发展非常好奇,但我对短期内任何被炒作过度的预测持批评态度。人工智能不会设计出在数十年内仍然有价值的软件。这才是真正困难的问题。它可以帮助我们更高效地完成工作,但在有效性方面表现不佳。

不如说它更像是一份靠不住的工作。有效性意味着构建正确的东西。一种符合我们人类利益、不会伤害我们的东西。自动驾驶汽车,它们被设计成不会与其他车辆或行人相撞,但最多也只是不可靠的。制定保障措施相对容易,但实施起来却异常困难。而且问题愈发复杂。一旦我们路上有了数百万辆这样的车,每天都会有一些车必须在两个坏选择之间做出生死抉择。机器需要在瞬间和热感情脱离的情况下判断什么对其他人来说是最好的。它会认为多数的需求胜过个人的需求。当涉及这类存在性决策时,我们应该坚定地掌握主导权,塑造我们想要的机器未来。

现有的人工智能更擅长处理效率改进。它可以替换备选方案,权衡它们的相对优劣,并提出导致最高效解决方案的组合。但它越聪明,我们就越不应该将其用于需要判断的有争议的话题。因为事情可能会变得可怕。尼克·博斯特罗姆(Nick Bostrom)著名的“回形针最大化者”(paperclip maximizer)是一个有趣的思想实验,带有重要的警示意义:人工智能将优化你所指令的任何事物。如果做回形针刚好是其中之一,而且它无限强大且无限无私,它将剥夺整个星系的金属来制作更多无用的文具。

即使人工智能变得有自我意识,无论是否带有黑暗议程,它仍然是外来的,并且根据定义,并不像人类一样(它在“人工”这个词中)。艾萨克·阿西莫夫(Isaac Asimov)曾预言,一个具有个体行为能力的人类创造物应该有一些硬性保障措施。他的“机械三定律”(three laws of Robotics)比ENIAC机器提前了三年。但他无法预测到哪个邪恶的天才会通过一次“狡猾的固件升级”(sneaky firmware upgrade)为“不造成伤害”原则添加一些私人例外,就像第一部《机械战警》电影中一样。

够了,不要再沉湎于“宝石”。我预测(并不和任何主要利益相关)的是,编程的艺术将转变为清晰明确地表达需求的艺术。开发人员将成为精通人工智能的业务分析师,习惯于与人工智能对话,使用最高级的编程语言,即英语。它们将始终构建可用的软件,如果我们幸运的话,甚至有用。

光有可运行的软件还不够好

奇怪的是,“敏捷宣言”要求有可运行的软件。好像有问题的软件是可以接受的替代品一样!要求即时生成的代码也是有用的和有价值的也许是要求太高了。工作软件和有价值的软件之间的差距很大,因为价值是难以捉摸和难以预测的。完全合格的软件可能会因为不可抗力而失去其价值,并且没有任何升级可以修复。以下是一些例子。

这并不是我第一次提到被遗忘已久的OS项目Chandler了。Scott Rosenberg在他2007年的书《编码中的梦想》中讲述了它一路走来到1.0版本的艰辛历程。这是一个永恒的提醒,即最好的意图,一支由顶级开发人员组成的团队,以及慷慨的赞助商(Mitch Kapor,创造了Lotus 1-2-3)并不能保证成功。

Chandler 是一个致力于成为 Microsoft Outlook 和 Exchange 的免费替代方案。它承诺提供与众不同的用户体验。它将颠覆我们处理信息、日程安排和待办事项的方式。而且它打算通过点对点协议在桌面应用中实现。权力属于人民!

但是团队在他们的架构路线图中犯了太多错误。就像伊卡洛斯一样,他们过于接近太阳。世界赶上了他们。更强大的浏览器功能使基于 Python 的桌面应用成为一个糟糕的选择。廉价且易于托管自己的服务器消除了点对点协议的必要性,而这个设计选择引发了一连串的意外复杂性。现在,如果社区愿意,所有这些问题都可以得到解决。但事实并非如此。根本问题在于用户体验。这些想法太过激进。它们并不是普通办公人员所需要的。我还没有看到其他产品中实现它们的情况(但我很乐意纠正)。人们仍然像在1995年那样使用邮件和日程安排,只是现在他们在手机上使用,并且没有斜面角落。

GWT 的非计划性过时

有时一个伟大的工具会因为它最初的独特卖点不再具有销售价值而过时。2006年,Google Web Toolkit(GWT)提出了一个引人注目的建议。桌面计算机具备足够的计算能力来支持浏览器作为应用平台。你可以在无需安装任何东西的情况下完成税务处理。但是浏览器之间的不兼容问题非常严重,尤其是对于高级功能,如拖放或双击。GWT 允许你在同一个项目中编写后端和前端代码,并共享用于数据传输和验证的对象,然后将它们部署在单个 Web 归档中。GWT 将 Java 编译为 JavaScript,你甚至可以使用本地开发服务器调试客户端的 Java 代码。我喜欢它,并在一段时间内赚了不少钱。

但是编译的代价很高。浏览器供应商解决了它们自身的怪癖。像 Angular 和 React 这样的前端平台迅速成熟起来。构建前端成为一项严肃的职业,这些开发者似乎并不排斥 JavaScript 作为编程平台。GWT 失去了其相关性,AI 无法预见或修复这个问题。问题不在于代码,而是与周围世界的不匹配。

为了编程而编程

顺便说一句,这并不应该让你放弃写代码。严肃软件没有必要在商业上有效,也没有任何实际的收益。我说的是业余的开源项目。我写过一些令我自豪的软件,但它们没有商业计划,没有路线图,除了我自己的教育和娱乐之外没有其他动机。它们在教会我新的概念方面非常有效,但我对我的“狗食”没有丝毫兴趣。GitHub 上有许多这样的项目。我无意冒犯。我是从个人经验说起的。编程只是为了编程,并没有什么问题,但这就像是在一个从不面向观众演出的乐队中演奏:难以持续下去。

Leave a Reply

Your email address will not be published. Required fields are marked *