209: Binary Stars
00:00:00
◼
►
Welcome to Under the Radar, a show about independent iOS app development.
00:00:04
◼
►
I'm Marco Arment.
00:00:05
◼
►
And I'm David Smith.
00:00:06
◼
►
Under the Radar is never longer than 30 minutes, so let's get started.
00:00:10
◼
►
So I had a delightful discovery this week that it seems like you may have tripped, fallen,
00:00:16
◼
►
and come down deep into the rabbit hole of making custom watch faces, which is a place
00:00:20
◼
►
that I have been for years now.
00:00:24
◼
►
And it was absolutely delightful to see you sort of join me at the bottom of that rabbit
00:00:28
◼
►
hole and sort of be exploring this topic.
00:00:31
◼
►
But as much as I love talking about the actual watch face stuff, partly I think it was just
00:00:35
◼
►
an interesting sort of insight for us to talk about where the project you were doing was
00:00:40
◼
►
very much more of a copying-oriented project.
00:00:45
◼
►
And so I think let's start talking about what it was and then I think talk a little bit
00:00:48
◼
►
about copying in general and kind of the good, the bad, and the ugly of that.
00:00:52
◼
►
Yeah, absolutely.
00:00:54
◼
►
So as some people may know, my favorite Apple Watch face by far is the solar face.
00:01:01
◼
►
And not the new like round one that has a whole bunch of stuff on it that I frankly
00:01:05
◼
►
don't really understand.
00:01:07
◼
►
The old solar face that's just like the curve across the screen that has the sun going up
00:01:12
◼
►
and down every day.
00:01:13
◼
►
It looks pretty all blue in the middle and everything.
00:01:15
◼
►
It has pretty sunrise and sunset.
00:01:18
◼
►
And it has room for only a handful of complications.
00:01:20
◼
►
And the reason I got on this track was because this is the face I use on my Apple Watch way
00:01:25
◼
►
more than anything else.
00:01:27
◼
►
And I kind of wanted to customize it, thinking, "How--" it only has two complication slots.
00:01:32
◼
►
They're very limited.
00:01:33
◼
►
And I was thinking like, "How could I fit more information into those?
00:01:36
◼
►
How can I make those better?
00:01:39
◼
►
And is there a place for overcast to do that?"
00:01:42
◼
►
And then I got into this rabbit hole of designing complications and I thought, "Well, what would
00:01:47
◼
►
be a lot easier is if I could just replace the solar face, if I could just use, say,
00:01:53
◼
►
the Infograph Modular Face, which has that big rectangular complication in the middle,
00:01:58
◼
►
and put a solar graphic there that I would, I guess, render myself, and then use all of
00:02:04
◼
►
its complications.
00:02:05
◼
►
That face is full of complications.
00:02:06
◼
►
And it has the nice new round graphical ones that are quite nice in a lot of ways.
00:02:10
◼
►
And so I figured, you know, maybe I can make myself a modern solar face equivalent with
00:02:16
◼
►
Infograph Modular by just replacing the center complication with a picture of the sun that
00:02:21
◼
►
does what the solar face does.
00:02:22
◼
►
So I got into this experimental phase of like, "How could I replace--" like, how hard would
00:02:28
◼
►
it be to copy the solar face, to do exactly the graphics that it does, or at least do
00:02:33
◼
►
a very close approximation?
00:02:34
◼
►
You know, my other alternatives for what I was going to be working on for that day were
00:02:40
◼
►
like, you know, stuff I didn't want to do.
00:02:42
◼
►
It was like, I have to find this really obscure syncing bug in Overcast, and that's currently,
00:02:47
◼
►
you know, happening in the beta.
00:02:48
◼
►
And I thought, well, I can do that tomorrow.
00:02:51
◼
►
And maybe today I'll do this fun exercise of, let me try to replicate the solar face
00:02:55
◼
►
and see how far I get.
00:02:58
◼
►
And that sent me down this wonderful rabbit hole that you said of like, what you can do
00:03:03
◼
►
with Apple Watch complications, you know, the sizing and the positioning.
00:03:06
◼
►
And you know, these days it's actually, you can do quite a lot, especially if what you
00:03:10
◼
►
want to do is just render a giant image.
00:03:13
◼
►
Then it's fairly trivial if you are okay doing it on only the handful of faces that will
00:03:18
◼
►
support full color image complications.
00:03:22
◼
►
And so I started doing this.
00:03:23
◼
►
And you know, the first thing you got to do is you got to figure out sun calculations.
00:03:27
◼
►
You got to figure out like, the angle of the sun, like where it is in the sky at any given
00:03:31
◼
►
time of day in any given location.
00:03:34
◼
►
And so you have to then, you know, start looking at libraries that can compute that, and then,
00:03:38
◼
►
oh, well, most of them aren't in Swift, and you got to then, you know, convert it to Swift
00:03:43
◼
►
or build your own or import some other giant one and figure out the part you have to use
00:03:48
◼
►
And so it was all these like wonderful rabbit holes, none of which are related to my actual
00:03:53
◼
►
job, none of which will ever result in anything most likely that I could actually use or anything
00:04:01
◼
►
But all of which, it was a fun exercise.
00:04:05
◼
►
And I did eventually, and I'll link in the, or I'll make it the chapter art for this
00:04:10
◼
►
episode, I did eventually get pretty close to how the solar face looks.
00:04:15
◼
►
I didn't match everything exactly, in part because it was too hard or in part because
00:04:19
◼
►
I had my own opinion on how certain things should be done.
00:04:23
◼
►
But for the most part, it's pretty close.
00:04:25
◼
►
And I started thinking like, could I actually ship this as a complication for Overcast?
00:04:32
◼
►
And there's lots of reasons why I probably shouldn't do that.
00:04:36
◼
►
One of which is to calculate the sun appearance correctly and sunrise and sunset times correctly,
00:04:42
◼
►
you have to know the user's location.
00:04:45
◼
►
And there is no way, there's no reason a podcast app needs to know user's location.
00:04:50
◼
►
And even if I made it some kind of like fun little thing, like it's like buried in the
00:04:53
◼
►
settings, I would have to like add it to my privacy policy, add it to my app store privacy
00:04:58
◼
►
label now and all that stuff.
00:04:59
◼
►
And I'm like, you know what, this is not a thing that my app should do.
00:05:02
◼
►
This is a thing that like, if I'm going to ship this, it should be its own app.
00:05:07
◼
►
That it would be, maybe my theoretical future perfect weather app that I've wanted to make
00:05:13
◼
►
for years and have never made and probably never will make.
00:05:15
◼
►
Because I even thought of that, I'm like, well, weather APIs right now are kind of in
00:05:20
◼
►
Let me not do that right now.
00:05:21
◼
►
This is not a good time.
00:05:23
◼
►
And so I decided, I probably shouldn't ship it yet or ever for that reason.
00:05:29
◼
►
But I also thought like, I have almost directly ripped off an Apple face.
00:05:34
◼
►
I have made a very close, very obvious, very blatant clone.
00:05:40
◼
►
That is weird to have to ship that or to want to ship that and to try to profit from that.
00:05:46
◼
►
Like, you know, questions arise of what it get through app review even, which is a valid
00:05:52
◼
►
And I think the answer is probably but you know, I couldn't be so sure that it wouldn't
00:05:56
◼
►
cause problems later.
00:05:58
◼
►
But you know, it's also just kind of weird to say like, here's this thing I made, quote,
00:06:03
◼
►
but it's a direct clone of something else.
00:06:07
◼
►
And it was not accidentally, a totally like, legitimate, intentional direct clone of something
00:06:16
◼
►
And that was it was kind of an odd feeling.
00:06:18
◼
►
And I thought, you know, I could I could try to make it my own, I could try to like, you
00:06:21
◼
►
know, adjust it in different ways.
00:06:23
◼
►
And, and, you know, the code is no pun intended, modular.
00:06:27
◼
►
So I like I have all the style information is all separated out, a lot of parameters
00:06:31
◼
►
are separated out.
00:06:32
◼
►
So I could like, you know, just customize it to a different a different appearance and
00:06:37
◼
►
you know, change some of the colors here and there or the geometry here and there, but
00:06:41
◼
►
it would still look a lot like the solar face and work a lot like the solar face.
00:06:44
◼
►
So no matter how I do it, it's it's a copy.
00:06:47
◼
►
And that's a little uncomfortable.
00:06:50
◼
►
But I think the experience that you've gone through, and I think that is nevertheless,
00:06:55
◼
►
like hugely beneficial.
00:06:58
◼
►
Like it's one of these things that have watching you do this.
00:07:01
◼
►
And I feel like this is something that I find you have found my in my own career being incredibly
00:07:07
◼
►
helpful is there is something very, very instructive about looking at what someone else is doing,
00:07:15
◼
►
or has done, where you know, a sort of like having the knowledge that a solution exists
00:07:21
◼
►
because someone else has done it, and then trying to copy it trying to work out how they
00:07:26
◼
►
did it trying to imitate it as best you can, can be so helpful from a learning perspective
00:07:32
◼
►
that you're, you're expanding your toolset, like in this case, you're getting better with
00:07:38
◼
►
clock kit, you're getting better with the graphics libraries, you're getting better
00:07:42
◼
►
with Apple Watch development, like you're expanding your tools, but you're doing it
00:07:45
◼
►
in a context that has such this clearly defined end goal that like, in the end, if you can
00:07:52
◼
►
make a complication that looks exactly like the Apple Watch Solar Face, like you've done
00:07:56
◼
►
And if at any point you're like, I don't know what I should do, like what you know, how
00:07:59
◼
►
should I make it look when the sun is close to the horizon?
00:08:04
◼
►
You have an example, you have a reference, you have a thing that you can copy.
00:08:07
◼
►
And this is where like, many times in my career, I've done gone down this kind of road route,
00:08:12
◼
►
I sort of just purely as almost an academic exercise, I try and copy something.
00:08:18
◼
►
And if so often it is useful, because that that that experience is a great way to like
00:08:25
◼
►
build a skill.
00:08:26
◼
►
It gets tricky, certainly, as you're saying, when you get to the end of that process, like,
00:08:30
◼
►
you feel like you've made something, you've made something that is cool and is is interesting.
00:08:35
◼
►
And obviously, you wouldn't have made it if it wasn't cool and interesting, you wouldn't
00:08:38
◼
►
have copied something that you didn't think was interesting.
00:08:41
◼
►
So like, you've now recreated this thing, and it sort of feels like you made it.
00:08:45
◼
►
But you also didn't really totally make it either.
00:08:48
◼
►
Like you're, you're imitating a lot of choices that someone else made.
00:08:53
◼
►
And so that part starts to get tricky.
00:08:54
◼
►
But I definitely think like this experience is is awesome.
00:08:58
◼
►
And something that I would strongly encourage people to do is like, if you see something
00:09:02
◼
►
that some other designer or developer has done, try and copy it and learn from that
00:09:07
◼
►
experience is like super cool.
00:09:08
◼
►
Because now at the end of this, like, you know, you have a whole bunch of more tricks
00:09:13
◼
►
And it's like, I don't think this should be like, this should not go into overcast.
00:09:15
◼
►
And it probably doesn't make sense necessarily as a standalone app unless it became part
00:09:21
◼
►
of something much bigger, where like the app is not just the copy, the app is doing lots
00:09:26
◼
►
and lots of things.
00:09:27
◼
►
And this is just a small part of it.
00:09:29
◼
►
Or it's dramatically kind of extended beyond that.
00:09:32
◼
►
And it's like, relevantly and kind of coincidentally, we recently we both discovered that while
00:09:36
◼
►
you were going down this road, I've also been going down a vaguely similar road in widgetsmith,
00:09:41
◼
►
where I now have added some widgets that show the sun's path throughout the day, which it's
00:09:47
◼
►
like that part Apple didn't doesn't own isn't like, you know, it's like they don't own all
00:09:51
◼
►
of astronomy.
00:09:52
◼
►
And it's like the end of sort of the graph that I'm doing is similar to the solar face.
00:09:57
◼
►
But in my case, it's looks visually very different, because it's styled and themed based on the
00:10:03
◼
►
user's theming. And I'm not going down nearly as far down as they do, or you did, in terms
00:10:09
◼
►
of doing cool graphic effects and things, because those wouldn't actually work for me
00:10:12
◼
►
when if you have like, you know, a hot pink background and purple text, making the sunrise
00:10:18
◼
►
sunset look any way reasonable on that context wouldn't make any sense.
00:10:22
◼
►
And so like, I'm free from that.
00:10:24
◼
►
And so for me, it's like, I certainly, it was sort of inspired by what Apple had done.
00:10:29
◼
►
And, but I think in the end, I've ended up with something that is sort of transformative
00:10:34
◼
►
and extends and improves in that concept in a way that is makes it my own rather than
00:10:39
◼
►
sort of as a copying.
00:10:40
◼
►
And it's like that distinction, hopefully, at least we'll find out if Apple agrees, when
00:10:44
◼
►
I submit this update for widgetsmith, but it's like that distinction is an important
00:10:48
◼
►
one that there's a difference between something that is purely it's like trying to imitate
00:10:54
◼
►
something 100% and trying to sort of copy and take something from someone else versus
00:11:00
◼
►
just, you know, copying for the purpose of being inspired.
00:11:04
◼
►
And it's like, if you're not in that inspiration phase, if you're on the other side, then it's
00:11:07
◼
►
like copying is tremendous from a learning perspective of, you know, I imagine how I
00:11:12
◼
►
can't speak for you, but I imagine you've learned a lot from this experience.
00:11:15
◼
►
And who knows how that will come to benefit you, but I'm sure in some ways, it will.
00:11:18
◼
►
Oh, yeah, I mean, that's part of the reason why I did this and why my one day became two
00:11:24
◼
►
and a half days of work.
00:11:26
◼
►
Because I was having so much fun, you know, figuring out, you know, reverse engineering,
00:11:32
◼
►
what they what they were doing, basically looking at the solar phase and playing with
00:11:36
◼
►
the little time travel feature that otherwise I hate because I always accidentally trigger
00:11:41
◼
►
But in this case, it made it really easy to reverse engineer the effects they were doing.
00:11:45
◼
►
But but it was it was interesting to to be able to break it down by, you know, graphical
00:11:50
◼
►
things and be like, all right, well, here, that's that's obviously, you know, a gradient
00:11:53
◼
►
here and they're overlapping the second gradient as the sun sets.
00:11:56
◼
►
And then they're, this was like, it's two gradients, actually, and one of them is being
00:11:59
◼
►
scaled and one of them is blending, you know, alpha blending itself out as it goes like,
00:12:03
◼
►
and you can you can start looking at things and realizing the components that are going
00:12:08
◼
►
And as you experiment, you can you can figure all that stuff out.
00:12:10
◼
►
And, you know, even though I'm probably not going to ever do anything useful with this
00:12:15
◼
►
exact copy of their thing, it did teach me to look at things in a different way.
00:12:21
◼
►
It taught me certain graphical techniques.
00:12:23
◼
►
And most importantly, than all of that, I'm now a little bit better at Swift.
00:12:29
◼
►
Because I'm still new at Swift, I'm still very new at it, I'm not an expert yet.
00:12:33
◼
►
And in order to do this, I had to do a whole bunch of Swift coding.
00:12:38
◼
►
And some of it was, you know, pretty trivial, like, oh, I made this, this sun library that
00:12:43
◼
►
was basically a Swift translation of this JavaScript thing I had found to do the calculations
00:12:48
◼
►
of positioning and stuff.
00:12:49
◼
►
But then I also, you know, for the graphical stuff, I had to dive in and do not only a
00:12:54
◼
►
lot of work in an API that I was familiar with, which was core graphics, but in your
00:13:01
◼
►
language I wasn't.
00:13:03
◼
►
So like, this is the first time I've used core graphics from Swift.
00:13:06
◼
►
And a lot of the stuff that I expected to be worse in Swift or harder was actually fine
00:13:12
◼
►
or even easier in some cases.
00:13:14
◼
►
So that was good to learn both that, that Swift is actually better at this stuff than
00:13:19
◼
►
I would have expected, and also to learn, like, oh, actually, I can make this even better
00:13:25
◼
►
by using some of Swift's language features.
00:13:27
◼
►
And things like in core graphics, they have the save G state and load G state for basically
00:13:34
◼
►
pushing and popping off all the different transformation matrices and stuff in all the
00:13:38
◼
►
different states.
00:13:40
◼
►
And the Swift API for that is ugly.
00:13:42
◼
►
It's just save G state and load G state as methods.
00:13:45
◼
►
And that's how it is in Objective-C as well.
00:13:47
◼
►
But one thing I always do in Objective-C is when I use those, I, after the save G state,
00:13:54
◼
►
the entrance to that logical block, I put an opening brace.
00:13:58
◼
►
And I have, I indent everything that's in the transaction, and at the end I put a closing
00:14:03
◼
►
In C-based languages, that's fine.
00:14:06
◼
►
You can put opening and closing braces to define blocks wherever you want.
00:14:10
◼
►
In Swift, you can't, because Swift interprets that as a trailing closure.
00:14:14
◼
►
And so it said basically, like, I tried that after the save G state call, and it's like,
00:14:19
◼
►
this call doesn't take a closure argument.
00:14:21
◼
►
What are you doing?
00:14:22
◼
►
And so I made an extension on CG context.
00:14:25
◼
►
And the extension was like, you know, perform transaction.
00:14:28
◼
►
And that takes a closing, that takes a trailing closure.
00:14:31
◼
►
And so I was able to format my code in a way that made more sense to me.
00:14:35
◼
►
I was able to improve this API for my own use by using Swift extensions and Swift syntax
00:14:40
◼
►
and everything.
00:14:41
◼
►
And so it's like, oh, I'm getting better at this.
00:14:43
◼
►
Another example was, I was looking at the gradient, the main, like, blue sunlight gradient.
00:14:49
◼
►
And I noticed that Apple seemed to have, like, two brightness phases, like an early one,
00:14:55
◼
►
like, towards the center that's super bright, and then it falls off really gently and goes
00:14:59
◼
►
towards a dimmer one at the end.
00:15:01
◼
►
But it's not a linear transition.
00:15:03
◼
►
And CG gradients are linear.
00:15:07
◼
►
You can't specify a custom curve, like an ease in out or a quadratic.
00:15:13
◼
►
You can't specify a custom transition curve for CG gradients.
00:15:18
◼
►
So I dove in further and found there's this other object called CG shading, where you
00:15:22
◼
►
can do that.
00:15:24
◼
►
And so I did that.
00:15:26
◼
►
And I did a custom ease in out CG shading based gradient.
00:15:30
◼
►
And that matched the look better.
00:15:33
◼
►
And so I realized, you know, A, not only is this is probably what Apple is doing in their
00:15:37
◼
►
solar face, but B, now I've had to dive even further into Swift, the language, and core
00:15:44
◼
►
graphics into areas I've never used before.
00:15:47
◼
►
And so it was-- and a lot of this is, like, very low level stuff, because I had to start
00:15:51
◼
►
doing stuff.
00:15:52
◼
►
Like, I had to use my first unsafe mutable pointer.
00:15:54
◼
►
That was fun.
00:15:55
◼
►
And so I had to learn how those worked.
00:15:57
◼
►
And I had to use a function pointer.
00:15:59
◼
►
Like, all sorts of crazy stuff.
00:16:01
◼
►
That, like, you know, in my experience with Swift and Overcast so far, I just haven't
00:16:07
◼
►
had to do that, or I've been avoiding it.
00:16:09
◼
►
And so by doing this whole copying exercise, I have actually gotten tremendous value in
00:16:14
◼
►
just advancing my knowledge of Swift.
00:16:17
◼
►
And that will help me everywhere.
00:16:19
◼
►
So even if I never ship this in anything, it was a fun exercise to do for a couple days.
00:16:25
◼
►
And it made me better at this skill that I really kind of desperately need to get better
00:16:30
◼
►
at fairly quickly.
00:16:33
◼
►
And I think what's great there is because you were copying, because you were imitating
00:16:37
◼
►
something specific, it has this delightful sort of property of pushing you to do something
00:16:44
◼
►
that you wouldn't necessarily have done otherwise.
00:16:47
◼
►
Like, if you were just, like, coming up with this yourself, you would have done the linear
00:16:52
◼
►
And it'd be like, huh, that looks all right.
00:16:53
◼
►
And it's like, you wouldn't have in your mind necessarily, like, hmm, it's not quite what
00:16:57
◼
►
I want necessarily.
00:16:58
◼
►
Like, maybe you would.
00:16:59
◼
►
Maybe you would have seen it and be like, huh, actually, I want an ease-out gradient
00:17:03
◼
►
But it's like, because you are kind of, and your goal is very specific, and it's copy-oriented,
00:17:09
◼
►
it's like, you kind of have to do that.
00:17:11
◼
►
And it naturally forces you beyond just, like, the easy path where it's like, you know, it's
00:17:19
◼
►
And that's where real learning starts to happen.
00:17:21
◼
►
That's where things get interesting, is once you're off that easy path where, you know,
00:17:26
◼
►
you think, oh, it's like, now you've used an unsafe pointer or whatever it is, and now
00:17:30
◼
►
you have the sense of it's like, okay, if you actually do need to do that in something
00:17:34
◼
►
that, you know, something tells me with all of your audio stuff in Overcast, eventually
00:17:40
◼
►
something like this is going to come up again, where using function pointers and unsafe stuff
00:17:45
◼
►
is inevitably going to happen.
00:17:46
◼
►
And it's like, it's not going to be the first time you've done it.
00:17:49
◼
►
And that is, when you come to that problem, it'll be different, it'll be a different API,
00:17:53
◼
►
but it'll be slightly less scary.
00:17:54
◼
►
And if you need to, you can be like, huh, I remember I've done this before, let me go
00:17:58
◼
►
and see how I implemented it and how that code ended up looking.
00:18:02
◼
►
And so that learning value of it is just so powerful.
00:18:05
◼
►
Yeah, because I mean, certainly, my entire audio engine is written in C, not Objective
00:18:10
◼
►
C, C. And pretty much everything it does, if you brought it into Swift, would be labeled
00:18:15
◼
►
unsafe, because that's just how C works.
00:18:20
◼
►
But yeah, certainly, I would definitely need all that.
00:18:22
◼
►
But hopefully, hopefully, I can just continue to use that for a long time without modifying
00:18:29
◼
►
Anyway, we are brought to you this week by Hotjar.
00:18:30
◼
►
Do you have a website?
00:18:31
◼
►
Did you put time and energy into getting that website live?
00:18:34
◼
►
Do you want that hard work to go to waste by not knowing what your visitors are doing
00:18:37
◼
►
when they visit your site?
00:18:39
◼
►
Of course not.
00:18:40
◼
►
You know that each visit to your site is an opportunity to gather important data to help
00:18:43
◼
►
you convert more visitors into customers.
00:18:46
◼
►
You might not know that you can unlock that data now with Hotjar.
00:18:50
◼
►
Hotjar is a behavior analytics and user feedback service that helps you understand the behavior
00:18:54
◼
►
of your website users and get their feedback through heat maps, session recordings, and
00:18:58
◼
►
surveys, which help take all the guesswork out of how visitors use your site, making
00:19:03
◼
►
it easier to convert visitors into customers.
00:19:06
◼
►
You can learn more about this now at Hotjar.com.
00:19:11
◼
►
And if you want to try Hotjar Business right now for free for 90 days, that's a whole three
00:19:16
◼
►
free months with no credit card required, my favorite kind of trial, just click the
00:19:21
◼
►
link in our show notes or wherever you see the link for this show.
00:19:26
◼
►
So see how visitors are really using your website, collect user feedback, and turn more
00:19:31
◼
►
of your visitors into customers.
00:19:34
◼
►
And when your free 90-day trial ends, you can just add your payment details to keep
00:19:39
◼
►
the business plan or just downgrade to a free account.
00:19:42
◼
►
So don't miss out on that important data from your site's visitors.
00:19:46
◼
►
Learn more at Hotjar.com.
00:19:49
◼
►
And if you want to get that 90-day trial, click the link in our show notes.
00:19:53
◼
►
Our thanks to Hotjar for their support of this show and Relay FM.
00:19:58
◼
►
So I'm curious, Dave, you know, going back to the topic of copying and like how to copy
00:20:03
◼
►
well and how not to and what to do with stuff you've copied, I think there's a lot of distinctions
00:20:11
◼
►
and lines here not to cross that I feel like our industry as a whole does not do a great
00:20:17
◼
►
job of doing, of like walking this line, walking this fine line well.
00:20:24
◼
►
There's so much copying out there.
00:20:25
◼
►
I mean, and in certain areas it's worse than others.
00:20:27
◼
►
Like I know it's really bad in games, but certainly it's not that much better in apps
00:20:32
◼
►
There have been multiple complete ripoffs of the Overcast UI and like there's this one
00:20:39
◼
►
app, I forget what it's called.
00:20:40
◼
►
It was this Italian app that was like, it copied everything, like the entire now playing
00:20:46
◼
►
screen, the control screen, like everything.
00:20:48
◼
►
It copied everything from Overcast.
00:20:51
◼
►
It was also orange.
00:20:52
◼
►
Like it was shameless in how far it went.
00:20:55
◼
►
I haven't seen it in a few years.
00:20:56
◼
►
It probably got taken down, but like it was quite something.
00:21:01
◼
►
And meanwhile, Overcast is not the first podcast app in the store and some of the features
00:21:07
◼
►
in it I didn't invent.
00:21:09
◼
►
Like certain things, and I invented certain things that other apps then went and did and
00:21:14
◼
►
there's ways to do that well and there's ways to do it badly.
00:21:17
◼
►
And I think what you were saying earlier is important that like if you're copying something
00:21:22
◼
►
just directly and you change like nothing about it or you change only very trivial things,
00:21:29
◼
►
that's kind of, you know, that's not on the right side of that line.
00:21:34
◼
►
But there are ways to use other apps for inspiration or to use other apps features for inspiration
00:21:40
◼
►
or if you do have to copy someone else's feature, there's ways to do it in more tasteful ways.
00:21:46
◼
►
Like for me, the way I always define it is like, first of all, am I drawing inspiration
00:21:53
◼
►
from more than one source?
00:21:55
◼
►
If you're making a podcast app and every single thing you do is extremely similar to the same
00:22:01
◼
►
other podcast app, like if you're taking inspiration only from Overcast or only from Apple Podcasts
00:22:06
◼
►
or only from podcasts or whatever, like and your app looks just like one of those, that's
00:22:14
◼
►
But if you're making a podcast app and you take elements from multiple different apps
00:22:18
◼
►
and kind of blend those together in your own way, that's okay.
00:22:22
◼
►
Then it's okay if some of the elements came from other apps, you know, like then, 'cause
00:22:26
◼
►
I feel like that's like a more transformative use.
00:22:28
◼
►
Or, you know, if you are, if you're making, you know, say a weather app and you take inspiration
00:22:35
◼
►
from a different category of apps, like if you take inspiration from games and build
00:22:39
◼
►
it into a weather app, like that's a more transformative use of those ideas and I feel
00:22:46
◼
►
like that's easier to make, you know, tasteful and comfortable.
00:22:50
◼
►
Whereas if you're copying only from one place and making something that is very similar
00:22:55
◼
►
to the thing you are copying, that's uncomfortable and, you know, borderline unethical.
00:23:02
◼
►
And so it's a very fine line to walk and it's hard to get that balance right if you're actually
00:23:06
◼
►
planning on shipping what you make and profiting from it.
00:23:10
◼
►
Yeah, and I think if there's this element of copying where it's, is what I'm doing,
00:23:17
◼
►
like seeking to deprive the original author of something?
00:23:22
◼
►
Or is it sort of its own separate thing?
00:23:26
◼
►
You know, is it, am I trying in, you know, like the person who is exactly copying Overcast,
00:23:31
◼
►
like what is their end goal there?
00:23:34
◼
►
That they're gonna like out Overcast, Overcast, and like if their app is in no way better
00:23:39
◼
►
than Overcast and is exactly the same as it, like they're not creating value there.
00:23:44
◼
►
They're not doing something where it's in any way like, you know, moving things forward.
00:23:50
◼
►
It is only going to be taking things from you.
00:23:53
◼
►
It's going to cause confusion for your customers potentially.
00:23:56
◼
►
It's going to, like it's seeking to take something without giving anything back.
00:24:01
◼
►
And like, a lot of this is, there is a certainly a tricky element of this that, and sometimes
00:24:06
◼
►
there are features and things that you need to implement because that's where the market's
00:24:11
◼
►
It seems like every social media platform needs stories now.
00:24:13
◼
►
And it's like, it started off as a bit of a joke, but now maybe it's just like the reality.
00:24:17
◼
►
That's just like, that's table stakes for a social social network is that they have
00:24:20
◼
►
some kind of ephemeral story like infrastructure.
00:24:23
◼
►
It's like, that's just, that's just part of the system now.
00:24:26
◼
►
And so like not doing it just on principle is also sort of problematic.
00:24:30
◼
►
But it still is always something that I think is important to keep in the back of your mind.
00:24:34
◼
►
And I think it's easy when you're, it's easy to let copying let you avoid sort of actual
00:24:44
◼
►
thought too.
00:24:45
◼
►
And this is a trap that I found myself falling into sometimes where I'm dealing with a problem.
00:24:51
◼
►
I have a tricky UX or a sort of user interface thing that I'm trying to deal with.
00:24:56
◼
►
And it's like, I just end up like, who, you know, which app do I do I know of that probably
00:25:01
◼
►
has done this well?
00:25:03
◼
►
And then I just like go and look at how they did it.
00:25:05
◼
►
And if I just go and look at how they did it and copy it without any original thought,
00:25:10
◼
►
without using that as an input, instead using that in some ways like as the output, just
00:25:15
◼
►
holistically, it's like, I'm missing out both on the opportunity to think critically
00:25:20
◼
►
about what I want to do.
00:25:22
◼
►
And I'm probably not, I don't fully understand why they did it the way they're doing it.
00:25:26
◼
►
And it becomes problematic in a lot of ways.
00:25:29
◼
►
Whereas if I am going to another app, it's like, you know, I'm trying to make my like
00:25:34
◼
►
subscription purchasing screen.
00:25:37
◼
►
And I go and look at a bunch of apps that have that I think have good respectful, you
00:25:42
◼
►
know, nice subscription screens.
00:25:44
◼
►
I go to the if I go to those and they're lovely, you know, and like, I'm in sort of take the
00:25:49
◼
►
best parts of both of many of them or apply my own sort of special sauce onto it and kind
00:25:54
◼
►
of collect sort of trying to synthesize a bunch of things into some into a new thing.
00:25:59
◼
►
Like that feels great.
00:26:00
◼
►
That feels useful.
00:26:02
◼
►
And that involves me sort of thinking critically, I think maybe a good place to start is if
00:26:07
◼
►
you're copying doesn't involve you having to think critically, if it is just take this
00:26:14
◼
►
thing and put it into something else.
00:26:16
◼
►
Like if there is no middle step there where you're thinking about it, and you're sort
00:26:19
◼
►
of making your own choices and putting your own tastes and flares into it, then you're
00:26:24
◼
►
probably on the wrong side of this.
00:26:25
◼
►
And this is not something that you want to be doing.
00:26:27
◼
►
Yeah, like, like you at some point, you should have to think either how should this look
00:26:33
◼
►
or how should this work?
00:26:35
◼
►
If you don't have to act because like that's that's designed like and that's ideas, right?
00:26:38
◼
►
And if you if like, you know, if I'm copying the solar face, exactly, I don't have to make
00:26:43
◼
►
those choices.
00:26:44
◼
►
I just look at what Apple's face does.
00:26:46
◼
►
And I say, Hey, how do I do that?
00:26:48
◼
►
Which is different.
00:26:49
◼
►
How do I implement that is very different than how should this look or how should this
00:26:54
◼
►
You know, if if you it like, if I have to actually ask those questions, then I'm changing
00:26:58
◼
►
it then it's like, okay, how what what should the face do?
00:27:03
◼
►
If you are in a place that doesn't have sunrise or sunset?
00:27:06
◼
►
Or what should the face do?
00:27:07
◼
►
You know, transitioning, you know, between the you know, day and night?
00:27:11
◼
►
Or how, how should this look on a totally different type of like, you know, if it's
00:27:16
◼
►
a white background, and and the sun is not represented by a big gradient, like, well,
00:27:20
◼
►
how should that be designed?
00:27:22
◼
►
And what should happen at the edges and stuff like that?
00:27:24
◼
►
Like, there are lots of questions that could be raised in that copying, that suggest that
00:27:30
◼
►
that's probably becoming something more, it's probably becoming more transformative and
00:27:33
◼
►
more original.
00:27:35
◼
►
But if it is, if it if your only question is, how do I implement this thing over here
00:27:43
◼
►
That's probably just copy.
00:27:46
◼
►
Yeah, it's like you got to know you're to be asking yourself why they did what they
00:27:49
◼
►
did, rather than just what they did.
00:27:52
◼
►
It's it's and that's where it'll actually grow and develop and improve you probably,
00:27:57
◼
►
where you understand, huh, why did they do their gradients that way?
00:28:00
◼
►
It's like, huh, because it does.
00:28:01
◼
►
Yeah, it does kind of give it a nice effect.
00:28:03
◼
►
And like, then you've learned something, then this is an improvement, both, you know,
00:28:06
◼
►
this is a learning process for you.
00:28:07
◼
►
And I will say to that, like copying is also like, don't think it's a great place to
00:28:13
◼
►
often get started.
00:28:14
◼
►
And it is something that I've done many times where my first design, like the very rough,
00:28:20
◼
►
basic version of something is much more of a copy of someone else's work.
00:28:25
◼
►
And that's a great way to sometimes get started, get the very rough, like frame up of your
00:28:30
◼
►
app of like, how do how would I go about this, you if someone else has done something similar,
00:28:34
◼
►
and then you're using that as a jumping off point, like it just make sure that you don't
00:28:38
◼
►
ship that version one that you take that version that was very much a copy, and then you iterate
00:28:42
◼
►
on it, and you change it and you improve it.
00:28:45
◼
►
Like that's where it can often be a great place to start, though, it's just like, you
00:28:48
◼
►
know, let someone else have done sort of the initial scaffolding that you can use and then
00:28:53
◼
►
go and dive in and make your own impact from there.
00:28:57
◼
►
Like that's also a great use of this kind of an approach where I suspect if you spent
00:29:01
◼
►
another two and a half days on this face, you would continue to improve and extend and
00:29:05
◼
►
change it and eventually it would end up something that was reminiscent of Apple's solar face,
00:29:11
◼
►
but was your own thing and you wouldn't be in any way feel like a copy that would feel
00:29:15
◼
►
like no, this is my own thing.
00:29:17
◼
►
It's it's different in ways that are important to you or you think make it better.
00:29:22
◼
►
Thank you for listening, everybody.
00:29:24
◼
►
And we'll talk to you in two weeks.
00:29:27
◼
►
[BLANK_AUDIO]