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: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: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.