00:00:05 ◼ ► And I'm David Smith. Under the Radar is never longer than 30 minutes, so let's get started.
00:00:10 ◼ ► So today we wanted to talk a little bit about compatibility, testing, and those types of things.
00:00:28 ◼ ► I guess a week and a day ago, I had to really think about it, because whenever a new iOS release comes out,
00:00:35 ◼ ► you have your last opportunity to go through your testing devices and work out which ones you want to upgrade,
00:00:45 ◼ ► because obviously after iOS 10 comes out, it becomes much more awkward or tricky to revert a device back to iOS 9
00:00:54 ◼ ► or do something like that, and so it just seemed like a topic that was worth thinking through in the way we approach it,
00:01:00 ◼ ► because back in the day, back in the early days of the App Store, I used to keep a very comprehensive compatibility suite,
00:01:11 ◼ ► where I used to have an iPad running essentially every version of iOS that it could have been running,
00:01:19 ◼ ► and I had the same thing with a device or an iPhone or an iPod Touch running every version of iOS possible,
00:01:29 ◼ ► I used to keep devices around even once I was past a point where I would no longer support them anymore,
00:01:39 ◼ ► I think at this point, iOS compatibility has changed, I feel, where A, it used to be that there was only one screen size,
00:01:47 ◼ ► and so if I had an iPad running a particular version and I had an iPhone running a particular version,
00:01:54 ◼ ► I completely covered all of my possible configurations, whereas now, if I were to actually try and do this,
00:02:00 ◼ ► and every now and then you'll see images from companies like Facebook or these big, huge development companies
00:02:06 ◼ ► where they actually still have this, but if I wanted to have all the different screen sizes,
00:02:11 ◼ ► so I would have had to have the 4s size, the 5 size, the 6 size, the plus size, the iPad, non-retina, the iPad retina,
00:02:25 ◼ ► the big iPad, it starts to get really complicated, because now if I wanted to even keep that for two different versions,
00:02:32 ◼ ► I suddenly have twice that, or if I wanted to keep it for three versions, say I wanted to have iOS 8, 9, and 10,
00:02:37 ◼ ► now suddenly I have three times that many devices, and that just becomes completely impractical,
00:02:46 ◼ ► And so now, for the most part, I just have a sacrificial device that I keep running the oldest, I think,
00:02:55 ◼ ► which at this point for me is usually iOS 9. I don't think I support anything below that on any of my apps,
00:03:00 ◼ ► and so I'm just like, you know, if some user is still running iOS 8 and contacts me with an issue with something weird in iOS 8,
00:03:08 ◼ ► it's kind of like one of those "sorry, I just can't deal with it," but it's still something that I think about.
00:03:14 ◼ ► On my desk, as I'm sitting here, I'm surrounded by iOS devices. I have, let's see, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 iOS devices
00:03:24 ◼ ► in my line of sight right here, and so it is still something that I do, but I'm curious, we used your approach,
00:03:37 ◼ ► I don't actually keep that many of them. I used to be like you, like what you're describing,
00:03:44 ◼ ► how I would try to keep one on every major version and all the different screen sizes and everything,
00:03:49 ◼ ► and I realized about a year ago or so, I realized that it had been a very long time since that theoretical email had ever come in about like,
00:04:04 ◼ ► Like, I know that wasn't a real OS, but oh well. I know somebody out there would be like, "Wait a minute!"
00:04:10 ◼ ► You know, I always thought that I needed to keep all these testing devices just in case somebody had a problem
00:04:16 ◼ ► and I couldn't reproduce it in the simulator, and the fact is that just hasn't happened in years.
00:04:24 ◼ ► And the fact is, in general, as we move kind of higher level in capabilities, in the programming languages,
00:04:35 ◼ ► and especially things like memory on these devices, the opportunities for those, for like one particular version
00:04:44 ◼ ► of the iPhone or iPad to be a problem for your app that you need the hardware to reproduce,
00:04:54 ◼ ► With one exception, I know our friend James Thompson, who writes Peacock, just had to get an iPhone 7 Plus
00:05:00 ◼ ► because his widget was crashing only on the 7 Plus and not on the 7, so he's been testing with that.
00:05:07 ◼ ► But that's the first time I've heard about anybody needing to do that in quite a long time.
00:05:11 ◼ ► Because, you know, really these devices have so much memory, so much fast performance now,
00:05:17 ◼ ► such great CPUs and GPUs and everything, that you really, like most apps are not going to be pushing the boundaries
00:05:31 ◼ ► You know, games might be a different story. I would imagine games need a lot more testing hardware
00:05:44 ◼ ► that aren't really games and aren't really pushing the boundaries much in terms of performance or memory,
00:05:48 ◼ ► I don't think you really need that at all. I mean, again, there was a time when we did,
00:05:53 ◼ ► but I think that time was a long time ago. And the issue of expense really can't be overstated.
00:06:10 ◼ ► And people who are just starting out, who are, you know, maybe they don't have a lot of money to spend
00:06:18 ◼ ► on extra devices or, you know, testing devices, like most people, their testing devices are just their own personal devices they had anyway.
00:06:25 ◼ ► And by the way, that's me too. I have never bought a testing phone except for the 6 Plus.
00:06:35 ◼ ► I know a lot of developers do this. I just never have because I just have my current phone
00:06:57 ◼ ► I have last year's phone. I will occasionally use my wife's phone or her last year's phone if we still have it,
00:07:03 ◼ ► which we usually do. And the only things I really use them for are not really for OSes.
00:07:09 ◼ ► They're really for performance. Because my feeling is if you have the, you know, some like, you know,
00:07:17 ◼ ► one to two year old device, it is completely reasonable to require you to run the newest OS in most cases.
00:07:28 ◼ ► but like I don't feel like I really need to have hardware to test like last year's iPhone on last year's OS.
00:07:43 ◼ ► I don't really support this edge case that you're running into on this two year old OS.
00:07:49 ◼ ► Please update if you can." You know, so that, in practice, having that kind of attitude towards OS versions
00:08:01 ◼ ► with the kind of people who use your app, with the amount of support you have to give in whatever business you have.
00:08:07 ◼ ► It's different for people like consultants where you kind of can't give the middle finger to anybody who's using the app.
00:08:14 ◼ ► Like, it's kind of your job to make it work. But for indie developers selling your own app or making your own app,
00:08:21 ◼ ► I'd say you really don't have to have that many devices, and you don't really have to worry too much about those edge cases anymore.
00:08:26 ◼ ► Yeah, and I think there's certainly something too that the simulator too, I would say, has gotten a lot better,
00:08:33 ◼ ► and is just a much more useful and practical tool for doing a lot of the kind of compatibility work.
00:08:39 ◼ ► But obviously there's certain classes of problems that you can never verify or look at on the simulator.
00:08:46 ◼ ► You know, things that are performance related or memory bound or these types of things.
00:08:49 ◼ ► The simulator isn't a great tool for that. But for things like layout problems, and those types of issues,
00:08:57 ◼ ► which are honestly, like the biggest issues I tend to have going from device to device are layout issues,
00:09:04 ◼ ► where something just doesn't look quite right on, usually for me, I'm going through my development on my,
00:09:11 ◼ ► and I guess it's now my iPhone 7, I keep trying to call it an iPhone 6s, but on my iPhone 7 now,
00:09:16 ◼ ► I'll be doing my development, it's great, and then I'm getting ready to ship it to the App Store,
00:09:20 ◼ ► and I launch it on the SE simulator, or one of the old smaller narrow ones, and suddenly all my layouts look terrible,
00:09:28 ◼ ► and there's all these dot dot dots at the end of all my labels because I'm so used to having all this extra screen real estate.
00:09:44 ◼ ► and moreover, you can switch between things so much more quickly, and you can set up test databases and things like that really quickly,
00:09:51 ◼ ► because you have file system access really straightforwardly to each of the simulator instances,
00:10:03 ◼ ► so say I'm working on Pedometer++, so I have this huge step history going back years and years,
00:10:08 ◼ ► I just copy the database out, and then I can paste it into all the different simulator file systems,
00:10:17 ◼ ► I mean, the simulator's a great tool, and a funny little anecdote, I shipped my first iOS app to the App Store,
00:10:30 ◼ ► I had done all of my development on the simulator, and I didn't buy an iPhone because at the time they were expensive,
00:10:36 ◼ ► and I looked at the cost of buying an iPhone, and I was like, "Oh, man, I'm not even sure if this whole App Store thing's going to work out.
00:10:53 ◼ ► but you can go a long way with just the simulator if that is what you need to do from a cost perspective,
00:11:13 ◼ ► Is this MacBook or whatever good enough? Can I develop on this? Do I need testing devices? What devices do I need?"
00:11:23 ◼ ► The answer basically is, you can develop on pretty much any Mac, and you don't really need any test devices necessarily,
00:11:36 ◼ ► And that's like, basically, having anything more than that, having the fastest Mac or a bigger screen,
00:11:52 ◼ ► Like, for example, one of the reasons I use multiple test devices is I always keep one of them
00:11:58 ◼ ► logged into an in-app purchase sandbox store account, because I don't know if this is still the case,
00:12:10 ◼ ► trying to do sandbox testing of in-app purchases on your main phone, which requires basically, like,
00:12:29 ◼ ► trying to basically shuffle two different app store accounts, one of them being a sandbox account,
00:12:36 ◼ ► So having a separate device, which in my case is an old iPhone 5S, that is only used for in-app purchase testing,
00:12:44 ◼ ► and you never touch the in-app purchase sandbox on any other device, on your main device that you use every day,
00:12:50 ◼ ► that is really handy, because you don't want that complexity, the confusion of having some apps logged into the sandbox,
00:12:58 ◼ ► some apps not logged into the sandbox, different apps trying to restore purchases from different accounts,
00:13:01 ◼ ► and some people who use multiple Apple IDs or who share one with their spouse or their family,
00:13:12 ◼ ► but to have in-app purchase stuff, it is very nice to have separate devices just for that purpose alone.
00:13:19 ◼ ► And to do various testing of things like, has this in-app purchase account bought the purchase before?
00:13:32 ◼ ► So having different devices that just make that stuff faster and easier to test and will keep complexity and crap off your main phone.
00:13:38 ◼ ► But those are all just luxuries. If you only have one iPhone or an iPod touch or one iPad, you can do quite a lot with just that.
00:13:47 ◼ ► Yeah, and it's the thing that I was just recently pulled up, I maintain a stats page of all the stats from one of my apps called Audiobooks,
00:14:05 ◼ ► because it's a very broadly used app in terms of it's not like a lot of my other apps are fitness related,
00:14:10 ◼ ► and so they only work on, sorry, are they most used by people who have more devices that have a motion processor and these kinds of things.
00:14:20 ◼ ► So you have this app that goes all the way back. I mean, I have people still using it with the iPhone 3GS, I think.
00:14:31 ◼ ► I think what's fascinating too is how modern and quick Apple has been able to get people to kind of be into the cycle of updating.
00:14:40 ◼ ► So I look at these devices, so other than for what you're saying, we're having these devices for specific uses.
00:14:47 ◼ ► Like I have, for example, I still have, like my 5Ss are my most precious devices to me right now from a testing perspective,
00:15:01 ◼ ► So anything before a 5S, which is when they introduced the motion processor, is irrelevant to me.
00:15:06 ◼ ► But 5Ss are really important to me because I expect, at least until Apple drops, you know, whatever,
00:15:12 ◼ ► if in iOS 11 they drop support for the 5S or something like that, until that happens, that's where, if I can make my app work, that's most important.
00:15:20 ◼ ► But in general, the thing that's kind of fascinating to me is one of the stats I keep is the average device age.
00:15:45 ◼ ► But if you go back, it's only about two or three years is sort of the average device age, which is not too bad.
00:15:54 ◼ ► And the majority of my use is coming from iPhone 6s, iPhone 5Ss, 6S, 6 Plus, and yeah, that is, to do the quick math in my head,
00:16:10 ◼ ► And so people are, you know, it's the delightful thing that while the iPhone was successful early on,
00:16:17 ◼ ► there's just not as many of those old devices still in use, that there's just not as many 4Ss or 5s or 5Cs and those kinds of devices.
00:16:32 ◼ ► Like, for better or worse, and maybe this will change as, you know, go forward, we hear all these things where people are,
00:16:37 ◼ ► "Oh, maybe I'll skip this," you know, "Maybe it's going from a two-year cycle to a three-year cycle," who knows?
00:16:41 ◼ ► But the reality is, there is, you know, I kind of feel bad when I think of the poor Mac developers,
00:16:56 ◼ ► because that's just the nature of Mac hardware, is that it has this different, it's less consumable.
00:17:03 ◼ ► And so maybe, you know, device testing there is more tricky, but for us in iOS land, you know,
00:17:13 ◼ ► Yeah, I wouldn't feel too bad about the Mac people, as they can charge like 50 bucks for software and have no App Store review requirement.
00:17:22 ◼ ► Although, honestly, it is, you know, having a whole bunch of old Macs around is definitely a lot more expensive and clunky than having a drawer full of old iPhones.
00:17:32 ◼ ► But no, I mean, like, also I think you have to consider, like, as an indie developer, like, basically, once you have more users than time,
00:17:40 ◼ ► which, if your app gets any kind of traction, that will quickly happen, you kind of have to be okay with saying,
00:17:51 ◼ ► Like, you have to kind of accept that. You might get an email or a tweet from somebody who says,
00:17:57 ◼ ► "Hey, this is broken on my iPhone 4S," and you'll have to say, "I'm sorry, like, I just can't, I can't put the time into making this work,"
00:18:05 ◼ ► or "I don't have the resources to make this work," or "I don't even have a 4S anymore that will power on to test that."
00:18:12 ◼ ► And so you have to be okay to say, like, to 1% of your customers out there, "I'm sorry, I can't support this."
00:18:20 ◼ ► Yeah, and I think it feels, too, I think it's definitely a trap that I think I can fall into, where as an engineer,
00:18:27 ◼ ► I see, if there's a problem that I think I'm capable of solving, so in this case, if someone says,
00:18:35 ◼ ► "Your app doesn't work on an iPhone 4S," it's like, in my mind, if I had in my possession a 4S, I could solve that.
00:18:41 ◼ ► And so it's like this solvable but unsolved problem is the worst, like, most insidious kind of problem,
00:18:48 ◼ ► that if a user comes to me and says, "Oh, I'm having this weird bug that happens, but it's only when I'm in this situation,
00:18:55 ◼ ► but it doesn't happen all the time, and it seems like maybe it's when I'm switching Wi-Fi from work to home,
00:19:00 ◼ ► but I'm not sure, it doesn't happen," you know, those kinds of bugs, I can very much more easily just put down and say,
00:19:15 ◼ ► But if it seems like it's just a device compatibility problem, there is such this, you know, there's that insidiousness of just being like,
00:19:26 ◼ ► And so yeah, like you said, you have to get comfortable with saying, "There's only so much you can do,"
00:19:31 ◼ ► and it's the weird sort of, like, it is a strange feeling, I think we'll get into this more if we start to talk about iOS adoption,
00:19:40 ◼ ► where being okay with saying, you know, "The needs of the many for your users outweigh the needs of the few,"
00:19:58 ◼ ► and you just have to be okay with that, because if you aren't, you're just going to go crazy.
00:20:02 ◼ ► Well, you know, not only is that, like, not only is that the kind of thing that you should be acceptable, you know, with,
00:20:12 ◼ ► but also, that is what you, like, you actually should be doing that, like, strategically and time allocation wise, too,
00:20:19 ◼ ► like, it is, it's not only that you should avoid feeling bad about not solving the 1% needs,
00:20:25 ◼ ► it's that solving the 1% needs are actually a bad use of your time, like, you should be,
00:20:30 ◼ ► whatever time you would have spent on that, you should probably spend making the rest of your app better for everybody.
00:20:41 ◼ ► it's like those kinds of things where if you focus too much on trying to be 100%, you'll never actually get anywhere.
00:21:05 ◼ ► They're a VPS host, so you get virtual private servers, nice little cloud instances, which is the new name for VPSes,
00:21:14 ◼ ► It is such a great host, so they're incredibly high performance, SSD based, and these are like enterprise grade SSD,
00:21:27 ◼ ► These are the facets available in the cloud market, and they have a 40 gigabit network backing them with multiple levels of redundancy.
00:21:33 ◼ ► They also have an API that makes it really, really easy to automate tasks if you want to spin up more instances,
00:21:46 ◼ ► I have things that can use the API to get a list of all my servers for things like monitoring applications.
00:22:07 ◼ ► If you're using hourly, but you run into the amount that would have been for the whole month,
00:22:13 ◼ ► You don't get pushed over, so you don't have to worry, like, which one do I pick up front.
00:22:29 ◼ ► Once again, linode.com/radar to take advantage of that $20 credit or use promo code radar20 at checkout.
00:22:37 ◼ ► All right, so for the rest of today's episode, it seemed like we also just wanted to briefly touch on something
00:22:44 ◼ ► that always comes up this time of year, but when we start and a new big iOS release comes out,
00:22:50 ◼ ► So at this point, I'm seeing about a week into iOS 10 being in the world, I've seen about 30% adoption
00:22:57 ◼ ► for most of my apps. I think it's a little bit higher in a few of them, depending on how modern of an app it is.
00:23:09 ◼ ► And obviously, it's easy to poke our finger at other platforms where they don't have quite the same adoption.
00:23:16 ◼ ► But this kind of approach that Apple has been able to kind of, in some ways honestly, a little bit overly aggressively
00:23:22 ◼ ► push their new OSes. Like, every time one comes out and it's like, "Would you like to do it now or later?"
00:23:27 ◼ ► You say later, and it's like, "Are you sure? How sure are you that you want to do this later?
00:23:32 ◼ ► Are you going to come back? Are you lying to me?" It gets a little aggressive about it.
00:23:46 ◼ ► And I'm sure it's all these fun new things in my message, and there's lots of reasons that push people to update.
00:23:51 ◼ ► And the result is, very quickly, you start to think about when you can drop support for older OSes.
00:24:04 ◼ ► there's a bit of a philosophical question there that I've definitely talked to developers who,
00:24:08 ◼ ► in their mind, they want that just dropping support for its own purpose is kind of, philosophically, doesn't work for them.
00:24:29 ◼ ► That even if theoretically I could support the old version, there's not this breaking feature that makes it so that I can't.
00:24:39 ◼ ► Because I'm going to be able to do more, I'm going to spend my time on things that are pushing my app forward,
00:24:56 ◼ ► And then I will likely drop iOS 9 probably the end of the year, beginning of next year, something like that.
00:25:24 ◼ ► usually are doing it for a particular reason, and are going to be used to, at this point,
00:25:43 ◼ ► And I really appreciate that in the App Store, if they go into the purchased area and hit Download,
00:25:48 ◼ ► it'll say, "The most recent version of this app isn't compatible with your current device.
00:26:08 ◼ ► And my code isn't riddled with all these weird, "If platform version this, then do this.
00:26:20 ◼ ► like the flagship version of my app that I'm really focused on and putting my attention on,
00:26:24 ◼ ► better and more reliable, because I'm not having all these weird hacks and ifs into things.
00:26:28 ◼ ► And I can adopt new approaches to things more quickly and more aggressively than I could otherwise.
00:26:35 ◼ ► Yeah, I think it's especially important for indie developers like us to really aggressively adopt the new stuff
00:26:41 ◼ ► for that reason, because we really need any productivity help we can get from the platform,
00:26:49 ◼ ► So if Apple releases something that makes certain tasks a lot easier, that makes them require less code,
00:26:58 ◼ ► and now you can get rid of all that code and stop maintaining it and stop debugging it and everything,
00:27:07 ◼ ► because we are only single or small teams working against competition in an environment
00:27:13 ◼ ► where there's lots of very engineering-heavy organizations that can pump lots of resources
00:27:24 ◼ ► So if iOS 10 comes out and it has a big new API that makes handling all of your interfaces way easier,
00:27:36 ◼ ► And for new apps, I'd say making a new app, even if you're releasing a brand new app on day one of a new OS,
00:27:45 ◼ ► And as I said, for older apps, for existing apps rather, when you release a new version,
00:28:01 ◼ ► For me, I would say it is very safe for pretty much any indie app to require the newest OS only
00:28:12 ◼ ► And again, for brand new apps, just require it on day one, you'll save yourself a lot of headaches.
00:28:27 ◼ ► There's no reason that I would need to support old OS's that is more compelling than the aforementioned,
00:28:35 ◼ ► as you said, the advantages in keeping my code clean, free of multiple code paths for different OS versions,
00:29:11 ◼ ► when I say no to that 10% of sales, I almost always make up for it in new platform sales,
00:29:27 ◼ ► No, focus on making the app forward and better and better, because that 10% is just going to keep shrinking,
00:29:32 ◼ ► and you're putting effort after something that necessarily isn't going to get any better,
00:29:37 ◼ ► better or bigger for you. The upside is severely limited, whereas on iOS 10, in this case,