Objective-C is like Jimi Hendirx
The first time I heard Jimi Hendrix I had no idea what all the fuss was about. Sure, it was great, but it wasn’t changing my life. Maybe a decade later, it hit me: thirty years previous, he’d changed every guitarist’s life and changed the sound of guitar music forever. He was the first person to play a guitar like that but it happened before I was born, so I just accepted the post-Jimi guitar sound as normal and nothing special.
I’m getting some sense that Objective-C is like that. Books, manuals and grey-bearded Objective-C programmers bang on about how marvellous the runtime is and the power of code introspection and method swizzling and dynamism and I’m thinking, “Yeah, so what?”. Even as a Java programmer, I just expect my programming environment to have those features.
But as a C programmer in the 1980s, this stuff must have been fucking mindblowing! Having joined the industry in the late 90s, the languages I’ve used have been mostly paving over the trails blazed by Objective C (and friends) without needing to carry the burden of backwards compatability.
So if you’re new to Objective-C and, as I am, struggling to come to terms with the fact that it’s one great big leaky abstraction on top of C, put yourself in the shoes of an 80s C programmer and remember you get to use these neat “modern” features in a systems programming language.
 Yeah yeah, Java’s hardly “dynamic”, but most of the rest of the “amazing” bits of Objective-C can be (and regularly are) done with reflection and aspects. If you squint really hard, you can even use anonymous classes to pretend you have lambdas.
No really, I want to start a band!
That said, there are a lot of “musicians” in Appsterdam who would quite like to form bands. But as any black-t-shirt-wearing highschooler knows, it doesn’t work very well when six guitarists show up to a jam session. Just as a successful band will need a rhythm section, singer, songwriter, road crew and tour manager, a successful app product will need back-end developers, designers, support engineers and marketing.
So consider this an open invitation: don’t be scared off participating in Appsterdam events just because you’re not an Xcode maestro. I’m seeing a growing realisation among my “lead guitarist” colleagues that killer riffs aren’t enough. The audience needs to be addressed on its own terms and that’s something many of us aren’t the best at. We see the value that great marketing, design and other skills bring and we realise we need help in those areas.
Lots of developers are looking for people who want to be equal partners in building successful products. If you have experience in any of the other skills necessary to bring a great app to life, if you’ve got money to invest in a great performance or if you’re just smart and keen to learn, we’d love to meet you.
Let’s start a band!
“Hey, let’s start a band!”
“Cool, what instruments do you play?”
“I don’t play any instruments.”
“Oh, so you’re a singer?”
“No, I can’t sing.”
“Do you write songs?”
“What records have you produced?”
“Can you book us gigs?”
“No. I’m not a sound engineer, A&R person, tour operator, venue owner, merch supplier or roadie either… but I’ve got a really good idea for a band name!”
Every app developer has had the above conversation with an enthusiastic but overly optimistic (and possibly misguided) person who’s got a “great app idea and they just need a dev to implement it”. It’s come up a few times at Meeten and Drinken and my preferred strategy is, as gently as possible, to disabuse our hopeful friend of the notion that it’s as easy, fast and cheap (!) as they think it is.
“What’s the best way to get my app built?”
“Offer a developer €150/hour to build it.”
“Oh, ah, well, what’s the second best way?”
Diary of an app: hallway usability
With a basic-looking but functional app in hand, I headed up to Portland for a week. I had no idea that CocoaConf was on, but it was and a friend hooked me up with a ticket at the last minute and so I got to go. It was a great experience for a number of reasons, but pertinent to this series of blog posts, I got to show a few people my prototype app.
In an ancient blog post, Joel Spolsky gives a valuable piece of advice which I’d rarely had the opportunity to use: do hallway usability testing. Turned out he was right! I gave a few people the spiel about what the app was for and then handed them my iPhone. They all had the same problem: they didn’t know where to start or what buttons to press. The interface wasn’t discoverable.
Of course, it all made sense in my head and what’s more, my “type it all in as an equation” interface was flexible enough to cover all my use cases. I started thinking, “Well, I could have some kind of demo mode or hints page the first time you start up the app…” and then, thankfully, the more intelligent half of my brain slapped the other half with a fish. If you see a sign on a door that says PUSH, someone somewhere fucked something up.
Diary of an app: prototype the first
An early exploratory scribble in Paper
My original idea was two text fields, a keypad and some buttons for units. You’d enter a mathematical expression, like “6 x 33cl @ $15.99” in one field, vs “750ml @ $4.99” in the other; if the expression would parse, I’d make the cheapest one glow green or something.
Simple in concept and also simple to execute, I thought. A couple of text boxes, a keypad (helpfully already provided by iOS), grab a parser library from GitHub and Bob’s your uncle. Except it turns out he’s not.
First the keypad. There is one provided by the platform and you can configure IB to give you the “decimal” keypad for a certain text field. But you can’t customise it. I wanted “✕” and “@” keys (on the right hand edge), but you can’t just do that. You have to write your own keypad from scratch if you want any thing different to the stock keys. This is doable, but not simple the first time you do it. But I did it and got it working.
So on to the parser library. There seem to be two, ParseKit and CoreParse. I chose CoreParse because it just felt more modern and “iOS-like”, but it was kind of arbitrary. After the obligatory yak-shaving mission required to get a working git on my machine (install Homebrew, which requires a ruby update, install git, which requires an Xcode tools update…) I was for the first time properly stumped: how do I “include” a 3rd-party open source project in my app in Xcode?
What does that even mean in the context of Objective-C and Xcode? I had no idea and it seemed to be one of those things that everyone just knows how to do. It took two days of puzzling through Stack Overflow and tangentially related blog posts, cryptic linker errors and a lot of help from the author of the library (there was actually a bug in the .xcproject file as shipped) to get it working.
This and a bunch of similar experiences got me to realising how primitive a whole lot of the iOS development toolchain is. Never thought I’d say it but I miss Java’s mature tools like
Eclipse IntelliJ and Maven Ant Gradle. After coming from a higher level platform such as Java it really feels like Objective-C is still merely a few clever preprocessor macros on top of C from the 1980s.
Diary of an app
I want to build iOS apps for a living. I’m in that Catch-22 situation where I don’t have any experience on the platform because almost nobody will employ me somewhere I can gain some experience if I don’t have any experience.
The way out of this is to bootstrap my skills by building something myself and getting it on the App Store. This has turned out to be a much more interesting process than I thought it would be, for reasons I didn’t expect. So I thought I’d blog about it.
Famously, the best software is born of developers who are “scratching their own itch”. According to Malcom Gladwell I’m a maven and I always got out my (phone) calculator to make sure I wasn’t being ripped off in the supermarket by buying the “economy” size, which sometimes turns out to be more expensive per unit than the smaller pack.
Many supermarkets have “per unit” pricing indicated on the shelf labels but not all; furthermore, I came across a situation once in the USA where I wanted to compare “1lb 4oz” to “1.45lb” of ham. Now that’s just silly, America: if you want to use Imperial units you’re not allowed decimals, ok?
In any case it’s a calculation that’s straightforward but awkward to do manually and exactly the sort of thing a simple iOS app could be built to solve. So the elevator pitch for my app is this: You’re standing in front of a supermarket shelf, faced with a number of different packages of an item in different quantities for different prices. Which one’s cheaper? This app will tell you.
Pretty simple right? Turns out no, but not for the reasons I expected.
Well, lookie what arrived via DHL here today!
"Vocational Programmer" courses considered harmful
I read Anil Dash's post about the Blue Collar Coder the other night and it instantly raised my hackles. There are a couple of superficial problems I have with the piece, and one fundamental one.
Firstly, it’s a very US-centric take. This shouldn’t raise my hackles, Anil is an American and was talking specifically about US education policy and he’s perfectly entitled to do so. But my career as a programmer has taken me around the world a couple of times so far and I reckon I’ve got more than a few laps left. Professionally I really do regard my colleagues and industry peers as my karass no matter where they be, and absent any other connection the 20-odd million other people who happened to born in the same end of the planet as me are obviously a granfalloon.
Furthermore, it’s a very Silicon Valley-centric take. There’s an assumption that the only things to ever advance the discipline of computer science or consumer web software were invented within a fifteen minute bike ride from the Caltrain. This is demonstrably not true, and misses the fact that the most investor value ever destroyed and otherwise productive time wasted in the industry has happened here in the Valley too. I’m just getting a peek into the culture here but it strikes me that a lot of people confuse volume of activity and funny-money capital raisings for genuine value.
But the real problem I have is with the fundamental concept of a “Blue Collar Programmer”. It’s been said over and over again, and ask any programmer who’s ever worked as part of a team, the difference between the worth of a good programmer and a merely average one is many orders of magnitude. If all you want is a prototype that’ll hold together long enough to fool the investors, fine, get some poorly-slept Red Bull-pounding “brogrammer”. But if you want to build a large, maintainable, sustainable product that will deliver value to a business release after boring monthly release, it’s a marathon not a sprint and you need people with a solid theoretical foundation in their discipline who are good at their jobs and care about their craft.
A Computer Science degree isn’t the only way to get this of course, and having one isn’t a guarantee. But the I think the idea that you can start churning out cut-rate “vocational programmers” in order to do boring work inside non-startup companies (versus the postgraduate geniuses who work in startups who are obviously the only ones who do anything interesting or valuable) is fundamentally misguided.
Shitlist for today
Won’t accept non-US credit cards, despite the web form allowing me to select one of a dozen countries that isn’t the USA as a billing address. When I called, I was told they used to, but management changed the policy and the site hadn’t been updated.
Site was slow and/or totally broken on Safari (alternately giving me a shitty error page or returning a string of JSON to the browser) and doesn’t work at all in Chrome on the Mac. On the iPad I managed to get to the point where I found out they don’t accept non-US credit cards.
Presented me with a form that refused to accept an email address of the form email@example.com as valid, despite the fact that it is clearly valid and it’s actually my goddamn PayPal login!
Another strike off all of the above for not allowing me to paste a phone number of the form “+1 (123) 555-6789” into any field that asked for one.
It’s 2012 people, stop letting arseholes write the validation on your web forms.
Maybe Apple should buy Square
In a recent Talk Show episode, Gruber and Moltz discuss Andrew Ross Sorkin’s mostly outlandish list of suggestions of potential Apple acquisition targets. I read the list before I’d listened to the show and it gave me a case of terminal eyeroll too.
There’s one thing I think they missed though: I can see some value to Apple in Square’s business. It’s not the technology; I agree, the Square card reader is chintzy and replicating the back-end services is a simple matter of programming. But having seen the credit card acquiring business from the inside, the most valuable part of a running acquirer is not the the technology but the relationships with the card schemes, payment processors and regulators.
The real triumph of Tyro’s early days was being granted a license to acquire credit and debit card transactions and obtaining membership of the Visa and MasterCard schemes. Before us, it hadn’t been done outside of the Big Four banks and we were the first applicants for one of the new SCCI banking licenses. This led to a whole lot of silly Catch-22s like us being required to have scheme membership before we were granted regulatory approval, with regulatory approval being a precondition for scheme membership.
Forming the relationships necessary to navigate this bureaucracy was not a trivial task and took a lot of time and money to accomplish. The payments industry is organised differently in the States I know, but if Apple want a faster way in to being a general card acceptor and/or payment processor, buying Square could be a good value way to do it.