I hadn’t planned on learning mobile development during quarantine, but Paul Hudson was kind enough to hold a “Stay at Home” sale for his Swift courses. (Swift is the de facto language for iOS development.) The prices were low enough to convince me to take a stab at a personal goal of mine, which was to build a mobile app using a native framework. While I’m aware of cross-platform alternatives using languages I’m already familiar with, I wanted to learn something new and not rely on my existing web development skills as a crutch. Being a self-taught programmer, I often suffer imposter syndrome, and this was an opportunity to prove my competence.
I purchased Hacking With iOS and started my journey on April 3rd. The first four weeks were spent working through the book (one to three hours each day). By the time I reached Chapter 20 (around week three), I became more discriminating about what I needed to read and work on to accomplish what I wanted to do. I think every chapter is invaluable in its own time, but in my experience, reading technical guides from cover to cover is rarely the most efficient approach.
Once I felt comfortable with the basics of UIKit, I came up with an app that would not demand much more than the skills I had already acquired. In hindsight, the end result, Interview Notes, provided functionality that parallels the CRUD apps (create, read, update, delete) web developers are often tasked with. That experience gave me some useful context when things got difficult, because I knew how much I had struggled when I started web development.
However, the struggles experienced with app development are quite different from those experienced with web development. Web applications often require a good amount of dependency and environment management in addition to understanding front- and back-end development. For example, a framework like Django might require a Python library that relies on a package that was removed from the latest Linux distribution. Figuring out how all the pieces work together takes a lot of time and energy for beginning developers.
Developing for iOS is different, because all of the functionality is there, but the documentation and community is much weaker. It reminds me of the (false) claim that humans only use 10% of their brains. What good is all of Apple’s libraries if I don’t know how to use them or whether they exist? As for the known unknowns, I could often find discussion threads for issues I was experiencing, but answers were either missing or outdated. Apple’s own documentation sometimes links to missing pages. I get the sense that rapid advances to the iOS ecosystem have led to breaking changes or paradigmatic shifts. It’s what keeps people using their phones, but it’s also an unpleasant reality for native developers.
One specific example is Core Data. Apple’s documentation, when it exists, is gibberish to beginners. After a week of stalled development, I purchased Core Data by Tutorials. Thankfully my use case was simple, and I was back on track after two chapters and another week of effort. Another example was Nib files (which are actually .xib files). I still don’t really understand how they’re called and managed at runtime. Lastly, code completion stopped working within my project at one point. I tried every bit of advice I could find online, but I eventually had to start a new project and copy my code over. The real bummer was re-implementing IBOutlets, IBActions, and my Core Data classes. As someone who prefers to use Vim as their editor of choice, I don’t understand why I’m forced to use the UI to implement some features. It’s extra painful being forced to redo this work because Xcode didn’t work like it should.
Where to from here? Well, it’s worth saying, I get the appeal of using React Native. I almost switched midway through, but my dedication to my personal challenge just barely won out over my frustration with Apple’s developer experience. (Frustration that I’m also sure would be reduced if I had a mentor or worked on a team of mobile developers.) At the same time, I think Apple’s GameKit framework is actually a pretty well-polished framework for game development, and that’s something I do want to try. So I’ll keep at it for now, and hopefully I’ll have something else to share for my one-year anniversary with iOS development.