Podcast Search

Under the Radar

Under the Radar 112: Ideal vs. Pragmatic

Select a time to play from there. The line being spoken is highlighted as the audio plays.

0:00:00welcome to under the radar a show about

0:00:02independent iOS app development I'm mark

0:00:04Worman and I'm David Smith

0:00:05under-the-radar is never longer than 30

0:00:07minutes so let's get started this week

0:00:09we wanted to talk about when you're

0:00:11forced to do something for outside

0:00:15reasons or market demand or pragmatic

0:00:18reasons that may be that like maybe you

0:00:21don't you wish you wouldn't have to do

0:00:23or you think you shouldn't have to do

0:00:25but you're forced to do it anyway and

0:00:28this was brought about the reason I was

0:00:31talked about this initially is that I I

0:00:33had a number of things happen recently

0:00:34with overcast that were of this nature

0:00:36and where I had to basically adopt to

0:00:39the way people actually are or the way

0:00:41things actually work rather than hold on

0:00:44to my you know long-standing you know

0:00:47belief that it should be a different way

0:00:49or my wish that it was a different way

0:00:52because it would save me some work she's

0:00:54often up in the case yeah the first the

0:00:58the big one that kind of drove all this

0:01:00was overcast recently had to implement

0:01:04feed redirect support and/or permanent

0:01:07feed change support and I talked about

0:01:09this a little bit on ATP last week so

0:01:11I'm not gonna go too far into it but the

0:01:13basic idea here is that podcast feeds

0:01:17change over time and podcasters when

0:01:22they the podcast is often will move the

0:01:24feed to a different service or to a

0:01:26different host or tweeted for an ad

0:01:27tracking platform or whatever else they

0:01:30just move the feet and and they don't

0:01:31like if you move a website you usually

0:01:34set up a redirect from the old URL to

0:01:36the new URLs and you usually leave that

0:01:38redirect there forever and even if you

0:01:41give it the the permanent redirect code

0:01:43of 301 rather than the temporary one of

0:01:45302 you still leave up the redirect

0:01:48forever because you know that like

0:01:50there's old links the point to it

0:01:52there's old search engine ranking that

0:01:54might point to it and so you you know

0:01:56that like it's a good practice on the

0:01:57web to to basically make redirects work

0:02:00forever so if you're writing something

0:02:02that that keeps URLs in a database and

0:02:05and crawls them every so often on the

0:02:08web you can pretty much never process

0:02:11permanent redirect codes and be fine

0:02:13because almost all the redirects will

0:02:16keep working indefinitely into the

0:02:18future

0:02:19and when I made overcast this is how I

0:02:21set up the database and and this was you

0:02:23know I mean I made the database in 2013

0:02:25that's when I made the schema I started

0:02:27crawling and and started building up my

0:02:30database of feeds and and the app

0:02:31launched about a year later and so for

0:02:34me at the time I made this decision of

0:02:37how to structure my feeds table and my

0:02:39feed items table and and how users

0:02:42interact with feeds and feed items I

0:02:44designed this whole schema back then and

0:02:46there was one big flaw in the schema

0:02:49which was that feeds couldn't have their

0:02:52URLs changed if a if a feed was created

0:02:56with a new URL it would be a whole new

0:02:58feed entry and then there was no

0:03:00mechanism in place to do things like you

0:03:03know if if a new URL is created and in

0:03:05the and then one of the old ones

0:03:06redirects to that one how do I can I

0:03:09merge those entries do I copy the old

0:03:12one to the new one do what does the newt

0:03:14does the old one have some kind of an

0:03:15alias list that also points to the new

0:03:17one I had no setup like that in place

0:03:20and so the entire app and everything and

0:03:22the entire database were built up

0:03:23without that consideration or without

0:03:25that possibility and this started to

0:03:28become a problem pretty soon after

0:03:31launch that a couple of webs a couple of

0:03:34podcaster at switching their feed URLs

0:03:36and for awhile I thought well you know

0:03:38people just subscribe to the new one the

0:03:40old one will still work forever because

0:03:41it'll redirect and it'll be fine there

0:03:43were a number of problems with the set

0:03:44up in reality one of the big ones is

0:03:46that when I would do things like count

0:03:49subscribers to do things like search

0:03:51ranking the two different entries would

0:03:54count as independent feeds I would have

0:03:57to do search filtering so things like

0:03:59you know I filter I don't show search

0:04:00results that don't have an iTunes ID

0:04:02associated so when the iTunes ID would

0:04:04move it would basically lose the search

0:04:08ranking and the entire history of the

0:04:09previous one etc so there were all sorts

0:04:11of problems of that but it wasn't a big

0:04:13problem because not a lot of podcasts

0:04:16were moving their feeds in 2014 and then

0:04:19over the following years a lot of

0:04:23podcasts switched from HTTP to HTTPS

0:04:27and because a lot of websites did as we

0:04:30all kind of learn with that would we

0:04:31probably should be doing that that

0:04:33created a whole lot of duplicate entries

0:04:36additionally during that time a certain

0:04:39podcast networks shut down or moved or

0:04:42changed their names change their domains

0:04:43and that caused even more extra or

0:04:46removed entries and then the big one was

0:04:50over the last year or two a lot of major

0:04:54podcast publishers have switched to

0:04:57dynamic ad insertion platforms which

0:04:59hosts the feet of their own our URL for

0:05:01who knows what reason and so tons of

0:05:05major podcasts are now switching their

0:05:07feeds if they didn't already do it with

0:05:09HTTPS like two years ago in the last

0:05:12year they're now doing it with ad

0:05:13tracking platforms so I've had a like it

0:05:17basically went from a small problem in

0:05:19year one to a medium-size problem in

0:05:22year two and a really big problem in

0:05:24year three and so I finally had to

0:05:27implement feed redirects and I had you

0:05:30know all this time I've been thinking

0:05:32like I can just follow redirects I can

0:05:34feel like they'll be fine they'll be

0:05:35they'll be good forever and the reality

0:05:38was just different the reality was

0:05:39podcasters don't do things the way web

0:05:41web developers do things they break

0:05:43redirects like they consider iTunes the

0:05:45authoritative source and if iTunes moves

0:05:48the feed for them which they can do

0:05:50through multiple different means either

0:05:52a 301 or putting a special XML tag in

0:05:56the feed that was returned with a 200

0:05:57response or going through like an iTunes

0:06:00customer support representative learning

0:06:02the podcast directory and like just like

0:06:04emailing somebody and saying sorry we

0:06:05messed up our feet can you fix it and

0:06:07none of those things would carry over to

0:06:09overcast so the reality of the market

0:06:12was very very different from how I

0:06:13wanted it to be I really badly wanted it

0:06:16to work in this one way that websites

0:06:18always work which is like you know set

0:06:19up a redirect and keep it up forever but

0:06:22the reality was very different the

0:06:23reality was podcasters had to move their

0:06:24feeds frequently they would break the

0:06:26old URLs and redirects most of the time

0:06:29and even if they didn't I still had this

0:06:31problem of like split feed in the

0:06:34database so that's no good so finally

0:06:37over the last couple of weeks I finally

0:06:39wrote redirect support and be

0:06:41cause of my database schema being so

0:06:42unfriendly to it it's a huge hack and

0:06:45it's not perfect the way I do it is that

0:06:48basically like copy your old entries

0:06:51onto the new feed and delete your old

0:06:53ones and that's not great like there's a

0:06:56whole lot of downsides to that one of

0:06:57the big ones is that the app seeing a

0:07:00new feed item ID for all these episodes

0:07:02the APRI downloads them all that's no

0:07:05good either so you like you it maintains

0:07:08your history but you have to download

0:07:09like all of a sudden your phone is

0:07:11downloading like all your saved episodes

0:07:13of a certain show that you hadn't

0:07:14listened to yet and that's kind of weird

0:07:16to cut to happen unexpectedly so that's

0:07:19not a great solution but I had to be

0:07:22pragmatic I had to address this problem

0:07:25somehow because the market was very

0:07:29different than what I wanted it to be

0:07:31yeah and I I think I also hear in what

0:07:35you're saying it's this thing that is so

0:07:37happens to me this happened to me so

0:07:39many times is it's as much as we would

0:07:42like I think we would like to be able to

0:07:44predict the future and when we're

0:07:46initially building our applications and

0:07:49we're designing them and we're

0:07:50structuring them we would make choices

0:07:53that you know our future selves will

0:07:56thank us for right and conceptually that

0:08:00sounds great that okay yeah of course

0:08:01like I should engine you I should struct

0:08:04structure these things you know with

0:08:05maximum flexibility and I should be able

0:08:07to I should a head of time I should

0:08:09consider all these possibilities the

0:08:12reality is I've done this enough to know

0:08:14that you can't like that is impossible

0:08:18and things will change and break and

0:08:21become problems in ways that you could

0:08:24never have predicted maybe you get

0:08:27slightly better at this you know maybe

0:08:28you don't make the same mistake twice

0:08:29like those types of things may be

0:08:32improving but I feel like the situation

0:08:34you find yourself in is something that

0:08:36is universal to app development or just

0:08:38you know software engineering in general

0:08:40that you will at some point make be

0:08:44forced to either you know you either

0:08:45have to make an assumption or you have

0:08:48to explode complexity like those are the

0:08:51two choice one of those two things you

0:08:53have to do at

0:08:54hundreds of points in your application

0:08:57as you're developing it you either have

0:08:59so you can make an assumption you can

0:09:00say in this case you're going to assume

0:09:02you know that mapping a feed URL to the

0:09:06fee a ID directly will be a stable link

0:09:09or you have to explode complexity and

0:09:12like you had build you'd have to do some

0:09:14very complicated things to make that

0:09:17work you know flexibly and in this case

0:09:20you know you chose to make the to start

0:09:22with the assumption but like that's the

0:09:23same thing that we do all the time

0:09:25there's so much so much of you know soft

0:09:27development is about getting good at

0:09:31making that decision between making an

0:09:33assumption and expanding complexity and

0:09:35you could apply this stuff so many thing

0:09:37it's like how complicated is your class

0:09:38hierarchy you know what do kind of

0:09:41choices do you do for data no data

0:09:43persistence or or so many different

0:09:45things come down to this base this very

0:09:47simple situation or do you are you going

0:09:49to make an assumption or are you going

0:09:51to explode complexity and like and that

0:09:55means that you're stuck like now you

0:09:56have to go and do be forced to do this

0:09:58thing because your assumption proved to

0:10:01be wrong or proved to be in wrong enough

0:10:04that continuing with that assumption

0:10:07becomes problematic and it's so much

0:10:10more complex to is like like as I've

0:10:12mentioned this on Twitter here and there

0:10:13the last couple of weeks I've gotten a

0:10:15number of people who are suggesting like

0:10:17oh why don't you why didn't you just do

0:10:18this with your database or why didn't

0:10:19you just make this migration happen and

0:10:21a lot of them a lot of the the ideas or

0:10:24suggestions don't really work or aren't

0:10:26as simple as they sound

0:10:27because overcast is not just a local app

0:10:29with a local database it is a service

0:10:32with a server back-end that syncs

0:10:34between multiple copies of your app on

0:10:35multiple devices so any kind of like

0:10:38one-way migration either can't happen or

0:10:41is way more complex than you would think

0:10:43and also because it is a server back tap

0:10:46the the complexity of the schema has a

0:10:49direct relationship to how scalable it

0:10:52is and how efficient it is and how

0:10:54expensive it is to host you know if if

0:10:57every look up to the feeds table has to

0:11:00then make another look up to some kind

0:11:02of like URL aliases table or something

0:11:05like that like to to map the URL to the

0:11:07feeds arm fetching

0:11:08that's a pretty significant hit in

0:11:10performance that's that's much more

0:11:11complexity and that could be way more

0:11:14load on the database servers and that

0:11:15could really make scaling more difficult

0:11:17and if you have multi if you have many

0:11:19of those things in your schema for

0:11:21flexibility and everything then you

0:11:24start running into pretty big scaling

0:11:26problems and big challenges that either

0:11:28just make your life hard or make things

0:11:30cost way more to hosts and that could

0:11:32break your business model so like

0:11:33there's there's all sorts of other

0:11:35considerations here that make things

0:11:37that this sound like a hard problem

0:11:38anyway so that was you know one problem

0:11:42of many that I've had and I kind of

0:11:45wanted to talk for the show about a few

0:11:47more of those but before we do speaking

0:11:50of scaling your web servers we were a

0:11:52sponsor this week by Linode Linode has

0:11:55fast powerful web hosting options that

0:11:57you can get set up in just seconds it's

0:11:59very very easy to understand other tools

0:12:00and they could let you choose the

0:12:02resources and the next distribution that

0:12:04you want giving you the power and

0:12:05flexibility that you need all this

0:12:06starts at just five dollars a month that

0:12:08gets you a server with one gigabyte or

0:12:13very very fast if industry-leading

0:12:15performance they have native SSD storage

0:12:17and all their servers access to a 200

0:12:20gigabit network eat intel xeon e5

0:12:23processors my favorite line of

0:12:24processors these are the fastest

0:12:26processors in the cloud market leader

0:12:28has over 400,000 customers who are all

0:12:31serviced by the friendly 24/7 support

0:12:34team you can email them if you need any

0:12:36help you can chat over IRC if you need

0:12:37any help and they have all sorts of

0:12:39wonderful documentation that's all

0:12:41public you can see it right now you and

0:12:43in fact a lot of times if you search for

0:12:45Linux server administration topics a lot

0:12:47of times the search results you get from

0:12:48Google are just Linode support articles

0:12:50because they are so easy to use to

0:12:52understand and so helpful so litterin

0:12:54has fantastic pricing options available

0:12:56again you can get a server with one

0:12:57gigabyte us five bucks a month you can

0:13:00get a server with 16 gigs of ram for

0:13:02just 60 bucks a month and a whole lot of

0:13:04levels above and below it in between

0:13:05across the board this is twice the

0:13:07amount of RAM that you'll get at most

0:13:08other places as a listener of the show

0:13:10if you sign up at lynda.com a slash of

0:13:12radar you'll be supporting us and you

0:13:14look at $20 towards any Linode plan and

0:13:16with a 7 day money-back guarantee

0:13:18there's nothing to lose so go to

0:13:20lynda.com slash

0:13:22rate

0:13:22are to learn more sign up and take

0:13:24advantage about $20 credit or use promo

0:13:25code radar 2017 at checkout thank you so

0:13:29much to Linode for running all of my

0:13:30servers and supporting the show so

0:13:33another one I had with overcast a small

0:13:36one before I go to another big one is

0:13:38password protected feeds this is one

0:13:42that you know podcasts sometimes we'll

0:13:44have paid memberships or other kind of

0:13:47like you know meant private feeds that

0:13:48they protect with some kind of password

0:13:50authentication scheme usually you know

0:13:52HTTP basic auth it's compatible with

0:13:54with a lot of apps and this becomes a

0:13:57problem when you have a server-side

0:13:58crawling like overcast does and in a

0:14:00couple of a couple of competitors do

0:14:01because it the question becomes like

0:14:04where do you do you retain the password

0:14:07and the entry on the server side and

0:14:09then do you crawl with someone's

0:14:10password do you how do you protect that

0:14:13from being used by multiple people and

0:14:16then if you have a whole lot of people

0:14:18who all have separate usernames and

0:14:20passwords they're calling the feed with

0:14:21do you have to then crawl the feed from

0:14:22like you know a hundred thousand

0:14:24different users from like hundred

0:14:26thousand different copies of the feed

0:14:27like you have to keep all those in your

0:14:29database and have those clogging up your

0:14:31crawler so it's kind of a big problem so

0:14:33when I launched overcast I made a

0:14:35decision I'm just not gonna support

0:14:37those and I this was kind of like a

0:14:39political decision like I don't like

0:14:41that I have to support these so I'm just

0:14:43gonna see if I can not support them and

0:14:45and just hope that nobody uses password

0:14:48feeds anymore after a while and that

0:14:51turned out not to be the case at all it

0:14:52turned out that password feeds are

0:14:55getting more and more popular as more

0:14:58and more podcasts exist and many of them

0:15:00choose to have paid tiers or private

0:15:02feeds or something like that and what a

0:15:05lot of people figured out also is that

0:15:07when I switch my crawlers to use go when

0:15:11I switch to it to a go offered crawler

0:15:12goes URL library if you supply it a URL

0:15:18that has the username and password

0:15:19prefixed on it the way you could do like

0:15:21username colon password at hostname it

0:15:24that will just work correctly in the go

0:15:28crawling library and people figured this

0:15:30out about overcast a couple years ago

0:15:31and so people have been adding user name

0:15:34and password feeds to overcast

0:15:36anyway and just doing it you know just

0:15:38like the nerds who figure that out no to

0:15:40just add that manually as a URL and so

0:15:43I'm already now having my database

0:15:45beefed look with lots of these copies of

0:15:47these things and and lots of different

0:15:49feeds and and the good thing is that

0:15:50like you know concerns like whether it's

0:15:53you know kept private or not that just

0:15:55kind of works with overcast because I

0:15:56filter by weather feeds have iTunes IDs

0:15:59and if they don't have iTunes IDs they

0:16:01don't show up in search or in many other

0:16:03places and so these copies of these

0:16:07private fees that have these using the

0:16:08passwords prefixed on them don't have

0:16:10iTunes entries so they don't show up and

0:16:12search so that that part ends up working

0:16:14but I am seeing my database slowly

0:16:16filled with these anyway and now there's

0:16:19so many of them that if I would like

0:16:21close that hole and make those not work

0:16:23anymore that would be a pretty big

0:16:25problem for me I have a lot of very

0:16:27angry people and that would probably be

0:16:29like you know a pretty nasty move so I'm

0:16:31not gonna break these now instead of

0:16:34decided you know what actually the right

0:16:36move here is to just make an interface

0:16:39like on the add URL screen

0:16:42I should just detect whether it's given

0:16:45me a 401 response and prompt people to

0:16:48enter a username and password and just

0:16:50store that for them in the URL for the

0:16:52feed because again this is like

0:16:54pragmatic versus ideal like in the ideal

0:16:57world I shouldn't have to deal with

0:16:58these in the real world turns out I do

0:17:01and so I might as well make it pleasant

0:17:04for people who use them and I might as

0:17:06well and and you know the reality is I

0:17:08just have to design my crawlers and

0:17:10scale my crawlers in such a way that

0:17:13having a whole bunch of these feeds in

0:17:15the database is not going to be a

0:17:17problem and that's just the reality

0:17:19because the reality is you have to do

0:17:22like it's really hard to impose your

0:17:26will on your users in that way like if

0:17:29people want to you want to do this thing

0:17:31and they want to use your app to do it

0:17:32they're going to do it mm-hmm like it

0:17:35would doesn't really get you very far if

0:17:38like when someone put like the

0:17:39alternative I suppose is like if someone

0:17:41went to the ad URL screen and you

0:17:43detected they there was a you know a

0:17:45username and password prefix to the URL

0:17:47you know you could throw up a big nasty

0:17:49mess

0:17:49a chance a no no no this is not what we

0:17:52do and it was with a wagging finger bad

0:17:56URL that's really that otherwise this is

0:17:58going to happen like people are going to

0:18:00realize it is happening yeah and if

0:18:02anything you could you view it it's like

0:18:04okay well you were able to without

0:18:07without really doing any extra work you

0:18:09were able to see how big of a market and

0:18:11need and interest there is in this so at

0:18:15least it's a slightly positive in that

0:18:17sense like rather than building this

0:18:18feature ahead of time you're able to

0:18:19build it now knowing that it will be

0:18:22used that you know roughly how many

0:18:24people are going to use it and then you

0:18:25can you know make changes to the way you

0:18:28do crawling or the way that you manage

0:18:30these things accordingly to take

0:18:32advantage of it and so like it's a good

0:18:34thing in that sense but yeah like you

0:18:36can't

0:18:36I mean you this is this is a kind of

0:18:38thing that just sort of always happens I

0:18:39find that you know you expect people to

0:18:42be using your app in one way and so

0:18:44often it is the way that you want to use

0:18:47it or the way that you you know you have

0:18:48it in your mind and then you get a

0:18:50support request you get an email from

0:18:51somebody and they show you something

0:18:54about how they were using your app that

0:18:56can kind of sum it's like it's like

0:18:57you're doing what exactly what woke okay

0:19:02like and sometimes I see those things

0:19:05and it's like that's genius like that's

0:19:07amazing I need to you know like

0:19:08percolate this up into this actual

0:19:10proper feature and sometimes you're just

0:19:12like um I'm amazed that works it's not

0:19:17intended to work I don't know if it will

0:19:20work in the future

0:19:20good luck but like it is just one of

0:19:24those things that you know users are

0:19:26shockingly creative about with the ways

0:19:28that they'll make something work

0:19:29especially I mean inviting thing it's a

0:19:31compliment to Overcash that people even

0:19:33though this isn't a feature of the app

0:19:35they took the effort and did the work to

0:19:37make it you know to somehow make it work

0:19:40because they want to use the app anyway

0:19:42that they don't want to switch to

0:19:43another app that mase you know support

0:19:45this at a at a official level because

0:19:49that you know they like the app and they

0:19:51want to stay with it anyway and my final

0:19:54example here that I wanted to talk about

0:19:55today was when the iPhone 10 came out it

0:19:59you know it has this new OLED screen and

0:20:01it turns out that completely black

0:20:03looks really good on an OLED screen the

0:20:06problem is that completely black doesn't

0:20:08look so good if you have like a totally

0:20:11black background and you know other

0:20:13elements that are like you know lighter

0:20:15and go totally black does not look as

0:20:16good on LCD screens the screens that

0:20:19we've had an iPhone since the first

0:20:20iPhone before this but true black looks

0:20:23really good on OLED and and all those

0:20:25like dark Gray's that we've been using

0:20:28on LCDs because that looks better there

0:20:30don't look good on the iPhone 10 so what

0:20:34as soon as Efrain 10 came out there was

0:20:35immediate demand from users who want all

0:20:38their apps to have true black themes

0:20:41available designers haven't been

0:20:43accustomed to LCD screens for the last

0:20:45forever designers have all have all

0:20:47basically said like you know looked it

0:20:49doesn't look as good it's hard and it is

0:20:51harder in many ways like there's certain

0:20:53certain design themes and standards that

0:20:56just either don't work or have to be

0:20:57severely modified to work with a true

0:20:59black background and design ocean argue

0:21:03like maybe they don't think it looks as

0:21:05good but the reality is a lot of people

0:21:09think it looks good and a lot of people

0:21:10want it and one of the things they

0:21:12started doing when the iPhone 10 shipped

0:21:15I got a massive spike in requests for

0:21:18supporting the accessibility smart

0:21:20invert colors feature because what had

0:21:23happened was people seeking more dark

0:21:26themes in their apps with iOS apps that

0:21:28so often are like bright white they

0:21:30there have been numerous articles posted

0:21:32online and telling people hey neat trick

0:21:34you can turn on this smarter invert

0:21:37colors feature in accessibility settings

0:21:38and all your apps turn black and so they

0:21:41were doing that and overcast didn't

0:21:43support it correctly with like it like

0:21:44it was overcast was not excluding the

0:21:46images from being inverted so all the

0:21:48artwork would look weird so I got this

0:21:49huge spike in requests when the iPhone

0:21:5210 came out to support smart invert

0:21:55colors the reality was these were not

0:21:57people who needed this for accessibility

0:21:59reasons for the most part they were

0:22:01people who just wanted a black theme and

0:22:03because it looks so it looks so good on

0:22:05their on their iPhone 10 and it's better

0:22:07on the battery and stuff so even though

0:22:10I thought you know I should probably

0:22:11like you know true black I thought

0:22:13looked kind of you know it's it's it's a

0:22:15pretty bold look when you first see it

0:22:17I now think it looks good but it took me

0:22:20a few hours before I thought it looked

0:22:21good after I started using it but the

0:22:25reality was the market was making their

0:22:27own black-themed even if I wasn't like

0:22:29they would just turn on my white theme

0:22:30and turn on smart invert colors and

0:22:32accessibility and they were making a

0:22:34black theme so the correct thing for me

0:22:37to do which I did in the next update was

0:22:39fix my spar time for colour support to

0:22:41make the images look correct and then

0:22:43also add a black theme because like

0:22:46that's the reality no matter what you

0:22:48think of black themes everyone now wants

0:22:52them and if you don't give them one they

0:22:54will work around that to get themselves

0:22:57one with accessibility settings and that

0:23:00makes a lot of the system look really

0:23:01weird and it's over like if you don't

0:23:04need invert colors as an accessibility

0:23:06option you shouldn't be using it there's

0:23:07lots of weird side effects to it but

0:23:09people wanted the black themes so badly

0:23:11that they did that so again it's one of

0:23:14those situations where like designers

0:23:16thought you shouldn't do pure black but

0:23:18the market says differently and you just

0:23:19have to adopt at that point yeah but it

0:23:22is always tricky and I think that it

0:23:24comes to mind is I've made the mistake

0:23:25in the past of going too far down this

0:23:29road of adding things like themes and

0:23:33like these kind of more super

0:23:35superficial options to an app and then I

0:23:37end up regretting it in this way in the

0:23:39sense that you now have three themes you

0:23:44need to support in your app and you know

0:23:47when you're anytime you add a view

0:23:49anytime you make a change you're gonna

0:23:50have to make sure that it works well now

0:23:52in all three of those themes it reminds

0:23:56me in a weird way of localization where

0:23:58I like and in my early days with

0:24:02localization I would get somebody who

0:24:04would say hey you know I I would like to

0:24:07localize your app into you know whatever

0:24:09language they spoke natively and I use

0:24:11it all the time I think it'd be great

0:24:12and I'll you know be happy to do the

0:24:14translations for free just send me the

0:24:16strings file and it's like initially I

0:24:18used to think that's a great idea like

0:24:20sure let me let me know the more the

0:24:24better and then you realize now I need

0:24:26to support this going forward and every

0:24:28time you add a string to your

0:24:29application

0:24:30you have to have it translated or now

0:24:32you when you do screen shots you need a

0:24:34different thing to manage there and so

0:24:37while it is sometimes it's good to you

0:24:39know it's good to be adaptive and good

0:24:41to be you know responsive to users that

0:24:44it is in the back of my mind I've been

0:24:45burned enough by it now that I'm like do

0:24:47I really want this theme do I really

0:24:49want to have to you know that your your

0:24:50great trick where when you're checking

0:24:52you know dark mode switches have it

0:24:54switched between the themes you know

0:24:56every every set for a couple seconds so

0:24:58that you can make sure that you want

0:24:59your you wanna looks good so I really

0:25:01want that to cycle through three well or

0:25:03now maybe if someone suggests four or

0:25:05five like you it gets to a point where

0:25:07you can end up being too responsive to

0:25:11your users and so I guess there's a

0:25:12certain element where you have to draw

0:25:15lines and you have to say like or at

0:25:17least to think about do what how willing

0:25:18am i to support this you know how

0:25:20endured injustice create confusion to

0:25:23people now when they look in your

0:25:25Settings app and look at the themes area

0:25:27and they're like do I want dark or do I

0:25:29want black it's kind of like when you

0:25:32know Apple is selling the matte black

0:25:34and the jet black iPhones interesting to

0:25:37be like it now I have this choice I

0:25:39don't know like how do I know which

0:25:42one's better and you know they're having

0:25:43a bit of opinion there may actually be

0:25:45helpful but in this case it's like

0:25:47you're you're at a certain point you're

0:25:49being forced to do it just by the volume

0:25:52of requests but it's always yeah it

0:25:55makes it makes my developer since this

0:25:57tingle a little bit and be like do I

0:25:59really want to do this do I understand

0:26:00what I'm taking on by adding this it

0:26:02seems like just a little option you know

0:26:04it's just oh it's just black but you

0:26:07know you this is just the way things go

0:26:08I suppose I mean honestly I did it on a

0:26:11plane flight like that's how fast it

0:26:13wants to do because it's almost worse

0:26:15yeah it's so easy it's like oh let me

0:26:18just do this one thing and then it turns

0:26:20out you have to support this one thing

0:26:22forever well to be fair like you know

0:26:24it's similar to localization going from

0:26:27one to two themes is a lot more work

0:26:30than going from two to three and you

0:26:33know like going from two to three like

0:26:34if you if you did you're one to two

0:26:36migration like if you added theming to

0:26:38your app in a reasonable way adding

0:26:41additional themes is actually pretty

0:26:43straightforward

0:26:44and you are right that that you know

0:26:45there is certainly a testing and

0:26:46maintenance burden and maybe a screen

0:26:48shot bird and if you if you go that way

0:26:50for certain things but you know it

0:26:52really is not as big of a deal but again

0:26:55the reality is if the market is like if

0:26:58people are willingly making their

0:27:00experience with your app worse and

0:27:02possibly their experience with their

0:27:04entire phone worse in order to achieve a

0:27:07thing that you don't think you have to

0:27:08do

0:27:08the reality is you probably have to do

0:27:10it sure yeah I mean ultimately it's like

0:27:15there's always a tension there but you

0:27:17have to a certain point you just have to

0:27:18relent and it's I suppose it's more just

0:27:20a question of making sure we're being

0:27:21thoughtful when we were lent that we

0:27:23understand what we're taking on that

0:27:25these seemingly small choices that we

0:27:28you know can make we have to live with

0:27:30for a long time and I guess that in some

0:27:32ways that's the theme of all three of

0:27:33these kind of challenges you've had to

0:27:35navigate is that whenever we are making

0:27:37choices as we're developing we have to

0:27:40understand that you know we're going to

0:27:42live with all of these choices going

0:27:43forward and so at least trying to be

0:27:45thoughtful about them or thinking or

0:27:46take a moment to be like do I really

0:27:48want to do this or how can this come

0:27:50back to bite me in the future you know

0:27:51how am I going to hate myself in the

0:27:53future because of this choice that I'm

0:27:55making and having a little bit of

0:27:57thoughtfulness is probably wise just to

0:27:59avoid you know getting into situations

0:28:02that we may regret later thanks we'll

0:28:05see everybody and we'll talk to you next

0:28:06week bye