我想请你花一点时间想象一个软件工程中令人头疼的问题,那种能让程序员整晚在天花板上苦思冥想解决方法的问题。我知道我提出了一个工程师的问题,但我也把这篇文章写给非程序员的人看。如果你愿意跟随我的思维实验,你可能在思考类似折叠盒子或保持量子计算机一致性的难题。在你思维的工坊里,有一个需要专业技能的工作,已经被复杂性困扰。这确实描述了软件开发中常见的困境,但根据我的经验,情况常常是,一个非常常见的障碍恰恰是完全不同的问题。
我一直把这些障碍称为“最小选项问题”,尽管我并不一定坚持这个名字。这些问题是让人困惑的问题,不是因为它们涉及到复杂得难以理解的系统,而是因为这些系统简单到让人难以置信。我说的是程序从特定路径的文件夹中加载时,能够在 Windows 资源管理器中看到该文件夹,但却收到一条错误消息说引用的位置不存在。或者你创建的游戏角色只能向左转而不能向右转,尽管两个方向使用相同的移动方式。
量子计算机和折叠问题非常复杂,但有很多地方可以检查螺丝是否拧紧。如果你试图用一行代码保存到目录,但代码不工作,还能检查什么呢?在处理折叠时,需要吸收大量资料,例如拓扑理论和语言文档。对于旋转悖论,有一些基本的三角函数知识,但一旦掌握了控制俯仰的基本函数,还有什么需要查的呢?
注意,我称这些为“最小选项问题”,而不是“无选择问题”。如果你觉得自己已经没有选择了,那么说明你可能还没有考虑到问题的某个方面,而通常,解决方法是你可以实施的事情。构建软件而不是硬件的一个甜蜜回报就是,软件及其组成部分更容易获取。如果出了问题,你可能不需要在车库中造一个疯狂装置或从台湾进口控制单元。你可能只需要下载一个插件或在键盘上输入正确的信息。
为了知道你需要复制还是创建什么,你可能需要跳出常规思维。这往往是初入3D引擎领域的程序员必经之路。在大多数3D图形中,所有东西都是由极小的三角形构成的,有时我们需要计算这些三角形中一个的垂直线,比如说它看起来像这样:
这一条线称为“法线”,比如,知道它是很有用的,因为它可以让我们知道光线如何从三角形上反射出来。[1]我们可以通过从三角形的两边分别标记为A和B边,并通过以下操作来计算法线:[2]
这里表示 A 和 B,A 和 B 可以是任何值
但我们如何实现这个运算呢?不清楚怎么乘边,除非你知道这个诀窍,否则尝试的话,你不会得到表面法向量。还能尝试什么呢?看起来没什么好尝试的,因为可供探索的内容不多;你只有两个向量和一个乘法操作符。妙处在于,想到有人可能会在方程中间写“×”,但并不是指乘法。细心的读者可能已经注意到我在使用“×”而不是“x”。在这里,答案是,为了得到表面法向量,你需要使用一个特殊的操作,即叉积,用“×”表示叉积,而不是用“x”表示乘法。对我来说,这总是感觉像一个非常狡猾的陷阱,尤其是对于初学者图形程序员而言。尤其当你的学习材料中的“×”符号使用了非典型的字体或者手写时,这个陷阱就更难被发现了。
即使你已经学会了这个区别,线性代数仍然可能让你再次感到抓狂。很久以前,我在抄写一些二维图形的零碎玩意儿时,发现那些形状像是被一只特别愚蠢的猴子画出来的。我几乎要疯了,拼命想找出问题所在,直到我意识到其中一个本应使用乘法的方程却用了向量积。怎么说呢?我当时精疲力尽,而且在那之前刚刚处理过向量积。
让我们来讨论另一个最小选项问题:臭名昭著的Ubuntu bug #255161。我知道你们现在在想什么。Ubuntu打印机Bug?这听起来像是某种会吐纸的甲虫!但这不是。让我们查看一下launchpad.net上一个2008年的帖子,发帖者是“adrianb”,他平淡地询问了一个打印机错误。那天尝试从OpenOffice打印时,Adrian发现墨水无法喷出。打印机就像是上帝派来惩罚我们的,总是不时出问题。这种打印问题是最不可能引起他人注意的那种,而这个问题也自行消失了。对于软件开发之外的人来说,这个问题消失听起来像是走了运,但经历过几次磨练后,你会意识到,如果一个bug神秘消失了,它可能会在未来再次出现。然而,试图解决这个bug时,你会发现又遇到了另一个最小选项问题。如果你的机器上没有这个bug,你该如何研究它?答案是尝试重现这个bug,但如果你不知道是什么导致了这个问题,你又如何确保能再次触发它呢?
其他人在 adrainb 的帖子中也报告了同样的问题,却发现该问题时有时无,就像打地鼠游戏般忽隐忽现。面对极简选项造成的困境,绝望情绪可能会出现,你可能会开始考虑一些不切实际的答案。在 Adrian 发帖六个月后,用户 paddy-stevepaine 告诉 adrianb,他妻子抱怨周二无法打印,并暗示他们可能遭遇了同一种问题。然而,这些计算机专家们已经尽职尽责地尝试了其他打印机,使用了不同的程序,并向 OpenOffice 反馈了问题,但这些都没有解决问题,接下来他们还能怎么办呢?好吧,我们总是依赖的基础软件套件就是操作系统:你的 Windows,你的 Mac 等。对于 Adrian 来说,他基本上使用的是 Ubuntu。这是一款和 Windows 或 MacOS 一样享有盛誉的操作系统,这就好比说微软或苹果在代码中搞砸了基本的打印功能,是在侮辱他们。
如果几乎不可能是Ubuntu背后的工程师犯错,或者打印机会在周二莫名其妙地坏掉,然后在周三自愈,那么解释是什么呢?解释是,操作系统和日历中的错误都是真实的。超过一年的时间里,Ubuntu存在一个故障,即如果那天是周二,OpenOffice尝试打印时,操作系统会错误地将打印命令识别为其他类型的数据。当你排除了不可能的因素,剩下的无论多么不可思议,就是事实了。
但愿你永远不会面对诅咒般的星期二或恶搞礼物的数学符号,但这些例子是为了传达这样一个信息:即使看起来毫无选择余地,创新思维也能开辟新思路,你以前从未认真想过。谢谢阅读。
备注- 表面法线简介 由Unity员工(日期不详,2025年2月23日访问),Unity官方文档。
- DATA — 表面法线 由Brian R. Johnson(2014年4月),TAPESTRY:表现与抽象的艺术的介绍。
文中相关部分链接了其他相关来源。