I’m at the boarding gate waiting to get onto my return flight to Sydney. I’ve got an hour to kill, perfect opportunity to write a quick blog post on my attendance at iOSConf, which is the reason I’ve been lucky enough to spend the last few days in Singapore.
Unlike the official developer conference (WWDC), where Apple introduce their next iteration of technology and platforms, iOSConf is a gathering of iOS developers and speakers who share their experiences using those technologies. It’s only in its second year, but has already attracted some well known speakers and sponsors and there was a great mix of talks - too many to cover in a single post - but here are some highlights.
Image: iOS Conference - Keynote
Delivering features outside of an ‘App’
In “Build Features, Not Apps”, Natasha Murashev argues that the future of mobile is less about ‘apps’ and more about features delivered through other mobile capabilities. She began her talk with a couple of interesting stats, showing that the vast majority of iPhone users don’t actively download apps (per month) and “an average app loses up to 95% of users within the first month.”
With this, she suggests customers are not engaging with apps as much as they did, instead they expect to see your product features elsewhere on their device. For example, customers want to get at your app content without opening the app itself - via notifications and widgets for instance. Speech recognition and search should provide another access point to your app content.
This is clearly something Apple are encouraging developers to pursue, at the 2016 WWDC they introduced a number of new extension points to built-in apps, allowing for example, your app to integrate with iMessage, Maps and Siri.
Testing at Dropbox
In “Thinking of your tests as a software product”, Michael Petrov talks about how the team at Dropbox architect their automated UI tests. He talked about the journey they went through which led them to treating test suites as a software product, investing in the quality of that test suite just as you would with your shippable code.
The driver for this is something I often see at client sites where automated tests are not given the same level of care as production code - as Michael points out; repeated code, large and hard to read test cases, tests break when the app flow changes, flakey tests and frustrated engineers, who ultimately lose confidence in the test suite.
Michael described the architecture they apply at Dropbox where-by test cases are built on an “App model” (representing actions that can be performed on the app under test) which in turn call a “UI Driver” (a thin wrapper around the test framework, in this case XCUITest). This isn’t necessarily anything new of course, in UI testing it’s pretty common these days to see abstractions (e.g. Page Objects) to better structure test code, but it was good to see this sort of thing being talked about at an iOS conference, where automated testing isn’t as mature as you might expect.
Rewriting the Instagram Feed
In “Scaling at Large - Lessons learned rewriting Instagram’s feed”, Facebook engineer Ryan Nostrom described a common problem we often see in iOS app development; massive view controllers and how this, along with other tech debt was preventing the team from adding new features to the the Instagram feed.
When these quality issues not only made it hard to add new features but also easy for defects to be inadvertently introduced in the Instagram app, the team decided that a rewrite was necessary. Ryan talks through the design of a data-driven UICollectionView framework, IGListKit, which has since been made open source. I’m excited to try out this component myself - with out of the box support for extensible, dynamic feeds and animated updates.
Protocol Extensions at Lyft
In “A Protocol for Compositions”, Lyft engineer Keith Smiley took another take on the massive view controller problem and showed how at Lyft, they used protocol extensions to break down a large view controller class hierarchy. It was a nice example of how “composition over inheritance” leads to decoupled, reusable code and a concrete explanation of the much hyped “protocol-oriented” paradigm.
Typically, protocols are used in Swift to implement the delegate pattern and polymorphic behaviours, but with protocol extensions (added in Swift 2.0) we can now define traits using a protocol and accompanying extension (default implementation). In his talk, Keith showed how Lyft use this to extract common behaviour from parent view controllers into traits.
Image: iOS Conference - group photo
As well as the talks I got a lot from casual random chats with fellow attendees. It’s interesting to hear the stories developers have, in some ways confirming that the technology and architectural design choices I’ve made on my own projects weren’t too crazy after all, as well as offering ideas I’m going to consider on future projects.
I’m coming away from this conference motivated to engage more with the wider iOS dev community and with lots of ideas to experiment with to ultimately write better iOS apps.