I’ve written mobile apps on-and-off since high school, and I just shipped my fifth one after a 3 year dry-spell. All of these apps were simple - but every project comes with valuable lessons that make all of my future software just a little bit better. Here’s the biggest things I learned from each of those apps.
Math Facts 4 Kids
This was my first real app, if you can even call it that. I was 15 years old, knew a small amount of C++, and decided to dive headfirst into building my first iOS app with Objective-C. It was a super simple first app (basic math problems for kids), but at the time I knew so little that it was still very challenging. It taught me two main things:
You’ll learn a lot by just diving in and figuring stuff out, and it’ll help you rapidly develop your problem-solving skills. When you know nothing, you need to figure out every. single. little. thing. I did a lot of poking around, relying on trial and error to figure out how to make things on the screen appear, disappear, and change. Being able to problem solve is probably the most important skill you can have as a software engineer, and stuff like this really helped me flex that muscle when I was learning to code.
Learning some of the fundamentals can make your life a whole lot easier. I didn’t know about the concept of having multiple view controllers when I built this app, so I would hide and show every image/button/text field to simulate switching screens. In hindsight, this is crazy. But at the time, it was what I figured out - I learned the hard way why having multiple view controllers is important, and I never made that mistake again. Though I’m proud of former-me for shipping a stable app despite having absolutely no clue what I was doing, if I had just gone through a tutorial beforehand I would’ve avoided making a lot of these mistakes.
Block Match: Monsters
This was my first (and only) attempt at building a game - and, much like Math Facts 4 Kids, I had absolutely no idea what I was doing. It was built using UIKit (as opposed to SpriteKit), and included incredibly basic artwork and gameplay mechanics. Games can be a tough market to crack, and (unsurprisingly) the app never went anywhere despite being free. The main thing I learned:
This was my first glimpse into gamification and how to create something that was easy for beginners and challenging for experts. The game initially only relied on speed as its sole mechanism for increasing difficulty (think of Space Invaders moving faster and faster), but this became incredibly repetitive, so I built mechanisms that concealed/changed the falling block mid-fall to create harder levels. This also included the addition of power-ups, which initially were intended to be available as in-app purchases (that integration was scrapped due to lack of interest).
Math Facts: Ultimate
This was the followup to my first math app - with another year of experience under my belt, I decided to write a new version from scratch that would follow a different model (instead of updating the original). While the code for this still wasn’t very good, it was a big step up from its predecessor, and the app also included more advanced functionality than the first one. Basically, in my eyes, this was better in every way.
So, what did I learn?
Despite the improvements, this app fared worse on the App Store than the first one. Why? Because no one cares if the app is better written or “more advanced” - I was caught up in a developer’s mindset, when I should have been considering the customer’s mindset. This is probably the earliest example of me learning about customer empathy - something that I now consider tremendously important. But it was also an indication of why early feedback can be really helpful, something I wouldn’t integrate into my development until much later. Without any signal or research to indicate that anyone wanted what I was doing, my first feedback came after I was “done” - and in this case, the feedback was a lack of downloads.
The Job Hunt
This was the only app I released during college (though I did work on several half-finished apps that will never see the light of day). Since it was written several years later, this app had a very different feel than the first three. I had completed three internships at this point, and this app had a much more refined look as well as a cleaner codebase. I learned a lot of things on this project, but here’s a few big ones:
This was my first published app that was built using Swift. After using Objective-C for my first three apps, I had been reluctant to learn a new language (especially in the early days of Swift when breaking changes were common) - but starting with The Job Hunt, every project I’ve worked on has used Swift, and it’s been great.
This was the first app I’d written since learning about design patterns (…I didn’t even know what that meant back in high school) - but there’s a big difference between learning about things in books and putting it into practice. It wasn’t until I started my first job out of college that I really started writing cleaner code, but compared to my first three projects this was still a major improvement.
I focused a lot more on design for this project, and the end result looks OK - much better than my first few apps, but I also had a tendency at this point to build things from scratch instead of doing things the “right way” in iOS. It meant that everything took a lot longer to design and that my app didn’t feel entirely native (this is also the case for my first three apps).
Moving - Tasks & Items
I released Moving - Tasks & Items last week (you can check out my post here) - it was my first app in three years, and it wasn’t written like any of its predecessors. I learned a lot during this project, but here’s a few key points:
From day one, I decided I’d ship an MVP within a month. Every other project on this list was many months of development (this slow trudge has led to the death of many other projects), and I wanted to release an app in 2023. Instead of building something complex and trying to think of every little feature to include from day one, I released it for free with the essential features. If there’s interest, this leaves the door open to expansion (and potentially monetization), but this allowed me to quickly ship (and I’ve already started work on my next project).
The app was written with SwiftUI (a first for me), and it’s my first shipping app where I added automated testing. The internal structure of the codebase looks completely different than the first four apps I’ve released, which is largely a testament to everything I’ve learned since entering industry in 2021. I’ve gotten much better at recognizing how to pull problems apart and organize them in code, and this will make it significantly easier to return to this project going forward for bug fixes and updates.
Naturally, distilling months of work into a paragraph leaves out a lot of details, so let me know if you want to hear more about any of these projects (or any of the dozen abandoned projects I’ve worked on in that time). I’ll be posting weekly updates about what I’m building and what I’m learning along the way - if you want to see more articles like this, consider subscribing (you can also follow me on X for daily snippets).