PodSearch

Under the Radar

128: Lightning Round III: Servers

 

00:00:00 ◼   ► - Welcome to Under the Radar,

00:00:01 ◼   ► a show about independent iOS app development.

00:00:04 ◼   ► I'm Marco Armet.

00:00:05 ◼   ► - And I'm David Smith.

00:00:06 ◼   ► Under the Radar is never longer than 30 minutes,

00:00:08 ◼   ► so let's get started.

00:00:10 ◼   ► So today we are going to, I guess,

00:00:12 ◼   ► have our third Q&A that we've ever done,

00:00:15 ◼   ► a follow-up to the one we did last week.

00:00:17 ◼   ► Got a lot of great questions that came in from that,

00:00:20 ◼   ► you know, since we recorded that episode,

00:00:23 ◼   ► and I think it was really, it's a good time

00:00:24 ◼   ► to talk through some of these things.

00:00:26 ◼   ► I think this is always an awkward time

00:00:29 ◼   ► for in-apple developer land,

00:00:30 ◼   ► because this is the quiet period before WWDC,

00:00:32 ◼   ► and then in the summer, things will pick up dramatically,

00:00:34 ◼   ► and there'll be a lot more topical and interesting things.

00:00:38 ◼   ► But it's also really interesting for me

00:00:39 ◼   ► just to hear from listeners of the show

00:00:42 ◼   ► and the kind of topics and things that you're interested in,

00:00:44 ◼   ► because as creators of something like a podcast,

00:00:47 ◼   ► it's very often, you know,

00:00:50 ◼   ► it can often be somewhat one way,

00:00:52 ◼   ► and so it's really nice to just hear

00:00:54 ◼   ► what you guys are interested in hearing us talk about,

00:00:56 ◼   ► and so that's really useful.

00:00:58 ◼   ► So we're gonna do another one of those this week.

00:01:01 ◼   ► So our first question comes from Rick,

00:01:04 ◼   ► who asks, "What does your app's

00:01:06 ◼   ► server infrastructure look like?"

00:01:08 ◼   ► And I think we're gonna answer this question

00:01:09 ◼   ► slightly more broadly, just like in general,

00:01:11 ◼   ► having a kind of a high-level talk

00:01:13 ◼   ► about the way we do servers.

00:01:16 ◼   ► It was a question that was asked by many other people

00:01:17 ◼   ► if we didn't happen to pick your question, apologies,

00:01:20 ◼   ► but we had a lot of general questions

00:01:21 ◼   ► about like how do we structure our servers,

00:01:24 ◼   ► how do we kind of, strategies and things

00:01:26 ◼   ► that we take for that.

00:01:28 ◼   ► Maybe getting into backups and scalability and so on.

00:01:31 ◼   ► Like there's lots of questions about that,

00:01:32 ◼   ► and I think getting into the specifics,

00:01:35 ◼   ► like the specific specifics,

00:01:37 ◼   ► is probably not particularly helpful.

00:01:39 ◼   ► I mean, I think there's something to be said for,

00:01:41 ◼   ► you know, the nature of any server infrastructure you create

00:01:45 ◼   ► is that it is immediately sort of obsolete and outdated,

00:01:50 ◼   ► in the sense that I'm sure there's a better,

00:01:52 ◼   ► you know, at the low level,

00:01:55 ◼   ► there's probably always a better approach

00:01:56 ◼   ► or something, some new hotness

00:01:57 ◼   ► that people would recommend or say,

00:01:59 ◼   ► oh, we're doing this wrong or this wrong.

00:02:01 ◼   ► Or even just in general,

00:02:02 ◼   ► that there's a lot of kind of these opinions about,

00:02:06 ◼   ► well, this is the way that I do it,

00:02:07 ◼   ► this is the way that you should do it, and so on.

00:02:09 ◼   ► So I think in general,

00:02:10 ◼   ► rather than talking about the actual specific details

00:02:12 ◼   ► of like I use this version of this package

00:02:15 ◼   ► to manage my servers, or I use this library for this,

00:02:18 ◼   ► or you know, this web host,

00:02:19 ◼   ► it's like this is at a high level,

00:02:22 ◼   ► what we have found, I think, to work well.

00:02:24 ◼   ► And I think that is useful

00:02:25 ◼   ► and probably much more constructive,

00:02:27 ◼   ► and then the details in your specific installation will vary.

00:02:31 ◼   ► So for me, I have a variety of different servers

00:02:35 ◼   ► that I manage as part of my work.

00:02:36 ◼   ► I think I have four apps that have server backends to them.

00:02:41 ◼   ► The biggest one for me is Feed Wrangler,

00:02:43 ◼   ► which is my RSS syncing platform.

00:02:45 ◼   ► And so I'll talk about that one probably in depth,

00:02:46 ◼   ► because it's sort of the superset of everything else.

00:02:49 ◼   ► So I host it with a Linode VPS or a series of those.

00:02:56 ◼   ► In front of those,

00:02:57 ◼   ► like starting out from the client and working back,

00:02:59 ◼   ► I have a, I guess it's like a proxy, we call it,

00:03:04 ◼   ► or a load balancer out in the front.

00:03:07 ◼   ► Requests go to there.

00:03:08 ◼   ► They then go to a variety of web servers.

00:03:10 ◼   ► I always have at least three,

00:03:12 ◼   ► because then if one goes down,

00:03:14 ◼   ► or I need to take one down for maintenance,

00:03:16 ◼   ► then there's at least two others.

00:03:18 ◼   ► And so then you're not falling down

00:03:20 ◼   ► to just one at any one time.

00:03:23 ◼   ► So I go out to three.

00:03:24 ◼   ► I have a main database server.

00:03:26 ◼   ► I have a variety of utility servers.

00:03:28 ◼   ► For an RSS syncing system,

00:03:29 ◼   ► you have a lot of scrapers and things that are,

00:03:32 ◼   ► these sort of task-based systems

00:03:34 ◼   ► that are being spun up and spun down all the time.

00:03:37 ◼   ► So I have a couple of utility servers,

00:03:40 ◼   ► which I have a memcache server

00:03:42 ◼   ► that's just basically just sitting there

00:03:43 ◼   ► to be a big pile of memory to do basic caching.

00:03:46 ◼   ► And I think that's it.

00:03:49 ◼   ► That's sort of at a high level,

00:03:50 ◼   ► the way that I structure things.

00:03:52 ◼   ► I do backups at multiple levels.

00:03:54 ◼   ► I have a continuous backup of my main database

00:03:59 ◼   ► that is always running,

00:04:00 ◼   ► that is just sort of doing this binary log streaming version

00:04:03 ◼   ► of that to take all of the data in real time

00:04:07 ◼   ► and doing a backup,

00:04:08 ◼   ► as well as taking advantage of a variety

00:04:10 ◼   ► of other kind of more snapshot-based snapshots.

00:04:14 ◼   ► So if, for whatever reason,

00:04:15 ◼   ► my binary logs or things got corrupted,

00:04:17 ◼   ► I can fall back to a less precise snapshot

00:04:22 ◼   ► for a particular point in time.

00:04:24 ◼   ► That's sort of my general approach.

00:04:25 ◼   ► - You know, I've done servers big and small,

00:04:29 ◼   ► and at a high level,

00:04:32 ◼   ► the biggest piece of advice I can give anybody

00:04:35 ◼   ► when doing server work,

00:04:37 ◼   ► especially in the context of iOS apps,

00:04:38 ◼   ► where your job is not to be the coolest server developer

00:04:41 ◼   ► in the world, your job is to make an app

00:04:42 ◼   ► that happens to include a server as part of how it works.

00:04:45 ◼   ► My best advice I can possibly give

00:04:48 ◼   ► is to have your server side stack be as boring

00:04:51 ◼   ► and established as possible.

00:04:53 ◼   ► And you never wanna be on the cutting edge

00:04:56 ◼   ► of anything server side, like anything,

00:04:59 ◼   ► the software, the hardware, anything.

00:05:02 ◼   ► You want to be as boring as possible.

00:05:04 ◼   ► So this means using tools in your stack

00:05:08 ◼   ► that have been around for a while,

00:05:09 ◼   ► that are well understood,

00:05:11 ◼   ► that other people are using,

00:05:13 ◼   ► way more people than you are using at scale,

00:05:16 ◼   ► and so everyone else can run into the bugs

00:05:19 ◼   ► who's on the cutting edge.

00:05:20 ◼   ► Let them fix things, let them patch things,

00:05:23 ◼   ► let them find the limits and fix them,

00:05:25 ◼   ► or at least document them.

00:05:26 ◼   ► You should not be doing that on your server

00:05:28 ◼   ► because you can't afford the time.

00:05:31 ◼   ► Simple as that, that's a whole different thing

00:05:34 ◼   ► that honestly I think nobody should be doing.

00:05:36 ◼   ► But if you, maybe if your entire career

00:05:40 ◼   ► is gonna be cutting edge server side stuff,

00:05:43 ◼   ► maybe you can consider it then,

00:05:44 ◼   ► but in the context of what listeners of this show

00:05:47 ◼   ► are doing and need to do,

00:05:49 ◼   ► and the context of what I've always needed to do,

00:05:51 ◼   ► boring established server side stacks are best.

00:05:54 ◼   ► So in my case I use PHP,

00:05:57 ◼   ► which is pretty much the definition

00:05:59 ◼   ► of boring established and battle tested,

00:06:01 ◼   ► and I use MySQL for the database,

00:06:04 ◼   ► which again, boring established tested.

00:06:06 ◼   ► Google and Facebook use tools like this,

00:06:09 ◼   ► and if they don't run into problems with it,

00:06:12 ◼   ► I know I won't run into problems with it,

00:06:14 ◼   ► or at least any problem I run into will be well documented,

00:06:17 ◼   ► will have tons of people online.

00:06:19 ◼   ► If you search for it, if you run into a problem,

00:06:21 ◼   ► you can figure out a way around it,

00:06:22 ◼   ► or you can figure out what you're doing wrong.

00:06:24 ◼   ► Anything cutting edge is gonna have problems with this,

00:06:27 ◼   ► 'cause it's just newer.

00:06:28 ◼   ► There's less help, it's moving more quickly,

00:06:31 ◼   ► it's changing more quickly, it's gonna be less stable,

00:06:33 ◼   ► just by definition of being newer,

00:06:35 ◼   ► and so keep things boring and old and stable.

00:06:39 ◼   ► Other than that, I structure things similarly.

00:06:42 ◼   ► I have a load balancer through our sponsor this week,

00:06:45 ◼   ► Linode actually, I use their node balancer

00:06:47 ◼   ► in front of things now.

00:06:48 ◼   ► I do software load balancers, things like HAProxy,

00:06:51 ◼   ► but I just don't need them anymore.

00:06:53 ◼   ► I have web servers behind that, all hitting databases,

00:06:57 ◼   ► and then a couple of servers that are neither web servers

00:07:01 ◼   ► nor databases that are just doing other app related tasks,

00:07:04 ◼   ► things like crawling or processing or generating backups

00:07:07 ◼   ► or things like that.

00:07:08 ◼   ► That's about it.

00:07:09 ◼   ► Again, it's not something you should really be overthinking

00:07:13 ◼   ► or overdesigning.

00:07:14 ◼   ► I wouldn't suggest doing anything that requires

00:07:18 ◼   ► fancy scaling things like, say, database sharding,

00:07:21 ◼   ► for instance, is one thing that I've found

00:07:23 ◼   ► is almost never worth doing for almost anybody

00:07:25 ◼   ► until you get to a very, very large scale.

00:07:29 ◼   ► Crazy kind of distributed tools, things like Cassandra,

00:07:32 ◼   ► really usually not necessary for anybody operating

00:07:35 ◼   ► at our scale or even much bigger than our scale.

00:07:39 ◼   ► If you use boring things like MySQL or Postgres,

00:07:43 ◼   ► if you use them well and properly,

00:07:47 ◼   ► you can get very, very far with them

00:07:49 ◼   ► without going to anything crazier.

00:07:51 ◼   ► Keep it simple, keep it old, keep it boring,

00:07:53 ◼   ► because you gotta keep in mind,

00:07:55 ◼   ► your job is to make this app that you're making

00:07:59 ◼   ► or to make this service that you're making.

00:08:00 ◼   ► Nobody cares how fancy your server-side stuff is,

00:08:04 ◼   ► and if you're working by yourself

00:08:07 ◼   ► or with a small group of people and listening to this show,

00:08:10 ◼   ► no matter what you think, you are not at the scale

00:08:12 ◼   ► where you need to be using cutting edge

00:08:15 ◼   ► or less commonly used things.

00:08:17 ◼   ► You're just not.

00:08:19 ◼   ► Google AdWords ran on MySQL for a very long time,

00:08:22 ◼   ► long after all of us heard of it and started using it.

00:08:25 ◼   ► Twitter ran on MySQL until, I think,

00:08:28 ◼   ► at least about 2009 or so, and probably even past that.

00:08:33 ◼   ► Facebook used PHP until they kind of developed

00:08:37 ◼   ► their own weird offshoot of it.

00:08:40 ◼   ► Wikipedia still uses PHP.

00:08:42 ◼   ► These are tools that, anything that you think,

00:08:45 ◼   ► X or Y doesn't scale, if you've heard that

00:08:47 ◼   ► or if you think that, you're probably not right

00:08:50 ◼   ► about that here, like, almost everything scales

00:08:53 ◼   ► if you learn how to use it responsibly.

00:08:56 ◼   ► The only thing I would also say about that, if possible,

00:08:59 ◼   ► is to basically make all of your requests stateless

00:09:03 ◼   ► so that any request can go to any server

00:09:07 ◼   ► and it still works just fine.

00:09:08 ◼   ► So basically, that doesn't take that much

00:09:11 ◼   ► to avoid just avoiding session state, basically,

00:09:14 ◼   ► being stored server-side.

00:09:16 ◼   ► That's about all you need for that.

00:09:18 ◼   ► And be very, very careful when going to database

00:09:22 ◼   ► replication setups, where you'd have kind of like

00:09:25 ◼   ► a master-slave kind of setup.

00:09:27 ◼   ► I use those, I use them a lot.

00:09:30 ◼   ► They are extraordinarily prone to weird caching bugs

00:09:35 ◼   ► if you're not careful.

00:09:37 ◼   ► And I've built up my own framework over time

00:09:39 ◼   ► to make it a little bit easier, to make it more automated,

00:09:41 ◼   ► where I'm not caching stale data from the read slave

00:09:44 ◼   ► or anything else, but just be careful

00:09:46 ◼   ► when you do that kind of complexity.

00:09:48 ◼   ► In general, it is much better to scale up

00:09:52 ◼   ► a single master database or to split it

00:09:55 ◼   ► between multiple master databases with different tables

00:09:58 ◼   ► in one, different tables in the other

00:10:00 ◼   ► before you go to replication setups,

00:10:01 ◼   ► because replication just introduces so many

00:10:03 ◼   ► subtle little bugs and little problems.

00:10:06 ◼   ► But yeah, otherwise, again, just keep it simple,

00:10:08 ◼   ► keep it old, and this is a really good time to tell you

00:10:10 ◼   ► about our sponsor, which is Linode.

00:10:13 ◼   ► Linode is my favorite web host.

00:10:16 ◼   ► It's where all of my servers are.

00:10:17 ◼   ► I have something like 20 servers there,

00:10:20 ◼   ► something in that ballpark.

00:10:21 ◼   ► With Linode, you have access to a suite

00:10:23 ◼   ► of powerful hosting options, with prices starting

00:10:25 ◼   ► at just $5 a month.

00:10:27 ◼   ► You can be up and running with your own virtual server

00:10:29 ◼   ► in the Linode cloud in under a minute.

00:10:32 ◼   ► Whether you are just getting started with one server,

00:10:34 ◼   ► which is where you should probably start,

00:10:35 ◼   ► or whether you're deploying a more complex system,

00:10:38 ◼   ► like what me and Dave have,

00:10:39 ◼   ► Linode is the right choice for you.

00:10:41 ◼   ► Linode has the fastest hardware network,

00:10:43 ◼   ► fantastic customer support behind it all.

00:10:45 ◼   ► It has never been easier to launch a Linode cloud server.

00:10:48 ◼   ► And they guarantee 99.9% uptime for server availability.

00:10:52 ◼   ► Once your server is up, they intend to keep it that way.

00:10:55 ◼   ► And they now also have block storage out of beta.

00:10:57 ◼   ► This is available in Fremont and Newark,

00:10:59 ◼   ► and they're expanding it to all data centers by June.

00:11:02 ◼   ► Linode is great for things like hosting large databases,

00:11:05 ◼   ► running mail servers, operating VPNs,

00:11:07 ◼   ► running Docker containers.

00:11:08 ◼   ► I really intend to actually learn Docker soon.

00:11:12 ◼   ► It's one of those things that like,

00:11:13 ◼   ► it's kinda like flossing, like you know you should do it,

00:11:16 ◼   ► and I just still haven't really gotten into the habit yet,

00:11:18 ◼   ► but I really gotta learn Docker.

00:11:20 ◼   ► Hosting a private Git server, you can do that there too,

00:11:22 ◼   ► and so much more.

00:11:23 ◼   ► And Linode's even hiring right now.

00:11:25 ◼   ► If that interests you, go to linode.com/careers.

00:11:28 ◼   ► So Linode has fantastic pricing options.

00:11:31 ◼   ► Plans start at just one gig of RAM for just $5 a month.

00:11:35 ◼   ► And they have all sorts of plans that go up from there,

00:11:36 ◼   ► including high memory plans.

00:11:38 ◼   ► As a listener of this show,

00:11:39 ◼   ► if you sign up at linode.com/radar,

00:11:42 ◼   ► you will be supporting us,

00:11:43 ◼   ► and you will get $20 towards any Linode plan.

00:11:46 ◼   ► So if you choose, for example, the one gig plan,

00:11:48 ◼   ► that's four months free.

00:11:49 ◼   ► And with a seven day money back guarantee,

00:11:51 ◼   ► there is nothing to lose.

00:11:53 ◼   ► So go to linode.com/radar to learn more,

00:11:56 ◼   ► sign up and take advantage of that $20 credit,

00:11:58 ◼   ► or use promo code radar2018 at checkout.

00:12:01 ◼   ► Thank you so much to Linode for supporting the show.

00:12:05 ◼   ► - So related to server development,

00:12:07 ◼   ► another question that we had

00:12:08 ◼   ► that I think has come up many times, Brad Payne asks,

00:12:11 ◼   ► our thoughts on when if Swift server development

00:12:14 ◼   ► will ever become a thing?

00:12:16 ◼   ► And I struggle to answer this question,

00:12:20 ◼   ► because I feel like it both feels inevitable,

00:12:23 ◼   ► and it seems like it's never going to happen,

00:12:26 ◼   ► both at the exact same time for me.

00:12:27 ◼   ► It seemed like Swift, if I felt more confident

00:12:32 ◼   ► about Swift as a general purpose,

00:12:38 ◼   ► like this is going to be the language of the future,

00:12:41 ◼   ► then it would seem inevitable

00:12:43 ◼   ► that it will eventually be used for server development.

00:12:46 ◼   ► I think that is just part and parcel

00:12:49 ◼   ► of whatever the most dominant languages

00:12:52 ◼   ► that are being used by the most developers in the world,

00:12:55 ◼   ► because web development is such a significant part of that.

00:12:58 ◼   ► And inevitably, frameworks and things are going to spring up

00:13:01 ◼   ► that let you use those skills in those places.

00:13:05 ◼   ► The thing that is awkward, I think,

00:13:06 ◼   ► is at least at this point,

00:13:08 ◼   ► Swift doesn't quite feel like it has that broad appeal yet.

00:13:13 ◼   ► And in a weird way, Swift sometimes still feels

00:13:17 ◼   ► like it's still in its infancy and still growing up,

00:13:20 ◼   ► and they're still making so many changes to the language

00:13:23 ◼   ► at such a pace and level that it's,

00:13:27 ◼   ► if you aren't an iOS developer,

00:13:29 ◼   ► I could see it being difficult to want to dive into it

00:13:33 ◼   ► and use it as just a general purpose language.

00:13:35 ◼   ► And so I think at some point it might,

00:13:38 ◼   ► but I think it seems very far off at this point.

00:13:40 ◼   ► And I think if Swift Server is your jam, then go for it.

00:13:45 ◼   ► That sounds great.

00:13:47 ◼   ► I'm certainly glad that there are probably people

00:13:49 ◼   ► who are driving that forward.

00:13:51 ◼   ► But I think in general, my advice at this point,

00:13:53 ◼   ► for most iOS developers is,

00:13:55 ◼   ► just like you were saying earlier,

00:13:56 ◼   ► is to use boring tools for your server side

00:14:01 ◼   ► and use things that are kind of old and battle tested

00:14:04 ◼   ► that the benefits you would get from reusing,

00:14:07 ◼   ► you're using the same language on your client and your server

00:14:10 ◼   ► are probably fairly minor because at the end of the day,

00:14:13 ◼   ► it's just gonna end up being JSON being passed back and forth

00:14:16 ◼   ► between these two apps or between these two things.

00:14:18 ◼   ► And once you've gotten through the translation part of that,

00:14:21 ◼   ► what they actually are speaking is only useful

00:14:25 ◼   ► on the server in very specific cases.

00:14:28 ◼   ► If you have some kind of specific business logic

00:14:30 ◼   ► that you want to replicate in both places,

00:14:33 ◼   ► but then you have to start wondering,

00:14:34 ◼   ► do I really want to replicate this in both places

00:14:36 ◼   ► or should this really be maintained in one place and so on?

00:14:40 ◼   ► So I think at some point it seems possible,

00:14:43 ◼   ► but it doesn't seem like for me anyway,

00:14:45 ◼   ► something that is likely in the short term

00:14:47 ◼   ► or something that I'm putting much interest and attention on.

00:14:51 ◼   ► - Yeah, I would love to have Swift on the server

00:14:55 ◼   ► be a big thing that takes off

00:14:57 ◼   ► because I'm not that into the idea

00:15:00 ◼   ► of necessarily sharing a bunch of code

00:15:02 ◼   ► between client and server

00:15:03 ◼   ► because for the reasons you said,

00:15:04 ◼   ► I don't think I'd actually be doing that very much, if ever,

00:15:08 ◼   ► because the needs are so different

00:15:09 ◼   ► and what you're dealing with is so different.

00:15:10 ◼   ► But I would like to only master one language

00:15:15 ◼   ► as my next language for client and server.

00:15:17 ◼   ► Right now, the languages that I actually use in practice

00:15:21 ◼   ► are basically Objective-C, PHP,

00:15:25 ◼   ► and a very small amount of Go for a few server things

00:15:29 ◼   ► that PHP just didn't do that well

00:15:31 ◼   ► and Go just does a better job of that kind of task.

00:15:33 ◼   ► So that's about it.

00:15:35 ◼   ► And I don't like Go that much, it's fine.

00:15:39 ◼   ► I would love for PHP, I mean for Swift,

00:15:42 ◼   ► to replace everything everywhere

00:15:44 ◼   ► because the kind of, just like the style of ProgrammerAM

00:15:47 ◼   ► is I don't learn every single language out there.

00:15:49 ◼   ► I learn a small number,

00:15:50 ◼   ► I try to master them as much as possible,

00:15:52 ◼   ► and I try to be very productive in those

00:15:54 ◼   ► until it's not possible anymore to be productive in those,

00:15:57 ◼   ► like until I'm forced to go do something else

00:15:59 ◼   ► because learning new languages and starting from zero

00:16:03 ◼   ► at my skill level is just not something I find fun.

00:16:06 ◼   ► Although that's very different for every programmer,

00:16:08 ◼   ► so you might be one of those people.

00:16:08 ◼   ► Anyway, so Swift on the server,

00:16:12 ◼   ► it goes against everything we just said

00:16:13 ◼   ► about do things that are old and stable and established.

00:16:18 ◼   ► I don't know who's using Swift on the server

00:16:21 ◼   ► at any kind of scale or for any kind of complex code base.

00:16:24 ◼   ► I have no idea, there might be people out there doing that.

00:16:27 ◼   ► I think it's fairly unlikely

00:16:29 ◼   ► and it's so new right now.

00:16:31 ◼   ► So maybe in five years,

00:16:34 ◼   ► that might be a more established thing to do

00:16:37 ◼   ► and there might be a lot of people doing that.

00:16:38 ◼   ► Maybe there would be great library support and everything.

00:16:40 ◼   ► The thing is, on the server side,

00:16:43 ◼   ► the language matters a little bit,

00:16:44 ◼   ► but what matters a lot in practice also

00:16:46 ◼   ► is just what kind of built-in libraries and functionality

00:16:50 ◼   ► and good third-party libraries are available

00:16:52 ◼   ► to do things that people commonly need to do on web servers.

00:16:55 ◼   ► So that's one of the reasons PHP took off so well

00:16:58 ◼   ► because it had a whole bunch of very common web stuff

00:17:01 ◼   ► just built right into the language

00:17:02 ◼   ► that was super easy to use.

00:17:04 ◼   ► And anything that you'd have to do on a server,

00:17:07 ◼   ► various form processing things, image operations

00:17:11 ◼   ► for processing and generating images,

00:17:14 ◼   ► obviously tons of string processing, some network stuff.

00:17:17 ◼   ► There's all sorts of stuff that you need to do on the server

00:17:19 ◼   ► that you don't always,

00:17:21 ◼   ► that usually aren't built into a language,

00:17:24 ◼   ► that usually have to come

00:17:25 ◼   ► by some kind of third-party library.

00:17:27 ◼   ► And there's a reason why certain languages

00:17:30 ◼   ► take off on the server, and most don't.

00:17:33 ◼   ► Objective-C on the server never really went anywhere,

00:17:35 ◼   ► except I think that's what WebObjects is,

00:17:36 ◼   ► or was it Java?

00:17:37 ◼   ► Anyway, certain languages just make server tasks easier.

00:17:41 ◼   ► Swift, I don't think, is inherently one of those languages.

00:17:44 ◼   ► So for it to become really awesome on the server,

00:17:47 ◼   ► it's gonna have to have a very large library

00:17:50 ◼   ► developed for it that becomes

00:17:53 ◼   ► either an official standard library

00:17:54 ◼   ► for web serving type needs,

00:17:56 ◼   ► or a very, very, very popular third-party one

00:17:59 ◼   ► that effectively becomes the platform,

00:18:01 ◼   ► similar to how Rails kinda did that for Ruby.

00:18:03 ◼   ► Rails is not made by the guy who made Ruby,

00:18:05 ◼   ► but it basically became the de facto platform

00:18:10 ◼   ► for writing web apps using Ruby.

00:18:12 ◼   ► And so we need basically the Rails for Swift.

00:18:15 ◼   ► I have not been following that community at all,

00:18:18 ◼   ► so I don't know if that exists yet,

00:18:20 ◼   ► but it's probably too early in its lifetime and usage

00:18:25 ◼   ► to really have a clear winner there,

00:18:27 ◼   ► even if some appear to be front runners right now.

00:18:30 ◼   ► And when you're developing server apps

00:18:32 ◼   ► that support your iOS app,

00:18:33 ◼   ► and your heart's really in the iOS app,

00:18:35 ◼   ► and you're kinda doing the server apps

00:18:37 ◼   ► kinda the same way you do your taxes,

00:18:39 ◼   ► because you have to,

00:18:40 ◼   ► that's not a great reason to pick Swift for the server.

00:18:44 ◼   ► And I hope someday that it will be a more responsible

00:18:48 ◼   ► and boring and old choice, but we're not there yet.

00:18:51 ◼   ► - Yeah, and I think the reality too is

00:18:53 ◼   ► it's going to have to be better than everything else

00:18:56 ◼   ► that it currently exists.

00:18:58 ◼   ► Like, the problem that a new web platform has to overcome

00:19:03 ◼   ► gets harder and harder over time,

00:19:06 ◼   ► because there are so many very reliable,

00:19:09 ◼   ► well-trusted established players.

00:19:12 ◼   ► And so one day it may happen,

00:19:14 ◼   ► but it's going to have to be incredibly compelling

00:19:16 ◼   ► in the way that Rails was compelling to learn Ruby,

00:19:20 ◼   ► because it was a totally,

00:19:22 ◼   ► at the time it was a totally different

00:19:24 ◼   ► sort of paradigm for web development

00:19:26 ◼   ► that is superficially super powerful

00:19:29 ◼   ► and straightforward and simple.

00:19:31 ◼   ► And so that's what allowed it to overcome it.

00:19:33 ◼   ► And so I think something similarly would have to come along

00:19:37 ◼   ► that made it just that much more compelling.

00:19:39 ◼   ► - Yeah, and also with server-side languages,

00:19:41 ◼   ► the language is only one,

00:19:43 ◼   ► as I was saying earlier,

00:19:43 ◼   ► the language is only kind of one part

00:19:44 ◼   ► of why you want to use it.

00:19:45 ◼   ► There's all these built-in libraries and everything too.

00:19:48 ◼   ► There's also a third part of that,

00:19:49 ◼   ► which is how easy it is to administer and run servers

00:19:53 ◼   ► that use this language.

00:19:54 ◼   ► So that includes things like how easy is it to install it

00:19:56 ◼   ► from the most common Linux package managers?

00:20:00 ◼   ► Do you have to build it from source?

00:20:01 ◼   ► Do you have to update it frequently?

00:20:03 ◼   ► Can you use just apt-get or yum or something like that

00:20:06 ◼   ► to automatically install it with one line of code

00:20:09 ◼   ► in your config script,

00:20:09 ◼   ► and can you have it updated on a regular basis

00:20:12 ◼   ► and not break things?

00:20:13 ◼   ► Things like that.

00:20:14 ◼   ► And then when you're administering the servers,

00:20:16 ◼   ► are you getting woken up in the middle of the night

00:20:18 ◼   ► with pingdom alerts because the app server process crashed,

00:20:23 ◼   ► or it was leaking memory and it ran out of memory

00:20:26 ◼   ► and the whole server's now down,

00:20:27 ◼   ► or something like that?

00:20:28 ◼   ► Are you dealing with stuff like that on a regular basis?

00:20:31 ◼   ► Why bother doing that when you can use something,

00:20:36 ◼   ► like I use PHP,

00:20:37 ◼   ► and PHP, the server just doesn't crash.

00:20:40 ◼   ► That is never a problem I have,

00:20:44 ◼   ► and it hasn't been for a decade at least.

00:20:46 ◼   ► (laughs)

00:20:47 ◼   ► The web server just doesn't crash.

00:20:50 ◼   ► I have other problems,

00:20:50 ◼   ► things like, oh, there's a huge flood of traffic

00:20:53 ◼   ► and MySQL is starting to back up

00:20:55 ◼   ► and connection's starting to back up,

00:20:56 ◼   ► like that could be a problem.

00:20:57 ◼   ► But the actual server processes for the server language,

00:21:02 ◼   ► like if you choose an old boring thing,

00:21:04 ◼   ► there's problems you don't have to deal with.

00:21:07 ◼   ► Where any of the newer things, just by being newer,

00:21:10 ◼   ► you're gonna probably be dealing with things

00:21:12 ◼   ► like memory leaks and occasional crashes,

00:21:14 ◼   ► and that just adds to the burden of running your own servers.

00:21:18 ◼   ► A lot of the automatic, more abstract cloud platforms,

00:21:24 ◼   ► like various app engines and stuff like that,

00:21:27 ◼   ► the reason people go to those a lot of the times

00:21:30 ◼   ► is that they don't theoretically have to deal

00:21:32 ◼   ► with annoying little problems like that,

00:21:35 ◼   ► but that isn't the only option.

00:21:37 ◼   ► And going to a platform like that has a lot of downsides.

00:21:40 ◼   ► Number one, they're usually proprietary,

00:21:42 ◼   ► and so you can't move off of them if they start to suck.

00:21:44 ◼   ► And number two, they're usually way more expensive

00:21:46 ◼   ► for the computing resources that you're getting.

00:21:48 ◼   ► So if you can do something like Linode,

00:21:50 ◼   ► and I'm saying this because I do,

00:21:51 ◼   ► not because they sponsored this episode,

00:21:52 ◼   ► if you do something like Linode,

00:21:54 ◼   ► where it's just a Linux VPS, and if Linode starts to suck,

00:21:57 ◼   ► you can move to any other Linux VPS service.

00:22:00 ◼   ► It's fine.

00:22:01 ◼   ► You're doing something standard that you can put anywhere,

00:22:04 ◼   ► or you can move to dedicated servers,

00:22:05 ◼   ► or you can move to a Raspberry Pi in your basement.

00:22:07 ◼   ► It all works the same way

00:22:08 ◼   ► when you're on a regular Linux server.

00:22:11 ◼   ► And so anything you can do

00:22:13 ◼   ► when thinking about running servers for your business,

00:22:15 ◼   ► anything you can do to make it more likely

00:22:18 ◼   ► that you will stick with the regular Linux server path

00:22:22 ◼   ► instead of going to something weird and custom

00:22:23 ◼   ► that's gonna be more expensive and proprietary,

00:22:25 ◼   ► I think will serve you well long term.

00:22:27 ◼   ► So one little quick thing I wanted to hit

00:22:31 ◼   ► from Jacob Tomlinson, who asked about server stuff,

00:22:34 ◼   ► and asked, "How much server code

00:22:35 ◼   ► "do you write compared with app code?"

00:22:39 ◼   ► And this I thought was an interesting question to answer,

00:22:41 ◼   ► because just to give some idea

00:22:43 ◼   ► for people who were starting out, what to expect.

00:22:46 ◼   ► And the answer is, between app code and server code,

00:22:49 ◼   ► the answer really is it depends a whole lot on the app.

00:22:53 ◼   ► Instapaper really didn't have that much server-side code.

00:22:58 ◼   ► Overcast has more, but still not a ton.

00:23:02 ◼   ► Something like Tumblr had a ton,

00:23:04 ◼   ► because that was a way more complex web app

00:23:06 ◼   ► that happened to also have iOS APIs.

00:23:09 ◼   ► But if what you're mainly making,

00:23:11 ◼   ► like in the case of Overcast and Instapaper,

00:23:12 ◼   ► if what you're mainly making is an iOS app

00:23:16 ◼   ► that has a web service to do some auxiliary tasks for it,

00:23:21 ◼   ► the iOS app is probably gonna be way more code

00:23:25 ◼   ► than the web app.

00:23:26 ◼   ► But again, it depends so much on what you're doing.

00:23:29 ◼   ► I would say if your web app is that much code,

00:23:32 ◼   ► you're probably not listening to this show.

00:23:35 ◼   ► - Yeah, and I think too, something that I have found

00:23:39 ◼   ► really useful in my career of independent development

00:23:43 ◼   ► is the understanding that the more I can make

00:23:47 ◼   ► my client do, the more logic I can push down

00:23:51 ◼   ► into the client, the easier things like scaling

00:23:55 ◼   ► and navigating, the problems that you will hope to have

00:23:59 ◼   ► of having lots of users get, because you have a,

00:24:04 ◼   ► modern iPhone is incredibly capable

00:24:07 ◼   ► and can do a tremendous number of things.

00:24:09 ◼   ► And there is something that is just so nice about,

00:24:13 ◼   ► if you try as much as you can to not have huge reliance

00:24:18 ◼   ► on your web server, on your server,

00:24:20 ◼   ► and instead push that logic down into your client.

00:24:22 ◼   ► Say you get featured in the App Store,

00:24:24 ◼   ► and one day you have 10,000, sorry, sorry, sorry,

00:24:27 ◼   ► if you have 10 times more downloads than you normally do.

00:24:30 ◼   ► If you're very server-based, your best day

00:24:35 ◼   ► just might have become your worst day,

00:24:36 ◼   ► because now all of a sudden you have to make sure

00:24:39 ◼   ► that you're scaling all of your infrastructure

00:24:42 ◼   ► to manage that, and it may be a very bursty thing,

00:24:44 ◼   ► it may not be long-lived, and it's just becoming

00:24:47 ◼   ► really complicated, whereas if, for most of my applications,

00:24:51 ◼   ► they have no interaction with the server whatsoever,

00:24:54 ◼   ► and if they, the ones that do, they try to try

00:24:56 ◼   ► and minimize that as much as I can,

00:24:58 ◼   ► just because then I don't have to worry

00:25:02 ◼   ► about those problems, and I think in general,

00:25:04 ◼   ► from a broad business-y kind of perspective,

00:25:08 ◼   ► I find that to work well, that my,

00:25:11 ◼   ► if my user base scales, my costs don't scale up,

00:25:15 ◼   ► they are exactly the same no matter what,

00:25:18 ◼   ► I don't have, I don't need as much of the kind of

00:25:22 ◼   ► infrastructure-y kind of management,

00:25:24 ◼   ► in terms of theoretically, if your servers

00:25:29 ◼   ► are the absolute essential part of your business,

00:25:32 ◼   ► you're probably gonna wanna have not just you

00:25:34 ◼   ► being the person who's getting alerts when they go down,

00:25:36 ◼   ► you wanna have coverage for when you're out of town,

00:25:39 ◼   ► or when you're on vacation, and things start

00:25:41 ◼   ► to get much more complicated if that's where your goal is,

00:25:43 ◼   ► whereas if you can keep a lot of your code,

00:25:46 ◼   ► and your logic, and the value that you're providing

00:25:49 ◼   ► to your customer in your app, then you don't have

00:25:52 ◼   ► to worry about nearly as many of those problems,

00:25:54 ◼   ► and you can just take advantage of the fact

00:25:56 ◼   ► that everyone who downloads your app is running

00:25:58 ◼   ► a computer that is perfectly capable of doing

00:26:00 ◼   ► a tremendous amount of computation for them,

00:26:02 ◼   ► and so it's like, it scales so nicely in that way,

00:26:06 ◼   ► so that I would always kind of push,

00:26:08 ◼   ► whenever I have an idea, it's like, oh man,

00:26:10 ◼   ► that's gonna take a lot of, it could be very server-dependent

00:26:14 ◼   ► I become very cautious about if I should really

00:26:17 ◼   ► go down there, or if it's like, is there a way

00:26:18 ◼   ► that I can just do this client side?

00:26:21 ◼   ► And maybe it's like, I don't know if that's better or worse

00:26:24 ◼   ► for applications at large, but I can say for being

00:26:28 ◼   ► a one-man developer team, that is fantastic.

00:26:32 ◼   ► I can put all of my resources in one place,

00:26:34 ◼   ► there's less area for bugs, there's less maintenance

00:26:37 ◼   ► overhead that I have to manage, and it just works

00:26:40 ◼   ► really well to de-emphasize that down.

00:26:43 ◼   ► That you servers, they're a powerful thing

00:26:44 ◼   ► and allow applications that you couldn't build otherwise,

00:26:48 ◼   ► but the less I can do there, the better,

00:26:50 ◼   ► and trying to make my web services,

00:26:53 ◼   ► moving largely, they're just like, sort of dumb repositories

00:26:56 ◼   ► for data that just gets shuffled back and forth.

00:26:59 ◼   ► They're all, the actual logic and processing and things

00:27:01 ◼   ► is happening client side, and that makes

00:27:03 ◼   ► just everything better, I think.

00:27:06 ◼   ► - Although I will give one counterargument here,

00:27:08 ◼   ► is that if you are currently using,

00:27:11 ◼   ► if you're currently avoiding a feature,

00:27:13 ◼   ► or using some kind of external service to do things

00:27:17 ◼   ► that are very, very easy to do server side,

00:27:19 ◼   ► but you just don't wanna set up a server,

00:27:20 ◼   ► 'cause either you don't wanna manage it,

00:27:22 ◼   ► or you are inexperienced in that area,

00:27:24 ◼   ► and you don't know what you're doing,

00:27:25 ◼   ► and you're maybe a little intimidated by it,

00:27:26 ◼   ► or scared to do it, I would say two things.

00:27:28 ◼   ► Number one, running servers is easier

00:27:31 ◼   ► than you think it is.

00:27:32 ◼   ► It's like, if you can write an iOS app,

00:27:33 ◼   ► you can run servers, and it's really,

00:27:36 ◼   ► if you do it conservatively, and just use basic Linux stuff

00:27:39 ◼   ► and package stuff, it's super easy.

00:27:42 ◼   ► And B, things like setting push notifications.

00:27:46 ◼   ► There are certain things that apps need a lot,

00:27:49 ◼   ► or verifying in-app purchases, or verifying subscriptions,

00:27:52 ◼   ► stuff like that, very common things.

00:27:54 ◼   ► There are a million services out there

00:27:56 ◼   ► that are happy to take large amounts of your money

00:28:00 ◼   ► to take these problems away from you,

00:28:02 ◼   ► so you don't have to worry,

00:28:03 ◼   ► because they make it sound really hard.

00:28:05 ◼   ► Spoiler, it's not really hard to run services,

00:28:08 ◼   ► to do things like verify in-app purchases,

00:28:10 ◼   ► or send push notifications.

00:28:12 ◼   ► Those are extremely easy things to do.

00:28:14 ◼   ► You can do that on that $5 monthly node server.

00:28:17 ◼   ► And so, don't jump immediately to going

00:28:20 ◼   ► to other crazy enterprise-y services

00:28:22 ◼   ► when you don't have to.

00:28:23 ◼   ► Try it on the server side first.

00:28:25 ◼   ► It really isn't that big of a deal to do stuff like that,

00:28:27 ◼   ► and a lot of apps need things like that,

00:28:29 ◼   ► and your app can be way more powerful

00:28:33 ◼   ► with a little bit of server-side support.

00:28:35 ◼   ► So I encourage you, if you're intimidated,

00:28:37 ◼   ► or if you haven't done it yet,

00:28:39 ◼   ► learn the basics of it.

00:28:40 ◼   ► You'll be surprised how far you can get.

00:28:42 ◼   ► - Yeah, and I think the best advice for,

00:28:44 ◼   ► like the theme, I think, in all of our discussions

00:28:46 ◼   ► is just keep it as simple as you can,

00:28:48 ◼   ► and simple, thoughtful code will go a long way

00:28:51 ◼   ► with any of this stuff.

00:28:52 ◼   ► And that's, you know, don't be scared of it.

00:28:55 ◼   ► Just keep it simple, and you'll be fine.

00:28:57 ◼   ► - And keep your stack boring.

00:28:59 ◼   ► Thanks for listening, everybody,

00:29:00 ◼   ► and we'll talk to you next week.

00:29:02 ◼   ► - Bye.

00:29:03 ◼   ► [ Silence ]