On Tooling

I started coding in two ways. When I was 13, I tried a little bit of C. I didn’t get very far, in fact I wrote something like this before I got confused and bored:

Basic C program — Hello World.

The other way I tried was using iWeb  — A visual WYSIWYG editor for making websites. I of course hacked around with the CSS and HTML it spat out. But I ask you — can you guess which one I enjoyed more?

Tools + language, not just the language itself, makes a developer productive. And somewhere, I feel we lost that. Tools can make up for flaws in languages, but can also enhance productivity for languages that are just fine.

Yesterday as I went to write some Swift 3 code in Xcode 8.1, the editor crashed. A restart of Xcode didn’t fix it and I was unable to even use autocomplete to fill out some nontrivial block syntax.


Adding insult to injury, I certainly can’t refactor my stuff either! In fact, try use anything from Xcode 8’s (7, or 6!) ‘Refactor’ menu and you’ll get this depressing dialog box.

Error message stating Xcode can’t refactor Swift

We’re on year three of Swift. Version 3. And the tooling still sucks. 

I was just at Microsoft Ignite here in New Zealand, and I have to hold Microsoft up as the company that does Tooling so well. I spent a few years doing .Net as a student, and quite frankly, I loved it. C# is a solid language to work in, with lovely OO and Functional (LINQ) capabilities and around it, a bunch of awesome tools such as Visual Studio, intellisense, ReSharper and more!

I spent the week quite frankly being quite jealous of the tooling. From VS you can publish directly to Azure and all sorts of other things. And then even Azure is a brilliant collection of tools that intertwine and integrate better than a plate of linguini.

Typescript, Microsoft’s new is actually leading the way with something they call a language server protocol, meaning as long as your editor speaks the protocol, you get all the features like intellisense and autocomplete. Even Rust is following. Such innovation. Wow.

In the other camp, our frenemies in Android land have Android Studio which is superb, and they love to bemoan Eclipse, which is still better than Xcode. Sure, they have to put up with Java, but since Java 7 it’s been quite nice and 8 just came out and it looks great too. Heck, even PHP has been good since v5.

You might say “Oh I’m too good for IDEs, I just use Vim”. Sure.. but wanna try tell me you have no vim plugins? Exactly. Tools.

Look, I’m not trying to have a go at language innovation (it’s great!), but this obsession we have with building new languages such as Swift and it’s features just has to be be matched with the innovation of tooling as well. Refactoring, renaming, style checking, unit testing and more must come with a new release. Rust is doing well with errors. Elm is following suit. And one could argue Go has had notable influence in its focus on really fast compile times and standardised syntax formatting (by way of the gofmt tool). Why is Swift lagging?

Sure, the official line seems to be “it’s on the list”, but I’d argue we could have at least got class renaming before several versions of Swift. It’s great they’re adding new features from other languages — but it’s not great that it is at the expense of the surrounding developer experience. With that said, do Apple really expect us to commit to Swift? How about for the Server and other places?

Still not getting it? How about this: since we like to call ourselves engineers, let’s take a more direct metaphor from our Civil Engineering friends. Swift is a new type of material, but we have nothing to mold or shape it with. Tools and materials go hand in hand, and we’ve forgotten that. It’s no different with Software Engineering.

Hey Chris Lattner. Love your work, but how about next year we don’t get a week-long migration process and instead get some better Swift tooling?

Don’t forget, Tools + language, not just the language itself, makes a developer productive.


/rant So that’s my current thinking on this topic. What are your thoughts? Leave a comment or ping me on Twitter — I’m @samjarman.