Note: Our friends at Treehouse wrote this great article about mobile development for us. Check them out here.
“We’re different!” This is a mantra many organizations will trot out to justify striking out on their own path with some new technology, design, or process. And sometimes it’s true. But the question they need to ask next is, “Are we so different as to justify two to four times as much work, a delay in getting to market, and increased maintenance costs for the indefinite future?”
Nowhere is this more apparent than the app ecosystem of the mobile computing world. You can’t blame a developer or organization for wanting to be unique, because having a user interface/experience that stands out could be the differentiator between getting your app featured and making a profit or ending up in the scrap heap of apps. But in general, it’s better to explore every nook and cranny of the core iOS frameworks and to scour the open source libraries available on GitHub to see what components you can reuse to write your app more quickly, and hopefully with fewer bugs and crashes. My own practical experience backs this up.
A Quick Case Study
I worked on an app as part of a team where we decided to implement a custom navigation system based on the premise that many of our screens followed a similar format:
Sample mockup created using Moqups
On each screen there was a title, an optional subtitle, an optional image, and two or more rows that users could tap on to navigate through different paths. We would store the entire navigation structure of the app in a property list (or “plist”) file, design a basic layout in Interface Builder and programmatically add views as needed using a custom View Controller. Each screen would have a few standard properties in the plist file which would be used to drive the behavior of the base View Controller.
The idea sounded great on (electronic) paper. But there were two problems.
- __One size did not fit all.__We tried to make a reusable ViewController that could handle many of the screens in our app. There were, of course, special cases that could not be built by our basic implementation, but more frustrating were those screens that were _just similar enough_ that we added one extra piece of data in the plist file and one extra condition and method in the base ViewController. These one-offs quickly added up and really affected how "standardized" our data was in the plist file.
- The challenge of navigating screens in an iPhone app had already been tackled by others, such as the [TTNavigator](http://three20.info/article/2010-10-06-URL-Based-Navigation)(#ttnav_footnote) project in an open source library from Facebook called [Three20](https://github.com/facebook/three20).
TTNavigator wasn’t a perfect match for what we wanted to achieve with our custom navigation system. But that is not the point. There wasn’t anything special about our approach or, more importantly, the end result. We thought it would make our lives as developers easier, but it ended up taking more time to develop and test and was harder for newcomers to the team to pick up. ###What We Should Have Done Looking back, we should have taken some time to investigate the landscape when we were designing the architecture of the app. In other words, after the user interface and experience were defined by our business and design teams, and we were planning for how development would proceed, we should have looked at what options were available for the types of problems we were trying to solve. Instead, we narrowed in pretty quickly on our design decision and started writing code before fully understanding how it would affect development.
A Better Approach
So as a developer eager to start working on your next great app, how do you even know where to start? Below you will find a practical guide to discovering some of the more common frameworks available that can make your life as an iOS developer so much easier. ###Get to Know the iOS Core Frameworks You don’t know what you don’t know. In app development (and software development in general) it’s easy to focus on the problems at hand and lose touch with the updates made to the platform around you. It is nearly impossible to stay up to date with all the latest features of iOS with each release. Unless…
Check out the release notes for each new version of the SDK. For example, iOS 6 included a pull-to-refresh class called UIRefreshControl that could be used to replace custom or open source solutions like PullToRefresh.
Take a half hour every now and again to review the wealth of components available in the core iOS frameworks. Maybe devote your lunch hour the first Monday of each month to read up on some documentation and release notes. The Apple Developer site has documentation, sample code, and resources for each framework, and this Frameworks page can be sorted in reverse chronological order, so you can easily see what has been added or updated recently.
The sheer number of frameworks is overwhelming at first, but you can narrow things down by concentrating on the areas you are likely to use in professional or personal projects. For example, if an upcoming app is going to be heavy on audio, get familiar with the Audio & Video Starting Point guide and search for “audio” in this list of guides. ###Discover Open Source Software (GitHub and Friends)
Good programmers know what to write. Great ones know what to rewrite (and reuse). - Eric S. Raymond This sums up how we should feel about reusing other people’s code. When I was younger I used to prefer writing things from scratch so I could better understand them and have more control. There is some merit to that regarding the “better understanding” part, but I have learned it’s clearly better to use and potentially adapt open source projects when they are available.
Here is a quick rundown of some of the potential advantages and disadvantages of using open source software:
|Fewer bugs (well-tested code)||Support from the open source community might end|
|More functionality than building yourself||Might be hard to include in your project|
|Often see and learn best practices||Possible conflicts with other libraries in your project|
|Speed of development||Might have to conform to an open license|
|Making the world a better place||Might be replaced in a new iOS SDK release (ex. PullToRefresh -> UIRefreshControl)|
If you have never used an open source framework, there are a ton of useful repositories available on GitHub for iOS development. One way to see which ones are popular and useful is to take a look at the Most Watched tab in the Objective-C section.
It’s useful to keep tabs on what is available on GitHub so you know where you can fit it in with your development. But even if you don’t stay up to date with the latest repositories, you can easily search for functionality you want in an app. For example, imagine that you want to include a side menu like the one made popular by the Facebook app. You could read up or figure out how to implement it on your own (it’s not technically very difficult). Or you could spend a minute searching on GitHub: a quick search for “ios facebook side” brings up a list of implementations, including the popular ViewDeck project.
And of course, you are not just limited to GitHub (though there are a ton of resources there). I know from experience that this multitude of options can be overwhelming. There are some really helpful sites, though, that do the work for you and curate lists of the best open source software available for iOS development.
For the “pragmatic iOS developer”, there is a list of custom frameworks at iosframeworks.com. There is also a really good App Dev Wiki that contains helpful lists of frameworks, design patterns, and other resources for iOS and mobile development in general. The libraries are categorized for helpful discovery and many of the more popular libraries and tools are listed there. And for custom UI controls, check outwww.cocoacontrols.com. You can even subscribe for a weekly newsletter to passively stay up to date with the latest custom controls.
Bootstraps and Boilerplates
One of the more recent developments in app programming is the advent of very useful templates, bootstraps, and boilerplates (choose your own trendy label). These projects, fashioned after the popular Twitter Bootstrap and HTML5 Boilerplate projects of web development fame, attempt to take away some of the pain of setting up a new project for the first time. For iOS you can use the iOS Boilerplate, which is an Xcode project that incorporates some of the more popular third-party libraries to get you up and running quickly and painlessly.
Share the Love
Don’t be afraid to share your ideas with other developers! My greatest accomplishments have all been with the assistance of people smarter than me, and I have been exposed to so much simply by talking with other developers. Whether it’s a local meetup of iOS developers likeCocoaHeads or a major conference like WWDC, spending some time with people tackling the same problems as you is a great way to learn about new tools and solutions. When I am at a talk or conference I am not trying to retain every line of code that flashes across a projector screen. Rather, I seek out presentations and discussions about things I want to be exposed to or things I feel comfortable sharing about. It doesn’t require a huge amount of time, but it’s a great way to stay current with trends and learn what is available to help become a better developer.
And while you’re at it, contribute back to those open source projects! It used to be that open source code was tightly controlled by programmer-gatekeepers who could make it difficult and intimidating to contribute your work. But with the rise of GitHub and more and more people developing and using open source software, most projects are truly meritocracies where, if you have value to add, you can add it. Fork the code, make your improvements, submit a pull request, and you’re done! It’s never been easier.
It’s All About Efficiency
Don’t reinvent the wheel, unless you plan on learning more about wheels. - Jeff Atwood One way to be a “better” developer is to be more efficient. And this gets back to the heart of my argument. After a few years of mobile development I have seen both sides of this coin. Writing components from scratch, even with a talented team, can lead to headaches, missed deadlines, and escalating complexity. On the other hand, pulling in a popular open source framework that takes advantage of the latest platform technology and follows software development best practices can lead to a more maintainable app and a more enjoyable development experience. That extra time lets you tackle more interesting problems about how your app looks and functions, which is ultimately what makes for a delightful user experience.
So the next time you fire up Xcode and click on “Create a New Xcode Project”, take a minute, or a day, or a few weeks to investigate your options and think about how you can make your life as a developer easier. And make your app better! We are now in the GitHub Generation, and there are so many exciting things we can do because of it. What a wonderful time to be a software developer!
- Three20 hasn’t been updated in more than a year and isn’t nearly as useful as before. If you’re interested in URL-based routing for app navigation, check out SOCKit.