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