[Script Info] Title: [Events] Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text Dialogue: 0,0:00:24.90,0:00:25.41,Default,,0000,0000,0000,, Dialogue: 0,0:00:25.41,0:00:26.65,Default,,0000,0000,0000,,Chad: Yes, hello, thank you. Dialogue: 0,0:00:26.65,0:00:29.14,Default,,0000,0000,0000,,Audience member: Hello! Dialogue: 0,0:00:29.14,0:00:30.81,Default,,0000,0000,0000,,Chad: Hello! Dialogue: 0,0:00:30.81,0:00:33.63,Default,,0000,0000,0000,,I am Chad, as he said. Dialogue: 0,0:00:33.63,0:00:35.30,Default,,0000,0000,0000,,He said I need no introduction Dialogue: 0,0:00:35.30,0:00:37.89,Default,,0000,0000,0000,,so I won't introduce myself any further. Dialogue: 0,0:00:37.89,0:00:44.89,Default,,0000,0000,0000,,I may be the biggest non-Indian fan of India Dialogue: 0,0:01:01.69,0:01:06.40,Default,,0000,0000,0000,,[Hindi speech] Dialogue: 0,0:01:06.40,0:01:13.40,Default,,0000,0000,0000,, Dialogue: 0,0:01:15.39,0:01:17.83,Default,,0000,0000,0000,,I'll now switch back, sorry. Dialogue: 0,0:01:17.83,0:01:20.01,Default,,0000,0000,0000,,If you don't understand Hindi, I said nothing\Nof value Dialogue: 0,0:01:20.01,0:01:22.03,Default,,0000,0000,0000,,and it was all wrong. Dialogue: 0,0:01:22.03,0:01:23.55,Default,,0000,0000,0000,,But I was saying that my Hindi is bad Dialogue: 0,0:01:23.55,0:01:26.00,Default,,0000,0000,0000,,and it's because now I'm learning German Dialogue: 0,0:01:26.00,0:01:28.11,Default,,0000,0000,0000,,so I mixed them together, but I know not everyone Dialogue: 0,0:01:28.11,0:01:29.44,Default,,0000,0000,0000,,speaks Hindi here. Dialogue: 0,0:01:29.44,0:01:32.48,Default,,0000,0000,0000,,I just had to show off, you know Dialogue: 0,0:01:32.48,0:01:37.11,Default,,0000,0000,0000,,So, I am currently working on 6WunderKinder, Dialogue: 0,0:01:37.11,0:01:40.37,Default,,0000,0000,0000,,and I'm working on a product called Wunderlist. Dialogue: 0,0:01:40.37,0:01:42.06,Default,,0000,0000,0000,,It is a productivity application. Dialogue: 0,0:01:42.06,0:01:45.86,Default,,0000,0000,0000,,It runs on every client you can think of. Dialogue: 0,0:01:45.86,0:01:47.62,Default,,0000,0000,0000,,We have native clients, we have a back-end, Dialogue: 0,0:01:47.62,0:01:49.69,Default,,0000,0000,0000,,we have millions of active users, Dialogue: 0,0:01:49.69,0:01:51.85,Default,,0000,0000,0000,,and I'm telling you this not so that you'll\Ngo download it - Dialogue: 0,0:01:51.85,0:01:53.39,Default,,0000,0000,0000,,you can do that too - Dialogue: 0,0:01:53.39,0:01:56.96,Default,,0000,0000,0000,,but I want to tell you about the challenges\Nthat I have Dialogue: 0,0:01:56.96,0:02:00.71,Default,,0000,0000,0000,,and the way I'm starting to think about system's\Narchitecture and design. Dialogue: 0,0:02:00.71,0:02:03.13,Default,,0000,0000,0000,,That's what I'm gonna talk about today Dialogue: 0,0:02:03.13,0:02:05.69,Default,,0000,0000,0000,,I'm going to show you some things that are\Nreal Dialogue: 0,0:02:05.69,0:02:07.16,Default,,0000,0000,0000,,and that we're really doing. Dialogue: 0,0:02:07.16,0:02:09.43,Default,,0000,0000,0000,,I'm going to show you some things that are Dialogue: 0,0:02:09.43,0:02:12.67,Default,,0000,0000,0000,,just a fantasy that maybe don't make any sense\Nat all. Dialogue: 0,0:02:12.67,0:02:13.98,Default,,0000,0000,0000,,But hopefully I'll get you think about Dialogue: 0,0:02:13.98,0:02:15.54,Default,,0000,0000,0000,,how we think about system architecture Dialogue: 0,0:02:15.54,0:02:18.37,Default,,0000,0000,0000,,and how we build things that can last for\Na long time. Dialogue: 0,0:02:18.37,0:02:20.87,Default,,0000,0000,0000,,So the first thing that I want to mention: Dialogue: 0,0:02:20.87,0:02:23.34,Default,,0000,0000,0000,,this is a graph from the Standish Chaos report Dialogue: 0,0:02:23.34,0:02:25.43,Default,,0000,0000,0000,,and I've taken the years out Dialogue: 0,0:02:25.43,0:02:27.31,Default,,0000,0000,0000,,and I've taken some of the raw data out Dialogue: 0,0:02:27.31,0:02:28.72,Default,,0000,0000,0000,,because it doesn't matter. Dialogue: 0,0:02:28.72,0:02:30.53,Default,,0000,0000,0000,,If you look at these, this graph, Dialogue: 0,0:02:30.53,0:02:33.38,Default,,0000,0000,0000,,each one of these bars is a year, Dialogue: 0,0:02:33.38,0:02:38.16,Default,,0000,0000,0000,,and each bar represents successful projects\Nin green - Dialogue: 0,0:02:38.16,0:02:40.08,Default,,0000,0000,0000,,software projects. Dialogue: 0,0:02:40.08,0:02:42.41,Default,,0000,0000,0000,,Challenged projects are in silver or white\Nin the middle Dialogue: 0,0:02:42.41,0:02:44.25,Default,,0000,0000,0000,,and then failed ones are in red. Dialogue: 0,0:02:44.25,0:02:47.34,Default,,0000,0000,0000,,But challenged means significantly over time\Nor budget Dialogue: 0,0:02:47.34,0:02:49.35,Default,,0000,0000,0000,,which to me means failed too. Dialogue: 0,0:02:49.35,0:02:51.43,Default,,0000,0000,0000,,So basically we're terrible, Dialogue: 0,0:02:51.43,0:02:54.28,Default,,0000,0000,0000,,all of us here, we're terrible. Dialogue: 0,0:02:54.28,0:02:57.06,Default,,0000,0000,0000,,We call ourselves engineers but it's a disgrace. Dialogue: 0,0:02:57.06,0:03:00.84,Default,,0000,0000,0000,,We very rarely actually launch things that\Nwork. Dialogue: 0,0:03:00.84,0:03:01.39,Default,,0000,0000,0000,,Kind of sad, Dialogue: 0,0:03:01.39,0:03:03.83,Default,,0000,0000,0000,,and I am here to bring you down. Dialogue: 0,0:03:03.83,0:03:07.17,Default,,0000,0000,0000,,Then once you launch software, anecdotal-y, Dialogue: 0,0:03:07.17,0:03:12.36,Default,,0000,0000,0000,,and you probably would see this in your own\Nwork lives, too, Dialogue: 0,0:03:12.36,0:03:16.23,Default,,0000,0000,0000,,anecdotal-y, software gets killed after about\Nfive years - Dialogue: 0,0:03:16.23,0:03:17.65,Default,,0000,0000,0000,,business software. Dialogue: 0,0:03:17.65,0:03:19.95,Default,,0000,0000,0000,,So you barely ever get to launch it, because, Dialogue: 0,0:03:19.95,0:03:23.32,Default,,0000,0000,0000,,or at least successfully, in a way that you're\Nproud of, Dialogue: 0,0:03:23.32,0:03:24.65,Default,,0000,0000,0000,,and then in about five years Dialogue: 0,0:03:24.65,0:03:27.74,Default,,0000,0000,0000,,you end up in that situation where you're\Ndoing a big rewrite Dialogue: 0,0:03:27.74,0:03:29.52,Default,,0000,0000,0000,,and throwing everything away and replacing\Nit. Dialogue: 0,0:03:29.52,0:03:32.52,Default,,0000,0000,0000,,You know there's always that project to get\Nrid of the junk, Dialogue: 0,0:03:32.52,0:03:35.57,Default,,0000,0000,0000,,old Java code or whatever that you wrote five\Nyears ago, Dialogue: 0,0:03:35.57,0:03:37.18,Default,,0000,0000,0000,,replace it with Ruby now, Dialogue: 0,0:03:37.18,0:03:39.91,Default,,0000,0000,0000,,five years from now you'll be replacing your\Nold junk Ruby code Dialogue: 0,0:03:39.91,0:03:46.18,Default,,0000,0000,0000,,that didn't work with something else. Dialogue: 0,0:03:46.18,0:03:49.38,Default,,0000,0000,0000,,We create this thing, probably all of you\Nknow the term legacy software - Dialogue: 0,0:03:49.38,0:03:53.34,Default,,0000,0000,0000,,Right, am I right? You know what legacy software\Nis, Dialogue: 0,0:03:53.34,0:03:56.14,Default,,0000,0000,0000,,and you probably think of it as a negative\Nthing. Dialogue: 0,0:03:56.14,0:03:58.12,Default,,0000,0000,0000,,You think of it as that ugly code that doesn't\Nwork, Dialogue: 0,0:03:58.12,0:04:02.54,Default,,0000,0000,0000,,that's brittle, that you can't change, that\Nyou're all afraid of. Dialogue: 0,0:04:02.54,0:04:07.15,Default,,0000,0000,0000,,But there's actually also a positive connotation\Nof the word legacy: Dialogue: 0,0:04:07.15,0:04:14.14,Default,,0000,0000,0000,,it's leaving behind something that future\Ngenerations can benefit from. Dialogue: 0,0:04:14.14,0:04:17.37,Default,,0000,0000,0000,,But if we're rarely ever launching successful\Nprojects Dialogue: 0,0:04:17.37,0:04:20.89,Default,,0000,0000,0000,,and then the ones we do launch tend to die\Nwithin five years Dialogue: 0,0:04:20.89,0:04:24.60,Default,,0000,0000,0000,,none of us are actually creating a legacy\Nin our work. Dialogue: 0,0:04:24.60,0:04:27.43,Default,,0000,0000,0000,,We're just creating stuff that gets thrown\Naway. Dialogue: 0,0:04:27.43,0:04:29.40,Default,,0000,0000,0000,,Kind of sad. Dialogue: 0,0:04:29.40,0:04:32.24,Default,,0000,0000,0000,,So we create this stuff that's a legacy software. Dialogue: 0,0:04:32.24,0:04:35.06,Default,,0000,0000,0000,,It's hard to change, that's why it ends up\Ngetting thrown away Dialogue: 0,0:04:35.06,0:04:37.37,Default,,0000,0000,0000,,right, that's, if the software worked Dialogue: 0,0:04:37.37,0:04:40.03,Default,,0000,0000,0000,,and you could keep changing it to meet the\Nneeds of the business Dialogue: 0,0:04:40.03,0:04:43.98,Default,,0000,0000,0000,,you wouldn't need to do a big rewrite and\Nthrow it away. Dialogue: 0,0:04:43.98,0:04:47.84,Default,,0000,0000,0000,,We create these huge tightly-coupled systems, Dialogue: 0,0:04:47.84,0:04:49.37,Default,,0000,0000,0000,,and I don't just mean one application, Dialogue: 0,0:04:49.37,0:04:51.43,Default,,0000,0000,0000,,but like many applications are all tightly\Ncoupled. Dialogue: 0,0:04:51.43,0:04:55.90,Default,,0000,0000,0000,,You've got this thing over here talking to\Nthe database of this system over here Dialogue: 0,0:04:55.90,0:04:59.36,Default,,0000,0000,0000,,so if you change the columns to update the\Nview of a webpage Dialogue: 0,0:04:59.36,0:05:02.71,Default,,0000,0000,0000,,you ruin your billing system, that kind of\Nthing Dialogue: 0,0:05:02.71,0:05:06.27,Default,,0000,0000,0000,,this is what makes it so hard to change Dialogue: 0,0:05:06.27,0:05:09.97,Default,,0000,0000,0000,,and the sad thing about this is the way we\Nwork Dialogue: 0,0:05:09.97,0:05:13.50,Default,,0000,0000,0000,,the way we develop software, this is the default\Nsetting Dialogue: 0,0:05:13.50,0:05:18.46,Default,,0000,0000,0000,,and, what I mean is, if we were robots churning\Nout software Dialogue: 0,0:05:18.46,0:05:20.82,Default,,0000,0000,0000,,and we had a preferences panel Dialogue: 0,0:05:20.82,0:05:25.08,Default,,0000,0000,0000,,the default preferences would lead to us creating\Nterrible software that gets thrown away in Dialogue: 0,0:05:25.08,0:05:25.70,Default,,0000,0000,0000,,five years Dialogue: 0,0:05:25.70,0:05:27.21,Default,,0000,0000,0000,,that's just how we all work Dialogue: 0,0:05:27.21,0:05:30.18,Default,,0000,0000,0000,,as human beings when we sit down to write\Ncode Dialogue: 0,0:05:30.18,0:05:35.43,Default,,0000,0000,0000,,our default instincts lead to us to create\Nsystems that are tightly coupled Dialogue: 0,0:05:35.43,0:05:41.66,Default,,0000,0000,0000,,and hard to change and ultimately get thrown\Naway and can't scale Dialogue: 0,0:05:41.66,0:05:46.06,Default,,0000,0000,0000,,we create, we try doing tests, we try doing\NTDD Dialogue: 0,0:05:46.06,0:05:51.33,Default,,0000,0000,0000,,but we create test suites that take forty-five\Nminutes to run Dialogue: 0,0:05:51.33,0:05:52.72,Default,,0000,0000,0000,,every team has had to deal with this I'm sure Dialogue: 0,0:05:52.72,0:05:55.99,Default,,0000,0000,0000,,if you've written any kind of meaningful application Dialogue: 0,0:05:55.99,0:05:57.97,Default,,0000,0000,0000,,and it gets to where you have like a project Dialogue: 0,0:05:57.97,0:05:59.85,Default,,0000,0000,0000,,to speed up the test suite Dialogue: 0,0:05:59.85,0:06:02.95,Default,,0000,0000,0000,,like you start focusing your company's resources Dialogue: 0,0:06:02.95,0:06:04.95,Default,,0000,0000,0000,,on making the test suite faster Dialogue: 0,0:06:04.95,0:06:08.69,Default,,0000,0000,0000,,or making it like only fail ninety percent\Nof the time Dialogue: 0,0:06:08.69,0:06:10.95,Default,,0000,0000,0000,,and then you say well if it only fails ninety\Npercent that's OK Dialogue: 0,0:06:10.95,0:06:14.55,Default,,0000,0000,0000,,right, and right now it's taking forty-five\Nminutes Dialogue: 0,0:06:14.55,0:06:18.18,Default,,0000,0000,0000,,we want to get it to where it only takes ten\Nminutes to run Dialogue: 0,0:06:18.18,0:06:24.48,Default,,0000,0000,0000,,so the test suite ends up being a liability\Ninstead of a benefit Dialogue: 0,0:06:24.48,0:06:25.72,Default,,0000,0000,0000,,because of the way you do it Dialogue: 0,0:06:25.72,0:06:29.32,Default,,0000,0000,0000,,because you have this architect where everything\Nis so coupled Dialogue: 0,0:06:29.32,0:06:34.94,Default,,0000,0000,0000,,you can't change anything without spending\Nhours working on the stupid test suite Dialogue: 0,0:06:34.94,0:06:38.42,Default,,0000,0000,0000,,and your terrified to deploy Dialogue: 0,0:06:38.42,0:06:42.96,Default,,0000,0000,0000,,I know like the last big Java project I was\Nworking on Dialogue: 0,0:06:42.96,0:06:45.82,Default,,0000,0000,0000,,it would take, once a week we did a deploy Dialogue: 0,0:06:45.82,0:06:50.14,Default,,0000,0000,0000,,it would take fifteen people all night to\Ndeploy the thing Dialogue: 0,0:06:50.14,0:06:52.46,Default,,0000,0000,0000,,and usually it was like copying class files\Naround Dialogue: 0,0:06:52.46,0:06:54.43,Default,,0000,0000,0000,,and restarting servers Dialogue: 0,0:06:54.43,0:06:57.12,Default,,0000,0000,0000,,it's much better today but it's still terrifying Dialogue: 0,0:06:57.12,0:06:59.34,Default,,0000,0000,0000,,you deploy code, you change it in production Dialogue: 0,0:06:59.34,0:07:01.26,Default,,0000,0000,0000,,you're not sure what might break Dialogue: 0,0:07:01.26,0:07:03.72,Default,,0000,0000,0000,,cause it's really hard to test these big integrated\Nthings together Dialogue: 0,0:07:03.72,0:07:08.65,Default,,0000,0000,0000,,and actually upgrading the technology component\Nis terrifying Dialogue: 0,0:07:08.65,0:07:13.29,Default,,0000,0000,0000,,so, how many of you have been doing Rails\Nfor more than three years? Dialogue: 0,0:07:13.29,0:07:18.40,Default,,0000,0000,0000,,do you have, like a Rails 2 app in production,\Nanyone? Yeah? Dialogue: 0,0:07:18.40,0:07:21.71,Default,,0000,0000,0000,,that's a lot of people, wow, that's terrifying Dialogue: 0,0:07:21.71,0:07:26.13,Default,,0000,0000,0000,,and I've been in situations, recently, where\Nwe had Rails 2 apps in production Dialogue: 0,0:07:26.13,0:07:29.56,Default,,0000,0000,0000,,security patches are coming out, we were applying\Nour own versions Dialogue: 0,0:07:29.56,0:07:30.88,Default,,0000,0000,0000,,of those security patches Dialogue: 0,0:07:30.88,0:07:32.44,Default,,0000,0000,0000,,because we were afraid to upgrade Rails Dialogue: 0,0:07:32.44,0:07:35.06,Default,,0000,0000,0000,,we would rather hack it than upgrade the thing Dialogue: 0,0:07:35.06,0:07:38.32,Default,,0000,0000,0000,,because you just don't know what's gonna happen Dialogue: 0,0:07:38.32,0:07:42.49,Default,,0000,0000,0000,,and then you end up, as you're re-implementing\Nall this stuff yourself Dialogue: 0,0:07:42.49,0:07:44.82,Default,,0000,0000,0000,,you end up burning yourself out, wasting your\Ntime Dialogue: 0,0:07:44.82,0:07:47.99,Default,,0000,0000,0000,,because you're hacking on stupid Rails 2 Dialogue: 0,0:07:47.99,0:07:50.14,Default,,0000,0000,0000,,or some old struts version Dialogue: 0,0:07:50.14,0:07:52.57,Default,,0000,0000,0000,,when you should be just taking advantage of\Nthe new patches Dialogue: 0,0:07:52.57,0:07:54.64,Default,,0000,0000,0000,,but you can't because you're afraid to upgrade\Nthe software Dialogue: 0,0:07:54.64,0:07:56.24,Default,,0000,0000,0000,,because you don't know what's going to happen Dialogue: 0,0:07:56.24,0:08:02.85,Default,,0000,0000,0000,,because the system is too big and too scary Dialogue: 0,0:08:02.85,0:08:04.95,Default,,0000,0000,0000,,then, and this is really bad, I think this\Nis something Dialogue: 0,0:08:04.95,0:08:07.01,Default,,0000,0000,0000,,Ruby messes up for all of us Dialogue: 0,0:08:07.01,0:08:11.11,Default,,0000,0000,0000,,I say this as someone who's been using Ruby\Nfor thirteen years now Dialogue: 0,0:08:11.11,0:08:12.74,Default,,0000,0000,0000,,happily Dialogue: 0,0:08:12.74,0:08:15.52,Default,,0000,0000,0000,,we create these mountains of abstractions Dialogue: 0,0:08:15.52,0:08:17.67,Default,,0000,0000,0000,,and the logic ends up being buried inside\Nthem Dialogue: 0,0:08:17.67,0:08:22.86,Default,,0000,0000,0000,,I mean in Java it was like static, or, you\Nknow, factories Dialogue: 0,0:08:22.86,0:08:25.09,Default,,0000,0000,0000,,and design pattern soup Dialogue: 0,0:08:25.09,0:08:27.49,Default,,0000,0000,0000,,in Ruby its modules and mixins and you know Dialogue: 0,0:08:27.49,0:08:31.05,Default,,0000,0000,0000,,we have all these crazy ways of hiding what's\Nactually happening from us Dialogue: 0,0:08:31.05,0:08:33.07,Default,,0000,0000,0000,,but when you go look at the code Dialogue: 0,0:08:33.07,0:08:34.36,Default,,0000,0000,0000,,it's completely opaque Dialogue: 0,0:08:34.36,0:08:37.09,Default,,0000,0000,0000,,you have no idea where the stuff actually\Ngets done Dialogue: 0,0:08:37.09,0:08:40.82,Default,,0000,0000,0000,,because it's in some magic library somewhere Dialogue: 0,0:08:40.82,0:08:45.05,Default,,0000,0000,0000,,and we do all that because we're trying to\Nsave ourselves from the complexity of these Dialogue: 0,0:08:45.05,0:08:47.45,Default,,0000,0000,0000,,big nasty systems Dialogue: 0,0:08:47.45,0:08:50.76,Default,,0000,0000,0000,,but like if you look at the rest of the world Dialogue: 0,0:08:50.76,0:08:53.81,Default,,0000,0000,0000,,this is a software specific problem Dialogue: 0,0:08:53.81,0:08:58.76,Default,,0000,0000,0000,,these cars are old, they're older than any\Nsoftware that you would ever run Dialogue: 0,0:08:58.76,0:09:00.34,Default,,0000,0000,0000,,and they're still driving down the street Dialogue: 0,0:09:00.34,0:09:03.46,Default,,0000,0000,0000,,they're older than software itself, right Dialogue: 0,0:09:03.46,0:09:06.37,Default,,0000,0000,0000,,but these things still function, they still\Nwork Dialogue: 0,0:09:06.37,0:09:08.97,Default,,0000,0000,0000,,how? why? why do they work? Dialogue: 0,0:09:08.97,0:09:11.34,Default,,0000,0000,0000,,bodies! my body should not work Dialogue: 0,0:09:11.34,0:09:12.54,Default,,0000,0000,0000,,I have abused it Dialogue: 0,0:09:12.54,0:09:13.87,Default,,0000,0000,0000,,I should not be standing here today Dialogue: 0,0:09:13.87,0:09:16.66,Default,,0000,0000,0000,,I shouldn't have been able to come from Berlin\Nhere Dialogue: 0,0:09:16.66,0:09:18.62,Default,,0000,0000,0000,,without dying somehow by being in the air Dialogue: 0,0:09:18.62,0:09:23.66,Default,,0000,0000,0000,,you know, by the air pressure changes Dialogue: 0,0:09:23.66,0:09:25.95,Default,,0000,0000,0000,,but our bodies somehow can survive even when Dialogue: 0,0:09:25.95,0:09:30.73,Default,,0000,0000,0000,,we don't take care of them Dialogue: 0,0:09:30.73,0:09:35.29,Default,,0000,0000,0000,,and like it's just the system that works,\Nright Dialogue: 0,0:09:35.29,0:09:37.77,Default,,0000,0000,0000,,so how do our bodies work? Dialogue: 0,0:09:37.77,0:09:39.44,Default,,0000,0000,0000,,how do we stay alive Dialogue: 0,0:09:39.44,0:09:40.93,Default,,0000,0000,0000,,despite this fact Dialogue: 0,0:09:40.93,0:09:42.13,Default,,0000,0000,0000,,even though we haven't done like some Dialogue: 0,0:09:42.13,0:09:45.27,Default,,0000,0000,0000,,great design, we don't have any design patterns Dialogue: 0,0:09:45.27,0:09:49.78,Default,,0000,0000,0000,,like mixed up into our bodies Dialogue: 0,0:09:49.78,0:09:53.98,Default,,0000,0000,0000,,in biology there is a term called homeostasis Dialogue: 0,0:09:53.98,0:09:56.21,Default,,0000,0000,0000,,and I literally don't know what this means Dialogue: 0,0:09:56.21,0:09:57.39,Default,,0000,0000,0000,,other than this definition Dialogue: 0,0:09:57.39,0:09:58.87,Default,,0000,0000,0000,,so you won't learn about this from me Dialogue: 0,0:09:58.87,0:10:01.06,Default,,0000,0000,0000,,there's probably at least one biologist in\Nthe room Dialogue: 0,0:10:01.06,0:10:04.37,Default,,0000,0000,0000,,so you can correct me later Dialogue: 0,0:10:04.37,0:10:07.87,Default,,0000,0000,0000,,but basically the idea of homeostasis is Dialogue: 0,0:10:07.87,0:10:11.43,Default,,0000,0000,0000,,that an organism has all these different components Dialogue: 0,0:10:11.43,0:10:13.89,Default,,0000,0000,0000,,that serve different purposes Dialogue: 0,0:10:13.89,0:10:15.82,Default,,0000,0000,0000,,that regulate it Dialogue: 0,0:10:15.82,0:10:18.26,Default,,0000,0000,0000,,so they're all kind of in balance Dialogue: 0,0:10:18.26,0:10:20.75,Default,,0000,0000,0000,,and they work together to regulate the system Dialogue: 0,0:10:20.75,0:10:23.70,Default,,0000,0000,0000,,if one component, like a liver, does too much Dialogue: 0,0:10:23.70,0:10:24.72,Default,,0000,0000,0000,,or does the wrong thing Dialogue: 0,0:10:24.72,0:10:27.84,Default,,0000,0000,0000,,another component kicks in and fixes it Dialogue: 0,0:10:27.84,0:10:30.16,Default,,0000,0000,0000,,and so our bodies are this well designed system Dialogue: 0,0:10:30.16,0:10:31.96,Default,,0000,0000,0000,,for staying alive Dialogue: 0,0:10:31.96,0:10:34.53,Default,,0000,0000,0000,,because we have almost like autonomous agents Dialogue: 0,0:10:34.53,0:10:38.81,Default,,0000,0000,0000,,internally that take care of the many things\Nthat can and do go wrong Dialogue: 0,0:10:38.81,0:10:41.89,Default,,0000,0000,0000,,on a regular basis Dialogue: 0,0:10:41.89,0:10:43.77,Default,,0000,0000,0000,,so you have, you know, your brain, your liver Dialogue: 0,0:10:43.77,0:10:47.23,Default,,0000,0000,0000,,your liver, of course, metabolizes toxic substances Dialogue: 0,0:10:47.23,0:10:50.40,Default,,0000,0000,0000,,your kidney deals with blood, water level,\Net cetera Dialogue: 0,0:10:50.40,0:10:55.66,Default,,0000,0000,0000,,you know all these things work in concert\Nto make you live Dialogue: 0,0:10:55.66,0:11:01.14,Default,,0000,0000,0000,,the inability to continue to do that is known\Nas homeostatic imbalance Dialogue: 0,0:11:01.14,0:11:04.07,Default,,0000,0000,0000,,so I was saying, homeostasis is balancing Dialogue: 0,0:11:04.07,0:11:07.33,Default,,0000,0000,0000,,not being able to do that is when you're out\Nof balance Dialogue: 0,0:11:07.33,0:11:10.34,Default,,0000,0000,0000,,and that will actually lead to really bad\Nhealth problems Dialogue: 0,0:11:10.34,0:11:16.41,Default,,0000,0000,0000,,or probably death, if you fall into homeostatic\Nimbalance Dialogue: 0,0:11:16.41,0:11:20.42,Default,,0000,0000,0000,,so the good news is you're already dying Dialogue: 0,0:11:20.42,0:11:22.45,Default,,0000,0000,0000,,like we're all dying all the time Dialogue: 0,0:11:22.45,0:11:26.50,Default,,0000,0000,0000,,this is the beautiful thing about death Dialogue: 0,0:11:26.50,0:11:29.11,Default,,0000,0000,0000,,there is, there is an estimate that fifty\Ntrillion cells Dialogue: 0,0:11:29.11,0:11:31.85,Default,,0000,0000,0000,,are in your body, and three million die per\Nsecond Dialogue: 0,0:11:31.85,0:11:35.52,Default,,0000,0000,0000,,it's an estimate because it's actually impossible\Nto count Dialogue: 0,0:11:35.52,0:11:39.52,Default,,0000,0000,0000,,but scientists have figured out somehow that\Nthis is probably the right number Dialogue: 0,0:11:39.52,0:11:42.31,Default,,0000,0000,0000,,so your cells, you've probably heard this\Nall your life Dialogue: 0,0:11:42.31,0:11:45.17,Default,,0000,0000,0000,,like physically, after some amount of time, Dialogue: 0,0:11:45.17,0:11:47.43,Default,,0000,0000,0000,,you aren't the same human being that you were,\Nphysically Dialogue: 0,0:11:47.43,0:11:52.77,Default,,0000,0000,0000,,you know, I don't know, you some period of\Ntime ago Dialogue: 0,0:11:52.77,0:11:55.50,Default,,0000,0000,0000,,you're literally not the same organism anymore Dialogue: 0,0:11:55.50,0:11:58.42,Default,,0000,0000,0000,,but you're the same system Dialogue: 0,0:11:58.42,0:12:01.47,Default,,0000,0000,0000,,kind of interesting, isn't it Dialogue: 0,0:12:01.47,0:12:06.74,Default,,0000,0000,0000,,so in a way you can think about software this Dialogue: 0,0:12:06.74,0:12:08.30,Default,,0000,0000,0000,,you can think about software as a system Dialogue: 0,0:12:08.30,0:12:10.82,Default,,0000,0000,0000,,if the components could be replaced like these\Ncells Dialogue: 0,0:12:10.82,0:12:17.82,Default,,0000,0000,0000,,like, if you focus on making death, constant\Ndeath OK Dialogue: 0,0:12:18.97,0:12:19.89,Default,,0000,0000,0000,,on a small level Dialogue: 0,0:12:19.89,0:12:24.69,Default,,0000,0000,0000,,then the system can live on a large level Dialogue: 0,0:12:24.69,0:12:25.76,Default,,0000,0000,0000,,that's what this talk is about Dialogue: 0,0:12:25.76,0:12:29.30,Default,,0000,0000,0000,,solution, the solution being to mimic living\Norganisms Dialogue: 0,0:12:29.30,0:12:36.11,Default,,0000,0000,0000,,and as an aside, I will say many times the\Nword small or tiny in this talk Dialogue: 0,0:12:36.11,0:12:38.48,Default,,0000,0000,0000,,because I think I'm learning, as I age Dialogue: 0,0:12:38.48,0:12:39.87,Default,,0000,0000,0000,,that small is good Dialogue: 0,0:12:39.87,0:12:42.95,Default,,0000,0000,0000,,its, small projects are good Dialogue: 0,0:12:42.95,0:12:44.05,Default,,0000,0000,0000,,you know how to estimate them Dialogue: 0,0:12:44.05,0:12:45.11,Default,,0000,0000,0000,,small commitments are good Dialogue: 0,0:12:45.11,0:12:46.79,Default,,0000,0000,0000,,because you know you can make them Dialogue: 0,0:12:46.79,0:12:47.75,Default,,0000,0000,0000,,small methods are good Dialogue: 0,0:12:47.75,0:12:48.79,Default,,0000,0000,0000,,small classes are good Dialogue: 0,0:12:48.79,0:12:50.14,Default,,0000,0000,0000,,small applications are good Dialogue: 0,0:12:50.14,0:12:52.41,Default,,0000,0000,0000,,small teams are good Dialogue: 0,0:12:52.41,0:12:55.27,Default,,0000,0000,0000,,so I don't know, this is sort of a non sequitur Dialogue: 0,0:12:55.27,0:12:58.13,Default,,0000,0000,0000,,so if we're going to think about software Dialogue: 0,0:12:58.13,0:12:59.75,Default,,0000,0000,0000,,as like an organism Dialogue: 0,0:12:59.75,0:13:03.10,Default,,0000,0000,0000,,what is a cell in that context? Dialogue: 0,0:13:03.10,0:13:06.36,Default,,0000,0000,0000,,this is sort of the key question that you\Nhave to ask yourself Dialogue: 0,0:13:06.36,0:13:08.94,Default,,0000,0000,0000,,and I say that a cell is a tiny component Dialogue: 0,0:13:08.94,0:13:12.80,Default,,0000,0000,0000,,now, tiny and component are both subjective\Nwords Dialogue: 0,0:13:12.80,0:13:15.37,Default,,0000,0000,0000,,so you can kind of do what you want with that Dialogue: 0,0:13:15.37,0:13:17.67,Default,,0000,0000,0000,,but it's a good frame of thinking Dialogue: 0,0:13:17.67,0:13:20.53,Default,,0000,0000,0000,,if you make your software system of tiny components Dialogue: 0,0:13:20.53,0:13:22.51,Default,,0000,0000,0000,,each one can be like a cell Dialogue: 0,0:13:22.51,0:13:28.01,Default,,0000,0000,0000,,each one can die and the system is a collection\Nof those tiny components Dialogue: 0,0:13:28.01,0:13:31.93,Default,,0000,0000,0000,,and what you want is not for your code to\Nlive forever Dialogue: 0,0:13:31.93,0:13:35.70,Default,,0000,0000,0000,,you don't care that each line of code lives\Nforever, right Dialogue: 0,0:13:35.70,0:13:38.83,Default,,0000,0000,0000,,like if you're trying to develop a legacy\Nin software Dialogue: 0,0:13:38.83,0:13:42.92,Default,,0000,0000,0000,,it's not important to you that your system\Ndot out dot printline statement Dialogue: 0,0:13:42.92,0:13:44.30,Default,,0000,0000,0000,,lives for ten years Dialogue: 0,0:13:44.30,0:13:48.05,Default,,0000,0000,0000,,it's important to you that the function of\Nthe system lives for ten years Dialogue: 0,0:13:48.05,0:13:50.17,Default,,0000,0000,0000,,so like, about exactly ten years ago Dialogue: 0,0:13:50.17,0:13:57.17,Default,,0000,0000,0000,,we created Ruby gems at the RubyConf 2003\Nin Austin, Texas Dialogue: 0,0:13:59.26,0:14:03.60,Default,,0000,0000,0000,,I haven't touched Ruby gems myself in like\Nfour or five years Dialogue: 0,0:14:03.60,0:14:04.89,Default,,0000,0000,0000,,but people are still using it Dialogue: 0,0:14:04.89,0:14:06.13,Default,,0000,0000,0000,,they hate it because it's software Dialogue: 0,0:14:06.13,0:14:07.75,Default,,0000,0000,0000,,everybody hates software right Dialogue: 0,0:14:07.75,0:14:10.16,Default,,0000,0000,0000,,so if you can create software that people\Nhate Dialogue: 0,0:14:10.16,0:14:13.08,Default,,0000,0000,0000,,you've succeeded Dialogue: 0,0:14:13.08,0:14:14.45,Default,,0000,0000,0000,,but it still exists Dialogue: 0,0:14:14.45,0:14:16.56,Default,,0000,0000,0000,,I have no idea if any of the code is the same Dialogue: 0,0:14:16.56,0:14:17.21,Default,,0000,0000,0000,,I would assume not Dialogue: 0,0:14:17.21,0:14:21.35,Default,,0000,0000,0000,,you know I think, I'm sure that my name is\Nstill in it in a copyright notice Dialogue: 0,0:14:21.35,0:14:23.51,Default,,0000,0000,0000,,but that's about it Dialogue: 0,0:14:23.51,0:14:24.89,Default,,0000,0000,0000,,and that's a beautiful thing Dialogue: 0,0:14:24.89,0:14:28.38,Default,,0000,0000,0000,,people are still using it to install Ruby\Nlibraries Dialogue: 0,0:14:28.38,0:14:29.57,Default,,0000,0000,0000,,and software Dialogue: 0,0:14:29.57,0:14:35.60,Default,,0000,0000,0000,,and I don't care if any of my existing, or\Nmy initial code is still in the system Dialogue: 0,0:14:35.60,0:14:36.84,Default,,0000,0000,0000,,because the system still lives Dialogue: 0,0:14:36.84,0:14:43.03,Default,,0000,0000,0000,,so, quite a long time ago now I was researching\Nthis kind of question Dialogue: 0,0:14:43.03,0:14:44.60,Default,,0000,0000,0000,,about Legacy software Dialogue: 0,0:14:44.60,0:14:48.39,Default,,0000,0000,0000,,and I asked a question on Twitter as I often\Ndo at conferences Dialogue: 0,0:14:48.39,0:14:49.91,Default,,0000,0000,0000,,when I'm preparing Dialogue: 0,0:14:49.91,0:14:55.61,Default,,0000,0000,0000,,what are some of the old surviving software\Nsystems you regularly use Dialogue: 0,0:14:55.61,0:14:58.43,Default,,0000,0000,0000,,and if you look at this, I mean, one thing\Nis obviously Dialogue: 0,0:14:58.43,0:15:03.29,Default,,0000,0000,0000,,everyone who answered gave some sort of Unix\Nrelated answer Dialogue: 0,0:15:03.29,0:15:06.51,Default,,0000,0000,0000,,but basically all of these things on this\Nlist Dialogue: 0,0:15:06.51,0:15:13.24,Default,,0000,0000,0000,,are either systems that are collections of\Nreally well-known split-up components Dialogue: 0,0:15:13.24,0:15:15.70,Default,,0000,0000,0000,,or they're tiny, tiny programs Dialogue: 0,0:15:15.70,0:15:18.54,Default,,0000,0000,0000,,so, like, grep is a tiny program, make Dialogue: 0,0:15:18.54,0:15:19.64,Default,,0000,0000,0000,,it only does one thing Dialogue: 0,0:15:19.64,0:15:23.97,Default,,0000,0000,0000,,well make is actually also arguably an operating\Nsystem Dialogue: 0,0:15:23.97,0:15:27.32,Default,,0000,0000,0000,,but I won't get into that Dialogue: 0,0:15:27.32,0:15:29.39,Default,,0000,0000,0000,,emacs is obviously an operating system, right Dialogue: 0,0:15:29.39,0:15:33.05,Default,,0000,0000,0000,,but it's well designed of these tiny little\Npieces Dialogue: 0,0:15:33.05,0:15:37.19,Default,,0000,0000,0000,,so a lot of the old systems I know about follow\Nthis pattern Dialogue: 0,0:15:37.19,0:15:40.19,Default,,0000,0000,0000,,this metaphor that I'm proposing Dialogue: 0,0:15:40.19,0:15:42.17,Default,,0000,0000,0000,,and from my own career Dialogue: 0,0:15:42.17,0:15:43.53,Default,,0000,0000,0000,,when I was here before in Banglore Dialogue: 0,0:15:43.53,0:15:47.25,Default,,0000,0000,0000,,I worked for GE and some of the people Dialogue: 0,0:15:47.25,0:15:48.69,Default,,0000,0000,0000,,we hired even worked on the system there Dialogue: 0,0:15:48.69,0:15:50.97,Default,,0000,0000,0000,,we had a system called the Bull Dialogue: 0,0:15:50.97,0:15:53.70,Default,,0000,0000,0000,,and it was a Honeywell Bull mainframe Dialogue: 0,0:15:53.70,0:15:57.28,Default,,0000,0000,0000,,I doubt any of you have worked on that Dialogue: 0,0:15:57.28,0:15:58.44,Default,,0000,0000,0000,,but this one I know you didn't work on Dialogue: 0,0:15:58.44,0:16:01.07,Default,,0000,0000,0000,,because it had a custom operating system Dialogue: 0,0:16:01.07,0:16:03.11,Default,,0000,0000,0000,,with our own RDVMS Dialogue: 0,0:16:03.11,0:16:06.26,Default,,0000,0000,0000,,we had created a PCP stack for it Dialogue: 0,0:16:06.26,0:16:11.16,Default,,0000,0000,0000,,using like custom hardware that we plugged\Ninto a Windows MT computer Dialogue: 0,0:16:11.16,0:16:14.93,Default,,0000,0000,0000,,with some sort of MT queuing system back in\Nthe day Dialogue: 0,0:16:14.93,0:16:17.06,Default,,0000,0000,0000,,it was this terrifying thing Dialogue: 0,0:16:17.06,0:16:22.51,Default,,0000,0000,0000,,when I started working there the system was\Nalready something like twenty-five years old Dialogue: 0,0:16:22.51,0:16:25.63,Default,,0000,0000,0000,,and I believe even though there have been\Nmany, many projects Dialogue: 0,0:16:25.63,0:16:30.16,Default,,0000,0000,0000,,to try to kill it, like we had a team called\Nthe Bull exit team Dialogue: 0,0:16:30.16,0:16:33.23,Default,,0000,0000,0000,,I believe the system is still in production Dialogue: 0,0:16:33.23,0:16:37.07,Default,,0000,0000,0000,,not as much as it used to be, there are less\Nand less functions in production Dialogue: 0,0:16:37.07,0:16:39.19,Default,,0000,0000,0000,,but I believe the system is still in production Dialogue: 0,0:16:39.19,0:16:46.19,Default,,0000,0000,0000,,the reason for this is that the system was\Nactually made up of these tiny little components Dialogue: 0,0:16:47.07,0:16:50.54,Default,,0000,0000,0000,,and like really queer interfaces between them Dialogue: 0,0:16:50.54,0:16:53.95,Default,,0000,0000,0000,,and we kept the system live because every\Ntime we tried to replace it Dialogue: 0,0:16:53.95,0:16:57.29,Default,,0000,0000,0000,,with some fancy new gem, web thing or gooey\Napp Dialogue: 0,0:16:57.29,0:16:59.47,Default,,0000,0000,0000,,it wasn't as good, and the users hated it Dialogue: 0,0:16:59.47,0:17:00.74,Default,,0000,0000,0000,,it just didn't work Dialogue: 0,0:17:00.74,0:17:04.79,Default,,0000,0000,0000,,so we had to use this old, crazy, modified\Nmainframe Dialogue: 0,0:17:04.79,0:17:08.15,Default,,0000,0000,0000,,for a long time as a result Dialogue: 0,0:17:08.15,0:17:10.89,Default,,0000,0000,0000,,so, the question I ask myself is now Dialogue: 0,0:17:10.89,0:17:13.43,Default,,0000,0000,0000,,how do I, how do I approach a problem like\Nthis Dialogue: 0,0:17:13.43,0:17:19.00,Default,,0000,0000,0000,,and build a system that can survive for a\Nlong time Dialogue: 0,0:17:19.00,0:17:20.05,Default,,0000,0000,0000,,I would encourage you Dialogue: 0,0:17:20.05,0:17:22.59,Default,,0000,0000,0000,,how many of you know of Fred George Dialogue: 0,0:17:22.59,0:17:24.72,Default,,0000,0000,0000,,this is Fred George Dialogue: 0,0:17:24.72,0:17:25.90,Default,,0000,0000,0000,,he was at ThoughtWorks for awhile Dialogue: 0,0:17:25.90,0:17:27.67,Default,,0000,0000,0000,,so he may have, I think he lived in Banglore Dialogue: 0,0:17:27.67,0:17:31.15,Default,,0000,0000,0000,,for some time with ThoughtWorks, in fact Dialogue: 0,0:17:31.15,0:17:35.05,Default,,0000,0000,0000,,he is now running a start-up in Silicon Valley Dialogue: 0,0:17:35.05,0:17:38.60,Default,,0000,0000,0000,,but he has this talk that you can watch online Dialogue: 0,0:17:38.60,0:17:41.66,Default,,0000,0000,0000,,from the Barcelona Ruby Conference the year\Nbefore last Dialogue: 0,0:17:41.66,0:17:45.03,Default,,0000,0000,0000,,called Microservice Architectures Dialogue: 0,0:17:45.03,0:17:47.76,Default,,0000,0000,0000,,and he talks in great detail about he, Dialogue: 0,0:17:47.76,0:17:50.34,Default,,0000,0000,0000,,how he implemented a concept at forward Dialogue: 0,0:17:50.34,0:17:52.15,Default,,0000,0000,0000,,that's very much like what I'm talking about Dialogue: 0,0:17:52.15,0:17:55.13,Default,,0000,0000,0000,,tiny components that only do one thing and\Ncan be thrown away Dialogue: 0,0:17:55.13,0:17:59.89,Default,,0000,0000,0000,,so Microservice Architecture is kind of the\Ncore of what I'm gonna talk about Dialogue: 0,0:17:59.89,0:18:02.08,Default,,0000,0000,0000,,now I've put together some rules for 6WunderKinder Dialogue: 0,0:18:02.08,0:18:04.11,Default,,0000,0000,0000,,which I am going to share with you Dialogue: 0,0:18:04.11,0:18:07.11,Default,,0000,0000,0000,,6WunderKinder is the company I work for Dialogue: 0,0:18:07.11,0:18:09.22,Default,,0000,0000,0000,,when we're working on Wunderlist Dialogue: 0,0:18:09.22,0:18:11.94,Default,,0000,0000,0000,,and the rules of the, the goals of these rules Dialogue: 0,0:18:11.94,0:18:16.69,Default,,0000,0000,0000,,are to reduce coupling, to make it where we\Ncan do fear-free deployments Dialogue: 0,0:18:16.69,0:18:19.19,Default,,0000,0000,0000,,we reduce the chance of "cruft" in our code Dialogue: 0,0:18:19.19,0:18:20.68,Default,,0000,0000,0000,,like nasty stuff that you're afraid of Dialogue: 0,0:18:20.68,0:18:24.67,Default,,0000,0000,0000,,that you leave there, kind of broken window\Nproblems Dialogue: 0,0:18:24.67,0:18:28.66,Default,,0000,0000,0000,,we make it literally trivial to change code Dialogue: 0,0:18:28.66,0:18:32.68,Default,,0000,0000,0000,,so you just never have to ask how do I do\Nthat Dialogue: 0,0:18:32.68,0:18:33.99,Default,,0000,0000,0000,,you just find it easy Dialogue: 0,0:18:33.99,0:18:39.14,Default,,0000,0000,0000,,and most importantly we give ourselves the\Nfreedom to go fast Dialogue: 0,0:18:39.14,0:18:43.68,Default,,0000,0000,0000,,because I think no developer ever wants to\Nbe slow Dialogue: 0,0:18:43.68,0:18:44.67,Default,,0000,0000,0000,,that's one of the worst things Dialogue: 0,0:18:44.67,0:18:47.75,Default,,0000,0000,0000,,just toiling away and not actually accomplishing\Nanything Dialogue: 0,0:18:47.75,0:18:50.92,Default,,0000,0000,0000,,but we go slow because we're constrained by\Nthe system Dialogue: 0,0:18:50.92,0:18:54.11,Default,,0000,0000,0000,,and we're constrained by, sometimes projects Dialogue: 0,0:18:54.11,0:18:56.01,Default,,0000,0000,0000,,and other, you know, management related things Dialogue: 0,0:18:56.01,0:19:01.23,Default,,0000,0000,0000,,but often times its the mess of the system\Nthat we've created Dialogue: 0,0:19:01.23,0:19:03.73,Default,,0000,0000,0000,,so some of the rules Dialogue: 0,0:19:03.73,0:19:09.48,Default,,0000,0000,0000,,I think one thing, and maybe, maybe I'm going\Nto get some push back from this crowd Dialogue: 0,0:19:09.48,0:19:13.17,Default,,0000,0000,0000,,one rule that is less controversial than it\Nused to be Dialogue: 0,0:19:13.17,0:19:15.05,Default,,0000,0000,0000,,is that comments are a design smell Dialogue: 0,0:19:15.05,0:19:19.27,Default,,0000,0000,0000,,does anyone strongly disagree with that? Dialogue: 0,0:19:19.27,0:19:20.75,Default,,0000,0000,0000,,no? Dialogue: 0,0:19:20.75,0:19:23.93,Default,,0000,0000,0000,,does anyone strongly agree with that? Dialogue: 0,0:19:23.93,0:19:27.21,Default,,0000,0000,0000,,OK, so the rest of you have no idea what I'm\Ntalking about Dialogue: 0,0:19:27.21,0:19:33.24,Default,,0000,0000,0000,,so a design smell, I want to define this really\Nquickly Dialogue: 0,0:19:33.24,0:19:36.86,Default,,0000,0000,0000,,a design smell is something you see in your\Ncode or your system Dialogue: 0,0:19:36.86,0:19:39.60,Default,,0000,0000,0000,,where it doesn't necessarily mean it's bad Dialogue: 0,0:19:39.60,0:19:40.73,Default,,0000,0000,0000,,but you look at it and you think Dialogue: 0,0:19:40.73,0:19:43.27,Default,,0000,0000,0000,,hmm, I should look into this a little bit Dialogue: 0,0:19:43.27,0:19:45.93,Default,,0000,0000,0000,,and ask myself, why are there so many comments\Nin this code? Dialogue: 0,0:19:45.93,0:19:48.30,Default,,0000,0000,0000,,you know, especially the bottom one Dialogue: 0,0:19:48.30,0:19:50.65,Default,,0000,0000,0000,,inline comments? Dialogue: 0,0:19:50.65,0:19:56.81,Default,,0000,0000,0000,,definitely bad, definitely a sign that you\Nshould have another method, right Dialogue: 0,0:19:56.81,0:19:59.04,Default,,0000,0000,0000,,so it's pretty easy to convince people Dialogue: 0,0:19:59.04,0:20:00.43,Default,,0000,0000,0000,,that comments are a design smell Dialogue: 0,0:20:00.43,0:20:02.01,Default,,0000,0000,0000,,and I think a lot of people in the industry Dialogue: 0,0:20:02.01,0:20:03.49,Default,,0000,0000,0000,,are starting to agree Dialogue: 0,0:20:03.49,0:20:05.28,Default,,0000,0000,0000,,maybe not for like a public library Dialogue: 0,0:20:05.28,0:20:06.80,Default,,0000,0000,0000,,where you really need to tell someone Dialogue: 0,0:20:06.80,0:20:09.66,Default,,0000,0000,0000,,here's how you use this class and this is\Nwhat it's for Dialogue: 0,0:20:09.66,0:20:12.47,Default,,0000,0000,0000,,but you shouldn't have to document every method Dialogue: 0,0:20:12.47,0:20:15.44,Default,,0000,0000,0000,,and every argument because the method name\Nand the argument name Dialogue: 0,0:20:15.44,0:20:18.17,Default,,0000,0000,0000,,should speak for themselves, right Dialogue: 0,0:20:18.17,0:20:20.67,Default,,0000,0000,0000,,so here's one that you probably won't agree\Nwith Dialogue: 0,0:20:20.67,0:20:21.94,Default,,0000,0000,0000,,tests are a design smell Dialogue: 0,0:20:21.94,0:20:28.58,Default,,0000,0000,0000,,so this one is probably a little more controversial Dialogue: 0,0:20:28.58,0:20:32.57,Default,,0000,0000,0000,,especially in an environment where you're\Nmaybe still struggling people Dialogue: 0,0:20:32.57,0:20:37.91,Default,,0000,0000,0000,,struggling with people to actually get them\Nto write tests to begin with, right Dialogue: 0,0:20:37.91,0:20:41.33,Default,,0000,0000,0000,,you know I went through this period in, like,\N2000 and 2001 Dialogue: 0,0:20:41.33,0:20:44.09,Default,,0000,0000,0000,,where I was really heavily into evangelizing\NTDD Dialogue: 0,0:20:44.09,0:20:47.19,Default,,0000,0000,0000,,and it was really stressful that you couldn't\Nget anyone to do it Dialogue: 0,0:20:47.19,0:20:49.52,Default,,0000,0000,0000,,I think you do have to go through that period Dialogue: 0,0:20:49.52,0:20:52.11,Default,,0000,0000,0000,,and I'm not saying you shouldn't write any\Ntests Dialogue: 0,0:20:52.11,0:20:57.18,Default,,0000,0000,0000,,but that picture I showed you earlier of the\Nslow, brittle test suite Dialogue: 0,0:20:57.18,0:20:58.30,Default,,0000,0000,0000,,that's bad, right Dialogue: 0,0:20:58.30,0:21:00.91,Default,,0000,0000,0000,,that is a bad state to be in Dialogue: 0,0:21:00.91,0:21:03.89,Default,,0000,0000,0000,,and you're in that state because your tests\Nsuck Dialogue: 0,0:21:03.89,0:21:05.85,Default,,0000,0000,0000,,that's why you get in that state Dialogue: 0,0:21:05.85,0:21:09.57,Default,,0000,0000,0000,,your tests suck because you're writing bad\Ntests Dialogue: 0,0:21:09.57,0:21:15.91,Default,,0000,0000,0000,,that don't exercise the right things in your\Nsystem Dialogue: 0,0:21:15.91,0:21:18.96,Default,,0000,0000,0000,,and what I've found is whenever I look into\None of these Dialogue: 0,0:21:18.96,0:21:21.81,Default,,0000,0000,0000,,big slow brittle test suites Dialogue: 0,0:21:21.81,0:21:25.18,Default,,0000,0000,0000,,the tests themselves are indications Dialogue: 0,0:21:25.18,0:21:28.24,Default,,0000,0000,0000,,and the sheer proliferation of tests Dialogue: 0,0:21:28.24,0:21:30.94,Default,,0000,0000,0000,,are indications that the system is bad Dialogue: 0,0:21:30.94,0:21:33.59,Default,,0000,0000,0000,,and the developers are like desperately Dialogue: 0,0:21:33.59,0:21:36.98,Default,,0000,0000,0000,,fearfully trying to run the code Dialogue: 0,0:21:36.98,0:21:38.65,Default,,0000,0000,0000,,in every way they can Dialogue: 0,0:21:38.65,0:21:40.66,Default,,0000,0000,0000,,because it's the only way they can manage Dialogue: 0,0:21:40.66,0:21:43.98,Default,,0000,0000,0000,,to even think about the complexity Dialogue: 0,0:21:43.98,0:21:47.72,Default,,0000,0000,0000,,but if you think about it, if you had a tiny\Ntrivial system Dialogue: 0,0:21:47.72,0:21:50.06,Default,,0000,0000,0000,,you wouldn't need to have hundreds of test\Nfiles Dialogue: 0,0:21:50.06,0:21:53.06,Default,,0000,0000,0000,,that take ten minutes to run, ever Dialogue: 0,0:21:53.06,0:21:54.48,Default,,0000,0000,0000,,if you did, you're doing something stupid Dialogue: 0,0:21:54.48,0:21:57.02,Default,,0000,0000,0000,,you're wasting your time working on tests Dialogue: 0,0:21:57.02,0:22:00.11,Default,,0000,0000,0000,,and we as software developers obsess about\Nthis kind of thing Dialogue: 0,0:22:00.11,0:22:04.77,Default,,0000,0000,0000,,because we have to fight so hard to get our\Npeers to do it in the first place Dialogue: 0,0:22:04.77,0:22:06.37,Default,,0000,0000,0000,,and to understand it Dialogue: 0,0:22:06.37,0:22:10.05,Default,,0000,0000,0000,,we obsess to the point where we focus on the\Nwrong thing Dialogue: 0,0:22:10.05,0:22:14.66,Default,,0000,0000,0000,,none of us are in the business of writing\Ntests for customers Dialogue: 0,0:22:14.66,0:22:17.56,Default,,0000,0000,0000,,like we're not launching our tests on the\Nweb Dialogue: 0,0:22:17.56,0:22:20.00,Default,,0000,0000,0000,,and hoping people will buy them, right Dialogue: 0,0:22:20.00,0:22:23.90,Default,,0000,0000,0000,,it doesn't provide value, it's just a side-effect Dialogue: 0,0:22:23.90,0:22:25.78,Default,,0000,0000,0000,,that we have focused too heavily on Dialogue: 0,0:22:25.78,0:22:29.93,Default,,0000,0000,0000,,and we've lost sight of what the actual goal\Nis Dialogue: 0,0:22:29.93,0:22:34.21,Default,,0000,0000,0000,,so, this one actually requires a visual Dialogue: 0,0:22:34.21,0:22:37.10,Default,,0000,0000,0000,,I tell the people on my team now Dialogue: 0,0:22:37.10,0:22:40.34,Default,,0000,0000,0000,,you can write code in any language you want Dialogue: 0,0:22:40.34,0:22:42.76,Default,,0000,0000,0000,,any framework you want, anything you want\Nto do Dialogue: 0,0:22:42.76,0:22:44.56,Default,,0000,0000,0000,,as long as the code is this big Dialogue: 0,0:22:44.56,0:22:47.49,Default,,0000,0000,0000,,so if you want to write the new service in\NHaskell Dialogue: 0,0:22:47.49,0:22:50.06,Default,,0000,0000,0000,,and it's this big in a normal size font Dialogue: 0,0:22:50.06,0:22:51.47,Default,,0000,0000,0000,,you can do it Dialogue: 0,0:22:51.47,0:22:54.26,Default,,0000,0000,0000,,if you want to do it in Closure or Elixir\Nor Scarla or Ruby Dialogue: 0,0:22:54.26,0:22:55.05,Default,,0000,0000,0000,,or whatever you want to do Dialogue: 0,0:22:55.05,0:22:56.82,Default,,0000,0000,0000,,even Python for god's sake Dialogue: 0,0:22:56.82,0:22:59.23,Default,,0000,0000,0000,,you can do it if it's this big and no bigger Dialogue: 0,0:22:59.23,0:23:04.01,Default,,0000,0000,0000,,why? because it means I can look at it Dialogue: 0,0:23:04.01,0:23:05.62,Default,,0000,0000,0000,,and I can understand it Dialogue: 0,0:23:05.62,0:23:08.73,Default,,0000,0000,0000,,or if I don't I'll just throw it away Dialogue: 0,0:23:08.73,0:23:12.10,Default,,0000,0000,0000,,because if it's this big it doesn't do very\Nmuch, right Dialogue: 0,0:23:12.10,0:23:14.45,Default,,0000,0000,0000,,so the risk is really low Dialogue: 0,0:23:14.45,0:23:16.81,Default,,0000,0000,0000,,and I really mean the system is that Dialogue: 0,0:23:16.81,0:23:19.13,Default,,0000,0000,0000,,there are the, the component is that big Dialogue: 0,0:23:19.13,0:23:21.07,Default,,0000,0000,0000,,and in my world a component means a service Dialogue: 0,0:23:21.07,0:23:24.71,Default,,0000,0000,0000,,that's running and probably listening on an\NHTTP board Dialogue: 0,0:23:24.71,0:23:27.82,Default,,0000,0000,0000,,or some sort of rift or RPC protocol Dialogue: 0,0:23:27.82,0:23:29.52,Default,,0000,0000,0000,,so it's a standalone thing Dialogue: 0,0:23:29.52,0:23:30.68,Default,,0000,0000,0000,,it's its own application Dialogue: 0,0:23:30.68,0:23:33.13,Default,,0000,0000,0000,,it's probably in its own git repository Dialogue: 0,0:23:33.13,0:23:34.95,Default,,0000,0000,0000,,people do poll requests against it Dialogue: 0,0:23:34.95,0:23:35.82,Default,,0000,0000,0000,,but it's just tiny Dialogue: 0,0:23:35.82,0:23:39.11,Default,,0000,0000,0000,,so this big Dialogue: 0,0:23:39.11,0:23:41.20,Default,,0000,0000,0000,,at the top of this, by the way Dialogue: 0,0:23:41.20,0:23:45.72,Default,,0000,0000,0000,,is some code by Konstantin Haase Dialogue: 0,0:23:45.72,0:23:48.72,Default,,0000,0000,0000,,who also lives in Berlin, where I live Dialogue: 0,0:23:48.72,0:23:51.48,Default,,0000,0000,0000,,this is a rewrite of Sinatra Dialogue: 0,0:23:51.48,0:23:52.43,Default,,0000,0000,0000,,the web framework Dialogue: 0,0:23:52.43,0:23:55.45,Default,,0000,0000,0000,,and Konstantin is actually the maintainer\Nof Sinatra Dialogue: 0,0:23:55.45,0:23:58.87,Default,,0000,0000,0000,,it's not fully compatible, but it's amazingly\Nclose Dialogue: 0,0:23:58.87,0:24:00.26,Default,,0000,0000,0000,,and it all fits right in that Dialogue: 0,0:24:00.26,0:24:05.02,Default,,0000,0000,0000,,but the font size is kind of small, so I cheated Dialogue: 0,0:24:05.02,0:24:08.55,Default,,0000,0000,0000,,another rule, our systems are heterogeneous\Nby default Dialogue: 0,0:24:08.55,0:24:11.42,Default,,0000,0000,0000,,so I say you can write in any language you\Nwant Dialogue: 0,0:24:11.42,0:24:14.05,Default,,0000,0000,0000,,that's not just because I want the developers\Nto be excited Dialogue: 0,0:24:14.05,0:24:16.65,Default,,0000,0000,0000,,although I think, most of you, if you worked Dialogue: 0,0:24:16.65,0:24:19.39,Default,,0000,0000,0000,,in an environment where your boss told you Dialogue: 0,0:24:19.39,0:24:21.50,Default,,0000,0000,0000,,you can use any programming language or tool\Nyou want Dialogue: 0,0:24:21.50,0:24:23.81,Default,,0000,0000,0000,,you would be pretty happy about that, right Dialogue: 0,0:24:23.81,0:24:26.59,Default,,0000,0000,0000,,anyone unhappy about that? I don't think so Dialogue: 0,0:24:26.59,0:24:28.10,Default,,0000,0000,0000,,unless it's one of the bosses here Dialogue: 0,0:24:28.10,0:24:31.68,Default,,0000,0000,0000,,that's like don't tell people that Dialogue: 0,0:24:31.68,0:24:32.57,Default,,0000,0000,0000,,so that's one thing Dialogue: 0,0:24:32.57,0:24:36.88,Default,,0000,0000,0000,,the other one is, it leads to a good system\Ndesign Dialogue: 0,0:24:36.88,0:24:38.84,Default,,0000,0000,0000,,because think about this Dialogue: 0,0:24:38.84,0:24:42.35,Default,,0000,0000,0000,,if I write one program in Erlang, one component\Nin Erlang Dialogue: 0,0:24:42.35,0:24:44.41,Default,,0000,0000,0000,,one program in Ruby Dialogue: 0,0:24:44.41,0:24:47.71,Default,,0000,0000,0000,,I have to work really, really hard to make\Ntight coupling Dialogue: 0,0:24:47.71,0:24:49.65,Default,,0000,0000,0000,,between those things Dialogue: 0,0:24:49.65,0:24:53.34,Default,,0000,0000,0000,,like I have to basically use computer science\Nto do that Dialogue: 0,0:24:53.34,0:24:54.37,Default,,0000,0000,0000,,I don't even know what I would do Dialogue: 0,0:24:54.37,0:24:55.93,Default,,0000,0000,0000,,you know it's hard Dialogue: 0,0:24:55.93,0:24:58.59,Default,,0000,0000,0000,,like I would have to maybe implement Ruby\Nin Erlang Dialogue: 0,0:24:58.59,0:25:01.14,Default,,0000,0000,0000,,so that it can run in the same BM or vice\Nversa Dialogue: 0,0:25:01.14,0:25:04.06,Default,,0000,0000,0000,,it's just silly, I wouldn't do it Dialogue: 0,0:25:04.06,0:25:07.05,Default,,0000,0000,0000,,so if my system is heterogeneous by default Dialogue: 0,0:25:07.05,0:25:11.96,Default,,0000,0000,0000,,my coupling is very low, at least at a certain\Nlevel by default Dialogue: 0,0:25:11.96,0:25:14.17,Default,,0000,0000,0000,,because it's the path of least resistance Dialogue: 0,0:25:14.17,0:25:16.68,Default,,0000,0000,0000,,is to make the system decoupled Dialogue: 0,0:25:16.68,0:25:19.30,Default,,0000,0000,0000,,it's easier to make things decoupled than\Ncoupled Dialogue: 0,0:25:19.30,0:25:21.51,Default,,0000,0000,0000,,if they're all running in different languages Dialogue: 0,0:25:21.51,0:25:25.21,Default,,0000,0000,0000,,so in the past three months, I'll say Dialogue: 0,0:25:25.21,0:25:30.49,Default,,0000,0000,0000,,I have written production code in objective\NCRuby, Scala, Closure, Node Dialogue: 0,0:25:30.49,0:25:34.06,Default,,0000,0000,0000,,I don't know, more stuff, Java Dialogue: 0,0:25:34.06,0:25:35.67,Default,,0000,0000,0000,,all these different languages Dialogue: 0,0:25:35.67,0:25:38.81,Default,,0000,0000,0000,,real code for work Dialogue: 0,0:25:38.81,0:25:40.55,Default,,0000,0000,0000,,and yes, they are not tightly coupled Dialogue: 0,0:25:40.55,0:25:44.65,Default,,0000,0000,0000,,like I haven't installed JRuby so that I could\Nreach into the internals of my Scala code Dialogue: 0,0:25:44.65,0:25:45.63,Default,,0000,0000,0000,,because that would be a pain Dialogue: 0,0:25:45.63,0:25:50.73,Default,,0000,0000,0000,,I don't want to do that Dialogue: 0,0:25:50.73,0:25:52.96,Default,,0000,0000,0000,,another very important one is Dialogue: 0,0:25:52.96,0:25:55.56,Default,,0000,0000,0000,,server nodes are disposable Dialogue: 0,0:25:55.56,0:25:59.43,Default,,0000,0000,0000,,so, back when I was at GE, for example Dialogue: 0,0:25:59.43,0:26:02.73,Default,,0000,0000,0000,,I remember being really proud when I looked\Nat the up time of one of my servers Dialogue: 0,0:26:02.73,0:26:05.48,Default,,0000,0000,0000,,and it was like four hundred days or something Dialogue: 0,0:26:05.48,0:26:07.15,Default,,0000,0000,0000,,it's like, wow, this is awesome Dialogue: 0,0:26:07.15,0:26:09.75,Default,,0000,0000,0000,,I have this big server, it had all these apps\Non it Dialogue: 0,0:26:09.75,0:26:12.94,Default,,0000,0000,0000,,we kept it running for four hundred days Dialogue: 0,0:26:12.94,0:26:14.81,Default,,0000,0000,0000,,the problem with that is I was afraid to ever\Ntouch it Dialogue: 0,0:26:14.81,0:26:17.51,Default,,0000,0000,0000,,I was really happy it was alive Dialogue: 0,0:26:17.51,0:26:18.86,Default,,0000,0000,0000,,but I didn't want to do anything to it Dialogue: 0,0:26:18.86,0:26:21.25,Default,,0000,0000,0000,,I was afraid to update the operating system Dialogue: 0,0:26:21.25,0:26:23.77,Default,,0000,0000,0000,,in fact you could not upgrade Solaris then\Nwithout restarting it Dialogue: 0,0:26:23.77,0:26:27.54,Default,,0000,0000,0000,,so that meant I had not upgrading the operating\Nsystem Dialogue: 0,0:26:27.54,0:26:32.39,Default,,0000,0000,0000,,I probably shouldn't have been too proud about\Nit Dialogue: 0,0:26:32.39,0:26:34.89,Default,,0000,0000,0000,,Nodes that are alive for a long time lead\Nto fear Dialogue: 0,0:26:34.89,0:26:37.44,Default,,0000,0000,0000,,and what I want is less fear Dialogue: 0,0:26:37.44,0:26:39.34,Default,,0000,0000,0000,,so I throw them away Dialogue: 0,0:26:39.34,0:26:42.90,Default,,0000,0000,0000,,and this means I don't have physical servers\Nthat I throw away Dialogue: 0,0:26:42.90,0:26:45.92,Default,,0000,0000,0000,,that would be fun but I'm not that rich yet Dialogue: 0,0:26:45.92,0:26:49.16,Default,,0000,0000,0000,,we use AWS right now, you could do it with\Nany kind of cloud service Dialogue: 0,0:26:49.16,0:26:52.64,Default,,0000,0000,0000,,or even internal cloud divider Dialogue: 0,0:26:52.64,0:26:53.78,Default,,0000,0000,0000,,but every node is disposable Dialogue: 0,0:26:53.78,0:27:00.55,Default,,0000,0000,0000,,so, we never upgrade software on an existing\Nserver Dialogue: 0,0:27:00.55,0:27:03.15,Default,,0000,0000,0000,,whenever you want to deploy a new version\Nof a service Dialogue: 0,0:27:03.15,0:27:04.37,Default,,0000,0000,0000,,you create new servers Dialogue: 0,0:27:04.37,0:27:05.43,Default,,0000,0000,0000,,and you deploy that version Dialogue: 0,0:27:05.43,0:27:08.79,Default,,0000,0000,0000,,and then you replace them in the load balance\Nor somewhere Dialogue: 0,0:27:08.79,0:27:10.20,Default,,0000,0000,0000,,that's it Dialogue: 0,0:27:10.20,0:27:13.10,Default,,0000,0000,0000,,so, you never have to wonder what's on a server Dialogue: 0,0:27:13.10,0:27:15.62,Default,,0000,0000,0000,,because it was deployed through an automated\Nprocess Dialogue: 0,0:27:15.62,0:27:16.84,Default,,0000,0000,0000,,and there's no fear there Dialogue: 0,0:27:16.84,0:27:17.98,Default,,0000,0000,0000,,you know exactly what it is Dialogue: 0,0:27:17.98,0:27:19.32,Default,,0000,0000,0000,,you know exactly how to recreate it Dialogue: 0,0:27:19.32,0:27:21.54,Default,,0000,0000,0000,,because you have a golden master image Dialogue: 0,0:27:21.54,0:27:24.20,Default,,0000,0000,0000,,and in our case it's actually an Amazon image Dialogue: 0,0:27:24.20,0:27:26.38,Default,,0000,0000,0000,,that you can just boot more of Dialogue: 0,0:27:26.38,0:27:27.44,Default,,0000,0000,0000,,scaling is a problem Dialogue: 0,0:27:27.44,0:27:29.07,Default,,0000,0000,0000,,you just boot ten more servers Dialogue: 0,0:27:29.07,0:27:32.52,Default,,0000,0000,0000,,boom, done, no problem Dialogue: 0,0:27:32.52,0:27:35.45,Default,,0000,0000,0000,,so yeah I tell the team, you know, pick your\Ntechnology Dialogue: 0,0:27:35.45,0:27:38.09,Default,,0000,0000,0000,,everything must be automated, that's another\Npiece Dialogue: 0,0:27:38.09,0:27:43.06,Default,,0000,0000,0000,,if you're going to deploy a closure service\Nfor the first time Dialogue: 0,0:27:43.06,0:27:46.76,Default,,0000,0000,0000,,you have to be responsible for figuring out\Nhow it fits into our deployment system Dialogue: 0,0:27:46.76,0:27:50.31,Default,,0000,0000,0000,,so that you have immutable deployments and\Ndisposable nodes Dialogue: 0,0:27:50.31,0:27:53.76,Default,,0000,0000,0000,,if you can do that and you're willing to also\Nmaintain it and teach someone else Dialogue: 0,0:27:53.76,0:27:55.91,Default,,0000,0000,0000,,about the little piece of code that you wrote,\Nthen cool Dialogue: 0,0:27:55.91,0:27:59.01,Default,,0000,0000,0000,,you can do it, any level you want Dialogue: 0,0:27:59.01,0:28:02.93,Default,,0000,0000,0000,,and then once you deploy stuff Dialogue: 0,0:28:02.93,0:28:05.25,Default,,0000,0000,0000,,like a lot of us like to just SFH in the machines Dialogue: 0,0:28:05.25,0:28:07.68,Default,,0000,0000,0000,,and then twiddle with things and replace files Dialogue: 0,0:28:07.68,0:28:11.66,Default,,0000,0000,0000,,and like try like fixing bugs live on production Dialogue: 0,0:28:11.66,0:28:13.99,Default,,0000,0000,0000,,why no just throw away the actual keys Dialogue: 0,0:28:13.99,0:28:16.59,Default,,0000,0000,0000,,because you're going to throw away the system\Neventually Dialogue: 0,0:28:16.59,0:28:19.14,Default,,0000,0000,0000,,you don't even need route access to it Dialogue: 0,0:28:19.14,0:28:21.49,Default,,0000,0000,0000,,you don't need to be able to get to it Dialogue: 0,0:28:21.49,0:28:24.98,Default,,0000,0000,0000,,except through the port that your service\Nis listening on Dialogue: 0,0:28:24.98,0:28:26.84,Default,,0000,0000,0000,,so you can't screw it up Dialogue: 0,0:28:26.84,0:28:29.47,Default,,0000,0000,0000,,you can't introduce entropy and mess things\Nup Dialogue: 0,0:28:29.47,0:28:31.47,Default,,0000,0000,0000,,if you throw away the keys Dialogue: 0,0:28:31.47,0:28:33.64,Default,,0000,0000,0000,,so this is actually a practice that you can\Ndo Dialogue: 0,0:28:33.64,0:28:36.46,Default,,0000,0000,0000,,deploy the servers, remove all the credentials Dialogue: 0,0:28:36.46,0:28:39.30,Default,,0000,0000,0000,,for logging in and the only option you have Dialogue: 0,0:28:39.30,0:28:43.61,Default,,0000,0000,0000,,is to destroy them when you're done with them Dialogue: 0,0:28:43.61,0:28:45.14,Default,,0000,0000,0000,,provisioning new services in our world Dialogue: 0,0:28:45.14,0:28:46.96,Default,,0000,0000,0000,,must also be trivial Dialogue: 0,0:28:46.96,0:28:51.37,Default,,0000,0000,0000,,so we have actually now thrown away our chef\Nrepository Dialogue: 0,0:28:51.37,0:28:54.34,Default,,0000,0000,0000,,because chef is obsolete and Dialogue: 0,0:28:54.34,0:28:56.05,Default,,0000,0000,0000,,we have replaced it with shell scripts Dialogue: 0,0:28:56.05,0:29:01.34,Default,,0000,0000,0000,,and that sounds like I'm an idiot Dialogue: 0,0:29:01.34,0:29:04.46,Default,,0000,0000,0000,,I know, but when I say chef is obsolete Dialogue: 0,0:29:04.46,0:29:05.48,Default,,0000,0000,0000,,I don't really mean that Dialogue: 0,0:29:05.48,0:29:07.10,Default,,0000,0000,0000,,I like to say that so that people will think Dialogue: 0,0:29:07.10,0:29:08.45,Default,,0000,0000,0000,,because a lot of you are probably thinking Dialogue: 0,0:29:08.45,0:29:11.04,Default,,0000,0000,0000,,we should move to chef Dialogue: 0,0:29:11.04,0:29:11.81,Default,,0000,0000,0000,,that would be great Dialogue: 0,0:29:11.81,0:29:13.53,Default,,0000,0000,0000,,because what you have is a bunch of servers Dialogue: 0,0:29:13.53,0:29:14.67,Default,,0000,0000,0000,,that are running for a long time Dialogue: 0,0:29:14.67,0:29:17.11,Default,,0000,0000,0000,,and you need to be able to continue to keep\Nthem up to date Dialogue: 0,0:29:17.11,0:29:19.15,Default,,0000,0000,0000,,chef is really great at that Dialogue: 0,0:29:19.15,0:29:22.06,Default,,0000,0000,0000,,chef is also good at booting a new server Dialogue: 0,0:29:22.06,0:29:24.34,Default,,0000,0000,0000,,but really it's just overkill for that Dialogue: 0,0:29:24.34,0:29:25.06,Default,,0000,0000,0000,,yeah Dialogue: 0,0:29:25.06,0:29:26.46,Default,,0000,0000,0000,,so if you're always throwing stuff away Dialogue: 0,0:29:26.46,0:29:27.81,Default,,0000,0000,0000,,I don't think you need chef Dialogue: 0,0:29:27.81,0:29:29.16,Default,,0000,0000,0000,,do something really, really simple Dialogue: 0,0:29:29.16,0:29:29.95,Default,,0000,0000,0000,,and that's what we've done Dialogue: 0,0:29:29.95,0:29:33.09,Default,,0000,0000,0000,,so like whenever we deploy a new type of service Dialogue: 0,0:29:33.09,0:29:37.73,Default,,0000,0000,0000,,I set up ZooKepper recently, which is a complete\Nchange from the other stuff we're deploying Dialogue: 0,0:29:37.73,0:29:39.98,Default,,0000,0000,0000,,I think it was a five line shell script to\Ndo that Dialogue: 0,0:29:39.98,0:29:42.59,Default,,0000,0000,0000,,I just added it to a get repo and run a command Dialogue: 0,0:29:42.59,0:29:47.34,Default,,0000,0000,0000,,I've got a cluster of ZooKeeper servers running Dialogue: 0,0:29:47.34,0:29:51.26,Default,,0000,0000,0000,,you want to always be deploying your software Dialogue: 0,0:29:51.26,0:29:55.57,Default,,0000,0000,0000,,this is something I learned from Kent Beck\Nearly on in the agile extreme programming Dialogue: 0,0:29:55.57,0:29:56.33,Default,,0000,0000,0000,,world Dialogue: 0,0:29:56.33,0:29:57.98,Default,,0000,0000,0000,,that if something is hard Dialogue: 0,0:29:57.98,0:30:00.42,Default,,0000,0000,0000,,or you perceive it to be hard or difficult Dialogue: 0,0:30:00.42,0:30:02.29,Default,,0000,0000,0000,,the best thing you can do Dialogue: 0,0:30:02.29,0:30:04.39,Default,,0000,0000,0000,,if you have to do that thing all the time Dialogue: 0,0:30:04.39,0:30:07.00,Default,,0000,0000,0000,,is to just do it constantly Dialogue: 0,0:30:07.00,0:30:09.09,Default,,0000,0000,0000,,non-stop all the time Dialogue: 0,0:30:09.09,0:30:10.91,Default,,0000,0000,0000,,so like deploying in our old world Dialogue: 0,0:30:10.91,0:30:15.28,Default,,0000,0000,0000,,where it would take all night once a week Dialogue: 0,0:30:15.28,0:30:18.04,Default,,0000,0000,0000,,if we instituted a new policy Dialogue: 0,0:30:18.04,0:30:19.27,Default,,0000,0000,0000,,in that team that said Dialogue: 0,0:30:19.27,0:30:23.10,Default,,0000,0000,0000,,any change that goes to master must be deployed\Nwithin five minutes Dialogue: 0,0:30:23.10,0:30:28.41,Default,,0000,0000,0000,,I guarantee you we would have fixed that process,\Nright Dialogue: 0,0:30:28.41,0:30:29.73,Default,,0000,0000,0000,,and if you're deploying constantly Dialogue: 0,0:30:29.73,0:30:31.08,Default,,0000,0000,0000,,all day every day Dialogue: 0,0:30:31.08,0:30:33.12,Default,,0000,0000,0000,,you're never going to be afraid of deployments Dialogue: 0,0:30:33.12,0:30:36.02,Default,,0000,0000,0000,,because it's always a small change Dialogue: 0,0:30:36.02,0:30:37.93,Default,,0000,0000,0000,,so always be deploying Dialogue: 0,0:30:37.93,0:30:40.41,Default,,0000,0000,0000,,every new deploy means you're throwing away\Nold servers Dialogue: 0,0:30:40.41,0:30:42.60,Default,,0000,0000,0000,,and replacing them with new ones Dialogue: 0,0:30:42.60,0:30:45.61,Default,,0000,0000,0000,,in our world I would say that the average\Nuptime Dialogue: 0,0:30:45.61,0:30:48.24,Default,,0000,0000,0000,,of one of our servers is probably something\Nlike Dialogue: 0,0:30:48.24,0:30:55.18,Default,,0000,0000,0000,,seventeen hours and that's because we don't\Ntend to work on the weekend very much Dialogue: 0,0:30:55.18,0:30:56.87,Default,,0000,0000,0000,,you also, when you have these sorts of systems Dialogue: 0,0:30:56.87,0:30:58.71,Default,,0000,0000,0000,,that are distributed like this Dialogue: 0,0:30:58.71,0:31:02.10,Default,,0000,0000,0000,,and you're trying to reduce the fear of change Dialogue: 0,0:31:02.10,0:31:04.35,Default,,0000,0000,0000,,the big thing that you're afraid of is failure Dialogue: 0,0:31:04.35,0:31:06.11,Default,,0000,0000,0000,,you're afraid that the service is going to\Nfail Dialogue: 0,0:31:06.11,0:31:07.11,Default,,0000,0000,0000,,the system is going to go down Dialogue: 0,0:31:07.11,0:31:10.07,Default,,0000,0000,0000,,one component won't be reachable, that sort\Nof thing Dialogue: 0,0:31:10.07,0:31:12.37,Default,,0000,0000,0000,,so you just to have assume that that's going\Nto happen Dialogue: 0,0:31:12.37,0:31:17.21,Default,,0000,0000,0000,,you are not going to build a system that never\Nfails, ever Dialogue: 0,0:31:17.21,0:31:19.74,Default,,0000,0000,0000,,I hope you don't, because you will have wasted\Nmuch of your life Dialogue: 0,0:31:19.74,0:31:21.10,Default,,0000,0000,0000,,trying to get that to happen Dialogue: 0,0:31:21.10,0:31:24.31,Default,,0000,0000,0000,,instead, assume that the thing, the components\Nare going to fail Dialogue: 0,0:31:24.31,0:31:25.96,Default,,0000,0000,0000,,and build resiliency in Dialogue: 0,0:31:25.96,0:31:28.03,Default,,0000,0000,0000,,I have a picture here of Joe Armstrong Dialogue: 0,0:31:28.03,0:31:30.38,Default,,0000,0000,0000,,who is one of the inventors of Erlang Dialogue: 0,0:31:30.38,0:31:34.89,Default,,0000,0000,0000,,if you have not studied Erlang philosophy\Naround failure and recovery Dialogue: 0,0:31:34.89,0:31:35.34,Default,,0000,0000,0000,,you should Dialogue: 0,0:31:35.34,0:31:36.47,Default,,0000,0000,0000,,and it won't take you long Dialogue: 0,0:31:36.47,0:31:39.07,Default,,0000,0000,0000,,so I'm just going to leave that as homework\Nfor you Dialogue: 0,0:31:39.07,0:31:42.11,Default,,0000,0000,0000,,and then, you know, I said, the tests are\Na design pattern Dialogue: 0,0:31:42.11,0:31:43.54,Default,,0000,0000,0000,,I don't mean don't write any tests Dialogue: 0,0:31:43.54,0:31:45.95,Default,,0000,0000,0000,,but I also want to be further responsible\Nhere Dialogue: 0,0:31:45.95,0:31:50.54,Default,,0000,0000,0000,,and say you should monitor everything Dialogue: 0,0:31:50.54,0:31:52.88,Default,,0000,0000,0000,,you want to favor measurement over testing Dialogue: 0,0:31:52.88,0:31:57.13,Default,,0000,0000,0000,,so I use measurement as a surrogate for testing Dialogue: 0,0:31:57.13,0:31:57.85,Default,,0000,0000,0000,,or as an enhancement Dialogue: 0,0:31:57.85,0:32:03.98,Default,,0000,0000,0000,,and the reason I say this is Dialogue: 0,0:32:03.98,0:32:05.65,Default,,0000,0000,0000,,you can either focus on one of two things Dialogue: 0,0:32:05.65,0:32:07.79,Default,,0000,0000,0000,,I said assume failure right, so Dialogue: 0,0:32:07.79,0:32:12.37,Default,,0000,0000,0000,,mean time between failures or mean time to\Nresolution Dialogue: 0,0:32:12.37,0:32:16.20,Default,,0000,0000,0000,,those are kind of two metrics in the ops world Dialogue: 0,0:32:16.20,0:32:17.40,Default,,0000,0000,0000,,that people talk about Dialogue: 0,0:32:17.40,0:32:20.14,Default,,0000,0000,0000,,for measuring their success and their effectiveness Dialogue: 0,0:32:20.14,0:32:21.98,Default,,0000,0000,0000,,mean time between failures means Dialogue: 0,0:32:21.98,0:32:25.36,Default,,0000,0000,0000,,you're trying to increase the time between\Nfailures Dialogue: 0,0:32:25.36,0:32:29.29,Default,,0000,0000,0000,,of the system, so basically you're trying\Nto make failures never happen, right Dialogue: 0,0:32:29.29,0:32:31.06,Default,,0000,0000,0000,,mean time to resolution means Dialogue: 0,0:32:31.06,0:32:34.68,Default,,0000,0000,0000,,when they happen, I'm gonna focus on bringing\Nthem back Dialogue: 0,0:32:34.68,0:32:37.29,Default,,0000,0000,0000,,as fast as I possibly can Dialogue: 0,0:32:37.29,0:32:41.12,Default,,0000,0000,0000,,so a perfect example would be a system fails Dialogue: 0,0:32:41.12,0:32:43.72,Default,,0000,0000,0000,,and another one is already up and just takes\Nover its work Dialogue: 0,0:32:43.72,0:32:46.68,Default,,0000,0000,0000,,mean time to resolution is essentially zero,\Nright Dialogue: 0,0:32:46.68,0:32:50.68,Default,,0000,0000,0000,,if you're always assuming that every component\Ncan will fail Dialogue: 0,0:32:50.68,0:32:53.77,Default,,0000,0000,0000,,then mean time to resolution is going to be\Nreally good Dialogue: 0,0:32:53.77,0:32:56.24,Default,,0000,0000,0000,,because you're going to bake it into the process Dialogue: 0,0:32:56.24,0:32:59.48,Default,,0000,0000,0000,,if you do that, you don't care about when\Nthings fail Dialogue: 0,0:32:59.48,0:33:02.64,Default,,0000,0000,0000,,and back to this idea of favoring measurement\Nover testing Dialogue: 0,0:33:02.64,0:33:07.25,Default,,0000,0000,0000,,if you're monitoring everything, everything\Nwith intelligence Dialogue: 0,0:33:07.25,0:33:10.39,Default,,0000,0000,0000,,then you're actually focusing on mean time\Nto resolution Dialogue: 0,0:33:10.39,0:33:15.75,Default,,0000,0000,0000,,and acknowledging that the software is going\Nto be broken sometimes, right Dialogue: 0,0:33:15.75,0:33:18.20,Default,,0000,0000,0000,,and when I say monitor everything, I mean\Neverything Dialogue: 0,0:33:18.20,0:33:21.94,Default,,0000,0000,0000,,I don't mean, like your disk space and your\Nmemory and stuff there Dialogue: 0,0:33:21.94,0:33:23.67,Default,,0000,0000,0000,,I'm talking about business metrics Dialogue: 0,0:33:23.67,0:33:27.63,Default,,0000,0000,0000,,so, at living social we created this thing\Ncalled rearview Dialogue: 0,0:33:27.63,0:33:29.25,Default,,0000,0000,0000,,which is now opensource Dialogue: 0,0:33:29.25,0:33:33.03,Default,,0000,0000,0000,,which allows you do to aberration detection Dialogue: 0,0:33:33.03,0:33:37.92,Default,,0000,0000,0000,,and aberration means strange behavior, strange\Nchange in behavior Dialogue: 0,0:33:37.92,0:33:41.68,Default,,0000,0000,0000,,so rearview can do aberration detection Dialogue: 0,0:33:41.68,0:33:44.69,Default,,0000,0000,0000,,on data sets, arbitrary data sets Dialogue: 0,0:33:44.69,0:33:47.01,Default,,0000,0000,0000,,which means, like in the living social world Dialogue: 0,0:33:47.01,0:33:48.23,Default,,0000,0000,0000,,we had user sign ups Dialogue: 0,0:33:48.23,0:33:49.19,Default,,0000,0000,0000,,constantly streaming in Dialogue: 0,0:33:49.19,0:33:51.56,Default,,0000,0000,0000,,it was a very high volume site Dialogue: 0,0:33:51.56,0:33:53.80,Default,,0000,0000,0000,,if user sign-ups were weird Dialogue: 0,0:33:53.80,0:33:55.94,Default,,0000,0000,0000,,we would get an alert Dialogue: 0,0:33:55.94,0:33:57.54,Default,,0000,0000,0000,,why might they be weird? Dialogue: 0,0:33:57.54,0:34:00.83,Default,,0000,0000,0000,,one thing could be like the user service is\Ndown, right Dialogue: 0,0:34:00.83,0:34:02.10,Default,,0000,0000,0000,,so then we would get two alerts Dialogue: 0,0:34:02.10,0:34:04.01,Default,,0000,0000,0000,,user sign ups have gone down Dialogue: 0,0:34:04.01,0:34:05.15,Default,,0000,0000,0000,,and so has the service Dialogue: 0,0:34:05.15,0:34:07.51,Default,,0000,0000,0000,,so obviously the problem is the service is\Ndown Dialogue: 0,0:34:07.51,0:34:09.68,Default,,0000,0000,0000,,let's bring it back up Dialogue: 0,0:34:09.68,0:34:11.41,Default,,0000,0000,0000,,but it could be something like Dialogue: 0,0:34:11.41,0:34:13.35,Default,,0000,0000,0000,,a front-end developer or a designer Dialogue: 0,0:34:13.35,0:34:16.47,Default,,0000,0000,0000,,made a change that was intentional Dialogue: 0,0:34:16.47,0:34:18.04,Default,,0000,0000,0000,,but it just didn't work and no one liked it Dialogue: 0,0:34:18.04,0:34:21.17,Default,,0000,0000,0000,,so they didn't sign up to the site anymore Dialogue: 0,0:34:21.17,0:34:23.98,Default,,0000,0000,0000,,that's more important than just knowing that\Nthe service is down Dialogue: 0,0:34:23.98,0:34:25.46,Default,,0000,0000,0000,,right, because what you care about Dialogue: 0,0:34:25.46,0:34:27.19,Default,,0000,0000,0000,,isn't that the service is up or down Dialogue: 0,0:34:27.19,0:34:30.54,Default,,0000,0000,0000,,if you could crash the entire system and still\Nbe making money Dialogue: 0,0:34:30.54,0:34:31.86,Default,,0000,0000,0000,,you don't care, right, that's better Dialogue: 0,0:34:31.86,0:34:34.84,Default,,0000,0000,0000,,throw it away and stop paying for the servers Dialogue: 0,0:34:34.84,0:34:40.68,Default,,0000,0000,0000,,but if your system is up 100% of the time\Nand performs excellently Dialogue: 0,0:34:40.68,0:34:43.36,Default,,0000,0000,0000,,but no one's using it, that's bad Dialogue: 0,0:34:43.36,0:34:49.28,Default,,0000,0000,0000,,so monitoring business metrics gives you a\Nlot more than unit test could ever give you Dialogue: 0,0:34:49.28,0:34:50.90,Default,,0000,0000,0000,,and then in our world Dialogue: 0,0:34:50.90,0:34:51.86,Default,,0000,0000,0000,,we focused on experiencing Dialogue: 0,0:34:51.86,0:34:56.26,Default,,0000,0000,0000,,no, you have to come up to front and say ten! Dialogue: 0,0:34:56.26,0:34:59.22,Default,,0000,0000,0000,,ok, ten minutes left Dialogue: 0,0:34:59.22,0:35:01.99,Default,,0000,0000,0000,,when I got to 6WunderKinder in Berlin Dialogue: 0,0:35:01.99,0:35:04.07,Default,,0000,0000,0000,,everyone was terrified to touch the system Dialogue: 0,0:35:04.07,0:35:08.71,Default,,0000,0000,0000,,because they hadn't created a really well-designed Dialogue: 0,0:35:08.71,0:35:12.01,Default,,0000,0000,0000,,but traditional monolithic API Dialogue: 0,0:35:12.01,0:35:13.54,Default,,0000,0000,0000,,so they had layers of abstractions Dialogue: 0,0:35:13.54,0:35:15.29,Default,,0000,0000,0000,,it was all kind of in one big thing Dialogue: 0,0:35:15.29,0:35:16.52,Default,,0000,0000,0000,,they had a huge database Dialogue: 0,0:35:16.52,0:35:19.72,Default,,0000,0000,0000,,and they were really, really scared to do\Nanything Dialogue: 0,0:35:19.72,0:35:22.19,Default,,0000,0000,0000,,so there's like one person who would deploy\Nanything Dialogue: 0,0:35:22.19,0:35:24.19,Default,,0000,0000,0000,,and everyone else was trying to work on other\Nprojects Dialogue: 0,0:35:24.19,0:35:25.95,Default,,0000,0000,0000,,and not touch it Dialogue: 0,0:35:25.95,0:35:27.86,Default,,0000,0000,0000,,but it was like the production system Dialogue: 0,0:35:27.86,0:35:29.96,Default,,0000,0000,0000,,you know so it wasn't really an option Dialogue: 0,0:35:29.96,0:35:31.88,Default,,0000,0000,0000,,so the first thing I did in my first week Dialogue: 0,0:35:31.88,0:35:34.92,Default,,0000,0000,0000,,is I got these graphs going Dialogue: 0,0:35:34.92,0:35:39.24,Default,,0000,0000,0000,,and this was, yeah, response time Dialogue: 0,0:35:39.24,0:35:42.75,Default,,0000,0000,0000,,and the first thing I did is I started turning\Noff servers Dialogue: 0,0:35:42.75,0:35:44.28,Default,,0000,0000,0000,,and just watching the graphs Dialogue: 0,0:35:44.28,0:35:47.75,Default,,0000,0000,0000,,and then, as I was turning off the servers Dialogue: 0,0:35:47.75,0:35:49.38,Default,,0000,0000,0000,,I went to the production database Dialogue: 0,0:35:49.38,0:35:54.22,Default,,0000,0000,0000,,and I did select, count, star from tasks Dialogue: 0,0:35:54.22,0:35:55.65,Default,,0000,0000,0000,,and we're a task management app Dialogue: 0,0:35:55.65,0:35:58.25,Default,,0000,0000,0000,,so we have hundreds of millions of tasks Dialogue: 0,0:35:58.25,0:36:00.91,Default,,0000,0000,0000,,and the whole thing crashed Dialogue: 0,0:36:00.91,0:36:04.12,Default,,0000,0000,0000,,and all the people were like AAAAH what's\Ngoing on Dialogue: 0,0:36:04.12,0:36:05.63,Default,,0000,0000,0000,,you know, and I said, it's no problem Dialogue: 0,0:36:05.63,0:36:08.54,Default,,0000,0000,0000,,I did this on purpose, I'll just make it come\Nback Dialogue: 0,0:36:08.54,0:36:10.12,Default,,0000,0000,0000,,which I did Dialogue: 0,0:36:10.12,0:36:11.08,Default,,0000,0000,0000,,and from that point on Dialogue: 0,0:36:11.08,0:36:13.35,Default,,0000,0000,0000,,like, really every day I would do something Dialogue: 0,0:36:13.35,0:36:16.100,Default,,0000,0000,0000,,which basically crash the system for just\Na moment Dialogue: 0,0:36:16.100,0:36:19.82,Default,,0000,0000,0000,,and really, like, we had way too many servers\Nin production Dialogue: 0,0:36:19.82,0:36:22.69,Default,,0000,0000,0000,,we were spending tens of thousands more Euros\Nper month Dialogue: 0,0:36:22.69,0:36:25.08,Default,,0000,0000,0000,,than we should have on the infrastructure Dialogue: 0,0:36:25.08,0:36:27.50,Default,,0000,0000,0000,,and I just started taking things away Dialogue: 0,0:36:27.50,0:36:28.82,Default,,0000,0000,0000,,and I would usually do it Dialogue: 0,0:36:28.82,0:36:30.58,Default,,0000,0000,0000,,instead of the responsible way, Dialogue: 0,0:36:30.58,0:36:31.63,Default,,0000,0000,0000,,like one server at a time Dialogue: 0,0:36:31.63,0:36:34.08,Default,,0000,0000,0000,,I would just remove all of them and start\Nadding them back Dialogue: 0,0:36:34.08,0:36:36.22,Default,,0000,0000,0000,,so for a moment everything was down Dialogue: 0,0:36:36.22,0:36:38.81,Default,,0000,0000,0000,,but after that we go to a point where Dialogue: 0,0:36:38.81,0:36:41.30,Default,,0000,0000,0000,,everyone on the team was absolutely comfortable Dialogue: 0,0:36:41.30,0:36:42.72,Default,,0000,0000,0000,,with the worst case scenario Dialogue: 0,0:36:42.72,0:36:45.18,Default,,0000,0000,0000,,of the system being completely down Dialogue: 0,0:36:45.18,0:36:47.99,Default,,0000,0000,0000,,so that we could, in a panic free way Dialogue: 0,0:36:47.99,0:36:51.06,Default,,0000,0000,0000,,just focus on bringing it up when it was bad Dialogue: 0,0:36:51.06,0:36:52.94,Default,,0000,0000,0000,,so now when you do a deployment Dialogue: 0,0:36:52.94,0:36:54.71,Default,,0000,0000,0000,,and you have your business metrics being measured Dialogue: 0,0:36:54.71,0:36:57.16,Default,,0000,0000,0000,,you know the important stuff is happening Dialogue: 0,0:36:57.16,0:37:00.56,Default,,0000,0000,0000,,and you know what to do when everything is\Ndown Dialogue: 0,0:37:00.56,0:37:02.51,Default,,0000,0000,0000,,you've experienced the worst thing that can\Nhappen Dialogue: 0,0:37:02.51,0:37:04.69,Default,,0000,0000,0000,,well the worst thing is like someone breaks\Nin Dialogue: 0,0:37:04.69,0:37:07.79,Default,,0000,0000,0000,,and steals all your stuff, steals all your\Nusers' phone numbers Dialogue: 0,0:37:07.79,0:37:10.14,Default,,0000,0000,0000,,and posts them online like SnapChat or something Dialogue: 0,0:37:10.14,0:37:13.65,Default,,0000,0000,0000,,but you've experienced all these potentially\Nhorrible things Dialogue: 0,0:37:13.65,0:37:16.92,Default,,0000,0000,0000,,and realized, eh, it's not so bad, I can deal\Nwith this Dialogue: 0,0:37:16.92,0:37:19.12,Default,,0000,0000,0000,,I know what do to Dialogue: 0,0:37:19.12,0:37:22.40,Default,,0000,0000,0000,,it allows you to start making bold moves Dialogue: 0,0:37:22.40,0:37:23.64,Default,,0000,0000,0000,,and that's what we all want right Dialogue: 0,0:37:23.64,0:37:28.74,Default,,0000,0000,0000,,we all want to be able to bravely go into\Nour systems Dialogue: 0,0:37:28.74,0:37:30.32,Default,,0000,0000,0000,,and do anything we think is right Dialogue: 0,0:37:30.32,0:37:33.87,Default,,0000,0000,0000,,so that's what I've been focusing on Dialogue: 0,0:37:33.87,0:37:36.77,Default,,0000,0000,0000,,we also do this thing called Canary in the\NCoal Mine deployments Dialogue: 0,0:37:36.77,0:37:38.100,Default,,0000,0000,0000,,which removes the fear, also Dialogue: 0,0:37:38.100,0:37:43.48,Default,,0000,0000,0000,,canary in the coalmine refers to a kind of\Nsad thing Dialogue: 0,0:37:43.48,0:37:46.87,Default,,0000,0000,0000,,about coal miners in the US Dialogue: 0,0:37:46.87,0:37:49.40,Default,,0000,0000,0000,,where they would send canaries into the mines Dialogue: 0,0:37:49.40,0:37:50.38,Default,,0000,0000,0000,,at various levels Dialogue: 0,0:37:50.38,0:37:54.17,Default,,0000,0000,0000,,and if the canary died they knew there was\Na problem Dialogue: 0,0:37:54.17,0:37:58.30,Default,,0000,0000,0000,,with the air Dialogue: 0,0:37:58.30,0:37:59.47,Default,,0000,0000,0000,,but in the software world Dialogue: 0,0:37:59.47,0:38:02.84,Default,,0000,0000,0000,,what this means is you have bunch of servers\Nrunning Dialogue: 0,0:38:02.84,0:38:06.40,Default,,0000,0000,0000,,or a bunch of, I don't know, clients running\Na certain version Dialogue: 0,0:38:06.40,0:38:09.79,Default,,0000,0000,0000,,and you start introducing new version incrementally Dialogue: 0,0:38:09.79,0:38:11.77,Default,,0000,0000,0000,,and watching the effects Dialogue: 0,0:38:11.77,0:38:13.21,Default,,0000,0000,0000,,so once you're measuring everything Dialogue: 0,0:38:13.21,0:38:14.68,Default,,0000,0000,0000,,and monitoring everything Dialogue: 0,0:38:14.68,0:38:17.04,Default,,0000,0000,0000,,you can also start doing these canary in the\Ncoalmine things Dialogue: 0,0:38:17.04,0:38:19.07,Default,,0000,0000,0000,,where you say OK I have a new version of this\Nservice Dialogue: 0,0:38:19.07,0:38:20.37,Default,,0000,0000,0000,,that I'm going to deploy Dialogue: 0,0:38:20.37,0:38:22.77,Default,,0000,0000,0000,,and I've got thirty servers running for it Dialogue: 0,0:38:22.77,0:38:25.87,Default,,0000,0000,0000,,but I'm going to change only five of them\Nnow Dialogue: 0,0:38:25.87,0:38:27.95,Default,,0000,0000,0000,,and see, like, does my error rate increase Dialogue: 0,0:38:27.95,0:38:30.18,Default,,0000,0000,0000,,or does my performance drop on those servers Dialogue: 0,0:38:30.18,0:38:33.88,Default,,0000,0000,0000,,or do people actually not successfully complete\Nthe task they're trying to do Dialogue: 0,0:38:33.88,0:38:34.65,Default,,0000,0000,0000,,on those servers Dialogue: 0,0:38:34.65,0:38:39.99,Default,,0000,0000,0000,,so, this also allows us the combination of\Nmonitoring everything Dialogue: 0,0:38:39.99,0:38:41.99,Default,,0000,0000,0000,,and these immutable deployments and everything Dialogue: 0,0:38:41.99,0:38:46.57,Default,,0000,0000,0000,,gives us the ability to gradually affect change\Nand not be afraid Dialogue: 0,0:38:46.57,0:38:48.46,Default,,0000,0000,0000,,so we roll out changes all day every day Dialogue: 0,0:38:48.46,0:38:53.82,Default,,0000,0000,0000,,because we don't fear that we're just going\Nto destroy the entire system all at once Dialogue: 0,0:38:53.82,0:38:55.88,Default,,0000,0000,0000,,so I think I have like five minutes left Dialogue: 0,0:38:55.88,0:39:00.24,Default,,0000,0000,0000,,uh, these are some things we're not necessarily\Ndoing yet Dialogue: 0,0:39:00.24,0:39:01.97,Default,,0000,0000,0000,,but they're some ideas that I have Dialogue: 0,0:39:01.97,0:39:04.94,Default,,0000,0000,0000,,that given some free time I will work on Dialogue: 0,0:39:04.94,0:39:08.70,Default,,0000,0000,0000,,and, they're probably more exciting Dialogue: 0,0:39:08.70,0:39:11.32,Default,,0000,0000,0000,,one is I talked about homeostatic regulation Dialogue: 0,0:39:11.32,0:39:13.58,Default,,0000,0000,0000,,and homeostasis Dialogue: 0,0:39:13.58,0:39:16.64,Default,,0000,0000,0000,,so I think we all understand the idea of you\Nknow homeostasis Dialogue: 0,0:39:16.64,0:39:20.02,Default,,0000,0000,0000,,and the fact that systems have different parts\Nthat do different roles Dialogue: 0,0:39:20.02,0:39:21.82,Default,,0000,0000,0000,,and can protect each other from each other Dialogue: 0,0:39:21.82,0:39:27.82,Default,,0000,0000,0000,,but, so this diagram is actually just some\Nrandom diagram Dialogue: 0,0:39:27.82,0:39:30.79,Default,,0000,0000,0000,,I copied and pasted off the AWS website Dialogue: 0,0:39:30.79,0:39:33.59,Default,,0000,0000,0000,,so it's not necessarily all that meaningful Dialogue: 0,0:39:33.59,0:39:36.28,Default,,0000,0000,0000,,except to show that every architecture Dialogue: 0,0:39:36.28,0:39:38.68,Default,,0000,0000,0000,,especially server based architectures Dialogue: 0,0:39:38.68,0:39:42.98,Default,,0000,0000,0000,,has a collection of services that play different\Nroles Dialogue: 0,0:39:42.98,0:39:45.08,Default,,0000,0000,0000,,and it almost looks like a person Dialogue: 0,0:39:45.08,0:39:46.99,Default,,0000,0000,0000,,you've got a brain and a heart and a liver Dialogue: 0,0:39:46.99,0:39:50.69,Default,,0000,0000,0000,,and all these things, right Dialogue: 0,0:39:50.69,0:39:53.01,Default,,0000,0000,0000,,what would it mean to actually implement Dialogue: 0,0:39:53.01,0:39:56.54,Default,,0000,0000,0000,,homeostatic regulation in a web service? Dialogue: 0,0:39:56.54,0:39:59.54,Default,,0000,0000,0000,,so that you have some controlling system Dialogue: 0,0:39:59.54,0:40:02.58,Default,,0000,0000,0000,,where the database will actually kill an app\Nserver Dialogue: 0,0:40:02.58,0:40:04.86,Default,,0000,0000,0000,,that is hurting it, for example Dialogue: 0,0:40:04.86,0:40:07.41,Default,,0000,0000,0000,,just kill it Dialogue: 0,0:40:07.41,0:40:08.77,Default,,0000,0000,0000,,I don't know yet, I don't know what that is Dialogue: 0,0:40:08.77,0:40:14.34,Default,,0000,0000,0000,,but some ideas about this stuff Dialogue: 0,0:40:14.34,0:40:15.57,Default,,0000,0000,0000,,I don't know if you've heard of these Dialogue: 0,0:40:15.57,0:40:19.69,Default,,0000,0000,0000,,NetFlix, do you have NetFlix in India yet? Dialogue: 0,0:40:19.69,0:40:23.50,Default,,0000,0000,0000,,probably not, unless you have a VPN, right Dialogue: 0,0:40:23.50,0:40:27.03,Default,,0000,0000,0000,,NetFlix has a really great cloud based architecture Dialogue: 0,0:40:27.03,0:40:29.84,Default,,0000,0000,0000,,they have this thing called Chaos Monkey they've\Ncreated Dialogue: 0,0:40:29.84,0:40:33.94,Default,,0000,0000,0000,,which goes through their system and randomly\Ndestroys Nodes Dialogue: 0,0:40:33.94,0:40:35.96,Default,,0000,0000,0000,,just crashes servers Dialogue: 0,0:40:35.96,0:40:39.68,Default,,0000,0000,0000,,and they did this because, when they were,\Nthey were early users of AWS Dialogue: 0,0:40:39.68,0:40:42.24,Default,,0000,0000,0000,,and when they went out initially with AWS,\Nservers were crashing Dialogue: 0,0:40:42.24,0:40:43.88,Default,,0000,0000,0000,,like it was still immature Dialogue: 0,0:40:43.88,0:40:46.28,Default,,0000,0000,0000,,so they said OK we still want to use this Dialogue: 0,0:40:46.28,0:40:49.77,Default,,0000,0000,0000,,and we'll build in stuff so that we can deal\Nwith the crashes Dialogue: 0,0:40:49.77,0:40:52.21,Default,,0000,0000,0000,,but we have to know it's gonna work when it\Ncrashes Dialogue: 0,0:40:52.21,0:40:55.41,Default,,0000,0000,0000,,so let's make crashing be part of production Dialogue: 0,0:40:55.41,0:40:58.21,Default,,0000,0000,0000,,so they actually have gotten really sophisticated\Nnow Dialogue: 0,0:40:58.21,0:41:00.50,Default,,0000,0000,0000,,and they will crash entire regions Dialogue: 0,0:41:00.50,0:41:01.82,Default,,0000,0000,0000,,cause they're in multiple data centers Dialogue: 0,0:41:01.82,0:41:03.57,Default,,0000,0000,0000,,so they'll say like, what would happen if\Nthis Dialogue: 0,0:41:03.57,0:41:06.48,Default,,0000,0000,0000,,data center went down, does the site still\Nstay up? Dialogue: 0,0:41:06.48,0:41:08.37,Default,,0000,0000,0000,,and they do this in production all the time Dialogue: 0,0:41:08.37,0:41:09.61,Default,,0000,0000,0000,,like they're crashing servers right now Dialogue: 0,0:41:09.61,0:41:11.13,Default,,0000,0000,0000,,it's really neat Dialogue: 0,0:41:11.13,0:41:14.08,Default,,0000,0000,0000,,another one that is inspirational in this\Nway Dialogue: 0,0:41:14.08,0:41:19.17,Default,,0000,0000,0000,,is Pinterest, they use AWS as well Dialogue: 0,0:41:19.17,0:41:22.45,Default,,0000,0000,0000,,and they have, AWS has this thing called Spot\NInstances Dialogue: 0,0:41:22.45,0:41:24.44,Default,,0000,0000,0000,,and I won't go into too much detail Dialogue: 0,0:41:24.44,0:41:25.91,Default,,0000,0000,0000,,because I don't have time Dialogue: 0,0:41:25.91,0:41:29.87,Default,,0000,0000,0000,,but Spot Instances allow you to effectively Dialogue: 0,0:41:29.87,0:41:36.21,Default,,0000,0000,0000,,bid on servers at a price that you are willing\Nto pay Dialogue: 0,0:41:36.21,0:41:39.56,Default,,0000,0000,0000,,so like if a usual server costs $0.20 per\Nminute Dialogue: 0,0:41:39.56,0:41:42.32,Default,,0000,0000,0000,,you can say, I'll give $0.15 per minute Dialogue: 0,0:41:42.32,0:41:45.38,Default,,0000,0000,0000,,and when excess capacity comes open Dialogue: 0,0:41:45.38,0:41:47.71,Default,,0000,0000,0000,,it's almost like a stock market Dialogue: 0,0:41:47.71,0:41:50.30,Default,,0000,0000,0000,,if $0.15 is the going price, you'll get a\Nserver Dialogue: 0,0:41:50.30,0:41:52.48,Default,,0000,0000,0000,,and it starts up and it runs what you want Dialogue: 0,0:41:52.48,0:41:54.40,Default,,0000,0000,0000,,but here's the cool thing Dialogue: 0,0:41:54.40,0:42:00.14,Default,,0000,0000,0000,,if the stock market goes and the price goes\Nhigher than you're willing to pay Dialogue: 0,0:42:00.14,0:42:03.23,Default,,0000,0000,0000,,Amazon will just turn off those servers Dialogue: 0,0:42:03.23,0:42:05.22,Default,,0000,0000,0000,,they're just dead, you don't have any warning Dialogue: 0,0:42:05.22,0:42:06.58,Default,,0000,0000,0000,,they're just dead Dialogue: 0,0:42:06.58,0:42:11.07,Default,,0000,0000,0000,,so Pinterest uses this for their production\Nservers Dialogue: 0,0:42:11.07,0:42:13.75,Default,,0000,0000,0000,,which means they save a lot of money Dialogue: 0,0:42:13.75,0:42:17.27,Default,,0000,0000,0000,,they're paying way under the average Amazon\Ncost for hosting Dialogue: 0,0:42:17.27,0:42:19.31,Default,,0000,0000,0000,,but the really cool thing in my opinion Dialogue: 0,0:42:19.31,0:42:21.17,Default,,0000,0000,0000,,is not the money they save but the fact that Dialogue: 0,0:42:21.17,0:42:26.04,Default,,0000,0000,0000,,like, what would you have to do to build a\Nfull system Dialogue: 0,0:42:26.04,0:42:29.12,Default,,0000,0000,0000,,where any node can and will die at any moment Dialogue: 0,0:42:29.12,0:42:31.26,Default,,0000,0000,0000,,and it's not even under your control Dialogue: 0,0:42:31.26,0:42:33.53,Default,,0000,0000,0000,,that's really exciting Dialogue: 0,0:42:33.53,0:42:36.26,Default,,0000,0000,0000,,so a simple thing you can do for homeostasis\Nthough Dialogue: 0,0:42:36.26,0:42:37.51,Default,,0000,0000,0000,,is you can just adjust Dialogue: 0,0:42:37.51,0:42:39.49,Default,,0000,0000,0000,,so in our world we have multiple nodes Dialogue: 0,0:42:39.49,0:42:40.97,Default,,0000,0000,0000,,and all these little services Dialogue: 0,0:42:40.97,0:42:42.57,Default,,0000,0000,0000,,we can scale each one independently Dialogue: 0,0:42:42.57,0:42:44.57,Default,,0000,0000,0000,,we're measuring everything Dialogue: 0,0:42:44.57,0:42:46.40,Default,,0000,0000,0000,,so Amazon has a thing called Auto Scaling Dialogue: 0,0:42:46.40,0:42:49.47,Default,,0000,0000,0000,,we don't use it, we do our own scaling Dialogue: 0,0:42:49.47,0:42:54.12,Default,,0000,0000,0000,,and we just do it based on volume and performance Dialogue: 0,0:42:54.12,0:42:57.87,Default,,0000,0000,0000,,now when you have a bunch of services like\Nthis Dialogue: 0,0:42:57.87,0:43:00.54,Default,,0000,0000,0000,,like, I don't know, maybe we have fifty different\Nservices now Dialogue: 0,0:43:00.54,0:43:03.23,Default,,0000,0000,0000,,that each play tiny little roles Dialogue: 0,0:43:03.23,0:43:07.21,Default,,0000,0000,0000,,it becomes difficult to figure out, like,\Nwhere things are Dialogue: 0,0:43:07.21,0:43:10.62,Default,,0000,0000,0000,,so we've started implementing zookeeper for\Nservice resolution Dialogue: 0,0:43:10.62,0:43:14.13,Default,,0000,0000,0000,,which means a service can come online and\Nsay Dialogue: 0,0:43:14.13,0:43:17.54,Default,,0000,0000,0000,,I'm the reminder service version 2.3 Dialogue: 0,0:43:17.54,0:43:19.35,Default,,0000,0000,0000,,and then tell a central guardian Dialogue: 0,0:43:19.35,0:43:21.98,Default,,0000,0000,0000,,and the zookeeper can then route traffic to\Nit Dialogue: 0,0:43:21.98,0:43:24.02,Default,,0000,0000,0000,,probably too detailed for now Dialogue: 0,0:43:24.02,0:43:28.42,Default,,0000,0000,0000,,I'm gonna skip over some stuff real quick Dialogue: 0,0:43:28.42,0:43:29.50,Default,,0000,0000,0000,,but I want to talk about this one Dialogue: 0,0:43:29.50,0:43:33.74,Default,,0000,0000,0000,,if, did the Nordic Ruby, no, Nordic Ruby talks\Nnever go online Dialogue: 0,0:43:33.74,0:43:35.16,Default,,0000,0000,0000,,so you can never see this talk Dialogue: 0,0:43:35.16,0:43:36.63,Default,,0000,0000,0000,,sorry Dialogue: 0,0:43:36.63,0:43:41.50,Default,,0000,0000,0000,,at Nordic Ruby Reginald Braithwaite did a\Nreally cool talk Dialogue: 0,0:43:41.50,0:43:44.13,Default,,0000,0000,0000,,on like challenges of the Ruby language Dialogue: 0,0:43:44.13,0:43:45.38,Default,,0000,0000,0000,,and he made this statement Dialogue: 0,0:43:45.38,0:43:48.87,Default,,0000,0000,0000,,Ruby has beautiful but static coupling Dialogue: 0,0:43:48.87,0:43:51.27,Default,,0000,0000,0000,,which was really strange Dialogue: 0,0:43:51.27,0:43:52.99,Default,,0000,0000,0000,,but basically he was making the same point\Nthat Dialogue: 0,0:43:52.99,0:43:53.95,Default,,0000,0000,0000,,I was talking about earlier Dialogue: 0,0:43:53.95,0:43:59.21,Default,,0000,0000,0000,,that, like Ruby creates a bunch of ways that\Nyou can couple Dialogue: 0,0:43:59.21,0:44:01.20,Default,,0000,0000,0000,,your system together Dialogue: 0,0:44:01.20,0:44:02.73,Default,,0000,0000,0000,,that kind of screw you in the end Dialogue: 0,0:44:02.73,0:44:03.96,Default,,0000,0000,0000,,but they're really beautiful to use Dialogue: 0,0:44:03.96,0:44:09.82,Default,,0000,0000,0000,,but, like, Ruby can really lead to some deep\Ncrazy coupling Dialogue: 0,0:44:09.82,0:44:14.09,Default,,0000,0000,0000,,and so he presented this idea of bind by contract Dialogue: 0,0:44:14.09,0:44:17.93,Default,,0000,0000,0000,,and bind by contract, in a Ruby sense Dialogue: 0,0:44:17.93,0:44:22.54,Default,,0000,0000,0000,,would be, like, I have a class that has a\Nmethod Dialogue: 0,0:44:22.54,0:44:26.41,Default,,0000,0000,0000,,that takes these parameters under these conditions Dialogue: 0,0:44:26.41,0:44:29.42,Default,,0000,0000,0000,,and I can kind of put it into my VM Dialogue: 0,0:44:29.42,0:44:31.100,Default,,0000,0000,0000,,and whenever someone needs to have a functionality\Nlike that Dialogue: 0,0:44:31.100,0:44:34.65,Default,,0000,0000,0000,,it will be automatically bound together Dialogue: 0,0:44:34.65,0:44:36.59,Default,,0000,0000,0000,,by the fact that it can do that thing Dialogue: 0,0:44:36.59,0:44:40.68,Default,,0000,0000,0000,,and instead of how we tend to use Ruby and\NJava and other languages Dialogue: 0,0:44:40.68,0:44:42.91,Default,,0000,0000,0000,,I have a class with a method name I'm going\Nto call it Dialogue: 0,0:44:42.91,0:44:45.32,Default,,0000,0000,0000,,right, that's coupling Dialogue: 0,0:44:45.32,0:44:48.01,Default,,0000,0000,0000,,but he proposed this idea of this decoupled\Nsystem Dialogue: 0,0:44:48.01,0:44:50.61,Default,,0000,0000,0000,,where you just say I need a functionality\Nlike this Dialogue: 0,0:44:50.61,0:44:53.39,Default,,0000,0000,0000,,that works under the conditions that I have\Npresent Dialogue: 0,0:44:53.39,0:44:55.37,Default,,0000,0000,0000,,so this lead me to this idea Dialogue: 0,0:44:55.37,0:44:59.06,Default,,0000,0000,0000,,and this may be like way too weird, I don't\Nknow Dialogue: 0,0:44:59.06,0:45:02.57,Default,,0000,0000,0000,,what if in your web application your routes\Nfile Dialogue: 0,0:45:02.57,0:45:08.13,Default,,0000,0000,0000,,for your services read like a functional pattern\Nmatching syntax Dialogue: 0,0:45:08.13,0:45:11.20,Default,,0000,0000,0000,,so like if you've ever used Erlang or Haskell\Nor Scala Dialogue: 0,0:45:11.20,0:45:14.51,Default,,0000,0000,0000,,any of these things that have functional pattern\Nmatching Dialogue: 0,0:45:14.51,0:45:18.68,Default,,0000,0000,0000,,what if you could then route to different\Nservices Dialogue: 0,0:45:18.68,0:45:20.88,Default,,0000,0000,0000,,across a bunch of different services Dialogue: 0,0:45:20.88,0:45:23.45,Default,,0000,0000,0000,,based on contract Dialogue: 0,0:45:23.45,0:45:27.28,Default,,0000,0000,0000,,now I have zero time left Dialogue: 0,0:45:27.28,0:45:29.03,Default,,0000,0000,0000,,but I'm just gonna keep talking, cause I'm\Nmean Dialogue: 0,0:45:29.03,0:45:30.35,Default,,0000,0000,0000,,oh wait I'm not allowed to be mean Dialogue: 0,0:45:30.35,0:45:31.58,Default,,0000,0000,0000,,because of the code of contact Dialogue: 0,0:45:31.58,0:45:34.76,Default,,0000,0000,0000,,so I'll wrap up Dialogue: 0,0:45:34.76,0:45:38.75,Default,,0000,0000,0000,,so this is an idea that I've started working\Non as well Dialogue: 0,0:45:38.75,0:45:40.54,Default,,0000,0000,0000,,where I would actually write an Erlang service Dialogue: 0,0:45:40.54,0:45:42.70,Default,,0000,0000,0000,,with this sort of functional pattern matching Dialogue: 0,0:45:42.70,0:45:45.59,Default,,0000,0000,0000,,but have it be routing in really fast real\Ntime Dialogue: 0,0:45:45.59,0:45:48.54,Default,,0000,0000,0000,,through back end services that support it Dialogue: 0,0:45:48.54,0:45:50.65,Default,,0000,0000,0000,,one more thing I just want to show you real\Nquick Dialogue: 0,0:45:50.65,0:45:53.87,Default,,0000,0000,0000,,that I am working on and I want to show you Dialogue: 0,0:45:53.87,0:45:57.91,Default,,0000,0000,0000,,because I want you to help me Dialogue: 0,0:45:57.91,0:46:00.69,Default,,0000,0000,0000,,has anyone used JSON schema? Dialogue: 0,0:46:00.69,0:46:05.89,Default,,0000,0000,0000,,OK, you people are my friends for the rest\Nof the conference Dialogue: 0,0:46:05.89,0:46:08.47,Default,,0000,0000,0000,,in a system where you have all these things\Ntalking to each other Dialogue: 0,0:46:08.47,0:46:11.22,Default,,0000,0000,0000,,you do need a way to validate the inputs and\Noutputs Dialogue: 0,0:46:11.22,0:46:16.23,Default,,0000,0000,0000,,but I don't want to generate code that parses\Nand creates JSON Dialogue: 0,0:46:16.23,0:46:21.18,Default,,0000,0000,0000,,I don't want to do something in real time\Nthat intercepts my Dialogue: 0,0:46:21.18,0:46:24.22,Default,,0000,0000,0000,,kind of traffic, so there's this thing called\NJSON schema Dialogue: 0,0:46:24.22,0:46:27.22,Default,,0000,0000,0000,,that allows you to, in a completely decoupled\Nway Dialogue: 0,0:46:27.22,0:46:30.72,Default,,0000,0000,0000,,specify JSON documents and how they should\Ninteract Dialogue: 0,0:46:30.72,0:46:35.85,Default,,0000,0000,0000,,and I am working on a new thing that's called\NKlagen Dialogue: 0,0:46:35.85,0:46:38.30,Default,,0000,0000,0000,,which is the German word for complain Dialogue: 0,0:46:38.30,0:46:42.42,Default,,0000,0000,0000,,it's written in Scala, so if anyone wants\Nto pair up on some Scala stuff Dialogue: 0,0:46:42.42,0:46:47.70,Default,,0000,0000,0000,,what it will be is a high performance asynchronous\NJSON schema validation middleware Dialogue: 0,0:46:47.70,0:46:52.75,Default,,0000,0000,0000,,so if that's interesting to anyone, even if\Nyou don't know Scala or JSON schema Dialogue: 0,0:46:52.75,0:46:54.03,Default,,0000,0000,0000,,please let me know Dialogue: 0,0:46:54.03,0:46:57.10,Default,,0000,0000,0000,,and I believe I'm out of time so I'm just\Ngonna end there Dialogue: 0,0:46:57.10,0:46:58.61,Default,,0000,0000,0000,,am I right? I'm right, yes Dialogue: 0,0:46:58.61,0:47:01.53,Default,,0000,0000,0000,,so thank you very much, and let's talk during\Nthe conference