Swift's Evolution

I'm usually pretty good at inferring where Apple is going with their projects and products. With Swift, I'm left shrugging. Hopefully the purpose of Swift and how it relates to Apple becomes less muddy next week.

Since 2004 (!) I have been attending WWDC on a regular basis. My first time was on a student scholarship thanks to some incredibly poorly written Objective-C code back in the Mac OS X Panther days. Fast-forward to 2017 and we've gone from Apple the underdog computing platform to Apple the juggernaut that has four top-tier platforms.

After you've attended a handful of WWDC's, you start to realize the pattern. Unlike a conference like TED which explicitly puts the theme of the event on the cover, WWDC is a bit more subtle. If you attend enough sessions you start to realize both what Apple is interested in this year, but also in this new iOS era, where they are skating towards in the fall.

Skating to Where the Puck Is Going

When Apple introduced Auto Layout with iOS 7, they started pushing the idea of having both iPhone and iPad apps being built from the same core interface elements with minimal additional effort by the user. It was also a pretty good hint that Apple had their eye on a larger iPhone, someday. When size classes were introduced with iOS 8, they were literally beating you over the head saying larger phones were coming.

Size classes were an important announcement in 2014 with iOS 8, but the biggest announcement was by far the introduction of the Swift programming language. Though not marketed as an absolute successor to Objective-C, most have taken the introduction of Swift as a pretty good indication of where Apple wants to take software development for their platforms for the next decade or more.

With Swift, Apple gave themselves a clean slate to build a modern language for mobile development, without the legacy of a programming language that was designed for NeXT Cubes in the 80's. Swift checked many of the boxes that new and old Apple developers had been clamoring for by offering things like static typing, optional types, and not having to think about pointers for the majority of mainline use cases.

Swift also infused a lot of new ideas into development on Apple's platforms. Subclassing began to be seen as a last resort when protocol-oriented programming and value types couldn't be used. A traditional for loop was passé. Instead, map, flatMap, and forEach were how you flexed your Swift muscles.

Living on the Edge

The first version of Swift was, dare we say, challenging and I avoided using it in production. With the release of Swift 2.0, the water seemed cool enough that the first bits of Swift code landed in production at the day job. In fact, most of the new code being written at that point was in Swift rather than Objective-C. The tooling still suffered from a lack of reliability and stability, but I kept reminding myself that I was using a new, rapidly iterating language and that just comes with the territory.

Swift 3 was the first release after the open sourcing of the language, and honestly where I think my love affair began to wane. After being open sourced, Swift started to feel like a language that stopped actually moving forward in ways that made sense to me. Removing traditional for loops and increment/decrement (++/--) operators were pushed through the Swift proposal process as improvements the core language by the fact that there were "better" ways to replace their functionality. From a theoretical perspective, that makes a lot of sense. Practically, I was left wondering why it was worth the effort when there are still real problems needing to be solved.

The biggest travesty was the "Great Renaming" which touched every line of Swift code I had and burned a week of my life on tedium. In my decade of professional development, I have never had a worse experience. The migration tool caused more issues than it automatically resolved, leaving a manual migration as the only sane path forward. How that migration tool ever made it through QA is beyond me, but I'd have felt better if Apple just said "good luck" instead of offering a half-baked utility.

One can argue that renaming every method API method to be more "swifty" was worth the headache. I even agree to a point, but I also don't believe Swift 3 dramatically improved my experience as a software developer, especially when compared to the effort to get there. In fact, most of the decisions made since Swift was open sourced have left me scratching my head as someone just wanting to use the language to write iOS apps.

Practicality vs. Ideology

I'm a practical iOS developer by day. I try to use a value type where it makes sense, but I also still design my table views the old fashioned way with delegates and data sources. I still use Core Data for persistence. And I still use KVO where it makes sense.

From the outside, it seems like important milestones like ABI stability continue to be delayed as Apple and its open source contributors continue to chase the dream of designing the most pure language they can. Removing "legacy" operators and arguing over access levels seems to have taken priority over actually moving Swift forward as a first class language for Apple development. The problem with that is that software development isn't pure. It's messy. I've never written a perfect line of code in my life. I don't plan to either. Fixing a language in post is obviously harder than pushing a new build of an iOS app, but chasing perfection is a fools game no matter what the project is.

As a production developer I need ABI stability because it prevents me from having to recompile my dependencies every time the language is upgraded. It will also hopefully allow me to shave 8 megabytes off my download by no longer including a Swift runtime in every release. My product managers need those 8mb for more analytics libraries! I'd rather Apple spent its time giving me a concurrency story along the lines of async/await instead of looking for new ways to make protocol extensions useful in scenarios that just don't make sense for my shipping products. And for god sake, improve compile times. I only have one life. I'd like to spend less of it watching a progress indicator.

I realize that the tools team and the Swift team are separate, but its hard to separate the two when Swift's primary method of development is Xcode. Xcode's quality as a Swift development language has never been great with its constant indexing, opaque compile errors, not great typing auto-completion, and lack of refactoring support still. With zero insight into the inner workings of Apple, it still feels like the language hasn't been embraced nearly as heavily internally as it has been externally. If it was, I'd believe that Xcode's Swift-related issues would be resolved much quicker than they have been. The biggest pain points external developers face always seem to be resolved once they become issues internally at Apple. If Apple can't use Swift to build its frameworks or its internal products because ABI stability is missing, they don't see all the warts we do.

Apple's path with Swift doesn't seem to solve the problems I have as a day-to-day iOS developer. Instead, the language design focuses on implementing functionality that would benefit server-side Swift, Playground demos, and showy conference talks. If that's the goal of the language, I sure wish they'd come out and say it. Right now it feels like I'd have been better served by continuing on with Objective-C, which is still being improved in meaningful ways, rather than going all-in on Swift.

Read more about. . .

My Ultimate Developer and Power Users Tool List for macOS Sierra (2017 Edition)

This is the latest installment of my must have must have list of tools and utilities as a macOS and iOS developer. 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.

There have been significant changes since I last did one of these. I’ve tried to mark anything new in bold.

Hardware

Since I last updated this in 2013, my hardware has changed significantly.

I am still maintaining a dual Mac setup. My daily driver is a Late 2015 27" Retina 5K iMac with a 1TB SSD and 32GB of RAM. After nearly five years, I replaced my old 2010 iMac that was starting to show its age when compiling Swift. Swift eats hardware for breakfast, lunch, dinner, and fourth meal. I’d say this was Apple’s genius plan to sell more Mac hardware, but they can’t be bothered to update their hardware lineup regularly so there went that theory.

At home I am using my 15" Retina MacBook Pro with a 1TB SSD and 16GB of RAM. This is one of the new Touch Bar models and it’s fine. I somehow have been able to survive without a physical escape key or a row of function keys. I assume this makes me lose some sort of geek cred. Sorry, nerds.

I used to be a big Dropbox user, but I’ve moved all of my files over to iCloud Drive because it’s good enough. I take advantage of the Shared Desktop and Shared Documents functionality of macOS Sierra. Photos are stored in iCloud. Calendar and Contacts too. It works, usually. There wasn’t anything wrong with Dropbox, but it was just another thing I was paying money for that wasn’t super necessary when there’s a good enough alternative baked into the OS now.

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 2 for swiping and gesturing between full-screen apps and Mission Control. I am a big user of multitouch gestures in Sierra, so I am incredibly comfortable using the trackpad.
  • On the right side of my iMac I use a Logitech MX Master to do all my pointing and clicking. It has more buttons than I have fingers, but somehow I have found a way to map a unique action to each one.
  • Time Machine backups are handled by a 4TB LaCie d2 Thunderbolt 2 drive. It's fairly quiet and is one of the few external drives I've found that doesn't have a horrific design. The blue light has a piece of duct tape over it though because it was distracting.
  • I connect to the Internet through my Netgear Nighthawk X8. It has four giant antennas on the back and looks like it may take off at any point. I am interested in trying something like Eero in the future, but for now the Nighthawk works.

Software

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 - I know Apple keeps trying to improve the documentation viewer that ships with Xcode, but I am still a loyal Dash user. Not only does it work with Apple’s documentation, but having other languages I may be using accessible as well is a big win.
  • 1Password - One of the first tools I install. I store not only passwords, but also things like Amazon access keys, SSH credentials, and a variety of other things I need to secure with 1Password. Hopefully it’s more secure than the DNC email servers.
  • OmniFocus - I don't know how I ever stayed organized before OmniFocus on my three screens. It's my brain. With my work tasks, I tend to take what I am currently working on and break it down into separate OmniFocus projects that I can focus on as a daily task. It’s easier than tracking everything in Asana or whatever bug reporter of the week my clients are interested in.
  • Atom - The last time I wrote one of these posts, I was a devout Sublime Text user. Before that I was a BBEdit user. Now? Atom from GitHub. I use Atom for any non-Xcode related development tasks I have as well as looking at log files and other random bits of text.
  • Tower - I can use Git via the command line if I have to, but I don’t see any reason to when there’s a powerful app like Tower there to do hide all the weirdness from me. I probably use this app more than any other third-party app on my Mac.

Developer Tools

  • Xcode - If you write macOS, iOS, tvOS, or watchOS applications, you spend most of your life in Xcode and Instruments. I am no different.
  • 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. I also like to funnel our reviews into a Slack channel so we are more aware of what users are saying.
  • Base - Core Data generates a SQLite database under the hood. 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.
  • Color Picker: Must have. Choose whatever color you want and then it will output a UIColor or NSColor for you.
  • Git: I am now exclusively on Git for version control. Thanks, GitHub.
  • HockeyApp - I am using Hockey for handling crash reports. Microsoft bought them a few years ago and continues to improve the service with other features, but I find the crash reporting to be the only indispensable function. At least until I can learn to trust iTunes Connect.
  • Hyper - I am using more Electron apps by the year it seems. Hyper is a replacement for Terminal built on Electron. I don’t do anything special with it over the bundled Terminal app. I just like how it looks. I am such a Mac user.
  • 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. It’s too bad this is seemingly abandonware. It’s a great app that I plan to keep using until it no longer launches.
  • 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.
  • Realm Browser - Core Data is trash. I’d use Realm for every app if I could. Since Realm uses a custom format for its database you need an app to inspect it. For SQLite you use Base. For Realm, you use this.
  • Paw - I keep a Paw document for each API that I interact with so that I can quickly test out API calls to see what the JSON returned is.
  • Sketch - If you work with a designer they are most likely using Sketch. Keeping a copy nearby so you can inspect files is handy. I also use it for my super rudimentary design on this site.
  • 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.
  • Slack - If you work for a startup, you are contractually required to use Slack at this point.
  • VS Code - If you take all the disdain I have for Xcode and inverted it, you’d have my affection for Visual Studio Code. A powerful programmer IDE that gets meaningful monthly updates and has a vibrant, useful plugin community? I’m in love.
  • xScope - I use xScope to detect colors on various UI elements, check alignment of controls and to measure the distance between objects. If you (or your designers) are meticulous about your UI, it's an essential utility.

User Tools

  • 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 for when I am burglarized for the third time this decade.
  • iStat Menus - Since Swift enjoy eating CPUs for breakfast, I like to have a quick way to see how taxed my system is during compilation. iStat sits in my menu bar and gives me all the essential info I need.
  • 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.
  • Pastebot - I never thought I would be one of those clipboard manager people, but Pastebot is so simple that I converted. The ability to sync my clipboard over iCloud is honestly what won me over. It’s like Handoff’s copy/paste support, but reliable.
  • PDF Expert - Preview is a fine PDF viewer, but I’ve come to adore PDF Expert because of its editing capabilities and super easy signing of documents.
  • Rocket - If you’ve adapted to using Slack for throwing emojis out, Slack brings that functionality to your Mac. Now I can easily throw out a 💯without a few keystrokes.
  • Soulver: Soulver is the best calculator app on the planet. There is no debate.
  • 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.
  • TunnelBear - Since the United States Congress seems keen to allow ISPs to sell all my data without my consent, I tend to run a VPN as much as possible these days. TunnelBear is my preferred one for the last few years. It doesn’t hurt that their branding is adorable.
  • Twitter for Mac - You probably use Tweetbot, but I actually prefer the official Twitter client for desktop tweeting. Sorry to all those offended.
  • Ulysses - I wrote this entire post in Ulysses. In fact, I do most of my writing in Ulysses these days. It’s both a fantastic Mac and iOS app.
Read more about. . .

My iOS Development Kit - January 2016

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.

Carthage

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.

RxSwift

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.

SwiftyJSON

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!

Realm

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.

Aspen

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.

Fastlane

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.

Read more about. . .

My Ultimate Developer and Power Users Tool List for OS X (2013 Edition)

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.

Hardware

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.

Software

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.

Developer Tools

  • 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.
  • CodeRunner: There are times I am writing a small snippet of code to share with someone or just to test an idea on my own. I don’t necessarily need the full power of Xcode, so CodeRunner comes in quite handy. It’s even more useful in its support of other languages like Ruby and JavaScript.
  • 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.

User Tools

  • 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.

Audio Production

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.
Read more about. . .