PodSearch

Under the Radar

118: Original Research

 

00:00:00 ◼   ► Welcome to Under the Radar, a show about independent iOS app development.

00:00:03 ◼   ► I'm Marco Arment.

00:00:04 ◼   ► >> And I'm David Smith.

00:00:05 ◼   ► Under the Radar is never longer than 30 minutes, so let's get started.

00:00:10 ◼   ► So this week, as is often the case, I think when topics can come out of current work that

00:00:16 ◼   ► we're doing, I feel like we tend to get the best topics.

00:00:20 ◼   ► And this week's topic, I think, comes from work I'm doing currently in my app, Sleep

00:00:25 ◼   ► Plus Plus, which is a sleep tracker, where I'm working on doing automatic sleep detection

00:00:31 ◼   ► and sleep analysis, which is a feature that I've long been asked for by my users, but

00:00:37 ◼   ► I've never quite gotten to.

00:00:39 ◼   ► And so for the last week or so, this is what I've been working on, and the process so far

00:00:44 ◼   ► has been pretty promising that this is something that I'm going to be able to do.

00:00:49 ◼   ► But I think it's an interesting topic and a broader thing to talk about in just sort

00:00:53 ◼   ► of generally talking about things that kind of feel like original research or primary

00:00:57 ◼   ► research you could call it.

00:01:00 ◼   ► So often when we're developing something, when we're making an app or a product, there's

00:01:06 ◼   ► much of it that is not new or novel in any real sense.

00:01:10 ◼   ► If you're -- the process of taking data, putting it in a database, taking that data out, putting

00:01:16 ◼   ► it in a table view, there's nothing original and special there.

00:01:22 ◼   ► But often if you want to have something, an app that's really compelling or has an interesting

00:01:27 ◼   ► hook to it, you're going to have to do things that are beyond that.

00:01:31 ◼   ► And so in many ways you end up kind of doing this kind of research.

00:01:35 ◼   ► You're kind of inventing something in a real sense of the word invention.

00:01:41 ◼   ► And not every app has to have this, certainly, but it is something that I've found that is

00:01:46 ◼   ► good to have in your toolbox as something that you're not scared to try, that if you

00:01:51 ◼   ► have an idea about I wonder if I could do this kind of -- usually there's some kind

00:01:55 ◼   ► of processing involved.

00:01:57 ◼   ► Maybe it's image processing.

00:01:58 ◼   ► You're working on a camera app and you want to do some kind of image filters or an audio

00:02:02 ◼   ► app and maybe you're doing some audio processing.

00:02:04 ◼   ► Or in my case I'm doing -- I'm analyzing users' movement and heart rate and that kind of thing.

00:02:11 ◼   ► There's usually some kind of processing involved.

00:02:14 ◼   ► And doing this kind of research I think gives your app an advantage, both in terms of it

00:02:21 ◼   ► being more useful to your customers, which is probably far more important, that my goal

00:02:25 ◼   ► with doing automatic sleep detection is that more people will track their sleep more often

00:02:31 ◼   ► because they won't have to remember to start and stop the motion tracking like they do

00:02:35 ◼   ► currently.

00:02:36 ◼   ► It'll just happen automatically, which sounds great.

00:02:40 ◼   ► But it also creates this nice little sort of competitive advantage that there's now

00:02:44 ◼   ► this little moat around your app that anybody who wants to compete feature by feature with

00:02:50 ◼   ► you now has to go through and build it themselves.

00:02:54 ◼   ► They have to do that research.

00:02:56 ◼   ► They have to work out how to do it.

00:02:59 ◼   ► And fair enough, it's easier the second time.

00:03:02 ◼   ► Somebody looking at what you have done, even if they'd never see your code or understand

00:03:07 ◼   ► your methodology, simply knowing that a solution exists with a given set of inputs is a tremendous

00:03:15 ◼   ► advantage versus the number of times that I've gone down a road where I'm like, "I

00:03:18 ◼   ► wonder if I could," and then I spend a week and I work on something and it doesn't

00:03:21 ◼   ► work out.

00:03:22 ◼   ► And so I give up, and that never seems the light of day.

00:03:25 ◼   ► It's easier knowing that a solution does exist.

00:03:27 ◼   ► But it's still a competitive advantage.

00:03:28 ◼   ► It's still a road that they have to go down and work that they have to do.

00:03:33 ◼   ► So it's an advantage in that regard.

00:03:36 ◼   ► And as I was working on my stuff, I was thinking about you, Marco, and how voice boost and

00:03:41 ◼   ► smart speed are two kind of similar types of things that weren't necessarily like

00:03:45 ◼   ► your app was the first one to ever do them.

00:03:47 ◼   ► But the way that you've done them and the work that you did to add those to your app

00:03:53 ◼   ► is now this competitive advantage that you can sort of hold over your competitors.

00:03:58 ◼   ► - Yeah, I mean, I've said before that I think kind of a recipe for a pretty good useful

00:04:06 ◼   ► app that is kind of a good balance between diving in and spending a whole bunch of time

00:04:11 ◼   ► on hard stuff nobody will ever notice versus being really basic and having no competitive

00:04:15 ◼   ► advantage and having no compelling features.

00:04:17 ◼   ► I think a really good balance between those two is do like one or two hard things in your

00:04:23 ◼   ► app.

00:04:24 ◼   ► And everything else doesn't need to be like a hard, impressive, technical thing.

00:04:28 ◼   ► But if you have like one or two, that can really make an app.

00:04:33 ◼   ► And for Instapaper, originally that was the text parser.

00:04:36 ◼   ► And later on I did some Kindle stuff that was a little bit crazy and weird things with

00:04:42 ◼   ► pagination on the iPhone.

00:04:44 ◼   ► But that was a relatively small number of features.

00:04:46 ◼   ► Ultimately the great value of that app was pretty boring stuff.

00:04:51 ◼   ► And then the text parser was like the big one.

00:04:54 ◼   ► And for Overcast, yeah, I think Smartspeed and Voice Boost are pretty significant features

00:04:58 ◼   ► that are hard and require some deep learning, or not deep learning, require like some deep

00:05:07 ◼   ► knowledge of low level audio manipulation and audio mastering and stuff like that to

00:05:13 ◼   ► really do that well.

00:05:15 ◼   ► And I had to learn a lot of that stuff and it was hard.

00:05:19 ◼   ► I happen to like that kind of hard work so it was fun for me.

00:05:22 ◼   ► And it still is fun whenever I work on it today.

00:05:25 ◼   ► But that was really hard stuff.

00:05:26 ◼   ► I had to learn mostly by like Google searches and trial and error of things like DSP audio

00:05:35 ◼   ► processing.

00:05:36 ◼   ► Like how to do that and what I'm actually manipulating with the audio signals and how

00:05:40 ◼   ► not to do it.

00:05:41 ◼   ► And all the different ways to do it that make it sound crappy.

00:05:44 ◼   ► So I can avoid those ways and eventually figuring out ways to do it that sound good or that

00:05:49 ◼   ► can't be noticed.

00:05:52 ◼   ► That is all really hard work but I've always enjoyed that kind of low level data work.

00:05:59 ◼   ► Not necessarily in the sense of big data but just working in low level C functions in performance

00:06:07 ◼   ► critical like large blocks of numbers and operations using things like the accelerate

00:06:13 ◼   ► functions in iOS.

00:06:14 ◼   ► I always like that stuff.

00:06:16 ◼   ► But if I spend all of my time doing that in Overcast I would be unbalanced.

00:06:23 ◼   ► Right now I'm kind of battling with my self discipline.

00:06:27 ◼   ► What I really want to be working on a lot of the time is the work I'm doing for Voice

00:06:31 ◼   ► Boost 2 which is just rarely Voice Boost but just going to sound better and work better

00:06:36 ◼   ► with more stuff.

00:06:37 ◼   ► And that's all this wonderful low level stuff making my own audio processing functions and

00:06:44 ◼   ► everything and it's exactly this kind of thing.

00:06:48 ◼   ► But what my customers actually want is not for me to make Voice Boost 2 for the most

00:06:54 ◼   ► part.

00:06:55 ◼   ► What my customers really want is boring stuff like everybody wants me to give them a smart

00:06:59 ◼   ► playlist that shows all their starred items.

00:07:02 ◼   ► That's a really boring thing that I need to do because that's what they actually want.

00:07:07 ◼   ► Most of the app is boring stuff like that.

00:07:10 ◼   ► Sort of management and basic UI for things.

00:07:14 ◼   ► I still don't have a way for people to change their email address on their account.

00:07:19 ◼   ► Stuff like that.

00:07:20 ◼   ► That's what people actually want.

00:07:22 ◼   ► So it's important when you're doing these kind of cool, fun, low level math type features

00:07:27 ◼   ► or data analysis type features, it's important to make sure you also keep that balance though

00:07:31 ◼   ► of not spending too much of your time on it.

00:07:37 ◼   ► This is kind of cynical but not wasting too much time on stuff that's really hard to market

00:07:43 ◼   ► to people.

00:07:44 ◼   ► One of the reasons why a lot of people assume that Overcast invented silent skipping and

00:07:51 ◼   ► dynamic processing on podcasts is because I was the first one to figure out how to market

00:07:55 ◼   ► those features to people.

00:07:59 ◼   ► That isn't just dumping money into ads.

00:08:03 ◼   ► I didn't actually ever really do that.

00:08:06 ◼   ► Not until very recently have I tried that.

00:08:09 ◼   ► Marketing this kind of feature is about making sure people know it's there and telling them

00:08:16 ◼   ► why it's so good in some way.

00:08:19 ◼   ► And so for these features, I gave them names that were not just plain text descriptions.

00:08:25 ◼   ► I didn't say shorten silences and I didn't say boost the volume or use a dynamics compressor.

00:08:32 ◼   ► I didn't name those features those things.

00:08:34 ◼   ► I gave them branded names.

00:08:36 ◼   ► I trademarked those names.

00:08:38 ◼   ► I put those names on everything.

00:08:40 ◼   ► I added features like it showed you how much time you had saved with the silent skipper

00:08:45 ◼   ► feature because I need to show people that this feature that when it's turned on they

00:08:51 ◼   ► don't really notice is doing something for them.

00:08:54 ◼   ► And all of that was to help market these features that I spent a lot of time on, this low level

00:09:00 ◼   ► fun stuff because otherwise nobody would know they were there and the few people who would

00:09:06 ◼   ► find them and turn them on wouldn't really understand how good they are because they're

00:09:11 ◼   ► both kind of like subtle effects most of the time.

00:09:15 ◼   ► And so they both kind of like they help you out in a subtle way.

00:09:18 ◼   ► But if you don't know that, if you're not being shown or told that in some compelling

00:09:22 ◼   ► way, then a lot of that effort is wasted.

00:09:26 ◼   ► And so it's very important when you're planning these kind of features to make sure

00:09:30 ◼   ► that, A, you're not spending too much time on them to the exclusion of features that

00:09:36 ◼   ► people actually need or want more.

00:09:39 ◼   ► And B, that you're not going to invest a ton of time into something like this that is unmarketable

00:09:43 ◼   ► in some way.

00:09:44 ◼   ► Like you have to include in your planning for features like this how you're going to

00:09:49 ◼   ► communicate the existence and the value of these features to your customers.

00:09:54 ◼   ► - Yeah, and I think what's cool is that once you've done that, like if you work out a way

00:09:58 ◼   ► to communicate to your customer that you do some hard work, you can find a way to communicate

00:10:05 ◼   ► that to your customer, you end up with something that is really compelling in a weirdly insidious

00:10:12 ◼   ► way.

00:10:13 ◼   ► That like I struggle to, I feel bad if I listen to podcast type audio, like long form audio,

00:10:20 ◼   ► without the silences removed now.

00:10:23 ◼   ► Because in my back of my mind, I feel like I'm wasting time.

00:10:26 ◼   ► And so like that is a hook that you now have like placed in me that if I listen to something

00:10:30 ◼   ► long form, I will find a way to turn that into something that I can listen to with something

00:10:36 ◼   ► like Smart Speed.

00:10:37 ◼   ► Just because it's, now that's what I expect.

00:10:41 ◼   ► Because you've wrapped it up, you've wrapped up this kind of original, like it's not original

00:10:45 ◼   ► in the sense that you were the first person to come up with it, but original in the sense

00:10:49 ◼   ► that you had to do a lot of hard low level work to make it happen.

00:10:53 ◼   ► You're not just building, it's not just like AV, you're not just doing your AV player dot,

00:10:59 ◼   ► you know, remove silences equal true.

00:11:02 ◼   ► Like if that was the case, I wish it was that easy.

00:11:04 ◼   ► That would be great, right?

00:11:06 ◼   ► But that's not the case.

00:11:07 ◼   ► You had to do all of this whole cloth development to make it work.

00:11:11 ◼   ► Now you have this great little advantage that, you know, one of the things that would keep,

00:11:16 ◼   ► it keeps me in overcast rather than another podcast player is that I don't want to lose

00:11:21 ◼   ► this thing that I now have.

00:11:23 ◼   ► And so it's this little moat that other people could certainly build it.

00:11:25 ◼   ► It's not like it's technically crazy to build Smart Speed or to build Voice Boost, but building

00:11:33 ◼   ► an app in general is difficult.

00:11:35 ◼   ► And then tackling one of these features is also kind of hard.

00:11:39 ◼   ► So it's just this nice little, undertaking one of these.

00:11:43 ◼   ► I think you're definitely right though.

00:11:44 ◼   ► Be careful that you're like taking on something that you can show, you have something to show

00:11:48 ◼   ► for at the end.

00:11:49 ◼   ► But if you do and it does make sense, it's a wonderful little, it's a wonderful way to

00:11:55 ◼   ► create value that is defensible rather than easily copied by somebody else.

00:12:02 ◼   ► - But it's also, it's important to also realize that nothing is gonna be yours forever.

00:12:06 ◼   ► Like overcast was the only mass market podcast player that had these features for a while.

00:12:13 ◼   ► But now it isn't.

00:12:14 ◼   ► And it never really was the absolute only one, but it was the only really mass market

00:12:19 ◼   ► one.

00:12:20 ◼   ► And now it's not.

00:12:22 ◼   ► And more of them are gonna keep adding features like this.

00:12:27 ◼   ► I had a couple good years there.

00:12:28 ◼   ► It bought me some time.

00:12:30 ◼   ► Similar to Apple with the iPhone launch, the original iPhone.

00:12:33 ◼   ► And Steve famously said that it was five years ahead of the competition.

00:12:36 ◼   ► And that basically proved to be true.

00:12:38 ◼   ► That was roughly correct.

00:12:39 ◼   ► It took Android a long time to reach the minimum quality that the iPhone had years earlier.

00:12:46 ◼   ► And so it buys you some time when you have something like this.

00:12:50 ◼   ► But not necessarily tons of time.

00:12:53 ◼   ► And it's definitely a limited amount.

00:12:55 ◼   ► It will end.

00:12:56 ◼   ► And so it's important not to rest on your laurels and not to assume that something cool

00:13:01 ◼   ► you do is gonna be yours forever.

00:13:03 ◼   ► So maybe that's doing cooler things.

00:13:06 ◼   ► Maybe that's finding other ways to remain competitive in the future.

00:13:11 ◼   ► But keep in mind that when you're deciding what to do, when you're planning on doing

00:13:16 ◼   ► out your app, when you are trying to allocate time, keep in mind again the value of these

00:13:21 ◼   ► features will not last forever.

00:13:23 ◼   ► So let that inform how much time that you allocate to them.

00:13:27 ◼   ► Anyway, we are brought to you this week by Squarespace.

00:13:31 ◼   ► Enter offer code radar at checkout to get 10% off your first purchase.

00:13:35 ◼   ► Make your next move with Squarespace.

00:13:36 ◼   ► Squarespace lets you easily create a website for your next idea with a unique domain, warbiting

00:13:42 ◼   ► templates and much more.

00:13:43 ◼   ► Whether you want to create an online store or a portfolio site or a blog or even a podcast,

00:13:50 ◼   ► Squarespace is an all-in-one platform that lets you do any of those things.

00:13:54 ◼   ► Or all of those things.

00:13:55 ◼   ► There's nothing to install, no patches or updates to worry about, no upgrades to do.

00:14:00 ◼   ► You don't have to worry about any of that stuff because Squarespace has it covered.

00:14:05 ◼   ► And if there's anything that you need help with or if anything goes wrong, they have

00:14:08 ◼   ► award-winning 24/7 customer support if you need any help.

00:14:12 ◼   ► They let you quickly and easily grab a unique domain name when you're getting started.

00:14:15 ◼   ► And all of these award-winning templates they have are beautifully designed for you to show

00:14:20 ◼   ► off your great ideas.

00:14:21 ◼   ► And you can customize the template to your heart's content and really make it yours.

00:14:26 ◼   ► Squarespace plans start at just $12 a month.

00:14:29 ◼   ► And you can start a free trial with no credit card required by going to squarespace.com.

00:14:34 ◼   ► When you sign up, make sure to use the offer code radar to get 10% off your first purchase

00:14:38 ◼   ► and to show your support for Under the Radar.

00:14:40 ◼   ► We thank Squarespace for their support.

00:14:43 ◼   ► Squarespace, make your next move, make your next website.

00:14:47 ◼   ► So now that you've decided that you're going to go down the road of doing some kind of

00:14:50 ◼   ► an original research project to like add a new feature to your app, I was thinking, how

00:14:55 ◼   ► do you, A, it's like there's lots of different approaches I think you can take to something

00:15:00 ◼   ► like that.

00:15:01 ◼   ► And one thing that I wanted to start off talking about is how when I do these types of things,

00:15:05 ◼   ► I always take a very, I guess you'd call it the empirical approach rather than the theoretical

00:15:11 ◼   ► approach that I try and just, you know, I get in there and I just start to build things.

00:15:18 ◼   ► I try a lot of things and just experiment.

00:15:21 ◼   ► I just try and generate a lot of data as best I can and then run, you know, test cases through

00:15:31 ◼   ► my system, whatever it may be, because I find that I'm just not very academic.

00:15:36 ◼   ► And I used to, I think earlier in my career, be intimidated by the fact that I just wasn't

00:15:43 ◼   ► particularly academic in that way, that I'm not coming at it from a, you know, a theoretical

00:15:48 ◼   ► approach that I'm then trying to work out how to implement.

00:15:53 ◼   ► In many ways, I start with implementations.

00:15:54 ◼   ► I start with just like, well, let me see if this works.

00:15:56 ◼   ► Well, let me see if this works.

00:15:58 ◼   ► And I, in theory, a theoretical approach would help you get to the right solution more directly,

00:16:05 ◼   ► or at least in a more straightforward way.

00:16:07 ◼   ► But I would encourage anybody who's slightly intimidated by the feeling that, oh, man,

00:16:13 ◼   ► it's like this needs to be super theoretical.

00:16:15 ◼   ► It's like, maybe, depending on what you're working on, but often a more direct empirical,

00:16:21 ◼   ► just like kind of do your best approach will often get there.

00:16:26 ◼   ► And in my experience, you know, gets you there well enough and can allow you to create these

00:16:31 ◼   ► features without needing a lot of theoretical knowledge, without a lot of deep, and potentially

00:16:35 ◼   ► like the deep understanding.

00:16:36 ◼   ► You may not understand exactly why a particular method is working, but it can work for you.

00:16:42 ◼   ► And you could argue whether that's good or not, but I found it to work well.

00:16:46 ◼   ► So just an encouragement is don't be too scared of things if you can just sort of approach

00:16:51 ◼   ► them more directly.

00:16:52 ◼   ► Yeah, I too am pretty weak on the academic side.

00:16:57 ◼   ► I'm especially weak in the advanced math, really.

00:17:01 ◼   ► Things like calculus, I really never took or, well, I took it but failed it.

00:17:07 ◼   ► Most of the advanced linear algebra stuff, I have a very, very weak understanding of.

00:17:12 ◼   ► Really almost all advanced math, I really just either never took in college and just

00:17:16 ◼   ► never learned it afterwards, or I took it and took it so poorly that I really just know

00:17:21 ◼   ► nothing about it.

00:17:22 ◼   ► So whenever I'm looking up online, looking up some kind of algorithm, and I start to

00:17:27 ◼   ► see the mathematic notation, I'm just like, "Aw, crap.

00:17:30 ◼   ► I'm probably not going to figure this out."

00:17:32 ◼   ► And sometimes I try and plow through, and the simpler ones I can kind of work out the

00:17:37 ◼   ► pseudocode of how to do in my language that I know what they're trying to tell me how

00:17:42 ◼   ► to do.

00:17:43 ◼   ► But once something comes to, "Oh, you have to read these academic papers to understand

00:17:49 ◼   ► how to do this algorithm," or something, that's usually when I bail out because I try sometimes,

00:17:54 ◼   ► but I can't usually get through them.

00:17:58 ◼   ► So what I do with a lot of my approaches to these hard math or data problems is really

00:18:04 ◼   ► fairly simple things.

00:18:06 ◼   ► I'm pretty good at coming up with, just off the top of my head, coming up with some kind

00:18:10 ◼   ► of heuristic of like, "Oh, maybe if I look for this pattern and I give it some kind of

00:18:16 ◼   ► weight in a scoring algorithm, that maybe this will be better."

00:18:22 ◼   ► And sometimes that works, most of the time it doesn't, but occasionally I get something

00:18:25 ◼   ► out of it that is pretty useful.

00:18:28 ◼   ► And that's how I tend to do these kind of things.

00:18:31 ◼   ► It's basically like trial and error to develop some kind of heuristic or algorithm that is

00:18:37 ◼   ► really not a very mathematically advanced algorithm.

00:18:41 ◼   ► It's really just large amounts of dumb math, large amounts of basic arithmetic.

00:18:48 ◼   ► That I can do.

00:18:49 ◼   ► But you don't need necessarily an advanced knowledge of sophisticated math and the more

00:18:58 ◼   ► advanced stuff.

00:18:59 ◼   ► That being said, I do think my lack of knowledge there holds me back to some degree.

00:19:04 ◼   ► There's a lot of statistical methods, things like, especially when dealing with things

00:19:10 ◼   ► like large data sets, dealing with things like data clustering and statistical analysis

00:19:15 ◼   ► of large pools of data.

00:19:17 ◼   ► I basically don't understand any of that.

00:19:19 ◼   ► And that is holding me back to some degree.

00:19:22 ◼   ► So I do want to get better at some of that stuff, but ultimately you don't necessarily

00:19:26 ◼   ► need to if you can't or don't want to.

00:19:29 ◼   ► You can get pretty far without the knowledge of some of that advanced math stuff.

00:19:34 ◼   ► And the thing that's key there is that your solution may not be optimal, but you may get

00:19:40 ◼   ► a solution.

00:19:41 ◼   ► I mean, in a weird way, it makes me think of how if you didn't understand what multiplication

00:19:49 ◼   ► was but you knew how to do addition, you could still end up with the same result.

00:19:53 ◼   ► You're right in a for loop that just adds a bunch of times.

00:19:56 ◼   ► Sure.

00:19:57 ◼   ► Which is obviously kind of a trivial example of this, but that is often I think the impression

00:20:03 ◼   ► that I have is that often my approach is repeated addition rather than multiplication because

00:20:07 ◼   ► I don't understand the higher concept.

00:20:09 ◼   ► But you don't get a—I still end up with 20 with four times five.

00:20:15 ◼   ► I just may—the fact that I add five to itself four times versus just being able to do it

00:20:20 ◼   ► directly with multiplication, that's less efficient, but the answer is the same.

00:20:24 ◼   ► It's still 20.

00:20:25 ◼   ► And computers are so fast.

00:20:27 ◼   ► Even on our phones and our watches, microprocessors these days are just so ridiculously fast that

00:20:32 ◼   ► for a lot of problems like this, even if you just have kind of like a brute force solution

00:20:39 ◼   ► or even if it's like an imprecise solution, that is probably both fast enough and good

00:20:44 ◼   ► enough for a lot of times.

00:20:46 ◼   ► Yeah.

00:20:47 ◼   ► And so, you know, it's—which is an encouragement that it's like, yeah, it's like you—it's

00:20:51 ◼   ► okay and that's like that's fine and it's, you know, as with any—a lot of these kind

00:20:55 ◼   ► of discussions you can get into like is it well—well, is it certainly better or is

00:20:58 ◼   ► it more efficient to have a more theoretical approach or fundamental understanding?

00:21:02 ◼   ► Of course.

00:21:03 ◼   ► But, you know, if—in order to gain that level of understanding, you almost certainly

00:21:08 ◼   ► have to be—spend a lot more time and, you know, like to become an expert in that area

00:21:16 ◼   ► is going to take a lot of time and be a lot of distractions away from other things.

00:21:19 ◼   ► So it may not be worth getting that level of understanding.

00:21:23 ◼   ► So you know, just worth keeping in mind.

00:21:25 ◼   ► Yeah, definitely.

00:21:26 ◼   ► In terms of the actual building of these things, I think it seemed worth actually sort of diving

00:21:30 ◼   ► into the way that—the approach that I've taken.

00:21:32 ◼   ► Like I'll talk to my recent example with automatic sleep tracking where—so, you know,

00:21:39 ◼   ► I'm going to add this to an app.

00:21:41 ◼   ► My usual approach is to create a completely separate app.

00:21:45 ◼   ► I've tried—and eventually it'll end up being a branch in the main app, but usually

00:21:49 ◼   ► I just create a completely new app that has none of the overhead, none of the other things

00:21:55 ◼   ► going on.

00:21:56 ◼   ► And mostly I do that because then I can just kind of—if I go down a bad line of thinking

00:22:03 ◼   ► and it just ends up in a dead end, I can just throw it away and start again.

00:22:06 ◼   ► And it's easier, I find, for me to just kind of have the super focused, lightweight

00:22:11 ◼   ► app.

00:22:12 ◼   ► You know, I don't need to go to a particular place in the app.

00:22:14 ◼   ► Like often I end up doing stuff just in the view to finish launching.

00:22:18 ◼   ► Like it's basically a command line app just running on an iPhone.

00:22:21 ◼   ► Like you end up doing that kind of thing where you make it as quick and as simple as possible

00:22:26 ◼   ► and it's focused in on exactly what the problem is.

00:22:30 ◼   ► I find that to be a very helpful approach.

00:22:32 ◼   ► I tend to do my work there to validate that something is possible.

00:22:38 ◼   ► And then I'll start to work on how will I take that and turn it into the final version.

00:22:44 ◼   ► And that first version I have no consideration at all to code quality.

00:22:49 ◼   ► Often I will completely throw that code away.

00:22:52 ◼   ► I will end up reimplementing it just using all the lessons I learned from all of that

00:22:58 ◼   ► throwaway code.

00:22:59 ◼   ► But by taking such a quick and dirty approach to it, it means that I can work much more

00:23:03 ◼   ► quickly and iterate on it.

00:23:05 ◼   ► That I don't need to feel like I'm writing code that is going to end up needing to be

00:23:09 ◼   ► production quality.

00:23:11 ◼   ► I can ignore all the errors.

00:23:12 ◼   ► I can just sort of make it so that it just works on exactly what I'm trying to do.

00:23:17 ◼   ► So in this case, I have built a separate app that tries to automatically detect and analyze

00:23:25 ◼   ► sleep data out of all the various health inputs that we have.

00:23:31 ◼   ► And I just sat there and iterated on that until I got it to work.

00:23:34 ◼   ► And now I'm going through the process of actually turning that understanding and the data that

00:23:40 ◼   ► I can get out of that, completely reimplemented from scratch that all those algorithms and

00:23:46 ◼   ► methods that I came up with again.

00:23:48 ◼   ► In this case, it was actually slightly amusing, because I built my prototype app in Swift.

00:23:53 ◼   ► And then my C++ is an Objective-C app.

00:23:56 ◼   ► And so I was going to reimplement it anyway.

00:24:01 ◼   ► And it actually kind of worked well to keep me from being lazy and just copy/pasting things

00:24:04 ◼   ► that I actually went through and had to be thoughtful in that translation from the prototype

00:24:10 ◼   ► app to the actual app to make sure that I'm actually taking care of all the edge cases

00:24:14 ◼   ► and things.

00:24:15 ◼   ► That's an approach that I find works pretty well.

00:24:18 ◼   ► And then once you can get it into the app, then you can actually start working through

00:24:22 ◼   ► the actual-- making it of a higher quality.

00:24:26 ◼   ► But I find doing it and developing and prototyping in a separate app and then moving in once

00:24:31 ◼   ► you kind of have the basics worked out works pretty well for me.

00:24:35 ◼   ► So I'm curious, because I think it goes back to our competitive advantage argument earlier.

00:24:41 ◼   ► Why are you adding this feature?

00:24:43 ◼   ► Mostly because I think it makes the app better.

00:24:46 ◼   ► And I think I wish I did it.

00:24:49 ◼   ► And I know I often hear from people who use my competitors' app because they do it.

00:24:54 ◼   ► And it turned out to be much easier than I thought it was going to be.

00:25:00 ◼   ► I had in my mind that it was going to be really hard, and so I'd been putting off working

00:25:03 ◼   ► on it.

00:25:04 ◼   ► And because I have a lot of existing sleep data calculated in my old method, I was able

00:25:11 ◼   ► to much more quickly, I think, work out a way to process all this data and end up with

00:25:16 ◼   ► very similar results because I could just kind of try lots of things, and I could very

00:25:21 ◼   ► quickly see if it worked or wasn't going to work.

00:25:24 ◼   ► And I think it's a competitive advantage.

00:25:26 ◼   ► And I know it's a feature that I will use myself.

00:25:29 ◼   ► The ability to have your Apple Watch just track your sleep without-- all you have to

00:25:33 ◼   ► do is wear it while you sleep, and then it's all taken care of.

00:25:37 ◼   ► And so I think it's an advantage in that regard because you'll actually use the app more because

00:25:41 ◼   ► right now you have to remember to use it, which is always difficult.

00:25:45 ◼   ► - Yeah, and that makes a lot of sense.

00:25:47 ◼   ► That obviously is a compelling feature.

00:25:49 ◼   ► And I've heard podcasts where people talk about how they're comparing your app to one

00:25:54 ◼   ► of the competitors that does automatic stuff, and I thought, "Oh, that sounds compelling."

00:25:57 ◼   ► But I too would have assumed that was really hard.

00:26:00 ◼   ► And that's also kind of another, I think, maybe a good closing note here is a lot of

00:26:04 ◼   ► the-- if you're a developer and you think of or you see some other app or you think

00:26:10 ◼   ► of a feature that you want to do that sounds really hard or impossible, try it because

00:26:15 ◼   ► it might not be.

00:26:17 ◼   ► Like I first thought that doing pagination in Instapaper would be really hard, and it

00:26:22 ◼   ► turned out it really wasn't.

00:26:24 ◼   ► Similarly, if you think like, "Oh, I would love to do this kind of analysis on some feature

00:26:29 ◼   ► but with data, but the iPhone probably can't handle it.

00:26:34 ◼   ► It's probably too computationally intensive."

00:26:37 ◼   ► Try it because it might not be.

00:26:40 ◼   ► But that's another area where I've found like I always assume that, "Oh, maybe I probably

00:26:44 ◼   ► can't do things like run a live FFT on the audio stream without having a big battery

00:26:49 ◼   ► impact."

00:26:50 ◼   ► And the answer a lot of times is, "Nope, you totally can.

00:26:53 ◼   ► It's totally fine.

00:26:54 ◼   ► These devices are really fast these days."

00:26:56 ◼   ► >> Yeah.

00:26:57 ◼   ► And it's just kind of a nice thing to be-- like there is something just really fun and

00:27:03 ◼   ► encouraging when you hit on something that you thought would be really hard that actually

00:27:07 ◼   ► turned out to not be crazy hard.

00:27:09 ◼   ► And that was a really fun thing.

00:27:10 ◼   ► And it speaks to actually the last thing that I want to mention too is I've found tremendously

00:27:14 ◼   ► valuable as quickly as I can working out how to visualize the problem that I'm working

00:27:19 ◼   ► on in a way that I can see rather than just data that's being NS logged out to the console.

00:27:26 ◼   ► >> That's a good tip.

00:27:28 ◼   ► >> In a lot of my apps, like in this case with sleep tracking, it's essentially very

00:27:33 ◼   ► timeline-based.

00:27:34 ◼   ► I'm looking at a variety of inputs over time.

00:27:37 ◼   ► And so I just have a really simple app or a view controller that just has a scroll view

00:27:42 ◼   ► in it.

00:27:43 ◼   ► And all of the data points that I have on it, I just create a UI view and I throw it

00:27:47 ◼   ► into it, which is horrifically unperformant.

00:27:50 ◼   ► I have like 10,000 UI views in one scroll view, but it's fine.

00:27:56 ◼   ► There's better ways to do graphing, like actually doing pagination and stuff.

00:28:00 ◼   ► So I'm only rendering the stuff that I need to, but it's fine.

00:28:03 ◼   ► It's in this prototype app.

00:28:04 ◼   ► But visualizing it, making it so that I can see the connections.

00:28:07 ◼   ► And in this case, I ended up visualizing the outputs of my first couple of attempts and

00:28:13 ◼   ► aligning them with the outputs of my previous method, and they lined up perfectly.

00:28:17 ◼   ► And I was like, "Well, this works.

00:28:19 ◼   ► Well, that's amazing."

00:28:21 ◼   ► And so visualizing that as quickly as you can is just something that I can't emphasize

00:28:25 ◼   ► enough.

00:28:26 ◼   ► And I know this is something I think I saw you were talking about with your voice boost

00:28:30 ◼   ► too stuff.

00:28:31 ◼   ► You do the same thing.

00:28:32 ◼   ► As soon as you can see it, it's both motivating in terms of encouraging you that you're

00:28:37 ◼   ► on the right track as well as very quickly showing you the areas that aren't working

00:28:42 ◼   ► and the things you need to change.

00:28:43 ◼   ► >> Enoch - Exactly.

00:28:44 ◼   ► It makes a huge difference.

00:28:45 ◼   ► >> Michael - Yeah.

00:28:46 ◼   ► But anyway, so go forth, do some original research, try and not be intimidated by things

00:28:53 ◼   ► that you think are too hard, and see what you can come up with.

00:28:56 ◼   ► Because I think if you can come up with these things, and it turns out that they're easier

00:28:59 ◼   ► than you thought maybe, it creates a tremendous value in your app that I think, especially

00:29:07 ◼   ► as a smaller team or as a smaller developer, there is a tremendous advantage to having

00:29:11 ◼   ► these little things that are hooks, that are marketing lines, that are reasons why someone

00:29:17 ◼   ► might want to try your app versus something else.

00:29:19 ◼   ► >> Enoch - Thanks for listening everybody, and we'll talk to you next week.

00:29:22 ◼   ► >> Michael - Bye.

00:29:23 ◼   ► [BLANK_AUDIO]