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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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:26
◼
►
And I know this is something I think I saw you were talking about with your voice boost
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]