作者丨Vicki Boykis
译者丨王文刚
“我们对计算机的自信可能使我们犯错误,因为我们希望将现实世界都转化为代码。”
程序员有充分的理由感到自豪,因为其他人是无权进入数据库并更改的。世界越是依赖计算机定义,程序员的能力就越强。
实际上,没有什么代码是完美的代码,计算机也会经常犯错误。
当然,许多问题源于我们的程序员所做的假设,这些假设虽然在某些时候是正确的,但在根本上是不正确的。正如马克·吐温(Mark Twain)所说:“这不是让您陷入困境的原因,但是您肯定会知道事实。”
编程语言不同
曾经我们也满是理想,我们曾写过很长的项目启动宣言,然后向老板保证,这次,采用新的语言将改变一切,同时精彩的软件功能将从键盘上快速涌现,以至每个项目都将提前完工。
可是到了最后,我们将数据粘贴在变量中并编写一些 if-then 逻辑来对其进行测试,慢慢消磨了程序员的梦想。程序员在他们的代码中看到了结构的伟大之处,并梦想着从中消除所有的低效率。因此,他们称之为“脚手架”,“平台”或“框架”,他们希望所有内容都可以用代码来编写。哎,下一个任务又具有不同的代码结构。
最后,所有这些都是技巧和语法上的砂石。结构性消除了编码寿命的痛苦,直至其逐渐消失。计算机是由晶体管构成的,没有任何巧妙的标点符号和类型理论可以掩盖一个事实,即我们所有的代码都归结为像一点点掺杂的硅,选择在代码中向左或向右向下移动来优化,没有其他技巧可以逾越。
框架越来越好
也许您是因为对 Vue 中构建的页面不满意而在 React 中构建了一个新的 Web 应用程序?还是因为 WordPress 界面笨拙且过时,您将 Ruby 与一些由模板引擎构建的静态页面包装在一起?还是您将所有内容重写为更小、更新或更酷的产品,例如 Marko 或 Glimmer 或 Ghost?程序员一直在寻找完美的框架,但是像彩虹的尽头那样的完美的框架永远不会出现。
因此,当开发人员创建新框架来修补旧框架的问题并一路引入新问题时,我们会一遍又一遍地看到。如果框架添加了服务器端渲染,则会使服务器瘫痪。但是,如果一切都留给客户,他们就会开始放慢脚步。每个新功能都需要在时间、代码和网络带宽之间进行权衡。
null 可以接受
弄清楚如何处理空指针是现代语言设计的一个大问题。有时我认为我编写的 Java 代码的一半工作是在检查指针是否为 null。
某些语言使用问号检查 null 的方法会有所帮助,但这并不能解决问题。许多现代语言试图通过完全消除 null 来测试问题。如果编译器告警必须初始化每个变量,则永远不能设置为 null。
这一发现的乐趣在几行新代码中逐渐消失,因为数据结构经常存在信息的漏洞。人们将表单上的行留空、有时数据还不可用。然后,您需要一些谓词来确定元素是否为空。
如果元素是字符串,需要测试长度是否为零。如果在类型定义上花了足够的时间和精力,通常可以针对特定问题提出合乎逻辑的建议,至少在有人修改规范之前。完成几次后,你将开始希望得到一个简单的单词,表示一个 null。
计算机可以捕捉人的选择
性别选择代码问题对程序员来说是一个大雷区。计算机处理固定的选项列表和定义明确的菜单没有问题,但是需求人员不断更改规则,如一所非常前卫的学校也仅仅是在表单给出了两种性别选择。
计算机科学家从来没有真正解决过这类问题,他们只是添加了另一层间接寻址,在这种情况下,它是指向空字符串字段的指针,人们可以在其中填写自己的选择。然后,一些笑话出现,并选择“ his”作为代词,这使一些孩子发笑,另一些人则感到冒犯。
此设计失败模式一次又一次出现。如果您强迫每个人都使用名字和姓氏,那么有些人将只有一个名字。或者,有人不想被一串 Unicode 字符所认识。而且,如果有人为自己的姓名字符串选择了新的表情符号,但该表情符号未在列表框列出,该怎么办?
Unicode 代表所有文本编码协议
当委员会经常开会,试图确定哪些表情符号应包含在人类交流的标志符号的最终列表中。他们还会抛弃某些表情符号,从而否认某人的感受。
如果全世界都发现表情符号过于局限,促使他们转向将文字与文化偶像的图片混合在一起,那么任何表情符号列表都足够吗?
再就是表情符号字体的问题。一种字体看起来可爱的东西,在另一种字体中可能看上去晦涩而令人不舒服。
人类语言是一致的
开发人员提供的方法之一是在文本字段中供用户录入内容,注释部分是为人类编写的,很少由算法解释,因此它们不是问题的一部分。
真正的问题在于带有文本的结构化字段。当我的 GPS 希望我选择一条以 Johns 命名的道路时,它会告诉我“转入 Johns Road”。带撇号的道路名称也会使看到“圣约翰之路”拼写为“圣约翰斯”,“圣约翰约翰”,“圣约翰”,甚至是复数形式:“圣约翰”。美国邮局有一个规范的地址列表,没有多余的字符,并且维护着精心设计的算法,可以将任意随机地址转换为规范形式,这个非常赞。
时间在世界中是一致的
似乎时间一直在以恒定的速度流动,而且确实如此,所有人的理解时间是一致性。这不是计算机的问题,是人类弄乱了规则 。时间使程序员的生活变得令人讨厌,如您可能认为每天有 24 个小时,但最好不要马上就动手编写代码,前提假设的总是正确的。如果有人在美国东海岸起飞并在西海岸着陆,则这一天将持续 27 个小时,看起来是不是很令人抓狂。
时区仅仅是开始。
夏令时会增加和减少小时数,这个在每年某个变化的时间点都会这样做。如 2000 年美国这一转变发生在 4 月。今年,美国在 3 月的第二个星期日更改了时钟。同时,欧洲在三月的最后一个星期日移至“夏令时”。
如果您以为这样就可以了,那么您可能是一个厌倦了编写代码的程序员。亚利桑那州根本没有实行夏令时。但是,纳瓦霍族(Navajo Nation)是亚利桑那州的重要组成部分,并且确实改变了时钟,因为它是独立的并且能够自行决定这些事情 -- 修改夏令时,确实如此。
但是,等等,还有更多。如纳瓦霍人 (Navajo ) 在霍皮族国家(Hopi)内部拥有一块土地,这使得使用地理坐标来准确跟踪亚利桑那州的时间一致性变得更加困难。
文件是一致的
似乎记住数据应该是计算机可以做的事情。即使文件里面充满了许多逻辑、样式、数字或其他不一致之处,我们也应该能够恢复。但可能我们甚至都做不到这点。
每当我要求 Mac 检查文件系统并修复错误时,它总是会告诉我文件“权限错误”,它们会尽力为我修复文件错误。如果没有我的授权许可,该软件如何获得更改我的文件访问权限?
这只是文件系统无法实现用户和机器之间的紧凑关系的一个例子。任何程序员都会告诉您,还有数百种其他情况下文件不包含我们期望的内容。数据库公司确保能够以一致的方式读写数据,这个会给数据库公司带来巨额收入,没错,是这样的。即使那样,还是可能会出问题,如数据库高级顾问们会得到了额外的费用来修理已经过时的数据库表和恢复数据。
我们掌控一切
我们喜欢相信指令告诉计算机该怎么做。
对于没有编码能力的普通非编程的你来说,这肯定不是正确的,但是逻辑和算法代码对我们来说对的吧?不,我们都是无能为力者,如果你坚持要用机器给我们带来的一切,如操作系统由操作系统负责,它可能也不会让我们的代码获得执行计算的内容。
如果我们从头开始编译 Linux 内核,并仅安装经过我们审查过的代码该怎么办?那时我们当然可以全面控制。
首先,BIOS 在计算机上是第一个程序,如果 BIOS 出现故障,它可以隐藏地对代码进行微妙的更改。如果通过远程访问运行,则虚拟机监控管理程序将具有更大的权限,这个就出了你的掌控权限。
如果我们用自己的自定义引导程序替换 BIOS,可以吗?或许可以,但是您的计算机中仍然有许多固件程序需要替代, 如您的磁盘驱动器、网卡和视频卡等等。
不仅如此,您的 CPU 可能具有“隐藏的上帝模式”,可以让其他"特殊"指令执行。请不要在文档中寻找解释,因为那里没有解释。这些只是应该放在沙盒里的官方芯片的问题,也可能有人泄露了计划外芯片,它带有秘密隐藏程序。
即使是很小的拇指大小的驱动器也具有内置芯片,该芯片具有自己的代码来做出决定。所有这些嵌入式处理器都被发现藏有恶意软件。可悲的事实是,你办公桌下那个电脑主机的晶体管都没有向你报告这些意外情况。
写在最后
「逆锋起笔」专注程序员综合发展,分享Java、Python、编程技术资讯、职业生涯、行业动态的互联网平台,实现技术与信息共享,关注即送全网最新视频教程。