LEARNING TO PROGRAM

2010-2012

Since I was a young child, I was interested in the inner workings of computers. I had poked around a little with our Windows XP family computer, but because we all shared the one machine (including my parents), I wasn't free to really do much with it. That changed slightly when we got a MacBook Pro in addition to the PC. While exploring the contents of the Mac OS X Snow Leopard install DVD one Saturday morning, I discovered an installer for Xcode, the official development environment for Apple platforms.

Instantly, I found myself in over my head, yet the allure of being able to build something entirely custom, fully my own, was too great to ignore. I started trying to learn about programming, and the most approachable thing I found was the natural-language-inspired syntax of AppleScript. Meant for automating other software and barely capable of an interactive user experience, I bent the scripting language to my will and crafted my first "application": a key-value database whose UI was an endless series of dialog boxes like a phone menu and that stored information using the only data structures I knew how to manipulate: the titles of folders. It was a mess, but it did work.

That was obviously a dead end, yet I still had no idea how to write serious code. Next, I turned to the graphical programming environment of Quartz Composer. A node-based system designed for building interactive animations like transitions, screen savers, and so on, it operated in a manner that today I'd say is roughly similar to how compositing nodes in Blender work. It would be a decade before I would fully understand how node-graph programming was meant to be used, so in the meantime I figured it out my own way. I colored outside the lines yet again, building a hideously complex state machine to emulate basically the entire functionality of the Jeopardy scoreboard. The plan was to use it for a family game-show night, but sadly, I don't remember ever getting an opportunity for that. I didn't leave any notes for my future self on how to operate the thing either.

My parents bought me a textbook, and from that I finally started learning how to do this stuff properly. The book began with simple command-line programs written in C, then progressed into simple concepts of object-oriented programming before getting fully hands-on with the real contemporary tools for developing Mac applications: Objective-C, Interface Builder, and the Cocoa user-interface framework. By the time I had finished all the detailed tutorial projects in the book, I had everything I needed to begin building my own software.

The first app I built was a re-take on the AppleScript mess. Value Manager gained a real user interface, proper data storage, and a whole host of other features and behaviors to integrate nicely with Mac OS X. I learned how to let the user drag items around, copy and paste, undo/redo, import and export using a custom-defined file type fully recognized by the system, and more. After that, I developed a Timer/Stopwatch application (since Mac OS X had no equivalent to the Clock app on iOS), and from that project I learned a lot about how operating systems are optimized under the hood and don't actually do things in real time. Third, a Hangman game, where I first experimented with drawing custom graphics on a canvas. And finally, Espresso, a bare-bones utility to control the power behavior of the system and prevent it from going to sleep automatically. A few years later, I would rebuild this app from the ground up as Coffee Buzz and release it publicly on the Mac App Store.

There were a few other concepts I experimented with and a handful of other ideas for simple games, but by this point I was ready to quit playing around and started planning an ambitious project: writing my own image editing and design tool.