PodSearch

Under the Radar

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:20 ◼   ► But I was.

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:47 ◼   ► from there.

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:00 ◼   ► like that.

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:19 ◼   ► flux.

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:51 ◼   ► question.

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:14 ◼   ► Apple did.

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:49 ◼   ► Yeah.

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:55 ◼   ► it.

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:12 ◼   ► and things.

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:40 ◼   ► it.

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:07 ◼   ► into it.

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:02 ◼   ► brace.

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:32 ◼   ► Yeah.

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:51 ◼   ► gradient.

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:02 ◼   ► here.

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:18 ◼   ► obvious.

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:04 ◼   ► Oh, yeah.

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:27 ◼   ► it.

00:18:28 ◼   ► Sure.

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:31 ◼   ► either.

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:13 ◼   ► not great.

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:10 ◼   ► going.

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:34 ◼   ► Or both?

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:53 ◼   ► work?

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:41 ◼   ► that I saw?

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:51 ◼   ► Right?

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:26 ◼   ► Bye.

00:29:27 ◼   ► [BLANK_AUDIO]