If you surveyed me annually, you’d likely find that my toolkit for building Mac and iOS applications changes a bit year over year. This year, however, the changes seem to be even bigger than before. With Swift 2’s release, I made the full transition from Objective-C to Apple’s new language du jour.
The transition has not been without growing pains (hello, constantly crashing debugger!), but overall I am writing better, more idiomatic code. And this is coming from someone who spent the last decade happily writing Objective-C. Since I’m making the transition, I’ve also used it as an opportunity to re-evaluate the third-party libraries I am using in my client applications.
I tend to have a fairly reserved stance on third-party dependencies. I am not vehemently against them like some, but I also don’t want to turn my app into a Lego set where I’m merely piecing together library after library that I don’t fully understand. The tools below are things I have used and successfully deployed to production.
In the Dependency Wars, I have tried them all. I started with vanilla Git submodules, and did a brief tour of duty with Cocoapods. Submodules didn’t offer nearly enough wins for the management overhead I seem to have. Cocoapods worked for the most part, but I have fundamental disagreements with how they package and build their products.
Carthage seemed like a happy medium for me. I get the wins of using some sort of dependency management system, and it sticks with using the shared Xcode schemes that are bundled with the project itself.
This is the most recent addition to my list, but it’s one I’m growing to enjoy most. Functional programming is what all the hipster developers are doing these days, so I am trying to wrap my head around it. I may not understand why they wear wood framed glasses, tight jeans, and so much flannel, but I am starting to come around to the idea of building things functionally.
RxSwift is from the same folks who do Rx.net, RxJava, and a host of other implementations, which may or may not be appealing to you. When learning something new, documentation is important and I’ve found the docs for RxSwift to be pretty well done. There’s still cases where the generic ReactiveX documents are “TBD” in terms of RxSwift, but having the header docs fills in many of those gaps.
My biggest complaint with RxSwift isn’t so much a complaint with the library as it is with the idea of functional programming. It is a major change in how you think, so I spent most of my first few weeks re-reading docs, cursing and trying to understand what was actually happening. Eventually it will click, and when it does it’s a really nice way to build iOS libraries.
RxSwift includes a library for making UIKit more reactive, but I’m shying away from it presently. Right now I have limited RxSwift mostly to integration with network modules I build. I reserve the right to change my mind about this in the future, but right now delegates and data sources don’t bother me that much.
It is a toss-up whether there are more Swift JSON parsing libraries or Republican presidential candidates in the US. I don’t really have anything negative to say about SwiftyJSON. It works and saves me from writing JSON parsing code over and over again.
You can likely choose one of the other 107 libraries and it will do pretty much the same thing: just like a Republican presidential candidate!
I have used Core Data since it was introduced way back in OS X 10.4. I have never loved Core Data, but it has always gotten the job done and proved better than raw SQLite queries (I’m that much of a masochist).
I interviewed the Realm folks way back when on my CocoaRadio podcast and found it to be an interesting project. I just didn’t have anything to implement it in since I was already successfully deploying Core Data in my existing client projects. With a new project that ramped up early last year, I decided to give it a shot.
I’m having a hard time convincing myself to go back to Core Data for anything right now. Core Data has always felt bloated to me, especially when trying to bring up the stack in an application. I also have many battle wounds to show for Core Data threading issues over the years. All things of the past with Realm. I can query the same Realm from any thread and bringing up a new one is at most three lines of code.
Apple is working to improve Core Data each year, but I’m starting to believe they should just reboot the framework like a comic book movie and start over. Or keep it as is, and I’ll keep using Realm.
I was a longtime user of CocoaLumberjack, but was running into a issues when starting to migrate an existing client application to use Swift in some places. I also started having issues where there updates to the library would just fail to work in the application without me spending a few hours each release debugging things.
I decided to use that as a chance to write my own clean room logging implementation that does everything I need: which isn’t that much. I call it Aspen, and you probably shouldn’t use it.
It works for me and is deployed on millions of iOS devices, but it’s also something that I don’t really see growing beyond the scope of the project as is. I’d like to add log rolling and ASL support, but after that there’s not much else I need in a logging framework. If your needs are greater, any other solution will probably work better for you.
The newest piece of my kit is Fastlane, a suite of Ruby scripts from Twitter’s development folks. I am using Fastlane to help run unit tests from the command line, build releases and automatically upload them to TestFlight. The suite can do a lot more, but my needs are fairly simple.
The next piece to my Fastlane puzzle will be getting some sort of continuous integration component. Maybe next year.
Plain Old NSURLSession
You’ll notice that I’m not using a networking library like AlamoFire or similar. For most of the projects I am working on, I don’t need the extra overhead those libraries offer me. I tend to put each network request in its own Swift class and make them return an RxSwift Observable. I then have a parent class that will vend those request classes out. I may write about this more in the future, if enough people ask nicely.
This is the fifth installment of my must have must have list of tools and utilities as a Mac and iOS developer (2009, 2010, 2011, 2012). This year’s edition of the list takes into account the new tools I am using as part of my transition to working exclusively on iOS 7 and OS X Mavericks, as well as an amateur designer.
The idea for this list was shamelessly ripped off from Windows developer Scott Hanselman whose list has long been an enjoyable read when he updates it.
Many of the products you will recognize from previous years’ lists. I’ll outline new additions to the list as I go by marking them in bold.
My hardware is mostly the same as last year. I am still maintaining a dual Mac setup. My daily driver is a 27″ i7 iMac with a 256GB SSD, 2TB spinning disc and 16GB of RAM. There is absolutely no reason for me to have 16GB of RAM other than to brag about the fact that I have such a ridiculous amount of memory. After almost four years, this machine is still humming along like a champ. The only reason I would consider upgrading to a new one is aesthetics at this point.
At home I am using my 15″ Retina MacBook Pro with a 512GB SSD and 8GB of RAM. This is the first revision of the Retina MacBook Pro and it’s probably one of my favorite Macs ever assembled. My only request going forward is a much higher retina resolution. It’s really a challenge to jump between the massive amount of pixels that a 27″ iMac affords you and then head back to a 1440×900 display at home.
I am using Dropbox more than ever to keep everything between the two machines in sync. I symlink Documents, Downloads, Movies, and Sites to point to those respective directories on Dropbox. I am also using shared Dropbox folders for Second Gear projects that require collaboration with a designer. I’m still using GitHub for storing all of my code.
In terms of accessories and upgrades:
- I use a Das Keyboard. I love it. The Das Keyboard doesn’t make me a better developer, writer or person. It just feels satisfying to use.
- On the left side of my iMac I use a Magic Trackpad for swiping and gesturing between full-screen apps and Mission Control. I am a big user of multitouch gestures in Mavericks, so I am incredibly comfortable using the trackpad.
- On the right side of my iMac I use a Razer Mamba 2012 Elite Ergonomic Wireless Gaming Mouse to do all my pointing and clicking. The Razer mouse is far more comfortable to use and is wired, which was useful for that month I was obsessed with playing Quake 4.
- Time Machine backups are handled by a 2TB Western Digital MyBook connected via Firewire 800. It’s fairly quiet and is one of the few external drives I’ve found that doesn’t have a horrific design. Last year I had the 1TB version, but it finally met its demise after years of faithful service. It was a no brainer to upgrade to the new one.
- I am a completely paperless office thanks to my Fujitsu ScanSnap iX500. I usually scan all my receipts, bills and invoices once a month and then run them through OCR so I have a searchable archive on my Mac.
- I connect to the Internet through my Airport Extreme Base Station. It cost more than a Linksys but it’s super reliable and the management software is much more pleasant to use.
I am really hard on software. This is for a variety of reasons, but I think it is because I build it myself. I have always envisioned that directors and actors can sometimes lose focus during a movie as they judge the decisions others made in their productions. I feel like I do the same thing with software.
I loathe poor and/or non-native user interfaces and cherish simple tools. These are applications I constantly rely on.
The Essential Five
- Dash – The new documentation viewer in Xcode 5 is better, but I have found Dash to be a must-have utility, especially if you are targeting platforms beyond just OS X and iOS. Dash imports and formats documentation for OS X, iOS, Android, web frameworks, and more. It’s amazing.
- Dropbox – Dropbox is the secret sauce for a variety of reasons. It makes it easy to share files between machines as well as with colleagues. Beyond that, maybe you’ve heard of Elements and the many other great iPhone apps that sync data using Dropbox?
- OmniFocus – I don’t know how I ever stayed organized before OmniFocus on my three screens. It’s my brain.
- Sublime Text 3 – I am a big fan of Sublime Text and am still using it as a replacement for BBEdit. It’s not the prettiest girl at the dance, but its powerful text editing features and the ability to customize the interface however I see fit ultimately made me make the switch. It also handles Ruby development a bit nicer than I found from BBEdit. We’ll always have Paris, Bare Bones.
- xScope – I use xScope to detect colors on various UI elements, check alignment of controls and to measure the distance between objects. If you are meticulous about your UI, it’s an essential utility.
- Xcode – If you write Mac or iOS applications, you spend most of your life in Xcode and Instruments. I am no different.
- Android Studio – I have been doing a bit of Android development the past few months and have found Android Studio, while still an early preview, to be a very nice IDE to use. It’s based off IntelliJ IDEA and has a lot of nice editor and refactoring features I’d love to see make it to Xcode some day.
- Anvil – If you use Pow for running your Rails or Rack-based apps locally, Anvil makes it really easy to manage and restart them from your menu bar. Bonus: it’s free.
- Appfigures – Manually fetching iTunes sales reports is tedious. Appfigures is a low-cost Web service that will import your reports and send you a daily sales email. You can also do a lot of other analysis on your sales to find trends, but I generally use it for the daily email.
- Base – Elements has a SQLite database behind it. I’m constantly inspecting the database contents using this application. It’s lightweight and easy to use.
- Charles – Sometimes I want to snoop the traffic that is going through an iPhone app. Setting up Charles makes it pretty easy to do just that.
- Committed – Shameless plug for my GitHub to Notification Center app. I built it because I needed it. I use it everyday.
- Cornerstone – For those few times a year I need to work with Subversion, Cornerstone is the best desktop client I’ve found for it.
- Deploymate – If you’re still supporting iOS 5 or iOS 6, you want to make sure that you’re not calling APIs not supported on those platforms before shipping to the App Store. Crashes are bad. Deploymate does just that. It saved my bacon once already which made it worth every penny I paid for it.
- Dev Color Picker: Must have. Choose whatever color you want and then it will output a UIColor or NSColor for you.
- Ember – I used to use LittleSnapper, Ember’s predecessor, to capture screenshots and inspiration for design years ago but got out of the habit as the app languished and didn’t sync. Ember uses iCloud to sync your snapshot library between Macs, which is great. The RSS subscriptions feature is great too for tracking design trends on Dribbble. I keep feeds for each mobile and desktop platform.
- FogBugz – I have been using FogBugz to manage Second Gear’s support inbox and bug database for almost five years. People complain that it is an unattractive app. I disagree. It’s not flashy and instead just disappears so that I can actually focus on using it for its intended purpose: managing my software projects.
- Genymotion – You know how the Android emulator is really slow and generally sucks? Genymotion doesn’t. It’s faster, more powerful, and works better in almost every way. If you’re doing Android development, you owe it to yourself to give it a whirl.
- Git: I am now exclusively on Git for Second Gear projects. Thanks, GitHub.
- GitHub for Mac – GitHub’s official Mac client isn’t the most feature-filled Git client on the market, but it accomplishes everything I need it to as a sole developer: sync, commit, branch. If you haven’t given it a shot in a few months, do yourself a favor and try again. It’s gotten really good.
- Go2Shell: A small utility app that I keep in my Finder toolbar to open a Terminal window in whatever folder I am currently looking at.
- HockeyApp – I am using Hockey for distributing betas and handling crash reports. Whenever I archive a build, I use HockeyApp’s OS X app to upload the binary and dSYM as part of the build process.
- HockeyCoach – HockeyCoach is a new app from the Hockey folks I mentioned above that lets you manage your crash reports in a native Mac app with a few additional features over the web app.
- Hex Color Picker: My designer sometimes sends me hex values for colors I need in my user interfaces. This coupled with my next pick makes it easy for me to grab an NSColor or UIColor value.
- Hues – Combined with Hex and Dev Color Pickers, Hues is one of my most used apps. All it is is the OS X Color Picker in a full application that is accessible via the Dock and command-tab switcher. Awesome.
- IconSlate – When I was putting together Committed’s icon, IconSlate was the best way to drag-and-drop the different sizes and get an icns file. It’s also what I use whenever I need a new favicon in the ICO format.
- ImageOptim – When you add up the kilobytes of non-retina and retina assets for both the iPhone and iPad, app binaries are getting bigger. ImageOptim has a better compression algorithm than the one built into Xcode, so I will sometimes run images through it to get smaller sizes.
- iPhone Backup Extractor – When doing iPhone support, it is sometimes beneficial to get a copy of the user’s data and preferences. Using this application, it’s fairly easy for the user to handle on their end.
- Kaleidoscope – I have never been a fan of the bundled merging tools with Xcode. Kaleidoscope is vital to my workflow when running diffs on my Git commits. The new version of Kaleidoscope that was released by Black Pixel last year is fantastic.
- Library Inspector – There have been a few times I’ve wanted to see what was in a static library.
- Patterns: I don’t think I will ever fully grasp Regular Expression syntax. Patterns makes it easier for me to fumble around trying to build and test a regex compared to doing sample finds in Sublime Text.
- QuickRadar – The RadarWeb UI still sucks. QuickRadar makes me more likely to file bugs because it is in my Dock, it can cross-post to OpenRadar, and it has never crashed or lost a bug report while I was trying to submit it.
- RESTed: When building or testing an API, RESTed comes in handy to see raw JSON output and quickly test input parameters. I also tend to keep a couple RESTed documents in my source repos so I can quickly test the API.
- Screentaker – Screentaker is the fastest way I have found to go from an iOS device screenshot to something wrapped in a device shell.
- Sketch – Finding design talent with availability or that hasn’t been acquired by Facebook is difficult sometimes. That’s why I have tried to dabble with doing my own design for the low-hanging fruit things like toolbar icons and whatnot. Sketch is amazingly great if you want to do any sort of mobile or web interface design. I’ve tried to use Photoshop for this stuff so many times and failed. I picked up Sketch after a few days. Best $50 I spent in 2013.
- Slender – If you’re using Xcode I bet you have a few assets in your Xcode project that are no longer in use. Those kilobytes are wasting your customers’ bandwidth and yours. Slender analyzes your Xcode project and finds those assets that are no longer in use so you can safely delete them.
- Status Magic – Before I send screenshots to iTunes Connect, I run them through Status Magic to add a proper status bar to it. It’s a small thing, but I think it looks more professional than the current status bar that my device screenshot gives me.
- Trello – While I use FogBugz for customer support and bug tracking, I am using Trello for the high level management of Second Gear Projects. It’s where I can get a quick overview of what my release plans are and adjust them if necessary. I also put all feature requests and ideas here instead of the bug tracker since they may never be actionable.
- 1Password – One of the first tools I install. Its Dropbox over-the-air syncing makes using it on my iPhone and iPad even easier. It also has made me use better passwords because I no longer have to remember them. 1Password does that for me.
- Acorn – Acorn is my favorite image editor for the Mac. It’s fast, intuitive and looks pretty neat too.
- Backblaze – While I primarily rely on Time Machine for my backups, I also subscribe to Backblaze to offload the contents of my hard drive to the Internet.
- Chatology – You know how iMessage is unreliable, doesn’t send messages sometimes, and just sucks? So does search in the Messages app. Chatology solves that by making it way easier to search your chat logs for that screenshot or link that you know you sent a few days ago.
- Cloak: If you connect to any shady or insecure networks, Cloak is a super easy VPN service to secure your traffic. On my Mac, I like it because it will automatically connect when I join an insecure network. Even better, it’s just a tap away from toggling on my iPhone and iPad.
- CloudApp – Whether it’s sharing screenshots, beta releases or small snippets of text, Cloud has become an essential tool for me. Its automatic screenshot uploading feature solved the problem I always had with figuring out how to successfully share screenshots without having to rely on AIM’s flaky servers or uploading them somewhere with Transmit.
- Feeder – I use Feeder to update the IRQ Conflict podcast as well as several different Sparkle AppCast feeds. It’s one of the best user experiences I’ve found on the Mac.
- GIFBrewery – You like GIFs. I like GIFs. Let’s make GIFs.
- Labelist – I have horrible penmanship. I have had letters returned by the USPS for illegible addresses. I bought a label maker and use Labelist to generate all of my address labels now.
- Launchbar – I use Launchbar primarily as an app launcher, but I also am a big fan of version 5’s clipboard history feature.
- Marked 2 As I am writing this blog post in Markdown using Sublime Text 3, I have Marked 2 open as well doing a live-preview of the post so I can quickly see if I have any of my Markdown showing.
- Napkin – Need to annotate a screenshot or point out a specific portion of it? Napkin does that better than any other app I have found.
- OmniOutliner Pro – When I am doing more complex writing projects than a blog post, I outline the entire thing in OmniOutliner. The ability to have drop-down fields is one of my secret weapons. Love that.
- PDFpenPro – Preview is a fine PDF viewer, but if you need to sign contracts, make edits to PDFs or create new forms, PDFpenPro is top notch. Bonus: it’s a lot cheaper than Adobe Acrobat.
- Photoshop CC: When Adobe switched to its Creative Cloud pricing, I decided to jump back on the Adobe bandwagon. I don’t really have a system for when I use Acorn and when I use Photoshop. It usually just ends up depending on what I decide to type into Launchbar on a given day.
- RCDefaultApp – RCDefaultApp is one of those applications that has been on my Mac for so long, I take it for granted. For those times when you want to force a file extension to open in a specific application, it’s great.
- Rdio: Last year I made my transition away from a local iTunes music library in favor of iTunes Match and Spotify. This year, I am 100% on Rdio. I no longer have any music stored locally on my Mac or any of my iOS devices. Instead, I am syncing albums from my Rdio collection to my iPhone for offline listening. It’s been working great and I can’t imagine going back to the traditional ‘purchase’ model for music.
- Soulver: Marco turned me onto the iPhone version of Soulver and now I am a convert on the Mac too. It really is a much better interface for doing quick (or complex) numeric calculations.
- The Unarchiver – A file extraction utility is somewhat of an unsung hero, but when you need it, it’s good to have a utility that is robust and can fit almost any bill. The Unarchiver does that and does it well.
- Twitter for Mac – You probably use Tweetbot, but I actually prefer the official Twitter client for desktop tweeting solely because its scrolling performance is acceptable.
- Wedge – If you use App.net, you probably want a desktop client. Wedge is the best one I’ve found.
Outside of doing software development, I talk about software development and technology in general with my Windows development buddy, Mikel Berger on IRQ Conflict. These are the tools used to produce the show and some other audio gimmickry I pursue:
- Blue Blubird – I chose to buy an XLR mic because I could easily upgrade to a mixer someday without having to also buy another mic. Choosing a microphone is a personal thing, but this one had the right amount of audio quality and style for me.
- Icicle – I’m still not ready to commit to putting a mixing board on my desk, so I am using this XLR to USB adapter also from Blue to connect to my Mac. I’ve noticed no real downsides to it other than it sometimes loses connection with the USB hub I have it plugged into. Just make sure it shows up as an input source before recording and you’re good to go.
- Adobe Audition CC – Last year I was still using the Windows version of Audition in VMWare. The Mac version finally shipped and it is great. It’s got those typical weird Adobe interface issues, but I wouldn’t recommend another multitrack editor over this one. It’s a great workflow.
- Skype – Mikel and I use Skype to record IRQ Conflict.
- Call Recorder – Call Recorder is the least hassle for recording the audio of a Skype conversation.
- AudialHub – AudialHub is a dead app. It hasn’t been under active development for years. Sadly, it’s still the best for converting between a variety of different audio formats.