On the one hand you have XCode. XCode is still very much the most integrated IDE for mobile development. It takes a while to master the tool, the language, and various external frameworks like AFNetworking. The construction of the tool and the nature of the API encourage a sort of "incantation-based programming" approach which relies on copying examples from others. How do I customize a UITableView? Google it, find the example, copy and paste it, maybe once you've got it working try to understand the mess of Objective-C you just threw into a file editor.
Incantation-based iOS Development
Admit it, this is how you develop iOS applications. There are maybe a handful of you out there that have attained black-belt status with Objective-C, but the majority of you just search for the spellbook that has the incantation to invoke a Navigation Controller. It isn't like you are going to master the API and understand the nuances of iOS. I mean, really, the "Programming iOS 6" book from O'Reilly is thicker than the Sendmail book at something around 1150 pages. (It's a good book by the way, you should go get it.)
Don't get me wrong, I think Apple has created a wonderful platform. Unlike many iOS developers, I'm a big fan of the Storyboard interface, Segues work fine for me, and I find it much easier to create a good UI now than it was years ago, but the platform is so highly orchestrated I don't see it as programming as much as I see it as filling in the blanks. This isn't a criticism. It really isn't even a negative, I think that Apple has encouraged a huge library of great applications because they provide very strong guide rails for developers.
From a developer tools perspective, I only have two complaints:
- To Publish an application to the iOS App Store is to understand Kafka-esque, bureaucratic indirection. From creating a certificate, to creating a provisioning profile, to making an application bundle, to running several UI tools on your machine to integrate with the process. In the end it works, but it seems like a lot of machinery involved in something that could be simpler. Half the steps I complete in this process I don't fully comprehend.
- While the UI experience in very integrated, I feel like the command-line tools could use more focus. Unlike Android Studio and Gradle, I can't just pop out to the command line and run the same build. Instead I have to fish around for commands, watch some WWDC presentation which involves Jenkins, and juggle things like CocoaPods. (CocoaPods BTW is awesome, and I'm not criticizing it, I just wish something like this were integrated with the toolset.)
Android's Catching Up and Running Fast
On the other hand you have Android which recently switched over to Android Studio along with Gradle. I had zero warning of the move to an IntelliJ-based IDE prior to Google I/O, and I was surprised as anyone. Also, I would have never predicted the move to IntelliJ. Google's invested so much in Eclipse-based development, it must have been a difficult decision to cut and run. I know that you hear some of the core Android people talk about continued support for Eclipse, but I find it hard to believe that Google as an organization is going to provide full support for two different IDEs when they are in a competition with Apple's singular focus on XCode.
I don't know anything about internal discussions, but I can only assume that they reached a point at which they decided that no amount of money was going to get a great IDE experience based on Eclipse. So, now that Tor and company are focused on IntelliJ, it'll will be interesting to see how quickly Google can catch up with XCode.
The two criticisms I have of XCode are the two things I like about Android Studio:
- Publishing an APK is almost too easy and the IDE doesn't get in the way. While publishing an iOS application involves running a distribution UI tool on your OSX machine, Google Play just has a website that accepts an APK upload. (It's also much easier to publish and application because there's no multi-day review cycle.)
- I can jump to the command line, run the build in Gradle and its the same thing I ran in the IDE. Also, unlike XCode I don't have to break out of the tool chain to manage external dependencies. There's no CocoaPods here, there's no extra-Ruby-based thing I need to use because Gradle takes care of it. This unification feels better to me as a programmer, once I'm ready to build and deploy I can run a command instead of right clicking on some interface.
The Distribution Story is the Biggest Difference
In XCode I have to fiddle with certificates and provision profiles and then I have to use the tool to distribute the application. It doesn't feel transparent to me, and I'm not exactly sure what's going on until I see the application in iTunes Connect. Again, I'm not complaining, the tool works wonderfully.
In Android, I run "gradlew assemble" I look for the APK, run jarsigner and zipalign... then I upload the APK to Google Play. 24 hours later I had an App in and App Store. I think the simpler distribution story coupled with the accelerated adoption of Android will be Google's competitive advantage going forward. I know people complain about malware, but I haven't seen this problem.