The Subjective Charms of Objective-C


Objective-C’s objects, meanwhile, were adorned with all caps prefixes that proudly identified their creator. Some bore household names, like the button to log into another service with yourTwitter account (TWTRLogInButton), or the add friends from Facebook popup (FBFriendPickerViewController). By the time I learned Objective-C, NeXT hadn’t existed for over 15 years, but code from their NeXTSTEP operating system was so ingrained in Apple’s products that its prefix appeared in dozens of objects and functions I used everyday—NSDictionary, NSArray, NSString, NSLog.

Objective-C is wordy—arguably excessively so—and this proclivity soon crept into my own outlook. How could an engineer tell a computer exactly what to do without using lots of words? How could a language be universally expressive without being maximally specific? Objective-C’s loquaciousness was not outdated—it was an ethos worth striving for, no matter how much it hurt my wrists.

The Aging Giant

The first and only software engineering job I had (before eventually leaving to the squishier world of technology policy) was developing iPhone apps for an Aging Giant of Silicon Valley. The company had been white-hot shortly after the dial-up internet era, but missed several tech booms since then, and in 2013, was determined not to miss the latest craze: mobile apps.

The app I worked on was only a few years old, but already, its codebase told the company’s whole history with unflinching honesty in rambling lines of Objective-C prose. Distinct prefixes gave away which code had been inherited from acquired startups, and revealed a bitter conflict over switching analytics platforms. Ornate function names told of product pivots and the defunct popup screens they left behind.

But the longer I spent writing Objective-C, the more I felt it hid rather than revealed. Long, sentence-like function names buried the most pertinent information under a fog of dependent clauses. Small features required long-winded pull requests, making it easy for engineers to get distracted during reviews and miss bugs. Objective-C’s excess words, multiplied across thousands of files and millions of lines of code, made for an exhausting codebase.

Soon enough, my affection for Objective-C’s “more is more” theory of self-expression disappeared completely. As the codebase expanded, its web of objects grew into a tangled thicket of convoluted relationships that bred mysterious, untraceable superbugs. The buzz of messages between objects rose to a cacophony, and the bulk of my job became figuring out what object sending what message to whom made the app crash or the goddamn settings screen look so ugly.

Barely a year and a half into writing Objective-C professionally, I was already having a crisis of faith. I became a software engineer to chase the exhilarating power of turning words into images on a screen, but those words had gone from empowering to burdensome. Even Objective-C’s prefixes, which I once felt told an enchanting story, felt decadent—why did I have to type “NS” hundreds of times a day to pay homage to Steve Job’s long-defunct startup? I was not alone: Mac and iPhone developers everywhere were frustrated with being forced to use this ancient, prattling language. Apple, as it turns out, was ready for change, too. I, however, was not.

Death and Rebirth

Leibniz first wrote about characteristica universalis in his doctorate thesis when he was 19 and worked on it for nearly 50 years until shortly before his death at 68. He reimagined the idea of an “alphabet of human thought” countless times, taking inspiration from mathematics, symbolic logic, hieroglyphics, musical notes, astronomical signs, and the four elements (earth, air, fire, and water). As his knowledge of the physical and metaphysical worlds grew, Leibniz had to continually reconceptualize what it meant to build a system that perfectly reflected the universe.

Programmers, in their pursuit of ever more expressive and efficient code, undergo similar rebirths. When the shortcomings of a particular coding language become clear, a new reactionary language hyper-fixated on solving those problems rises, until it too becomes hegemonic, and the cycle continues. The accepted tenets of what make for expressive code evolve and change alongside technological advancements, leading programmers to become linguistic nomads.


Leave a Reply

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