WEBVTT 00:00:23.100 --> 00:00:26.500 LUKE FRANCL: Good afternoon. I'd like to get started if, I 00:00:26.500 --> 00:00:30.140 think, everybody's ready. Cool. Cool. 00:00:30.140 --> 00:00:33.550 Thank, thank you for joining me this afternoon. I'm 00:00:33.550 --> 00:00:36.750 excited to be here. And thanks for, thanks for 00:00:36.750 --> 00:00:38.550 choosing this talk. 00:00:38.550 --> 00:00:41.070 So it's been ten years since the first public 00:00:41.070 --> 00:00:43.960 release on Rails, so I think that's a good 00:00:43.960 --> 00:00:48.280 time to think back and reflect on where Rails 00:00:48.280 --> 00:00:51.180 has come from, where it might be going, and 00:00:51.180 --> 00:00:53.870 what the future has in store. 00:00:53.870 --> 00:00:58.480 So, I've been thinking a lot about the early 00:00:58.480 --> 00:01:01.420 days of Rails, lately, because the company I work 00:01:01.420 --> 00:01:05.269 for, Swiftype, makes site search software. So I use 00:01:05.269 --> 00:01:09.369 my own website for testing. So I index my 00:01:09.369 --> 00:01:11.439 site and then have to do searches on it, 00:01:11.439 --> 00:01:13.729 and I'll search for Rails. Just cause I'm not 00:01:13.729 --> 00:01:15.880 super creative and I need to search for something, 00:01:15.880 --> 00:01:16.570 right. 00:01:16.570 --> 00:01:18.509 And, in doing so, I found some old blog 00:01:18.509 --> 00:01:20.850 posts that I wrote in early 2005, when I 00:01:20.850 --> 00:01:23.840 first discovered Rails. And it was really interesting for 00:01:23.840 --> 00:01:27.950 me to read, because back then, I was, I 00:01:27.950 --> 00:01:32.079 was working as a Java developer and I was 00:01:32.079 --> 00:01:35.060 really interested in Python. And Rails was neither of 00:01:35.060 --> 00:01:37.439 those things. So I was pretty skeptical of Rails. 00:01:37.439 --> 00:01:39.119 Like, I was impressed with it, but I wasn't 00:01:39.119 --> 00:01:43.090 sure it was worth learning Ruby over. 00:01:43.090 --> 00:01:45.039 So I thought, I'll just sit back and let 00:01:45.039 --> 00:01:49.439 the Python people catch up. And I waited and 00:01:49.439 --> 00:01:51.990 I waited and I waited, and that never really 00:01:51.990 --> 00:01:55.130 seemed to happen. And so after a few months, 00:01:55.130 --> 00:01:58.499 I jumped into Rails and started learning it and 00:01:58.499 --> 00:02:00.409 I started learning Ruby so that I could use 00:02:00.409 --> 00:02:04.590 Rails. And then that fall, I got wind of 00:02:04.590 --> 00:02:06.509 a new group starting in my home town. The 00:02:06.509 --> 00:02:09.508 Ruby Users of Minnesota. And so I was, I 00:02:09.508 --> 00:02:10.989 was there at the first meeting when there was 00:02:10.989 --> 00:02:13.480 twelve people talk, who were just really excited about 00:02:13.480 --> 00:02:15.849 Ruby and really excited about Rails. 00:02:15.849 --> 00:02:18.770 And at that point I joined the, the Ruby 00:02:18.770 --> 00:02:22.010 community and became a part of that and really 00:02:22.010 --> 00:02:24.909 have not, have not looked back since then. And 00:02:24.909 --> 00:02:27.069 I've been working with Rails professionally now for about 00:02:27.069 --> 00:02:28.650 eight years. 00:02:28.650 --> 00:02:31.400 So this made me think about a book I 00:02:31.400 --> 00:02:35.409 read once called Looking Backward by Edward Bellamy. So 00:02:35.409 --> 00:02:37.459 in this book, which was written in the late 00:02:37.459 --> 00:02:41.590 1800s and takes place at that time, a rich, 00:02:41.590 --> 00:02:45.260 upperclass man is hypnotized. And he falls asleep for 00:02:45.260 --> 00:02:48.620 over a hundred years. And when he wakes up, 00:02:48.620 --> 00:02:49.879 everything has changed. 00:02:49.879 --> 00:02:54.069 America is now a socialist utopia. And so, you 00:02:54.069 --> 00:02:57.219 know, he had it pretty good before, right. He, 00:02:57.219 --> 00:03:00.939 he was wealthy. He had servants. And now everyone 00:03:00.939 --> 00:03:03.340 is equal. And so he's pretty skeptical of this 00:03:03.340 --> 00:03:05.090 new order. 00:03:05.090 --> 00:03:09.379 So it takes him awhile, but as he's shown 00:03:09.379 --> 00:03:11.709 the new way of doing things, he becomes convinced 00:03:11.709 --> 00:03:16.879 that this is actually a better way. And that 00:03:16.879 --> 00:03:20.959 made me think of, think of my situation, where 00:03:20.959 --> 00:03:24.200 I was, I was skeptical of Rails, and, but 00:03:24.200 --> 00:03:29.019 eventually won over. 00:03:29.019 --> 00:03:32.700 So today, what I'd like to talk about is 00:03:32.700 --> 00:03:36.450 the idea of what would a programmer from 2004 00:03:36.450 --> 00:03:39.310 think if they could time travel forward to today 00:03:39.310 --> 00:03:42.650 and experience our web development utopia. What would that 00:03:42.650 --> 00:03:45.260 be like, for them, to see how we work 00:03:45.260 --> 00:03:46.299 today? 00:03:46.299 --> 00:03:49.739 So, what I'd like to do today is first 00:03:49.739 --> 00:03:53.389 talk about what web development was like in 2004. 00:03:53.389 --> 00:03:55.930 Then, I'd like to jump forward to the present 00:03:55.930 --> 00:03:59.209 and think about what a programmer from 2004 would 00:03:59.209 --> 00:04:02.650 think about our web development utopia of today. And 00:04:02.650 --> 00:04:05.430 finally I'd like to take a look at what 00:04:05.430 --> 00:04:07.870 the future might have in store for Rails, and 00:04:07.870 --> 00:04:13.400 what the, what the legacy of Rails might be. 00:04:13.400 --> 00:04:16.060 So first, let's talk a little bit about what 00:04:16.060 --> 00:04:19.680 development was like in 2004. 00:04:19.680 --> 00:04:22.220 So if I can set the stage for a 00:04:22.220 --> 00:04:24.690 minute, I see a lot of Mac Books here 00:04:24.690 --> 00:04:28.660 today. There were no Mac Books in 2004. The 00:04:28.660 --> 00:04:30.590 top of the line Apple laptop was a Power 00:04:30.590 --> 00:04:35.150 Mac G4. And, you know, Apple had not completely 00:04:35.150 --> 00:04:39.289 penetrated the web development community like it has now. 00:04:39.289 --> 00:04:42.380 There were only, I, I used Linux at work 00:04:42.380 --> 00:04:49.050 myself. And, a Windows at home, actually. And the 00:04:49.050 --> 00:04:51.990 most popular phone, like, maybe not the most popular, 00:04:51.990 --> 00:04:54.810 but the hottest phone in 2004 was a Motorrola 00:04:54.810 --> 00:04:58.460 Razr. So, right? 00:04:58.460 --> 00:05:01.770 So things were pretty different there. Things were pretty 00:05:01.770 --> 00:05:04.560 different then. And I was working as a Java 00:05:04.560 --> 00:05:07.180 developer at the time. And I was pretty excited 00:05:07.180 --> 00:05:10.660 about that, because I graduated in 2001, right after 00:05:10.660 --> 00:05:14.340 the dot com bust. And things were pretty sketchy 00:05:14.340 --> 00:05:15.990 there for awhile. It was hard for me to 00:05:15.990 --> 00:05:19.229 find a job. And so I was excited that 00:05:19.229 --> 00:05:20.960 I was able to work as a Java developer, 00:05:20.960 --> 00:05:22.930 in the hot language at the time. And I 00:05:22.930 --> 00:05:24.190 was, I was glad that I was able to 00:05:24.190 --> 00:05:27.360 work at a software development company, where I could 00:05:27.360 --> 00:05:31.690 work on software for sale instead of working in 00:05:31.690 --> 00:05:33.629 the cost center at a, at a big bank 00:05:33.629 --> 00:05:37.090 or something like that, right. 00:05:37.090 --> 00:05:40.240 So I was working as a Java developer, and 00:05:40.240 --> 00:05:42.270 if you've ever done any Java web development, you 00:05:42.270 --> 00:05:46.620 know that it can be pretty painful, right. At 00:05:46.620 --> 00:05:48.400 the time, the, the best way to do Java 00:05:48.400 --> 00:05:53.500 web development was struts and hibernate. But we didn't 00:05:53.500 --> 00:05:56.960 use either of those. We used raw Java servelettes 00:05:56.960 --> 00:06:03.370 and hand coded J, JDBC queries to our database. 00:06:03.370 --> 00:06:07.000 So the, the real problem with Java as a, 00:06:07.000 --> 00:06:09.919 as a web development platform, at least in those 00:06:09.919 --> 00:06:12.740 days, was it, it has a really long edit, 00:06:12.740 --> 00:06:16.789 compile, debug loop. Or, in the case of, of 00:06:16.789 --> 00:06:20.830 Java web development, it's the edit, compile, deploy, debug 00:06:20.830 --> 00:06:24.220 loop. Because you have to restart your app server, 00:06:24.220 --> 00:06:25.539 and we used Web Sphere, so that took a 00:06:25.539 --> 00:06:26.990 long time. 00:06:26.990 --> 00:06:29.930 So if I needed to write a new page 00:06:29.930 --> 00:06:33.050 for, for our app, it, it was a pretty 00:06:33.050 --> 00:06:35.810 involved process. So we used raw servelettes, so that's 00:06:35.810 --> 00:06:38.470 sort of like using a raw CGI library, where 00:06:38.470 --> 00:06:41.979 it's very low-level. And if, when you work in 00:06:41.979 --> 00:06:44.310 Java, it's very verbose and you have to read 00:06:44.310 --> 00:06:47.000 from input streams and write to output streams. And 00:06:47.000 --> 00:06:49.539 it just doesn't have the conveniences of Ruby or 00:06:49.539 --> 00:06:51.150 a scripting language. 00:06:51.150 --> 00:06:52.449 So I'd have to write my servelette, then I'd 00:06:52.449 --> 00:06:54.690 have to write a bunch of XML files, or 00:06:54.690 --> 00:06:56.810 XML code in the web dot xml file to 00:06:56.810 --> 00:07:00.440 map it up. And then you'd compile everything and 00:07:00.440 --> 00:07:02.940 get it working and then restart your app server, 00:07:02.940 --> 00:07:06.810 which would take several minutes. And then browse to 00:07:06.810 --> 00:07:10.069 the new page to, to see what it, what's 00:07:10.069 --> 00:07:11.229 going on there. 00:07:11.229 --> 00:07:13.810 And that's where the fun would start, because that's 00:07:13.810 --> 00:07:17.280 when the JSPs came into play. So JSP is 00:07:17.280 --> 00:07:21.310 just like ERB, right. Instead of Ruby, it's Java. 00:07:21.310 --> 00:07:24.389 But Java a much more heavy-weight language, and it 00:07:24.389 --> 00:07:27.360 doesn't have, you know, friendly looping constructs or mapping 00:07:27.360 --> 00:07:30.500 constructs like Ruby does. So writing view code in 00:07:30.500 --> 00:07:33.430 Ruby, or in Java is not very much fun. 00:07:33.430 --> 00:07:35.430 But worst of all, the way that JSPs work 00:07:35.430 --> 00:07:37.810 is that it takes the Java, or the JSP 00:07:37.810 --> 00:07:39.830 code that you write and it compiles it into 00:07:39.830 --> 00:07:42.050 a Java class file. And then that Java class 00:07:42.050 --> 00:07:47.349 file gets compiled into code. So when you get 00:07:47.349 --> 00:07:50.250 an error, when you're debugging, you'd get this stack 00:07:50.250 --> 00:07:53.870 trace, and it would be like, NullPointer exception on 00:07:53.870 --> 00:08:00.080 line 12,075 of line 20,082, and you'd sit there 00:08:00.080 --> 00:08:06.800 and you'd think, ah. What was I doing in 00:08:06.800 --> 00:08:09.840 my JSP that could cause a NullPointer exception? 00:08:09.840 --> 00:08:11.960 And you'd look at the JSP and you'd look 00:08:11.960 --> 00:08:14.479 at the stack trace, and they had no correspondence 00:08:14.479 --> 00:08:19.699 whatsoever, right. So it's really painful. And if you 00:08:19.699 --> 00:08:21.770 were smart, you would, there was a setting, like 00:08:21.770 --> 00:08:23.449 a secret setting you could use for Web Sphere 00:08:23.449 --> 00:08:27.569 to keep around the compiled Java files. So then 00:08:27.569 --> 00:08:29.419 you could open that up in your web browser 00:08:29.419 --> 00:08:33.950 and look at line 12,075 and be like, oh. 00:08:33.950 --> 00:08:36.570 That's what I was doing in the JSP. 00:08:36.570 --> 00:08:41.240 So, web development in Java, especially in 2004, not 00:08:41.240 --> 00:08:44.820 very much fun. But there was, there was also 00:08:44.820 --> 00:08:48.110 at that time a glimmer that something better was 00:08:48.110 --> 00:08:53.570 on the way, that the web could do more. 00:08:53.570 --> 00:08:55.900 There was a new sense that the web was 00:08:55.900 --> 00:08:59.930 a powerful platform for delivering software. And I think 00:08:59.930 --> 00:09:04.400 that the earliest glimmerings of this come from Microsoft's 00:09:04.400 --> 00:09:08.570 Outlook web app. This was the first application to 00:09:08.570 --> 00:09:12.080 use what we would call today Ajax, without requiring 00:09:12.080 --> 00:09:14.250 any kind of browser plugins. 00:09:14.250 --> 00:09:18.990 So that, that came out in 2001. And people, 00:09:18.990 --> 00:09:20.840 people didn't pay much attention to it because it 00:09:20.840 --> 00:09:24.610 was IE only and it, it wasn't clear how 00:09:24.610 --> 00:09:27.540 it was working, right. And then Google launched Google 00:09:27.540 --> 00:09:31.090 Suggest. And people dissected that, and they saw how 00:09:31.090 --> 00:09:35.740 it was working. And they also launched Gmail, which 00:09:35.740 --> 00:09:37.740 gave people a new sense of what was possible 00:09:37.740 --> 00:09:39.840 in a web app. That, that web apps could 00:09:39.840 --> 00:09:44.180 automatically refresh as things were changing on the server. 00:09:44.180 --> 00:09:46.050 So there was a new sense of what was 00:09:46.050 --> 00:09:49.060 possible. That, that, that maybe there was a better 00:09:49.060 --> 00:09:52.380 way of writing web apps. And in 2004 I 00:09:52.380 --> 00:09:56.360 was also looking for something better. Because, and I 00:09:56.360 --> 00:09:58.070 attribute that to a book I read early in 00:09:58.070 --> 00:10:01.530 my career. The Pragmatic Programmer by Dave Thomas and 00:10:01.530 --> 00:10:04.260 Andy Hunt. And in that book, which is, it's 00:10:04.260 --> 00:10:06.510 a terrific book about becoming a better software developer, 00:10:06.510 --> 00:10:10.270 a better software crafts man. In that book, they 00:10:10.270 --> 00:10:13.720 talk about the importance of learning a scripting language. 00:10:13.720 --> 00:10:16.240 And that's because, if you were working in a 00:10:16.240 --> 00:10:19.150 language like Java, there's often things that are too, 00:10:19.150 --> 00:10:21.110 too small of a task to make it worth 00:10:21.110 --> 00:10:23.990 writing a Java program to do. And, but a 00:10:23.990 --> 00:10:25.640 scripting language you can, you know, knock that off 00:10:25.640 --> 00:10:27.350 really easily. 00:10:27.350 --> 00:10:28.940 So things that you might do manually, you can 00:10:28.940 --> 00:10:33.020 instead write a script to do for you. And 00:10:33.020 --> 00:10:35.410 so I took that to heart, and I went 00:10:35.410 --> 00:10:38.010 to the book store. Remember, this was the early 00:10:38.010 --> 00:10:42.580 2000s. There were still bookstores. And I looked at 00:10:42.580 --> 00:10:44.780 all the books that they had about scripting languages. 00:10:44.780 --> 00:10:46.350 So there was a bunch of books about Perl. 00:10:46.350 --> 00:10:49.620 There was a bunch of books about Python. And 00:10:49.620 --> 00:10:52.220 there was this one book about Ruby by those 00:10:52.220 --> 00:10:55.460 same guys, Dave Thomas and Andy Hunt. 00:10:55.460 --> 00:10:58.270 So I immediately just started the books about Perl, 00:10:58.270 --> 00:11:00.640 because I'd worked with Perl before and I thought 00:11:00.640 --> 00:11:05.370 it was terrible. And I looked at the books 00:11:05.370 --> 00:11:07.620 about Python, and I'm like, this looks OK. I 00:11:07.620 --> 00:11:09.710 can see myself using this. And then I looked 00:11:09.710 --> 00:11:13.170 at the book about Ruby. And, unfortunately, what I 00:11:13.170 --> 00:11:14.750 saw in the book about Ruby was a lot 00:11:14.750 --> 00:11:18.730 of dollar signs and dollar sign underscores and at 00:11:18.730 --> 00:11:23.000 signs and at at signs. And I thought, this 00:11:23.000 --> 00:11:26.450 looks just like Perl. I don't, I don't want 00:11:26.450 --> 00:11:28.840 to learn this. This, this is, this is, this 00:11:28.840 --> 00:11:30.550 is crappy. 00:11:30.550 --> 00:11:33.610 So I decided then to become a Python programmer. 00:11:33.610 --> 00:11:35.920 And I was actually able to use Python for 00:11:35.920 --> 00:11:37.700 a number of things in my job and my 00:11:37.700 --> 00:11:41.350 personal programming. I wrote a script to migrate from 00:11:41.350 --> 00:11:44.040 one bug database to the other. I wrote a 00:11:44.040 --> 00:11:46.440 script that tied our subversion check ins to our 00:11:46.440 --> 00:11:48.640 bug database so you could reference bug numbers and 00:11:48.640 --> 00:11:51.670 link up the commits and stuff. 00:11:51.670 --> 00:11:55.360 And I, I wrote some personal scripts. But what 00:11:55.360 --> 00:11:58.320 I really wanted to do was write web apps. 00:11:58.320 --> 00:12:00.580 Because that's, throughout my career, that's always what I've 00:12:00.580 --> 00:12:03.570 been most excited about. Because I've always loved the 00:12:03.570 --> 00:12:06.680 potential of the web as a platform for enabling 00:12:06.680 --> 00:12:10.770 communication. It's, it's the most powerful and widely distributed 00:12:10.770 --> 00:12:14.600 way that you can connect people. 00:12:14.600 --> 00:12:16.100 And so every time I would have an idea 00:12:16.100 --> 00:12:19.770 for a web app in Python, I would start 00:12:19.770 --> 00:12:22.060 thinking about how it, or, I would start thinking 00:12:22.060 --> 00:12:23.830 about how it should work and what it should 00:12:23.830 --> 00:12:25.620 do. And I'd get excited about it, and want 00:12:25.620 --> 00:12:28.200 to build it. And then I'd start reading about 00:12:28.200 --> 00:12:30.040 how to build web apps in Python. And get 00:12:30.040 --> 00:12:31.500 really frustrated. 00:12:31.500 --> 00:12:33.770 Because, then there was no clear way. There was 00:12:33.770 --> 00:12:38.370 no Jengo. There was CGI in the core library, 00:12:38.370 --> 00:12:40.500 but, you know, who wants to write at that 00:12:40.500 --> 00:12:46.600 low-level? There was, then, a myriad of templating options 00:12:46.600 --> 00:12:50.190 and different object relational mappers and different ways of 00:12:50.190 --> 00:12:53.320 publishing your objects to the web and different database 00:12:53.320 --> 00:12:57.370 drivers. And, there was no clear way of deploying 00:12:57.370 --> 00:12:58.500 the software, either. 00:12:58.500 --> 00:13:02.170 So I would have this idea for what I 00:13:02.170 --> 00:13:04.570 thought would be the next great app, and then 00:13:04.570 --> 00:13:08.210 I would start reading about Python, how to implement 00:13:08.210 --> 00:13:11.450 it in Python and get frustrated and give up. 00:13:11.450 --> 00:13:13.980 But I didn't know it at the time, but 00:13:13.980 --> 00:13:16.320 there was something better on the way. 00:13:16.320 --> 00:13:23.260 So let's turn now to 2014, and think about 00:13:23.260 --> 00:13:27.380 what would a programmer from 2004 think about how 00:13:27.380 --> 00:13:30.050 we work today. 00:13:30.050 --> 00:13:31.200 And I think if you could take someone from 00:13:31.200 --> 00:13:33.240 then and bring them forward to now, I think 00:13:33.240 --> 00:13:36.370 they would be amazed. Because it's truly a great 00:13:36.370 --> 00:13:40.680 time to be a programmer. We're all walking around 00:13:40.680 --> 00:13:43.040 with a computer in our pockets that's more powerful 00:13:43.040 --> 00:13:47.050 than the desktop I had in 2004. And it 00:13:47.050 --> 00:13:50.310 has a, a better web browser, too. 00:13:50.310 --> 00:13:53.950 So think about what's different between now and then. 00:13:53.950 --> 00:13:58.270 In 2004, Ajax was in its infancy. The term 00:13:58.270 --> 00:14:04.320 hadn't even been coined yet. Today, rich Ajax frameworks 00:14:04.320 --> 00:14:08.940 come with every web application framework. So you can, 00:14:08.940 --> 00:14:12.670 you can build rich, interactive applications much easier. 00:14:12.670 --> 00:14:15.550 And, you can even write your entire frontend in 00:14:15.550 --> 00:14:19.760 JavaScript if you want to. Web browsers are immeasurably 00:14:19.760 --> 00:14:25.290 more powerful now than they, than they were then. 00:14:25.290 --> 00:14:28.900 Deployment is much easier, too. In 2004, it was 00:14:28.900 --> 00:14:30.420 really hard to figure out how you should get 00:14:30.420 --> 00:14:33.830 your app up on the web. You could colo, 00:14:33.830 --> 00:14:37.100 but that was expensive. You could use shared hosting, 00:14:37.100 --> 00:14:41.110 like, DreamHost or something like that. But those servers 00:14:41.110 --> 00:14:44.320 were underpowered and kind of weak. 00:14:44.320 --> 00:14:46.870 Today, you can spin up a server with the 00:14:46.870 --> 00:14:49.940 click of a button. You can manage everything yourself 00:14:49.940 --> 00:14:53.040 if you want to use EC2, or you can 00:14:53.040 --> 00:14:56.770 rely on platform services like Heroku or Google App 00:14:56.770 --> 00:15:00.820 Engine. And this is really great for programmers, because 00:15:00.820 --> 00:15:03.490 you don't have to be a great programmer and 00:15:03.490 --> 00:15:06.670 a great sys admin now to launch a web 00:15:06.670 --> 00:15:10.700 application. You can let other people handle that part. 00:15:10.700 --> 00:15:11.910 And that's terrific. 00:15:11.910 --> 00:15:14.920 Another thing that I think is really powerful about 00:15:14.920 --> 00:15:20.950 how we work today is that in, today we 00:15:20.950 --> 00:15:24.160 have access to all of these web service APIs, 00:15:24.160 --> 00:15:27.380 with a simple HTTP request. You can extend the 00:15:27.380 --> 00:15:30.290 functionality of your app really easily by leveraging these 00:15:30.290 --> 00:15:30.940 services. 00:15:30.940 --> 00:15:34.270 There's everything from search, like my, my company provides, 00:15:34.270 --> 00:15:36.970 to payments from companies like Stripe, and even telephony 00:15:36.970 --> 00:15:39.560 from companies like Twillio. 00:15:39.560 --> 00:15:42.640 So with just an HTTP request, you can add 00:15:42.640 --> 00:15:46.500 that kind of functionality into your application super easily. 00:15:46.500 --> 00:15:49.320 And best of all, you're us- they use JSON 00:15:49.320 --> 00:15:51.440 instead of XML. So there's no XML setups like 00:15:51.440 --> 00:15:55.660 there was back in the early 2000s. 00:15:55.660 --> 00:15:58.280 But what about Rails? Like, what would a programmer 00:15:58.280 --> 00:16:02.060 from 2004 think about Ruby on Rails? Well, I 00:16:02.060 --> 00:16:04.930 think if you could bring someone, or talk to 00:16:04.930 --> 00:16:07.610 somebody in 2004 and say, in ten years the 00:16:07.610 --> 00:16:09.380 best way to make a web app is gonna 00:16:09.380 --> 00:16:11.920 be this thing called Ruby on Rails. I think 00:16:11.920 --> 00:16:15.320 what they would say is, what on Rails? 00:16:15.320 --> 00:16:19.300 It's difficult to overstate how marginal the Ruby community 00:16:19.300 --> 00:16:26.300 was in 2004. When David publicly demo'd Rails at 00:16:27.830 --> 00:16:31.830 RubyConf 2004, there were probably less people in the 00:16:31.830 --> 00:16:36.070 room than there are right now. That, there were 00:16:36.070 --> 00:16:39.170 about sixty people at that conference. 00:16:39.170 --> 00:16:43.010 Today, there's dozens of conferences around the world, and 00:16:43.010 --> 00:16:46.790 thousands of people make their livings using Ruby and 00:16:46.790 --> 00:16:52.880 Rails. The community has grown tremendously since those days. 00:16:52.880 --> 00:16:58.240 But what about the features? The features were really 00:16:58.240 --> 00:17:02.850 what made Rails succeed. And if I think back 00:17:02.850 --> 00:17:05.429 on what I first thought about Rails when I 00:17:05.429 --> 00:17:09.199 saw it, like, what impressed me. Things that, that 00:17:09.199 --> 00:17:12.789 really stand out in my mind are things like 00:17:12.789 --> 00:17:14.730 live reloading. 00:17:14.730 --> 00:17:16.770 Compared to how I was working in Java, where 00:17:16.770 --> 00:17:18.299 it was like, a really long cycle to get 00:17:18.299 --> 00:17:20.829 anything up on the screen, in Rails, you could 00:17:20.829 --> 00:17:24.148 edit any file. You could edit your model, you're, 00:17:24.148 --> 00:17:27.049 you're views. Even your database schema. And reload your 00:17:27.049 --> 00:17:30.129 browser and it was right there. And that was 00:17:30.129 --> 00:17:31.200 tremendously exciting. 00:17:31.200 --> 00:17:33.629 And, if you had an exception in your, in 00:17:33.629 --> 00:17:36.220 your view, you would see exactly which line of 00:17:36.220 --> 00:17:39.200 code caused it, and not have to wade through 00:17:39.200 --> 00:17:41.779 these huge stack traces that had nothing to do 00:17:41.779 --> 00:17:45.700 with what you were working on. And that was 00:17:45.700 --> 00:17:47.809 tremendous for developer productivity. 00:17:47.809 --> 00:17:50.350 Another thing that was a real big win for 00:17:50.350 --> 00:17:55.250 developer productivity, for me anyway, was the development console. 00:17:55.250 --> 00:17:57.529 Rails let you just type a single command and 00:17:57.529 --> 00:17:59.490 get full access to all of the code that 00:17:59.490 --> 00:18:01.799 you'd been writing. So, for me, I keep that 00:18:01.799 --> 00:18:03.799 open all the time. And I am always constantly 00:18:03.799 --> 00:18:06.980 trying out things and experimenting and trying to figure 00:18:06.980 --> 00:18:09.909 out how different APIs work by using the developer 00:18:09.909 --> 00:18:11.299 console. 00:18:11.299 --> 00:18:12.909 This is something that I'd been able to get 00:18:12.909 --> 00:18:15.779 working in the Java world using a tool called 00:18:15.779 --> 00:18:18.240 BeanShell, which is like a Java scripting framework. But 00:18:18.240 --> 00:18:20.720 it was nowhere near as good as the Rails 00:18:20.720 --> 00:18:24.009 console, and, you know, it just was a lot 00:18:24.009 --> 00:18:27.700 harder to, to get working. 00:18:27.700 --> 00:18:29.649 Related to that is just the idea of having 00:18:29.649 --> 00:18:33.399 separate development environments. Rails came right out of the 00:18:33.399 --> 00:18:36.590 box with development, production, and test, and has separate 00:18:36.590 --> 00:18:38.480 databases for all of those things. So you didn't 00:18:38.480 --> 00:18:40.539 have to worry about mixing your code together. 00:18:40.539 --> 00:18:43.669 You could have separate configurations for testing and production 00:18:43.669 --> 00:18:47.220 and development. And that really helped with the software 00:18:47.220 --> 00:18:49.409 engineering side of Rails. 00:18:49.409 --> 00:18:52.519 Finally, the, the, the last big feature that I 00:18:52.519 --> 00:18:56.169 think really stood out to me was ActiveRecord and 00:18:56.169 --> 00:19:00.100 migrations. ActiveRecord was super exciting, because here, this, this, 00:19:00.100 --> 00:19:02.559 this, this code is sort of magically intuiting the, 00:19:02.559 --> 00:19:05.200 the fields from the structure of your database. You 00:19:05.200 --> 00:19:06.950 didn't have to write any code at all. And 00:19:06.950 --> 00:19:10.480 for someone who was writing SQL statements by hand, 00:19:10.480 --> 00:19:12.600 that was really exciting. 00:19:12.600 --> 00:19:14.799 And migrations were awesome, too, because you always need 00:19:14.799 --> 00:19:17.750 to transition the state of your database in your, 00:19:17.750 --> 00:19:18.690 in your application. 00:19:18.690 --> 00:19:21.610 And, again, this is something that we had built 00:19:21.610 --> 00:19:24.940 at my job. But ours was not as good. 00:19:24.940 --> 00:19:28.940 It, it used raw SQL, so you would write 00:19:28.940 --> 00:19:32.039 SQL statements to, to transition the database. And it 00:19:32.039 --> 00:19:34.419 was tied directly to the app version that, that 00:19:34.419 --> 00:19:36.960 we had. So, when you would release a new 00:19:36.960 --> 00:19:39.350 version of the app, you would have to sync 00:19:39.350 --> 00:19:41.649 that with the database. The database version would have 00:19:41.649 --> 00:19:42.889 to be synced with that. 00:19:42.889 --> 00:19:44.690 So there was, there was no way to independently 00:19:44.690 --> 00:19:46.610 migrate the database. 00:19:46.610 --> 00:19:47.970 And there was no way to go down. So 00:19:47.970 --> 00:19:50.980 you had to get it right. Rails was better 00:19:50.980 --> 00:19:53.190 than that. 00:19:53.190 --> 00:19:56.149 But why did Rails win? Why, why was Rails 00:19:56.149 --> 00:19:59.070 exciting to people? Because all these features were available 00:19:59.070 --> 00:20:03.169 elsewhere. I think there's three reasons. 00:20:03.169 --> 00:20:04.960 First of all, while each of these features was 00:20:04.960 --> 00:20:07.700 something that you could get in other web programming 00:20:07.700 --> 00:20:11.759 frameworks, Rails brought them all together. Rails was the 00:20:11.759 --> 00:20:18.690 whole package. So Rails took things that were possible 00:20:18.690 --> 00:20:21.539 and made them easy. It, even that, it made 00:20:21.539 --> 00:20:22.970 them the default. 00:20:22.970 --> 00:20:25.330 So Rails took a lot of best practices and 00:20:25.330 --> 00:20:27.570 put them together in one thing that you could 00:20:27.570 --> 00:20:31.200 use super simply. And that was really exciting to 00:20:31.200 --> 00:20:34.549 people. Even, even for me, because I was able 00:20:34.549 --> 00:20:36.309 to, to do some of the things that Rails 00:20:36.309 --> 00:20:39.419 had. Having it together in one package was super 00:20:39.419 --> 00:20:41.259 exciting. 00:20:41.259 --> 00:20:43.330 The second reason I think Rails succeeded is the 00:20:43.330 --> 00:20:46.279 triumph of hype. If you go back and read 00:20:46.279 --> 00:20:49.490 the early blog posts about Rails, it's really interesting 00:20:49.490 --> 00:20:53.200 because it really caused a furor in the Java 00:20:53.200 --> 00:20:55.470 and the Python world. Because people were like, well, 00:20:55.470 --> 00:20:57.950 why can't we do this? And in the middle 00:20:57.950 --> 00:21:01.809 of all that, you saw DHH. He was constantly 00:21:01.809 --> 00:21:06.230 promoting Rails and getting into discussions and arguments with 00:21:06.230 --> 00:21:10.570 other people and blogging about it. And he, he 00:21:10.570 --> 00:21:13.600 was relentless in promoting Rails, and the early Rails 00:21:13.600 --> 00:21:16.929 community was relentless in sharing their enthusiasm for this 00:21:16.929 --> 00:21:18.419 new thing. 00:21:18.419 --> 00:21:20.450 And I think that that matters a lot, because 00:21:20.450 --> 00:21:23.809 it's not enough to have great code and just 00:21:23.809 --> 00:21:26.720 put it up on the internet. That, that never 00:21:26.720 --> 00:21:29.169 works. You need to tell people about what you're 00:21:29.169 --> 00:21:32.970 doing in order for them to know about it. 00:21:32.970 --> 00:21:36.490 And you need to explain clearly and concisely why 00:21:36.490 --> 00:21:40.480 it's better than what they're doing now. And Rails, 00:21:40.480 --> 00:21:44.149 David and the Rails community really succeeded at that. 00:21:44.149 --> 00:21:48.919 Third. Another reason that Rails succeeded is the triumph 00:21:48.919 --> 00:21:53.379 of community. From really early days, Rails had the 00:21:53.379 --> 00:21:56.320 ability to be extended with plugins. And so people 00:21:56.320 --> 00:21:59.509 wrote plugins that would take care of default areas, 00:21:59.509 --> 00:22:02.220 or not, not default areas, but common areas of 00:22:02.220 --> 00:22:06.039 your application, like logging in or uploading files. 00:22:06.039 --> 00:22:07.429 These are the things that you needed in your 00:22:07.429 --> 00:22:10.639 app, but they weren't core to your app. And 00:22:10.639 --> 00:22:13.980 so knowing that you could take advantage of these, 00:22:13.980 --> 00:22:18.440 these plugins and later gems really made picking Rails 00:22:18.440 --> 00:22:24.909 an easier choice. 00:22:24.909 --> 00:22:27.820 So ultimately, Rails was successful. But what about the 00:22:27.820 --> 00:22:31.159 future? What does the future have in store for 00:22:31.159 --> 00:22:36.019 Rails? I think that Rails does face challenges in 00:22:36.019 --> 00:22:40.799 the future, because, because the web is changing. What 00:22:40.799 --> 00:22:42.850 people want to do on the web is, is 00:22:42.850 --> 00:22:46.080 becoming different. And indeed the, the future of the 00:22:46.080 --> 00:22:48.870 web I think is even in question. 00:22:48.870 --> 00:22:51.769 So let's look at two challenges to Rails. First 00:22:51.769 --> 00:22:55.999 of all, now that browsers are more powerful, people 00:22:55.999 --> 00:22:58.220 are able to write more of their app on 00:22:58.220 --> 00:23:01.799 the frontend. And so, when you do this, you 00:23:01.799 --> 00:23:05.529 don't need the kind of classic web app that 00:23:05.529 --> 00:23:08.120 Rails is. Rails is really good at generating a 00:23:08.120 --> 00:23:10.620 lot of HTML and shipping it down to the 00:23:10.620 --> 00:23:14.769 client. Kind of the classic web app like base 00:23:14.769 --> 00:23:16.590 camp. 00:23:16.590 --> 00:23:19.200 But when you're writing your entire app in JavaScript 00:23:19.200 --> 00:23:21.649 in the client, what you need is the ability 00:23:21.649 --> 00:23:24.629 to talk to the server with an API. And 00:23:24.629 --> 00:23:28.379 when that's all you're doing, people can question, why 00:23:28.379 --> 00:23:29.860 do I need Rails? Why do I need all 00:23:29.860 --> 00:23:33.210 of this extra stuff that Rails does? I'm, maybe 00:23:33.210 --> 00:23:35.480 I should just use node.js, and then I can 00:23:35.480 --> 00:23:38.100 write, you know, the same language on the client 00:23:38.100 --> 00:23:40.490 and the server. 00:23:40.490 --> 00:23:45.980 Similarly, mobile apps are becoming increasingly popular, because you 00:23:45.980 --> 00:23:47.720 can do so much more with a mobile app 00:23:47.720 --> 00:23:49.980 than you can with a web app. The user 00:23:49.980 --> 00:23:54.169 interaction is much richer and, and faster and, and 00:23:54.169 --> 00:23:58.919 just cleaner. And, again, these kind of apps talk 00:23:58.919 --> 00:24:02.539 to the server with an API. And so people 00:24:02.539 --> 00:24:05.830 think, well, I don't need Rails, then. 00:24:05.830 --> 00:24:07.379 And I think that this, this is a threat 00:24:07.379 --> 00:24:10.659 to Rails. But there's two key things to remember 00:24:10.659 --> 00:24:14.480 about this. One, Rails is great at this kind 00:24:14.480 --> 00:24:18.440 of thing. In our application, we serve hundreds of 00:24:18.440 --> 00:24:23.509 millions of API requests a day, a month, using 00:24:23.509 --> 00:24:25.990 Rails. And the way that we do that is 00:24:25.990 --> 00:24:28.269 not using action Controller. 00:24:28.269 --> 00:24:30.249 But Rails makes it easy to pick out only 00:24:30.249 --> 00:24:33.860 the parts of Rails that you need to use. 00:24:33.860 --> 00:24:35.740 And so you can, you can take Rails much 00:24:35.740 --> 00:24:40.190 further than many people think, I believe. 00:24:40.190 --> 00:24:43.509 Second, even if you are building an API heavy 00:24:43.509 --> 00:24:45.700 app, not all of your app is going to 00:24:45.700 --> 00:24:49.299 be API based. You are going to need a 00:24:49.299 --> 00:24:54.179 management console to handle the backend of your application. 00:24:54.179 --> 00:24:55.899 Pretty much every app has this. You need a 00:24:55.899 --> 00:24:59.399 way to look up your users and, you know, 00:24:59.399 --> 00:25:02.009 change their account status and things like that. 00:25:02.009 --> 00:25:04.639 And, are you gonna build an iPad app for 00:25:04.639 --> 00:25:06.860 that? I don't think so. Because it would be 00:25:06.860 --> 00:25:09.600 too expensive and slow. The web is still the 00:25:09.600 --> 00:25:13.309 best way and the easiest way to distribute an 00:25:13.309 --> 00:25:15.059 application. 00:25:15.059 --> 00:25:17.119 So Rails has a real, I think, has a 00:25:17.119 --> 00:25:20.879 place for that. Or, there's a place for Rails, 00:25:20.879 --> 00:25:24.970 even in an API-driven application. 00:25:24.970 --> 00:25:27.529 But even if the web, as a platform, and 00:25:27.529 --> 00:25:30.309 Rails as a, as a framework, can't adapt and 00:25:30.309 --> 00:25:32.529 fall by the wayside, I think the legacy of 00:25:32.529 --> 00:25:36.049 Rails will really live on for a long time. 00:25:36.049 --> 00:25:40.690 Because this idea of taking things that were possible 00:25:40.690 --> 00:25:44.119 and making them simple, making them easy to do, 00:25:44.119 --> 00:25:47.909 is really powerful. And it inspired programmers in many 00:25:47.909 --> 00:25:52.679 different programming languages to, to copy Rails and to 00:25:52.679 --> 00:25:57.999 try to get those benefits for themselves. 00:25:57.999 --> 00:26:00.149 So I think no matter what the next platform 00:26:00.149 --> 00:26:03.799 is, people will be inspired by that aspect of 00:26:03.799 --> 00:26:06.039 Rails, and they will want to write the Rails 00:26:06.039 --> 00:26:09.009 of whatever. 00:26:09.009 --> 00:26:10.980 I'd also like to look at the reaction against 00:26:10.980 --> 00:26:15.259 Rails. Because that's part of Rails's legacy, too. There's 00:26:15.259 --> 00:26:17.940 two examples that I'd like to talk about here. 00:26:17.940 --> 00:26:21.049 First of all, there's Jengo. So Jengo can't be 00:26:21.049 --> 00:26:26.019 considered to be inspired by Rails, because it was 00:26:26.019 --> 00:26:28.460 developed at the same time or even earlier than 00:26:28.460 --> 00:26:29.309 Rails. 00:26:29.309 --> 00:26:34.049 But since, the, the two frameworks have been really 00:26:34.049 --> 00:26:36.110 similar and, and, and have learned a lot from 00:26:36.110 --> 00:26:39.860 each other I think. But the way that Jengo 00:26:39.860 --> 00:26:42.980 works, it is really driven by the Python philosophy 00:26:42.980 --> 00:26:47.190 of explicit is better than implicit. So in, in 00:26:47.190 --> 00:26:50.610 Jengo, when you, when you like what to map 00:26:50.610 --> 00:26:53.460 up a url on your server, you think really 00:26:53.460 --> 00:26:55.889 hard about what that url is going to be. 00:26:55.889 --> 00:27:00.809 It doesn't happen automatically. And your database models tell 00:27:00.809 --> 00:27:04.759 the database what its fields should be, instead of 00:27:04.759 --> 00:27:08.330 the other way around. In Rails, of course, we 00:27:08.330 --> 00:27:11.809 follow convention over configuration, right. But if you've ever 00:27:11.809 --> 00:27:14.379 tried to teach someone Rails, you know that this 00:27:14.379 --> 00:27:17.889 can be a double-edged sword. 00:27:17.889 --> 00:27:20.190 Convention over configuration lets you write less code, but 00:27:20.190 --> 00:27:23.440 it also makes it less clear what's happening. When 00:27:23.440 --> 00:27:26.499 you're teaching somebody Rails, it can be really confusing 00:27:26.499 --> 00:27:29.330 that you edit a route in this file over 00:27:29.330 --> 00:27:32.200 here and therefore your controller over here needs to 00:27:32.200 --> 00:27:35.850 be named this and it has these methods available 00:27:35.850 --> 00:27:40.639 to it that respond to these HTTP requests. Or 00:27:40.639 --> 00:27:42.320 HTTP methods. 00:27:42.320 --> 00:27:44.059 That is not at all obvious. And so it 00:27:44.059 --> 00:27:49.820 takes time to learn all those conventions. And, I 00:27:49.820 --> 00:27:51.289 mean, I don't think one is better than the 00:27:51.289 --> 00:27:54.320 other. They're just, you know, different sides of the 00:27:54.320 --> 00:27:56.899 same coin. Different ways of looking at how programming 00:27:56.899 --> 00:27:59.480 should work. 00:27:59.480 --> 00:28:01.669 Kind of related to that is the second example, 00:28:01.669 --> 00:28:06.570 which is microframeworks. Like Sinatra. These have been incredibly 00:28:06.570 --> 00:28:09.470 influential. And I love using Sinatra. It's just, it's 00:28:09.470 --> 00:28:11.169 like such a thing of beauty, when you can 00:28:11.169 --> 00:28:13.860 have your whole web app in one file. And 00:28:13.860 --> 00:28:16.539 the, the urls that are, that are in your 00:28:16.539 --> 00:28:19.820 web app are just tightly connected to the code 00:28:19.820 --> 00:28:22.139 that's going to run when someone goes to that 00:28:22.139 --> 00:28:22.999 url. 00:28:22.999 --> 00:28:27.139 It, that is like a really wonderful feeling, I 00:28:27.139 --> 00:28:31.330 think. And Sinatra has been probably even more influential 00:28:31.330 --> 00:28:35.179 than Rails. There are copies of Sinatra, or Sinatra-inspired 00:28:35.179 --> 00:28:39.350 microframeworks anyway, in just about every programming language you 00:28:39.350 --> 00:28:43.460 can think of. Anything from Java to PHP to 00:28:43.460 --> 00:28:48.299 Clojure, Go, JavaScript. Even Haskall. 00:28:48.299 --> 00:28:52.999 All of these have a version of Sinatra. 00:28:52.999 --> 00:28:57.960 And in some languages, these microframeworks, the microframework inspired 00:28:57.960 --> 00:29:00.989 by Sinatra is the default way people write web 00:29:00.989 --> 00:29:05.389 apps. It's the best way that they have. And 00:29:05.389 --> 00:29:07.610 I think that that is kind of a problem, 00:29:07.610 --> 00:29:12.019 because while I love using Sinatra, when an app 00:29:12.019 --> 00:29:14.129 gets above a certain size, I find myself pulling 00:29:14.129 --> 00:29:16.179 in more and more of Rails. 00:29:16.179 --> 00:29:19.509 And at some point I feel, well, I might 00:29:19.509 --> 00:29:22.009 as well just switch to Rails. And so, in 00:29:22.009 --> 00:29:23.690 these, I feel bad for these programmers in these 00:29:23.690 --> 00:29:26.200 other languages, because they don't have the choice to 00:29:26.200 --> 00:29:30.179 switch, necessarily, to something as good as Rails. 00:29:30.179 --> 00:29:31.809 So I think, I think Rails actually has a 00:29:31.809 --> 00:29:34.299 bright future ahead of it, because it, it's shown 00:29:34.299 --> 00:29:38.169 the ability to adapt and respond to change. Think 00:29:38.169 --> 00:29:41.330 about Rails 1 point 2 and the addition of 00:29:41.330 --> 00:29:43.980 REST and making that the default way that we 00:29:43.980 --> 00:29:48.519 think about controllers and resources on the web. 00:29:48.519 --> 00:29:51.739 So I think that if people want to use 00:29:51.739 --> 00:29:55.440 Rails to back JavaScript-based applications, Rails will get better 00:29:55.440 --> 00:29:57.639 at that. And if people want to use it 00:29:57.639 --> 00:30:00.190 to back mobile applications, it will get better than, 00:30:00.190 --> 00:30:02.779 at that. But you'll still have the ability to 00:30:02.779 --> 00:30:05.009 use Rails for what it's good at when you 00:30:05.009 --> 00:30:06.299 need to. 00:30:06.299 --> 00:30:11.619 All right. So we've talked about what programming was 00:30:11.619 --> 00:30:16.610 like in 2004. We've talked a little bit about 00:30:16.610 --> 00:30:19.279 the features of Rails that made people want to 00:30:19.279 --> 00:30:23.230 use it and made it win. And we've talked 00:30:23.230 --> 00:30:26.200 about what could happen in the future. What is 00:30:26.200 --> 00:30:29.210 the, what's the legacy of Rails and will it 00:30:29.210 --> 00:30:33.320 be able to adapt? 00:30:33.320 --> 00:30:35.889 So a hundred years ago, or, actually, more than 00:30:35.889 --> 00:30:39.369 a hundred years ago, when Edward Bellamy was frustrated 00:30:39.369 --> 00:30:41.970 with the way things were going, with how society 00:30:41.970 --> 00:30:45.110 was working, he took up his pen and he 00:30:45.110 --> 00:30:48.789 used his imagination to create a new world. This, 00:30:48.789 --> 00:30:51.580 this utopian novel, where he could explain how he 00:30:51.580 --> 00:30:53.739 thought things ought to work. 00:30:53.739 --> 00:30:56.889 Now, that may seem kind of pointless. Because it's 00:30:56.889 --> 00:31:01.580 the twenty-first century. America is not a socialist utopia. 00:31:01.580 --> 00:31:05.499 But that book was incredibly influential. In the years 00:31:05.499 --> 00:31:09.279 after its publication, hundreds of Bellamy clubs were started 00:31:09.279 --> 00:31:12.509 across the country, and millions of people were inspired 00:31:12.509 --> 00:31:15.499 by the ideas written in the book. 00:31:15.499 --> 00:31:19.690 And those people, and those clubs formed the nucleus 00:31:19.690 --> 00:31:23.799 of the progressive movement in the early twentieth century, 00:31:23.799 --> 00:31:27.239 that broke the trusts and monopolies, and ultimately paved 00:31:27.239 --> 00:31:30.619 the way for social security and the American welfare 00:31:30.619 --> 00:31:31.220 state. 00:31:31.220 --> 00:31:34.059 So the book did have a huge influence on, 00:31:34.059 --> 00:31:35.460 on the world. 00:31:35.460 --> 00:31:37.960 Programming, on the other hand, is a little more 00:31:37.960 --> 00:31:43.929 concrete. So when DHH was frustrated by how programming, 00:31:43.929 --> 00:31:48.489 web programming worked in 2003 or whatever, he was 00:31:48.489 --> 00:31:51.830 able to do something about it. He cracked open 00:31:51.830 --> 00:31:54.289 his text editor and got to work and built 00:31:54.289 --> 00:31:57.139 something that people found inspiring. 00:31:57.139 --> 00:31:59.340 And when they saw it, they wanted to meet 00:31:59.340 --> 00:32:01.679 other people who were interested in that. And that 00:32:01.679 --> 00:32:04.429 was the genesis of the Rails community. And so 00:32:04.429 --> 00:32:09.179 today, you know, we're all here today because of 00:32:09.179 --> 00:32:13.070 the Rails community and because of what, what developed 00:32:13.070 --> 00:32:17.350 over those, those last ten years. So I'm really, 00:32:17.350 --> 00:32:19.830 really pleased to be a part of that community, 00:32:19.830 --> 00:32:23.320 and really honored to be speaking to you today 00:32:23.320 --> 00:32:24.940 about that. 00:32:24.940 --> 00:32:27.259 And it, it's made a huge impact in the 00:32:27.259 --> 00:32:30.489 direction of my career. And I just find it 00:32:30.489 --> 00:32:33.739 inspiring. I find it inspiring that as programmers, we 00:32:33.739 --> 00:32:36.590 can see something that's broken and we can fix 00:32:36.590 --> 00:32:39.730 it. We can create a new reality for ourselves 00:32:39.730 --> 00:32:42.869 with code. And I think that that's a really 00:32:42.869 --> 00:32:45.669 powerful, really powerful notion. 00:32:45.669 --> 00:32:47.519 And we also shouldn't forget the lessons of Rails 00:32:47.519 --> 00:32:50.299 as we did that. Because Rails didn't just win 00:32:50.299 --> 00:32:53.450 because it was, because it was better, though I, 00:32:53.450 --> 00:32:55.629 I do think it was. It won because of 00:32:55.629 --> 00:32:58.600 the community around it and because of the, their 00:32:58.600 --> 00:33:01.679 passion for telling people about what was so good 00:33:01.679 --> 00:33:03.129 about Rails. 00:33:03.129 --> 00:33:06.220 So most of us probably are not going to 00:33:06.220 --> 00:33:10.720 write the next great framework. I, I, I don't 00:33:10.720 --> 00:33:13.879 imagine that I will. But I think that this, 00:33:13.879 --> 00:33:15.919 we can take to heart the lessons of Rails 00:33:15.919 --> 00:33:18.590 in our own work and in the libraries that 00:33:18.590 --> 00:33:19.919 we're writing. 00:33:19.919 --> 00:33:23.179 Don't forget to, to, to try to make things 00:33:23.179 --> 00:33:25.409 easy. To try to make it easy for your 00:33:25.409 --> 00:33:28.679 fellow programmers. And don't forget to tell people about 00:33:28.679 --> 00:33:32.419 it and explain why they should use what you've 00:33:32.419 --> 00:33:34.720 written. And I think if you do that, you 00:33:34.720 --> 00:33:36.640 can help make the world a better place. 00:33:36.640 --> 00:33:37.940 Thanks.