WIRED

Objective-C 的主观魅力

这种冗长的编程语言曾经感觉像是一种通用的交流方式,直到它不再是。

Image may contain Computer Hardware Electronics Hardware Screen Monitor Computer Pc Box TV and Lab

摄影: Getty Images

保存这篇文章

在发明了微积分、精算表和机械计算器,并创造了“所有可能世界中最好的世界”一词后,Gottfried Leibniz 仍然觉得他一生的工作是不完整的。从孩提时代起,这位 17 世纪的博学家就梦想着创造一种他称之为 characteristica universalis 的东西——一种完美地代表所有科学真理的语言,并且可以像写语法正确的句子一样容易地做出新的发现。这种“人类思想的字母表”不会留下任何虚假或含糊不清的地方,Leibniz 将为此工作直到生命的尽头。

Leibniz 的梦想的一个版本今天仍然存在于编程语言中。它们并不代表物理和哲学宇宙的全部,而是代表了仅次于它的东西——构成计算机内部状态的不断翻转的 1 和 0(二进制,也是 Leibniz 的另一项发明)。有足够勇气或疯狂的计算机科学家去构建新语言,追逐他们自己的 characteristica universalis,一种可以让开发者编写出极富表现力的代码的系统,让 bug 无处藏身,并具有足够的自明性,从而使注释、文档和单元测试变得不必要。

但是,表达能力当然既与个人品味有关,也与信息论有关。对我来说,正如青少年时期听 Countdown to Ecstasy 巩固了我对 Steely Dan 的一生热爱一样,我对编程语言的品味也受到了我自学的第一种语言——Objective-C 的最大影响。

认为 Objective-C 类似于形而上学的神圣语言,甚至是一种好的语言,就像说莎士比亚用猪拉丁语欣赏是最好的。Objective-C 充其量是两极分化的。它因其无情的冗长和奇特的方括号而受到嘲笑,仅用于构建 Mac 和 iPhone 应用程序,如果不是因为一段不太可能的历史巧合,它本应在 1990 年代初逐渐消失。尽管如此,在我 2010 年代初在旧金山担任软件工程师期间,我多次发现自己在 SoMa 的小酒吧里或 HackerNews 的评论中为它最繁琐的设计选择辩护。

Objective-C 在我最需要它的时候来到了我身边。当时我是一名即将升入大学四年级的学生,发现自己对计算机科学的兴趣太晚了,无法主修它。作为一个成年人,我有资格喝酒,我眼睁睁地看着青少年在入门级软件工程课程中把我团团转。智能手机才刚刚开始普及,但我意识到我的学校没有提供任何移动开发课程——我发现了一个利基市场。那个夏天,我从一个名为 The Big Nerd Ranch 的牛仔主题丛书系列中学习了 Objective-C。我第一次在大屏幕上编写代码,并看到它点亮了我手中的小屏幕上的像素时,我深深地爱上了 Objective-C。它让我感受到了无限自我表达的令人陶醉的力量,并让我相信我可以创造任何我可能想象的东西。我偶然发现了一种真正通用的语言,并且喜欢它的方方面面——直到我不再喜欢它。

命运的转折

Objective-C 出现在面向对象编程时代的狂热早期,而且按理说,它本不应该活过那个时代。到 1980 年代,软件项目变得过于庞大,无法由一个人甚至一个团队单独开发。为了使协作更容易,Xerox PARC 的计算机科学家 Alan Kay 创建了面向对象编程——一种将代码组织成可重用的“对象”的范例,这些对象通过相互发送“消息”进行交互。例如,程序员可以构建一个 Timer 对象,该对象可以接收诸如 start、stop 和 readTime 之类的消息。然后,这些对象可以在不同的软件程序中重用。在 1980 年代,人们对面向对象编程的兴趣如此之高,以至于每隔几个月就会出现一种新语言,并且计算机科学家认为我们正处于“[软件工业革命](https://www.wired.com/story/objective-c-programming-language-verbose/https:/wiki.c2.com/?SoftwareIndustrialRevolution。”的边缘。

1983 年,International Telephone & Telegraph 的软件工程师 Tom Love 和 Brad Cox 将面向对象编程与流行的、可读的 C 编程语言的语法相结合,创建了 Objective-C。两人创办了一家短暂的公司来许可该语言并销售对象库,在公司倒闭之前,他们赢得了一个客户,该客户将拯救他们的创造物免于默默无闻:NeXT,这家计算机公司是 Steve Jobs 在被赶出 Apple 后创立的。当 Jobs 在 1997 年凯旋返回 Apple 时,他带回了 NeXT 的操作系统——以及 Objective-C。在接下来的 17 年里,Cox 和 Love 的创造物将为世界上最具影响力的科技公司的产品提供动力。

十几年后,我结识了 Objective-C。我看到了对象和消息如何呈现出类似句子的结构,并用方括号标点,例如 [self.timer increaseByNumberOfSeconds:60]。这些不是简洁的海明威式的句子,而是冗长、华丽的普鲁斯特式的句子,在句法上很复杂,并且用像 scrollViewDidEndDragging:willDecelerate 这样的函数名唤起生动的图像。

Objective-C 的对象,同时,装饰着全大写的前缀,骄傲地表明了它们的创造者。一些人拥有家喻户晓的名字,例如使用您的 Twitter 帐户登录另一项服务的按钮 (TWTRLogInButton) 或来自 Facebook 的添加朋友弹出窗口 (FBFriendPickerViewController)。在我学习 Objective-C 时,NeXT 已经不复存在 15 年多了,但来自其 NeXTSTEP 操作系统的代码已经深深地融入了 Apple 的产品中,以至于它的前缀出现在我每天使用的数十个对象和函数中——NSDictionary、NSArray、NSString、NSLog。

Objective-C 是冗长的——可以说是过度冗长——而且这种倾向很快就蔓延到了我自己的观点中。如果没有使用大量文字,工程师如何才能准确地告诉计算机该做什么?如果一种语言不具有最大的针对性,它又如何才能具有普遍的表达能力?Objective-C 的喋喋不休不是过时的——无论它多么伤害我的手腕,它都是一种值得为之奋斗的精神。

衰老的巨人

在我最终离开进入更软性的技术政策领域之前,我的第一份也是唯一一份软件工程工作是为硅谷的一家衰老的巨头开发 iPhone 应用程序。这家公司在拨号互联网时代之后不久就火爆起来,但此后错过了几次技术繁荣,并且在 2013 年决心不错过最新的热潮:移动应用程序。

我参与开发的应用程序只有几年的历史,但它的代码库已经用漫长的 Objective-C 散文毫不留情地讲述了公司整个历史。不同的前缀暴露了哪些代码是从收购的初创公司继承下来的,并揭示了一场关于切换分析平台的激烈冲突。华丽的函数名称讲述了产品调整以及它们留下的已失效的弹出窗口屏幕。

但是,我编写 Objective-C 的时间越长,我就越觉得它隐藏了而不是揭示了。冗长的、类似句子的函数名称将最相关的信息埋藏在从句的迷雾之下。小功能需要冗长的拉取请求,这使得工程师很容易在审查期间分心并错过错误。Objective-C 的多余文字,乘以数千个文件和数百万行代码,构成了一个令人疲惫的代码库。

很快,我对 Objective-C 的“多多益善”的自我表达理论的喜爱就完全消失了。随着代码库的扩展,它的对象网络变成了一个错综复杂的混乱关系,滋生了神秘的、无法追踪的超级错误。对象之间的消息嗡嗡声变成了刺耳的声音,我工作的大部分变成了弄清楚什么对象向谁发送了什么消息导致应用程序崩溃或该死的设置屏幕看起来如此丑陋。

在专业编写 Objective-C 仅一年半的时间里,我已经经历了一场信仰危机。我成为一名软件工程师是为了追逐将文字转化为屏幕图像的令人振奋的力量,但这些文字已经从赋权变成了负担。即使是 Objective-C 的前缀,我曾经觉得它讲述了一个迷人的故事,现在也感觉颓废——为什么我每天必须键入数百次“NS”来向 Steve Job 长期倒闭的初创公司致敬?我并不孤单:各地的 Mac 和 iPhone 开发者都对被迫使用这种古老的、喋喋不休的语言感到沮丧。事实证明,Apple 也准备好改变了。然而,我却没有。

死亡与重生

Leibniz 在他 19 岁获得博士学位时首次写到了 characteristica universalis,并在接下来的近 50 年里一直从事这项工作,直到 68 岁去世前不久。他无数次地重新构想了“人类思想的字母表”的想法,从数学、符号逻辑、象形文字、音符、天文符号和四种元素(土、空气、火和水)中汲取灵感。随着他对物理和形而上世界的了解的加深,Leibniz 不得不不断地重新概念化构建一个完美反映宇宙的系统意味着什么。

程序员在追求更具表现力和效率的代码时,也会经历类似的重生。当某种编码语言的缺点变得明显时,一种新的反作用语言就会出现,过度专注于解决这些问题,直到它也变得霸权,并且这个循环继续下去。使代码具有表现力的公认原则会随着技术进步而不断发展和变化,从而导致程序员成为语言游牧民族。

Objective-C 的终结发生在 2014 年 6 月,当时 Apple 宣布推出 Swift,这是一种用于在所有 Apple 产品上构建原生应用程序的新编程语言。Swift 摆脱了 iPhone 和 Mac 开发者最讨厌 Objective-C 的地方:不再有方括号!不再有 NS!所有人的代码都很短、声明性!虽然仍然是面向对象的(函数式编程的崇拜尚未确立其主导地位),但 Swift 的自我表达理念与 Objective-C 的理念截然相反:冗长会隐藏含义,简洁会揭示真理。

尽管我对 Objective-C 越来越反感,但学习一门新语言的想法并没有让我感到兴奋,而且我知道我作为软件工程师的日子屈指可数了。我了解到,程序员的工作是永远追逐你的 characteristica universalis,尽管知道它将永远让你捉摸不透,就像 Leibniz 一样。我想追逐其他东西,并且会编写 Objective-C 直到我软件工程生涯的结束。

在我辞去在 Aging Giant 的工作并重返学校之前,一位最近毕业的计算机科学专业的学生加入了我的团队。他整个夏天都在学习 Swift,并且渴望从头开始重写我们的代码库。他穿着一件还没有被玷污的连帽衫,认为 Swift 是一种神圣的语言,在它的沟通中很干净。他恰好偶然发现了一种通用的表达形式,并且他可以做任何事情。