00:00:00 ◼ ► Welcome to Under the Radar, a show about independent iOS app development. I'm Mark Orment.
00:00:04 ◼ ► And I'm David Smith. Under the Radar is never longer than 30 minutes, so let's get started.
00:00:09 ◼ ► So today we wanted to discuss what I'm kind of coining as speculative development or speculative
00:00:17 ◼ ► design. And this is coming out of an experience I had this week when I was doing some work
00:00:29 ◼ ► of the updates that I'm doing. I'm kind of doing this big sweeping overhaul of the app.
00:00:33 ◼ ► And specifically I was struggling with some of the changes that I was, like the changes
00:00:37 ◼ ► I was making was causing me to make a bunch of updates into the iPad version of the app.
00:00:43 ◼ ► And at a certain point I had this realization that I've never used the iPad app for this
00:00:49 ◼ ► app, ever. I've used the iPhone app fairly extensively in most of my testing. It's something
00:00:54 ◼ ► that I use on a semi-regular basis. But just for me and the way that I use the app, the
00:01:10 ◼ ► be used. And in this particular case I decided what I really should do is I was just going
00:01:16 ◼ ► to make the iPad version of the app be essentially a blown up version of the iPhone app. That
00:01:23 ◼ ► is, which is awkward and tricky and I think it makes it a good topic to talk through today
00:01:28 ◼ ► because on the one hand I am ending up with an app that is structured and works in a way
00:01:35 ◼ ► that I know works really well on the iPhone. And the code for that is much simpler now.
00:01:40 ◼ ► There's not all of these, like if iPhone do this, if iPad do that. The app is more reliable
00:01:46 ◼ ► probably as a result. But it isn't as optimized for these particular users and these particular
00:02:00 ◼ ► would like, it may not actually even be what they would like. And so you have this strange
00:02:09 ◼ ► guessing a design for something that I don't actually have a strong opinion on when it's
00:02:15 ◼ ► like in theory that might be better, but in practice maybe it's worse. And I don't actually
00:02:20 ◼ ► know which one of those is better in this particular case, but I know that I am enjoying
00:02:25 ◼ ► working on the app a whole lot more now that I have just given up on the concept of trying
00:02:31 ◼ ► to make this mythical iPad version that I'm kind of projecting would be great for somebody.
00:02:37 ◼ ► And instead just saying, "You know what? I know how to make a really good iPhone version
00:02:52 ◼ ► layout and the flow should work. And ultimately that's probably better, but it is a weird
00:02:58 ◼ ► tension and something that I think is awkward, especially when you are the developer and
00:03:10 ◼ ► probably doing a little bit of projection, a little bit of speculative development about
00:03:21 ◼ ► of your users do use. But I think it's a really interesting area to be cautious of because
00:03:29 ◼ ► the more we do that, and there's a whole bunch of other areas that I'll probably get into
00:03:38 ◼ ► time I think I'm starting to, as I look back on my development for the last few months,
00:03:47 ◼ ► and in a lot of cases I end up regretting the work that I do because it's just guessing,
00:03:53 ◼ ► and it's never going to be my best work because it doesn't have the thoughtfulness that it
00:03:58 ◼ ► Yeah, I mean, I've faced this problem a lot with user feature requests. This goes a lot
00:04:12 ◼ ► books, I would imagine you have the data to show that not a lot of people use it on iPads,
00:04:19 ◼ ► It's certainly a minority. I think the number's about 18 percent or something like that of
00:04:25 ◼ ► That's actually higher than I would have guessed. I believe that's higher than Overcast,
00:04:38 ◼ ► like am I running on an iPad or an iPad, what OS version, stuff like that. You can learn
00:04:45 ◼ ► If a very tiny portion of your customer base is using something or something that you expect
00:04:50 ◼ ► only a tiny customer base to use if you haven't released it yet, that makes it a pretty easy
00:04:59 ◼ ► would use it, and it's at all any work to do or maintain, then it's a pretty easy decision
00:05:11 ◼ ► The tricky part is when one of those things isn't true. For instance, if something's making
00:05:21 ◼ ► do it. But if it would make some people really happy and it's almost no work and it's not
00:05:32 ◼ ► In Overcast I have my alert icon badge number toggle where you can have the app display
00:05:41 ◼ ► its red icon badge with the number of unplayed episodes you have. This is something that
00:05:45 ◼ ► I really don't like. I don't even think anybody should ask for this. But after 1.0 was launched,
00:05:51 ◼ ► it was one of the top requested features because the people who do want it really, really want
00:06:12 ◼ ► of code. I figured, "You know what? I can put this checkbox in my nitpicky details screen
00:06:17 ◼ ► with a funny caption and I can have this satisfy the people who really, really want it."
00:06:24 ◼ ► Ongoing, it's really not that much work. It's those two lines of code. There's almost no
00:06:30 ◼ ► complexity to it. It doesn't really interfere with anything else about the app. I don't
00:06:33 ◼ ► really ever need to change it unless I change the definition of what an unplayed episode
00:06:41 ◼ ► So overall, that's a pretty easy thing to say, "You know what? People do want this even
00:06:53 ◼ ► But then I have another example of a toggle in Overcast called Play Next by Priority. This
00:07:00 ◼ ► has caused me lots of headaches in 3.0, most of which are still not resolved. This is a
00:07:08 ◼ ► preference where basically Overcast playlists have a notion of priority podcasts. You can
00:07:35 ◼ ► one point out of this way and I didn't even consider any other possibilities. To me, that's
00:07:41 ◼ ► But I got tons of confused people and people who requested this enhancement. A lot of people
00:07:48 ◼ ► expected that even if you're playing something in the middle of the list, when it ends, the
00:07:53 ◼ ► highest priority unplayed item in the list should play, which means usually the top item
00:07:58 ◼ ► in the list should play. Although you can reorder my list, which makes it more complicated.
00:08:02 ◼ ► But it is generally, and I did a Twitter poll a while, like years ago, like a year ago when
00:08:08 ◼ ► I implemented this feature, and basically people couldn't agree on what the right behavior
00:08:16 ◼ ► the next thing in the list, logically." And just as many people said, "The highest priority
00:08:23 ◼ ► So I had to add this option and what this does is make anything complicated that depends
00:08:31 ◼ ► on trying to figure out what plays next. Because I have a basic function that tells you that
00:08:37 ◼ ► off of the object, but it became a problem when I added two features in 3.0. The widget,
00:08:59 ◼ ► next by priority setting on. Because the widget checks and it says, "Alright, what item comes
00:09:06 ◼ ► after this one?" And then it fetches that and then it says, "What item comes after this
00:09:09 ◼ ► one?" And I need to now modify the API because the second item, the next next item, might
00:09:25 ◼ ► And people keep sending me, I have a couple of Twitter screenshots of like, so now it's
00:09:30 ◼ ► like, "Oh, I'm showing ATP and then next is showing this, but then after that it's showing
00:09:33 ◼ ► ATP again." Because it's like looping around because of the certain order of items. The
00:09:44 ◼ ► and you say play next, do I change the priorities of the playlist to make that work? Like, no,
00:10:12 ◼ ► well if these two were already played, what's next? Which is annoying, but I can do that
00:10:17 ◼ ► fairly easily. But the play next functionality actually kind of doesn't make sense with play
00:10:30 ◼ ► people might be using. So my inclination is just to disable play next completely if you
00:10:40 ◼ ► I can't think of a way to make that make sense. So it's like, all this complexity that I now
00:10:46 ◼ ► have to deal with because a year ago or whatever, I added this play next priority option because
00:10:51 ◼ ► I thought it wouldn't be that much work. I thought, oh, this is just really changing one
00:10:56 ◼ ► function. The function that says what comes next after this item. And I thought that would
00:10:59 ◼ ► be a really easy change that wouldn't affect a lot of things going forward and that would
00:11:03 ◼ ► be easy to support, but it turns out it really wasn't over time. So now I'm questioning whether
00:11:08 ◼ ► I should ever have added that option in the first place and it's causing lots of problems
00:11:11 ◼ ► because I did. So this kind of like, oh well, you know, it'll be easy. That often seems
00:11:19 ◼ ► true at first, but then down the road you see it wasn't easy to support this thing that
00:11:44 ◼ ► - It's very unpopular, exactly. It is something that you will have a stronger reaction to,
00:11:54 ◼ ► important feature for somebody, if that was a vital thing that they were passionate about,
00:11:58 ◼ ► they absolutely need this feature and you don't have it, they'll just go somewhere else.
00:12:04 ◼ ► But if you give them a feature and it's this kind of this feature that's on the edge, it's
00:12:14 ◼ ► that you're adding because you think you should. And there might be some good reasons for that,
00:12:20 ◼ ► but in general, you're doing it because you think you should, not because you really want
00:12:23 ◼ ► to. At a certain point, you may have to take it away or scale it back or do things that
00:12:33 ◼ ► will ultimately be problematic for the application. And I think the examples you're giving are
00:12:37 ◼ ► very feature-driven, but at the same thing, I've been thinking a lot recently too about
00:12:58 ◼ ► never used an iMessage app personally other than to test the iMessage apps that I shipped
00:13:11 ◼ ► time. I use it to constantly text and interact with people, but I've never used an iMessage
00:13:29 ◼ ► or benefiting them? And at some point, part of me kind of almost wants to back them out
00:13:36 ◼ ► of the app, but doing that would be really awkward. Or similarly, you could have a similar
00:13:42 ◼ ► problem with things like supporting another platform, like the Apple Watch or the Apple
00:13:46 ◼ ► TV. I added a couple of my apps several years ago now where I added an Apple Watch app that
00:13:55 ◼ ► it turns out, for example, I added an Apple Watch app for my feed reading app, Feed Wrangler.
00:14:21 ◼ ► an Apple Watch, the last thing you really want to do is sit there with the crown scrolling
00:14:26 ◼ ► through a few thousand words of text. In retrospect, it doesn't make sense, but it's also kind
00:14:44 ◼ ► if there's a couple of people who are using it and find it really cool, that feels harsh.
00:14:49 ◼ ► So I think it is a good reminder for me to, in general, I need to be a bit more circumspect
00:14:56 ◼ ► with this. I need to think about these kind of features that if it isn't something that
00:15:08 ◼ ► on a daily basis. It comes from a place of actual need that I have, and then I'm solving
00:15:16 ◼ ► that need, and then I'm discovering that other customers also have that need. The degree
00:15:21 ◼ ► to which I can focus my development on those paths, on those behaviors, and on those features,
00:15:28 ◼ ► the quality of that software and that experience goes up. The degree to which I move away from
00:15:33 ◼ ► that and my apps start to become a bit speculative, and I'm just throwing things in and saying,
00:15:45 ◼ ► And the more I do that, I think the worse my software becomes, probably, and the worse,
00:15:49 ◼ ► the more I regret it in the future when now I have to maintain all these features because
00:15:55 ◼ ► Yeah, and I'll tell you one thing from experience recently. In Overcast 3, I also rewrote the
00:16:01 ◼ ► whole watch app to go from WatchKit 1, literally, to WatchOS 3, and in the process, I removed
00:16:22 ◼ ► of those used anything that was in the force touch menu. I had a few things in there. And
00:16:27 ◼ ► so I took it out because in the new version, I'm like, "You know, I'm rebooting the whole
00:16:30 ◼ ► thing from scratch. Do I really need to rebuild the screen that 3% of 3% of the users use?
00:16:42 ◼ ► meantime. They are very, very upset, and it does. It's like, I feel bad now. I feel like
00:17:03 ◼ ► up and take advantage of a $20 promotional credit or use promo code radar2017 at checkout.
00:17:10 ◼ ► Linode gives you fast, powerful web hosting. You can set it up in just seconds, and they've
00:17:19 ◼ ► the power and flexibility that you need. Linode plans now start at just $5 a month for a Linux
00:17:25 ◼ ► server with one gig of RAM in the Linode cloud. That's an amazing price. Linode servers offer
00:17:30 ◼ ► industry-leading performance with native SSD storage, Intel E5 processors, and access to
00:17:46 ◼ ► their networking is incredibly fast. The access that you have, especially inbound access,
00:17:52 ◼ ► it is incredible. My crawl servers that have a lot of inbound traffic and everything, it's
00:18:16 ◼ ► in just a couple of clicks. I've done that a lot of times. It's wonderful. All Linode's
00:18:24 ◼ ► what is the most you will spend in a month, and lots of other add-on services like backups,
00:18:36 ◼ ► not on Linode onto Linode, and it's just wonderful. Highly recommended. Go to linode.com/radar.
00:18:44 ◼ ► To learn more, sign up and take advantage of a $20 credit or use the promo code radar2017
00:18:54 ◼ ► So I think we've probably fairly effectively talked about some of the reasons why you probably
00:18:58 ◼ ► shouldn't add these kind of speculative features, these kind of things that are beyond the core
00:19:13 ◼ ► maybe might want to. And when I was thinking about this this morning, the main things that
00:19:32 ◼ ► you think about this particular application or the way that you approach this particular
00:19:37 ◼ ► problem. And that's certainly better. Obviously it's great if the way that your vision for
00:19:41 ◼ ► the application is the same as it is for lots of people. That's great, but you can potentially
00:19:47 ◼ ► expand your market. If someone in your example of the "I like to be stressed" badge on my
00:19:55 ◼ ► overcast, if that was an essential feature and that was a thing that was keeping somebody
00:20:00 ◼ ► from using the app, and just adding it, like you said, isn't a huge thing, maybe it's worth
00:20:07 ◼ ► expanding that market that little bit. And even though that's a feature you would never
00:20:10 ◼ ► use yourself, you get that benefit of potentially expanding the market. Another example of something
00:20:22 ◼ ► or promotion opportunities with Apple, especially around things like adding an iMessage app,
00:20:28 ◼ ► adding a watch app, adding an Apple TV app, adding an iPad app. The degree to which you
00:20:32 ◼ ► kind of embrace the new stuff can often have benefits, especially in that first wave of
00:20:41 ◼ ► Although that's something to be a little careful of, though, because you make a watch app,
00:20:46 ◼ ► say, and Apple might feature you for a week, and then you're supporting a watch app for
00:21:00 ◼ ► the importance of that kind of marketing. But it is certainly something to keep in mind,
00:21:04 ◼ ► and it has a potential benefit. But I think I'm with you in that. Once I finished talking
00:21:08 ◼ ► about the benefits, I was going to talk about some of the costs. And I think one of the
00:21:26 ◼ ► app better." Or maybe, "I will get this attention." Even if you know for sure that you're going
00:21:31 ◼ ► to be featured in the App Store, you have some great confidence, or you've been in contact
00:21:37 ◼ ► with someone at Apple, or whatever it is. Even if you're absolutely certain, the awkward
00:21:53 ◼ ► And then the last benefit that I could think of was just in terms of reducing your support
00:21:57 ◼ ► requests. By the nature of a lot of these kind of features, there are things that people
00:22:01 ◼ ► keep asking for. And so there is always going to be a certain weight on your support load
00:22:08 ◼ ► of people asking for this. And until you add it, that will be the case. But in aggregate,
00:22:21 ◼ ► this is something where I'm starting to develop a bit of an immunity or resistance to these
00:22:40 ◼ ► Audiobooks, because it's eight years old. And we talked about in our episode about dealing
00:22:43 ◼ ► with old code, there's all kinds of technical challenges. But there's also a lot of feature
00:23:09 ◼ ► able to focus down to the things that we really enjoy. Because guessing at solutions are never
00:23:17 ◼ ► going to be as good as actual solutions. Like guessing how someone might want to use this
00:23:23 ◼ ► feature based on the email you got, someone asking for it, is never going to be as useful
00:23:32 ◼ ► to build the app in the first place. And I think, at least I find for myself, that motivation
00:23:47 ◼ ► a big part of why I think I am resistant to getting into this codebase, and why it took
00:24:00 ◼ ► so divergent and had all these little extension points and differences between things that
00:24:06 ◼ ► made it more intimidating and it made it less fun. And as much as I do my job because it's
00:24:24 ◼ ► same way. And the product suffers as a result. And I think ultimately the products will be
00:24:46 ◼ ► the iPhone version. And other than a few places where there's popovers rather than modal popups,
00:24:57 ◼ ► It's like this great relief is off my shoulders because I'm not building this app that I'm
00:25:41 ◼ ► everything. We won't want to do everything. So both in capacity, we don't have the bandwidth
00:26:13 ◼ ► could slip through, like in my Play Next by Priority thing where basically I don't think
00:26:23 ◼ ► through into 3.0 features that I just never even considered because I don't use a feature.
00:26:41 ◼ ► maintain it to a decent level of quality. So you kind of have to just do what you think
00:26:47 ◼ ► is best for the app and what you can manage and what you can maintain over time responsibly.
00:27:10 ◼ ► to get everybody to use your app, so as long as you can get enough people to keep yourself
00:27:14 ◼ ► in business, then you can make the app you want and you don't have to listen to everybody's
00:27:20 ◼ ► requests. And that's something that I have been telling myself a lot recently as I deal
00:27:39 ◼ ► the iPad version that I had built and just switch to it being based on the iPhone layout
00:27:44 ◼ ► and flow. I was genuinely happy and relieved, and it felt good in a way that a lot of decisions
00:27:52 ◼ ► don't give you those feelings. But it was a great encouragement to me that I was excited
00:28:12 ◼ ► before a committee. I didn't have to convince anybody else of doing that. I decided that
00:28:16 ◼ ► this would be better for me and, as a result, better for the app, and just went with it.
00:28:24 ◼ ► That is one of the rare gifts we get by being our own boss, and it is something that I think
00:28:31 ◼ ► is important to take advantage of. A lot of being independent is rough, but this is one
00:28:36 ◼ ► area where if you find an opportunity to do something that you think will make you enjoy
00:28:41 ◼ ► working on the app more and will avoid these kind of headaches where you feel like, "Why
00:28:59 ◼ ► work on the app." There's nothing more soul-crushing than working on a bug that you don't even
00:29:03 ◼ ► want the feature to exist in the first place. Embracing it can be a really powerful thing