PodSearch

Under the Radar

Under the Radar 112: Ideal vs. Pragmatic

 

00:00:00 ◼   ► welcome to under the radar a show about

00:00:02 ◼   ► independent iOS app development I'm mark

00:00:04 ◼   ► Worman and I'm David Smith

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

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

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

00:00:11 ◼   ► forced to do something for outside

00:00:15 ◼   ► reasons or market demand or pragmatic

00:00:18 ◼   ► reasons that may be that like maybe you

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

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

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

00:00:28 ◼   ► this was brought about the reason I was

00:00:31 ◼   ► talked about this initially is that I I

00:00:33 ◼   ► had a number of things happen recently

00:00:34 ◼   ► with overcast that were of this nature

00:00:36 ◼   ► and where I had to basically adopt to

00:00:39 ◼   ► the way people actually are or the way

00:00:41 ◼   ► things actually work rather than hold on

00:00:44 ◼   ► to my you know long-standing you know

00:00:47 ◼   ► belief that it should be a different way

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

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

00:00:54 ◼   ► often up in the case yeah the first the

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

00:01:00 ◼   ► was overcast recently had to implement

00:01:04 ◼   ► feed redirect support and/or permanent

00:01:07 ◼   ► feed change support and I talked about

00:01:09 ◼   ► this a little bit on ATP last week so

00:01:11 ◼   ► I'm not gonna go too far into it but the

00:01:13 ◼   ► basic idea here is that podcast feeds

00:01:17 ◼   ► change over time and podcasters when

00:01:22 ◼   ► they the podcast is often will move the

00:01:24 ◼   ► feed to a different service or to a

00:01:26 ◼   ► different host or tweeted for an ad

00:01:27 ◼   ► tracking platform or whatever else they

00:01:30 ◼   ► just move the feet and and they don't

00:01:31 ◼   ► like if you move a website you usually

00:01:34 ◼   ► set up a redirect from the old URL to

00:01:36 ◼   ► the new URLs and you usually leave that

00:01:38 ◼   ► redirect there forever and even if you

00:01:41 ◼   ► give it the the permanent redirect code

00:01:43 ◼   ► of 301 rather than the temporary one of

00:01:45 ◼   ► 302 you still leave up the redirect

00:01:48 ◼   ► forever because you know that like

00:01:50 ◼   ► there's old links the point to it

00:01:52 ◼   ► there's old search engine ranking that

00:01:54 ◼   ► might point to it and so you you know

00:01:56 ◼   ► that like it's a good practice on the

00:01:57 ◼   ► web to to basically make redirects work

00:02:00 ◼   ► forever so if you're writing something

00:02:02 ◼   ► that that keeps URLs in a database and

00:02:05 ◼   ► and crawls them every so often on the

00:02:08 ◼   ► web you can pretty much never process

00:02:11 ◼   ► permanent redirect codes and be fine

00:02:13 ◼   ► because almost all the redirects will

00:02:16 ◼   ► keep working indefinitely into the

00:02:18 ◼   ► future

00:02:19 ◼   ► and when I made overcast this is how I

00:02:21 ◼   ► set up the database and and this was you

00:02:23 ◼   ► know I mean I made the database in 2013

00:02:25 ◼   ► that's when I made the schema I started

00:02:27 ◼   ► crawling and and started building up my

00:02:30 ◼   ► database of feeds and and the app

00:02:31 ◼   ► launched about a year later and so for

00:02:34 ◼   ► me at the time I made this decision of

00:02:37 ◼   ► how to structure my feeds table and my

00:02:39 ◼   ► feed items table and and how users

00:02:42 ◼   ► interact with feeds and feed items I

00:02:44 ◼   ► designed this whole schema back then and

00:02:46 ◼   ► there was one big flaw in the schema

00:02:49 ◼   ► which was that feeds couldn't have their

00:02:52 ◼   ► URLs changed if a if a feed was created

00:02:56 ◼   ► with a new URL it would be a whole new

00:02:58 ◼   ► feed entry and then there was no

00:03:00 ◼   ► mechanism in place to do things like you

00:03:03 ◼   ► know if if a new URL is created and in

00:03:05 ◼   ► the and then one of the old ones

00:03:06 ◼   ► redirects to that one how do I can I

00:03:09 ◼   ► merge those entries do I copy the old

00:03:12 ◼   ► one to the new one do what does the newt

00:03:14 ◼   ► does the old one have some kind of an

00:03:15 ◼   ► alias list that also points to the new

00:03:17 ◼   ► one I had no setup like that in place

00:03:20 ◼   ► and so the entire app and everything and

00:03:22 ◼   ► the entire database were built up

00:03:23 ◼   ► without that consideration or without

00:03:25 ◼   ► that possibility and this started to

00:03:28 ◼   ► become a problem pretty soon after

00:03:31 ◼   ► launch that a couple of webs a couple of

00:03:34 ◼   ► podcaster at switching their feed URLs

00:03:36 ◼   ► and for awhile I thought well you know

00:03:38 ◼   ► people just subscribe to the new one the

00:03:40 ◼   ► old one will still work forever because

00:03:41 ◼   ► it'll redirect and it'll be fine there

00:03:43 ◼   ► were a number of problems with the set

00:03:44 ◼   ► up in reality one of the big ones is

00:03:46 ◼   ► that when I would do things like count

00:03:49 ◼   ► subscribers to do things like search

00:03:51 ◼   ► ranking the two different entries would

00:03:54 ◼   ► count as independent feeds I would have

00:03:57 ◼   ► to do search filtering so things like

00:03:59 ◼   ► you know I filter I don't show search

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

00:04:02 ◼   ► associated so when the iTunes ID would

00:04:04 ◼   ► move it would basically lose the search

00:04:08 ◼   ► ranking and the entire history of the

00:04:09 ◼   ► previous one etc so there were all sorts

00:04:11 ◼   ► of problems of that but it wasn't a big

00:04:13 ◼   ► problem because not a lot of podcasts

00:04:16 ◼   ► were moving their feeds in 2014 and then

00:04:19 ◼   ► over the following years a lot of

00:04:23 ◼   ► podcasts switched from HTTP to HTTPS

00:04:27 ◼   ► and because a lot of websites did as we

00:04:30 ◼   ► all kind of learn with that would we

00:04:31 ◼   ► probably should be doing that that

00:04:33 ◼   ► created a whole lot of duplicate entries

00:04:36 ◼   ► additionally during that time a certain

00:04:39 ◼   ► podcast networks shut down or moved or

00:04:42 ◼   ► changed their names change their domains

00:04:43 ◼   ► and that caused even more extra or

00:04:46 ◼   ► removed entries and then the big one was

00:04:50 ◼   ► over the last year or two a lot of major

00:04:54 ◼   ► podcast publishers have switched to

00:04:57 ◼   ► dynamic ad insertion platforms which

00:04:59 ◼   ► hosts the feet of their own our URL for

00:05:01 ◼   ► who knows what reason and so tons of

00:05:05 ◼   ► major podcasts are now switching their

00:05:07 ◼   ► feeds if they didn't already do it with

00:05:09 ◼   ► HTTPS like two years ago in the last

00:05:12 ◼   ► year they're now doing it with ad

00:05:13 ◼   ► tracking platforms so I've had a like it

00:05:17 ◼   ► basically went from a small problem in

00:05:19 ◼   ► year one to a medium-size problem in

00:05:22 ◼   ► year two and a really big problem in

00:05:24 ◼   ► year three and so I finally had to

00:05:27 ◼   ► implement feed redirects and I had you

00:05:30 ◼   ► know all this time I've been thinking

00:05:32 ◼   ► like I can just follow redirects I can

00:05:34 ◼   ► feel like they'll be fine they'll be

00:05:35 ◼   ► they'll be good forever and the reality

00:05:38 ◼   ► was just different the reality was

00:05:39 ◼   ► podcasters don't do things the way web

00:05:41 ◼   ► web developers do things they break

00:05:43 ◼   ► redirects like they consider iTunes the

00:05:45 ◼   ► authoritative source and if iTunes moves

00:05:48 ◼   ► the feed for them which they can do

00:05:50 ◼   ► through multiple different means either

00:05:52 ◼   ► a 301 or putting a special XML tag in

00:05:56 ◼   ► the feed that was returned with a 200

00:05:57 ◼   ► response or going through like an iTunes

00:06:00 ◼   ► customer support representative learning

00:06:02 ◼   ► the podcast directory and like just like

00:06:04 ◼   ► emailing somebody and saying sorry we

00:06:05 ◼   ► messed up our feet can you fix it and

00:06:07 ◼   ► none of those things would carry over to

00:06:09 ◼   ► overcast so the reality of the market

00:06:12 ◼   ► was very very different from how I

00:06:13 ◼   ► wanted it to be I really badly wanted it

00:06:16 ◼   ► to work in this one way that websites

00:06:18 ◼   ► always work which is like you know set

00:06:19 ◼   ► up a redirect and keep it up forever but

00:06:22 ◼   ► the reality was very different the

00:06:23 ◼   ► reality was podcasters had to move their

00:06:24 ◼   ► feeds frequently they would break the

00:06:26 ◼   ► old URLs and redirects most of the time

00:06:29 ◼   ► and even if they didn't I still had this

00:06:31 ◼   ► problem of like split feed in the

00:06:34 ◼   ► database so that's no good so finally

00:06:37 ◼   ► over the last couple of weeks I finally

00:06:39 ◼   ► wrote redirect support and be

00:06:41 ◼   ► cause of my database schema being so

00:06:42 ◼   ► unfriendly to it it's a huge hack and

00:06:45 ◼   ► it's not perfect the way I do it is that

00:06:48 ◼   ► basically like copy your old entries

00:06:51 ◼   ► onto the new feed and delete your old

00:06:53 ◼   ► ones and that's not great like there's a

00:06:56 ◼   ► whole lot of downsides to that one of

00:06:57 ◼   ► the big ones is that the app seeing a

00:07:00 ◼   ► new feed item ID for all these episodes

00:07:02 ◼   ► the APRI downloads them all that's no

00:07:05 ◼   ► good either so you like you it maintains

00:07:08 ◼   ► your history but you have to download

00:07:09 ◼   ► like all of a sudden your phone is

00:07:11 ◼   ► downloading like all your saved episodes

00:07:13 ◼   ► of a certain show that you hadn't

00:07:14 ◼   ► listened to yet and that's kind of weird

00:07:16 ◼   ► to cut to happen unexpectedly so that's

00:07:19 ◼   ► not a great solution but I had to be

00:07:22 ◼   ► pragmatic I had to address this problem

00:07:25 ◼   ► somehow because the market was very

00:07:29 ◼   ► different than what I wanted it to be

00:07:31 ◼   ► yeah and I I think I also hear in what

00:07:35 ◼   ► you're saying it's this thing that is so

00:07:37 ◼   ► happens to me this happened to me so

00:07:39 ◼   ► many times is it's as much as we would

00:07:42 ◼   ► like I think we would like to be able to

00:07:44 ◼   ► predict the future and when we're

00:07:46 ◼   ► initially building our applications and

00:07:49 ◼   ► we're designing them and we're

00:07:50 ◼   ► structuring them we would make choices

00:07:53 ◼   ► that you know our future selves will

00:07:56 ◼   ► thank us for right and conceptually that

00:08:00 ◼   ► sounds great that okay yeah of course

00:08:01 ◼   ► like I should engine you I should struct

00:08:04 ◼   ► structure these things you know with

00:08:05 ◼   ► maximum flexibility and I should be able

00:08:07 ◼   ► to I should a head of time I should

00:08:09 ◼   ► consider all these possibilities the

00:08:12 ◼   ► reality is I've done this enough to know

00:08:14 ◼   ► that you can't like that is impossible

00:08:18 ◼   ► and things will change and break and

00:08:21 ◼   ► become problems in ways that you could

00:08:24 ◼   ► never have predicted maybe you get

00:08:27 ◼   ► slightly better at this you know maybe

00:08:28 ◼   ► you don't make the same mistake twice

00:08:29 ◼   ► like those types of things may be

00:08:32 ◼   ► improving but I feel like the situation

00:08:34 ◼   ► you find yourself in is something that

00:08:36 ◼   ► is universal to app development or just

00:08:38 ◼   ► you know software engineering in general

00:08:40 ◼   ► that you will at some point make be

00:08:44 ◼   ► forced to either you know you either

00:08:45 ◼   ► have to make an assumption or you have

00:08:48 ◼   ► to explode complexity like those are the

00:08:51 ◼   ► two choice one of those two things you

00:08:53 ◼   ► have to do at

00:08:54 ◼   ► hundreds of points in your application

00:08:57 ◼   ► as you're developing it you either have

00:08:59 ◼   ► so you can make an assumption you can

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

00:09:02 ◼   ► you know that mapping a feed URL to the

00:09:06 ◼   ► fee a ID directly will be a stable link

00:09:09 ◼   ► or you have to explode complexity and

00:09:12 ◼   ► like you had build you'd have to do some

00:09:14 ◼   ► very complicated things to make that

00:09:17 ◼   ► work you know flexibly and in this case

00:09:20 ◼   ► you know you chose to make the to start

00:09:22 ◼   ► with the assumption but like that's the

00:09:23 ◼   ► same thing that we do all the time

00:09:25 ◼   ► there's so much so much of you know soft

00:09:27 ◼   ► development is about getting good at

00:09:31 ◼   ► making that decision between making an

00:09:33 ◼   ► assumption and expanding complexity and

00:09:35 ◼   ► you could apply this stuff so many thing

00:09:37 ◼   ► it's like how complicated is your class

00:09:38 ◼   ► hierarchy you know what do kind of

00:09:41 ◼   ► choices do you do for data no data

00:09:43 ◼   ► persistence or or so many different

00:09:45 ◼   ► things come down to this base this very

00:09:47 ◼   ► simple situation or do you are you going

00:09:49 ◼   ► to make an assumption or are you going

00:09:51 ◼   ► to explode complexity and like and that

00:09:55 ◼   ► means that you're stuck like now you

00:09:56 ◼   ► have to go and do be forced to do this

00:09:58 ◼   ► thing because your assumption proved to

00:10:01 ◼   ► be wrong or proved to be in wrong enough

00:10:04 ◼   ► that continuing with that assumption

00:10:07 ◼   ► becomes problematic and it's so much

00:10:10 ◼   ► more complex to is like like as I've

00:10:12 ◼   ► mentioned this on Twitter here and there

00:10:13 ◼   ► the last couple of weeks I've gotten a

00:10:15 ◼   ► number of people who are suggesting like

00:10:17 ◼   ► oh why don't you why didn't you just do

00:10:18 ◼   ► this with your database or why didn't

00:10:19 ◼   ► you just make this migration happen and

00:10:21 ◼   ► a lot of them a lot of the the ideas or

00:10:24 ◼   ► suggestions don't really work or aren't

00:10:26 ◼   ► as simple as they sound

00:10:27 ◼   ► because overcast is not just a local app

00:10:29 ◼   ► with a local database it is a service

00:10:32 ◼   ► with a server back-end that syncs

00:10:34 ◼   ► between multiple copies of your app on

00:10:35 ◼   ► multiple devices so any kind of like

00:10:38 ◼   ► one-way migration either can't happen or

00:10:41 ◼   ► is way more complex than you would think

00:10:43 ◼   ► and also because it is a server back tap

00:10:46 ◼   ► the the complexity of the schema has a

00:10:49 ◼   ► direct relationship to how scalable it

00:10:52 ◼   ► is and how efficient it is and how

00:10:54 ◼   ► expensive it is to host you know if if

00:10:57 ◼   ► every look up to the feeds table has to

00:11:00 ◼   ► then make another look up to some kind

00:11:02 ◼   ► of like URL aliases table or something

00:11:05 ◼   ► like that like to to map the URL to the

00:11:07 ◼   ► feeds arm fetching

00:11:08 ◼   ► that's a pretty significant hit in

00:11:10 ◼   ► performance that's that's much more

00:11:11 ◼   ► complexity and that could be way more

00:11:14 ◼   ► load on the database servers and that

00:11:15 ◼   ► could really make scaling more difficult

00:11:17 ◼   ► and if you have multi if you have many

00:11:19 ◼   ► of those things in your schema for

00:11:21 ◼   ► flexibility and everything then you

00:11:24 ◼   ► start running into pretty big scaling

00:11:26 ◼   ► problems and big challenges that either

00:11:28 ◼   ► just make your life hard or make things

00:11:30 ◼   ► cost way more to hosts and that could

00:11:32 ◼   ► break your business model so like

00:11:33 ◼   ► there's there's all sorts of other

00:11:35 ◼   ► considerations here that make things

00:11:37 ◼   ► that this sound like a hard problem

00:11:38 ◼   ► anyway so that was you know one problem

00:11:42 ◼   ► of many that I've had and I kind of

00:11:45 ◼   ► wanted to talk for the show about a few

00:11:47 ◼   ► more of those but before we do speaking

00:11:50 ◼   ► of scaling your web servers we were a

00:11:52 ◼   ► sponsor this week by Linode Linode has

00:11:55 ◼   ► fast powerful web hosting options that

00:11:57 ◼   ► you can get set up in just seconds it's

00:11:59 ◼   ► very very easy to understand other tools

00:12:00 ◼   ► and they could let you choose the

00:12:02 ◼   ► resources and the next distribution that

00:12:04 ◼   ► you want giving you the power and

00:12:05 ◼   ► flexibility that you need all this

00:12:06 ◼   ► starts at just five dollars a month that

00:12:08 ◼   ► gets you a server with one gigabyte or

00:12:13 ◼   ► very very fast if industry-leading

00:12:15 ◼   ► performance they have native SSD storage

00:12:17 ◼   ► and all their servers access to a 200

00:12:20 ◼   ► gigabit network eat intel xeon e5

00:12:23 ◼   ► processors my favorite line of

00:12:24 ◼   ► processors these are the fastest

00:12:26 ◼   ► processors in the cloud market leader

00:12:28 ◼   ► has over 400,000 customers who are all

00:12:31 ◼   ► serviced by the friendly 24/7 support

00:12:34 ◼   ► team you can email them if you need any

00:12:36 ◼   ► help you can chat over IRC if you need

00:12:37 ◼   ► any help and they have all sorts of

00:12:39 ◼   ► wonderful documentation that's all

00:12:41 ◼   ► public you can see it right now you and

00:12:43 ◼   ► in fact a lot of times if you search for

00:12:45 ◼   ► Linux server administration topics a lot

00:12:47 ◼   ► of times the search results you get from

00:12:48 ◼   ► Google are just Linode support articles

00:12:50 ◼   ► because they are so easy to use to

00:12:52 ◼   ► understand and so helpful so litterin

00:12:54 ◼   ► has fantastic pricing options available

00:12:56 ◼   ► again you can get a server with one

00:12:57 ◼   ► gigabyte us five bucks a month you can

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

00:13:02 ◼   ► just 60 bucks a month and a whole lot of

00:13:04 ◼   ► levels above and below it in between

00:13:05 ◼   ► across the board this is twice the

00:13:07 ◼   ► amount of RAM that you'll get at most

00:13:08 ◼   ► other places as a listener of the show

00:13:10 ◼   ► if you sign up at lynda.com a slash of

00:13:12 ◼   ► radar you'll be supporting us and you

00:13:14 ◼   ► look at $20 towards any Linode plan and

00:13:16 ◼   ► with a 7 day money-back guarantee

00:13:18 ◼   ► there's nothing to lose so go to

00:13:20 ◼   ► lynda.com slash

00:13:22 ◼   ► rate

00:13:22 ◼   ► are to learn more sign up and take

00:13:24 ◼   ► advantage about $20 credit or use promo

00:13:25 ◼   ► code radar 2017 at checkout thank you so

00:13:29 ◼   ► much to Linode for running all of my

00:13:30 ◼   ► servers and supporting the show so

00:13:33 ◼   ► another one I had with overcast a small

00:13:36 ◼   ► one before I go to another big one is

00:13:38 ◼   ► password protected feeds this is one

00:13:42 ◼   ► that you know podcasts sometimes we'll

00:13:44 ◼   ► have paid memberships or other kind of

00:13:47 ◼   ► like you know meant private feeds that

00:13:48 ◼   ► they protect with some kind of password

00:13:50 ◼   ► authentication scheme usually you know

00:13:52 ◼   ► HTTP basic auth it's compatible with

00:13:54 ◼   ► with a lot of apps and this becomes a

00:13:57 ◼   ► problem when you have a server-side

00:13:58 ◼   ► crawling like overcast does and in a

00:14:00 ◼   ► couple of a couple of competitors do

00:14:01 ◼   ► because it the question becomes like

00:14:04 ◼   ► where do you do you retain the password

00:14:07 ◼   ► and the entry on the server side and

00:14:09 ◼   ► then do you crawl with someone's

00:14:10 ◼   ► password do you how do you protect that

00:14:13 ◼   ► from being used by multiple people and

00:14:16 ◼   ► then if you have a whole lot of people

00:14:18 ◼   ► who all have separate usernames and

00:14:20 ◼   ► passwords they're calling the feed with

00:14:21 ◼   ► do you have to then crawl the feed from

00:14:22 ◼   ► like you know a hundred thousand

00:14:24 ◼   ► different users from like hundred

00:14:26 ◼   ► thousand different copies of the feed

00:14:27 ◼   ► like you have to keep all those in your

00:14:29 ◼   ► database and have those clogging up your

00:14:31 ◼   ► crawler so it's kind of a big problem so

00:14:33 ◼   ► when I launched overcast I made a

00:14:35 ◼   ► decision I'm just not gonna support

00:14:37 ◼   ► those and I this was kind of like a

00:14:39 ◼   ► political decision like I don't like

00:14:41 ◼   ► that I have to support these so I'm just

00:14:43 ◼   ► gonna see if I can not support them and

00:14:45 ◼   ► and just hope that nobody uses password

00:14:48 ◼   ► feeds anymore after a while and that

00:14:51 ◼   ► turned out not to be the case at all it

00:14:52 ◼   ► turned out that password feeds are

00:14:55 ◼   ► getting more and more popular as more

00:14:58 ◼   ► and more podcasts exist and many of them

00:15:00 ◼   ► choose to have paid tiers or private

00:15:02 ◼   ► feeds or something like that and what a

00:15:05 ◼   ► lot of people figured out also is that

00:15:07 ◼   ► when I switch my crawlers to use go when

00:15:11 ◼   ► I switch to it to a go offered crawler

00:15:12 ◼   ► goes URL library if you supply it a URL

00:15:18 ◼   ► that has the username and password

00:15:19 ◼   ► prefixed on it the way you could do like

00:15:21 ◼   ► username colon password at hostname it

00:15:24 ◼   ► that will just work correctly in the go

00:15:28 ◼   ► crawling library and people figured this

00:15:30 ◼   ► out about overcast a couple years ago

00:15:31 ◼   ► and so people have been adding user name

00:15:34 ◼   ► and password feeds to overcast

00:15:36 ◼   ► anyway and just doing it you know just

00:15:38 ◼   ► like the nerds who figure that out no to

00:15:40 ◼   ► just add that manually as a URL and so

00:15:43 ◼   ► I'm already now having my database

00:15:45 ◼   ► beefed look with lots of these copies of

00:15:47 ◼   ► these things and and lots of different

00:15:49 ◼   ► feeds and and the good thing is that

00:15:50 ◼   ► like you know concerns like whether it's

00:15:53 ◼   ► you know kept private or not that just

00:15:55 ◼   ► kind of works with overcast because I

00:15:56 ◼   ► filter by weather feeds have iTunes IDs

00:15:59 ◼   ► and if they don't have iTunes IDs they

00:16:01 ◼   ► don't show up in search or in many other

00:16:03 ◼   ► places and so these copies of these

00:16:07 ◼   ► private fees that have these using the

00:16:08 ◼   ► passwords prefixed on them don't have

00:16:10 ◼   ► iTunes entries so they don't show up and

00:16:12 ◼   ► search so that that part ends up working

00:16:14 ◼   ► but I am seeing my database slowly

00:16:16 ◼   ► filled with these anyway and now there's

00:16:19 ◼   ► so many of them that if I would like

00:16:21 ◼   ► close that hole and make those not work

00:16:23 ◼   ► anymore that would be a pretty big

00:16:25 ◼   ► problem for me I have a lot of very

00:16:27 ◼   ► angry people and that would probably be

00:16:29 ◼   ► like you know a pretty nasty move so I'm

00:16:31 ◼   ► not gonna break these now instead of

00:16:34 ◼   ► decided you know what actually the right

00:16:36 ◼   ► move here is to just make an interface

00:16:39 ◼   ► like on the add URL screen

00:16:42 ◼   ► I should just detect whether it's given

00:16:45 ◼   ► me a 401 response and prompt people to

00:16:48 ◼   ► enter a username and password and just

00:16:50 ◼   ► store that for them in the URL for the

00:16:52 ◼   ► feed because again this is like

00:16:54 ◼   ► pragmatic versus ideal like in the ideal

00:16:57 ◼   ► world I shouldn't have to deal with

00:16:58 ◼   ► these in the real world turns out I do

00:17:01 ◼   ► and so I might as well make it pleasant

00:17:04 ◼   ► for people who use them and I might as

00:17:06 ◼   ► well and and you know the reality is I

00:17:08 ◼   ► just have to design my crawlers and

00:17:10 ◼   ► scale my crawlers in such a way that

00:17:13 ◼   ► having a whole bunch of these feeds in

00:17:15 ◼   ► the database is not going to be a

00:17:17 ◼   ► problem and that's just the reality

00:17:19 ◼   ► because the reality is you have to do

00:17:22 ◼   ► like it's really hard to impose your

00:17:26 ◼   ► will on your users in that way like if

00:17:29 ◼   ► people want to you want to do this thing

00:17:31 ◼   ► and they want to use your app to do it

00:17:32 ◼   ► they're going to do it mm-hmm like it

00:17:35 ◼   ► would doesn't really get you very far if

00:17:38 ◼   ► like when someone put like the

00:17:39 ◼   ► alternative I suppose is like if someone

00:17:41 ◼   ► went to the ad URL screen and you

00:17:43 ◼   ► detected they there was a you know a

00:17:45 ◼   ► username and password prefix to the URL

00:17:47 ◼   ► you know you could throw up a big nasty

00:17:49 ◼   ► mess

00:17:49 ◼   ► a chance a no no no this is not what we

00:17:52 ◼   ► do and it was with a wagging finger bad

00:17:56 ◼   ► URL that's really that otherwise this is

00:17:58 ◼   ► going to happen like people are going to

00:18:00 ◼   ► realize it is happening yeah and if

00:18:02 ◼   ► anything you could you view it it's like

00:18:04 ◼   ► okay well you were able to without

00:18:07 ◼   ► without really doing any extra work you

00:18:09 ◼   ► were able to see how big of a market and

00:18:11 ◼   ► need and interest there is in this so at

00:18:15 ◼   ► least it's a slightly positive in that

00:18:17 ◼   ► sense like rather than building this

00:18:18 ◼   ► feature ahead of time you're able to

00:18:19 ◼   ► build it now knowing that it will be

00:18:22 ◼   ► used that you know roughly how many

00:18:24 ◼   ► people are going to use it and then you

00:18:25 ◼   ► can you know make changes to the way you

00:18:28 ◼   ► do crawling or the way that you manage

00:18:30 ◼   ► these things accordingly to take

00:18:32 ◼   ► advantage of it and so like it's a good

00:18:34 ◼   ► thing in that sense but yeah like you

00:18:36 ◼   ► can't

00:18:36 ◼   ► I mean you this is this is a kind of

00:18:38 ◼   ► thing that just sort of always happens I

00:18:39 ◼   ► find that you know you expect people to

00:18:42 ◼   ► be using your app in one way and so

00:18:44 ◼   ► often it is the way that you want to use

00:18:47 ◼   ► it or the way that you you know you have

00:18:48 ◼   ► it in your mind and then you get a

00:18:50 ◼   ► support request you get an email from

00:18:51 ◼   ► somebody and they show you something

00:18:54 ◼   ► about how they were using your app that

00:18:56 ◼   ► can kind of sum it's like it's like

00:18:57 ◼   ► you're doing what exactly what woke okay

00:19:02 ◼   ► like and sometimes I see those things

00:19:05 ◼   ► and it's like that's genius like that's

00:19:07 ◼   ► amazing I need to you know like

00:19:08 ◼   ► percolate this up into this actual

00:19:10 ◼   ► proper feature and sometimes you're just

00:19:12 ◼   ► like um I'm amazed that works it's not

00:19:17 ◼   ► intended to work I don't know if it will

00:19:20 ◼   ► work in the future

00:19:20 ◼   ► good luck but like it is just one of

00:19:24 ◼   ► those things that you know users are

00:19:26 ◼   ► shockingly creative about with the ways

00:19:28 ◼   ► that they'll make something work

00:19:29 ◼   ► especially I mean inviting thing it's a

00:19:31 ◼   ► compliment to Overcash that people even

00:19:33 ◼   ► though this isn't a feature of the app

00:19:35 ◼   ► they took the effort and did the work to

00:19:37 ◼   ► make it you know to somehow make it work

00:19:40 ◼   ► because they want to use the app anyway

00:19:42 ◼   ► that they don't want to switch to

00:19:43 ◼   ► another app that mase you know support

00:19:45 ◼   ► this at a at a official level because

00:19:49 ◼   ► that you know they like the app and they

00:19:51 ◼   ► want to stay with it anyway and my final

00:19:54 ◼   ► example here that I wanted to talk about

00:19:55 ◼   ► today was when the iPhone 10 came out it

00:19:59 ◼   ► you know it has this new OLED screen and

00:20:01 ◼   ► it turns out that completely black

00:20:03 ◼   ► looks really good on an OLED screen the

00:20:06 ◼   ► problem is that completely black doesn't

00:20:08 ◼   ► look so good if you have like a totally

00:20:11 ◼   ► black background and you know other

00:20:13 ◼   ► elements that are like you know lighter

00:20:15 ◼   ► and go totally black does not look as

00:20:16 ◼   ► good on LCD screens the screens that

00:20:19 ◼   ► we've had an iPhone since the first

00:20:20 ◼   ► iPhone before this but true black looks

00:20:23 ◼   ► really good on OLED and and all those

00:20:25 ◼   ► like dark Gray's that we've been using

00:20:28 ◼   ► on LCDs because that looks better there

00:20:30 ◼   ► don't look good on the iPhone 10 so what

00:20:34 ◼   ► as soon as Efrain 10 came out there was

00:20:35 ◼   ► immediate demand from users who want all

00:20:38 ◼   ► their apps to have true black themes

00:20:41 ◼   ► available designers haven't been

00:20:43 ◼   ► accustomed to LCD screens for the last

00:20:45 ◼   ► forever designers have all have all

00:20:47 ◼   ► basically said like you know looked it

00:20:49 ◼   ► doesn't look as good it's hard and it is

00:20:51 ◼   ► harder in many ways like there's certain

00:20:53 ◼   ► certain design themes and standards that

00:20:56 ◼   ► just either don't work or have to be

00:20:57 ◼   ► severely modified to work with a true

00:20:59 ◼   ► black background and design ocean argue

00:21:03 ◼   ► like maybe they don't think it looks as

00:21:05 ◼   ► good but the reality is a lot of people

00:21:09 ◼   ► think it looks good and a lot of people

00:21:10 ◼   ► want it and one of the things they

00:21:12 ◼   ► started doing when the iPhone 10 shipped

00:21:15 ◼   ► I got a massive spike in requests for

00:21:18 ◼   ► supporting the accessibility smart

00:21:20 ◼   ► invert colors feature because what had

00:21:23 ◼   ► happened was people seeking more dark

00:21:26 ◼   ► themes in their apps with iOS apps that

00:21:28 ◼   ► so often are like bright white they

00:21:30 ◼   ► there have been numerous articles posted

00:21:32 ◼   ► online and telling people hey neat trick

00:21:34 ◼   ► you can turn on this smarter invert

00:21:37 ◼   ► colors feature in accessibility settings

00:21:38 ◼   ► and all your apps turn black and so they

00:21:41 ◼   ► were doing that and overcast didn't

00:21:43 ◼   ► support it correctly with like it like

00:21:44 ◼   ► it was overcast was not excluding the

00:21:46 ◼   ► images from being inverted so all the

00:21:48 ◼   ► artwork would look weird so I got this

00:21:49 ◼   ► huge spike in requests when the iPhone

00:21:52 ◼   ► 10 came out to support smart invert

00:21:55 ◼   ► colors the reality was these were not

00:21:57 ◼   ► people who needed this for accessibility

00:21:59 ◼   ► reasons for the most part they were

00:22:01 ◼   ► people who just wanted a black theme and

00:22:03 ◼   ► because it looks so it looks so good on

00:22:05 ◼   ► their on their iPhone 10 and it's better

00:22:07 ◼   ► on the battery and stuff so even though

00:22:10 ◼   ► I thought you know I should probably

00:22:11 ◼   ► like you know true black I thought

00:22:13 ◼   ► looked kind of you know it's it's it's a

00:22:15 ◼   ► pretty bold look when you first see it

00:22:17 ◼   ► I now think it looks good but it took me

00:22:20 ◼   ► a few hours before I thought it looked

00:22:21 ◼   ► good after I started using it but the

00:22:25 ◼   ► reality was the market was making their

00:22:27 ◼   ► own black-themed even if I wasn't like

00:22:29 ◼   ► they would just turn on my white theme

00:22:30 ◼   ► and turn on smart invert colors and

00:22:32 ◼   ► accessibility and they were making a

00:22:34 ◼   ► black theme so the correct thing for me

00:22:37 ◼   ► to do which I did in the next update was

00:22:39 ◼   ► fix my spar time for colour support to

00:22:41 ◼   ► make the images look correct and then

00:22:43 ◼   ► also add a black theme because like

00:22:46 ◼   ► that's the reality no matter what you

00:22:48 ◼   ► think of black themes everyone now wants

00:22:52 ◼   ► them and if you don't give them one they

00:22:54 ◼   ► will work around that to get themselves

00:22:57 ◼   ► one with accessibility settings and that

00:23:00 ◼   ► makes a lot of the system look really

00:23:01 ◼   ► weird and it's over like if you don't

00:23:04 ◼   ► need invert colors as an accessibility

00:23:06 ◼   ► option you shouldn't be using it there's

00:23:07 ◼   ► lots of weird side effects to it but

00:23:09 ◼   ► people wanted the black themes so badly

00:23:11 ◼   ► that they did that so again it's one of

00:23:14 ◼   ► those situations where like designers

00:23:16 ◼   ► thought you shouldn't do pure black but

00:23:18 ◼   ► the market says differently and you just

00:23:19 ◼   ► have to adopt at that point yeah but it

00:23:22 ◼   ► is always tricky and I think that it

00:23:24 ◼   ► comes to mind is I've made the mistake

00:23:25 ◼   ► in the past of going too far down this

00:23:29 ◼   ► road of adding things like themes and

00:23:33 ◼   ► like these kind of more super

00:23:35 ◼   ► superficial options to an app and then I

00:23:37 ◼   ► end up regretting it in this way in the

00:23:39 ◼   ► sense that you now have three themes you

00:23:44 ◼   ► need to support in your app and you know

00:23:47 ◼   ► when you're anytime you add a view

00:23:49 ◼   ► anytime you make a change you're gonna

00:23:50 ◼   ► have to make sure that it works well now

00:23:52 ◼   ► in all three of those themes it reminds

00:23:56 ◼   ► me in a weird way of localization where

00:23:58 ◼   ► I like and in my early days with

00:24:02 ◼   ► localization I would get somebody who

00:24:04 ◼   ► would say hey you know I I would like to

00:24:07 ◼   ► localize your app into you know whatever

00:24:09 ◼   ► language they spoke natively and I use

00:24:11 ◼   ► it all the time I think it'd be great

00:24:12 ◼   ► and I'll you know be happy to do the

00:24:14 ◼   ► translations for free just send me the

00:24:16 ◼   ► strings file and it's like initially I

00:24:18 ◼   ► used to think that's a great idea like

00:24:20 ◼   ► sure let me let me know the more the

00:24:24 ◼   ► better and then you realize now I need

00:24:26 ◼   ► to support this going forward and every

00:24:28 ◼   ► time you add a string to your

00:24:29 ◼   ► application

00:24:30 ◼   ► you have to have it translated or now

00:24:32 ◼   ► you when you do screen shots you need a

00:24:34 ◼   ► different thing to manage there and so

00:24:37 ◼   ► while it is sometimes it's good to you

00:24:39 ◼   ► know it's good to be adaptive and good

00:24:41 ◼   ► to be you know responsive to users that

00:24:44 ◼   ► it is in the back of my mind I've been

00:24:45 ◼   ► burned enough by it now that I'm like do

00:24:47 ◼   ► I really want this theme do I really

00:24:49 ◼   ► want to have to you know that your your

00:24:50 ◼   ► great trick where when you're checking

00:24:52 ◼   ► you know dark mode switches have it

00:24:54 ◼   ► switched between the themes you know

00:24:56 ◼   ► every every set for a couple seconds so

00:24:58 ◼   ► that you can make sure that you want

00:24:59 ◼   ► your you wanna looks good so I really

00:25:01 ◼   ► want that to cycle through three well or

00:25:03 ◼   ► now maybe if someone suggests four or

00:25:05 ◼   ► five like you it gets to a point where

00:25:07 ◼   ► you can end up being too responsive to

00:25:11 ◼   ► your users and so I guess there's a

00:25:12 ◼   ► certain element where you have to draw

00:25:15 ◼   ► lines and you have to say like or at

00:25:17 ◼   ► least to think about do what how willing

00:25:18 ◼   ► am i to support this you know how

00:25:20 ◼   ► endured injustice create confusion to

00:25:23 ◼   ► people now when they look in your

00:25:25 ◼   ► Settings app and look at the themes area

00:25:27 ◼   ► and they're like do I want dark or do I

00:25:29 ◼   ► want black it's kind of like when you

00:25:32 ◼   ► know Apple is selling the matte black

00:25:34 ◼   ► and the jet black iPhones interesting to

00:25:37 ◼   ► be like it now I have this choice I

00:25:39 ◼   ► don't know like how do I know which

00:25:42 ◼   ► one's better and you know they're having

00:25:43 ◼   ► a bit of opinion there may actually be

00:25:45 ◼   ► helpful but in this case it's like

00:25:47 ◼   ► you're you're at a certain point you're

00:25:49 ◼   ► being forced to do it just by the volume

00:25:52 ◼   ► of requests but it's always yeah it

00:25:55 ◼   ► makes it makes my developer since this

00:25:57 ◼   ► tingle a little bit and be like do I

00:25:59 ◼   ► really want to do this do I understand

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

00:26:02 ◼   ► seems like just a little option you know

00:26:04 ◼   ► it's just oh it's just black but you

00:26:07 ◼   ► know you this is just the way things go

00:26:08 ◼   ► I suppose I mean honestly I did it on a

00:26:11 ◼   ► plane flight like that's how fast it

00:26:13 ◼   ► wants to do because it's almost worse

00:26:15 ◼   ► yeah it's so easy it's like oh let me

00:26:18 ◼   ► just do this one thing and then it turns

00:26:20 ◼   ► out you have to support this one thing

00:26:22 ◼   ► forever well to be fair like you know

00:26:24 ◼   ► it's similar to localization going from

00:26:27 ◼   ► one to two themes is a lot more work

00:26:30 ◼   ► than going from two to three and you

00:26:33 ◼   ► know like going from two to three like

00:26:34 ◼   ► if you if you did you're one to two

00:26:36 ◼   ► migration like if you added theming to

00:26:38 ◼   ► your app in a reasonable way adding

00:26:41 ◼   ► additional themes is actually pretty

00:26:43 ◼   ► straightforward

00:26:44 ◼   ► and you are right that that you know

00:26:45 ◼   ► there is certainly a testing and

00:26:46 ◼   ► maintenance burden and maybe a screen

00:26:48 ◼   ► shot bird and if you if you go that way

00:26:50 ◼   ► for certain things but you know it

00:26:52 ◼   ► really is not as big of a deal but again

00:26:55 ◼   ► the reality is if the market is like if

00:26:58 ◼   ► people are willingly making their

00:27:00 ◼   ► experience with your app worse and

00:27:02 ◼   ► possibly their experience with their

00:27:04 ◼   ► entire phone worse in order to achieve a

00:27:07 ◼   ► thing that you don't think you have to

00:27:08 ◼   ► do

00:27:08 ◼   ► the reality is you probably have to do

00:27:10 ◼   ► it sure yeah I mean ultimately it's like

00:27:15 ◼   ► there's always a tension there but you

00:27:17 ◼   ► have to a certain point you just have to

00:27:18 ◼   ► relent and it's I suppose it's more just

00:27:20 ◼   ► a question of making sure we're being

00:27:21 ◼   ► thoughtful when we were lent that we

00:27:23 ◼   ► understand what we're taking on that

00:27:25 ◼   ► these seemingly small choices that we

00:27:28 ◼   ► you know can make we have to live with

00:27:30 ◼   ► for a long time and I guess that in some

00:27:32 ◼   ► ways that's the theme of all three of

00:27:33 ◼   ► these kind of challenges you've had to

00:27:35 ◼   ► navigate is that whenever we are making

00:27:37 ◼   ► choices as we're developing we have to

00:27:40 ◼   ► understand that you know we're going to

00:27:42 ◼   ► live with all of these choices going

00:27:43 ◼   ► forward and so at least trying to be

00:27:45 ◼   ► thoughtful about them or thinking or

00:27:46 ◼   ► take a moment to be like do I really

00:27:48 ◼   ► want to do this or how can this come

00:27:50 ◼   ► back to bite me in the future you know

00:27:51 ◼   ► how am I going to hate myself in the

00:27:53 ◼   ► future because of this choice that I'm

00:27:55 ◼   ► making and having a little bit of

00:27:57 ◼   ► thoughtfulness is probably wise just to

00:27:59 ◼   ► avoid you know getting into situations

00:28:02 ◼   ► that we may regret later thanks we'll

00:28:05 ◼   ► see everybody and we'll talk to you next

00:28:06 ◼   ► week bye