Tuesday, May 20, 2014

On Making Sure You Test Against the iOS Versions You Support

I am not used to getting 1 star reviews against TV Towers USA. My small niche of RV enthusiasts are usually a happy lot. However, I made the big mistake of pushing an update (I guess the first one was 1.6) which was marked as supporting iOS 5.1 (i.e. the last for the original iPads) without testing against either a device—which I don't own—or the iOS 5 simulator—which Apple no longer provides. And it crashed on first launch, and if it had survived that crash it would have crashed again, and if it survived to finish launching it would have crashed on showing a detail page.

My father, of all people, had an iPod Touch still running iOS 5 that one of my sisters had given him, and he was nice enough to overnight it to me. It's not his favorite device; an iPhone without the phone he calls it.

Crash number one was probably the issue of iOS 5 not handling binaries which include a 64-bit compile. I had fixed that one in TV Towers USA 1.6.2 when I was blindly trying to fix the app.

Crash number two was at the linking stage. My own SVGgh library included a routine to build up an attributed string version of an SVG path and it had included a reference to the NSForegroundColorAttributeName constant string. Which wasn't available under iOS 5 and caused the app to exception out during launch with a symbol not found error. It isn't even used in this app, but the linker doesn't know that.

Crash number three was that some of my xibs were marked to be of the 6.0+ format instead of 5.0+ format.

And crash number four was that the table data source in the tower detail pane was using the category on NSIndexPath that returns an item instead of the archaic row property. This is a bit of syntax sugar made for use with UICollectionViews, so it, of course is not available under iOS 5.

Everyone of these issues was quickly fixable. And I failed my users by not keeping track of my supported OS versions and at a minimum running through the app before overwriting their existing, working copy.

And, I still don't have an iPad running 5.1.1, so I will just have to pray that there is nothing in the small amount of iPad only code with some similar present for me.

Sunday, May 11, 2014

On Dropping Support for the Original iPad

As an iOS developer, I'm often forced by my development tools to make support decisions. Xcode running on OS X 10.9 no longer allows me to run the iOS 5.1 simulator. Nor will it build an iOS app that simultaneously generates 64-bit instructions and supports iOS 5.1. Therefore, the version of TV Towers USA I just submitted for review (1.6.2) will be the last thing I'm likely to ever write which will run on the original iPad which maxed out at iOS 5.1.1.

I think the decision to limit the original model to 256 MB of RAM turned out to be a poor one on Apple's part as it shortened its usable lifespan hugely. If it had shipped with 512 MB, it would likely have gotten at least to iOS 6.  As it is, the last time I touched an original iPad, I was struck by how unresponsive it was compared even to my iPad Mini. Giving customers such a poor experience is not something Apple usually does, and I hope they've learned their lesson.

Saturday, May 10, 2014

A Developer of Code Taking the SalesForce Dev Certification

For reasons I won't get into, I took the Salesforce Dev Certification exam this week. Salesforce, for those who don't deal in enterprise software, is a cloud based solution for providing ways for companies and other organizations to keep track of things like sales leads, or the effectiveness of marketing campaigns. It's practical, focused and unsentimental. Salesforce developers normally create custom apps by "clicks not code" using the web interface to build up data models and work flows. Salesforce provides a series of certification exams, the Dev certification having a reputation as being the easiest to take.

Therefore, I spent much of the last few weeks reading, watching videos and walking through tutorials and workbooks. And for a developer who creates custom apps through code, and then more code, it was darn hard. Harder for an experienced coder because Salesforce co-opts common programming terms for new usages all the time. Think you know what an 'object' or a 'field' or a 'record type' is? Well think again. Think a 'checkbox' is a kind of a widget, well how quaint.

And it is all so arbitrary, 2 Master-Detail fields per object max, 3 External IDs per object, workflows can create Tasks but not Events, or is it Events but not Tasks...

I've been trying to polish up an explanation for programming constructs that are nearly universal, unchanging and therefore transferable from system to system: those made by God like the for loop or the delegate pattern, and those constructs that are ad hoc, arbitrary, and require memorizing every corner because there is no pattern to recognize, those made by Men like, oh I don't know, the Win32 API. I was taught to be a scientist, I got through college and graduate school not through memorizing every little thing, but in learning the patterns and principles of the universe and applying them. You can do a lot in an hour's Physics test with Newton's laws of motion and courage.

Getting ready for a test by rote memorization is not my thing.

Which is not to say that Salesforce is bad. In fact, for what it does it's kind of great. While I was studying away, I could observe my wife manually preparing to cold call a large number of organizations to sell them on a new (let's say) product. A big mess of phone numbers and eMail address she was gathering and putting into Excel. I realized how better organized and efficient she'd be if I just took what I was learning and made a few customizations to a Salesforce 'org'. And that would be for just a one-woman sales team. The network efficiencies for a large team would be huge. Same thing with my Dad's private plane brokering service, if I could get him better organized, he'd sell more planes.

So I went to the local proctored test center, took the test and by some miracle of preparation and methodical mastery of the multiple-choice form, I passed.