[Script Info] Title: [Events] Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text Dialogue: 0,0:00:18.74,0:00:19.87,Default,,0000,0000,0000,,DAVID HEINEMEIER HANSSON: That any better? Dialogue: 0,0:00:19.87,0:00:22.46,Default,,0000,0000,0000,,Oh, there we go. Woo. Dialogue: 0,0:00:22.46,0:00:27.09,Default,,0000,0000,0000,,Software's hard, as you can see. Hardware,\Ntoo. Dialogue: 0,0:00:27.09,0:00:33.27,Default,,0000,0000,0000,,So last year I had the personal pleasure of Dialogue: 0,0:00:33.27,0:00:36.62,Default,,0000,0000,0000,,celebrating ten years of working with Ruby\Nand ten Dialogue: 0,0:00:36.62,0:00:40.42,Default,,0000,0000,0000,,years of working with Rails. But this year,\NI Dialogue: 0,0:00:40.42,0:00:44.36,Default,,0000,0000,0000,,have a much more interesting anniversary,\Nwhich is ten Dialogue: 0,0:00:44.36,0:00:48.21,Default,,0000,0000,0000,,years of sharing Ruby on Rails with all of Dialogue: 0,0:00:48.21,0:00:51.24,Default,,0000,0000,0000,,you and everyone who's been using it over\Nthe Dialogue: 0,0:00:51.24,0:00:55.00,Default,,0000,0000,0000,,past decade. Dialogue: 0,0:00:55.00,0:00:56.92,Default,,0000,0000,0000,,The picture in the background is actually\Nfrom almost Dialogue: 0,0:00:56.92,0:00:59.03,Default,,0000,0000,0000,,exactly this time, where I gave the very first Dialogue: 0,0:00:59.03,0:01:03.77,Default,,0000,0000,0000,,presentation on Ruby on Rails at a Danish\Nuniversity Dialogue: 0,0:01:03.77,0:01:06.10,Default,,0000,0000,0000,,ten years ago. Dialogue: 0,0:01:06.10,0:01:07.78,Default,,0000,0000,0000,,Ten years ago, I had to talk a lot Dialogue: 0,0:01:07.78,0:01:12.21,Default,,0000,0000,0000,,about what is MVC, for example. Today, not\Nso Dialogue: 0,0:01:12.21,0:01:14.41,Default,,0000,0000,0000,,much. There's a lot of things that over the Dialogue: 0,0:01:14.41,0:01:17.98,Default,,0000,0000,0000,,past ten years, things we were worried about\Nin Dialogue: 0,0:01:17.98,0:01:20.92,Default,,0000,0000,0000,,the beginning, sort of leveling up as a community Dialogue: 0,0:01:20.92,0:01:23.63,Default,,0000,0000,0000,,and as, as programmers, that just aren't relevant\Nanymore. Dialogue: 0,0:01:23.63,0:01:25.28,Default,,0000,0000,0000,,We're just taking all that stuff for granted. Dialogue: 0,0:01:25.28,0:01:27.53,Default,,0000,0000,0000,,Which is awesome. We get to care about a Dialogue: 0,0:01:27.53,0:01:30.19,Default,,0000,0000,0000,,lot of other stuff. Dialogue: 0,0:01:30.19,0:01:32.09,Default,,0000,0000,0000,,But as I look back over the past ten Dialogue: 0,0:01:32.09,0:01:35.46,Default,,0000,0000,0000,,years, which is pretty much the majority of\Nmy Dialogue: 0,0:01:35.46,0:01:40.08,Default,,0000,0000,0000,,adult life, I've been working on Ruby on Rails. Dialogue: 0,0:01:40.08,0:01:42.78,Default,,0000,0000,0000,,It's fun to look back even further. I think Dialogue: 0,0:01:42.78,0:01:49.52,Default,,0000,0000,0000,,there's a common misconception that anybody\Nwho ends up Dialogue: 0,0:01:49.52,0:01:52.70,Default,,0000,0000,0000,,creating something like Rails or Dialogue: 0,0:01:52.70,0:01:54.87,Default,,0000,0000,0000,,doing something else within Dialogue: 0,0:01:54.87,0:01:56.53,Default,,0000,0000,0000,,software development or computer science, Dialogue: 0,0:01:56.53,0:01:57.25,Default,,0000,0000,0000,,well, they must have Dialogue: 0,0:01:57.25,0:02:00.69,Default,,0000,0000,0000,,been programming since they were five years\Nold, right. Dialogue: 0,0:02:00.69,0:02:03.72,Default,,0000,0000,0000,,The whole notion of a hacker is somebody who, Dialogue: 0,0:02:03.72,0:02:07.67,Default,,0000,0000,0000,,who sort of got their first computer twenty\Nyears Dialogue: 0,0:02:07.67,0:02:11.90,Default,,0000,0000,0000,,ago and was just programming the entire time.\NWell. Dialogue: 0,0:02:11.90,0:02:13.31,Default,,0000,0000,0000,,That wasn't me. Dialogue: 0,0:02:13.31,0:02:15.65,Default,,0000,0000,0000,,I did not learn to program when I was Dialogue: 0,0:02:15.65,0:02:19.26,Default,,0000,0000,0000,,five years old. I didn't learn to program\Nuntil Dialogue: 0,0:02:19.26,0:02:23.58,Default,,0000,0000,0000,,I was closer to twenty. I'd been interested\Nin Dialogue: 0,0:02:23.58,0:02:25.85,Default,,0000,0000,0000,,computers for a long time, but it wasn't really Dialogue: 0,0:02:25.85,0:02:30.48,Default,,0000,0000,0000,,until the late '90s, early 2000 that I dove Dialogue: 0,0:02:30.48,0:02:32.51,Default,,0000,0000,0000,,into computer programming as something that\NI was going Dialogue: 0,0:02:32.51,0:02:32.78,Default,,0000,0000,0000,,to do. Dialogue: 0,0:02:32.78,0:02:34.12,Default,,0000,0000,0000,,I had a lot of friends who were doing Dialogue: 0,0:02:34.12,0:02:37.75,Default,,0000,0000,0000,,it. I knew a lot of programmers. But somehow Dialogue: 0,0:02:37.75,0:02:41.86,Default,,0000,0000,0000,,it, it sort of never, never caught on. Before Dialogue: 0,0:02:41.86,0:02:44.38,Default,,0000,0000,0000,,I started writing software that I needed for\Nmyself, Dialogue: 0,0:02:44.38,0:02:47.19,Default,,0000,0000,0000,,and before I found sort of a place in Dialogue: 0,0:02:47.19,0:02:49.73,Default,,0000,0000,0000,,the software world for that to happen. Dialogue: 0,0:02:49.73,0:02:53.22,Default,,0000,0000,0000,,And the reason I, I say that is, is Dialogue: 0,0:02:53.22,0:02:56.08,Default,,0000,0000,0000,,I've seen a number of essays of like, what Dialogue: 0,0:02:56.08,0:02:58.30,Default,,0000,0000,0000,,is a true hacker, and, and as a true Dialogue: 0,0:02:58.30,0:03:01.64,Default,,0000,0000,0000,,hacker, one of the things that keeps being\Nthrown Dialogue: 0,0:03:01.64,0:03:03.53,Default,,0000,0000,0000,,out is those ten years, right. You should\Nhave Dialogue: 0,0:03:03.53,0:03:05.45,Default,,0000,0000,0000,,been programming for ten years already, Dialogue: 0,0:03:05.45,0:03:07.15,Default,,0000,0000,0000,,otherwise you're way behind. Dialogue: 0,0:03:07.15,0:03:11.74,Default,,0000,0000,0000,,Well, I learned to program about three years\Nbefore Dialogue: 0,0:03:11.74,0:03:17.30,Default,,0000,0000,0000,,I released Ruby on Rails. Turned out fine. Dialogue: 0,0:03:17.30,0:03:23.15,Default,,0000,0000,0000,,And I don't say that as, like, it was Dialogue: 0,0:03:23.15,0:03:24.96,Default,,0000,0000,0000,,because I grew up on a farm and didn't Dialogue: 0,0:03:24.96,0:03:30.82,Default,,0000,0000,0000,,know what a computer was. This is me in, Dialogue: 0,0:03:30.82,0:03:33.76,Default,,0000,0000,0000,,in the center there with the stick, and the Dialogue: 0,0:03:33.76,0:03:39.01,Default,,0000,0000,0000,,blue shirt in 1985. These are the kids that Dialogue: 0,0:03:39.01,0:03:41.20,Default,,0000,0000,0000,,were living in my neighborhood. Dialogue: 0,0:03:41.20,0:03:43.56,Default,,0000,0000,0000,,In 1985 I got introduced to my, my first Dialogue: 0,0:03:43.56,0:03:49.68,Default,,0000,0000,0000,,computer. And I was about five years old.\NAnd Dialogue: 0,0:03:49.68,0:03:54.21,Default,,0000,0000,0000,,I got introduced to computers through gaming.\NSort of, Dialogue: 0,0:03:54.21,0:03:56.94,Default,,0000,0000,0000,,we were playing ninjas in the streets around\Nour Dialogue: 0,0:03:56.94,0:04:02.27,Default,,0000,0000,0000,,houses, and then we'd play ninjas on the box. Dialogue: 0,0:04:02.27,0:04:03.79,Default,,0000,0000,0000,,And I found it fascinating right from the\Nget Dialogue: 0,0:04:03.79,0:04:06.20,Default,,0000,0000,0000,,go, right. Computers were really Dialogue: 0,0:04:06.20,0:04:08.07,Default,,0000,0000,0000,,fascinating and games really Dialogue: 0,0:04:08.07,0:04:12.48,Default,,0000,0000,0000,,captured my imagination early on. I remember,\Nat, at Dialogue: 0,0:04:12.48,0:04:14.50,Default,,0000,0000,0000,,that time, there were certain, lots of parents\Nwere Dialogue: 0,0:04:14.50,0:04:15.86,Default,,0000,0000,0000,,like, well make sure you get out and play Dialogue: 0,0:04:15.86,0:04:18.23,Default,,0000,0000,0000,,a lot. Because you don't want to spend your, Dialogue: 0,0:04:18.23,0:04:19.42,Default,,0000,0000,0000,,or wasting your time, that was the, that was Dialogue: 0,0:04:19.42,0:04:22.22,Default,,0000,0000,0000,,the word, wasting your time in front of computers Dialogue: 0,0:04:22.22,0:04:23.34,Default,,0000,0000,0000,,inside, right. Dialogue: 0,0:04:23.34,0:04:25.72,Default,,0000,0000,0000,,Well, I really did want to waste my time Dialogue: 0,0:04:25.72,0:04:27.95,Default,,0000,0000,0000,,in front of computers. And this was the computer Dialogue: 0,0:04:27.95,0:04:34.47,Default,,0000,0000,0000,,to have in 1985, in our neighborhood. But\Nwe Dialogue: 0,0:04:34.47,0:04:36.42,Default,,0000,0000,0000,,couldn't afford a computer like that. There\Nwas only Dialogue: 0,0:04:36.42,0:04:37.84,Default,,0000,0000,0000,,one guy in the whole neighborhood that had\Na Dialogue: 0,0:04:37.84,0:04:39.41,Default,,0000,0000,0000,,computer like that. So we all shared it and Dialogue: 0,0:04:39.41,0:04:43.33,Default,,0000,0000,0000,,we all played Yeah, Kung Fu, in turn. Dialogue: 0,0:04:43.33,0:04:47.100,Default,,0000,0000,0000,,But then the next year, so, I, I couldn't Dialogue: 0,0:04:47.100,0:04:52.40,Default,,0000,0000,0000,,afford this computer, but my dad somehow,\Nhe was Dialogue: 0,0:04:52.40,0:04:56.55,Default,,0000,0000,0000,,fixing TVs and stereos, he traded a stereo\Nwith Dialogue: 0,0:04:56.55,0:05:00.03,Default,,0000,0000,0000,,this guy for this other weird computer, which\Nwas Dialogue: 0,0:05:00.03,0:05:04.14,Default,,0000,0000,0000,,an Abstraught 646. Dialogue: 0,0:05:04.14,0:05:06.42,Default,,0000,0000,0000,,And I was really excited. It didn't actually\Nplay Dialogue: 0,0:05:06.42,0:05:08.30,Default,,0000,0000,0000,,Yeah, Kung Fu. I was a little disappointed\Nby Dialogue: 0,0:05:08.30,0:05:10.69,Default,,0000,0000,0000,,that, but it had some other crappier games.\NAnyway, Dialogue: 0,0:05:10.69,0:05:12.57,Default,,0000,0000,0000,,it was a computer. And that was sort of Dialogue: 0,0:05:12.57,0:05:15.21,Default,,0000,0000,0000,,my first introduction to, to computers, six\Nyears old. Dialogue: 0,0:05:15.21,0:05:17.55,Default,,0000,0000,0000,,And, and I tried to learn programming. Dialogue: 0,0:05:17.55,0:05:20.84,Default,,0000,0000,0000,,I, I got a magazine and, at the back Dialogue: 0,0:05:20.84,0:05:22.69,Default,,0000,0000,0000,,of these magazines back then, there were programs\Nyou Dialogue: 0,0:05:22.69,0:05:24.96,Default,,0000,0000,0000,,could type in. And I was like, wow, this Dialogue: 0,0:05:24.96,0:05:27.05,Default,,0000,0000,0000,,is, this is amazing. I can control this computer. Dialogue: 0,0:05:27.05,0:05:31.25,Default,,0000,0000,0000,,So I built my first information technology\Nsystem. Dialogue: 0,0:05:31.25,0:05:36.54,Default,,0000,0000,0000,,It was messages to my mom of where I Dialogue: 0,0:05:36.54,0:05:38.30,Default,,0000,0000,0000,,went, where, I had this clever system that\Nwould Dialogue: 0,0:05:38.30,0:05:41.46,Default,,0000,0000,0000,,really optimize the fact that writing a message\Nof Dialogue: 0,0:05:41.46,0:05:43.18,Default,,0000,0000,0000,,where I went and, and when I was going Dialogue: 0,0:05:43.18,0:05:45.08,Default,,0000,0000,0000,,to be home, it was too complicated. It would Dialogue: 0,0:05:45.08,0:05:46.84,Default,,0000,0000,0000,,be much easier if I just wrote a little Dialogue: 0,0:05:46.84,0:05:49.73,Default,,0000,0000,0000,,note where I gave her the location on the Dialogue: 0,0:05:49.73,0:05:52.42,Default,,0000,0000,0000,,tape that she had to fast forward to, and Dialogue: 0,0:05:52.42,0:05:54.37,Default,,0000,0000,0000,,then she could read where I was. Dialogue: 0,0:05:54.37,0:05:56.51,Default,,0000,0000,0000,,I thought, man this is so clever. I just Dialogue: 0,0:05:56.51,0:05:59.05,Default,,0000,0000,0000,,have to write down two twenty-eight, and then\NI Dialogue: 0,0:05:59.05,0:06:01.26,Default,,0000,0000,0000,,could preprogram that note, and she'll never\Nknow I Dialogue: 0,0:06:01.26,0:06:07.41,Default,,0000,0000,0000,,was over at Peter's house playing Yeah, Kung\NFu. Dialogue: 0,0:06:07.41,0:06:10.36,Default,,0000,0000,0000,,That really wasn't programming, right. I just\Ntyped some Dialogue: 0,0:06:10.36,0:06:12.07,Default,,0000,0000,0000,,stuff in. I didn't know what the hell I Dialogue: 0,0:06:12.07,0:06:14.92,Default,,0000,0000,0000,,was doing. I just somehow figured out print,\NOK, Dialogue: 0,0:06:14.92,0:06:16.81,Default,,0000,0000,0000,,that puts stuff up on the screen. That was, Dialogue: 0,0:06:16.81,0:06:18.26,Default,,0000,0000,0000,,that was the extent of it, right. But it Dialogue: 0,0:06:18.26,0:06:20.85,Default,,0000,0000,0000,,was my first stab at programming. And I, and Dialogue: 0,0:06:20.85,0:06:22.82,Default,,0000,0000,0000,,I, it kind of failed. Dialogue: 0,0:06:22.82,0:06:25.31,Default,,0000,0000,0000,,That was the extent of my programming, that\NI Dialogue: 0,0:06:25.31,0:06:28.72,Default,,0000,0000,0000,,knew how to fast-forward to a pre-recorded\Nmessage. Dialogue: 0,0:06:28.72,0:06:31.36,Default,,0000,0000,0000,,Not that great. Dialogue: 0,0:06:31.36,0:06:36.07,Default,,0000,0000,0000,,So a couple years later, late 80s, I saw Dialogue: 0,0:06:36.07,0:06:39.23,Default,,0000,0000,0000,,this game for the first time. Battle Squadrant.\NAnd Dialogue: 0,0:06:39.23,0:06:43.50,Default,,0000,0000,0000,,I remember thinking, holy shit, these graphics\Nare amazing. Dialogue: 0,0:06:43.50,0:06:47.05,Default,,0000,0000,0000,,How can they make this? This looks so good, Dialogue: 0,0:06:47.05,0:06:50.63,Default,,0000,0000,0000,,when you were used to a Commodore 64, the Dialogue: 0,0:06:50.63,0:06:53.80,Default,,0000,0000,0000,,graphics of the Amiga 500, which is mind blowing, Dialogue: 0,0:06:53.80,0:06:56.53,Default,,0000,0000,0000,,right. And once again, I felt this, like,\Nwow, Dialogue: 0,0:06:56.53,0:06:58.62,Default,,0000,0000,0000,,wouldn't it be amazing to be part of that? Dialogue: 0,0:06:58.62,0:07:00.72,Default,,0000,0000,0000,,To be able to create something like that? Dialogue: 0,0:07:00.72,0:07:03.05,Default,,0000,0000,0000,,I'd love to make games. Dialogue: 0,0:07:03.05,0:07:06.24,Default,,0000,0000,0000,,So I sort of started looking around, and,\Nand Dialogue: 0,0:07:06.24,0:07:08.39,Default,,0000,0000,0000,,I found this thing called Amus. I don't know, Dialogue: 0,0:07:08.39,0:07:12.66,Default,,0000,0000,0000,,has anybody here ever programmed in Amus?\NNot a Dialogue: 0,0:07:12.66,0:07:16.43,Default,,0000,0000,0000,,single hand. OK. Must have been a very European Dialogue: 0,0:07:16.43,0:07:16.85,Default,,0000,0000,0000,,thing. Dialogue: 0,0:07:16.85,0:07:18.90,Default,,0000,0000,0000,,But it was sort of a real programming environment, Dialogue: 0,0:07:18.90,0:07:21.80,Default,,0000,0000,0000,,and, and I got the box, and sort of Dialogue: 0,0:07:21.80,0:07:23.99,Default,,0000,0000,0000,,my English was a little, not that great, so Dialogue: 0,0:07:23.99,0:07:25.89,Default,,0000,0000,0000,,I was sort of just reading through it and Dialogue: 0,0:07:25.89,0:07:27.31,Default,,0000,0000,0000,,trying to find the code. And it was all Dialogue: 0,0:07:27.31,0:07:30.93,Default,,0000,0000,0000,,about sprites and vectors and ifs and variables,\Nand Dialogue: 0,0:07:30.93,0:07:32.57,Default,,0000,0000,0000,,it, it didn't make any sense to me at Dialogue: 0,0:07:32.57,0:07:32.81,Default,,0000,0000,0000,,all. Dialogue: 0,0:07:32.81,0:07:34.78,Default,,0000,0000,0000,,So I thought, eh this is a little bit Dialogue: 0,0:07:34.78,0:07:37.55,Default,,0000,0000,0000,,too hard. Thankfully, there was something\Ncalled Easy Amos, Dialogue: 0,0:07:37.55,0:07:40.59,Default,,0000,0000,0000,,right. Oh, wow, that's gonna be great. This\Nother Dialogue: 0,0:07:40.59,0:07:42.01,Default,,0000,0000,0000,,one was too hard. Now I just have to Dialogue: 0,0:07:42.01,0:07:43.43,Default,,0000,0000,0000,,do the easy one. Dialogue: 0,0:07:43.43,0:07:46.94,Default,,0000,0000,0000,,Unfortunately, in Easy Amos, it was still\Nprogramming, and Dialogue: 0,0:07:46.94,0:07:49.33,Default,,0000,0000,0000,,it still had conditionals and variables and\Nall these Dialogue: 0,0:07:49.33,0:07:52.10,Default,,0000,0000,0000,,other things I just did not understand. I,\Nit's Dialogue: 0,0:07:52.10,0:07:55.10,Default,,0000,0000,0000,,so funny, because, once you learn something,\Nit can Dialogue: 0,0:07:55.10,0:07:56.75,Default,,0000,0000,0000,,sometimes be hard to go back and think, like, Dialogue: 0,0:07:56.75,0:07:58.34,Default,,0000,0000,0000,,how was it before I knew how to do Dialogue: 0,0:07:58.34,0:08:02.13,Default,,0000,0000,0000,,this? But I distinctly remember, why would\Nyou have Dialogue: 0,0:08:02.13,0:08:03.13,Default,,0000,0000,0000,,a variable? Dialogue: 0,0:08:03.13,0:08:05.14,Default,,0000,0000,0000,,Like, if you just assign something once, why\Nwould Dialogue: 0,0:08:05.14,0:08:06.70,Default,,0000,0000,0000,,you ever sort of want to change that? Why Dialogue: 0,0:08:06.70,0:08:08.28,Default,,0000,0000,0000,,does it have to be a space. Why can't Dialogue: 0,0:08:08.28,0:08:09.54,Default,,0000,0000,0000,,it just be the thing. Like, I did not Dialogue: 0,0:08:09.54,0:08:11.85,Default,,0000,0000,0000,,get the concept of variables. Dialogue: 0,0:08:11.85,0:08:14.54,Default,,0000,0000,0000,,And this is at, I don't know, age ten Dialogue: 0,0:08:14.54,0:08:17.60,Default,,0000,0000,0000,,or whatever. So, still not getting programming.\NIt's still Dialogue: 0,0:08:17.60,0:08:21.86,Default,,0000,0000,0000,,not making any sense to me. So I gave Dialogue: 0,0:08:21.86,0:08:24.51,Default,,0000,0000,0000,,up on that, too. Dialogue: 0,0:08:24.51,0:08:28.66,Default,,0000,0000,0000,,Then, in 1993, I went to something called\Nthe Dialogue: 0,0:08:28.66,0:08:32.80,Default,,0000,0000,0000,,Gathering. The Gathering three, which was\Na big demo Dialogue: 0,0:08:32.80,0:08:37.34,Default,,0000,0000,0000,,party in Denmark, where people from all over\NEurope, Dialogue: 0,0:08:37.34,0:08:39.42,Default,,0000,0000,0000,,maybe some from the U.S. as well, would gather Dialogue: 0,0:08:39.42,0:08:42.29,Default,,0000,0000,0000,,to, to show off their skills of creating these Dialogue: 0,0:08:42.29,0:08:43.19,Default,,0000,0000,0000,,demos. Dialogue: 0,0:08:43.19,0:08:46.99,Default,,0000,0000,0000,,And demos were basically just, like, little\Nmusic videos Dialogue: 0,0:08:46.99,0:08:49.67,Default,,0000,0000,0000,,with computer graphics. And I thought that\Nwas really Dialogue: 0,0:08:49.67,0:08:52.68,Default,,0000,0000,0000,,awesome. And, again, I got this sensation\Nof, wow, Dialogue: 0,0:08:52.68,0:08:56.04,Default,,0000,0000,0000,,that's amazing. People are creating these\Nsequences, they look Dialogue: 0,0:08:56.04,0:08:58.43,Default,,0000,0000,0000,,really good. This is, this is awesome. I'd\Nlove Dialogue: 0,0:08:58.43,0:08:59.54,Default,,0000,0000,0000,,to be a part of that. Dialogue: 0,0:08:59.54,0:09:03.04,Default,,0000,0000,0000,,This is '93, so I'm, I'm fourteen. And this Dialogue: 0,0:09:03.04,0:09:06.12,Default,,0000,0000,0000,,demo party, and then I met pretty much everybody Dialogue: 0,0:09:06.12,0:09:08.60,Default,,0000,0000,0000,,I knew for the next ten years in, in Dialogue: 0,0:09:08.60,0:09:12.85,Default,,0000,0000,0000,,computer software, including Allen of TextMate\Nfame. I was Dialogue: 0,0:09:12.85,0:09:14.17,Default,,0000,0000,0000,,fourteen and he was part of one of these Dialogue: 0,0:09:14.17,0:09:18.37,Default,,0000,0000,0000,,demo groups, and we got talking, and then\Nten Dialogue: 0,0:09:18.37,0:09:22.83,Default,,0000,0000,0000,,years later, I'd help him release Textmate,\Nand this Dialogue: 0,0:09:22.83,0:09:24.64,Default,,0000,0000,0000,,is now twenty years ago. Dialogue: 0,0:09:24.64,0:09:25.81,Default,,0000,0000,0000,,Anyway. Dialogue: 0,0:09:25.81,0:09:27.71,Default,,0000,0000,0000,,I still didn't get the concept, right. Like,\Nit Dialogue: 0,0:09:27.71,0:09:29.95,Default,,0000,0000,0000,,was all, it was Assembler. So it was even Dialogue: 0,0:09:29.95,0:09:35.05,Default,,0000,0000,0000,,harder and weirder to figure out than Amos\Nwas. Dialogue: 0,0:09:35.05,0:09:37.27,Default,,0000,0000,0000,,It was vectors, it was math, it was, it Dialogue: 0,0:09:37.27,0:09:40.72,Default,,0000,0000,0000,,was just really hard. So once again, this\Nis Dialogue: 0,0:09:40.72,0:09:43.51,Default,,0000,0000,0000,,the third time I tried to sort of figure Dialogue: 0,0:09:43.51,0:09:45.62,Default,,0000,0000,0000,,out programming, because I want to build stuff. Dialogue: 0,0:09:45.62,0:09:49.63,Default,,0000,0000,0000,,And the third time, it failed. Dialogue: 0,0:09:49.63,0:09:52.00,Default,,0000,0000,0000,,So I ended up building another information\Nsystem. At Dialogue: 0,0:09:52.00,0:09:57.31,Default,,0000,0000,0000,,that time, there's something called BBS's.\NSo pre-internet, you Dialogue: 0,0:09:57.31,0:10:01.04,Default,,0000,0000,0000,,dialed up to basically every web site individually\Nthrough Dialogue: 0,0:10:01.04,0:10:04.36,Default,,0000,0000,0000,,a modem, and I ran one of those things. Dialogue: 0,0:10:04.36,0:10:05.79,Default,,0000,0000,0000,,At that time, it was, it was called a Dialogue: 0,0:10:05.79,0:10:08.42,Default,,0000,0000,0000,,Where's BBS, which is where we traded all\Nthe Dialogue: 0,0:10:08.42,0:10:11.62,Default,,0000,0000,0000,,illegal software that we couldn't afford,\Nand games, and Dialogue: 0,0:10:11.62,0:10:11.97,Default,,0000,0000,0000,,demos. Dialogue: 0,0:10:11.97,0:10:14.10,Default,,0000,0000,0000,,And I had a lot of fun doing that. Dialogue: 0,0:10:14.10,0:10:16.48,Default,,0000,0000,0000,,I was fifteen and I was, I was working Dialogue: 0,0:10:16.48,0:10:18.27,Default,,0000,0000,0000,,at a grocery store, and I spent all my Dialogue: 0,0:10:18.27,0:10:22.84,Default,,0000,0000,0000,,money buying modems and phone lines. Dialogue: 0,0:10:22.84,0:10:27.26,Default,,0000,0000,0000,,But sort of the long and the short of Dialogue: 0,0:10:27.26,0:10:30.91,Default,,0000,0000,0000,,that is that I failed to identify with programming Dialogue: 0,0:10:30.91,0:10:33.78,Default,,0000,0000,0000,,under the computer-science paradigm. Dialogue: 0,0:10:33.78,0:10:37.09,Default,,0000,0000,0000,,Computer science, in itself, just didn't really\Nappeal to Dialogue: 0,0:10:37.09,0:10:40.39,Default,,0000,0000,0000,,me. Like, it didn't make sense to me. Learning Dialogue: 0,0:10:40.39,0:10:44.86,Default,,0000,0000,0000,,programming through sort of the lens, the\Nprism of, Dialogue: 0,0:10:44.86,0:10:49.22,Default,,0000,0000,0000,,of hard science just, it didn't really, it\Njust Dialogue: 0,0:10:49.22,0:10:52.80,Default,,0000,0000,0000,,didn't click. And I was actually pretty disappointed\Nfor Dialogue: 0,0:10:52.80,0:10:55.37,Default,,0000,0000,0000,,awhile. I had tried to learn programming three\Nor Dialogue: 0,0:10:55.37,0:10:58.06,Default,,0000,0000,0000,,four times over the past ten years of my, Dialogue: 0,0:10:58.06,0:11:02.97,Default,,0000,0000,0000,,my life, and it just, it wasn't clicking. Dialogue: 0,0:11:02.97,0:11:07.53,Default,,0000,0000,0000,,No surprise to sort of my teachers. This is Dialogue: 0,0:11:07.53,0:11:10.72,Default,,0000,0000,0000,,my high school diploma, part of it, and it Dialogue: 0,0:11:10.72,0:11:16.30,Default,,0000,0000,0000,,says math, final exam, F. And, and English,\NI Dialogue: 0,0:11:16.30,0:11:19.92,Default,,0000,0000,0000,,got an A. But math was just never my Dialogue: 0,0:11:19.92,0:11:21.91,Default,,0000,0000,0000,,thing. Physics never, was never my thing. Dialogue: 0,0:11:21.91,0:11:24.78,Default,,0000,0000,0000,,Any of the hard sciences were just never my Dialogue: 0,0:11:24.78,0:11:27.34,Default,,0000,0000,0000,,thing. And you say, oh, well that explains\Na Dialogue: 0,0:11:27.34,0:11:29.78,Default,,0000,0000,0000,,lot. That's why Rails is so fucking slow. Dialogue: 0,0:11:29.78,0:11:34.69,Default,,0000,0000,0000,,But it, it's true. It just never appealed\Nto Dialogue: 0,0:11:34.69,0:11:39.15,Default,,0000,0000,0000,,me. But, I think it also inoculated me with Dialogue: 0,0:11:39.15,0:11:42.11,Default,,0000,0000,0000,,something really early on, which was, it disabused\Nme Dialogue: 0,0:11:42.11,0:11:44.62,Default,,0000,0000,0000,,of the thinking that I was a computer scientist. Dialogue: 0,0:11:44.62,0:11:46.53,Default,,0000,0000,0000,,That I was ever going to come up with Dialogue: 0,0:11:46.53,0:11:50.00,Default,,0000,0000,0000,,an algorithm. That I was ever going to make Dialogue: 0,0:11:50.00,0:11:55.20,Default,,0000,0000,0000,,any ground-breaking discoveries at the low-level\Nof, of computer Dialogue: 0,0:11:55.20,0:11:57.16,Default,,0000,0000,0000,,science. Dialogue: 0,0:11:57.16,0:11:59.92,Default,,0000,0000,0000,,And that was actually really a relief. Because\Nwhen Dialogue: 0,0:11:59.92,0:12:03.00,Default,,0000,0000,0000,,I finally got into programming, I knew that\Nwas Dialogue: 0,0:12:03.00,0:12:04.21,Default,,0000,0000,0000,,just not what I was going to do with Dialogue: 0,0:12:04.21,0:12:06.82,Default,,0000,0000,0000,,it. That was never, it wasn't my idol, it Dialogue: 0,0:12:06.82,0:12:09.81,Default,,0000,0000,0000,,was not what I was chasing. I wanted to Dialogue: 0,0:12:09.81,0:12:12.51,Default,,0000,0000,0000,,build information systems. Like all these\Nattempts I had Dialogue: 0,0:12:12.51,0:12:15.03,Default,,0000,0000,0000,,over the years, they were all about information\Nsystems. Dialogue: 0,0:12:15.03,0:12:18.07,Default,,0000,0000,0000,,They were about using the computer to build\Nsomething Dialogue: 0,0:12:18.07,0:12:20.22,Default,,0000,0000,0000,,else that really didn't have much to do with Dialogue: 0,0:12:20.22,0:12:24.56,Default,,0000,0000,0000,,the underlying things. That there were people,\Nsmart people, Dialogue: 0,0:12:24.56,0:12:27.08,Default,,0000,0000,0000,,who had come up with algorithms underneath\Nto, to Dialogue: 0,0:12:27.08,0:12:30.70,Default,,0000,0000,0000,,make it all work, wonderful. I'm not one of Dialogue: 0,0:12:30.70,0:12:31.13,Default,,0000,0000,0000,,them. Dialogue: 0,0:12:31.13,0:12:33.17,Default,,0000,0000,0000,,And that's fine. Dialogue: 0,0:12:33.17,0:12:39.06,Default,,0000,0000,0000,,I think as an industry, very few people have Dialogue: 0,0:12:39.06,0:12:42.39,Default,,0000,0000,0000,,gotten to that realization. Even if it is,\Nthat Dialogue: 0,0:12:42.39,0:12:45.78,Default,,0000,0000,0000,,they, on a daily basis, build information\Nsystems. Even Dialogue: 0,0:12:45.78,0:12:48.30,Default,,0000,0000,0000,,if it is that they're working on yet another Dialogue: 0,0:12:48.30,0:12:52.13,Default,,0000,0000,0000,,social network for sock puppets, or horror,\Nin my Dialogue: 0,0:12:52.13,0:12:57.36,Default,,0000,0000,0000,,case, yet another fucking to-do list. The\Naspiration of Dialogue: 0,0:12:57.36,0:12:59.55,Default,,0000,0000,0000,,the whole industry, everyone in it, is that\Nwe're Dialogue: 0,0:12:59.55,0:13:01.38,Default,,0000,0000,0000,,all programmers. Dialogue: 0,0:13:01.38,0:13:02.34,Default,,0000,0000,0000,,Right? Dialogue: 0,0:13:02.34,0:13:09.34,Default,,0000,0000,0000,,No we're not. I am nothing like Linus, right. Dialogue: 0,0:13:09.67,0:13:12.41,Default,,0000,0000,0000,,He's actually a real computer scientist. To\Nfigure out Dialogue: 0,0:13:12.41,0:13:14.56,Default,,0000,0000,0000,,how to, I don't know, fucking improve the\Nscheduler Dialogue: 0,0:13:14.56,0:13:20.82,Default,,0000,0000,0000,,in the kernel. Shew. No clue. No interest.\NAll Dialogue: 0,0:13:20.82,0:13:21.57,Default,,0000,0000,0000,,good. Dialogue: 0,0:13:21.57,0:13:25.22,Default,,0000,0000,0000,,I am ever in debt that there are people Dialogue: 0,0:13:25.22,0:13:28.61,Default,,0000,0000,0000,,like that out there who can do this stuff. Dialogue: 0,0:13:28.61,0:13:30.15,Default,,0000,0000,0000,,So I don't have to do it. So I Dialogue: 0,0:13:30.15,0:13:33.98,Default,,0000,0000,0000,,can focus on something else. But I think most Dialogue: 0,0:13:33.98,0:13:36.54,Default,,0000,0000,0000,,programmers think that, oh yeah, that, that's\Nwhat I Dialogue: 0,0:13:36.54,0:13:39.90,Default,,0000,0000,0000,,do. Yeah, I work information systems, but,\Nwe're kind Dialogue: 0,0:13:39.90,0:13:42.29,Default,,0000,0000,0000,,of colleagues, right? Me and Linus here. Dialogue: 0,0:13:42.29,0:13:45.72,Default,,0000,0000,0000,,I'm pretty sure that he would tell you, fuck Dialogue: 0,0:13:45.72,0:13:49.48,Default,,0000,0000,0000,,you. We're nothing alike. We are not colleagues.\NWhat Dialogue: 0,0:13:49.48,0:13:52.62,Default,,0000,0000,0000,,you do is making another fucking to do list. Dialogue: 0,0:13:52.62,0:13:57.41,Default,,0000,0000,0000,,I'm improving the fucking kernel of Linux.\NFar more Dialogue: 0,0:13:57.41,0:14:00.62,Default,,0000,0000,0000,,important work. He would disabuse you of your\Ndelusions Dialogue: 0,0:14:00.62,0:14:06.60,Default,,0000,0000,0000,,of grandeur real quick. Dialogue: 0,0:14:06.60,0:14:08.36,Default,,0000,0000,0000,,And I think that's a real shame. I think Dialogue: 0,0:14:08.36,0:14:12.35,Default,,0000,0000,0000,,it's a real shame that if you sort of Dialogue: 0,0:14:12.35,0:14:15.97,Default,,0000,0000,0000,,pick your heroes in such a impossible fashion,\Nthat Dialogue: 0,0:14:15.97,0:14:17.85,Default,,0000,0000,0000,,they're actually nothing like you and you\Nwill be Dialogue: 0,0:14:17.85,0:14:20.05,Default,,0000,0000,0000,,nothing like them, you're gonna set yourself\Nup for Dialogue: 0,0:14:20.05,0:14:22.19,Default,,0000,0000,0000,,a bad time for the whole ride. Dialogue: 0,0:14:22.19,0:14:27.39,Default,,0000,0000,0000,,The truth of the matter is that most information Dialogue: 0,0:14:27.39,0:14:31.55,Default,,0000,0000,0000,,system development has very little to do with\Nscience. Dialogue: 0,0:14:31.55,0:14:35.44,Default,,0000,0000,0000,,Yes, it's all built on top of computer science. Dialogue: 0,0:14:35.44,0:14:38.33,Default,,0000,0000,0000,,Yes, computer science is what makes it possible\Nfor Dialogue: 0,0:14:38.33,0:14:40.73,Default,,0000,0000,0000,,us to do what it is that we do. Dialogue: 0,0:14:40.73,0:14:44.61,Default,,0000,0000,0000,,But it doesn't define what we do. Dialogue: 0,0:14:44.61,0:14:46.70,Default,,0000,0000,0000,,And I think in many ways that prism of Dialogue: 0,0:14:46.70,0:14:50.85,Default,,0000,0000,0000,,computer science is harmful to the development\Nof information Dialogue: 0,0:14:50.85,0:14:55.00,Default,,0000,0000,0000,,systems. It's actually not a good view on\Nthe Dialogue: 0,0:14:55.00,0:14:59.09,Default,,0000,0000,0000,,world to have. Just because you can make,\Nyou're Dialogue: 0,0:14:59.09,0:15:00.61,Default,,0000,0000,0000,,Steingraeber and Sohne, and you can make the\Nbest Dialogue: 0,0:15:00.61,0:15:02.61,Default,,0000,0000,0000,,piano in the world, that doesn't make you\Na Dialogue: 0,0:15:02.61,0:15:05.58,Default,,0000,0000,0000,,great pianist. It doesn't mean you can play\Nwonderful Dialogue: 0,0:15:05.58,0:15:08.53,Default,,0000,0000,0000,,tunes. Just because you can create the foundations\Nof Dialogue: 0,0:15:08.53,0:15:12.48,Default,,0000,0000,0000,,which other people can build upon, just because\Nyou're Dialogue: 0,0:15:12.48,0:15:15.80,Default,,0000,0000,0000,,a great computer scientist, doesn't mean you're\Na great Dialogue: 0,0:15:15.80,0:15:18.36,Default,,0000,0000,0000,,software writer. Dialogue: 0,0:15:18.36,0:15:22.30,Default,,0000,0000,0000,,Doesn't mean you're a great programmer of\Ninformation systems. Dialogue: 0,0:15:22.30,0:15:25.52,Default,,0000,0000,0000,,And most of all, if you are committed to Dialogue: 0,0:15:25.52,0:15:28.13,Default,,0000,0000,0000,,building information systems, and I am wholly\Ncommitted to Dialogue: 0,0:15:28.13,0:15:30.91,Default,,0000,0000,0000,,building information systems, I've given up\Nthe notion, long Dialogue: 0,0:15:30.91,0:15:33.40,Default,,0000,0000,0000,,ago, that I was going to get into games Dialogue: 0,0:15:33.40,0:15:37.15,Default,,0000,0000,0000,,programming or vector programming or anything\Nelse that sounds Dialogue: 0,0:15:37.15,0:15:41.14,Default,,0000,0000,0000,,like hard science and is hard. Dialogue: 0,0:15:41.14,0:15:42.64,Default,,0000,0000,0000,,I think you're gonna be much better off. But Dialogue: 0,0:15:42.64,0:15:45.39,Default,,0000,0000,0000,,I think it's also really tough, because I\Nthink Dialogue: 0,0:15:45.39,0:15:49.16,Default,,0000,0000,0000,,most of the paths, the celebrated paths into\Nprogramming Dialogue: 0,0:15:49.16,0:15:53.01,Default,,0000,0000,0000,,go through courses called computer science.\NSo you're sort Dialogue: 0,0:15:53.01,0:15:56.08,Default,,0000,0000,0000,,of taught right from the get go that computer Dialogue: 0,0:15:56.08,0:16:00.19,Default,,0000,0000,0000,,science, like that is the ultimate ideal,\Nand what Dialogue: 0,0:16:00.19,0:16:02.38,Default,,0000,0000,0000,,you're doing here is just sort of piddling\Nalong Dialogue: 0,0:16:02.38,0:16:05.30,Default,,0000,0000,0000,,until you can get to this top of the Dialogue: 0,0:16:05.30,0:16:06.62,Default,,0000,0000,0000,,mountain. Dialogue: 0,0:16:06.62,0:16:08.36,Default,,0000,0000,0000,,Even worse, if you actually have a degree\Nin Dialogue: 0,0:16:08.36,0:16:13.75,Default,,0000,0000,0000,,computer science, right, and now you're slumming\Nit, with Dialogue: 0,0:16:13.75,0:16:16.44,Default,,0000,0000,0000,,yet another social network, or, yet another\Nfucking to-do Dialogue: 0,0:16:16.44,0:16:19.65,Default,,0000,0000,0000,,list. I mean, that's a recipe for self-loathing\Nif Dialogue: 0,0:16:19.65,0:16:21.75,Default,,0000,0000,0000,,I ever knew one. Dialogue: 0,0:16:21.75,0:16:24.59,Default,,0000,0000,0000,,But, as I say, this is mostly about the Dialogue: 0,0:16:24.59,0:16:27.24,Default,,0000,0000,0000,,prism of how you're looking at programming,\Nwhat is Dialogue: 0,0:16:27.24,0:16:30.48,Default,,0000,0000,0000,,programming, what is writing software. What\Nis that we Dialogue: 0,0:16:30.48,0:16:34.61,Default,,0000,0000,0000,,do every day when we create information systems? Dialogue: 0,0:16:34.61,0:16:36.52,Default,,0000,0000,0000,,And if you look at it from this prism Dialogue: 0,0:16:36.52,0:16:41.46,Default,,0000,0000,0000,,of the hard sciences, you think, well, Law\Nof Dialogue: 0,0:16:41.46,0:16:45.31,Default,,0000,0000,0000,,Thermodynamics. Physics. This is, this is\Nthe real serious Dialogue: 0,0:16:45.31,0:16:48.80,Default,,0000,0000,0000,,hard stuff, right. You will laugh at French\Npoetry. Dialogue: 0,0:16:48.80,0:16:51.90,Default,,0000,0000,0000,,Ha, ha, ha, ha! They're all just, what, analyzing Dialogue: 0,0:16:51.90,0:16:54.89,Default,,0000,0000,0000,,what some schmuck in the 1700s did, and there's Dialogue: 0,0:16:54.89,0:16:58.25,Default,,0000,0000,0000,,a thousand different interpretations of, of\Nwhat that person Dialogue: 0,0:16:58.25,0:17:00.82,Default,,0000,0000,0000,,actually wrote and what does that actually\Nmean? Like, Dialogue: 0,0:17:00.82,0:17:04.49,Default,,0000,0000,0000,,that's pathetic, right. You can't arrive at\Nany ultimate, Dialogue: 0,0:17:04.49,0:17:06.43,Default,,0000,0000,0000,,clear, universal truths. Dialogue: 0,0:17:06.43,0:17:11.34,Default,,0000,0000,0000,,Math! There's a truth. There's a final result.\NPhysics. Dialogue: 0,0:17:11.34,0:17:14.12,Default,,0000,0000,0000,,There's a truth. We're knowing more about\Nthe natural Dialogue: 0,0:17:14.12,0:17:18.50,Default,,0000,0000,0000,,world in a way where we can be completely Dialogue: 0,0:17:18.50,0:17:22.90,Default,,0000,0000,0000,,confident. Mostly. In what we know. Certainly\Nin math, Dialogue: 0,0:17:22.90,0:17:23.38,Default,,0000,0000,0000,,right. Dialogue: 0,0:17:23.38,0:17:28.54,Default,,0000,0000,0000,,If you carry that over into programming, you\Nend Dialogue: 0,0:17:28.54,0:17:35.10,Default,,0000,0000,0000,,up with shit like this. Law of Demeter. Practices Dialogue: 0,0:17:35.10,0:17:40.86,Default,,0000,0000,0000,,and principles who sort of project that they're\Nuniversal Dialogue: 0,0:17:40.86,0:17:44.59,Default,,0000,0000,0000,,truths about the natural world, that this\Nis how Dialogue: 0,0:17:44.59,0:17:47.16,Default,,0000,0000,0000,,good programs are made, and this is not really Dialogue: 0,0:17:47.16,0:17:50.32,Default,,0000,0000,0000,,an argument. The only argument is whether\Nyou're professional Dialogue: 0,0:17:50.32,0:17:53.37,Default,,0000,0000,0000,,and following the laws, or you're an amateur\Nand Dialogue: 0,0:17:53.37,0:17:58.07,Default,,0000,0000,0000,,you're breaking them. Dialogue: 0,0:17:58.07,0:17:59.99,Default,,0000,0000,0000,,When I look at computer programming, and when\NI Dialogue: 0,0:17:59.99,0:18:04.00,Default,,0000,0000,0000,,reach most, read most programs, I'm not reading\Nhard Dialogue: 0,0:18:04.00,0:18:07.47,Default,,0000,0000,0000,,sciences. It is much more like studying 17th\Ncentury Dialogue: 0,0:18:07.47,0:18:10.02,Default,,0000,0000,0000,,French poetry. What the fuck did this guy\Nmean? Dialogue: 0,0:18:10.02,0:18:13.21,Default,,0000,0000,0000,,Like, I can't follow this at all. Like, is Dialogue: 0,0:18:13.21,0:18:16.91,Default,,0000,0000,0000,,this some weird reference to some play somewhere?\NWhat's Dialogue: 0,0:18:16.91,0:18:18.09,Default,,0000,0000,0000,,going on here? Dialogue: 0,0:18:18.09,0:18:20.95,Default,,0000,0000,0000,,It's actually more like forensics. It's more\Nlike analysis. Dialogue: 0,0:18:20.95,0:18:24.01,Default,,0000,0000,0000,,It's much more subjective. Like, what is actually\Ngoing Dialogue: 0,0:18:24.01,0:18:27.65,Default,,0000,0000,0000,,on? What were they trying to communicate?\NWhat's just Dialogue: 0,0:18:27.65,0:18:29.84,Default,,0000,0000,0000,,going on here, right? Dialogue: 0,0:18:29.84,0:18:32.86,Default,,0000,0000,0000,,So, I find it so funny that, that programmers Dialogue: 0,0:18:32.86,0:18:37.38,Default,,0000,0000,0000,,who work in programming, and they laugh at\Nall Dialogue: 0,0:18:37.38,0:18:40.96,Default,,0000,0000,0000,,these subjective fields of endeavor, when\Nthat is what Dialogue: 0,0:18:40.96,0:18:44.57,Default,,0000,0000,0000,,they do every day. They just, no, what I'm Dialogue: 0,0:18:44.57,0:18:48.58,Default,,0000,0000,0000,,doing is computer science. This is empirical\Ntruth, blah, Dialogue: 0,0:18:48.58,0:18:52.11,Default,,0000,0000,0000,,blah, blah, we have laws, blah, blah, blah. Dialogue: 0,0:18:52.11,0:18:54.19,Default,,0000,0000,0000,,I think the, the bottom line is that is Dialogue: 0,0:18:54.19,0:18:55.80,Default,,0000,0000,0000,,when you go in with that notion, when you Dialogue: 0,0:18:55.80,0:18:57.55,Default,,0000,0000,0000,,go in with the notion that we can actually Dialogue: 0,0:18:57.55,0:19:02.12,Default,,0000,0000,0000,,discover laws of programming, like, Law of\NDemeter, of Dialogue: 0,0:19:02.12,0:19:04.62,Default,,0000,0000,0000,,how we should be creating our programs, you\Nlull Dialogue: 0,0:19:04.62,0:19:10.20,Default,,0000,0000,0000,,yourself into this belief that there are some\Npractices Dialogue: 0,0:19:10.20,0:19:13.20,Default,,0000,0000,0000,,that are just true. They're not up for debate. Dialogue: 0,0:19:13.20,0:19:15.21,Default,,0000,0000,0000,,They're not up for discussion. Dialogue: 0,0:19:15.21,0:19:19.89,Default,,0000,0000,0000,,They're science. That what we do is science.\NWell, Dialogue: 0,0:19:19.89,0:19:22.23,Default,,0000,0000,0000,,I think there's another word for, sort of,\Nthose Dialogue: 0,0:19:22.23,0:19:29.23,Default,,0000,0000,0000,,delusions. Pseudoscience. When people think\Nthey're doing science and Dialogue: 0,0:19:30.16,0:19:34.46,Default,,0000,0000,0000,,they're not actually doing science. That's\Npseudoscience. I think Dialogue: 0,0:19:34.46,0:19:38.38,Default,,0000,0000,0000,,a lot of what's going on in software, methodology, Dialogue: 0,0:19:38.38,0:19:41.61,Default,,0000,0000,0000,,practices, is pseudoscience. Dialogue: 0,0:19:41.61,0:19:43.64,Default,,0000,0000,0000,,Which would be fine if people would accept\Nthat Dialogue: 0,0:19:43.64,0:19:46.19,Default,,0000,0000,0000,,and say, yes, what I'm doing is pseudo science. Dialogue: 0,0:19:46.19,0:19:48.52,Default,,0000,0000,0000,,Like, I'm not finding any grand truths here,\Nbut Dialogue: 0,0:19:48.52,0:19:51.69,Default,,0000,0000,0000,,they're not, right. They're ex-pouting that\Nthis is, this Dialogue: 0,0:19:51.69,0:19:52.64,Default,,0000,0000,0000,,is the truth. Dialogue: 0,0:19:52.64,0:19:59.64,Default,,0000,0000,0000,,Well, here's another pseudoscience. Diet schemes.\NI think diets Dialogue: 0,0:20:00.27,0:20:06.43,Default,,0000,0000,0000,,are actually incredibly similar to most software\Nmethodology approaches. Dialogue: 0,0:20:06.43,0:20:10.90,Default,,0000,0000,0000,,They all sort of espouse that I have the Dialogue: 0,0:20:10.90,0:20:13.61,Default,,0000,0000,0000,,truth, what you need to get slim and healthy Dialogue: 0,0:20:13.61,0:20:17.21,Default,,0000,0000,0000,,is the ten-day green smoothie cleanse. Dialogue: 0,0:20:17.21,0:20:18.54,Default,,0000,0000,0000,,That is the truth. That's how you get it, Dialogue: 0,0:20:18.54,0:20:22.21,Default,,0000,0000,0000,,right. And then you, shit, that, that's, OK,\Nsmoothies. Dialogue: 0,0:20:22.21,0:20:25.34,Default,,0000,0000,0000,,Sounds good. But what about this super shred\Ndiet? Dialogue: 0,0:20:25.34,0:20:28.26,Default,,0000,0000,0000,,Like, I lose twenty pounds in four weeks?\NThat's Dialogue: 0,0:20:28.26,0:20:30.64,Default,,0000,0000,0000,,certainly better than ten pounds in, I don't\Nknow, Dialogue: 0,0:20:30.64,0:20:33.28,Default,,0000,0000,0000,,ten weeks, or whatever that hungry diet girl\Nis Dialogue: 0,0:20:33.28,0:20:35.82,Default,,0000,0000,0000,,promising. I'll go with that super shred guy,\Nlike Dialogue: 0,0:20:35.82,0:20:37.97,Default,,0000,0000,0000,,he's got to have the truth, right. Dialogue: 0,0:20:37.97,0:20:40.62,Default,,0000,0000,0000,,And it's so funny, if you read any diet Dialogue: 0,0:20:40.62,0:20:42.29,Default,,0000,0000,0000,,books, and diet books are incredibly popular.\NIf you Dialogue: 0,0:20:42.29,0:20:44.27,Default,,0000,0000,0000,,look at the most popular book on Amazon, the Dialogue: 0,0:20:44.27,0:20:46.27,Default,,0000,0000,0000,,top one hundred list, a lot of them are Dialogue: 0,0:20:46.27,0:20:50.53,Default,,0000,0000,0000,,diet books. People want to be told how they Dialogue: 0,0:20:50.53,0:20:53.90,Default,,0000,0000,0000,,can cheat the basics. I think software development\Nis Dialogue: 0,0:20:53.90,0:20:55.53,Default,,0000,0000,0000,,exactly like that. Dialogue: 0,0:20:55.53,0:20:58.78,Default,,0000,0000,0000,,I think software developers are exactly like\Npeople trying Dialogue: 0,0:20:58.78,0:21:03.87,Default,,0000,0000,0000,,to lose ten pounds and thinking, you know\Nwhat, Dialogue: 0,0:21:03.87,0:21:07.21,Default,,0000,0000,0000,,all this exercising, just eating healthier,\Nthat's a little Dialogue: 0,0:21:07.21,0:21:09.33,Default,,0000,0000,0000,,too hard. Let's, let's listen to this super\Nshred Dialogue: 0,0:21:09.33,0:21:09.96,Default,,0000,0000,0000,,guy. Dialogue: 0,0:21:09.96,0:21:11.60,Default,,0000,0000,0000,,He's got to have the answer. An answer that's Dialogue: 0,0:21:11.60,0:21:16.65,Default,,0000,0000,0000,,less painful, less simple and basic. There's\Ngot to Dialogue: 0,0:21:16.65,0:21:19.37,Default,,0000,0000,0000,,be some grand secret I just don't know yet. Dialogue: 0,0:21:19.37,0:21:21.91,Default,,0000,0000,0000,,If I can just learn the secret then everything's Dialogue: 0,0:21:21.91,0:21:25.16,Default,,0000,0000,0000,,gonna be great, right. But it's pseudoscience.\NThose diets Dialogue: 0,0:21:25.16,0:21:31.26,Default,,0000,0000,0000,,are based on anecdotes. They're based on one\Nguy Dialogue: 0,0:21:31.26,0:21:33.36,Default,,0000,0000,0000,,trying something, or, or looking at a few\Npeople, Dialogue: 0,0:21:33.36,0:21:37.98,Default,,0000,0000,0000,,a tiny sample size, it's just pure, poor,\Npure Dialogue: 0,0:21:37.98,0:21:39.86,Default,,0000,0000,0000,,poor science. Dialogue: 0,0:21:39.86,0:21:44.05,Default,,0000,0000,0000,,External variables, uncontrolled experiments\Nthat run for too long. Dialogue: 0,0:21:44.05,0:21:46.48,Default,,0000,0000,0000,,You can't derive any absolute truths from\Nit. But Dialogue: 0,0:21:46.48,0:21:51.86,Default,,0000,0000,0000,,people keep arriving at absolute truths. Dialogue: 0,0:21:51.86,0:21:55.91,Default,,0000,0000,0000,,And just like feeling a little overweight,\Nand most Dialogue: 0,0:21:55.91,0:21:58.07,Default,,0000,0000,0000,,people do at some point in their life. Everybody Dialogue: 0,0:21:58.07,0:22:00.18,Default,,0000,0000,0000,,wants to lose whatever it is. They want to Dialogue: 0,0:22:00.18,0:22:02.08,Default,,0000,0000,0000,,feel healthier even if they are at the correct Dialogue: 0,0:22:02.08,0:22:04.55,Default,,0000,0000,0000,,weight. They want to be in better shape. All Dialogue: 0,0:22:04.55,0:22:07.23,Default,,0000,0000,0000,,our code bases are exactly like that. Dialogue: 0,0:22:07.23,0:22:09.09,Default,,0000,0000,0000,,Everyone has like, oh I'd love that this part Dialogue: 0,0:22:09.09,0:22:11.23,Default,,0000,0000,0000,,of the code base, it's not that clean, right. Dialogue: 0,0:22:11.23,0:22:13.78,Default,,0000,0000,0000,,So we have that same feeling of being a Dialogue: 0,0:22:13.78,0:22:19.22,Default,,0000,0000,0000,,little insecure about our quote code quality,\Njust like Dialogue: 0,0:22:19.22,0:22:21.51,Default,,0000,0000,0000,,most people are a little insecure, at least\Nat Dialogue: 0,0:22:21.51,0:22:25.28,Default,,0000,0000,0000,,certain times in their life, about their body,\Nright. Dialogue: 0,0:22:25.28,0:22:27.79,Default,,0000,0000,0000,,So we're ripe for somebody to come in and Dialogue: 0,0:22:27.79,0:22:32.26,Default,,0000,0000,0000,,tell us what's wrong. To fix it for us Dialogue: 0,0:22:32.26,0:22:34.10,Default,,0000,0000,0000,,by just saying, oh, no, no, no, you don't Dialogue: 0,0:22:34.10,0:22:35.96,Default,,0000,0000,0000,,have to do any of the hard stuff. Writing Dialogue: 0,0:22:35.96,0:22:37.32,Default,,0000,0000,0000,,good code, do you know what that's about?\NIt's Dialogue: 0,0:22:37.32,0:22:40.97,Default,,0000,0000,0000,,about this one practice. This one secret that\Nthey Dialogue: 0,0:22:40.97,0:22:42.75,Default,,0000,0000,0000,,don't want you to know. Dialogue: 0,0:22:42.75,0:22:45.88,Default,,0000,0000,0000,,If I teach you that, then all your code Dialogue: 0,0:22:45.88,0:22:48.68,Default,,0000,0000,0000,,is going to be wonderful. But right now, you're Dialogue: 0,0:22:48.68,0:22:52.36,Default,,0000,0000,0000,,not a professional. You're an amateur. You're\Nwriting dirty Dialogue: 0,0:22:52.36,0:22:56.43,Default,,0000,0000,0000,,code. You should feel really bad about that.\NYou Dialogue: 0,0:22:56.43,0:22:58.04,Default,,0000,0000,0000,,have sinned. Dialogue: 0,0:22:58.04,0:23:02.15,Default,,0000,0000,0000,,But, I will give you absolution. I have the Dialogue: 0,0:23:02.15,0:23:06.06,Default,,0000,0000,0000,,pathway to clean code. Dialogue: 0,0:23:06.06,0:23:10.85,Default,,0000,0000,0000,,And it hits a lot of people right in Dialogue: 0,0:23:10.85,0:23:14.83,Default,,0000,0000,0000,,the impostor plexus. Like, ugh, you're saying\Nmy code Dialogue: 0,0:23:14.83,0:23:17.02,Default,,0000,0000,0000,,is dirty? Yeah, I guess it is a little Dialogue: 0,0:23:17.02,0:23:19.71,Default,,0000,0000,0000,,dirty. There's this one part that's, like,\Nshit, maybe Dialogue: 0,0:23:19.71,0:23:22.79,Default,,0000,0000,0000,,I'm not really a computer scientist. Maybe\Nit doesn't Dialogue: 0,0:23:22.79,0:23:26.69,Default,,0000,0000,0000,,really, I don't really belong here amongst\Nthe programmers. Dialogue: 0,0:23:26.69,0:23:28.71,Default,,0000,0000,0000,,Can you please tell me, how do I get Dialogue: 0,0:23:28.71,0:23:32.27,Default,,0000,0000,0000,,to be a computer scientist? Dialogue: 0,0:23:32.27,0:23:36.60,Default,,0000,0000,0000,,How can I get to belong amongst the esteemed Dialogue: 0,0:23:36.60,0:23:41.06,Default,,0000,0000,0000,,professional programmers? Can you tell me\Nhow? And there Dialogue: 0,0:23:41.06,0:23:44.09,Default,,0000,0000,0000,,are lots of people willing to tell you how. Dialogue: 0,0:23:44.09,0:23:46.68,Default,,0000,0000,0000,,That the salvation will come through these\Npatterns and Dialogue: 0,0:23:46.68,0:23:49.16,Default,,0000,0000,0000,,practices, and as long as you follow these\Nten Dialogue: 0,0:23:49.16,0:23:54.66,Default,,0000,0000,0000,,commandments of good code, all shall be well. Dialogue: 0,0:23:54.66,0:23:56.99,Default,,0000,0000,0000,,OK. Dialogue: 0,0:23:56.99,0:24:00.45,Default,,0000,0000,0000,,I think the most popular commandment, I'm\Ngonna spend Dialogue: 0,0:24:00.45,0:24:02.95,Default,,0000,0000,0000,,some time on that, the most popular practice,\Nthe Dialogue: 0,0:24:02.95,0:24:06.57,Default,,0000,0000,0000,,most popular pattern for making people feel\Nshitty about Dialogue: 0,0:24:06.57,0:24:09.05,Default,,0000,0000,0000,,their code and shitty about themselves and\Nshitty about Dialogue: 0,0:24:09.05,0:24:16.05,Default,,0000,0000,0000,,their path through programming, is TDD. Dialogue: 0,0:24:17.96,0:24:23.37,Default,,0000,0000,0000,,TDD is the most successful software diet of\Nall Dialogue: 0,0:24:23.37,0:24:30.37,Default,,0000,0000,0000,,times. It's so alluring, it has such an appeal Dialogue: 0,0:24:31.38,0:24:34.68,Default,,0000,0000,0000,,in its basic principles, that everyone gets\Nwrapped up Dialogue: 0,0:24:34.68,0:24:37.10,Default,,0000,0000,0000,,in it. I got wrapped up in it for Dialogue: 0,0:24:37.10,0:24:41.86,Default,,0000,0000,0000,,quite awhile. I got wrapped up in the storytelling Dialogue: 0,0:24:41.86,0:24:47.15,Default,,0000,0000,0000,,that all software before TDD was shit and\Nunprofessional. Dialogue: 0,0:24:47.15,0:24:49.04,Default,,0000,0000,0000,,And that the only way to arrive at clean Dialogue: 0,0:24:49.04,0:24:54.27,Default,,0000,0000,0000,,code was to follow the principles of TDD. Dialogue: 0,0:24:54.27,0:24:57.19,Default,,0000,0000,0000,,And the principles of TDD, mind you, are not Dialogue: 0,0:24:57.19,0:25:02.13,Default,,0000,0000,0000,,about the tests. It's about test first. It's\Nabout Dialogue: 0,0:25:02.13,0:25:07.37,Default,,0000,0000,0000,,test-driven design, right. That we have tests\Nafterwards, that's Dialogue: 0,0:25:07.37,0:25:12.76,Default,,0000,0000,0000,,just an accidental side-effect. A benefit,\Nif you will, Dialogue: 0,0:25:12.76,0:25:15.18,Default,,0000,0000,0000,,after the fact. And it's the perfect diet. Dialogue: 0,0:25:15.18,0:25:20.08,Default,,0000,0000,0000,,I tried multiple times, which is usually how\Nit Dialogue: 0,0:25:20.08,0:25:22.27,Default,,0000,0000,0000,,goes with diets, we try one and it doesn't Dialogue: 0,0:25:22.27,0:25:25.11,Default,,0000,0000,0000,,really work and we fall off the wagon and Dialogue: 0,0:25:25.11,0:25:26.61,Default,,0000,0000,0000,,then a few months later you try again and Dialogue: 0,0:25:26.61,0:25:28.19,Default,,0000,0000,0000,,you feel bad about it the whole time and Dialogue: 0,0:25:28.19,0:25:29.42,Default,,0000,0000,0000,,that's how I felt about TDD for a long Dialogue: 0,0:25:29.42,0:25:29.74,Default,,0000,0000,0000,,time. Dialogue: 0,0:25:29.74,0:25:32.17,Default,,0000,0000,0000,,I felt like TDD was what I was supposed Dialogue: 0,0:25:32.17,0:25:34.81,Default,,0000,0000,0000,,to do. I was supposed to write all my Dialogue: 0,0:25:34.81,0:25:37.67,Default,,0000,0000,0000,,tests first, and then I would be allowed to Dialogue: 0,0:25:37.67,0:25:42.28,Default,,0000,0000,0000,,write my code. And it just didn't work. I Dialogue: 0,0:25:42.28,0:25:45.06,Default,,0000,0000,0000,,kept just feeling like, this is not, I'm not Dialogue: 0,0:25:45.06,0:25:48.34,Default,,0000,0000,0000,,arriving at something better here. When I'm\Ndriving my Dialogue: 0,0:25:48.34,0:25:51.51,Default,,0000,0000,0000,,design by writing my tests first, the code\NI Dialogue: 0,0:25:51.51,0:25:55.81,Default,,0000,0000,0000,,look at afterwards, it's not better. It's\Nnot cleaner. Dialogue: 0,0:25:55.81,0:26:00.50,Default,,0000,0000,0000,,The dirty code I wrote without being test-driven\Nfirst, Dialogue: 0,0:26:00.50,0:26:02.39,Default,,0000,0000,0000,,it actually looks better. Dialogue: 0,0:26:02.39,0:26:06.52,Default,,0000,0000,0000,,But, so successful has TDD been, that for\Nthe Dialogue: 0,0:26:06.52,0:26:09.92,Default,,0000,0000,0000,,longest time, until actually fairly recently,\NI just thought, Dialogue: 0,0:26:09.92,0:26:12.07,Default,,0000,0000,0000,,well, I'm the wrong-doer. I'm the one doing\Nit Dialogue: 0,0:26:12.07,0:26:16.40,Default,,0000,0000,0000,,wrong. TDD is not at fault, right. Just because Dialogue: 0,0:26:16.40,0:26:19.19,Default,,0000,0000,0000,,everybody's doing TDD wrong, doesn't mean\Nthat there's anything Dialogue: 0,0:26:19.19,0:26:21.71,Default,,0000,0000,0000,,wrong with TDD. There's just something wrong\Nwith all Dialogue: 0,0:26:21.71,0:26:23.89,Default,,0000,0000,0000,,of you. That's the problem. Dialogue: 0,0:26:23.89,0:26:26.40,Default,,0000,0000,0000,,If you would just be more faithful to the Dialogue: 0,0:26:26.40,0:26:28.73,Default,,0000,0000,0000,,practices, then everything would be great. Dialogue: 0,0:26:28.73,0:26:31.10,Default,,0000,0000,0000,,And that's what makes it such a great diet. Dialogue: 0,0:26:31.10,0:26:33.50,Default,,0000,0000,0000,,That it keeps people in the perpetual state\Nof Dialogue: 0,0:26:33.50,0:26:37.66,Default,,0000,0000,0000,,feeling inadequate. So, you keep having to\Nbuy more Dialogue: 0,0:26:37.66,0:26:42.52,Default,,0000,0000,0000,,books, and attend more conference talks, and\Nattend more Dialogue: 0,0:26:42.52,0:26:44.94,Default,,0000,0000,0000,,workshops, and hire more consultants, to teach\Nyou to Dialogue: 0,0:26:44.94,0:26:50.91,Default,,0000,0000,0000,,be truer to the religion of TDD. Hogwash. Dialogue: 0,0:26:50.91,0:26:54.38,Default,,0000,0000,0000,,Let's look at some code. So here's a very Dialogue: 0,0:26:54.38,0:26:58.57,Default,,0000,0000,0000,,simple piece of code. Person has an age method, Dialogue: 0,0:26:58.57,0:27:01.57,Default,,0000,0000,0000,,that calculates how old somebody is. And we\Nhave Dialogue: 0,0:27:01.57,0:27:04.88,Default,,0000,0000,0000,,a test for it. This piece of code depends Dialogue: 0,0:27:04.88,0:27:06.22,Default,,0000,0000,0000,,on the world. Dialogue: 0,0:27:06.22,0:27:11.11,Default,,0000,0000,0000,,It directly refers to date today. It's a explicit Dialogue: 0,0:27:11.11,0:27:13.65,Default,,0000,0000,0000,,dependency. You cannot change it in there.\NWell, in Dialogue: 0,0:27:13.65,0:27:15.75,Default,,0000,0000,0000,,a lot of languages, that's a problem. Like,\Nhow Dialogue: 0,0:27:15.75,0:27:17.68,Default,,0000,0000,0000,,are you actually going to test this if you Dialogue: 0,0:27:17.68,0:27:19.42,Default,,0000,0000,0000,,can't somehow figure out how to change the\Ndate Dialogue: 0,0:27:19.42,0:27:21.47,Default,,0000,0000,0000,,of today. Like, every time you run your test Dialogue: 0,0:27:21.47,0:27:23.49,Default,,0000,0000,0000,,it might be a different day and it might Dialogue: 0,0:27:23.49,0:27:24.28,Default,,0000,0000,0000,,be broken. Dialogue: 0,0:27:24.28,0:27:27.02,Default,,0000,0000,0000,,Well, in Ruby it's really easy. We just stop Dialogue: 0,0:27:27.02,0:27:29.06,Default,,0000,0000,0000,,that constant and make it work. That's what\Nthe Dialogue: 0,0:27:29.06,0:27:32.00,Default,,0000,0000,0000,,travel-to method is about, right. Dialogue: 0,0:27:32.00,0:27:34.30,Default,,0000,0000,0000,,Proponents of TDD will look at that code and Dialogue: 0,0:27:34.30,0:27:41.30,Default,,0000,0000,0000,,say, dirty, dirty code. Explicit dependencies\Nhidden inside. You're Dialogue: 0,0:27:41.36,0:27:44.98,Default,,0000,0000,0000,,mocking a global object? What the fuck? Dialogue: 0,0:27:44.98,0:27:48.36,Default,,0000,0000,0000,,You need to shape up. Here's the shaped up Dialogue: 0,0:27:48.36,0:27:52.03,Default,,0000,0000,0000,,version. We inject our dependency, so we have\Na Dialogue: 0,0:27:52.03,0:27:55.49,Default,,0000,0000,0000,,default of date.today, but we can put in our Dialogue: 0,0:27:55.49,0:27:57.60,Default,,0000,0000,0000,,own, in the test, we can put in our Dialogue: 0,0:27:57.60,0:28:00.87,Default,,0000,0000,0000,,own date, right. This is much cleaner. Right.\NNo. Dialogue: 0,0:28:00.87,0:28:03.78,Default,,0000,0000,0000,,Great. We improved our code base. Dialogue: 0,0:28:03.78,0:28:07.61,Default,,0000,0000,0000,,Did we? Is this a better code base? Is Dialogue: 0,0:28:07.61,0:28:10.72,Default,,0000,0000,0000,,this method better than what we just had there? Dialogue: 0,0:28:10.72,0:28:13.72,Default,,0000,0000,0000,,Is it simpler? Is it clearer? No. It's easier Dialogue: 0,0:28:13.72,0:28:18.03,Default,,0000,0000,0000,,to test. And that's the important point, right.\NThat's Dialogue: 0,0:28:18.03,0:28:19.55,Default,,0000,0000,0000,,the important point in all of these debates,\Nis Dialogue: 0,0:28:19.55,0:28:21.52,Default,,0000,0000,0000,,just, is it easier to test? Dialogue: 0,0:28:21.52,0:28:23.56,Default,,0000,0000,0000,,That's the measure of success. I think that's\Na Dialogue: 0,0:28:23.56,0:28:26.42,Default,,0000,0000,0000,,shitty measure of success. I think there are\Nmuch Dialogue: 0,0:28:26.42,0:28:29.77,Default,,0000,0000,0000,,higher ideals than just whether something\Nis easy to Dialogue: 0,0:28:29.77,0:28:34.17,Default,,0000,0000,0000,,test. But it gets worse. Dialogue: 0,0:28:34.17,0:28:36.16,Default,,0000,0000,0000,,Here's another example. If you actually have\Na method Dialogue: 0,0:28:36.16,0:28:39.17,Default,,0000,0000,0000,,that depends on another method, we have to\Ninject Dialogue: 0,0:28:39.17,0:28:41.50,Default,,0000,0000,0000,,the dependency all the way down, now you're\Nreally Dialogue: 0,0:28:41.50,0:28:43.51,Default,,0000,0000,0000,,muddying things up and now the code is really Dialogue: 0,0:28:43.51,0:28:45.93,Default,,0000,0000,0000,,starting to get nasty. And this is such a Dialogue: 0,0:28:45.93,0:28:49.20,Default,,0000,0000,0000,,simple example. I've actually posted this\Nexample online before Dialogue: 0,0:28:49.20,0:28:51.81,Default,,0000,0000,0000,,and had arguments with TDD proponents about\Nthat. Dialogue: 0,0:28:51.81,0:28:53.38,Default,,0000,0000,0000,,And, yes, this is, I'm like, well, what does Dialogue: 0,0:28:53.38,0:28:57.03,Default,,0000,0000,0000,,it matter? You're just injecting one dependency,\Nwhat does Dialogue: 0,0:28:57.03,0:28:58.74,Default,,0000,0000,0000,,it matter? It's not that big of a deal, Dialogue: 0,0:28:58.74,0:29:00.09,Default,,0000,0000,0000,,right? Yes it is. Dialogue: 0,0:29:00.09,0:29:02.82,Default,,0000,0000,0000,,Because this is exactly the type of thinking\Nthat Dialogue: 0,0:29:02.82,0:29:05.90,Default,,0000,0000,0000,,leads you down a really nasty path. Let's\Nlook Dialogue: 0,0:29:05.90,0:29:07.02,Default,,0000,0000,0000,,at another example. Dialogue: 0,0:29:07.02,0:29:11.93,Default,,0000,0000,0000,,Here's a standard Rails controller. It has\Nreliance on Dialogue: 0,0:29:11.93,0:29:14.43,Default,,0000,0000,0000,,the world. It relies on a before action that Dialogue: 0,0:29:14.43,0:29:19.39,Default,,0000,0000,0000,,ensures permissions. It sets up a new object\Nand Dialogue: 0,0:29:19.39,0:29:21.63,Default,,0000,0000,0000,,sends out an email and then it responds to Dialogue: 0,0:29:21.63,0:29:24.33,Default,,0000,0000,0000,,something, right. The whole purpose of the\Ncontroller in Dialogue: 0,0:29:24.33,0:29:27.47,Default,,0000,0000,0000,,Rails is to sort of direct the world. It's Dialogue: 0,0:29:27.47,0:29:28.88,Default,,0000,0000,0000,,to interact with the world. Dialogue: 0,0:29:28.88,0:29:31.73,Default,,0000,0000,0000,,But how do you unit test that, right? That's Dialogue: 0,0:29:31.73,0:29:34.16,Default,,0000,0000,0000,,really hard. It's relying on the entire world.\NIf Dialogue: 0,0:29:34.16,0:29:37.50,Default,,0000,0000,0000,,we're following this scientific approach of\Nunit testing where Dialogue: 0,0:29:37.50,0:29:40.48,Default,,0000,0000,0000,,we're isolating all the variables, holding\Neverything else constant Dialogue: 0,0:29:40.48,0:29:43.27,Default,,0000,0000,0000,,except for these two things, what goes in,\Nwhat Dialogue: 0,0:29:43.27,0:29:49.74,Default,,0000,0000,0000,,goes out. This is bad, right. Dialogue: 0,0:29:49.74,0:29:53.52,Default,,0000,0000,0000,,If we instead put in something like a person Dialogue: 0,0:29:53.52,0:29:56.27,Default,,0000,0000,0000,,creation command and hide away all the actual\Ndoing Dialogue: 0,0:29:56.27,0:29:58.15,Default,,0000,0000,0000,,of the control and then we inject all the Dialogue: 0,0:29:58.15,0:30:00.99,Default,,0000,0000,0000,,stuff that it depends on we can test person Dialogue: 0,0:30:00.99,0:30:04.19,Default,,0000,0000,0000,,creation command really well. Dialogue: 0,0:30:04.19,0:30:07.47,Default,,0000,0000,0000,,Is that code better? Is that code simpler?\NIs Dialogue: 0,0:30:07.47,0:30:09.51,Default,,0000,0000,0000,,it clearer? Would you rather look at this\Nand Dialogue: 0,0:30:09.51,0:30:11.08,Default,,0000,0000,0000,,then understand what the system does or would\Nyou Dialogue: 0,0:30:11.08,0:30:13.30,Default,,0000,0000,0000,,rather look at this and try to figure out Dialogue: 0,0:30:13.30,0:30:16.15,Default,,0000,0000,0000,,where does this thing go? Dialogue: 0,0:30:16.15,0:30:21.64,Default,,0000,0000,0000,,And that's the consequence of this chase of\Ntest-first. Dialogue: 0,0:30:21.64,0:30:23.96,Default,,0000,0000,0000,,It leads you down a path where the gospel Dialogue: 0,0:30:23.96,0:30:28.14,Default,,0000,0000,0000,,of test-driven design is that anything that's\Neasier to Dialogue: 0,0:30:28.14,0:30:32.55,Default,,0000,0000,0000,,test is better. That's it. That's the measure\Nof Dialogue: 0,0:30:32.55,0:30:35.59,Default,,0000,0000,0000,,quality. If you can test it easily it's better. Dialogue: 0,0:30:35.59,0:30:39.06,Default,,0000,0000,0000,,If you can't test it easily, it's worse. Dialogue: 0,0:30:39.06,0:30:43.01,Default,,0000,0000,0000,,Boo. Exactly right. Boo. Dialogue: 0,0:30:43.01,0:30:45.83,Default,,0000,0000,0000,,It's not better. We're losing sight of what\Nwe're Dialogue: 0,0:30:45.83,0:30:48.66,Default,,0000,0000,0000,,actually trying to do. Tests were supposed\Nto support Dialogue: 0,0:30:48.66,0:30:53.95,Default,,0000,0000,0000,,us. They weren't supposed to be the main thing. Dialogue: 0,0:30:53.95,0:30:55.29,Default,,0000,0000,0000,,And I think this is leading to a lot Dialogue: 0,0:30:55.29,0:31:00.89,Default,,0000,0000,0000,,of Zombie astronautic architectures. Things\Nthat I thought we Dialogue: 0,0:31:00.89,0:31:04.48,Default,,0000,0000,0000,,moved past long ago. If you look at, at Dialogue: 0,0:31:04.48,0:31:07.98,Default,,0000,0000,0000,,this person create command, that reminds me\Nvery much Dialogue: 0,0:31:07.98,0:31:11.01,Default,,0000,0000,0000,,about Struts 1 point 2, and how they had Dialogue: 0,0:31:11.01,0:31:12.88,Default,,0000,0000,0000,,every action as their own object. And that\Nit Dialogue: 0,0:31:12.88,0:31:15.17,Default,,0000,0000,0000,,was great because it was easy to test, and Dialogue: 0,0:31:15.17,0:31:16.17,Default,,0000,0000,0000,,it was shit when you were trying to put Dialogue: 0,0:31:16.17,0:31:19.18,Default,,0000,0000,0000,,a whole architecture together, because you\Nhad all these Dialogue: 0,0:31:19.18,0:31:20.41,Default,,0000,0000,0000,,create commands and all of the sudden you\Nhad Dialogue: 0,0:31:20.41,0:31:22.25,Default,,0000,0000,0000,,a million objects. Yes, they were easier to\Ntest, Dialogue: 0,0:31:22.25,0:31:26.34,Default,,0000,0000,0000,,but the system was much harder to reason about. Dialogue: 0,0:31:26.34,0:31:28.67,Default,,0000,0000,0000,,You see the same thing around ActiveRecord,\Nfor example. Dialogue: 0,0:31:28.67,0:31:32.20,Default,,0000,0000,0000,,You see, well ActiveRecord should just be\Ndata access Dialogue: 0,0:31:32.20,0:31:34.08,Default,,0000,0000,0000,,objects. They shouldn't actually have any\Nlogic. They should Dialogue: 0,0:31:34.08,0:31:36.14,Default,,0000,0000,0000,,just be about interfacing with the database,\Nbecause then Dialogue: 0,0:31:36.14,0:31:38.34,Default,,0000,0000,0000,,we can split out everything else. Our domain\Nlogic, Dialogue: 0,0:31:38.34,0:31:40.72,Default,,0000,0000,0000,,it's just that it doesn't have to touch the Dialogue: 0,0:31:40.72,0:31:43.01,Default,,0000,0000,0000,,database, so that our tests can be simple,\Nso Dialogue: 0,0:31:43.01,0:31:46.07,Default,,0000,0000,0000,,that our tests can be fast, right? Dialogue: 0,0:31:46.07,0:31:52.92,Default,,0000,0000,0000,,Again. Order of priority. Test, test fast,\Noh, your Dialogue: 0,0:31:52.92,0:31:58.52,Default,,0000,0000,0000,,architecture. That'll just fall from that,\Nright? Dialogue: 0,0:31:58.52,0:32:02.88,Default,,0000,0000,0000,,I recently read James Coplien, has a great\Npaper Dialogue: 0,0:32:02.88,0:32:06.22,Default,,0000,0000,0000,,out called "Why Most Unit Testing is Waste."\NAnd Dialogue: 0,0:32:06.22,0:32:09.81,Default,,0000,0000,0000,,for me, this is the money quote. Splitting\Nup Dialogue: 0,0:32:09.81,0:32:13.64,Default,,0000,0000,0000,,functions to support the testing process,\Ndestroys your system Dialogue: 0,0:32:13.64,0:32:17.81,Default,,0000,0000,0000,,architecture and code comprehension along\Nwith it. Test at Dialogue: 0,0:32:17.81,0:32:22.33,Default,,0000,0000,0000,,a coarser level of granularity. Dialogue: 0,0:32:22.33,0:32:28.74,Default,,0000,0000,0000,,TDD is focused on the unit. The unit is Dialogue: 0,0:32:28.74,0:32:31.44,Default,,0000,0000,0000,,the sacred piece, because that's the science\Npiece. That's Dialogue: 0,0:32:31.44,0:32:33.42,Default,,0000,0000,0000,,what we can control all of the variables.\NWe're Dialogue: 0,0:32:33.42,0:32:35.95,Default,,0000,0000,0000,,just looking at these few pieces, right. Dialogue: 0,0:32:35.95,0:32:39.23,Default,,0000,0000,0000,,What James is saying, maybe that's not the\Nright Dialogue: 0,0:32:39.23,0:32:44.01,Default,,0000,0000,0000,,level. Maybe testing, the role it should have,\Nshouldn't Dialogue: 0,0:32:44.01,0:32:47.78,Default,,0000,0000,0000,,be about the unit most of the time. And, Dialogue: 0,0:32:47.78,0:32:50.02,Default,,0000,0000,0000,,I sort of alluded to this awhile back, I Dialogue: 0,0:32:50.02,0:32:54.22,Default,,0000,0000,0000,,wrote a post called Testing Like the TSA,\Nand Dialogue: 0,0:32:54.22,0:32:56.47,Default,,0000,0000,0000,,the main thing about that was about over-testing\Nand Dialogue: 0,0:32:56.47,0:32:58.48,Default,,0000,0000,0000,,sort of this testing theater that goes on.\NBut Dialogue: 0,0:32:58.48,0:33:02.36,Default,,0000,0000,0000,,I hadn't really made the switch that it, the Dialogue: 0,0:33:02.36,0:33:03.98,Default,,0000,0000,0000,,problem is that we're trying to test at the Dialogue: 0,0:33:03.98,0:33:05.06,Default,,0000,0000,0000,,wrong level. Dialogue: 0,0:33:05.06,0:33:07.11,Default,,0000,0000,0000,,It's not testing itself. Testing is great.\NI'm not Dialogue: 0,0:33:07.11,0:33:10.40,Default,,0000,0000,0000,,advocating that we shouldn't have tests. I'm\Nadvocating that Dialogue: 0,0:33:10.40,0:33:14.08,Default,,0000,0000,0000,,driving your design from unit tests is actually\Nnot Dialogue: 0,0:33:14.08,0:33:17.56,Default,,0000,0000,0000,,a good idea. That you actually end up destroying Dialogue: 0,0:33:17.56,0:33:20.04,Default,,0000,0000,0000,,your system architecture and your code comprehension\Nalong with Dialogue: 0,0:33:20.04,0:33:21.56,Default,,0000,0000,0000,,it. Dialogue: 0,0:33:21.56,0:33:26.02,Default,,0000,0000,0000,,So if unit tests aren't the thing, what could Dialogue: 0,0:33:26.02,0:33:26.85,Default,,0000,0000,0000,,we do instead? Dialogue: 0,0:33:26.85,0:33:29.62,Default,,0000,0000,0000,,Well, I think there are higher levels of testing. Dialogue: 0,0:33:29.62,0:33:31.27,Default,,0000,0000,0000,,We've already sort of moved to that in Rails. Dialogue: 0,0:33:31.27,0:33:33.66,Default,,0000,0000,0000,,It's no longer called test unit, where you\Nplace Dialogue: 0,0:33:33.66,0:33:37.09,Default,,0000,0000,0000,,your tests, it's called test models. That's\Nalready one Dialogue: 0,0:33:37.09,0:33:40.40,Default,,0000,0000,0000,,step up. That sort of frees you from feeling Dialogue: 0,0:33:40.40,0:33:42.57,Default,,0000,0000,0000,,bad about the fact that your, your model tests Dialogue: 0,0:33:42.57,0:33:44.97,Default,,0000,0000,0000,,actually touch the database. That's not a\Nbad thing. Dialogue: 0,0:33:44.97,0:33:46.95,Default,,0000,0000,0000,,Yes. They run slower. But they also test more Dialogue: 0,0:33:46.95,0:33:47.69,Default,,0000,0000,0000,,things. Dialogue: 0,0:33:47.69,0:33:49.18,Default,,0000,0000,0000,,You can make anything fast if it doesn't have Dialogue: 0,0:33:49.18,0:33:52.01,Default,,0000,0000,0000,,to work. Dialogue: 0,0:33:52.01,0:33:53.88,Default,,0000,0000,0000,,And I think that's the problem with testing\Nin Dialogue: 0,0:33:53.88,0:33:55.14,Default,,0000,0000,0000,,a lot of cases. We recently had a really Dialogue: 0,0:33:55.14,0:33:57.33,Default,,0000,0000,0000,,bad bug on base kim where we actually lost Dialogue: 0,0:33:57.33,0:34:01.01,Default,,0000,0000,0000,,some data for real customers. And it was incredibly Dialogue: 0,0:34:01.01,0:34:05.78,Default,,0000,0000,0000,,well-tested at the unit level. And all the\Ntests Dialogue: 0,0:34:05.78,0:34:08.18,Default,,0000,0000,0000,,passed. And still we lost data. How the fuck Dialogue: 0,0:34:08.18,0:34:09.92,Default,,0000,0000,0000,,did that happen? Dialogue: 0,0:34:09.92,0:34:11.75,Default,,0000,0000,0000,,It happened because we were so focused on\Ndriving Dialogue: 0,0:34:11.75,0:34:14.19,Default,,0000,0000,0000,,our design from the unit test level, we didn't Dialogue: 0,0:34:14.19,0:34:17.05,Default,,0000,0000,0000,,have any system tests for that particular\Nthing. And Dialogue: 0,0:34:17.05,0:34:18.58,Default,,0000,0000,0000,,it was a really simple thing. It was like, Dialogue: 0,0:34:18.58,0:34:21.11,Default,,0000,0000,0000,,if you were editing an object and you were Dialogue: 0,0:34:21.11,0:34:22.52,Default,,0000,0000,0000,,editing the attachments, you could lose an\Nattachment. And Dialogue: 0,0:34:22.52,0:34:25.56,Default,,0000,0000,0000,,we lost some attachments and it was a terrible Dialogue: 0,0:34:25.56,0:34:26.68,Default,,0000,0000,0000,,thing. Dialogue: 0,0:34:26.68,0:34:29.95,Default,,0000,0000,0000,,And after that, sort of thought, wait a minute. Dialogue: 0,0:34:29.95,0:34:33.21,Default,,0000,0000,0000,,All these unit tests are just focusing on\Nthese Dialogue: 0,0:34:33.21,0:34:36.14,Default,,0000,0000,0000,,core objects in the system. These individual\Nunit pieces. Dialogue: 0,0:34:36.14,0:34:38.18,Default,,0000,0000,0000,,It doesn't say anything about whether the\Nwhole system Dialogue: 0,0:34:38.18,0:34:38.83,Default,,0000,0000,0000,,works. Dialogue: 0,0:34:38.83,0:34:42.90,Default,,0000,0000,0000,,Most TDD proponents, I find, are much more\Nfocused Dialogue: 0,0:34:42.90,0:34:45.16,Default,,0000,0000,0000,,on the unit level, because that's where they're\Ndriving Dialogue: 0,0:34:45.16,0:34:47.22,Default,,0000,0000,0000,,their design. And they're not very much focused\Non Dialogue: 0,0:34:47.22,0:34:49.15,Default,,0000,0000,0000,,the system level at all, which is what people Dialogue: 0,0:34:49.15,0:34:50.19,Default,,0000,0000,0000,,actually give a shit about. Dialogue: 0,0:34:50.19,0:34:52.65,Default,,0000,0000,0000,,Does the system work? I don't care about whether Dialogue: 0,0:34:52.65,0:34:55.75,Default,,0000,0000,0000,,your units work. Does the whole thing work?\NThat's Dialogue: 0,0:34:55.75,0:34:57.76,Default,,0000,0000,0000,,what matters. Dialogue: 0,0:34:57.76,0:35:00.45,Default,,0000,0000,0000,,So that kind of freed my mind up a Dialogue: 0,0:35:00.45,0:35:03.23,Default,,0000,0000,0000,,little bit. That if we give up this need Dialogue: 0,0:35:03.23,0:35:05.24,Default,,0000,0000,0000,,for hard science experience, where we have\Nto control Dialogue: 0,0:35:05.24,0:35:07.14,Default,,0000,0000,0000,,all the variables and boil everything down\Nto a Dialogue: 0,0:35:07.14,0:35:09.22,Default,,0000,0000,0000,,single unit that can be tested, we can float Dialogue: 0,0:35:09.22,0:35:11.90,Default,,0000,0000,0000,,freely with the world. Dialogue: 0,0:35:11.90,0:35:13.53,Default,,0000,0000,0000,,Awesome. Dialogue: 0,0:35:13.53,0:35:18.14,Default,,0000,0000,0000,,This realization, I came to realize, was why\Npeople Dialogue: 0,0:35:18.14,0:35:22.74,Default,,0000,0000,0000,,hate fixtures. So fixtures in, in Rails is\Nabout Dialogue: 0,0:35:22.74,0:35:27.39,Default,,0000,0000,0000,,spinning up a world, it's about setting up,\Nsort Dialogue: 0,0:35:27.39,0:35:33.54,Default,,0000,0000,0000,,of, small size version of the whole world.\NWhere Dialogue: 0,0:35:33.54,0:35:36.78,Default,,0000,0000,0000,,most approaches, they focus on just one unit. Dialogue: 0,0:35:36.78,0:35:38.66,Default,,0000,0000,0000,,I don't want to have an account in here Dialogue: 0,0:35:38.66,0:35:40.30,Default,,0000,0000,0000,,and a project in here if I'm just testing Dialogue: 0,0:35:40.30,0:35:42.56,Default,,0000,0000,0000,,my message. I just want to test this one Dialogue: 0,0:35:42.56,0:35:44.97,Default,,0000,0000,0000,,single thing, right. And if you're doing that,\Nyeah, Dialogue: 0,0:35:44.97,0:35:46.51,Default,,0000,0000,0000,,fixtures are probably not a good thing. It\Ndoesn't Dialogue: 0,0:35:46.51,0:35:47.67,Default,,0000,0000,0000,,really work for that. Dialogue: 0,0:35:47.67,0:35:50.73,Default,,0000,0000,0000,,It works really well when you're not concerned\Nabout Dialogue: 0,0:35:50.73,0:35:53.70,Default,,0000,0000,0000,,the hard science focus on unit tests. It works Dialogue: 0,0:35:53.70,0:35:57.30,Default,,0000,0000,0000,,really well when you're focused on a larger\Nlevel. Dialogue: 0,0:35:57.30,0:35:58.81,Default,,0000,0000,0000,,When you're focused on models, when you're\Nfocused on Dialogue: 0,0:35:58.81,0:36:03.32,Default,,0000,0000,0000,,controllers, and most importantly when you're\Nfocused on systems. Dialogue: 0,0:36:03.32,0:36:09.41,Default,,0000,0000,0000,,But all that is sort of usually swept away Dialogue: 0,0:36:09.41,0:36:14.97,Default,,0000,0000,0000,,by the holy trinity of test metrics. Coverage,\Nratio, Dialogue: 0,0:36:14.97,0:36:17.23,Default,,0000,0000,0000,,and speed. Dialogue: 0,0:36:17.23,0:36:23.92,Default,,0000,0000,0000,,I've been in a lot of internet arguments lately. Dialogue: 0,0:36:23.92,0:36:28.25,Default,,0000,0000,0000,,In such esteemed establishments as Hacker\NNews, and, and Dialogue: 0,0:36:28.25,0:36:31.97,Default,,0000,0000,0000,,elsewhere, and I find it really interesting,\Nbecause each Dialogue: 0,0:36:31.97,0:36:35.41,Default,,0000,0000,0000,,individual argument will make me rage, but\Nthen the Dialogue: 0,0:36:35.41,0:36:38.40,Default,,0000,0000,0000,,larger set of all arguments, like a meta study, Dialogue: 0,0:36:38.40,0:36:41.06,Default,,0000,0000,0000,,actually reveals really interesting things\Nabout what people care Dialogue: 0,0:36:41.06,0:36:42.40,Default,,0000,0000,0000,,about. What they value. Dialogue: 0,0:36:42.40,0:36:44.85,Default,,0000,0000,0000,,And what I find is, in most discussions about Dialogue: 0,0:36:44.85,0:36:48.21,Default,,0000,0000,0000,,design, especially around Rails, what people\Ncare about these Dialogue: 0,0:36:48.21,0:36:51.52,Default,,0000,0000,0000,,things, and these things only. It's about\Nthe test Dialogue: 0,0:36:51.52,0:36:53.75,Default,,0000,0000,0000,,coverage. It's about the test ratio. And it's\Nabout Dialogue: 0,0:36:53.75,0:36:55.65,Default,,0000,0000,0000,,how fast your tests run. Dialogue: 0,0:36:55.65,0:36:59.63,Default,,0000,0000,0000,,Like, that's the pedestal. That's the holy\Ngrail. What Dialogue: 0,0:36:59.63,0:37:03.73,Default,,0000,0000,0000,,actually happens underneath, the design of\Nthe rest of Dialogue: 0,0:37:03.73,0:37:07.14,Default,,0000,0000,0000,,the application is, eh. Doesn't really matter. Dialogue: 0,0:37:07.14,0:37:10.00,Default,,0000,0000,0000,,And thus, a lot of people come to celebrate, Dialogue: 0,0:37:10.00,0:37:12.67,Default,,0000,0000,0000,,oh, I have a one to four test ratio. Dialogue: 0,0:37:12.67,0:37:14.53,Default,,0000,0000,0000,,For every line of production code, I have\Nfour Dialogue: 0,0:37:14.53,0:37:18.63,Default,,0000,0000,0000,,lines of test. Oh yeah. Dialogue: 0,0:37:18.63,0:37:22.57,Default,,0000,0000,0000,,And they say that with pride. And I'm like, Dialogue: 0,0:37:22.57,0:37:25.23,Default,,0000,0000,0000,,what? So you're saying for every line of production Dialogue: 0,0:37:25.23,0:37:26.89,Default,,0000,0000,0000,,code you write, you have to write four lines Dialogue: 0,0:37:26.89,0:37:29.14,Default,,0000,0000,0000,,of code? And that somehow makes you a hero? Dialogue: 0,0:37:29.14,0:37:31.40,Default,,0000,0000,0000,,How, how does that work? Dialogue: 0,0:37:31.40,0:37:34.11,Default,,0000,0000,0000,,So your system is now five times as large, Dialogue: 0,0:37:34.11,0:37:35.77,Default,,0000,0000,0000,,reasoning about the whole system is now five\Ntimes Dialogue: 0,0:37:35.77,0:37:38.76,Default,,0000,0000,0000,,as complex, and you're proud of this, why?\NWell, Dialogue: 0,0:37:38.76,0:37:41.84,Default,,0000,0000,0000,,of course, because I have a hundred percent\Ncoverage. Dialogue: 0,0:37:41.84,0:37:44.98,Default,,0000,0000,0000,,My five thousand tests run incredibly fast\Nbecause they Dialogue: 0,0:37:44.98,0:37:47.07,Default,,0000,0000,0000,,never actually test very much. Dialogue: 0,0:37:47.07,0:37:49.42,Default,,0000,0000,0000,,They certainly do not test the system. They\Ntest Dialogue: 0,0:37:49.42,0:37:52.80,Default,,0000,0000,0000,,all these little slices of unit. Wonderful. Dialogue: 0,0:37:52.80,0:37:56.10,Default,,0000,0000,0000,,It's not wonderful. You have anemic fucking\Ntests. They Dialogue: 0,0:37:56.10,0:37:57.97,Default,,0000,0000,0000,,don't prove shit. You're gonna have the same\Nbug Dialogue: 0,0:37:57.97,0:38:00.12,Default,,0000,0000,0000,,that we have on base camp, and the system Dialogue: 0,0:38:00.12,0:38:01.96,Default,,0000,0000,0000,,is not going to work even though you've proudly Dialogue: 0,0:38:01.96,0:38:05.54,Default,,0000,0000,0000,,proclaimed, oh, well, your units are working. Dialogue: 0,0:38:05.54,0:38:10.24,Default,,0000,0000,0000,,Well, whoopity-doo. This decoupling is now\Nfree. People think Dialogue: 0,0:38:10.24,0:38:13.81,Default,,0000,0000,0000,,that, oh, this is like that saying, like,\Nquality's Dialogue: 0,0:38:13.81,0:38:16.51,Default,,0000,0000,0000,,free. Right. Testing is free. Not when you're\Ndoing Dialogue: 0,0:38:16.51,0:38:21.02,Default,,0000,0000,0000,,it like this. It's not free. Dialogue: 0,0:38:21.02,0:38:22.76,Default,,0000,0000,0000,,And most importantly, it's not free, not so\Nmuch Dialogue: 0,0:38:22.76,0:38:27.46,Default,,0000,0000,0000,,in time, but in conceptual overhead. Understanding\Na system Dialogue: 0,0:38:27.46,0:38:32.78,Default,,0000,0000,0000,,that has been test-driven designed from the\Nunit perspective Dialogue: 0,0:38:32.78,0:38:36.40,Default,,0000,0000,0000,,is really hard. Because you have all these\Nlevels Dialogue: 0,0:38:36.40,0:38:40.17,Default,,0000,0000,0000,,of indirection. You have all these levels\Nof intermediation. Dialogue: 0,0:38:40.17,0:38:45.24,Default,,0000,0000,0000,,To separate the tests from slow things, like\NHTML Dialogue: 0,0:38:45.24,0:38:47.76,Default,,0000,0000,0000,,or the database or, any of the other parts Dialogue: 0,0:38:47.76,0:38:50.46,Default,,0000,0000,0000,,of the system that actually makes up your\Nsystem. Dialogue: 0,0:38:50.46,0:38:53.80,Default,,0000,0000,0000,,And they focus just on that one thing. So Dialogue: 0,0:38:53.80,0:38:56.06,Default,,0000,0000,0000,,they can be very fast, if they don't have Dialogue: 0,0:38:56.06,0:38:57.65,Default,,0000,0000,0000,,to work. They don't actually have to test\Nyour Dialogue: 0,0:38:57.65,0:38:58.99,Default,,0000,0000,0000,,system. Dialogue: 0,0:38:58.99,0:39:01.28,Default,,0000,0000,0000,,So that's sort of two charges in one. It's Dialogue: 0,0:39:01.28,0:39:04.09,Default,,0000,0000,0000,,a charge first that your design is not going Dialogue: 0,0:39:04.09,0:39:07.26,Default,,0000,0000,0000,,to improve. Your design is going to deteriorate\Nby Dialogue: 0,0:39:07.26,0:39:11.07,Default,,0000,0000,0000,,doing test first programming, because you're\Ngoing to construct Dialogue: 0,0:39:11.07,0:39:15.44,Default,,0000,0000,0000,,your units of testing, your methods, in a\Ndifferent Dialogue: 0,0:39:15.44,0:39:16.98,Default,,0000,0000,0000,,way, like we say with the age example. You're Dialogue: 0,0:39:16.98,0:39:19.97,Default,,0000,0000,0000,,going to inject all your dependencies in a\Nway Dialogue: 0,0:39:19.97,0:39:21.98,Default,,0000,0000,0000,,that does not prove things. Dialogue: 0,0:39:21.98,0:39:23.61,Default,,0000,0000,0000,,And second of all, you're not gonna get the Dialogue: 0,0:39:23.61,0:39:26.53,Default,,0000,0000,0000,,benefit of great coverage. You might have\Na lot Dialogue: 0,0:39:26.53,0:39:28.47,Default,,0000,0000,0000,,of tests, but they don't test your system.\NIt Dialogue: 0,0:39:28.47,0:39:33.14,Default,,0000,0000,0000,,doesn't improve your confidence in actually\Nthe whole thing Dialogue: 0,0:39:33.14,0:39:35.85,Default,,0000,0000,0000,,working, and then what good is it? Dialogue: 0,0:39:35.85,0:39:40.90,Default,,0000,0000,0000,,Well, I thought about this for a long time Dialogue: 0,0:39:40.90,0:39:44.95,Default,,0000,0000,0000,,and thought, like, this is not really, it\Ndoesn't Dialogue: 0,0:39:44.95,0:39:47.59,Default,,0000,0000,0000,,seem like that great of a revelation. Why,\Nwhy Dialogue: 0,0:39:47.59,0:39:50.37,Default,,0000,0000,0000,,do I keep having these arguments over and\Nover Dialogue: 0,0:39:50.37,0:39:52.92,Default,,0000,0000,0000,,again? Why are people focused so hard and\Nso Dialogue: 0,0:39:52.92,0:39:57.69,Default,,0000,0000,0000,,intensely on this trinity of test metrics?\NHow did Dialogue: 0,0:39:57.69,0:40:00.51,Default,,0000,0000,0000,,that come to be the main thing that people Dialogue: 0,0:40:00.51,0:40:01.53,Default,,0000,0000,0000,,are arguing about? Dialogue: 0,0:40:01.53,0:40:03.23,Default,,0000,0000,0000,,How did that come to be the main decider Dialogue: 0,0:40:03.23,0:40:05.67,Default,,0000,0000,0000,,of what's good design and what's bad design?\NReally, Dialogue: 0,0:40:05.67,0:40:09.76,Default,,0000,0000,0000,,couldn't really figure it out. Until I started\Nthinking Dialogue: 0,0:40:09.76,0:40:11.70,Default,,0000,0000,0000,,back of like, what is this prism we're looking Dialogue: 0,0:40:11.70,0:40:17.63,Default,,0000,0000,0000,,through? We're looking through computer science.\NEngineering. Professionalism. Dialogue: 0,0:40:17.63,0:40:21.55,Default,,0000,0000,0000,,James Harrington wrote a bunch of books on\Nquality Dialogue: 0,0:40:21.55,0:40:23.94,Default,,0000,0000,0000,,of engineering, and he has a great quote here. Dialogue: 0,0:40:23.94,0:40:26.89,Default,,0000,0000,0000,,If you can't measure something, you can't\Nunderstand it. Dialogue: 0,0:40:26.89,0:40:28.95,Default,,0000,0000,0000,,If you can't understand it, you can't control\Nit. Dialogue: 0,0:40:28.95,0:40:31.28,Default,,0000,0000,0000,,If you can't control it, you can't improve\Nit. Dialogue: 0,0:40:31.28,0:40:36.31,Default,,0000,0000,0000,,That makes a lot of sense. Cause like, yeah, Dialogue: 0,0:40:36.31,0:40:38.08,Default,,0000,0000,0000,,yeah, that makes sense. That's gotta be why.\NAnd Dialogue: 0,0:40:38.08,0:40:40.51,Default,,0000,0000,0000,,then I got another great quote. Just because\Nyou Dialogue: 0,0:40:40.51,0:40:43.04,Default,,0000,0000,0000,,can, just because something is easy to measure\Ndoesn't Dialogue: 0,0:40:43.04,0:40:44.18,Default,,0000,0000,0000,,mean it's important. Dialogue: 0,0:40:44.18,0:40:48.99,Default,,0000,0000,0000,,This, I think, is exactly what's going on\Nhere. Dialogue: 0,0:40:48.99,0:40:52.81,Default,,0000,0000,0000,,Programming of information systems is a lot\Nmore like Dialogue: 0,0:40:52.81,0:40:57.61,Default,,0000,0000,0000,,French poetry than it is like physics. But\Nprogrammers Dialogue: 0,0:40:57.61,0:41:00.28,Default,,0000,0000,0000,,grow up thinking that they're computer scientists,\Nso they Dialogue: 0,0:41:00.28,0:41:03.21,Default,,0000,0000,0000,,want it really badly to be like physics. They Dialogue: 0,0:41:03.21,0:41:06.71,Default,,0000,0000,0000,,want it really badly to be a hard, professional Dialogue: 0,0:41:06.71,0:41:07.82,Default,,0000,0000,0000,,science. Dialogue: 0,0:41:07.82,0:41:13.59,Default,,0000,0000,0000,,And coverage, ratio, and speed. You can get\Nthat Dialogue: 0,0:41:13.59,0:41:18.33,Default,,0000,0000,0000,,fucking thing down to six decimals. Like,\Nthat, I Dialogue: 0,0:41:18.33,0:41:20.35,Default,,0000,0000,0000,,can be so precise about how fast my test Dialogue: 0,0:41:20.35,0:41:26.30,Default,,0000,0000,0000,,runs, eighty-four point seven percent coverage,\Nboom. Got it. Dialogue: 0,0:41:26.30,0:41:28.02,Default,,0000,0000,0000,,Doesn't say anything about whether or not\Nthat's actually Dialogue: 0,0:41:28.02,0:41:31.75,Default,,0000,0000,0000,,important. Doesn't say anything about whether\Nthat's actually producing Dialogue: 0,0:41:31.75,0:41:33.55,Default,,0000,0000,0000,,a good system. Doesn't say anything about\Nwhether the Dialogue: 0,0:41:33.55,0:41:36.28,Default,,0000,0000,0000,,person after you, or you yourself, three months\Nfrom Dialogue: 0,0:41:36.28,0:41:38.37,Default,,0000,0000,0000,,now, can understand what the hell is going\Non Dialogue: 0,0:41:38.37,0:41:41.26,Default,,0000,0000,0000,,in this code base. Dialogue: 0,0:41:41.26,0:41:43.48,Default,,0000,0000,0000,,You haven't necessarily made anything any\Nclearer. You've made Dialogue: 0,0:41:43.48,0:41:47.88,Default,,0000,0000,0000,,it very easy to produce metrics. And if there's Dialogue: 0,0:41:47.88,0:41:51.48,Default,,0000,0000,0000,,one thing we love with, with science, it's\Nclear Dialogue: 0,0:41:51.48,0:41:58.33,Default,,0000,0000,0000,,concise objective truths and coverage and\Nratio and speed Dialogue: 0,0:41:58.33,0:42:00.69,Default,,0000,0000,0000,,fit that bill. So we adopted them with open Dialogue: 0,0:42:00.69,0:42:03.91,Default,,0000,0000,0000,,arms, even though they were not that important. Dialogue: 0,0:42:03.91,0:42:08.45,Default,,0000,0000,0000,,Second part of it. Cost is not value. A Dialogue: 0,0:42:08.45,0:42:12.18,Default,,0000,0000,0000,,lot of people have invested so much in building Dialogue: 0,0:42:12.18,0:42:17.61,Default,,0000,0000,0000,,up their expertise, their time, their four-to-one\Nratio in Dialogue: 0,0:42:17.61,0:42:22.08,Default,,0000,0000,0000,,tests. The investment is massive. Well, of\Ncourse they're Dialogue: 0,0:42:22.08,0:42:25.01,Default,,0000,0000,0000,,gonna be defensive about it. Like, you've\Ninvested so Dialogue: 0,0:42:25.01,0:42:28.32,Default,,0000,0000,0000,,much of your ego and your time and your Dialogue: 0,0:42:28.32,0:42:31.07,Default,,0000,0000,0000,,resources on this project, into testing. So\Nof course Dialogue: 0,0:42:31.07,0:42:33.37,Default,,0000,0000,0000,,it must be valuable. Of course it must be Dialogue: 0,0:42:33.37,0:42:33.78,Default,,0000,0000,0000,,important. Dialogue: 0,0:42:33.78,0:42:36.65,Default,,0000,0000,0000,,That's not how it works. Just because something\Nis Dialogue: 0,0:42:36.65,0:42:39.41,Default,,0000,0000,0000,,really expensive, just because something takes\Na lot of Dialogue: 0,0:42:39.41,0:42:42.61,Default,,0000,0000,0000,,your time doesn't mean it's valuable. Doesn't\Nmean it's Dialogue: 0,0:42:42.61,0:42:47.62,Default,,0000,0000,0000,,important. Dialogue: 0,0:42:47.62,0:42:52.44,Default,,0000,0000,0000,,So I was sort of giving a brief description Dialogue: 0,0:42:52.44,0:42:57.08,Default,,0000,0000,0000,,of this talk yesterday at dinner with Aaron\NPatterson, Dialogue: 0,0:42:57.08,0:43:01.37,Default,,0000,0000,0000,,and he trolled me right back and said, TL;DR, Dialogue: 0,0:43:01.37,0:43:03.94,Default,,0000,0000,0000,,just don't test, right. Like, that's what\NI'm supposed Dialogue: 0,0:43:03.94,0:43:06.99,Default,,0000,0000,0000,,to get out of this. Dialogue: 0,0:43:06.99,0:43:12.43,Default,,0000,0000,0000,,No. No. Testing absolutely has value. Regression\Ntesting absolutely Dialogue: 0,0:43:12.43,0:43:18.09,Default,,0000,0000,0000,,has value. Driving your design through test\Nfirst? In Dialogue: 0,0:43:18.09,0:43:23.04,Default,,0000,0000,0000,,my mind, rarely has value. Not never. There\Nare Dialogue: 0,0:43:23.04,0:43:25.01,Default,,0000,0000,0000,,times where I'll write my tests first, usually\Nwhen Dialogue: 0,0:43:25.01,0:43:29.21,Default,,0000,0000,0000,,it's something like a translator of some kind,\Nwhere Dialogue: 0,0:43:29.21,0:43:30.55,Default,,0000,0000,0000,,I know exactly what's going in and I know Dialogue: 0,0:43:30.55,0:43:31.72,Default,,0000,0000,0000,,exactly what I want out. Dialogue: 0,0:43:31.72,0:43:33.81,Default,,0000,0000,0000,,That could be a good case to start with Dialogue: 0,0:43:33.81,0:43:37.00,Default,,0000,0000,0000,,test first. Most information system design\Nis not like Dialogue: 0,0:43:37.00,0:43:38.64,Default,,0000,0000,0000,,that. I'm trying to figure out and sell what Dialogue: 0,0:43:38.64,0:43:41.83,Default,,0000,0000,0000,,the system is supposed to do. What I'm going Dialogue: 0,0:43:41.83,0:43:44.24,Default,,0000,0000,0000,,to arrive at is the test, is this set Dialogue: 0,0:43:44.24,0:43:46.62,Default,,0000,0000,0000,,of tests, it's a set of regression tests,\Nthat Dialogue: 0,0:43:46.62,0:43:47.96,Default,,0000,0000,0000,,make me feel good about that after the fact, Dialogue: 0,0:43:47.96,0:43:50.43,Default,,0000,0000,0000,,that I can still change my system and not Dialogue: 0,0:43:50.43,0:43:56.23,Default,,0000,0000,0000,,break it, right. Dialogue: 0,0:43:56.23,0:44:03.23,Default,,0000,0000,0000,,So TDD. Kent Beck. Main proponent behind TDD\Nhas Dialogue: 0,0:44:05.84,0:44:08.87,Default,,0000,0000,0000,,a very sensible quote that goes exactly along\Nthese Dialogue: 0,0:44:08.87,0:44:12.21,Default,,0000,0000,0000,,lines. I get paid for code that works, not Dialogue: 0,0:44:12.21,0:44:15.08,Default,,0000,0000,0000,,for tests, so my philosophy is to test as Dialogue: 0,0:44:15.08,0:44:18.89,Default,,0000,0000,0000,,little as possible to reach a given level\Nof Dialogue: 0,0:44:18.89,0:44:19.58,Default,,0000,0000,0000,,confidence. Dialogue: 0,0:44:19.58,0:44:24.37,Default,,0000,0000,0000,,Immensely sensible. I find that that's actually\Noften the Dialogue: 0,0:44:24.37,0:44:27.89,Default,,0000,0000,0000,,case with these things that get taken too\Nfar. Dialogue: 0,0:44:27.89,0:44:32.58,Default,,0000,0000,0000,,TDD started out as a pretty sensible thing.\NKent Dialogue: 0,0:44:32.58,0:44:35.39,Default,,0000,0000,0000,,has an even more sensible perception of it\Nnow, Dialogue: 0,0:44:35.39,0:44:39.27,Default,,0000,0000,0000,,I think, than when he wrote the test-driven\Nbook Dialogue: 0,0:44:39.27,0:44:42.71,Default,,0000,0000,0000,,originally. But that's not what most people\Ntake away. Dialogue: 0,0:44:42.71,0:44:44.84,Default,,0000,0000,0000,,That's not what most people run with if they Dialogue: 0,0:44:44.84,0:44:46.95,Default,,0000,0000,0000,,want to build a career on making people feel Dialogue: 0,0:44:46.95,0:44:50.18,Default,,0000,0000,0000,,shitty about their code bases and their dirty,\Ndirty Dialogue: 0,0:44:50.18,0:44:50.69,Default,,0000,0000,0000,,code. Dialogue: 0,0:44:50.69,0:44:54.45,Default,,0000,0000,0000,,They take a much more extremist approach,\Nthat unless Dialogue: 0,0:44:54.45,0:44:59.44,Default,,0000,0000,0000,,you're doing test-first, you're not a professional.\NCertainly not Dialogue: 0,0:44:59.44,0:45:01.84,Default,,0000,0000,0000,,what Kent's saying. Dialogue: 0,0:45:01.84,0:45:06.62,Default,,0000,0000,0000,,OK. So for me, this really boils down to, Dialogue: 0,0:45:06.62,0:45:09.95,Default,,0000,0000,0000,,we're, we're trying to wear the wrong hat\Nthe Dialogue: 0,0:45:09.95,0:45:13.09,Default,,0000,0000,0000,,majority of the time. Thinking of yourself\Nas a Dialogue: 0,0:45:13.09,0:45:18.13,Default,,0000,0000,0000,,software engineer will lead you down the path\Nof Dialogue: 0,0:45:18.13,0:45:24.15,Default,,0000,0000,0000,,coverage, speed, metrics, hard sciences - all\Nthese things Dialogue: 0,0:45:24.15,0:45:29.26,Default,,0000,0000,0000,,we can measure and it leave you laughing at Dialogue: 0,0:45:29.26,0:45:34.72,Default,,0000,0000,0000,,shit like interpretation of French poetry.\NOf subjective evaluations Dialogue: 0,0:45:34.72,0:45:36.88,Default,,0000,0000,0000,,of a design in the system, even though these Dialogue: 0,0:45:36.88,0:45:39.64,Default,,0000,0000,0000,,are the only tools that we have. Dialogue: 0,0:45:39.64,0:45:43.35,Default,,0000,0000,0000,,So this has taken me awhile to arrive at Dialogue: 0,0:45:43.35,0:45:45.96,Default,,0000,0000,0000,,this conclusion. I've hated the word software\Nengineer for Dialogue: 0,0:45:45.96,0:45:48.66,Default,,0000,0000,0000,,quite awhile. Cause I never felt it fit me. Dialogue: 0,0:45:48.66,0:45:51.51,Default,,0000,0000,0000,,I never thought of myself as a software engineer. Dialogue: 0,0:45:51.51,0:45:53.67,Default,,0000,0000,0000,,I kind of tried to be one, a few Dialogue: 0,0:45:53.67,0:45:55.75,Default,,0000,0000,0000,,times, and I failed all the time. And by Dialogue: 0,0:45:55.75,0:45:58.36,Default,,0000,0000,0000,,the time I finally arrived at programming\Nas something Dialogue: 0,0:45:58.36,0:46:00.28,Default,,0000,0000,0000,,that I wanted to do, it sure as shit Dialogue: 0,0:46:00.28,0:46:02.57,Default,,0000,0000,0000,,wasn't software engineering. Dialogue: 0,0:46:02.57,0:46:06.23,Default,,0000,0000,0000,,Yes. It's a hard hat that I wear occasionally, Dialogue: 0,0:46:06.23,0:46:10.56,Default,,0000,0000,0000,,when I do performance optimization. That's\Nhard science. You Dialogue: 0,0:46:10.56,0:46:13.22,Default,,0000,0000,0000,,make a change. You measure it. Was it an Dialogue: 0,0:46:13.22,0:46:19.04,Default,,0000,0000,0000,,improvement? If not, revert. If yes, deploy.\NVery scientific. Dialogue: 0,0:46:19.04,0:46:20.79,Default,,0000,0000,0000,,Very good. Dialogue: 0,0:46:20.79,0:46:23.86,Default,,0000,0000,0000,,Great to wear the hard hat when that fits. Dialogue: 0,0:46:23.86,0:46:25.68,Default,,0000,0000,0000,,Is what, that what I do the majority of Dialogue: 0,0:46:25.68,0:46:27.48,Default,,0000,0000,0000,,the time? Is that how I think of myself Dialogue: 0,0:46:27.48,0:46:29.48,Default,,0000,0000,0000,,when I write most of the things that I Dialogue: 0,0:46:29.48,0:46:31.30,Default,,0000,0000,0000,,write? When I add a new feature to base Dialogue: 0,0:46:31.30,0:46:34.11,Default,,0000,0000,0000,,camp or do forensics to figure out how a Dialogue: 0,0:46:34.11,0:46:37.12,Default,,0000,0000,0000,,bug came about, or what somebody meant when\Nthey Dialogue: 0,0:46:37.12,0:46:39.28,Default,,0000,0000,0000,,wrote a bug in or something? No. That's not Dialogue: 0,0:46:39.28,0:46:40.71,Default,,0000,0000,0000,,what I do. Dialogue: 0,0:46:40.71,0:46:42.37,Default,,0000,0000,0000,,So I don't try to think of myself as Dialogue: 0,0:46:42.37,0:46:43.53,Default,,0000,0000,0000,,a software engineer. Dialogue: 0,0:46:43.53,0:46:48.04,Default,,0000,0000,0000,,OK. If we're not software engineers, most\Nof the Dialogue: 0,0:46:48.04,0:46:51.62,Default,,0000,0000,0000,,time when we make information systems, what\Nare we Dialogue: 0,0:46:51.62,0:46:55.06,Default,,0000,0000,0000,,then? What other hat should we try to wear? Dialogue: 0,0:46:55.06,0:46:58.52,Default,,0000,0000,0000,,What other identity should we try to aspire\Nto? Dialogue: 0,0:46:58.52,0:47:01.11,Default,,0000,0000,0000,,I think we had it all along. I think Dialogue: 0,0:47:01.11,0:47:04.00,Default,,0000,0000,0000,,we had it in the language all along. We're Dialogue: 0,0:47:04.00,0:47:10.32,Default,,0000,0000,0000,,software writers. Writing is a much more apt\Nmetaphor Dialogue: 0,0:47:10.32,0:47:12.51,Default,,0000,0000,0000,,for what we do most of the time, than Dialogue: 0,0:47:12.51,0:47:19.51,Default,,0000,0000,0000,,engineering is. Writing is about clarity.\NIt's about presenting Dialogue: 0,0:47:22.34,0:47:28.46,Default,,0000,0000,0000,,information and motivations in a clear-to-follow\Nmanner so that Dialogue: 0,0:47:28.46,0:47:29.64,Default,,0000,0000,0000,,anybody can understand it. Dialogue: 0,0:47:29.64,0:47:33.77,Default,,0000,0000,0000,,There are not bonus points for making something\Nconvoluted, Dialogue: 0,0:47:33.77,0:47:37.35,Default,,0000,0000,0000,,as there often is with engineering and with\Ntest-first Dialogue: 0,0:47:37.35,0:47:40.39,Default,,0000,0000,0000,,design. Making things more convoluted gives\Nyou the benefits Dialogue: 0,0:47:40.39,0:47:44.00,Default,,0000,0000,0000,,of, perhaps, easier to test. They don't give\Nyou Dialogue: 0,0:47:44.00,0:47:49.16,Default,,0000,0000,0000,,clarity. So those things are often in opposition. Dialogue: 0,0:47:49.16,0:47:52.64,Default,,0000,0000,0000,,Clarity is all about being succinct without\Nbeing terse. Dialogue: 0,0:47:52.64,0:47:56.14,Default,,0000,0000,0000,,WE can write things using as small words as Dialogue: 0,0:47:56.14,0:47:59.67,Default,,0000,0000,0000,,we know how, using as little complication\Nas we Dialogue: 0,0:47:59.67,0:48:03.30,Default,,0000,0000,0000,,know how, using as little conceptual overhead\Nas we Dialogue: 0,0:48:03.30,0:48:06.95,Default,,0000,0000,0000,,know how to get the job done. Dialogue: 0,0:48:06.95,0:48:10.14,Default,,0000,0000,0000,,That's a much better approach. And I think\Nit Dialogue: 0,0:48:10.14,0:48:14.17,Default,,0000,0000,0000,,comes very easy if you think of software development Dialogue: 0,0:48:14.17,0:48:16.76,Default,,0000,0000,0000,,as writing. If you look at a piece of Dialogue: 0,0:48:16.76,0:48:18.68,Default,,0000,0000,0000,,writing that somebody has written and it's\Nkind of Dialogue: 0,0:48:18.68,0:48:21.69,Default,,0000,0000,0000,,convoluted, can't really follow the argument,\Nand paragraphs are Dialogue: 0,0:48:21.69,0:48:24.02,Default,,0000,0000,0000,,not broken up neatly, is the first thing you're Dialogue: 0,0:48:24.02,0:48:25.50,Default,,0000,0000,0000,,gonna say, you know what the problem with\Nthis Dialogue: 0,0:48:25.50,0:48:28.76,Default,,0000,0000,0000,,is? You're not using big enough words. Dialogue: 0,0:48:28.76,0:48:30.83,Default,,0000,0000,0000,,If we just shoved some bigger words into this Dialogue: 0,0:48:30.83,0:48:34.98,Default,,0000,0000,0000,,text, it's gonna be there. That's good. Oh.\NThe Dialogue: 0,0:48:34.98,0:48:37.75,Default,,0000,0000,0000,,problem here is like, like your sentences\Nare too Dialogue: 0,0:48:37.75,0:48:41.62,Default,,0000,0000,0000,,clear. If you just insert a sentence in the Dialogue: 0,0:48:41.62,0:48:43.92,Default,,0000,0000,0000,,middle, that'd be great. Oh, do you know what? Dialogue: 0,0:48:43.92,0:48:46.80,Default,,0000,0000,0000,,This needs more semicolons. That's what this\Nneeds. If Dialogue: 0,0:48:46.80,0:48:50.91,Default,,0000,0000,0000,,this has more semicolons, boom. You got clarity. Dialogue: 0,0:48:50.91,0:48:54.00,Default,,0000,0000,0000,,No. More indirection. More third-person. These\Nare not the Dialogue: 0,0:48:54.00,0:48:57.05,Default,,0000,0000,0000,,things that make for great, clear writing.\NAnd that's Dialogue: 0,0:48:57.05,0:48:59.63,Default,,0000,0000,0000,,obvious when we talk about things like writing.\NSO Dialogue: 0,0:48:59.63,0:49:02.87,Default,,0000,0000,0000,,if we talk about software development as writing,\NI Dialogue: 0,0:49:02.87,0:49:05.87,Default,,0000,0000,0000,,think it'll be obvious too. I think if we Dialogue: 0,0:49:05.87,0:49:10.96,Default,,0000,0000,0000,,supplant the high ideal of what matters for\Ndesign Dialogue: 0,0:49:10.96,0:49:12.43,Default,,0000,0000,0000,,is how easy it is to test, how easy Dialogue: 0,0:49:12.43,0:49:16.17,Default,,0000,0000,0000,,it is to make engineering driven, and put\Nclarity Dialogue: 0,0:49:16.17,0:49:20.24,Default,,0000,0000,0000,,of the code base above all else, we're gonna Dialogue: 0,0:49:20.24,0:49:22.66,Default,,0000,0000,0000,,be much better off. And arguments are gonna\Nbe Dialogue: 0,0:49:22.66,0:49:25.89,Default,,0000,0000,0000,,settled much easier. And it's gonna be much\Neasier Dialogue: 0,0:49:25.89,0:49:27.67,Default,,0000,0000,0000,,to read the fucking code you wrote three months Dialogue: 0,0:49:27.67,0:49:30.10,Default,,0000,0000,0000,,ago, because you had that in mind. Dialogue: 0,0:49:30.10,0:49:31.68,Default,,0000,0000,0000,,That was your motivation. That was what you\Nwere Dialogue: 0,0:49:31.68,0:49:33.84,Default,,0000,0000,0000,,going for. Dialogue: 0,0:49:33.84,0:49:38.01,Default,,0000,0000,0000,,So what is clarity? How do you figure that Dialogue: 0,0:49:38.01,0:49:40.54,Default,,0000,0000,0000,,out, right? That's real easy to say, oh it's Dialogue: 0,0:49:40.54,0:49:46.19,Default,,0000,0000,0000,,just clarity. Boom. It's open to interpretation,\Nright. It's Dialogue: 0,0:49:46.19,0:49:47.91,Default,,0000,0000,0000,,not as clear as just saying, oh if you Dialogue: 0,0:49:47.91,0:49:50.27,Default,,0000,0000,0000,,can just get your code coverage above 85%\Nthen Dialogue: 0,0:49:50.27,0:49:51.62,Default,,0000,0000,0000,,you're gold, right. Dialogue: 0,0:49:51.62,0:49:53.60,Default,,0000,0000,0000,,Clarity doesn't work like that. There's not\Na metric Dialogue: 0,0:49:53.60,0:49:56.49,Default,,0000,0000,0000,,we can just apply, because, again, it's not\Nhard Dialogue: 0,0:49:56.49,0:50:01.08,Default,,0000,0000,0000,,science. Clarity of writing is not hard science. Dialogue: 0,0:50:01.08,0:50:05.29,Default,,0000,0000,0000,,So the easy answer is, I know when I Dialogue: 0,0:50:05.29,0:50:08.64,Default,,0000,0000,0000,,see it. Right? There's not just gonna be a Dialogue: 0,0:50:08.64,0:50:11.96,Default,,0000,0000,0000,,list of principles and practices that somebody\Ncan be Dialogue: 0,0:50:11.96,0:50:15.38,Default,,0000,0000,0000,,taught and then they will automatically produce\Nclear writing Dialogue: 0,0:50:15.38,0:50:19.85,Default,,0000,0000,0000,,every time. Right? If you want to be a Dialogue: 0,0:50:19.85,0:50:21.97,Default,,0000,0000,0000,,good writer, is it enough just to sit and Dialogue: 0,0:50:21.97,0:50:28.16,Default,,0000,0000,0000,,memorize the dictionary? No. Just knowing\Nthe words available Dialogue: 0,0:50:28.16,0:50:30.48,Default,,0000,0000,0000,,to you, knowing the patterns of development\Nis not Dialogue: 0,0:50:30.48,0:50:32.80,Default,,0000,0000,0000,,gonna make you a good developer. Dialogue: 0,0:50:32.80,0:50:37.31,Default,,0000,0000,0000,,You have to develop an eye. You have to Dialogue: 0,0:50:37.31,0:50:39.85,Default,,0000,0000,0000,,develop an eye for clarity, which means first\Nof Dialogue: 0,0:50:39.85,0:50:41.45,Default,,0000,0000,0000,,all, you have to decide that that's important\Nto Dialogue: 0,0:50:41.45,0:50:43.95,Default,,0000,0000,0000,,you. So that's the first step. If you're still Dialogue: 0,0:50:43.95,0:50:46.45,Default,,0000,0000,0000,,stuck in, the most important thing about my\Nsystem Dialogue: 0,0:50:46.45,0:50:49.04,Default,,0000,0000,0000,,is how fast my tests run, and how many Dialogue: 0,0:50:49.04,0:50:51.61,Default,,0000,0000,0000,,of them I have, well. Forget about it. You're Dialogue: 0,0:50:51.61,0:50:52.74,Default,,0000,0000,0000,,not gonna get to this point. Dialogue: 0,0:50:52.74,0:50:54.44,Default,,0000,0000,0000,,You have to decide that the most important\Nthing Dialogue: 0,0:50:54.44,0:50:59.13,Default,,0000,0000,0000,,for your system is clarity. When you do decide Dialogue: 0,0:50:59.13,0:51:02.42,Default,,0000,0000,0000,,that, you can start developing an eye. I started Dialogue: 0,0:51:02.42,0:51:07.54,Default,,0000,0000,0000,,getting into photography maybe six years ago.\NWhen I Dialogue: 0,0:51:07.54,0:51:10.25,Default,,0000,0000,0000,,first got into photography, like, I would\Nlook at Dialogue: 0,0:51:10.25,0:51:12.53,Default,,0000,0000,0000,,a picture and it was like, well, looks like Dialogue: 0,0:51:12.53,0:51:13.35,Default,,0000,0000,0000,,a good picture. Dialogue: 0,0:51:13.35,0:51:15.17,Default,,0000,0000,0000,,Now, I've been looking at thousands of pictures.\NI've Dialogue: 0,0:51:15.17,0:51:18.04,Default,,0000,0000,0000,,been taking thousands of pictures. And I've\Ndeveloped an Dialogue: 0,0:51:18.04,0:51:20.27,Default,,0000,0000,0000,,eye. I can see when the white balance is Dialogue: 0,0:51:20.27,0:51:23.28,Default,,0000,0000,0000,,off. I can see, oh, this has a blue Dialogue: 0,0:51:23.28,0:51:25.42,Default,,0000,0000,0000,,tint. Oh, this actually, if we crop it just Dialogue: 0,0:51:25.42,0:51:27.84,Default,,0000,0000,0000,,a little bit more, only the subjects we want Dialogue: 0,0:51:27.84,0:51:29.33,Default,,0000,0000,0000,,to have in focus are in focus. Oh, this Dialogue: 0,0:51:29.33,0:51:31.92,Default,,0000,0000,0000,,would actually be better in black and white. Dialogue: 0,0:51:31.92,0:51:36.31,Default,,0000,0000,0000,,That eye just came from doing it. A lot. Dialogue: 0,0:51:36.31,0:51:37.89,Default,,0000,0000,0000,,It didn't come from just sitting down and\Nreading Dialogue: 0,0:51:37.89,0:51:42.17,Default,,0000,0000,0000,,a lot of photography books. And I think it's Dialogue: 0,0:51:42.17,0:51:44.09,Default,,0000,0000,0000,,the same thing with code. I think a lot Dialogue: 0,0:51:44.09,0:51:47.99,Default,,0000,0000,0000,,of programmers, coming at it from a software\Nengineering Dialogue: 0,0:51:47.99,0:51:50.02,Default,,0000,0000,0000,,angle, thing that just all they have to do Dialogue: 0,0:51:50.02,0:51:55.27,Default,,0000,0000,0000,,is learn the practices, learn the patterns,\Nmemorize them Dialogue: 0,0:51:55.27,0:51:57.62,Default,,0000,0000,0000,,all, and then they will be good programmers. Dialogue: 0,0:51:57.62,0:52:00.64,Default,,0000,0000,0000,,No, they won't. The only way to become a Dialogue: 0,0:52:00.64,0:52:04.10,Default,,0000,0000,0000,,good programmer, where, by definition, I define\Ngood programmers Dialogue: 0,0:52:04.10,0:52:07.41,Default,,0000,0000,0000,,as somebody who programs, who writes software\Nwith clarity, Dialogue: 0,0:52:07.41,0:52:10.45,Default,,0000,0000,0000,,is to read a lot of software, write a Dialogue: 0,0:52:10.45,0:52:12.57,Default,,0000,0000,0000,,lot of software. Dialogue: 0,0:52:12.57,0:52:13.86,Default,,0000,0000,0000,,Just like how do you become a good photographer? Dialogue: 0,0:52:13.86,0:52:15.95,Default,,0000,0000,0000,,You take a lot of pictures. And you look Dialogue: 0,0:52:15.95,0:52:18.02,Default,,0000,0000,0000,,at them. And you practice. And you practice.\NAnd Dialogue: 0,0:52:18.02,0:52:20.22,Default,,0000,0000,0000,,you practice. Dialogue: 0,0:52:20.22,0:52:22.15,Default,,0000,0000,0000,,I think it's quite similar to the problem\Nwith Dialogue: 0,0:52:22.15,0:52:26.46,Default,,0000,0000,0000,,diets, right. The fundamental truth with diets\Nis to Dialogue: 0,0:52:26.46,0:52:29.34,Default,,0000,0000,0000,,be healthy you should probably exercise regularly,\Nyou should Dialogue: 0,0:52:29.34,0:52:32.85,Default,,0000,0000,0000,,probably eat a reasonable amount and it should\Nbe Dialogue: 0,0:52:32.85,0:52:37.44,Default,,0000,0000,0000,,good stuff. Like, that's three things. Incredibly\Nhard to Dialogue: 0,0:52:37.44,0:52:41.24,Default,,0000,0000,0000,,do. Most people do not do that, right. Figuring Dialogue: 0,0:52:41.24,0:52:43.77,Default,,0000,0000,0000,,out how to write good software: read a lot Dialogue: 0,0:52:43.77,0:52:47.66,Default,,0000,0000,0000,,of software, write a lot of software, aim\Nfor Dialogue: 0,0:52:47.66,0:52:49.27,Default,,0000,0000,0000,,clarity. It sounds too simple. Dialogue: 0,0:52:49.27,0:52:51.46,Default,,0000,0000,0000,,Why is it simple? Because there's not just\Na Dialogue: 0,0:52:51.46,0:52:53.73,Default,,0000,0000,0000,,secret. There's not just one answer somebody\Ncan give Dialogue: 0,0:52:53.73,0:52:57.21,Default,,0000,0000,0000,,you. The only way you can get there is Dialogue: 0,0:52:57.21,0:53:01.52,Default,,0000,0000,0000,,by doing it. So when I first started developing Dialogue: 0,0:53:01.52,0:53:06.47,Default,,0000,0000,0000,,Rails, I read a ton of software. I read Dialogue: 0,0:53:06.47,0:53:10.58,Default,,0000,0000,0000,,the entire Ruby standard library. Partly because\Ndocumentation of Dialogue: 0,0:53:10.58,0:53:12.56,Default,,0000,0000,0000,,Ruby at that time was pretty poor, and the Dialogue: 0,0:53:12.56,0:53:13.51,Default,,0000,0000,0000,,only way to figure out how it worked was Dialogue: 0,0:53:13.51,0:53:15.55,Default,,0000,0000,0000,,to actually look at the code. But that was Dialogue: 0,0:53:15.55,0:53:17.76,Default,,0000,0000,0000,,also where I learned so much. Dialogue: 0,0:53:17.76,0:53:22.35,Default,,0000,0000,0000,,Today, we have it so much easier. Bundle open Dialogue: 0,0:53:22.35,0:53:24.80,Default,,0000,0000,0000,,name of any gem, and it'll open, boom, right Dialogue: 0,0:53:24.80,0:53:26.17,Default,,0000,0000,0000,,up in your text editor. You can look at Dialogue: 0,0:53:26.17,0:53:28.77,Default,,0000,0000,0000,,any code. Dialogue: 0,0:53:28.77,0:53:31.60,Default,,0000,0000,0000,,How many of you have read through a complete Dialogue: 0,0:53:31.60,0:53:37.49,Default,,0000,0000,0000,,gem recently. Something you did not write.\NAwesome. That's Dialogue: 0,0:53:37.49,0:53:39.39,Default,,0000,0000,0000,,actually really encouraging. I thought it\Nwould be much Dialogue: 0,0:53:39.39,0:53:40.47,Default,,0000,0000,0000,,less. Dialogue: 0,0:53:40.47,0:53:42.12,Default,,0000,0000,0000,,I think that is exactly the path you need Dialogue: 0,0:53:42.12,0:53:44.12,Default,,0000,0000,0000,,to take. You need to read a shit ton Dialogue: 0,0:53:44.12,0:53:45.84,Default,,0000,0000,0000,,of code. And it's not so much just because Dialogue: 0,0:53:45.84,0:53:47.43,Default,,0000,0000,0000,,you read this code and then, oh that's all Dialogue: 0,0:53:47.43,0:53:50.91,Default,,0000,0000,0000,,great stuff. Just as important as it is to, Dialogue: 0,0:53:50.91,0:53:53.20,Default,,0000,0000,0000,,to develop your sense of writing by reading\Na Dialogue: 0,0:53:53.20,0:53:57.67,Default,,0000,0000,0000,,lot of shit writing, so is it with code. Dialogue: 0,0:53:57.67,0:53:58.81,Default,,0000,0000,0000,,And I think you will find that that is Dialogue: 0,0:53:58.81,0:54:01.62,Default,,0000,0000,0000,,actually very easy. Because a lot of things\Nyou'll Dialogue: 0,0:54:01.62,0:54:07.15,Default,,0000,0000,0000,,do bundle open on will follow Sturgeon's Revelation.\N90% Dialogue: 0,0:54:07.15,0:54:08.78,Default,,0000,0000,0000,,of everything is crap. Dialogue: 0,0:54:08.78,0:54:12.97,Default,,0000,0000,0000,,Well, at least you know you have company if Dialogue: 0,0:54:12.97,0:54:15.17,Default,,0000,0000,0000,,you write crap software and I certainly do\Nfrom Dialogue: 0,0:54:15.17,0:54:17.98,Default,,0000,0000,0000,,time to time. And that's a great way to Dialogue: 0,0:54:17.98,0:54:20.97,Default,,0000,0000,0000,,learn. I actually find that I learn the most Dialogue: 0,0:54:20.97,0:54:23.41,Default,,0000,0000,0000,,about software and learn the most about what\Nmatters Dialogue: 0,0:54:23.41,0:54:25.58,Default,,0000,0000,0000,,to me, I learn the most about what clarity Dialogue: 0,0:54:25.58,0:54:28.31,Default,,0000,0000,0000,,is when I read poor software. Dialogue: 0,0:54:28.31,0:54:30.36,Default,,0000,0000,0000,,Because what I do is, I take a piece Dialogue: 0,0:54:30.36,0:54:33.82,Default,,0000,0000,0000,,of software, I take a class or method, and Dialogue: 0,0:54:33.82,0:54:35.94,Default,,0000,0000,0000,,then I look at it, how could this be Dialogue: 0,0:54:35.94,0:54:37.46,Default,,0000,0000,0000,,clearer? Like this is, I think this is poorly Dialogue: 0,0:54:37.46,0:54:41.11,Default,,0000,0000,0000,,written. I think this smells. How can I rewrite Dialogue: 0,0:54:41.11,0:54:41.99,Default,,0000,0000,0000,,it? Dialogue: 0,0:54:41.99,0:54:43.64,Default,,0000,0000,0000,,So by just sitting down and going through\Nthat Dialogue: 0,0:54:43.64,0:54:46.15,Default,,0000,0000,0000,,exercise and rewriting it, I find I learn\Na Dialogue: 0,0:54:46.15,0:54:49.00,Default,,0000,0000,0000,,whole lot about what I care about. So that's Dialogue: 0,0:54:49.00,0:54:51.70,Default,,0000,0000,0000,,what I've been doing lately. Engaging in a\Nlot Dialogue: 0,0:54:51.70,0:54:54.15,Default,,0000,0000,0000,,of these internet arguments. Somebody will\Nsubmit a piece Dialogue: 0,0:54:54.15,0:54:58.89,Default,,0000,0000,0000,,of code, and usually the submission will come\Nalong Dialogue: 0,0:54:58.89,0:55:00.32,Default,,0000,0000,0000,,with the proposed solution, too, right. Dialogue: 0,0:55:00.32,0:55:02.73,Default,,0000,0000,0000,,I have this shitty piece of code. Then I Dialogue: 0,0:55:02.73,0:55:06.62,Default,,0000,0000,0000,,learned about these three patterns. And now\Nit's wonderful. Dialogue: 0,0:55:06.62,0:55:09.28,Default,,0000,0000,0000,,And what I have found every single time, and Dialogue: 0,0:55:09.28,0:55:11.18,Default,,0000,0000,0000,,I've only done this maybe a handful of times, Dialogue: 0,0:55:11.18,0:55:13.66,Default,,0000,0000,0000,,maybe a little more, is that every single\Ntime, Dialogue: 0,0:55:13.66,0:55:15.13,Default,,0000,0000,0000,,you just took the shitty code and you stuck Dialogue: 0,0:55:15.13,0:55:16.52,Default,,0000,0000,0000,,it into some different boxes. Dialogue: 0,0:55:16.52,0:55:19.05,Default,,0000,0000,0000,,Like, it didn't actually improve. Applying\Nthe pattern to Dialogue: 0,0:55:19.05,0:55:21.80,Default,,0000,0000,0000,,it did not improve the underlying clarity\Nof the Dialogue: 0,0:55:21.80,0:55:25.33,Default,,0000,0000,0000,,code, because you just wrote it poorly. Like,\Nthe Dialogue: 0,0:55:25.33,0:55:27.02,Default,,0000,0000,0000,,problem with the code was not that it was Dialogue: 0,0:55:27.02,0:55:29.92,Default,,0000,0000,0000,,missing patterns. The problem with the code\Nwas that Dialogue: 0,0:55:29.92,0:55:32.88,Default,,0000,0000,0000,,it was crap. That it just had to be Dialogue: 0,0:55:32.88,0:55:34.73,Default,,0000,0000,0000,,rewritten. Dialogue: 0,0:55:34.73,0:55:41.73,Default,,0000,0000,0000,,Now, that leads us to sort of a mission, Dialogue: 0,0:55:42.48,0:55:44.99,Default,,0000,0000,0000,,in some ways, from Rails is and what Ruby Dialogue: 0,0:55:44.99,0:55:48.70,Default,,0000,0000,0000,,is, and it leads also to clarify some of Dialogue: 0,0:55:48.70,0:55:50.40,Default,,0000,0000,0000,,the arguments we've had in the Rails community\Nfor Dialogue: 0,0:55:50.40,0:55:54.30,Default,,0000,0000,0000,,awhile. Readability is incredibly important\Nto Ruby. We have Dialogue: 0,0:55:54.30,0:55:57.31,Default,,0000,0000,0000,,a lot of duplicated methods that do exactly\Nthe Dialogue: 0,0:55:57.31,0:56:01.35,Default,,0000,0000,0000,,same thing, just so we can improve readability. Dialogue: 0,0:56:01.35,0:56:04.95,Default,,0000,0000,0000,,I remember the first time I saw unless, when Dialogue: 0,0:56:04.95,0:56:06.92,Default,,0000,0000,0000,,I was learning about Ruby. That was one of Dialogue: 0,0:56:06.92,0:56:09.76,Default,,0000,0000,0000,,those light bulb moments. It's like, wait\Na minute. Dialogue: 0,0:56:09.76,0:56:13.99,Default,,0000,0000,0000,,Unless is exactly the same as if not, but Dialogue: 0,0:56:13.99,0:56:18.74,Default,,0000,0000,0000,,it's a different keyword. Huh. Dialogue: 0,0:56:18.74,0:56:21.50,Default,,0000,0000,0000,,Right? It was not just about making the most Dialogue: 0,0:56:21.50,0:56:28.50,Default,,0000,0000,0000,,efficient, compact language. It was about\Nreadability. Poof! Dialogue: 0,0:56:30.20,0:56:32.56,Default,,0000,0000,0000,,Mind blown. Dialogue: 0,0:56:32.56,0:56:37.27,Default,,0000,0000,0000,,And decade-long love-affair with Ruby established.\NAnd I think Dialogue: 0,0:56:37.27,0:56:40.54,Default,,0000,0000,0000,,that this is what we're trying to achieve\Nconstantly Dialogue: 0,0:56:40.54,0:56:43.08,Default,,0000,0000,0000,,in Rails as well. A lot of people will Dialogue: 0,0:56:43.08,0:56:46.17,Default,,0000,0000,0000,,gripe about, oh, ActiveRecord is too big or\Nsomething Dialogue: 0,0:56:46.17,0:56:49.14,Default,,0000,0000,0000,,is too big, or have too many methods. The Dialogue: 0,0:56:49.14,0:56:51.80,Default,,0000,0000,0000,,surface area is too big or there's, whatever\Nit Dialogue: 0,0:56:51.80,0:56:52.45,Default,,0000,0000,0000,,is, right. Dialogue: 0,0:56:52.45,0:56:55.10,Default,,0000,0000,0000,,Like, who gives a shit? Is it more readable? Dialogue: 0,0:56:55.10,0:56:57.48,Default,,0000,0000,0000,,Is it more clear? That's the only thing that Dialogue: 0,0:56:57.48,0:56:59.84,Default,,0000,0000,0000,,matters. What do I care whether the surface\Narea Dialogue: 0,0:56:59.84,0:57:02.49,Default,,0000,0000,0000,,of a method is a hundred methods or it's Dialogue: 0,0:57:02.49,0:57:04.52,Default,,0000,0000,0000,,two hundred methods? I don't give a shit about Dialogue: 0,0:57:04.52,0:57:05.69,Default,,0000,0000,0000,,that. The only thing I give a shit about Dialogue: 0,0:57:05.69,0:57:07.67,Default,,0000,0000,0000,,is whether, is the code I'm actually reading,\Nis Dialogue: 0,0:57:07.67,0:57:10.21,Default,,0000,0000,0000,,the system I'm trying to understand, is that\Nmore Dialogue: 0,0:57:10.21,0:57:12.68,Default,,0000,0000,0000,,clear. When you put clarity as your number\None Dialogue: 0,0:57:12.68,0:57:15.41,Default,,0000,0000,0000,,mission, a lot of concerns just fall by the Dialogue: 0,0:57:15.41,0:57:15.52,Default,,0000,0000,0000,,wayside. Dialogue: 0,0:57:15.52,0:57:21.51,Default,,0000,0000,0000,,It just doesn't matter anymore. And it's liberating. Dialogue: 0,0:57:21.51,0:57:24.43,Default,,0000,0000,0000,,So, I think this actually comes from sort\Nof Dialogue: 0,0:57:24.43,0:57:26.11,Default,,0000,0000,0000,,the same rope. I didn't have time to write Dialogue: 0,0:57:26.11,0:57:27.95,Default,,0000,0000,0000,,a short letter, so I wrote a long one Dialogue: 0,0:57:27.95,0:57:32.16,Default,,0000,0000,0000,,instead. I think that describes about eighty\Npercent of Dialogue: 0,0:57:32.16,0:57:34.56,Default,,0000,0000,0000,,all that ninety percent of shitty code. Dialogue: 0,0:57:34.56,0:57:39.20,Default,,0000,0000,0000,,Most people did not take the time to write Dialogue: 0,0:57:39.20,0:57:40.68,Default,,0000,0000,0000,,a short piece of code, so they wrote a Dialogue: 0,0:57:40.68,0:57:42.90,Default,,0000,0000,0000,,long one instead. And then they wrote that\Nlong Dialogue: 0,0:57:42.90,0:57:45.36,Default,,0000,0000,0000,,one, piece of code, and they like, pulled\Nout Dialogue: 0,0:57:45.36,0:57:47.96,Default,,0000,0000,0000,,their suspenders and like, oh yeah, I'm done.\NMy Dialogue: 0,0:57:47.96,0:57:49.06,Default,,0000,0000,0000,,tests pass. Dialogue: 0,0:57:49.06,0:57:52.40,Default,,0000,0000,0000,,Boom. Right? Or they look at it and decide, Dialogue: 0,0:57:52.40,0:57:54.18,Default,,0000,0000,0000,,oh shit, this is too long. I must be Dialogue: 0,0:57:54.18,0:57:57.87,Default,,0000,0000,0000,,missing some patterns. I just sprinkle some\Npatterns over Dialogue: 0,0:57:57.87,0:58:03.43,Default,,0000,0000,0000,,this. Wonders, right? No. What you wrote was\Na Dialogue: 0,0:58:03.43,0:58:05.93,Default,,0000,0000,0000,,draft. Dialogue: 0,0:58:05.93,0:58:08.74,Default,,0000,0000,0000,,This was just a first draft, right. Any piece Dialogue: 0,0:58:08.74,0:58:12.10,Default,,0000,0000,0000,,of code you write down is just a draft. Dialogue: 0,0:58:12.10,0:58:16.23,Default,,0000,0000,0000,,Mark Twain actually had the hard job, right.\NHe Dialogue: 0,0:58:16.23,0:58:18.42,Default,,0000,0000,0000,,wrote in ink. If you actually had to change Dialogue: 0,0:58:18.42,0:58:20.58,Default,,0000,0000,0000,,that, well that was kind of hard, right. So Dialogue: 0,0:58:20.58,0:58:23.41,Default,,0000,0000,0000,,his drafts were a lot more complicated. Ours?\NWe Dialogue: 0,0:58:23.41,0:58:25.96,Default,,0000,0000,0000,,have it so easy. A text editor? You just Dialogue: 0,0:58:25.96,0:58:28.43,Default,,0000,0000,0000,,delete stuff. And you don't need any of the Dialogue: 0,0:58:28.43,0:58:30.11,Default,,0000,0000,0000,,little stuff that you, you fill over the page Dialogue: 0,0:58:30.11,0:58:33.05,Default,,0000,0000,0000,,and you spill it everywhere and so forth.\NAn Dialogue: 0,0:58:33.05,0:58:33.84,Default,,0000,0000,0000,,eraser. Dialogue: 0,0:58:33.84,0:58:36.25,Default,,0000,0000,0000,,You can just delete stuff. Like that's my\Nfavorite Dialogue: 0,0:58:36.25,0:58:40.89,Default,,0000,0000,0000,,key. The delete key. It's the number one tool Dialogue: 0,0:58:40.89,0:58:47.54,Default,,0000,0000,0000,,for improving code. Delete key. Dialogue: 0,0:58:47.54,0:58:52.65,Default,,0000,0000,0000,,So when I was in high school, I submitted Dialogue: 0,0:58:52.65,0:58:56.67,Default,,0000,0000,0000,,a bunch of first drafts as essays, and they Dialogue: 0,0:58:56.67,0:58:58.54,Default,,0000,0000,0000,,were really shitty. And of course they were.\NThey Dialogue: 0,0:58:58.54,0:59:00.81,Default,,0000,0000,0000,,were the first draft. And my teacher at the Dialogue: 0,0:59:00.81,0:59:03.32,Default,,0000,0000,0000,,time said, oh, all right, all right, this\Nis Dialogue: 0,0:59:03.32,0:59:05.89,Default,,0000,0000,0000,,actually not bad. You just told me the step Dialogue: 0,0:59:05.89,0:59:07.44,Default,,0000,0000,0000,,one. If you have something on your mind, you Dialogue: 0,0:59:07.44,0:59:08.68,Default,,0000,0000,0000,,should write it down. Dialogue: 0,0:59:08.68,0:59:10.35,Default,,0000,0000,0000,,That's what I did. I, I wrote it down. Dialogue: 0,0:59:10.35,0:59:12.81,Default,,0000,0000,0000,,And then I handed it in. Oh, if you've Dialogue: 0,0:59:12.81,0:59:15.48,Default,,0000,0000,0000,,written something down, you should rewrite\Nit. Dialogue: 0,0:59:15.48,0:59:18.46,Default,,0000,0000,0000,,Oh. That was the step I missed. And I Dialogue: 0,0:59:18.46,0:59:20.53,Default,,0000,0000,0000,,think that's the step most people miss when\Nthey Dialogue: 0,0:59:20.53,0:59:22.91,Default,,0000,0000,0000,,write down code. Cause they're focused on\Nall these Dialogue: 0,0:59:22.91,0:59:24.97,Default,,0000,0000,0000,,other things. They're not focused on the clarity,\Nbecause Dialogue: 0,0:59:24.97,0:59:26.36,Default,,0000,0000,0000,,when you are focused on the clarity, you will Dialogue: 0,0:59:26.36,0:59:30.74,Default,,0000,0000,0000,,realize that all your first drafts are terrible. Dialogue: 0,0:59:30.74,0:59:33.38,Default,,0000,0000,0000,,All my first drafts are terrible. All my first Dialogue: 0,0:59:33.38,0:59:36.24,Default,,0000,0000,0000,,attempts at writing a good class are poor.\NThey're Dialogue: 0,0:59:36.24,0:59:39.57,Default,,0000,0000,0000,,too long. They're not at the same level of Dialogue: 0,0:59:39.57,0:59:42.77,Default,,0000,0000,0000,,abstraction. They're not clear. And that's\NOK. I wrote Dialogue: 0,0:59:42.77,0:59:44.09,Default,,0000,0000,0000,,something down. I was trying to figure out\Nwhat Dialogue: 0,0:59:44.09,0:59:47.05,Default,,0000,0000,0000,,the system was supposed to do. Dialogue: 0,0:59:47.05,0:59:48.95,Default,,0000,0000,0000,,That's hard work. And often times you don't\Nget Dialogue: 0,0:59:48.95,0:59:50.59,Default,,0000,0000,0000,,perfect code out of that when you're still\Ntrying Dialogue: 0,0:59:50.59,0:59:53.10,Default,,0000,0000,0000,,to figure out what it is that you're writing. Dialogue: 0,0:59:53.10,0:59:55.71,Default,,0000,0000,0000,,But once you've written it down, you should\Nrewrite Dialogue: 0,0:59:55.71,0:59:57.56,Default,,0000,0000,0000,,it. Dialogue: 0,0:59:57.56,1:00:03.48,Default,,0000,0000,0000,,And I think the key part of rewriting is Dialogue: 0,1:00:03.48,1:00:06.73,Default,,0000,0000,0000,,omitting needless words when it comes to regular\Nwriting. Dialogue: 0,1:00:06.73,1:00:10.97,Default,,0000,0000,0000,,When it comes to programming, it's omitting\Nneedless concepts. Dialogue: 0,1:00:10.97,1:00:14.92,Default,,0000,0000,0000,,It's omitting needless patterns. It's omitting\Nneedless practices. It's Dialogue: 0,1:00:14.92,1:00:21.26,Default,,0000,0000,0000,,omitting needless classes. It's omitting all\Nthese extra things Dialogue: 0,1:00:21.26,1:00:25.13,Default,,0000,0000,0000,,that aren't getting you closer to clarity,\Nright. Dialogue: 0,1:00:25.13,1:00:27.10,Default,,0000,0000,0000,,How do you know? You develop an eye for Dialogue: 0,1:00:27.10,1:00:28.96,Default,,0000,0000,0000,,it. How do you develop an eye? You read Dialogue: 0,1:00:28.96,1:00:30.10,Default,,0000,0000,0000,,a lot of code. You write a lot of Dialogue: 0,1:00:30.10,1:00:32.98,Default,,0000,0000,0000,,code. You rewrite a lot of code. And you Dialogue: 0,1:00:32.98,1:00:36.81,Default,,0000,0000,0000,,forget about fucking patterns for awhile.\NYou forget about Dialogue: 0,1:00:36.81,1:00:39.93,Default,,0000,0000,0000,,fucking TDD for awhile. And you focus on just Dialogue: 0,1:00:39.93,1:00:42.25,Default,,0000,0000,0000,,what's in front of you. The piece of code. Dialogue: 0,1:00:42.25,1:00:44.64,Default,,0000,0000,0000,,How can I write it simpler? Dialogue: 0,1:00:44.64,1:00:48.22,Default,,0000,0000,0000,,Write software well. Thank you very much.