开发软件,或建造迷宫 | Piglei

前段时间,我通关了一个三十多年前的老游戏:《塞尔达传说:织梦岛》。

《织梦岛》是久负盛名的塞尔达传说系列的第四部作品,发售于 1993 年,平台为 Game Boy——任天堂在 1989 年推出的风靡全世界的游戏掌机。

用今天的眼光看,《织梦岛》的游戏画面简陋得吓人。举个例子,游戏的分辨率极低,仅为 160×144,换算下来像素面积不到 iPhone 17 屏幕的 1%。不过,技术过时并未过多损害游戏的可玩性。这部诞生于上世纪的作品,用极具想象力的道具和迷宫,打造出了一个引人入胜的小岛,玩起来依然妙趣横生。

正因如此,在发售后的第 26 年,《织梦岛》在任天堂最新的游戏主机 Switch 上迎来了一次重制。

为了迎合现代玩家,新版《织梦岛》完全重做了游戏画面,不再是 2D “大果粒”,而是全高清的卡通风 3D 建模。游戏操作也得到现代化升级,道具切换变得更为便捷。最重要的一点,在于新版几乎 1:1 复刻了原版的大地图和迷宫,也就是说,在游戏性方面(迷宫、道具及探索),重制版几乎原汁原味继承了几十年前的配方。

你肯定想问:对于这样一部已三十岁高龄的换皮老游戏,玩家会买单吗?答案是肯定的。Switch 上的《织梦岛》一经推出,销量超过六百万份,直接跻身“塞尔达传说”史上销量最高的作品之一。

我相信,作为史上最成功的电子游戏之一,《织梦岛》一定可以给游戏从业者许多启发。但就像你所知道的,我并不开发游戏,我所从事的是更为无趣的那一类稀松平常的软件开发。即便如此,我仍然从《织梦岛》的故事中获得了一些启示。

大约 40 年前,弗雷德里克.布鲁克斯(Frederick P.Brooks, Jr.)发表了一篇名为《没有银弹》的论文,如巨石投入湖面,这篇论文在软件行业里引起了轩然大波。文章中,布鲁克斯把软件开发中的问题分为两大类:根本问题和次要问题,复杂度的来源也可按这两个维度来划分。

什么是根本复杂度,原文中如此描述:

一个相互牵制关联的概念结构,是软件实体必不可少的部分,它包括:数据集合、数据条目之间的关系、算法、功能调用等等。这些要素本身是抽象的,体现在相同的概念构架中,可以存在不同的表现形式。尽管如此,它仍然是内容丰富和高度精确的。

“牵制关联的概念结构”“相同的概念构架”“内容丰富和高度精确”——每段描述都可以用在塞尔达传说里的迷宫上;而如何管理根本复杂度,是软件开发中最困难的部分:

我认为软件开发中困难的部分是规格化、设计和测试这些概念上的结构,而不是对概念进行表达和对实现逼真程度进行验证。如果这是事实,那么软件开发总是非常困难的。天生就没有银弹。

我很久之前就读过《没有银弹》,但当时只能说似懂非懂。随着经验增长,我对“两种复杂度”的理解虽有加深,但仍有模糊之处。不过,在打通了《织梦岛》这款几乎与我同岁的老古董游戏后,我有了一些新想法。

一款软件的根本价值,取决于它是否很好地解决了根本问题。用开发游戏《织梦岛》类比,根本问题在于如何打造出一款引人入胜的塞尔达游戏。为此,游戏设计师和程序员们,需要精心打磨游戏里的每一个道具能力、迷宫中的每一个机关,正是它们构建起了《织梦岛》这款游戏软件的根本价值。在这之外,游戏画面是否美观、操作手感是否流畅——这些问题当然也重要,但并不根本,只是次要。

最关键的点在于,一款软件的根本价值并不随着时间褪色,只要做得足够好,这些价值可以支撑软件跨越几十年的时间周期,持续带来可观的回报。

毋庸讳言,大模型和各类 Agent 工具的发展已经对软件开发行业产生了巨大冲击。前沿模型每月都在更替,Agent 的软件开发能力也在以周为单位持续进化。仅凭一行提示词,品质惊人的精美软件在几分钟内就能由 Agent 开发出来。《没有银弹》已经成为过去式,人们开始奔走相告:AI 就是软件开发的银弹。

但事实果真如此吗?我认为,AI 确实为软件开发的部分环节带来了前所未见的效率提升,但是,软件开发的根本问题依然存在,根本复杂度也从未消失。现在,你大可以打开你最爱的编程 Agent,让它开发一款新的塞尔达游戏,我相信三十分钟内你就可以得到一款可玩的“作品”。但作为一款塞尔达游戏来说,它足够好玩吗?有多少玩家会愿意掏出钱包为它买单?

从某种角度看,每个软件都是《织梦岛》。开发《织梦岛》的根本复杂度源于如何设计出一座座引人入胜的迷宫,而对于其他软件,设计“迷宫”的挑战同样无处不在。程序员最重要的工作,就是调度海量的组件、模块和函数,用虚构的概念构建起规模庞大的迷宫。 一些例子:

  • Git:一座入口写着“分布式版本控制”,内部由 branch、rebase、merge 构建起的迷宫;
  • Kubernetes:一座入口写着“声明式”,内部由 Deployment、Operator 构建起的迷宫;
  • Chrome:一座用标签页、密码管理器、插件机制构建起的迷宫;

和《织梦岛》相比,其他软件的区别仅在于,迷宫并不是供游戏玩家探索和解密的关卡,而是供软件用户和开发者们探索或修缮的居所。

我相信,在不远的将来,《织梦岛》或许会再次重制,任何软件也都可能被更快、更好、内存管理更安全的某种编程语言重写,但《织梦岛》中的每个迷宫会永远存在下去,软件里的每个由虚拟概念组成的“迷宫”也会同样存续。

我也同样相信,就像 Agent 无法独自开发出《塞尔达传说》,优秀的软件也同样无法在缺少人类掌舵的情况下全自动生长出来。软件开发的未来,或许在于把专属于人类的每一滴创造力,都毫无保留地投入到“迷宫建造”中。愿我们关注每一个概念,对探索迷宫的玩家们感同身受;愿我们在“根本问题”上毫不妥协,创造出能跨越时间存在的深度价值。

世上只有一个《织梦岛》,世上还有无数个“织梦岛”。

😊 如果你喜欢这篇文章,也欢迎了解我的书: 《Python 工匠:案例、技巧与工程实践》 。它专注于编程基础素养与 Python 高级技巧的结合,是一本广受好评、适合许多人的 Python 进阶书。