PodSearch

Developing Perspective

#179: Avoiding the Stampede.

 

00:00:00 ◼   ► Hello and welcome to Developing Perspective.

00:00:02 ◼   ► Developing Perspective is a podcast discussing news of note in iOS development, Apple, and

00:00:06 ◼   ► the like.

00:00:07 ◼   ► I'm your host, David Smith.

00:00:08 ◼   ► I'm an independent iOS developer based in Herna, Virginia.

00:00:11 ◼   ► This is show number 179.

00:00:13 ◼   ► Today is Thursday, April 3rd.

00:00:16 ◼   ► Developing Perspective is never longer than 15 minutes, so let's get started.

00:00:19 ◼   ► All right, so I'm finally back from all of my travels and conference speaking, which

00:00:24 ◼   ► all I'd say went pretty well for some of my first times out.

00:00:28 ◼   ► But I'm glad to finally be able to button down in April, probably be focusing more on

00:00:33 ◼   ► building things rather than just talking about building things.

00:00:35 ◼   ► Which I guess is somewhat ironic, even that I'm starting off the month talking on a podcast.

00:00:40 ◼   ► But anyway, so unless you live under a rock or in under a rock that only has internet

00:00:46 ◼   ► such that you can download 15 minute podcasts, you probably heard that this week WWDC was

00:00:53 ◼   ► announced, which is a delightful break

00:00:56 ◼   ► from their typical pattern, or by typical,

00:00:58 ◼   ► I mean what they've done the last couple of years.

00:01:00 ◼   ► They announced in late April, where they've

00:01:02 ◼   ► announced now nice and early.

00:01:04 ◼   ► We have the dates.

00:01:05 ◼   ► It's the first week in June.

00:01:06 ◼   ► And they're doing something different this year.

00:01:08 ◼   ► They're distributing tickets through a kind

00:01:11 ◼   ► of more of a lottery, or a random selection,

00:01:13 ◼   ► I think is how Apple called it every time.

00:01:15 ◼   ► And I'm pretty excited about that.

00:01:17 ◼   ► The more I thought about it, the more it kind of became obvious

00:01:19 ◼   ► that this is where they were going to have to go,

00:01:22 ◼   ► that the old system that was largely based on either knowing

00:01:27 ◼   ► when tickets were going to be in terms of having alert systems

00:01:29 ◼   ► and things, then rushing and doing it,

00:01:31 ◼   ► what they tried last year with the stampede,

00:01:34 ◼   ► those are all kind of-- they just don't scale well.

00:01:37 ◼   ► And the only system that scales once you have too high--

00:01:41 ◼   ► way too high demand for the number of tickets

00:01:43 ◼   ► you have available, if you don't want to or can't increase

00:01:46 ◼   ► the number of tickets, is to go with something like a lottery.

00:01:49 ◼   ► And so that's what they did.

00:01:50 ◼   ► We'll all put our names in the hat.

00:01:53 ◼   ► You have until, I believe it is 10 AM on Monday to do it.

00:01:56 ◼   ► So if you have a chance between now and then

00:01:58 ◼   ► and you're wanting to try, by all means do.

00:02:02 ◼   ► But then through some process, randomly

00:02:05 ◼   ► select 5,000 names out of that hat.

00:02:09 ◼   ► And if you get one, great.

00:02:10 ◼   ► And if you don't, I'm sorry.

00:02:13 ◼   ► But by and large, I think this is a great improvement.

00:02:15 ◼   ► And hopefully it'll go well.

00:02:17 ◼   ► And this is where they'll be heading going forward.

00:02:20 ◼   ► would expect. And I think it's generally good because while no system is perfect,

00:02:24 ◼   ► there's no way that they can build, you know, build a structure for getting

00:02:29 ◼   ► tickets where everyone who wants a ticket will get one. That's impossible,

00:02:33 ◼   ► unless they're able to drive down interest in developing for Apple's platforms to such a

00:02:38 ◼   ► degree that there's no longer 5,000 people who want to do it, which seems very unlikely.

00:02:42 ◼   ► Or they would have to do something like, how would you determine who are the, you know,

00:02:49 ◼   ► the 5,000 correct people to get it,

00:02:50 ◼   ► in terms of for some definition of correctness.

00:02:52 ◼   ► Some people would say, like, oh, I want the old guard

00:02:54 ◼   ► to always get their tickets.

00:02:55 ◼   ► The most successful people should get their tickets.

00:02:57 ◼   ► The newest people should get their tickets

00:02:59 ◼   ► so we can build the platform.

00:03:00 ◼   ► The youngest, the oldest.

00:03:01 ◼   ► I mean, you could imagine whatever you want.

00:03:03 ◼   ► The reality is you just want to do it randomly.

00:03:05 ◼   ► You just want to give everybody a chance, an even chance,

00:03:08 ◼   ► an honest chance to get a ticket.

00:03:10 ◼   ► And then from there, just hope everyone

00:03:14 ◼   ► gets seen as sort of hope things--

00:03:16 ◼   ► people understand if they don't get one.

00:03:18 ◼   ► And on the flip side, I hope the people who get tickets, use them, enjoy them, take them

00:03:23 ◼   ► to full advantage.

00:03:25 ◼   ► I'll be out in San Francisco either way.

00:03:26 ◼   ► I've already booked my plane and hotel for the week.

00:03:29 ◼   ► I'll be out there either way because it's such a wonderful week.

00:03:33 ◼   ► Even if I can get a ticket, I'd still want to be out there to meet, sort of see the people

00:03:36 ◼   ► who I only typically see once a year at DubDub, as well as just being around.

00:03:42 ◼   ► It's a really kind of jazzing energy that is always kind of a motivating thing for the

00:03:45 ◼   ► middle of my year.

00:03:46 ◼   ► So that's kind of what I'm doing.

00:03:48 ◼   ► I said make sure you put your name in the hat if you want.

00:03:51 ◼   ► WVDC is really cool.

00:03:52 ◼   ► If you've never been, I highly recommend having the experience at least once.

00:03:57 ◼   ► You know, getting up early, waiting in line, going to some of the kind of special events

00:04:01 ◼   ► that there aren't videos for.

00:04:02 ◼   ► It's fun.

00:04:03 ◼   ► Obviously it's kind of a bit of an expensive vacation, but it's definitely useful and fun.

00:04:09 ◼   ► And I think there's something about it that is kind of a bit infectious.

00:04:14 ◼   ► And so that's kind of cool.

00:04:15 ◼   ► All right, so I'm going to be diving into the main topic.

00:04:18 ◼   ► I'm going to be talking for the rest of the show.

00:04:20 ◼   ► And it's a slight break for my App Store series.

00:04:23 ◼   ► I'll be picking that up.

00:04:24 ◼   ► I have a few more topics I want to talk up through.

00:04:26 ◼   ► But with W3C popping up today, I wanted

00:04:29 ◼   ► to make sure I had a full episode the next time I

00:04:31 ◼   ► did the App Store thing.

00:04:32 ◼   ► And so W3C took about a third of it.

00:04:34 ◼   ► So I was going to do something a little bit shorter.

00:04:36 ◼   ► And so it's going to be what I want to talk about,

00:04:38 ◼   ► is server hosting.

00:04:40 ◼   ► And this is going to be maybe a bit of a funny thing

00:04:42 ◼   ► to talk about.

00:04:42 ◼   ► But it really got prompted from a series of podcasts and conversations back and forth.

00:04:49 ◼   ► I think it got started with Justin Williams was talking about it, Bart Garment, Brent

00:04:53 ◼   ► Simmons, you know, we've done a lot of these back and forths about what level of abstraction

00:04:58 ◼   ► is the appropriate place to find for your own application.

00:05:02 ◼   ► So in the one extreme, obviously, you could build your back ends, you know, your and honestly,

00:05:07 ◼   ► it's probably even taken even step further and say, almost every utility application

00:05:11 ◼   ► these days uses some form of online backend.

00:05:14 ◼   ► Maybe if you're a game, you can get away with it.

00:05:16 ◼   ► But even then, you're probably using something like Game Center.

00:05:19 ◼   ► Very few apps now work well as just the app in itself

00:05:24 ◼   ► in complete isolation.

00:05:26 ◼   ► You're always interacting outwardly,

00:05:28 ◼   ► because that's often even what makes apps useful.

00:05:31 ◼   ► And so if you're going to interact with something,

00:05:34 ◼   ► you have to decide what you're going to interact with.

00:05:36 ◼   ► Are you going to, on the one end,

00:05:38 ◼   ► to kind of purchase very high level, very large building blocks, kind of building your

00:05:43 ◼   ► backend with Duplo.

00:05:44 ◼   ► You know, are you going to be sitting there and just kind of snapping some big blocks

00:05:48 ◼   ► together to build your backend?

00:05:50 ◼   ► You know, using things that are very simple, very well defined interfaces, kind of these

00:05:55 ◼   ► big blocks.

00:05:56 ◼   ► Or are you going to go farther and farther down the stack?

00:05:57 ◼   ► Maybe you're going to go from Duplo to Lego and then at some point you're going to be

00:06:00 ◼   ► building your own Lego, but you buy an injection molder to make it.

00:06:04 ◼   ► And then you're going to be buying the machine that's necessary to build the injection molder.

00:06:09 ◼   ► You could imagine if you brutalized that metaphor to go all the way from the Duplo all the way

00:06:13 ◼   ► down.

00:06:14 ◼   ► But at every level, you're making different choices.

00:06:18 ◼   ► And there's always trade-offs between the different levels as you're going.

00:06:22 ◼   ► And the reality is-- and I've worked at all of those levels.

00:06:27 ◼   ► And so I feel like I have some authority to talk about this.

00:06:32 ◼   ► But the reality is at every level, you're making trade-offs.

00:06:35 ◼   ► And you're just choosing which trade-offs

00:06:37 ◼   ► make the most sense for you and your product.

00:06:40 ◼   ► And those are going to differ for every different--

00:06:42 ◼   ► every project is going to have a different set of trade-offs

00:06:45 ◼   ► that make the most sense for it.

00:06:47 ◼   ► But here's some of the kind of things that I think about

00:06:49 ◼   ► that will hopefully-- maybe I thought

00:06:50 ◼   ► it would be helpful to kind of get you thinking as you're

00:06:52 ◼   ► trying to plan out your back end,

00:06:54 ◼   ► as you're trying to decide what makes sense for you.

00:06:56 ◼   ► First is to say, every abstraction choice

00:06:59 ◼   ► you make in your hosting stack is a leaky abstraction.

00:07:05 ◼   ► And by that I mean, if you take the core functionality,

00:07:08 ◼   ► say whatever it was, if the functionality is,

00:07:11 ◼   ► I want you to take this picture and I need to put it somewhere

00:07:15 ◼   ► and then retrieve it later, say it's a very simple operation

00:07:19 ◼   ► conceptually, not simple to implement,

00:07:21 ◼   ► but simple conceptually, I have these bytes

00:07:25 ◼   ► that I need to put somewhere and then get back.

00:07:28 ◼   ► Now I could use a service on the one end that

00:07:30 ◼   ► was very abstracted, that basically just said,

00:07:33 ◼   ► save picture, retrieve picture.

00:07:36 ◼   ► That's all it did.

00:07:37 ◼   ► It's very, very high level, very abstract.

00:07:40 ◼   ► And that's great.

00:07:42 ◼   ► Or I could go all the way to the other extent,

00:07:45 ◼   ► I could build a web application who

00:07:48 ◼   ► takes in some binary data, who then packages it up,

00:07:51 ◼   ► and then take that binary data and I distribute it out

00:07:54 ◼   ► to a content distribution network or whatever.

00:07:57 ◼   ► And you could build and imagine systems all the way

00:08:01 ◼   ► in between of those two things.

00:08:02 ◼   ► Like, from a very, very low level,

00:08:04 ◼   ► dealing with the raw bytes, putting them on disks,

00:08:07 ◼   ► to something that's just like a web endpoint that you

00:08:10 ◼   ► hit with a post method.

00:08:12 ◼   ► Like, you could very easily kind of go in either direction.

00:08:16 ◼   ► And understand that the very abstract version,

00:08:18 ◼   ► you know, the very high level version, it's nice.

00:08:22 ◼   ► It's easy to use.

00:08:22 ◼   ► You're just like, here's my thing.

00:08:24 ◼   ► I'm going to put it in there.

00:08:25 ◼   ► And that's usually fine.

00:08:28 ◼   ► But every now and then, little implementation details,

00:08:30 ◼   ► little other things that are being hidden away

00:08:32 ◼   ► are going to leak through.

00:08:33 ◼   ► And so you have to understand what those are likely.

00:08:36 ◼   ► What are those problems?

00:08:37 ◼   ► What are those issues that are going to come back to bite you

00:08:40 ◼   ► so that you can understand if those trade-offs make sense

00:08:44 ◼   ► to you and those trade-offs are worthwhile to you?

00:08:47 ◼   ► And inevitably, they will.

00:08:48 ◼   ► Inevitably, they'll be things or cases or situations

00:08:52 ◼   ► where you try using that backend in a way that it falls down.

00:08:57 ◼   ► Say, for example, you have a very, very large image.

00:09:00 ◼   ► You'd have a 10 gig image, and you try and send it

00:09:03 ◼   ► to your very, very high level thing,

00:09:05 ◼   ► and it's just the whole thing falls apart.

00:09:07 ◼   ► Well, that's why I did it.

00:09:08 ◼   ► Well, it's a leaky abstraction.

00:09:10 ◼   ► Maybe it just isn't built to handle that thing.

00:09:12 ◼   ► Or if you give it a very small file,

00:09:16 ◼   ► you give it a zero byte file, maybe weird things will happen.

00:09:20 ◼   ► Things that are just intrinsic in the way it was implemented

00:09:24 ◼   ► that you won't necessarily find out right away.

00:09:27 ◼   ► Now, obviously, those are contrived examples,

00:09:29 ◼   ► but hopefully they kind of get you

00:09:30 ◼   ► thinking of what I'm saying.

00:09:31 ◼   ► No matter how abstract the front end interface is,

00:09:34 ◼   ► there's always going to be back end implementation details that

00:09:37 ◼   ► are going to affect you.

00:09:38 ◼   ► So the first question you always have to ask yourself

00:09:40 ◼   ► when you're doing this is, what can you live with?

00:09:45 ◼   ► What are the things that you feel comfortable having

00:09:47 ◼   ► to-- the constraints and things that you're

00:09:49 ◼   ► have to place in your application as a result of making these choices.

00:09:54 ◼   ► And also, whatever choice you-- the deeper down in the stack you go, the more flexibility

00:10:01 ◼   ► you have, the more things that you can do, the fewer constraints you have overtly on

00:10:05 ◼   ► your application, that you can do whatever you want.

00:10:08 ◼   ► And that's awesome, and that's terrifying.

00:10:12 ◼   ► If you can do anything, that means you can do anything.

00:10:14 ◼   ► You can do really bad, horrible decisions that you then have to maintain and deal with

00:10:19 ◼   ► forever. Or you can build awesome solutions to not problems that nobody else can solve

00:10:24 ◼   ► because no one else has built the great back end. So you have to be thoughtful about what

00:10:29 ◼   ► constraints do you want to work in? How big of a sandbox do you want to get messy in?

00:10:36 ◼   ► Generally what I find, and this is kind of just a personality thing I think in a large

00:10:39 ◼   ► degree, is that the more and more I do this, the deeper into the stack I go. And that's

00:10:46 ◼   ► interesting because I suspect, I suspect there'll be a curve or a couple of curves, I guess,

00:10:51 ◼   ► into this where as I keep going, I'll go deeper and deeper into the stack. And at some point,

00:10:57 ◼   ► I'll likely sort of start coming back up again. And I think a lot of that has to do with the

00:11:03 ◼   ► role that learning plays in this. Because as a developer, I love learning new things. I love

00:11:08 ◼   ► learning new platforms and technologies. That's something that I just really enjoy. And so part

00:11:14 ◼   ► of what's made feed wrangler, for example, really interesting

00:11:17 ◼   ► from a personal level is that I'm learning

00:11:20 ◼   ► a lot of great new stuff.

00:11:21 ◼   ► I'm understanding now, feed wrangler

00:11:25 ◼   ► is built from pretty small pieces.

00:11:27 ◼   ► It uses Postgres, obviously, as a database, which is pretty big.

00:11:31 ◼   ► But exactly how that's deployed and managed and orchestrated

00:11:35 ◼   ► is all done by me.

00:11:36 ◼   ► I'm SSHing into servers and editing config files

00:11:38 ◼   ► and doing all this very low level stuff.

00:11:41 ◼   ► And some of it was out of necessity

00:11:44 ◼   ► because it's a very data-intensive application.

00:11:46 ◼   ► But a lot of it, too, is just because it's really interesting to learn.

00:11:49 ◼   ► And I can do things now that I wouldn't have been able to otherwise.

00:11:52 ◼   ► And the number of times things that I can learn from implementing a UI table

00:11:56 ◼   ► view again isn't as fun for me right now as it

00:11:59 ◼   ► is for doing this really cool server networking stuff.

00:12:03 ◼   ► And so that's kind of just really fun.

00:12:05 ◼   ► And even beyond just being fun, I mean, it's cool.

00:12:10 ◼   ► And it's weird to say, but it's just cool.

00:12:12 ◼   ► Like this last week, one of my main database servers

00:12:15 ◼   ► for Feed Wrangler was running out of hard drive space

00:12:18 ◼   ► because I kind of poorly planned it.

00:12:20 ◼   ► And so it's like, OK, I'll go and provision a new server,

00:12:23 ◼   ► have it physically built in my data center,

00:12:26 ◼   ► have that deployed out, set it up,

00:12:28 ◼   ► configure all the security and the permission stuff,

00:12:31 ◼   ► go and do all that, deploy Postgres onto it,

00:12:33 ◼   ► set it up from a backup into a live streaming binary copy

00:12:38 ◼   ► of the main primary master server that was starting to run out of space,

00:12:44 ◼   ► get it set up so that the two are perfectly in sync and running perfectly forward,

00:12:47 ◼   ► and then dynamically switch everything over to that being the new master,

00:12:52 ◼   ► which is crazy.

00:12:53 ◼   ► Like, the fact that I was able to-- and it actually worked.

00:12:57 ◼   ► It's a funny thing when you roll out a server change and everything goes well.

00:13:01 ◼   ► And that's almost scarier than things going poorly.

00:13:04 ◼   ► But I've done this now a couple times.

00:13:07 ◼   ► I know what I'm doing in a way that is really fun.

00:13:10 ◼   ► And so I kind of would be sad if I

00:13:12 ◼   ► was using a service that didn't-- I just hit a button

00:13:14 ◼   ► and says, like, expand database size.

00:13:17 ◼   ► Brrp!

00:13:18 ◼   ► Like, that'd be kind of sad.

00:13:19 ◼   ► I wouldn't be learning.

00:13:20 ◼   ► And so it's kind of fun.

00:13:23 ◼   ► Another reason I tend to go low level

00:13:25 ◼   ► is I enjoy being able to optimize things

00:13:28 ◼   ► for my application.

00:13:29 ◼   ► I can work through a lot of bottlenecks

00:13:31 ◼   ► that I wouldn't be able to if I didn't have access

00:13:34 ◼   ► to much lower level stuff.

00:13:35 ◼   ► things where I'm tweaking kernel values,

00:13:37 ◼   ► when I'm changing the memory configurations on Linux servers.

00:13:40 ◼   ► You can get really low level, and you can increase performance

00:13:43 ◼   ► in tangible ways that you just couldn't do otherwise.

00:13:46 ◼   ► It's pretty cool.

00:13:48 ◼   ► One of the things is the realization

00:13:50 ◼   ► that no matter what level I do it,

00:13:52 ◼   ► I'm going to have to monitor the system.

00:13:53 ◼   ► A lot of people say, well, I use an off-the-shelf system.

00:13:57 ◼   ► I use Azure.

00:13:57 ◼   ► I use AWS.

00:13:59 ◼   ► I use something higher level because I

00:14:01 ◼   ► want to have someone-- if something goes wrong,

00:14:03 ◼   ► I want someone else to be trying to fix it.

00:14:05 ◼   ► In some ways, that's better.

00:14:06 ◼   ► But the reality is, if it goes down, it goes down.

00:14:08 ◼   ► And I'm going to have to worry about that either way, which

00:14:11 ◼   ► kind of sucks, but it is how it is.

00:14:14 ◼   ► And lastly, it's often cheaper.

00:14:17 ◼   ► And really, that's the bottom line for an indie like me.

00:14:21 ◼   ► A lot of these services, I look at them like Azure.

00:14:24 ◼   ► And it's just expensive.

00:14:26 ◼   ► It's compared to me just running some raw Linux servers.

00:14:30 ◼   ► It just doesn't really scale.

00:14:32 ◼   ► And so you have to make that choice.

00:14:33 ◼   ► You have to think about your application.

00:14:35 ◼   ► Think what trade-offs you want to live with,

00:14:37 ◼   ► what abstractions are leaky that you'd be OK with.

00:14:40 ◼   ► And just find what works best for you.

00:14:42 ◼   ► All right, that's it for today's show.

00:14:43 ◼   ► As always, if you have questions, comments, concerns,

00:14:45 ◼   ► or complaints, I'm on Twitter @_davidsmith,

00:14:47 ◼   ► david@devlaucomperspective.com.

00:14:49 ◼   ► Have a good week.

00:14:49 ◼   ► Good luck on Monday.