1 00:00:00,000 --> 00:00:02,900 And you know, like I don't think economically we need local-first 2 00:00:02,920 --> 00:00:06,170 software, you know, like we can trudge along with the feudalism 3 00:00:06,199 --> 00:00:10,089 of Google cloud services for, you know, probably for a very long time. 4 00:00:10,176 --> 00:00:11,016 but I don't want that. 5 00:00:11,096 --> 00:00:15,296 I want beautiful software programs that work in harmony with who I am as a person 6 00:00:15,306 --> 00:00:19,036 and with in harmony with what kind of communities I want to be able to foster. 7 00:00:19,824 --> 00:00:21,814 Welcome to the local-first FM podcast. 8 00:00:22,334 --> 00:00:25,174 I'm your host, Johannes Schickling, and I'm a web developer, a 9 00:00:25,174 --> 00:00:28,274 startup founder, and love the craft of software engineering. 10 00:00:28,394 --> 00:00:32,344 For the past few years, I've been on a journey to build a modern, high quality 11 00:00:32,344 --> 00:00:34,044 music app using web technologies. 12 00:00:34,294 --> 00:00:38,384 And in doing so, I've been falling down the rabbit hole of local-first software. 13 00:00:38,854 --> 00:00:41,814 This podcast is your invitation to join me on that journey. 14 00:00:42,304 --> 00:00:46,674 In this episode, I'm speaking to Seph Gentle, a prolific software researcher 15 00:00:46,884 --> 00:00:51,484 who's behind projects such as the new AgWalker paper and JRJS, one of the 16 00:00:51,514 --> 00:00:53,824 oldest local-first open source projects. 17 00:00:54,144 --> 00:00:58,804 Before, Seph also co created Google Wave over 10 years ago, which we 18 00:00:58,804 --> 00:01:00,754 explore in depth in this episode. 19 00:01:01,394 --> 00:01:05,304 Before getting started, also a big thank you to Electric SQL 20 00:01:05,324 --> 00:01:06,754 for supporting this podcast. 21 00:01:07,234 --> 00:01:09,044 And now my interview with Seph. 22 00:01:09,765 --> 00:01:10,355 Hey, Seph. 23 00:01:10,485 --> 00:01:12,355 So nice to have you on the podcast. 24 00:01:12,455 --> 00:01:14,525 I'm a huge fan of your work. 25 00:01:14,565 --> 00:01:19,365 I've learned so much from the paper you've recently written about Eg-walker. 26 00:01:19,715 --> 00:01:23,605 And the more I dug into your work, the more I realized, oh, wow, 27 00:01:23,605 --> 00:01:25,255 you've also been involved in this. 28 00:01:25,265 --> 00:01:29,459 So for example, you've been working, On Google Wave, like way 29 00:01:29,459 --> 00:01:34,989 back, but also on projects such as ShareDB ShareJS, et cetera. 30 00:01:35,189 --> 00:01:36,379 So welcome to the show. 31 00:01:36,389 --> 00:01:36,989 How are you doing? 32 00:01:37,189 --> 00:01:37,549 Thanks. 33 00:01:37,569 --> 00:01:37,989 I'm great. 34 00:01:37,989 --> 00:01:39,859 It's so wonderful to finally meet you as well. 35 00:01:39,859 --> 00:01:43,599 I feel like you're one of these faces that pokes up everywhere and, yeah, 36 00:01:43,599 --> 00:01:46,589 it's lovely to meet in person and get to actually chat about all of this stuff. 37 00:01:46,939 --> 00:01:47,419 Awesome. 38 00:01:47,849 --> 00:01:48,179 Yeah. 39 00:01:48,219 --> 00:01:53,009 So I've already mentioned a few projects that you worked on, but maybe you want 40 00:01:53,009 --> 00:01:54,859 to give a background for the audience. 41 00:01:55,379 --> 00:01:56,189 No, absolutely. 42 00:01:56,249 --> 00:02:00,450 So, I guess the story starts way back in, I think it was 2010, 2011. 43 00:02:00,830 --> 00:02:04,270 And I was invited onto the super secret at the time project of Google 44 00:02:04,270 --> 00:02:05,860 Wave, which was run out of Google. 45 00:02:06,210 --> 00:02:08,906 And it was, not many people know this, and I'm sure someone will get in 46 00:02:08,906 --> 00:02:12,456 trouble, get mad at me for saying so, but it was a secret even inside Google. 47 00:02:12,496 --> 00:02:12,856 Sorry. 48 00:02:13,174 --> 00:02:15,964 Google was thinking we've got lots of people who've worked in startups, 49 00:02:15,964 --> 00:02:17,164 but we're not a startup anymore. 50 00:02:17,464 --> 00:02:18,904 How do we get some of that innovation? 51 00:02:19,294 --> 00:02:22,524 And so Google Wave started as this skunkworks project. 52 00:02:22,524 --> 00:02:25,084 They didn't even tell Google us about it, which was a wild thing at the time. 53 00:02:25,533 --> 00:02:28,863 and before long, you know, in the original vision to anyone who hasn't tried it out. 54 00:02:29,258 --> 00:02:32,474 Was if we reinvented email today, what would we want it to look like? 55 00:02:32,534 --> 00:02:33,164 What could it do? 56 00:02:33,244 --> 00:02:38,422 And so, Wave is this almost cross between, email and Google Docs and something 57 00:02:38,422 --> 00:02:43,222 else where you can have, A conversation, which they called a Wave, was a series 58 00:02:43,222 --> 00:02:45,862 of messages, but messages could go down. 59 00:02:45,862 --> 00:02:47,852 So we could have a series of conversation items. 60 00:02:48,242 --> 00:02:51,802 You could also embed messages and embed entire threads inside a comment. 61 00:02:51,822 --> 00:02:55,512 So I could write something and you could start a comment thread inside that and 62 00:02:55,582 --> 00:02:57,092 any comment, anything that anyone wrote. 63 00:02:57,472 --> 00:02:59,282 Anyone could come along and just collaboratively edit 64 00:02:59,282 --> 00:03:00,282 it and change it later. 65 00:03:00,535 --> 00:03:04,052 So, we sort of built this thing not really knowing how it was going to 66 00:03:04,052 --> 00:03:06,382 be used, which is a beautiful luxury. 67 00:03:06,575 --> 00:03:08,825 and the answer is that lots of people used it for, you know, 68 00:03:08,825 --> 00:03:10,985 say like, for playing D& D games. 69 00:03:11,025 --> 00:03:13,335 And they would put all of the information about the campaign 70 00:03:13,335 --> 00:03:14,495 itself at the top of a Wave. 71 00:03:14,805 --> 00:03:17,335 And then the actual session would be a series of messages and then they'd 72 00:03:17,335 --> 00:03:18,605 start a new Wave for the next session. 73 00:03:18,925 --> 00:03:20,415 Or, say minutes. 74 00:03:20,435 --> 00:03:23,645 So you'd have the agenda for a meeting and then during the meeting anyone could, 75 00:03:23,915 --> 00:03:26,855 you know, put in little comment threads about what was actually discussed. 76 00:03:27,045 --> 00:03:29,555 And then your minutes for the meeting turn into the agenda. 77 00:03:29,585 --> 00:03:31,475 Sorry, your agenda turns into the minutes afterwards. 78 00:03:31,740 --> 00:03:33,370 Because we've now got this collaborative document. 79 00:03:33,764 --> 00:03:38,004 So, yeah, I fully remember when Google Wave just first came out. 80 00:03:38,014 --> 00:03:39,684 I was still in high school back then. 81 00:03:39,944 --> 00:03:44,690 I was 16 and, I was like using a few Google products. 82 00:03:44,690 --> 00:03:48,150 I think mostly Gmail and maybe a bit of Google Docs to just 83 00:03:48,160 --> 00:03:49,817 keep track of my, own thoughts. 84 00:03:50,157 --> 00:03:56,012 But when Google Wave came out, I was just so curious and there, there 85 00:03:56,012 --> 00:04:00,112 wasn't really like a real use case I had for it back then, but I got 86 00:04:00,122 --> 00:04:02,622 immediately hooked by the novelty of it. 87 00:04:03,052 --> 00:04:06,872 And it was, I think it was really the first time where it really clicked for 88 00:04:06,882 --> 00:04:11,429 me, like, Oh, this is computers are not just for me, like looking in my single 89 00:04:11,429 --> 00:04:14,789 screen here and then sort of asynchronous. 90 00:04:14,819 --> 00:04:19,219 Yes, I can send an email, et cetera, but we can in real time collaborate on the 91 00:04:19,219 --> 00:04:24,097 same stuff and that sort of same magic that happens if we're like sitting at 92 00:04:24,097 --> 00:04:25,917 the same table and do something together. 93 00:04:26,227 --> 00:04:28,797 Now that can sort of be replicated in there. 94 00:04:29,017 --> 00:04:31,717 And not only did you build something in a real time collaborative 95 00:04:31,717 --> 00:04:33,407 way, you build it so well. 96 00:04:33,417 --> 00:04:37,777 I think Google Wave really set the bar for a long, long, long time. 97 00:04:38,087 --> 00:04:39,722 What I really like. 98 00:04:39,882 --> 00:04:43,802 Immersive, high quality web experience could look like and that was, 99 00:04:43,992 --> 00:04:45,552 yeah, you mentioned like in 2010. 100 00:04:45,832 --> 00:04:52,366 And so I think that had had a long lasting impact on my own, longing and 101 00:04:52,366 --> 00:04:54,469 motivation to go all in on the web. 102 00:04:55,529 --> 00:04:56,869 Well, that's, that's very kind of you to say. 103 00:04:56,899 --> 00:04:59,469 I feel like, I'm like, Oh, I can't take all the credit for Wave. 104 00:04:59,709 --> 00:05:02,349 I mean, at peak, there was 60 people working on it and I came 105 00:05:02,349 --> 00:05:03,509 onto the project reasonably late. 106 00:05:03,539 --> 00:05:08,019 So, you know, it wasn't my grand vision, and something though for this audience, 107 00:05:08,019 --> 00:05:12,359 you might be fascinated by, we built the entire thing to be, it wasn't local-first, 108 00:05:12,379 --> 00:05:15,799 that term certainly didn't exist at the time, but it was fully federated. 109 00:05:15,849 --> 00:05:18,289 So it worked like email did with the idea that people could 110 00:05:18,289 --> 00:05:19,489 run their own Wave servers. 111 00:05:19,904 --> 00:05:22,604 And, you know, and so you could collaborate within your organization 112 00:05:22,624 --> 00:05:25,914 on your Waves and then the document wouldn't leave your organization 113 00:05:26,114 --> 00:05:28,694 unless you explicitly added someone from outside of your organization. 114 00:05:28,971 --> 00:05:31,801 otherwise it would stay in the four walls of your company and 115 00:05:31,801 --> 00:05:34,571 your own servers, which was really, really cool and groundbreaking. 116 00:05:34,651 --> 00:05:38,491 I mean, like hearing that in retrospect doesn't sound very, like, that's not 117 00:05:38,511 --> 00:05:43,471 what I associate with Google these days, like Google typically builds like a very. 118 00:05:43,721 --> 00:05:46,191 Google centric service, take it or leave it. 119 00:05:46,461 --> 00:05:50,491 It works really well integrated in the rest of Google services, but 120 00:05:50,521 --> 00:05:55,571 going in a more federated, like open protocol direction is not immediate. 121 00:05:55,921 --> 00:05:57,831 Maybe this was just a different time back then. 122 00:05:58,831 --> 00:05:59,181 Maybe. 123 00:05:59,221 --> 00:06:02,521 I think that Wave was also, it was an unusual, it was a weird 124 00:06:02,521 --> 00:06:03,931 project inside Google itself. 125 00:06:03,981 --> 00:06:06,211 It was run out of Australia in the Sydney office. 126 00:06:06,611 --> 00:06:09,351 so you know, it was, it was like this little, little project at 127 00:06:09,351 --> 00:06:10,561 first about what could we build. 128 00:06:10,961 --> 00:06:11,241 And. 129 00:06:12,106 --> 00:06:14,196 Google's got a funny relationship with openness. 130 00:06:14,416 --> 00:06:17,396 where you've got, I mean, I agree with you about most of Google's product 131 00:06:17,396 --> 00:06:21,386 offerings, but then Google are one of the hugest proponents of the web and 132 00:06:21,386 --> 00:06:23,306 the web of course is still fully open. 133 00:06:23,336 --> 00:06:26,246 And you know, as much as people like to complain whenever. 134 00:06:26,429 --> 00:06:29,017 Google Chrome integrates with Google services. 135 00:06:29,274 --> 00:06:32,084 Google at their heart really still does believe in the open web. 136 00:06:32,154 --> 00:06:35,664 And, you know, so the question is, could we use that knowledge and that 137 00:06:35,704 --> 00:06:39,144 understanding to be able to build more products that work like email does? 138 00:06:39,174 --> 00:06:42,864 And of course, again, Google, you know, with Gmail as a, you know, 139 00:06:42,944 --> 00:06:44,224 it's all built on open protocols. 140 00:06:44,474 --> 00:06:45,784 so yeah. 141 00:06:45,861 --> 00:06:48,506 but no, it was really ambitious and it was a really beautiful. 142 00:06:48,811 --> 00:06:51,761 product, product use, as you say, it introduced lots of people to 143 00:06:52,021 --> 00:06:55,301 actually things being real time and collaborative by default, which I 144 00:06:55,301 --> 00:06:56,471 really think is the right default. 145 00:06:56,784 --> 00:07:00,288 I told my mom at one point I spent, you know, a couple of years of my life trying 146 00:07:00,288 --> 00:07:03,958 to make, we, we had a joke that we wanted to make two windows look exactly the same. 147 00:07:04,284 --> 00:07:06,394 and you know, so if you typed in one window, it would just 148 00:07:06,394 --> 00:07:07,374 appear on the other screen. 149 00:07:07,584 --> 00:07:09,164 And this is a really very difficult problem. 150 00:07:09,474 --> 00:07:12,729 and she kind of gave me this quizzical look and said, Doesn't 151 00:07:12,729 --> 00:07:13,949 it do that already anyway? 152 00:07:14,009 --> 00:07:17,109 And, you know, she just never tried and never noticed. 153 00:07:17,529 --> 00:07:21,439 But it's really, really is, uh, Paul Graham has this question, he 154 00:07:21,439 --> 00:07:24,406 says, what feels like it would be obvious, it would be crazy for us 155 00:07:24,406 --> 00:07:25,376 not to have in a hundred years. 156 00:07:25,766 --> 00:07:30,116 And I think about that a lot, of, what technology would it be crazy for us not 157 00:07:30,126 --> 00:07:34,006 to have, in such that, if we could figure out what that technology is, could we 158 00:07:34,006 --> 00:07:35,916 build that now, and then just have it now? 159 00:07:36,229 --> 00:07:38,619 you know, I don't want to have to wait for someone else to invent all of this stuff. 160 00:07:38,994 --> 00:07:42,958 Like, with Wave, it felt like it was right at the birth of collaborative editing. 161 00:07:42,968 --> 00:07:46,184 Google Docs was actually quite new at the time and, believe it or not, 162 00:07:46,184 --> 00:07:49,234 Google Docs had a bunch of correctness issues where, you know, if you type 163 00:07:49,234 --> 00:07:51,614 certain text and then bolded and then you unplugged your network cable at 164 00:07:51,614 --> 00:07:54,809 the right time and everything else, you'd end up Converging, you would see 165 00:07:54,809 --> 00:07:58,159 something and if you hit refresh, you'd see a different document on your screen. 166 00:07:58,459 --> 00:08:00,739 these problems were still new and we were still figuring them out. 167 00:08:00,999 --> 00:08:04,439 But I feel really sad that there's not more software that takes advantage of this 168 00:08:04,439 --> 00:08:05,729 cool technology we've been working on. 169 00:08:06,183 --> 00:08:09,643 you know, like even things like Figma, and I love Figma for using CRDTs, 170 00:08:09,703 --> 00:08:11,733 but you can't run your own Figma. 171 00:08:12,043 --> 00:08:15,056 When I open Figma, it's, a centralized service. 172 00:08:15,066 --> 00:08:17,456 It just happens to be using CRDTs to do collaborative editing. 173 00:08:17,780 --> 00:08:20,349 but I feel like it's technology that we can use for so much stuff. 174 00:08:20,846 --> 00:08:24,626 and that's, yeah, that was kind of part of my, like, jewel, joy 175 00:08:24,626 --> 00:08:26,096 and sadness in working on Wave. 176 00:08:26,266 --> 00:08:26,856 Right. 177 00:08:26,926 --> 00:08:27,306 Thought, ah. 178 00:08:27,596 --> 00:08:30,516 Yeah, I mean, let's not, let's not go to the sad part yet. 179 00:08:30,596 --> 00:08:32,566 Ultimately, Google Wave shut down. 180 00:08:32,826 --> 00:08:37,186 But I want to hear a bit more about the various aspects you've already mentioned. 181 00:08:37,216 --> 00:08:40,126 And I love the framing of Paul Graham in that regard. 182 00:08:40,126 --> 00:08:41,133 Like, what would be just. 183 00:08:41,358 --> 00:08:44,958 obvious, to build, and maybe we can also follow up which 184 00:08:44,978 --> 00:08:47,078 ideas feel obvious to you now. 185 00:08:47,118 --> 00:08:50,048 And maybe that you want to work on, you don't have the time. 186 00:08:50,058 --> 00:08:52,148 Let's, let's shelve that for the time being. 187 00:08:52,418 --> 00:08:57,188 So not only was Google Wave just like an amazing product experience, 188 00:08:57,198 --> 00:08:59,318 like how fluid it felt, et cetera. 189 00:08:59,318 --> 00:09:03,868 And you have to remember this was like it's 2010, where web standards 190 00:09:03,868 --> 00:09:06,518 were not at all where they were today. 191 00:09:06,938 --> 00:09:10,358 And, I'm not sure how strict Google was back then about, 192 00:09:10,368 --> 00:09:12,085 like, browser compatibility. 193 00:09:12,482 --> 00:09:16,178 but I remember the experience just feeling phenomenal back then. 194 00:09:16,468 --> 00:09:19,398 So what were some of the key challenges making this happen? 195 00:09:19,398 --> 00:09:20,518 I mean, 196 00:09:20,558 --> 00:09:21,748 that's very kind of you to say. 197 00:09:22,018 --> 00:09:24,458 That wasn't the universal experience and it depended very 198 00:09:24,458 --> 00:09:25,438 much on what browser you had. 199 00:09:25,798 --> 00:09:30,748 We, we had an internal Wave that was like scrolled for a long way of open 200 00:09:30,758 --> 00:09:33,968 browser bugs that we'd filed against all of the different web browsers in all 201 00:09:33,968 --> 00:09:35,178 sorts of different little edge cases. 202 00:09:35,588 --> 00:09:39,708 I mean, for context, we made Google Wave work on, I think it worked on IE8. 203 00:09:40,013 --> 00:09:42,688 it certainly worked on IE9, which is the version of Internet Explorer at the time. 204 00:09:43,048 --> 00:09:46,048 but there was so much that was still, I mean, even still is 205 00:09:46,048 --> 00:09:47,148 not standardized, honestly. 206 00:09:47,448 --> 00:09:51,578 We had a rich text editing element, and we needed that to work with international 207 00:09:51,578 --> 00:09:55,285 characters and internationalization, and be able to, synchronize with any 208 00:09:55,285 --> 00:09:57,175 device on any platform with any browser. 209 00:09:57,235 --> 00:09:59,255 So, that was tremendously hard. 210 00:09:59,265 --> 00:10:05,455 There was a team of about six or seven People just working on the input side and 211 00:10:05,455 --> 00:10:09,985 we had this insane test suite that would test and, you know, different keyboards 212 00:10:09,985 --> 00:10:13,255 in the office of, you know, for Korean characters and Chinese characters and, 213 00:10:13,455 --> 00:10:17,018 you know, European, various different forms, you know, different laptops running 214 00:10:17,018 --> 00:10:19,988 different versions of windows to make sure that we could get everything to 215 00:10:19,988 --> 00:10:23,318 synchronize correctly, and we used all of that to try and just make the browser 216 00:10:23,428 --> 00:10:27,252 work correctly and work consistently, but from a technology standpoint, we 217 00:10:27,252 --> 00:10:30,292 forget now, but this is back in the day before we realized that JavaScript 218 00:10:30,292 --> 00:10:34,672 was actually a useful language and kind of nice to write in sometimes so 219 00:10:34,842 --> 00:10:36,242 Google Wave was all written in Java. 220 00:10:36,447 --> 00:10:39,847 And then compiled from Java to JavaScript via Google Web Toolkit. 221 00:10:40,317 --> 00:10:43,877 So, we had, I think that when Wave got shut down eventually, 222 00:10:43,940 --> 00:10:45,210 I checked the source tree. 223 00:10:45,500 --> 00:10:46,680 And internally we had 1. 224 00:10:46,680 --> 00:10:47,860 1 million lines of Java code. 225 00:10:47,970 --> 00:10:51,060 And obviously, that wasn't all the client side application. 226 00:10:51,407 --> 00:10:52,353 but then that compiled. 227 00:10:52,613 --> 00:10:56,818 To, it was like a 500 kilobyte JavaScript bundle, which these days doesn't seem 228 00:10:56,818 --> 00:11:01,513 so large, but at the time it brought down, you know, mighty web browsers, 229 00:11:01,870 --> 00:11:05,260 trying to run all of this stuff that we were, you know, trying to do 230 00:11:05,320 --> 00:11:08,840 written in, Java to be able to solve all of this like front end problem. 231 00:11:09,230 --> 00:11:10,260 and then on the back end. 232 00:11:10,735 --> 00:11:12,305 Operational transform was a new idea. 233 00:11:12,355 --> 00:11:15,695 CRDTs were, like, I think that they were a gleam in some researchers eyes 234 00:11:15,695 --> 00:11:18,495 at the time that we were working, but they were incredibly inefficient. 235 00:11:18,805 --> 00:11:21,545 So we tried to build something that was federated and would let multiple 236 00:11:21,545 --> 00:11:24,365 servers, multiple users from different organizations all collaboratively 237 00:11:24,365 --> 00:11:27,855 edit a document, all built on top of a very old version of operational 238 00:11:27,855 --> 00:11:31,305 transform, which some very smart people on the team managed to get to work. 239 00:11:31,335 --> 00:11:32,495 But, it was incredibly new. 240 00:11:33,625 --> 00:11:37,245 I learned a huge amount from working on that, which has kept me busy for 241 00:11:37,245 --> 00:11:40,375 the last decade and change honestly of trying to figure out how you 242 00:11:40,375 --> 00:11:41,595 can even solve a problem like that. 243 00:11:42,204 --> 00:11:45,234 there's another feature that I want to plug because I really hope that people 244 00:11:45,234 --> 00:11:48,844 who are listening to this podcast know about it and realize that you could 245 00:11:48,854 --> 00:11:50,104 build this into your own applications. 246 00:11:50,544 --> 00:11:53,187 We, we also had something called, Google Wave, gadgets. 247 00:11:53,237 --> 00:11:56,287 We had gadgets and extensions and it doesn't matter the distinction, but 248 00:11:56,557 --> 00:11:59,447 you can have a Wave and inside of it. 249 00:11:59,815 --> 00:12:03,255 the internal data structure was an XML tree with annotations. 250 00:12:03,265 --> 00:12:06,045 So you could do rich text, but also have arbitrary XML nodes. 251 00:12:06,449 --> 00:12:09,452 you could make different little applications, and the application 252 00:12:09,452 --> 00:12:13,892 would be embedded inside the page, and the application would be given 253 00:12:13,892 --> 00:12:17,392 some small subsection of the XML tree to be able to collaboratively edit. 254 00:12:17,797 --> 00:12:20,257 So as a result, we could build things and anyone in the community could 255 00:12:20,257 --> 00:12:23,077 build things that you could drop into a Wave and when you dropped it into 256 00:12:23,077 --> 00:12:26,437 a Wave, now you've got a small, you know, drop in application that you 257 00:12:26,437 --> 00:12:27,867 could collaboratively edit inside of. 258 00:12:28,327 --> 00:12:32,867 So, for example, we built a Google Maps extension that let you plan your 259 00:12:32,867 --> 00:12:35,457 holiday with a friend and, you know, with as many friends as you want, and 260 00:12:35,457 --> 00:12:37,837 you could all put down marker pins and draw little lines on the map. 261 00:12:38,272 --> 00:12:41,400 we had a, the yes, no, maybe gadget was the most famous where someone 262 00:12:41,400 --> 00:12:45,110 would post in the office and say, Hey, is anyone up for seeing the new, you 263 00:12:45,110 --> 00:12:46,570 know, the new movie, whatever it is. 264 00:12:46,936 --> 00:12:52,270 on Tuesday at 7pm, and in the Wave would be a little, like, three columns, and 265 00:12:52,290 --> 00:12:55,370 you could click yes, no, or maybe, and whichever column you clicked on, your 266 00:12:55,370 --> 00:12:58,710 face would appear in that, alongside everyone else that clicked on yes, no, 267 00:12:58,710 --> 00:13:02,070 or maybe, or you'd have little polls, and while you had the page open, you could 268 00:13:02,070 --> 00:13:06,030 see everyone's faces appear, all in real time, because that component, which isn't 269 00:13:06,040 --> 00:13:09,824 part of Wave itself, it was an extension, gets to be able to sit on top of the 270 00:13:09,824 --> 00:13:14,094 collaboratively editing, infrastructure and, and work, which was so cool. 271 00:13:14,234 --> 00:13:15,654 That is so amazing. 272 00:13:15,674 --> 00:13:19,114 And I'm like both super excited just hearing about that 273 00:13:19,114 --> 00:13:21,844 again, like amplified by hell. 274 00:13:21,854 --> 00:13:25,964 This was like 2010, like this was like so. 275 00:13:26,189 --> 00:13:29,749 So much earlier, there was no WASM, there was no TypeScript. 276 00:13:30,059 --> 00:13:33,755 There was like, the web was like so, so, so early. 277 00:13:34,165 --> 00:13:37,255 And you didn't just innovate on those technologies, but you 278 00:13:37,265 --> 00:13:38,655 innovated so much on those. 279 00:13:38,665 --> 00:13:42,908 Like you really try to, push to whole new frontiers where the 280 00:13:42,918 --> 00:13:46,908 product experience can be like that, that real time collaboration, 281 00:13:46,918 --> 00:13:49,648 like tied to a phase, et cetera. 282 00:13:49,856 --> 00:13:55,036 and I don't really think that we have that in a, as modular as a way, as you 283 00:13:55,036 --> 00:14:00,343 described it right now, like typically you have those sort of super modular ways, in 284 00:14:00,343 --> 00:14:05,604 a more standalone open, like niche open source thing, but not in a mainstream, 285 00:14:05,904 --> 00:14:07,914 product that, that everyone is using. 286 00:14:08,384 --> 00:14:13,130 And, I think the closest to actually who's going after the same vision that comes 287 00:14:13,130 --> 00:14:15,720 to mind are the folks at Ink and Switch. 288 00:14:15,950 --> 00:14:20,020 Who are building Patchwork and, I get to see the in progress 289 00:14:20,040 --> 00:14:21,770 updates there once in a while. 290 00:14:21,810 --> 00:14:23,340 And it's so, so, so cool. 291 00:14:23,340 --> 00:14:25,890 And like, now I see the strong, strong parallels there. 292 00:14:25,890 --> 00:14:28,860 And I think they have a, similar vision there. 293 00:14:28,870 --> 00:14:31,460 They're just starting from a different foundation. 294 00:14:31,470 --> 00:14:33,640 They're building it on top of Automerge. 295 00:14:33,953 --> 00:14:36,889 we're going to have, Peter von Hardenberg back on the show to talk 296 00:14:36,889 --> 00:14:40,719 about Patchwork as well as at the upcoming local-first conference. 297 00:14:41,099 --> 00:14:43,249 but there's many, many similarities there. 298 00:14:43,629 --> 00:14:46,336 so yeah, this is, this is super inspiring. 299 00:14:46,766 --> 00:14:47,046 Yeah. 300 00:14:47,146 --> 00:14:48,056 I couldn't agree more. 301 00:14:48,286 --> 00:14:51,486 I feel like that's sort of my, my dream software I want to have, 302 00:14:51,726 --> 00:14:54,586 in particular for creative work, I think like if I'm going to be. 303 00:14:55,366 --> 00:14:56,016 I don't know. 304 00:14:56,096 --> 00:14:58,336 I'm using IRC or some, you know, discord or something. 305 00:14:58,676 --> 00:14:59,266 Fine. 306 00:14:59,266 --> 00:15:02,006 I understand that it makes the most sense to have some semi centralized 307 00:15:02,006 --> 00:15:06,516 system, but for creative work, for if I'm writing a, if I'm writing a book, if 308 00:15:06,516 --> 00:15:09,936 I'm collaboratively editing a video with some other people, I want to be able to 309 00:15:09,936 --> 00:15:14,536 have something that both has some data living inside some open platform that any 310 00:15:14,536 --> 00:15:17,966 application and anyone who's interested can grab a copy of the data and. 311 00:15:18,291 --> 00:15:21,741 listen to changes and make changes to the data model, you know, just 312 00:15:21,751 --> 00:15:23,131 as a raw JSON model or something. 313 00:15:23,421 --> 00:15:26,951 And then also like that's sort of the Holy grail of then being able to have 314 00:15:26,961 --> 00:15:30,041 custom extensions and custom bits of software that can be plugged in. 315 00:15:30,244 --> 00:15:31,184 it's not a static platform. 316 00:15:31,184 --> 00:15:35,784 It's something that people can build cool UI on top of and try out different things. 317 00:15:36,124 --> 00:15:37,764 I've got this idea in my mind that I can't. 318 00:15:37,989 --> 00:15:41,087 Escape, which is, it was someone in that broader community once described 319 00:15:41,087 --> 00:15:45,339 Google Wave as glorious data bus in the sky of, you know, this amazing 320 00:15:45,339 --> 00:15:48,199 data bus that just moves all of our data around between computers and you 321 00:15:48,199 --> 00:15:51,139 don't have to think about it and it's complicated and it doesn't matter. 322 00:15:51,229 --> 00:15:54,889 You just know that you've got some data and anytime you want it, it can be on 323 00:15:54,889 --> 00:15:57,949 your device and it can be up to date and it can be, you know, you can make. 324 00:15:58,174 --> 00:16:02,074 Collaborative changes with anyone else and if you had something like a JSON data 325 00:16:02,074 --> 00:16:07,791 model or something like, the data model in Yjs or Automerge, then you could have a 326 00:16:07,801 --> 00:16:11,741 data model than any, you can have lots of different pieces of software interoperably 327 00:16:11,751 --> 00:16:13,501 interact with that same bit of data. 328 00:16:13,771 --> 00:16:17,451 So, you know, if I've got, A whole bunch of server logs in there, and it's just 329 00:16:17,541 --> 00:16:21,471 in the, in the, in the cloud, in the, you know, not the cloud, centralized 330 00:16:21,471 --> 00:16:24,821 cloud, but in this data model, and I can subscribe to that, and I can have an 331 00:16:24,821 --> 00:16:28,661 application that listens to that, those logs, produces a report, and produces 332 00:16:28,661 --> 00:16:31,721 and updates that report in real time, and then puts that back in the set 333 00:16:31,721 --> 00:16:36,381 of data, and that's kind of a boring example, the one I often think about is 334 00:16:36,381 --> 00:16:40,721 compilers, so I've got a bunch of source code files, and I could have all of that 335 00:16:40,731 --> 00:16:44,711 in this data model, so I've got a bunch of files, And I want to just be able to 336 00:16:44,871 --> 00:16:47,911 open any program on my computer to be able to make changes and not just on my 337 00:16:47,911 --> 00:16:51,861 computer, but on any of my devices, grab my iPad, grab my, you know, whatever, 338 00:16:51,891 --> 00:16:53,501 grab a Raspberry Pi and make changes. 339 00:16:53,851 --> 00:16:57,121 And then I want my compiler just to be able to listen to the stream of all of 340 00:16:57,121 --> 00:16:59,581 the changes and be live recompiling. 341 00:16:59,806 --> 00:17:03,766 Based on the differences in the source code and putting back into another data 342 00:17:03,766 --> 00:17:07,186 model, a set of annotations describing where all the errors are and how the 343 00:17:07,186 --> 00:17:10,096 syntax highlighting should work and anything else the compiler wants. 344 00:17:10,456 --> 00:17:13,296 And then we can have different IDEs that don't have to understand the 345 00:17:13,296 --> 00:17:15,906 programming language at all because they can just listen to the compiler, 346 00:17:16,326 --> 00:17:19,296 you know, and then for example, I could have like a testing suite as well. 347 00:17:19,296 --> 00:17:20,466 And then the compiler is. 348 00:17:20,721 --> 00:17:24,241 Keeping up to date and executable, a binary file that's just made of a bunch 349 00:17:24,241 --> 00:17:27,131 of small blocks, which are all like functions that are compiled in, linked in. 350 00:17:27,421 --> 00:17:30,511 And then I could have a testing suite that every 30 seconds, so long as there's 351 00:17:30,511 --> 00:17:33,881 been changes, it reruns the testing suite and keeps up to date a set of like, 352 00:17:33,881 --> 00:17:35,161 which tests are passing and failing. 353 00:17:35,661 --> 00:17:39,176 You know, I, like Unix model is, you know, like lots of small programs that 354 00:17:39,176 --> 00:17:40,656 can interoperate and talk to each other. 355 00:17:40,986 --> 00:17:44,016 but then we, we threw a lot away and I, you know, to this day, 356 00:17:44,016 --> 00:17:45,806 I love using IntelliJ, right? 357 00:17:45,806 --> 00:17:47,431 Like, RustRover, that's it, yeah. 358 00:17:47,591 --> 00:17:51,321 Yeah, but these programs are these huge monolithic programs because the only 359 00:17:51,321 --> 00:17:54,631 way to get all of these small components of an IDE to talk to each other is by 360 00:17:54,681 --> 00:17:56,211 putting them inside one piece of software. 361 00:17:56,484 --> 00:17:59,174 the Unix model itself sort of fell apart because we don't have the 362 00:17:59,174 --> 00:18:02,434 right primitives to be able to plug programs into each other, you know? 363 00:18:02,839 --> 00:18:07,459 I think this is where I also see stark parallels again to what the 364 00:18:07,459 --> 00:18:10,809 folks at Ink & Switch are going after where they're building this, 365 00:18:11,066 --> 00:18:16,346 big data bus with Automerge and then build sort of like systems around it. 366 00:18:16,356 --> 00:18:21,854 And I think Patchwork is both a huge exploration what that could be, but 367 00:18:21,864 --> 00:18:27,004 also drives even more, requirements for the ecosystem to form around. 368 00:18:27,004 --> 00:18:31,704 It's sort of interesting how, the data bus is one aspect, but then the 369 00:18:31,704 --> 00:18:38,333 other, resurfacing idea is basically like a, stateful built system where 370 00:18:38,343 --> 00:18:42,433 you basically, like, you listen to something and you do a computation and 371 00:18:42,673 --> 00:18:44,833 that result, other things can listen to. 372 00:18:44,833 --> 00:18:51,193 So it becomes like this bit, this big tree that's ideally incrementally recomputes. 373 00:18:51,543 --> 00:18:56,503 And this is how most reliable systems that we use on a daily basis work. 374 00:18:56,543 --> 00:18:58,333 But unfortunately. 375 00:18:58,518 --> 00:19:03,751 They're, concealed in a box and, typically don't interoperate 376 00:19:03,941 --> 00:19:05,401 beyond a certain system. 377 00:19:05,441 --> 00:19:09,951 And I think this is another common theme that I'd like to see explored more. 378 00:19:10,211 --> 00:19:12,121 How can, like within Google. 379 00:19:12,181 --> 00:19:16,231 So most things can talk to each other, but now everything is in that big Google 380 00:19:16,231 --> 00:19:18,911 box, but how can we go even beyond that? 381 00:19:19,061 --> 00:19:23,234 And this is where maybe coming back to, the initial ideas behind 382 00:19:23,264 --> 00:19:26,074 Google Wave, where you wanted to build your own protocol. 383 00:19:26,124 --> 00:19:29,184 Can you share more about that protocol and the goals for it? 384 00:19:29,861 --> 00:19:33,324 Yeah, in my mind, the way that I would solve this problem if I were to start 385 00:19:33,324 --> 00:19:35,509 today is to pick some Data model. 386 00:19:35,529 --> 00:19:39,699 So for example, Automerge and then create a protocol where multiple peers, you know, 387 00:19:39,699 --> 00:19:43,712 that takes care of, peer discovery of authentication, all of that kind of stuff. 388 00:19:43,989 --> 00:19:47,962 so that way you can have some little package of software, some binary 389 00:19:47,962 --> 00:19:50,912 that you link to or a JavaScript package, you know, NPM library or 390 00:19:50,912 --> 00:19:53,932 something that will give you access to this, to this data collection. 391 00:19:54,222 --> 00:19:56,532 And then you can make a program that can say, Oh, I would like to 392 00:19:56,532 --> 00:19:57,982 subscribe to this kind of data, please. 393 00:19:58,002 --> 00:19:59,685 And you can see it, for Wave. 394 00:19:59,995 --> 00:20:03,275 Like we started trying to solve this problem and at the time we 395 00:20:03,275 --> 00:20:05,695 used operational transform because there were no other options. 396 00:20:05,785 --> 00:20:07,655 Like this is, it's sort of 2011. 397 00:20:07,835 --> 00:20:11,865 I think the first CRDT paper might've come out around 2005, but performance 398 00:20:11,875 --> 00:20:13,605 wise, it, it performed terribly. 399 00:20:13,645 --> 00:20:17,385 Like if you just typed a regular document of a few pages long, you would use almost 400 00:20:17,385 --> 00:20:22,045 a gigabyte of RAM in memory and a similar amount of disk space just to store the 401 00:20:22,045 --> 00:20:23,525 entire object tree that it created. 402 00:20:24,255 --> 00:20:25,445 It performed very badly. 403 00:20:25,445 --> 00:20:27,455 And that being client side or server side? 404 00:20:28,370 --> 00:20:30,190 both, because they'll, they'll be running all the same code. 405 00:20:30,520 --> 00:20:32,710 So, so that was the problem with CRDTs. 406 00:20:32,780 --> 00:20:35,320 So we used an operational transform based approach, which is based 407 00:20:35,320 --> 00:20:37,294 on the Jupyter, OT algorithm. 408 00:20:37,664 --> 00:20:42,224 And at its heart, um, Jupyter, there's a few different ways to say this for people 409 00:20:42,224 --> 00:20:43,524 who aren't familiar with the technology. 410 00:20:43,837 --> 00:20:47,944 Jupyter uses it's only correct if there are exactly like either 411 00:20:47,944 --> 00:20:50,804 one or two participants, so it can't work at all if there's more 412 00:20:50,804 --> 00:20:51,924 than more than two participants. 413 00:20:51,994 --> 00:20:55,534 So three, there's a whole bunch of correctness problems, but you can 414 00:20:55,534 --> 00:20:58,744 solve that by having the server be one of the participants essentially. 415 00:20:58,824 --> 00:21:02,544 So one way to think about it is that every user is collaboratively editing with us 416 00:21:02,564 --> 00:21:04,164 with their server and the server then. 417 00:21:04,519 --> 00:21:06,589 can collaboratively edit with every user individually. 418 00:21:07,049 --> 00:21:10,899 So you can have a real time collaborative editing system and OT based systems. 419 00:21:10,959 --> 00:21:12,089 Most of them work like this. 420 00:21:12,399 --> 00:21:15,049 So long as you have a centralized server, which gets to make all of the decisions. 421 00:21:15,435 --> 00:21:19,195 and really what that server is needed for is to order things and create a 422 00:21:19,195 --> 00:21:20,825 canonical ordering of all of the events. 423 00:21:21,105 --> 00:21:25,135 So ultimately OT systems like that, and there's a lot of different OT systems, 424 00:21:25,302 --> 00:21:28,955 end up with a, You mentioned event sourcing earlier, you end up with an 425 00:21:28,955 --> 00:21:32,045 event sourcing style list of operations that can all be applied in order. 426 00:21:32,095 --> 00:21:35,125 And if you started an empty document, apply all the operations, you'll end 427 00:21:35,125 --> 00:21:36,195 up with the current document state. 428 00:21:36,719 --> 00:21:39,739 and really you just have one, you know, monotonically increasing version 429 00:21:39,739 --> 00:21:43,569 number, which is the version after, you know, N operations have been applied. 430 00:21:44,429 --> 00:21:45,239 So that works great. 431 00:21:45,469 --> 00:21:46,139 It's pretty fast. 432 00:21:46,139 --> 00:21:47,239 It's what we use for Google Wave. 433 00:21:47,549 --> 00:21:50,344 But Google Wave ran into the problem where, We wanted to 434 00:21:50,344 --> 00:21:51,314 be able to have federations. 435 00:21:51,324 --> 00:21:54,494 So we wanted to be able to have an arbitrary set of servers work and for 436 00:21:54,494 --> 00:21:59,757 that, the network protocol, was horribly complicated and it didn't work reliably. 437 00:21:59,757 --> 00:22:01,837 I saw it work reliably. 438 00:22:01,837 --> 00:22:05,787 It felt like, you know, depended on the phases of the moon and everything else. 439 00:22:05,984 --> 00:22:06,214 where. 440 00:22:07,394 --> 00:22:11,984 The servers needed to, between all of the servers, arrange themselves in a tree so 441 00:22:11,984 --> 00:22:14,924 that there was one server that was the most in charge of all of the servers. 442 00:22:15,154 --> 00:22:17,954 And unfortunately, if that server disappeared, then you'd have a net split. 443 00:22:18,457 --> 00:22:21,520 and all of this was just a, it was a, problem with the technology of the day. 444 00:22:21,550 --> 00:22:23,350 It was a problem with operational transform, ultimately. 445 00:22:23,610 --> 00:22:25,560 That we couldn't build what we wanted to build with OT. 446 00:22:25,800 --> 00:22:29,290 And that sort of got me thinking, like, how do we solve this problem? 447 00:22:29,512 --> 00:22:35,902 so this is condensing about, 12, 13 years of my, my time, after just very briefly 448 00:22:35,912 --> 00:22:40,109 after Google Wave shut down in 2011, I was incredibly sad about it and I thought, oh, 449 00:22:40,199 --> 00:22:41,729 there's no way this technology is so cool. 450 00:22:42,069 --> 00:22:45,525 So JavaScript was, As a language that people like to write was very new. 451 00:22:45,755 --> 00:22:46,235 It was Node. 452 00:22:46,235 --> 00:22:46,895 js 0. 453 00:22:46,935 --> 00:22:48,805 4. NPM hadn't been invented yet. 454 00:22:49,189 --> 00:22:49,979 if you can imagine it. 455 00:22:50,249 --> 00:22:52,849 And I thought, Oh, I'm going to use JavaScript and just write a really, 456 00:22:52,849 --> 00:22:55,449 really simple small library that does operational transform in JavaScript. 457 00:22:55,859 --> 00:22:56,509 And I called it share. 458 00:22:56,509 --> 00:23:00,339 js and weirdly lots of people know about the project even though I've 459 00:23:00,339 --> 00:23:04,239 taken the website down and, you know, it's all, it's not used for much now. 460 00:23:04,619 --> 00:23:07,330 I had a call with someone, who works at WordPress the other 461 00:23:07,330 --> 00:23:09,350 day, and apparently Share. 462 00:23:09,350 --> 00:23:13,040 js helped them land some giant deal with a company in Europe, which I'm 463 00:23:13,040 --> 00:23:17,004 not going to name, and was used as the back end for this, this whole news 464 00:23:17,004 --> 00:23:20,920 site for a long time, which I had no idea about because it just implemented 465 00:23:20,920 --> 00:23:23,310 Operational Transform well, which is all you want a lot of the time. 466 00:23:23,734 --> 00:23:25,954 so I made that and then, but I was still thinking about the 467 00:23:25,954 --> 00:23:27,384 question of how to make CRDTs fast. 468 00:23:27,614 --> 00:23:30,074 There was a whole series of new papers that happened again and again and 469 00:23:30,074 --> 00:23:34,024 again, and I felt like if, if we had a good version of Operational Transform, 470 00:23:34,234 --> 00:23:37,494 we could make an open source version of Wave or something like it, but it 471 00:23:37,494 --> 00:23:40,224 still didn't quite scratch the itch, because I still didn't quite know how 472 00:23:40,224 --> 00:23:42,951 we could get all of these servers to collaboratively, you know, collaborate. 473 00:23:43,067 --> 00:23:47,034 Eventually, a few years ago, I ended up getting frustrated, and I thought I've 474 00:23:47,034 --> 00:23:49,074 been avoiding CRDTs for the longest time. 475 00:23:49,314 --> 00:23:53,834 And I read some CRDT literature and I was like, no, no, what's the latest on CRDTs? 476 00:23:54,084 --> 00:23:55,024 How are they supposed to work? 477 00:23:55,414 --> 00:23:58,066 And I read some papers and I thought, This is ridiculous. 478 00:23:58,066 --> 00:24:00,846 You could just make, you could make an implementation of this that works fast. 479 00:24:01,116 --> 00:24:04,766 The only reason why CRDTs were slow at the time is because people hadn't spent enough 480 00:24:04,766 --> 00:24:06,386 time optimizing the algorithms themselves. 481 00:24:06,876 --> 00:24:09,788 And Kevin Yarns, the author of Yjs, he'd done a lot of work. 482 00:24:09,842 --> 00:24:12,482 Martin Kleppmann, the author of Automerge, had done a lot of work. 483 00:24:12,522 --> 00:24:15,888 But at the time, Yjs was, performed okay. 484 00:24:16,088 --> 00:24:19,248 Automerge was incredibly slow and to work around that Automerge at 485 00:24:19,248 --> 00:24:22,208 the time separated all the code out into this front end and back end. 486 00:24:22,208 --> 00:24:24,818 So the back end did all the slow work and then it had message passing to 487 00:24:24,818 --> 00:24:28,138 pass message into the back end so that this whole slow part of it wouldn't 488 00:24:28,178 --> 00:24:30,378 interact, interrupt the user experience. 489 00:24:30,768 --> 00:24:33,118 but I grabbed a whole bunch of ideas from both approaches and there's a 490 00:24:33,118 --> 00:24:36,958 YouTube video of me picking Kevin Yarns brain on YouTube if you want to, if 491 00:24:36,958 --> 00:24:39,748 anyone's ever interested watching for three hours, let's talk about CRDTs. 492 00:24:40,528 --> 00:24:43,238 But it turns out that, you know, with the right application of some complex 493 00:24:43,238 --> 00:24:46,478 data structures, using B trees in the right ways, and, um, using some of 494 00:24:46,488 --> 00:24:49,638 the techniques that Martin Kleppmann, well, he was the first person I saw do 495 00:24:49,638 --> 00:24:55,318 it, where, in the file system, the way that Automerge saves stuff, saves data 496 00:24:55,668 --> 00:24:59,305 to disk, Most applications think about it, they call it an array of structs. 497 00:24:59,365 --> 00:25:04,235 So if I've got a bunch of rows in a table, every row is an object or a struct, 498 00:25:04,275 --> 00:25:05,365 and then I've got an array of them. 499 00:25:05,425 --> 00:25:08,154 You know, I might have a hundred of them and each one represents a row. 500 00:25:08,162 --> 00:25:09,882 Most databases spin that on its head. 501 00:25:09,902 --> 00:25:13,162 So the database will instead store one file per column. 502 00:25:13,572 --> 00:25:16,055 So It's a struct of arrays, if you want to think about it that way. 503 00:25:16,545 --> 00:25:19,035 what Martin Kleppmann did is he said, well, each of these columns 504 00:25:19,045 --> 00:25:22,135 in something like Automerge, if it's describing all of the keystrokes that 505 00:25:22,135 --> 00:25:23,665 happened, we can store that as a string. 506 00:25:24,085 --> 00:25:26,865 And if it's describing the positions inside a document that everything is 507 00:25:26,865 --> 00:25:30,335 stored, well, those numbers turn out to be sequential almost all of the time. 508 00:25:30,555 --> 00:25:33,935 You know, about, people usually type in runs of about 20 characters 509 00:25:33,935 --> 00:25:34,875 before they move their cursor. 510 00:25:35,285 --> 00:25:38,795 So if you just store run length encoded, that data ends up 511 00:25:38,795 --> 00:25:40,265 collapsing and becoming much smaller. 512 00:25:40,645 --> 00:25:43,725 So I was saying before, CRDTs, you type a moderate document, it 513 00:25:43,725 --> 00:25:46,645 might take 800 megabytes of memory or a gigabyte of memory and disk 514 00:25:46,645 --> 00:25:48,425 space to store it in raw JSON. 515 00:25:48,735 --> 00:25:52,052 But if you run length encode everything, in these columns, you can save, store 516 00:25:52,052 --> 00:25:53,502 the same data in a megabyte or less. 517 00:25:53,952 --> 00:25:54,212 So. 518 00:25:54,819 --> 00:25:58,145 Martin Kleppman did that and did that in the file storage engine of, Automerge. 519 00:25:59,145 --> 00:26:00,165 Yjs copied that. 520 00:26:00,475 --> 00:26:02,595 Then I took that idea and did that. 521 00:26:02,635 --> 00:26:04,085 Oh, and Yjs also did some of this. 522 00:26:04,085 --> 00:26:05,185 I don't want to take credit for all of it. 523 00:26:05,215 --> 00:26:07,675 It's all standing on the shoulders of giants here. 524 00:26:08,101 --> 00:26:11,428 but I made a library called Diamond Types where I was like, Oh, how fast could we 525 00:26:11,428 --> 00:26:13,928 make CRDTs go and use that internally? 526 00:26:13,928 --> 00:26:17,058 So all of the internal data is all run length encoded internally. 527 00:26:17,378 --> 00:26:20,553 And that's a. that's a whole tangent that I need to write up at some point 528 00:26:20,553 --> 00:26:23,043 because there's a whole bunch of clever engineering tricks to get, make that work. 529 00:26:23,530 --> 00:26:26,880 but as a result, you can make CRDTs incredibly fast, way faster than 530 00:26:26,910 --> 00:26:28,030 anyone could possibly imagine. 531 00:26:28,260 --> 00:26:31,010 You know, we're talking in the order of millions of keystrokes a second 532 00:26:31,010 --> 00:26:34,870 in a text editor, which is, you know, more than anyone would want to type. 533 00:26:35,453 --> 00:26:37,753 and we can store it all very efficiently to the point that, 534 00:26:37,825 --> 00:26:39,746 I added, a, LZ4 compression. 535 00:26:40,026 --> 00:26:40,146 So. 536 00:26:40,706 --> 00:26:44,176 In Diamond Types, I store all of the text content of what you've typed and 537 00:26:44,176 --> 00:26:47,146 then a bunch of metadata that stores all this extra CRDT stuff, essentially. 538 00:26:47,473 --> 00:26:51,613 turns out that if you LZ4, like, just use a very standard, very, very fast, low 539 00:26:51,613 --> 00:26:55,613 grade compression system on the text, then the amount of data that you save just by 540 00:26:55,613 --> 00:26:59,373 compressing the text lets you put all of that metadata in, and often you end up 541 00:26:59,373 --> 00:27:02,253 with documents that are smaller than the original text, even though you've got 542 00:27:02,588 --> 00:27:06,658 A keystroke by keystroke entire history stored in the same file, is really cool. 543 00:27:07,031 --> 00:27:09,921 so a few more decades or a few, you know, well, I guess one 544 00:27:09,921 --> 00:27:11,808 decade of work after, Google Wave. 545 00:27:12,178 --> 00:27:15,458 And we collectively as an industry have figured out how 546 00:27:15,458 --> 00:27:17,218 to solve the problem of CRDTs. 547 00:27:17,628 --> 00:27:21,518 I mean, I'm, I've had several people come and talk to me over, over the years and 548 00:27:21,518 --> 00:27:24,288 say, Seph, you could remake Google Wave. 549 00:27:24,298 --> 00:27:27,308 And I'm like, I know, and we could remake it better and greater. 550 00:27:27,898 --> 00:27:30,078 Maybe Patchwork is trying to aim towards some of that. 551 00:27:30,626 --> 00:27:32,916 but we're in a much better place, from all of that work. 552 00:27:33,166 --> 00:27:35,066 So let's come back to share. 553 00:27:35,066 --> 00:27:36,356 js in a moment. 554 00:27:36,366 --> 00:27:40,746 I want to learn more about those, various components, but maybe jumping 555 00:27:40,746 --> 00:27:45,226 ahead for a bit, what would it take today to rebuild Google Wave with 556 00:27:45,236 --> 00:27:47,166 the technology stack of your dreams? 557 00:27:47,823 --> 00:27:49,843 honestly, the biggest thing would be some funding. 558 00:27:50,046 --> 00:27:53,266 So, Google Wave used Operational Transform, and now we've 559 00:27:53,266 --> 00:27:54,576 got great CRDTs available. 560 00:27:54,586 --> 00:27:58,826 So, I would use my own implementation of CRDTs, or use Automerge or Yjs. 561 00:27:58,906 --> 00:28:00,586 I think any of those libraries work great. 562 00:28:00,876 --> 00:28:04,726 And there's a bunch more people working on that would probably perform fine. 563 00:28:05,196 --> 00:28:06,226 So, we'd use the CRDT. 564 00:28:06,294 --> 00:28:09,308 Google Wave used, it actually People forget this. 565 00:28:09,548 --> 00:28:13,568 We created a custom jabber, like XMPP extension, and the servers interoperated 566 00:28:13,568 --> 00:28:17,108 through that, which is complicated, and I probably wouldn't make that same choice. 567 00:28:17,531 --> 00:28:20,211 We'd need an identity system, if I were to do it today, and yes, 568 00:28:20,211 --> 00:28:21,161 I have been thinking about this. 569 00:28:21,411 --> 00:28:26,919 I'd consider piggybacking on the BlueSky identity system, and, since that's 570 00:28:26,919 --> 00:28:29,969 actually a federated system even though they haven't built all of the tooling 571 00:28:30,119 --> 00:28:33,203 to make it easy, but, I think it's actually an excellent system and lets 572 00:28:33,203 --> 00:28:36,446 people, one of the freedoms that that system guarantees is that if you've 573 00:28:36,456 --> 00:28:40,166 got an identity on one computer or one domain name, so identities are associated 574 00:28:40,166 --> 00:28:42,966 with a domain name, you can migrate that identity to another domain name. 575 00:28:43,171 --> 00:28:46,651 And anyone that knew your old identity will have their contact address books 576 00:28:46,651 --> 00:28:49,321 automatically update and all of your data moves across, which is great. 577 00:28:49,811 --> 00:28:52,631 So we need an identity system, maybe that, maybe something else. 578 00:28:53,003 --> 00:28:55,753 and then we need a web front end or a front end of some sort. 579 00:28:55,853 --> 00:29:00,853 And unfortunately, one of the, It's so embarrassing on behalf of our industry. 580 00:29:01,107 --> 00:29:05,263 one of the last bastions of unsolved problems is making a good rich 581 00:29:05,263 --> 00:29:06,653 text editor inside a web browser. 582 00:29:07,175 --> 00:29:11,703 in the last Like, however many years it's been, it's 2015, so I guess it's been 14 583 00:29:11,703 --> 00:29:13,853 years since Google Wave shut down in 2011. 584 00:29:14,249 --> 00:29:17,199 in all of that time, there's been multiple aborted attempts to try 585 00:29:17,199 --> 00:29:20,589 and make a web standard for being able to edit a rich text document, 586 00:29:20,899 --> 00:29:22,229 and none of them have succeeded. 587 00:29:22,259 --> 00:29:25,749 All of them have fallen apart, and, rich text editing is a massive mess. 588 00:29:25,996 --> 00:29:29,336 but there are a lot of JavaScript libraries that pave over a lot of 589 00:29:29,346 --> 00:29:30,746 the worst parts of that problem. 590 00:29:31,036 --> 00:29:35,926 maybe lingering, on the last aspect for a bit, I have deliberately tried 591 00:29:35,926 --> 00:29:41,286 to avoid rigid text editing and all facets of it, just for my own sanity 592 00:29:41,286 --> 00:29:44,637 sake, me, working primarily on. 593 00:29:44,698 --> 00:29:46,338 Overtone and LiveStore. 594 00:29:46,338 --> 00:29:51,728 Overtone is a music app where I can gloss over rich text editing for the moment. 595 00:29:51,738 --> 00:29:55,628 This is where it's rather important that your music library is in sync, 596 00:29:55,638 --> 00:29:59,768 playbacks, playback history, playback state is in sync, etc. That's where 597 00:29:59,768 --> 00:30:01,628 I'm leaning on event sourcing. 598 00:30:01,918 --> 00:30:09,279 But, Looking at rich text editing and real time collaboration on text, I'm aware of 599 00:30:09,279 --> 00:30:15,039 projects such as ProseMirror or CodeMirror as sort of the code twin project to it. 600 00:30:15,379 --> 00:30:19,957 I'm aware of the TipTap rich text editing framework. 601 00:30:20,297 --> 00:30:25,517 I'm also aware that Facebook has, I think, a pretty good one, which 602 00:30:25,517 --> 00:30:27,427 I'm blanking on the name right now. 603 00:30:27,938 --> 00:30:30,708 But yeah, where are those projects falling short? 604 00:30:30,728 --> 00:30:35,798 I mean, ideally I'm with you, this would be a web primitive that is 605 00:30:35,798 --> 00:30:39,698 like standardized and implemented by all browsers, but what's so 606 00:30:39,698 --> 00:30:43,198 hard getting there and where do the existing solutions fall short? 607 00:30:43,758 --> 00:30:46,068 honestly, they're probably mostly fine. 608 00:30:46,252 --> 00:30:50,382 They fall short in, for example, mobile editing, so I want to be able to 609 00:30:50,392 --> 00:30:52,052 have a native experience on my phone. 610 00:30:52,159 --> 00:30:55,678 if I open up Apple Notes, I can select text and I can bold it and highlight 611 00:30:55,678 --> 00:30:57,158 it and do lots of different things. 612 00:30:57,592 --> 00:31:01,855 a lot of the existing editors will, it's just really hard to hook into the native. 613 00:31:02,045 --> 00:31:04,695 Rich text editing through a web browser through mobile Safari. 614 00:31:05,135 --> 00:31:06,335 so they, they need that to work. 615 00:31:06,355 --> 00:31:08,395 And then they need it to work from Chrome with Android. 616 00:31:08,415 --> 00:31:10,805 And then they need it to work with lots of different things. 617 00:31:10,967 --> 00:31:13,088 mean I still run into problems sometimes on Reddit. 618 00:31:13,118 --> 00:31:15,828 If you use the new Reddit interface, they've got a rich text editor. 619 00:31:16,335 --> 00:31:19,995 in the reply box and sometimes I've typed and then hit backspace. 620 00:31:20,085 --> 00:31:24,935 Sorry, hit undo and weird things reappear or disappear or the wrong text, you 621 00:31:24,935 --> 00:31:27,115 know, it gets jabbled and confused. 622 00:31:27,565 --> 00:31:30,065 so there's a bunch of correctness problems like that. 623 00:31:30,075 --> 00:31:32,355 That is, it's incredibly boring work. 624 00:31:32,537 --> 00:31:34,647 but it's really important for this kind of thing. 625 00:31:35,037 --> 00:31:37,327 I have a longstanding rule. 626 00:31:37,477 --> 00:31:39,877 I don't know if this has a name, so maybe it can be Seph's rule if no 627 00:31:39,877 --> 00:31:43,647 one else has claimed it, but that essentially technology gets worse the 628 00:31:43,647 --> 00:31:47,703 further away from, mostly Bay Area software engineer problems that you are. 629 00:31:48,163 --> 00:31:52,003 So if you have the kind of problem that someone, a Bay Area technologist, 630 00:31:52,167 --> 00:31:54,900 thinks about a lot, there's going to be good libraries, good software, good 631 00:31:54,900 --> 00:31:56,210 tooling around solving that problem. 632 00:31:56,640 --> 00:31:56,960 But. 633 00:31:57,490 --> 00:32:01,300 You, for example, speak a language that where characters are typed right to left, 634 00:32:01,300 --> 00:32:02,860 instead you're gonna run into problems. 635 00:32:03,142 --> 00:32:06,110 in Australia we have roundabouts, we, you know, which the Americans call 636 00:32:06,110 --> 00:32:09,410 traffic circles and Google Maps took a decade to be able to understand how to 637 00:32:09,410 --> 00:32:12,800 actually give you navigation directions around a roundabout in Australia, because 638 00:32:12,800 --> 00:32:15,710 they don't have them in America, they, I mean they have a few, but they, most 639 00:32:15,740 --> 00:32:16,970 Americans I know are terrified of them. 640 00:32:17,443 --> 00:32:20,413 but I feel like Rich text editing is one of these problems because us software 641 00:32:20,413 --> 00:32:21,973 engineers mostly use plain text. 642 00:32:22,273 --> 00:32:22,483 So. 643 00:32:23,013 --> 00:32:27,133 There are so many great plain text editors that exist both on the web and on desktop. 644 00:32:27,260 --> 00:32:28,470 but yeah, rich text is just harder. 645 00:32:28,570 --> 00:32:30,560 It's further away from the problems that we regularly solve. 646 00:32:31,151 --> 00:32:32,221 I fully agree. 647 00:32:32,270 --> 00:32:34,203 And I love Steph's rule. 648 00:32:34,267 --> 00:32:36,107 maybe that it's going to become a thing. 649 00:32:36,527 --> 00:32:41,457 and so in particular to you touching on mobile, I feel like mobile and 650 00:32:41,467 --> 00:32:45,620 the combination of mobile and web, that is indeed like one of the 651 00:32:45,620 --> 00:32:51,060 hardest modes that are still, largely untamed, and this is both I think 652 00:32:51,280 --> 00:32:55,749 particularly for web technologies, but, overall, it is just a, it had 653 00:32:55,749 --> 00:32:58,717 less time to kind of mature over time. 654 00:32:59,352 --> 00:33:03,572 And particularly for web mobile experiences, when, when it comes 655 00:33:03,572 --> 00:33:07,332 to text editing, et cetera, like dragging around a cursor, this 656 00:33:07,332 --> 00:33:09,152 is where things feel very choppy. 657 00:33:09,242 --> 00:33:14,755 The, creator of React, Jordan Walk, He shares some, some things about that 658 00:33:14,795 --> 00:33:19,305 once in a while, where he's kind of particularly pointing out where mobile 659 00:33:19,305 --> 00:33:26,092 web is falling short, to be competitive with mobile native in terms of animations 660 00:33:26,112 --> 00:33:28,462 and like, just, native interactions. 661 00:33:28,608 --> 00:33:32,228 I mean, it's a very hard set of problems, but I think. 662 00:33:32,593 --> 00:33:37,540 Addressing those feels very worthwhile to make the web even a richer platform. 663 00:33:37,560 --> 00:33:42,370 But then you could also argue that sort of not necessarily in the interest of Apple. 664 00:33:42,780 --> 00:33:45,113 And that's a whole different, kind of worms. 665 00:33:45,793 --> 00:33:49,143 I mean, yeah, it's easiest to think of Apple as a person, but they're 666 00:33:49,143 --> 00:33:52,493 actually, I can't remember what the 200, 000 people or something. 667 00:33:52,533 --> 00:33:54,840 And some of those people are really interested in, in open 668 00:33:54,840 --> 00:33:55,540 standards and some aren't. 669 00:33:55,810 --> 00:33:57,800 And some of them are great people and some of them are assholes. 670 00:33:58,180 --> 00:34:00,260 And that's true of every company that you could name, you know 671 00:34:00,370 --> 00:34:00,870 I agree. 672 00:34:01,020 --> 00:34:04,780 And in apple's credits they have push safari and the capabilities 673 00:34:04,790 --> 00:34:08,740 way forward over the last couple of years It's really has come a long way 674 00:34:09,140 --> 00:34:12,190 Yeah, I think the safari team is very dedicated to making safari an 675 00:34:12,190 --> 00:34:16,190 excellent web browser and it shows but there's still some hard problems 676 00:34:16,220 --> 00:34:17,400 that haven't been tackled yet. 677 00:34:17,477 --> 00:34:20,503 it's quite sad when I was young I started programming when I was about 10 years 678 00:34:20,503 --> 00:34:24,948 old and Every year there would be new things and new technology and, you know, 679 00:34:25,018 --> 00:34:29,638 like I got to see the birth of Windows 95 and, I thought, wow, programming 680 00:34:29,638 --> 00:34:31,088 is going to be so easy in the future. 681 00:34:31,178 --> 00:34:35,658 You know, like I imagine that right at the time there was whole teams of people 682 00:34:35,658 --> 00:34:38,508 working on making something, but in the future, there'd be such good libraries 683 00:34:38,528 --> 00:34:42,008 and such good software tools available that one person could do the work of an 684 00:34:42,008 --> 00:34:46,270 entire team or entire you know, of a whole project because you could just grab in 685 00:34:46,270 --> 00:34:49,330 such good software and there'd be such good primitives available to be able 686 00:34:49,330 --> 00:34:50,440 to solve all the problems that you had. 687 00:34:50,850 --> 00:34:54,020 And I feel like that prediction of young me. 688 00:34:54,060 --> 00:34:55,180 I'm so sad. 689 00:34:55,180 --> 00:34:57,820 I'm disappointed that it didn't come to pass. 690 00:34:58,040 --> 00:35:01,310 And instead we have, you know, it's like, Oh, back then, if you wanted to build a 691 00:35:01,310 --> 00:35:03,020 program, you want to write some software. 692 00:35:03,270 --> 00:35:05,680 Well, I mean, like, I'm so sorry to everybody else, but. 693 00:35:05,865 --> 00:35:09,085 I would have just targeted Windows, you know, written a Windows application 694 00:35:09,085 --> 00:35:12,395 and there it is, and, you know, made some little command line tool in 695 00:35:12,405 --> 00:35:15,225 DOS or, you know, if you want to, if you're working in Linux, you would just 696 00:35:15,295 --> 00:35:18,725 make a command line tool because that was how most good software existed. 697 00:35:19,025 --> 00:35:22,255 But now it's like, oh, well, you know, I guess you're going to want 698 00:35:22,285 --> 00:35:26,073 a Linux and Windows and., Mac Os desktop version of your application. 699 00:35:26,223 --> 00:35:28,713 And then you need to make it work for iOS and Android as well. 700 00:35:28,713 --> 00:35:31,953 So there's five different platforms right outta the gate and, you know, are you even 701 00:35:31,953 --> 00:35:35,457 trying, if it doesn't work on all five of those platforms, and it should work well. 702 00:35:35,517 --> 00:35:38,397 But I guess you could just use the web, but the web's not actually very good 703 00:35:38,397 --> 00:35:40,257 on, on, you know, on mobile platforms. 704 00:35:40,527 --> 00:35:43,300 So you really want to have a, native application. 705 00:35:43,540 --> 00:35:45,340 Oh, but all the programming languages that you use. 706 00:35:45,645 --> 00:35:48,905 For building native applications on iOS are different from Android, different from 707 00:35:48,905 --> 00:35:50,975 the web, different from everything else. 708 00:35:51,035 --> 00:35:54,295 And, you know, and we keep on saying, well, we can kind of solve this with 709 00:35:54,295 --> 00:35:57,845 WebAssembly, for example, and that way we can have one, you know, target from 710 00:35:57,845 --> 00:35:59,345 all of these different bits of software. 711 00:35:59,375 --> 00:36:00,875 And, and that's true. 712 00:36:01,380 --> 00:36:05,470 If we had good UX libraries across every platform, which were consistent and 713 00:36:05,470 --> 00:36:07,320 work well, I mean, this is somewhere. 714 00:36:07,400 --> 00:36:10,500 I'm very, I was very excited about react native when it first came out. 715 00:36:10,500 --> 00:36:13,830 And so many people were kind of like some random thing. 716 00:36:13,840 --> 00:36:15,350 I was like, please, please. 717 00:36:15,390 --> 00:36:20,750 I really want just one good, you know, application programming interface I can 718 00:36:20,850 --> 00:36:23,110 use to build real software for real users. 719 00:36:23,537 --> 00:36:26,937 it feels like a tragedy, a tragedy of the commons problem in my mind that there's 720 00:36:26,937 --> 00:36:28,747 so many companies doing really good work. 721 00:36:29,347 --> 00:36:32,447 But each company, of course, is trying to solve the problem that their 722 00:36:32,447 --> 00:36:34,297 particular company will make money from. 723 00:36:34,597 --> 00:36:39,447 And there are the commons in software, the commons of the standard set of desktop 724 00:36:39,447 --> 00:36:41,857 applications, of user interface libraries. 725 00:36:42,097 --> 00:36:44,367 Say, if I wanted to write a desktop application in Rust. 726 00:36:44,698 --> 00:36:48,258 there's open source libraries which will interact from Rust to GTK and 727 00:36:48,258 --> 00:36:52,278 Rust from, to the Windows libraries and so on, but almost all of them 728 00:36:52,278 --> 00:36:53,448 are maintained by volunteers. 729 00:36:53,808 --> 00:36:57,248 And it's a huge problem, like Google Chrome has probably had a billion dollars 730 00:36:57,268 --> 00:36:58,738 of investment put into it at this point. 731 00:36:58,983 --> 00:37:01,885 to be able to have a web browser that works across every platform and let 732 00:37:01,885 --> 00:37:05,775 you be able to run arbitrary software, like arbitrary web software across 733 00:37:05,775 --> 00:37:07,075 all the platforms Google Chrome runs. 734 00:37:07,512 --> 00:37:10,782 and it might take something around that order of magnitude to have a 735 00:37:10,782 --> 00:37:12,532 really good user interface library. 736 00:37:12,727 --> 00:37:16,427 That works across every platform that exists today so that I can just build, 737 00:37:16,497 --> 00:37:20,377 like, write once, run everywhere, you know, like, write software once, write 738 00:37:20,377 --> 00:37:23,832 Patchwork, write something like that, and then just have Good primitives that mean 739 00:37:23,832 --> 00:37:27,432 that my program can work in every context that I want it to run, but as far as I can 740 00:37:27,432 --> 00:37:30,632 tell, no one's really putting that time and effort and investment in, you know, 741 00:37:30,682 --> 00:37:33,822 like, there's, there's things like Flutter and I'm very excited by them, but I've 742 00:37:33,942 --> 00:37:37,778 burned by Google projects being canceled before, but it just feels like one of 743 00:37:37,778 --> 00:37:38,968 these things that like, I want that. 744 00:37:38,988 --> 00:37:42,243 And then, and then on the flip side of that, we've got, things like, 745 00:37:42,313 --> 00:37:45,993 SQL, which I have massive problems with, even though it's one of the 746 00:37:45,993 --> 00:37:49,333 most, one of the best, like think programs like Postgres are some of the 747 00:37:49,333 --> 00:37:52,623 highest quality software that exists today that we can, we use regularly. 748 00:37:52,933 --> 00:37:55,783 And yet its design is from the seventies. 749 00:37:55,917 --> 00:37:58,743 there's a wonderful talk by Rich Hickey, where he talks about, 750 00:37:58,947 --> 00:38:01,887 value oriented programming and place oriented programming. 751 00:38:02,287 --> 00:38:03,077 And he says that. 752 00:38:03,412 --> 00:38:05,282 Back in the day, we didn't have much memory. 753 00:38:05,302 --> 00:38:08,748 Our computers had literally like, Some of the old Atari's and Nintendo 754 00:38:08,968 --> 00:38:12,698 Entertainment System has less RAM than is available in one tweet. 755 00:38:12,768 --> 00:38:14,138 You know, before they made tweets longer. 756 00:38:14,438 --> 00:38:16,598 It had like, it's like a hundred and twenty bytes of 757 00:38:16,598 --> 00:38:17,748 RAM or something ridiculous. 758 00:38:17,768 --> 00:38:20,988 And they made Super Mario Brothers with these wild limitations. 759 00:38:21,398 --> 00:38:24,478 And so it makes sense, if you're storing data, that every time the value 760 00:38:24,478 --> 00:38:28,358 changes you want to Replace, you have one place where the value goes and you 761 00:38:28,358 --> 00:38:29,818 replace the value that's stored there. 762 00:38:30,238 --> 00:38:34,618 And now SQL is stuck in the past where we've got a table and we just 763 00:38:34,648 --> 00:38:37,198 edit the rows and you've got no idea of what's actually changed. 764 00:38:37,468 --> 00:38:39,898 And that makes it incredibly difficult to build collaborative software because 765 00:38:40,208 --> 00:38:41,608 You need to know that kind of history. 766 00:38:41,868 --> 00:38:45,378 So people maybe layer collaborative things on top of Postgres, but then 767 00:38:45,378 --> 00:38:48,548 now Postgres, you're sort of fighting against the ergonomics of Postgres itself. 768 00:38:48,918 --> 00:38:50,428 And again, no one's solving this problem. 769 00:38:50,518 --> 00:38:51,848 And it really upsets me. 770 00:38:52,148 --> 00:38:54,758 Oh man, I have so many thoughts on this. 771 00:38:54,788 --> 00:38:59,490 I 100 percent agree with like that assessment of like the tragedy of the 772 00:38:59,490 --> 00:39:05,890 commons and I'm both devastated about it and also hopeful because of some of 773 00:39:05,890 --> 00:39:08,163 the initiatives that you've mentioned. 774 00:39:08,483 --> 00:39:14,410 the TLDR of it is that I still think that the web is the best vehicle for us 775 00:39:14,440 --> 00:39:16,913 to, make it through this uncanny valley. 776 00:39:17,203 --> 00:39:22,223 Since I think if you exclude some aspects, for example, mobile web or some, 777 00:39:22,233 --> 00:39:27,393 some other, or browser, strict browser compatibility to a certain limit, Firefox 778 00:39:27,393 --> 00:39:29,350 is lagging behind in a bunch of things. 779 00:39:29,750 --> 00:39:32,140 You can actually already live in the future. 780 00:39:32,420 --> 00:39:37,123 By building fully for the web, things like WebAssembly have come a long way. 781 00:39:37,347 --> 00:39:39,237 things like WebGPU, et cetera. 782 00:39:39,237 --> 00:39:42,597 And there's also new frameworks that are in the making, but not as 783 00:39:42,597 --> 00:39:45,127 mainstream yet that fully embrace those. 784 00:39:45,557 --> 00:39:49,187 So where some lower level primitives could be taking 785 00:39:49,187 --> 00:39:51,627 advantage of WebAssembly or WebGPU. 786 00:39:52,023 --> 00:39:56,740 the thing that's, commonly strikes me is like the most comical unsolved 787 00:39:56,770 --> 00:40:03,866 problems is list rendering, where we have so many React list virtualization 788 00:40:03,866 --> 00:40:08,210 libraries, and most of them still suffer from the same underlying problems. 789 00:40:08,210 --> 00:40:13,790 And whenever you render a list, like some symptoms that appear typically 790 00:40:13,820 --> 00:40:15,390 comes along with frame drops. 791 00:40:16,140 --> 00:40:21,760 But also like, it's rare that, you persist the position of a list and 792 00:40:21,808 --> 00:40:27,060 there's just like, if you start digging into, lists as unsolved problems, 793 00:40:27,260 --> 00:40:31,737 it becomes very comical, but the way how I, try to address that for 794 00:40:31,737 --> 00:40:35,147 myself is by rendering to a canvas. 795 00:40:35,147 --> 00:40:40,097 And that's a whole different approach altogether. 796 00:40:40,097 --> 00:40:42,797 We don't need to go into that, into that rabbit hole. 797 00:40:43,292 --> 00:40:47,108 But yeah, I'm, hopeful that things are coming along. 798 00:40:47,108 --> 00:40:49,188 And you've also been mentioning React Native. 799 00:40:49,218 --> 00:40:51,998 That has, that's a long, long, long project. 800 00:40:52,408 --> 00:40:58,218 And in a way I have so much admiration and respect for the people who 801 00:40:58,588 --> 00:41:01,578 relentlessly keep pushing forward on that. 802 00:41:01,828 --> 00:41:03,278 There's been some really big. 803 00:41:03,620 --> 00:41:07,600 breakthroughs over the last couple of years, some of them you would think 804 00:41:07,630 --> 00:41:09,490 like, wait, that's kind of obvious. 805 00:41:09,510 --> 00:41:11,180 Why wasn't it like that from the beginning? 806 00:41:11,530 --> 00:41:14,920 But there, there are reasons for that, but it's really getting there. 807 00:41:14,950 --> 00:41:20,043 And, particularly for mobile, it is like, it's becoming a really 808 00:41:20,043 --> 00:41:22,873 attractive, platform to, to ship things. 809 00:41:23,323 --> 00:41:28,607 And this is where you can, at least when your goal is at least code reuse. 810 00:41:29,023 --> 00:41:33,353 then you can get a long way if you target React and React Native. 811 00:41:33,863 --> 00:41:38,350 We're not yet at that point where you have the same set of like interactive 812 00:41:38,380 --> 00:41:43,563 components and they work in all platforms, no matter what, maybe at some point, 813 00:41:43,813 --> 00:41:45,673 but there's progress in that direction. 814 00:41:46,140 --> 00:41:48,850 yeah, I mean, while we're at it, I'm just going to throw out some more 815 00:41:48,850 --> 00:41:50,480 things that I hope other people fix. 816 00:41:50,720 --> 00:41:53,290 Well, someone fixes like it, it might end up being me. 817 00:41:53,373 --> 00:41:58,233 I was saying earlier that, if I could live a thousand lives, I would just spend a lot 818 00:41:58,233 --> 00:42:02,813 of them rewriting bit by bit every piece of software that runs on my computer. 819 00:42:03,063 --> 00:42:05,663 So everything actually works well and consistently. 820 00:42:06,112 --> 00:42:09,372 I've been building a little helper tool web app just for the last couple days 821 00:42:09,382 --> 00:42:13,568 to be able to, annotate documents, to be able to, it doesn't really matter, 822 00:42:13,608 --> 00:42:14,858 it's some little helper web app. 823 00:42:15,148 --> 00:42:18,418 And once again, I'm frustrated because I have a server, and my server has 824 00:42:18,418 --> 00:42:21,318 some data, and I've got a frontend, and my frontend needs to edit that 825 00:42:21,318 --> 00:42:24,738 data, and as I change the data, the changes need to be propagated to 826 00:42:24,738 --> 00:42:27,278 the server, and the server keeps a copy of it, which it stores on disk. 827 00:42:27,778 --> 00:42:30,648 And that problem, I feel like every single time I try and approach 828 00:42:30,648 --> 00:42:33,818 it, I have to re implement the wheel and I start from scratch. 829 00:42:34,428 --> 00:42:38,488 And it's not even this data that I'm editing isn't even collaborative. 830 00:42:38,628 --> 00:42:39,918 It's just like, okay, great. 831 00:42:40,128 --> 00:42:43,378 You know, let's start climbing the ladder of editing once again. 832 00:42:43,388 --> 00:42:46,628 So the first step, you know, I've got one object and I send 833 00:42:46,628 --> 00:42:48,938 it to the browser and the browser sends back an entire copy of it. 834 00:42:49,298 --> 00:42:49,888 Next run. 835 00:42:49,928 --> 00:42:50,228 Okay. 836 00:42:50,228 --> 00:42:53,098 The server can do versioning where the browser can subscribe, 837 00:42:53,118 --> 00:42:55,418 it can get a certain version and find out what version it is. 838 00:42:55,728 --> 00:42:59,613 Next run, Now I can subscribe to the browser, can subscribe from some version 839 00:42:59,613 --> 00:43:02,583 every time a new version gets sent, the server sends a new copy of the data. 840 00:43:02,823 --> 00:43:04,783 Okay, then now I can do differential updates. 841 00:43:05,013 --> 00:43:08,013 Now I can do collaboratively editing on top of the differential updates. 842 00:43:08,253 --> 00:43:11,713 Okay, now I can do like, you know, anyway, it's just a series of things over 843 00:43:11,713 --> 00:43:14,383 and over and over again, every single piece of software I end up writing. 844 00:43:14,613 --> 00:43:17,653 And most of the time I'll cap out somewhere pretty low down that ladder, 845 00:43:17,903 --> 00:43:21,123 even though I'm probably one of the, you know, like, I know all of the 846 00:43:21,123 --> 00:43:23,423 tools, I know all of the ways that we can make this problem be good, 847 00:43:23,743 --> 00:43:25,063 but our platform isn't very good. 848 00:43:25,430 --> 00:43:28,576 And I think a lot of the problem with that is because like we still think 849 00:43:28,586 --> 00:43:31,696 in most software about messaging, it's a message oriented system, 850 00:43:32,646 --> 00:43:35,276 how we actually want to think for a lot of this isn't about messages. 851 00:43:35,329 --> 00:43:36,479 it's about updates. 852 00:43:36,519 --> 00:43:39,349 it's, I've got some semantic idea of the state of the world. 853 00:43:39,649 --> 00:43:43,049 And instead of sending messages to the client, which is kind of a low 854 00:43:43,049 --> 00:43:46,099 level primitive, I instead want to be sending updates and describing how 855 00:43:46,099 --> 00:43:47,369 the document has changed over time. 856 00:43:47,692 --> 00:43:50,254 I was working with the, braid group, trying to build. 857 00:43:50,494 --> 00:43:54,774 So we together wrote a proposal for the IETF on a primitive that we could 858 00:43:54,784 --> 00:43:58,824 add that's different from get and put and post and so on, but a different 859 00:43:58,824 --> 00:44:02,124 verb, which would be a subscribe verb, to say if there's some resource 860 00:44:02,124 --> 00:44:06,304 that lives at some URL, I want that resource to be able to change over time. 861 00:44:06,704 --> 00:44:08,924 And I don't want to have to re implant the wheel, reinvent the 862 00:44:08,924 --> 00:44:11,464 wheel every single time, describing how that resource changes. 863 00:44:11,934 --> 00:44:14,764 In fact, it would be great if the web, like HTTP itself, had a 864 00:44:14,764 --> 00:44:17,004 primitive that described a resource that could change over time. 865 00:44:17,304 --> 00:44:20,954 And then, for example, NGINX, if NGINX understood that that was something that 866 00:44:20,954 --> 00:44:24,964 changed over time, instead of NGINX storing some cache invalidation time 867 00:44:24,964 --> 00:44:28,624 and then occasionally revalidating its cache, but in the meantime it's serving 868 00:44:28,624 --> 00:44:30,199 out stale copies of this resource. 869 00:44:30,699 --> 00:44:34,619 Instead, NGINX could just subscribe to the underlying layer and say, Hey, I 870 00:44:34,619 --> 00:44:37,039 want, I'm interested in this document and tell me every time it changes. 871 00:44:37,309 --> 00:44:40,509 And then NGINX can be doing fan out to all the different clients that is interested 872 00:44:40,509 --> 00:44:41,599 in subscribing to that document. 873 00:44:42,029 --> 00:44:44,309 And you'd have a much better, much more performant way of being 874 00:44:44,309 --> 00:44:45,519 able to distribute data around. 875 00:44:45,849 --> 00:44:50,229 That is way easier to program, way faster from a performance perspective. 876 00:44:50,519 --> 00:44:52,229 And then it could be integrated into lots of things. 877 00:44:52,229 --> 00:44:54,739 Like integrated into Postgres, integrated as a standard thing that 878 00:44:54,739 --> 00:44:55,939 we have access to in our web servers. 879 00:44:56,229 --> 00:44:58,389 Something we have access to in our web browsers and so on. 880 00:44:59,039 --> 00:45:01,529 And it's primitives like this in my mind that, you know, like, 881 00:45:01,549 --> 00:45:03,039 I'm like, Oh, please, please. 882 00:45:03,544 --> 00:45:04,674 Give me better things like this. 883 00:45:04,944 --> 00:45:07,354 This is the kind of thing that I feel like all computing, again, 884 00:45:07,544 --> 00:45:08,904 it's that lesson from Google Wave. 885 00:45:09,224 --> 00:45:10,894 All computing can work like this. 886 00:45:10,924 --> 00:45:12,764 You can just have the data update in real time. 887 00:45:12,844 --> 00:45:16,014 And this is a primitive that almost every program I've ever worked on 888 00:45:16,014 --> 00:45:19,844 is needed in some form of, you know, In a web browser, in a mobile phone, 889 00:45:19,909 --> 00:45:21,167 in some monitoring application. 890 00:45:21,407 --> 00:45:24,317 I have some data that lives somewhere and I want my application to be kept 891 00:45:24,317 --> 00:45:27,347 up to date and told whenever changes happen, and then I wanna be able to 892 00:45:27,347 --> 00:45:30,107 edit that data from different clients and have something sensible happen. 893 00:45:30,517 --> 00:45:33,077 And there's a simple version of that, which is a centralized 894 00:45:33,077 --> 00:45:36,691 version where a centralized server like has to authorize all changes. 895 00:45:36,901 --> 00:45:39,241 And you have a version number that goes up by one every time a change 896 00:45:39,241 --> 00:45:42,001 happens, which we should be able to just trivially have built into 897 00:45:42,001 --> 00:45:43,771 Postgres, in my mind, in SQL databases. 898 00:45:44,241 --> 00:45:47,091 And then there's the CRDT, the real time collaborative editing use case 899 00:45:47,091 --> 00:45:49,901 for that where I don't actually want a single version number, I 900 00:45:49,901 --> 00:45:50,991 want something kind of like Git. 901 00:45:51,271 --> 00:45:53,981 but where I can collaboratively edit any kind of data and I can do it in 902 00:45:53,981 --> 00:45:56,401 real time rather than needing to hit commit every time I make a change. 903 00:45:56,591 --> 00:45:57,321 I want to push that out. 904 00:45:57,701 --> 00:46:00,551 and hopefully as well, I want to be able to do optimistic replication, 905 00:46:00,551 --> 00:46:01,961 optimistic concurrency control. 906 00:46:02,301 --> 00:46:06,161 So the Ink & Switch team is working on this, and having branches and so on 907 00:46:06,161 --> 00:46:07,691 for other kinds of applications, right? 908 00:46:07,971 --> 00:46:09,441 Again, it's, it's my rule. 909 00:46:09,441 --> 00:46:10,811 It's the, it's like. 910 00:46:11,316 --> 00:46:13,976 We've built these tools for ourselves for code editing where 911 00:46:13,976 --> 00:46:15,646 we get to collaborate using Git. 912 00:46:15,836 --> 00:46:18,856 We get to have branches, we get to do merging, we get to look at 913 00:46:18,856 --> 00:46:19,976 all the diffs between versions. 914 00:46:20,336 --> 00:46:21,726 Everybody wants these tools. 915 00:46:21,816 --> 00:46:22,256 Everyone. 916 00:46:22,686 --> 00:46:25,936 You know, from people working on CRMs to people doing video editing to 917 00:46:26,236 --> 00:46:29,956 people, you know, I'm sure running, like wanting to talk to astronauts 918 00:46:29,956 --> 00:46:32,129 in space, this comes up all the time. 919 00:46:32,169 --> 00:46:35,199 And for those kind of people, for these projects that want to build using these 920 00:46:35,199 --> 00:46:38,509 kind of primitives, it's so hard to have, like, we just, our primitives 921 00:46:38,519 --> 00:46:40,724 on modern software aren't there and. 922 00:46:41,344 --> 00:46:43,474 No one like application teams aren't working on it because 923 00:46:43,474 --> 00:46:44,364 they've got products to ship 924 00:46:44,461 --> 00:46:49,241 so I've had a couple of folks Who are working on that on the podcast before so 925 00:46:49,241 --> 00:46:53,987 for example notably the folks working at Electric They're tackling specifically 926 00:46:53,987 --> 00:46:59,257 that problem for Postgres were exactly as you're describing that you can subscribe 927 00:46:59,257 --> 00:47:03,747 to or like you're you can basically just Express something they call a shape. 928 00:47:03,747 --> 00:47:07,697 It's sort of like we can oversimplify and it's like sort of a scoped query. 929 00:47:07,977 --> 00:47:12,571 And then your client can subscribe to the result of those queries. 930 00:47:12,631 --> 00:47:16,122 And it basically always gets an up to date query result locally. 931 00:47:16,162 --> 00:47:20,852 Well, eventually consistent, but you already get those sort of one level 932 00:47:20,852 --> 00:47:25,452 up primitive, where you don't need to think about get, propose, delete, 933 00:47:25,822 --> 00:47:27,922 but you can just, subscribe to that. 934 00:47:28,292 --> 00:47:33,182 well, it comes with its own challenges and if you're looking at the fundamental 935 00:47:33,202 --> 00:47:37,162 layer, that you describe as message oriented, I think that's closer 936 00:47:37,202 --> 00:47:40,702 to the metal and where you need to roll up your sleeves more, but it 937 00:47:40,702 --> 00:47:44,520 also allows you to implement things for different trade offs in mind. 938 00:47:44,520 --> 00:47:48,247 So one thing I'm, curious about how you're navigating trade 939 00:47:48,247 --> 00:47:49,947 offs when it comes to, to data. 940 00:47:49,977 --> 00:47:53,767 It's all about trade offs, like what for a given application, 941 00:47:53,767 --> 00:47:54,967 what can you get away with? 942 00:47:55,297 --> 00:48:00,443 How much is fine that different parts of the application stage do they need 943 00:48:00,463 --> 00:48:04,393 to be fully transactional or is it fine that one part of the application 944 00:48:04,803 --> 00:48:09,343 Is maybe lagging slightly behind, and how do you address the cap theorem 945 00:48:09,343 --> 00:48:11,243 for your particular application? 946 00:48:11,613 --> 00:48:15,973 So I'm curious how you're thinking about navigating trade offs and 947 00:48:15,983 --> 00:48:19,433 like trade offs even go to a point, not just to build the initial app. 948 00:48:19,823 --> 00:48:25,503 But also to keep in mind how you need to evolve the app over time, how certain 949 00:48:25,553 --> 00:48:29,663 are you about the data model that you've picked that this is the one you still 950 00:48:29,683 --> 00:48:33,063 have, like in five years, you're going to have it in five years, probably 951 00:48:33,063 --> 00:48:36,833 no matter what, but the question is, are you still happy with it in five 952 00:48:36,833 --> 00:48:42,315 years or, is this the worst decision you've made building the application. 953 00:48:42,315 --> 00:48:45,728 So I'm curious how you're thinking about navigating trade offs when 954 00:48:45,728 --> 00:48:48,608 you design an application, the data layer for an application. 955 00:48:48,935 --> 00:48:52,805 I mean, fundamentally as engineers, you navigate them one by one, you 956 00:48:52,805 --> 00:48:54,765 know, while sweating profusely. 957 00:48:55,085 --> 00:48:56,245 That's how that goes, I think. 958 00:48:56,535 --> 00:48:58,955 yeah, I feel like there's, there's a bunch of interesting problems in 959 00:48:58,955 --> 00:48:59,905 all of the things that you've said. 960 00:49:00,327 --> 00:49:04,392 I had a few, couple small conversations with PVH, talking about, he built this 961 00:49:04,392 --> 00:49:09,087 thing based around lenses of, of how data can evolve over time in a Cambria. 962 00:49:09,107 --> 00:49:09,457 That was it. 963 00:49:09,487 --> 00:49:09,807 Yeah. 964 00:49:10,107 --> 00:49:11,247 Um, in local-first software. 965 00:49:11,537 --> 00:49:13,597 And I have a bunch of my own thoughts about that. 966 00:49:13,637 --> 00:49:16,947 And you know, like I've got designs in mind that I'd love 967 00:49:16,947 --> 00:49:17,997 to experiment and play with. 968 00:49:18,347 --> 00:49:21,477 So there's something there, which is, you know, like it's really interesting. 969 00:49:21,517 --> 00:49:24,341 HTML, has evolved beautifully over time. 970 00:49:24,491 --> 00:49:27,971 Like HTML has barely changed at all since it was first introduced. 971 00:49:28,381 --> 00:49:30,861 like we've introduced new tags, but almost like all of the 972 00:49:30,861 --> 00:49:32,041 tags still follow the same. 973 00:49:32,381 --> 00:49:35,651 Fundamentally XML style structure, and that's wonderful. 974 00:49:36,091 --> 00:49:36,591 It's wonderful. 975 00:49:36,591 --> 00:49:37,691 It's been able to evolve like that. 976 00:49:38,271 --> 00:49:41,131 Email has evolved slightly less gracefully, but emails. 977 00:49:41,211 --> 00:49:44,541 I think email up email programs from the 70s probably still work 978 00:49:44,541 --> 00:49:47,761 today with most modern emails, which is incredible, even though. 979 00:49:48,471 --> 00:49:51,001 Email messages themselves are almost impossible to pass correctly. 980 00:49:51,001 --> 00:49:53,147 And, I've got a lot of thoughts about that as well. 981 00:49:53,371 --> 00:49:55,991 I've got some friends who work at FastMail and they've, pinned me to the 982 00:49:55,991 --> 00:49:59,281 wall with things about email that I had no idea about that are horrific. 983 00:49:59,741 --> 00:50:02,611 but there's this open problem, which is how can data models change. 984 00:50:02,701 --> 00:50:05,087 So there's a, set of problems there, which I'd love to solve. 985 00:50:05,577 --> 00:50:09,001 There's a set of problems around, how is our data stored and sent. 986 00:50:09,357 --> 00:50:11,387 in my mind, what I would really like to have is. 987 00:50:11,867 --> 00:50:16,467 I feel like there's some kinds of programs where I actually really You know, I'm so 988 00:50:16,467 --> 00:50:18,817 sorry to the Ink and Switch folks, I'm quite happy for there to be a centralized 989 00:50:18,818 --> 00:50:20,517 server for Discord, or for IRC. 990 00:50:20,767 --> 00:50:23,807 For something like that, when there's a place that we all go to, I'm quite 991 00:50:23,817 --> 00:50:26,857 happy for there to be one computer that's authoritative and decides, you 992 00:50:26,857 --> 00:50:30,047 know, all of the messages that are and aren't part of the log of messages. 993 00:50:30,857 --> 00:50:32,007 I feel the same way about banks. 994 00:50:32,227 --> 00:50:34,777 I'm more than happy for them to use a centralized transactional database. 995 00:50:35,034 --> 00:50:36,984 I'm not a Bitcoin absolutist by any means. 996 00:50:37,274 --> 00:50:38,964 I think decentralized databases work great. 997 00:50:39,377 --> 00:50:41,917 but I'd really like some set of primitives where, The primitives that 998 00:50:41,917 --> 00:50:45,561 I use in my computer program, like what I embed into my program and use, are 999 00:50:45,561 --> 00:50:48,351 the same set of primitives that I could use either with a centralized server, 1000 00:50:48,421 --> 00:50:51,801 which has transactions and various other ergonomics, or with something 1001 00:50:51,801 --> 00:50:56,027 like Automerge or Yjs, where, I'm actually collaboratively editing a CRDT. 1002 00:50:56,028 --> 00:50:59,346 And I feel like there's a lot of overlap there around what's the shape of the data. 1003 00:50:59,876 --> 00:51:00,926 What does the change look like? 1004 00:51:01,006 --> 00:51:03,696 You know, subscriptions, which also you almost always want 1005 00:51:03,716 --> 00:51:04,766 in a centralized use case. 1006 00:51:05,196 --> 00:51:07,966 and then there's a bunch of questions around performance. 1007 00:51:08,146 --> 00:51:11,624 so I wrote a CRDT library of my own called Diamond Types I haven't kept up with all 1008 00:51:11,624 --> 00:51:13,284 of the demands that I've made of myself. 1009 00:51:13,595 --> 00:51:15,164 busy and distracted, but I use that. 1010 00:51:15,174 --> 00:51:18,264 That was the test bed in original place where I built Eg-walker, 1011 00:51:18,284 --> 00:51:20,528 which is an algorithm that I've written a paper on, which is just 1012 00:51:20,528 --> 00:51:21,478 for collaborative text editing. 1013 00:51:21,732 --> 00:51:23,312 and I wanted to make it really, really fast. 1014 00:51:23,502 --> 00:51:26,322 And people kept saying, well, but don't you know that if you 1015 00:51:26,352 --> 00:51:29,142 collaboratively edit a text document in something like Yjs or Automerge, 1016 00:51:29,432 --> 00:51:32,262 it stores every single keystroke that's ever made to the document. 1017 00:51:32,572 --> 00:51:35,182 And these documents are going to get huge, and we need some way to be able to 1018 00:51:35,182 --> 00:51:36,972 prune history, and it's really important. 1019 00:51:37,522 --> 00:51:40,862 So I said, well, Look, that might, I agree, I think that's a very 1020 00:51:40,862 --> 00:51:42,112 interesting and important problem. 1021 00:51:42,142 --> 00:51:45,192 But let's first start, let's just start by trying to make it as fast 1022 00:51:45,192 --> 00:51:46,622 as possible and as small as possible. 1023 00:51:46,912 --> 00:51:49,262 So, you know, even if we prune it, it's going to be pruned 1024 00:51:49,262 --> 00:51:50,422 to be even smaller regardless. 1025 00:51:50,626 --> 00:51:54,406 this is always when I do a lot of performance work and people, a lot of 1026 00:51:54,556 --> 00:51:56,289 times people reach for multi threading. 1027 00:51:56,349 --> 00:51:59,909 Let's, let's spawn it across lots of threads on your computer, which is a fine 1028 00:51:59,909 --> 00:52:02,729 approach, but It's almost always better to start with trying to make it run as 1029 00:52:02,729 --> 00:52:04,809 fast as you can on one thread before you run it across multiple threads. 1030 00:52:04,809 --> 00:52:08,899 I mean, this is why the M1 series of, of Apple was like such a big 1031 00:52:08,899 --> 00:52:12,889 deal because it showed like, okay, we can actually do a lot better even 1032 00:52:12,889 --> 00:52:14,339 in a single threaded environment. 1033 00:52:15,079 --> 00:52:15,659 Exactly. 1034 00:52:15,689 --> 00:52:19,707 Yeah, but It turns out that, the collaboratively editable text documents 1035 00:52:19,707 --> 00:52:20,927 don't actually grow very fast. 1036 00:52:21,002 --> 00:52:23,121 the amount of data, the number of bytes on disk is tiny. 1037 00:52:23,421 --> 00:52:25,851 And, and yeah, like I think that it might be useful to 1038 00:52:25,901 --> 00:52:27,181 build software to prune anyway. 1039 00:52:27,181 --> 00:52:29,631 And I've got a bunch of, you know, like I've thought a lot about that problem 1040 00:52:29,631 --> 00:52:30,771 because people keep talking about it. 1041 00:52:30,837 --> 00:52:33,117 but from an engineering perspective, a lot of the time we can just keep all 1042 00:52:33,117 --> 00:52:34,687 of the data and it's actually fine. 1043 00:52:34,917 --> 00:52:37,627 We just need to, for example, store it in some slightly more efficient 1044 00:52:37,627 --> 00:52:38,647 way sometimes than raw JSON. 1045 00:52:38,657 --> 00:52:41,477 And, you know, and like, that's the thing that we need to think about. 1046 00:52:41,846 --> 00:52:43,354 modern computers are so fast. 1047 00:52:43,409 --> 00:52:44,469 Like, yeah, 1048 00:52:44,469 --> 00:52:49,659 I feel like similar to what you've mentioned before with quoting Paul 1049 00:52:49,659 --> 00:52:51,882 Graham of like, what was the quote again? 1050 00:52:52,652 --> 00:52:55,582 It's it's what would it be ridiculous to not have in a hundred years? 1051 00:52:55,652 --> 00:52:56,262 Yeah, exactly. 1052 00:52:56,262 --> 00:52:58,772 So you imagine a hundred years, it's like, we still don't have something. 1053 00:52:58,992 --> 00:52:59,562 It's crazy. 1054 00:52:59,732 --> 00:53:02,212 Then it's, okay, well, if we didn't have that in 100 years, it would be crazy. 1055 00:53:02,262 --> 00:53:03,312 Could we just build it today? 1056 00:53:04,452 --> 00:53:04,922 Exactly. 1057 00:53:05,272 --> 00:53:10,339 So similar to that, we can also ask ourselves more often, like, Which things 1058 00:53:10,339 --> 00:53:14,899 would actually be totally fine that historically we always like shied away 1059 00:53:14,899 --> 00:53:20,142 from and that sort of like by now, there's sort of like this, picture of like a baby 1060 00:53:20,382 --> 00:53:25,116 elephant kind of, pinned to a pole and it's like, it has learned it cannot escape 1061 00:53:25,336 --> 00:53:29,528 and now it's, a full upgrown, elephant and still, pinned to this tiny pole. 1062 00:53:29,638 --> 00:53:33,698 I think there's like, a lot of similar stuff, the way, how we go 1063 00:53:33,698 --> 00:53:37,768 about programming and we need to unlearn, forget about some things. 1064 00:53:38,148 --> 00:53:42,685 And this is, I feel like also why some of the most brilliant, new 1065 00:53:42,685 --> 00:53:47,195 technologies are by people, by, by newcomers, like new generations of 1066 00:53:47,195 --> 00:53:52,185 programmers who are like blissfully unaware of some of like the old stigma. 1067 00:53:53,155 --> 00:53:55,905 And this is how we get new ideas as well. 1068 00:53:56,211 --> 00:53:57,371 yeah, I really agree with that. 1069 00:53:57,566 --> 00:53:59,806 there's something that it doesn't, I keep thinking about, there 1070 00:53:59,806 --> 00:54:01,556 was a, there was the Unix room. 1071 00:54:01,656 --> 00:54:06,016 So Unix was invented in a place by some people and they sat in a room together and 1072 00:54:06,016 --> 00:54:08,646 they had one computer and they would write programs and show them to each other. 1073 00:54:08,976 --> 00:54:12,026 And someone wrote spell, you know, and, and someone wrote like, they 1074 00:54:12,026 --> 00:54:14,886 wrote these different little Unix programs and said, Hey, check it out. 1075 00:54:15,116 --> 00:54:18,653 And then, some people, made the pipe operator and made piping work. 1076 00:54:18,883 --> 00:54:20,513 And they started to be able to connect these programs 1077 00:54:20,513 --> 00:54:21,343 together to be able to make. 1078 00:54:21,673 --> 00:54:25,263 You know, quite complex programs just as a series of small programs pipe together. 1079 00:54:25,446 --> 00:54:28,206 This is a really beautiful primitive, and it's a beautiful 1080 00:54:28,206 --> 00:54:29,476 thing that, someone created. 1081 00:54:29,476 --> 00:54:31,966 And we have it on all of our modern terminals. 1082 00:54:32,063 --> 00:54:35,333 I think there's even a version on Windows, but all Unixes have something like this. 1083 00:54:35,640 --> 00:54:38,760 I feel like at some point we gave up trying to invent new kinds of 1084 00:54:38,760 --> 00:54:41,910 primitives like that, and I dunno why, but it feels like the sort of 1085 00:54:41,910 --> 00:54:43,350 thing that we should be able to do. 1086 00:54:43,350 --> 00:54:46,510 Obviously, you know, I sometimes think about, we've been 1087 00:54:46,530 --> 00:54:47,310 talking about the web a bit. 1088 00:54:47,530 --> 00:54:50,446 And, we have this beautiful idea, which is, so we've got these 1089 00:54:50,446 --> 00:54:51,806 two different ideas right now. 1090 00:54:52,026 --> 00:54:55,206 We've got a desktop application, and desktop applications have access to 1091 00:54:55,206 --> 00:54:57,536 everything that the user has access to by default, which is interesting. 1092 00:54:57,546 --> 00:55:00,306 And Apple's trying to change this, but keeps getting in trouble for it. 1093 00:55:00,636 --> 00:55:02,336 desktop applications are binaries. 1094 00:55:02,336 --> 00:55:04,006 They're always native binaries on every platform. 1095 00:55:04,286 --> 00:55:07,430 And they have access to some set of native, APIs and they 1096 00:55:07,430 --> 00:55:08,490 can make sys calls directly. 1097 00:55:08,860 --> 00:55:11,500 And then we have another set of applications called web applications, 1098 00:55:11,500 --> 00:55:14,430 which is sandboxed by a browser and, you know, historically only written 1099 00:55:14,430 --> 00:55:17,300 in JavaScript and written in a way that they can operate on every, every 1100 00:55:17,300 --> 00:55:18,790 computer, but only inside the web browser. 1101 00:55:19,320 --> 00:55:20,300 And like. 1102 00:55:20,770 --> 00:55:24,340 Web applications are really successful, I think, not because of the web browser, but 1103 00:55:24,340 --> 00:55:26,130 because you don't have to install them. 1104 00:55:26,570 --> 00:55:29,110 And people sort of forget this, but they're kind of equivalent, except 1105 00:55:29,120 --> 00:55:31,710 this one you have to install for some reason, and this one you don't. 1106 00:55:32,030 --> 00:55:34,810 And because you don't have to install a web app, people spend a lot of 1107 00:55:34,810 --> 00:55:36,270 time optimizing them for size. 1108 00:55:36,320 --> 00:55:40,085 So you load up the New York Times and it'll load a lot of Crap, probably, 1109 00:55:40,085 --> 00:55:42,835 but we're looking on the order of maybe half a meg of JavaScript. 1110 00:55:42,865 --> 00:55:44,815 Maybe it's a couple megs of JavaScript and some images. 1111 00:55:45,205 --> 00:55:47,925 Um, whereas if I install, you know, I haven't actually tried this. 1112 00:55:47,925 --> 00:55:49,825 I'm going to get in trouble by somebody who will actually go and 1113 00:55:49,825 --> 00:55:53,155 look, but you look at most iPhone apps, for example, and they, there 1114 00:55:53,155 --> 00:55:54,535 are hundreds of megabytes in size. 1115 00:55:54,585 --> 00:55:57,605 I think the Uber app is like 300 megs or something crazy. 1116 00:55:57,835 --> 00:56:00,495 Like the Facebook app is huge and it doesn't even have content. 1117 00:56:00,545 --> 00:56:02,695 Like it's not even like the Uber app is loading. 1118 00:56:02,705 --> 00:56:04,525 It's like installing databases. 1119 00:56:04,745 --> 00:56:05,935 Who even knows what's in there? 1120 00:56:06,386 --> 00:56:09,986 But then web applications are written in slow languages and I just feel like 1121 00:56:09,986 --> 00:56:13,036 it's like well, we could just make a new platform and we could give it 1122 00:56:13,036 --> 00:56:15,896 a new kind of application where you don't have to install it, but also it 1123 00:56:15,896 --> 00:56:19,306 gets access to some set of beautiful native primitives that might be even 1124 00:56:19,306 --> 00:56:22,766 better than what the web provides today for applications themselves. 1125 00:56:22,766 --> 00:56:24,876 Like the web obviously is designed as a document. 1126 00:56:25,246 --> 00:56:28,856 Viewing platform and then we've could have hacked on applications because it 1127 00:56:28,856 --> 00:56:32,830 was so convenient, and we could make it so that data is just transparently 1128 00:56:32,830 --> 00:56:36,730 available and accessible between programs beautifully using all of the tools and 1129 00:56:36,730 --> 00:56:37,980 technologies we've been talking about. 1130 00:56:38,286 --> 00:56:41,166 but no one works on this stuff because we sort of take for granted, it's 1131 00:56:41,166 --> 00:56:44,901 like, there's the ruins of old Rome, you know, and that's, that's like Unix 1132 00:56:44,901 --> 00:56:48,881 or it's the, you know, the machine code and x86 assembly and then modern, 1133 00:56:48,901 --> 00:56:51,516 you know, people say, oh, well, Then they build the web browser and then we 1134 00:56:51,656 --> 00:56:53,066 build on top of the web browser react. 1135 00:56:53,066 --> 00:56:56,396 And then you build an application on top of react, but then the application slows. 1136 00:56:56,406 --> 00:56:58,016 So you do some other wacky thing on top of that. 1137 00:56:58,246 --> 00:57:02,226 And it's like, you know, underneath the city is this giant, you know, all of 1138 00:57:02,226 --> 00:57:06,556 these ruins that are all full of code and all being used by modern programs. 1139 00:57:06,556 --> 00:57:09,646 But that so many people, particularly young engineers, they have no 1140 00:57:09,646 --> 00:57:10,776 idea about all of this crap. 1141 00:57:10,786 --> 00:57:13,546 They just know that if they type the right thing into a react application, 1142 00:57:13,546 --> 00:57:14,796 that they'll get something on the screen. 1143 00:57:15,351 --> 00:57:19,561 But all of that stuff, we can actually like, you know, burn it all if we want 1144 00:57:19,561 --> 00:57:23,301 to, and then go and make beautiful things right from the very base of computers. 1145 00:57:23,761 --> 00:57:24,391 Yeah. 1146 00:57:24,541 --> 00:57:29,611 I mean, I think there's this sort of like innovators dilemma and I think this, 1147 00:57:29,661 --> 00:57:33,291 you mentioning email as an example, I think this is one of the words, since 1148 00:57:33,291 --> 00:57:38,031 you, you just emails and browsers, like you, you just cannot get away 1149 00:57:38,031 --> 00:57:40,301 with like not supporting the old stuff. 1150 00:57:40,691 --> 00:57:45,593 And this is where, If you build a brand new thing, you don't have to, 1151 00:57:45,753 --> 00:57:49,846 account for all of like the historic mess, and you can just start over. 1152 00:57:49,956 --> 00:57:57,163 And, I think this is probably just having the, the courage or naivety to start over. 1153 00:57:58,043 --> 00:58:00,053 I think that that's highly underrated. 1154 00:58:00,493 --> 00:58:04,259 and also for the record, I've just checked, blank loading New York times. 1155 00:58:04,259 --> 00:58:09,496 It's like currently five megabytes of just javaScript and, depending on, well, 1156 00:58:09,666 --> 00:58:14,409 and 20 megs, of like other stuff that I've loaded, like with images and so on. 1157 00:58:14,679 --> 00:58:18,519 So, I think that this just proves the point, like even for New York times, 1158 00:58:18,519 --> 00:58:20,879 like five megs of JavaScript, it's fine. 1159 00:58:21,266 --> 00:58:24,856 I don't want to know how much of that is like ads related, et cetera, 1160 00:58:25,286 --> 00:58:30,699 but, I just want to encourage people to rethink their, like their 1161 00:58:30,739 --> 00:58:33,409 learned, thinking about trade offs. 1162 00:58:33,539 --> 00:58:37,889 Like we're, it's at the same time, we're kind of indoctrinated with like, 1163 00:58:37,949 --> 00:58:42,049 okay, we need to make the initial page load as quick as possible. 1164 00:58:42,289 --> 00:58:44,299 We always have connectivity. 1165 00:58:44,569 --> 00:58:48,686 I'd like to alter that slightly and say like, when we're connected. 1166 00:58:49,106 --> 00:58:51,246 We probably have pretty good connectivity. 1167 00:58:51,446 --> 00:58:55,563 So let's embrace that, but we're, not going to be always connected 1168 00:58:55,573 --> 00:58:58,293 for the moments where we don't have perfect connectivity. 1169 00:58:58,853 --> 00:59:04,273 Let's, like piggyback on the times when we had good connectivity and we 1170 00:59:04,273 --> 00:59:08,643 should just sync the deltas instead of like reloading everything every time. 1171 00:59:08,873 --> 00:59:13,563 Also goes back to the build problem, the build system problem that we had before. 1172 00:59:14,173 --> 00:59:17,923 Since we don't build things in a principled enough way, so we don't 1173 00:59:17,933 --> 00:59:22,183 trust the stuff that was there before, and so that leads to us reloading 1174 00:59:22,243 --> 00:59:24,043 everything from scratch all the time. 1175 00:59:24,563 --> 00:59:28,926 And, I think that's another big culprit of, systems problems. 1176 00:59:29,468 --> 00:59:33,024 I read a great article a while ago, comparing the size of JavaScript bundles 1177 00:59:33,024 --> 00:59:38,381 with War and Peace, saying like, you know, could you, how many copies of War and 1178 00:59:38,381 --> 00:59:40,141 Peace could fit in your JavaScript bundle? 1179 00:59:40,561 --> 00:59:41,301 and it's quite a lot. 1180 00:59:41,394 --> 00:59:44,971 and the other thing I sometimes think about is, how many bytes of 1181 00:59:44,971 --> 00:59:48,281 data would it take if you took a screenshot of your website, even as a 1182 00:59:48,281 --> 00:59:52,061 PNG, and then sent me the screenshot, would that be larger or smaller 1183 00:59:52,061 --> 00:59:53,851 than it takes to load your website? 1184 00:59:54,291 --> 00:59:56,791 And if the answer is that your screenshot would be smaller than all 1185 00:59:56,791 --> 00:59:59,331 of the code that you send me, then maybe you're doing something wrong. 1186 00:59:59,878 --> 01:00:03,378 but even then, like, yeah, I really encourage people to also think 1187 01:00:03,388 --> 01:00:07,041 about from the perspective of, the web browser, it's all code. 1188 01:00:07,141 --> 01:00:11,081 You know, if you, if you start digging, it's code a really long way down. 1189 01:00:11,111 --> 01:00:12,851 And all of that code can be changed. 1190 01:00:13,121 --> 01:00:14,411 Like web browsers are open source. 1191 01:00:14,451 --> 01:00:17,161 I've got some quite famously, infamously, I've got some source 1192 01:00:17,161 --> 01:00:20,984 code, in Google Chrome, to be able to interact with Xbox game controllers. 1193 01:00:20,984 --> 01:00:24,619 I'm not sure if it's still there, but, I wrote, a user land, 1194 01:00:25,029 --> 01:00:27,909 USB driver for Google Chrome. 1195 01:00:28,235 --> 01:00:30,955 so that if you're on Mac OS in particular, so if you plug in an Xbox 1196 01:00:30,975 --> 01:00:36,225 game controller to a Mac computer and you want to play video games, in browsers, 1197 01:00:36,255 --> 01:00:37,745 then the Xbox controller will work. 1198 01:00:38,135 --> 01:00:40,965 But there's so much stuff like that, that like, you know, and I think that's almost 1199 01:00:40,965 --> 01:00:42,935 crazy that that, that is in Google Chrome. 1200 01:00:43,040 --> 01:00:45,799 it should be the operating system, but there's lots of perimeters 1201 01:00:45,799 --> 01:00:46,989 that we could put in Google Chrome. 1202 01:00:47,089 --> 01:00:49,079 That would mean that, you know, if there's some, if there are things 1203 01:00:49,089 --> 01:00:52,189 that we want to be able to have access to as web developers, We can 1204 01:00:52,189 --> 01:00:54,409 build them in as primitives, and everyone can get access to them. 1205 01:00:54,769 --> 01:00:57,399 Like, a lot of the standards committees, you can just go to them, it turns out. 1206 01:00:57,449 --> 01:01:00,129 You know, like, there's open mailing lists of the people that build 1207 01:01:00,129 --> 01:01:02,809 all of this stuff, and they're just nerds like us, you know? 1208 01:01:02,859 --> 01:01:05,299 Like, they've just got all of their own crotchety, angry opinions 1209 01:01:05,309 --> 01:01:07,389 that they'll tell you about if you give them half a chance. 1210 01:01:07,672 --> 01:01:08,802 but, I don't know. 1211 01:01:08,832 --> 01:01:11,242 I feel like there's not enough conversation around all this 1212 01:01:11,242 --> 01:01:12,242 stuff, how it could be better. 1213 01:01:12,647 --> 01:01:19,647 Going back slightly to the moment where you reflected on that kind of the creation 1214 01:01:19,687 --> 01:01:24,767 of primitives, what I found, at least looking back at my own creative work, 1215 01:01:25,007 --> 01:01:32,860 what I found easier to than just forcing a primitive into existing out of thin air is 1216 01:01:32,910 --> 01:01:39,845 rather embrace sort of like organic chaos, and then study it really hard and then 1217 01:01:39,855 --> 01:01:42,989 see basically out of the existing mess. 1218 01:01:43,152 --> 01:01:46,752 typically if you look hard enough, if you observe hard enough, you 1219 01:01:46,792 --> 01:01:52,605 can, observe some things that later can emerge as primitives. 1220 01:01:53,095 --> 01:01:57,895 And, this is where almost paradoxically the more requirements 1221 01:01:57,995 --> 01:02:01,115 I apply on a certain system. 1222 01:02:01,410 --> 01:02:05,144 The more it becomes like simpler over time. 1223 01:02:05,594 --> 01:02:10,864 And so I've basically just taken more kind of like inner peace by like, not 1224 01:02:10,864 --> 01:02:13,244 knowing the primitives upfront right away. 1225 01:02:13,484 --> 01:02:15,794 I'm basically just trying to solve the problem. 1226 01:02:15,794 --> 01:02:22,124 Like I happily say yes to a few problems and I've had enough, past 1227 01:02:22,124 --> 01:02:24,454 experience where out of that mess. 1228 01:02:24,949 --> 01:02:30,405 through lucky coincidences, I realized, okay, here's some useful, more general 1229 01:02:30,445 --> 01:02:34,475 primitives and in hindsight, those primitives look very obvious and 1230 01:02:34,548 --> 01:02:39,258 someone who then looks at that system and maybe builds a similar one, they 1231 01:02:39,258 --> 01:02:44,566 can already embrace those primitive ideas and, build on top of them, the 1232 01:02:44,566 --> 01:02:51,081 beginning, but I think for novel, new primitives, I think the most likely path 1233 01:02:51,131 --> 01:02:56,461 for them to come into existence is out of emergence and not out of like forcing 1234 01:02:56,461 --> 01:02:58,351 them into existence out of thin air. 1235 01:02:58,931 --> 01:03:02,661 I agree with everything and I'm a little bit dubious on that last point. 1236 01:03:03,091 --> 01:03:05,711 And just to push back a little bit, I think that it's got to 1237 01:03:05,711 --> 01:03:09,971 be this push and pull, you know, like they're both so important. 1238 01:03:10,064 --> 01:03:11,054 I really like what you said though. 1239 01:03:11,434 --> 01:03:15,279 Again, Rich Hickey, who, You should watch all of his talks. 1240 01:03:15,319 --> 01:03:18,119 Anyone who's listening to this, he's much more insightful than I will ever 1241 01:03:18,119 --> 01:03:22,312 be, I think, but he gave a talk once and he said, he talked about hammock driven 1242 01:03:22,312 --> 01:03:27,612 development as in software development driven by writing some code and then 1243 01:03:27,622 --> 01:03:30,302 going outside and lying in a hammock and thinking really hard about it. 1244 01:03:30,897 --> 01:03:34,047 And just, just letting it percolate, like letting the design that you've 1245 01:03:34,047 --> 01:03:37,627 come up with percolate and say, how does this problem actually really want to be 1246 01:03:37,627 --> 01:03:39,347 solved if I were to do a good job at it? 1247 01:03:39,684 --> 01:03:43,384 and instead of sort of half arsing a million things and having everyone across 1248 01:03:43,384 --> 01:03:46,444 the industry half arse the same set of eight things, you know, lists and so 1249 01:03:46,444 --> 01:03:50,737 on, I don't know, I can't help but think that if, if a few people spend some time. 1250 01:03:51,092 --> 01:03:54,092 Some serious time thinking a lot about lists, we could have some really nice 1251 01:03:54,092 --> 01:03:57,222 lists in web browsers and all these different things and then it would 1252 01:03:57,222 --> 01:03:58,532 just be solved for everybody, you know, 1253 01:03:58,912 --> 01:04:02,022 maybe this is, this is why I've prefaced it with like, that's being 1254 01:04:02,412 --> 01:04:07,442 for me, the easier path, like for me, step one is half arsing something. 1255 01:04:07,927 --> 01:04:12,777 And then looking at it, but I need to have it be laid out wrong first for me 1256 01:04:12,777 --> 01:04:15,387 to spot, oh, this is, this is how right. 1257 01:04:15,397 --> 01:04:19,227 Looks like some more brilliant people than me can probably skip step one. 1258 01:04:20,187 --> 01:04:23,964 But for me, this one has been a more proven approach. 1259 01:04:24,261 --> 01:04:25,531 I mean, it's the same for me. 1260 01:04:25,531 --> 01:04:29,361 I used to teach programming and something, you know, my students would. 1261 01:04:29,881 --> 01:04:32,771 Sort of sometimes come to me asking me how they should design their program 1262 01:04:32,771 --> 01:04:34,581 before they even start writing any code. 1263 01:04:34,991 --> 01:04:38,221 And I'm convinced that you know the least about your program, 1264 01:04:38,231 --> 01:04:40,661 like you know the least about the program before you start writing it. 1265 01:04:40,941 --> 01:04:42,721 That's the time that you will know the least that you will 1266 01:04:42,721 --> 01:04:43,771 ever know about this problem. 1267 01:04:44,031 --> 01:04:47,011 So you're the least qualified you're ever going to be to design it correctly. 1268 01:04:47,186 --> 01:04:51,376 You know, so you become qualified by throwing something on the screen and 1269 01:04:51,376 --> 01:04:54,946 then taking the time to reflect on the knowledge that you've gained to figure out 1270 01:04:54,956 --> 01:04:56,266 how it could be written in a better way. 1271 01:04:56,579 --> 01:04:58,429 it's, yeah, I absolutely agree. 1272 01:04:59,104 --> 01:05:04,174 And I think this is also this underscore is like one of the most important things 1273 01:05:04,174 --> 01:05:08,914 that I hold dearly in the craft of software engineering, which is the ease 1274 01:05:08,914 --> 01:05:10,814 of iteration and the speed of iteration. 1275 01:05:11,374 --> 01:05:15,994 And this is where I spend a obscene amount of time on just like making 1276 01:05:15,994 --> 01:05:18,694 so that I have fun and iterating. 1277 01:05:19,069 --> 01:05:23,659 That it's very cheap for me to get it wrong 10 times and 1278 01:05:23,659 --> 01:05:26,319 it's fun to do every iteration. 1279 01:05:26,496 --> 01:05:30,719 but if it's gruesome to do one iteration, then you just, run 1280 01:05:30,729 --> 01:05:32,619 out of like joy and energy. 1281 01:05:32,934 --> 01:05:34,464 Until you get to the right point. 1282 01:05:34,844 --> 01:05:38,824 So making the iteration cycles, it's like, it sounds very obvious, but I 1283 01:05:38,834 --> 01:05:42,834 think very few people actually put in the work since it's also partially 1284 01:05:42,834 --> 01:05:47,484 some pretty annoying work, like getting your, like your monorepo set up, all 1285 01:05:47,494 --> 01:05:51,114 dialed in, like particular, like which JavaScript package manager should you use? 1286 01:05:51,114 --> 01:05:55,474 Like all of like those stupid things, but getting all of that stuff dialed in, 1287 01:05:55,621 --> 01:05:57,954 I think that the reward is, quite big. 1288 01:05:58,088 --> 01:05:59,201 I mean. 1289 01:05:59,706 --> 01:06:02,552 I assume that you've read this, but, again, to plug more things that people 1290 01:06:02,552 --> 01:06:05,289 should read if they haven't, there's that beautiful essay of Worse is 1291 01:06:05,289 --> 01:06:07,446 Better, that talks about all of this. 1292 01:06:07,516 --> 01:06:11,376 And I feel like, yeah, I think that life exists like in the intersection 1293 01:06:11,406 --> 01:06:14,712 of thinking it through and just throwing something at the wall. 1294 01:06:14,942 --> 01:06:17,782 And I think all good software is going to have elements of both of these things 1295 01:06:17,782 --> 01:06:20,972 where, you know, there's not too much upfront design and upfront thinking, 1296 01:06:21,162 --> 01:06:22,482 but there's not too little of it either. 1297 01:06:22,552 --> 01:06:25,082 You know, like there's got to be some amount of time, but after you've written 1298 01:06:25,082 --> 01:06:28,522 a whole lot of code, you take a step back and you say, how should this have been? 1299 01:06:28,532 --> 01:06:30,432 If I knew everything I knew now, how would I build it? 1300 01:06:30,742 --> 01:06:33,412 And I think everything beautiful and everything incredible has 1301 01:06:33,412 --> 01:06:34,652 a lot of those feedback loops. 1302 01:06:35,062 --> 01:06:38,259 Like I listened to an amazing talk at, GDC, the Game Developers Conference, 1303 01:06:38,259 --> 01:06:41,499 once talking about this, and he said essentially all good games are made 1304 01:06:41,509 --> 01:06:45,159 by having some ideas, writing them in code, trying them out, and then 1305 01:06:45,159 --> 01:06:47,949 throwing out 80 percent of them because they weren't very good ideas, but 20 1306 01:06:47,949 --> 01:06:49,159 percent of them were really good ideas. 1307 01:06:49,529 --> 01:06:52,699 And he said in that talk that the quality of any program that 1308 01:06:52,699 --> 01:06:55,239 you make is proportional to the number of iteration cycles you get 1309 01:06:55,239 --> 01:06:57,369 through, not how long one cycle is. 1310 01:06:57,509 --> 01:07:01,059 The number of iteration cycles, just the sheer amount of repetition 1311 01:07:01,069 --> 01:07:05,089 that you go through in writing code, reflecting, changing the code, making 1312 01:07:05,089 --> 01:07:06,719 it better, writing more code and so on. 1313 01:07:07,089 --> 01:07:09,509 And I think it's, yeah, I think it's a beautiful idea. 1314 01:07:10,007 --> 01:07:13,987 I've been doing improv comedy classes lately and over the last few years and 1315 01:07:14,247 --> 01:07:17,037 in improv we learn it's, you can't plan. 1316 01:07:17,077 --> 01:07:17,687 There's no planning. 1317 01:07:17,697 --> 01:07:20,667 You don't have a meeting with your, the people you share the 1318 01:07:20,667 --> 01:07:21,947 stage with before the show starts. 1319 01:07:22,257 --> 01:07:25,297 So everything is just asking the question of what comes next? 1320 01:07:25,627 --> 01:07:27,467 Like, which I feel like is this life philosophy. 1321 01:07:27,667 --> 01:07:29,067 Just at every moment, what comes next? 1322 01:07:29,552 --> 01:07:31,362 And maybe what comes next is writing more code. 1323 01:07:31,422 --> 01:07:33,422 And maybe what comes next is stepping away and thinking about 1324 01:07:33,422 --> 01:07:34,442 the code and refactoring it. 1325 01:07:34,472 --> 01:07:37,302 But, like, I feel like that's the right question just to 1326 01:07:37,302 --> 01:07:38,372 hold, you know, consciously. 1327 01:07:39,187 --> 01:07:43,177 so you've given me two segues now to ask you about another topic that I 1328 01:07:43,187 --> 01:07:44,767 think is very top of mind for you. 1329 01:07:44,777 --> 01:07:50,246 So one is sort of this almost evolution, like, nature evolution of software 1330 01:07:50,246 --> 01:07:53,436 and good products, et cetera, where it's all about the iteration cycles. 1331 01:07:53,466 --> 01:07:55,246 That's like how biology works. 1332 01:07:55,256 --> 01:07:59,956 So this is why we as humans exist, et cetera, and why other good things exist. 1333 01:08:00,332 --> 01:08:03,312 and then also asking the question, what is next? 1334 01:08:03,592 --> 01:08:07,122 That is, that's the essence of how an LLM works. 1335 01:08:07,382 --> 01:08:11,982 So I think you've been thinking a lot about, the topic of AI and 1336 01:08:11,992 --> 01:08:17,529 what that means for our culture of programmers and software creatives. 1337 01:08:17,869 --> 01:08:22,089 So I'm, I'm curious, what are some of the leading questions for you 1338 01:08:22,089 --> 01:08:26,972 are when you're rethinking and like digging into the topic of AI? 1339 01:08:27,411 --> 01:08:30,621 I've told the story of me working on Google Wave and I started there in 1340 01:08:30,621 --> 01:08:35,111 about 2010, but I've been thinking about AI a lot since about 2002. 1341 01:08:35,111 --> 01:08:37,221 I think since I first around when I started uni. 1342 01:08:37,561 --> 01:08:40,861 I've got somewhere a pile of notebooks full of handwritten notes, 1343 01:08:40,871 --> 01:08:44,521 thinking through lots of different ideas and ways to build AI systems. 1344 01:08:44,697 --> 01:08:49,464 and I started a PhD And I ended up leaving and I felt disappointed and I attacked 1345 01:08:49,464 --> 01:08:52,254 myself because I couldn't get the things that I wanted to get working, working. 1346 01:08:52,514 --> 01:08:55,264 And instead of just chipping away at it, like I wish I had done in 1347 01:08:55,264 --> 01:08:58,684 retrospect, I felt a whole lot of shame and guilt and then walked away 1348 01:08:58,684 --> 01:09:02,084 from the whole industry and haven't really come back or it's been a while. 1349 01:09:02,237 --> 01:09:06,437 you know, I haven't come back in a big way, for, you know, 20, 23 years 1350 01:09:06,437 --> 01:09:07,737 or something now, which is crazy. 1351 01:09:08,071 --> 01:09:10,641 more than half of my life, you know, running away from this dream 1352 01:09:10,641 --> 01:09:15,711 that I had, but way back when I. Like, it's really interesting. 1353 01:09:15,726 --> 01:09:18,632 We're in this transition period at the moment where AI is a 1354 01:09:18,632 --> 01:09:20,002 similar intelligence to humans. 1355 01:09:20,132 --> 01:09:24,026 but something I think about a lot with this kind of software is, like I mentioned 1356 01:09:24,026 --> 01:09:28,032 before that when I was young, I thought that one human should be able to, as our 1357 01:09:28,032 --> 01:09:29,722 tools, let us become more productive. 1358 01:09:29,982 --> 01:09:32,862 One person should be able to do the work of a whole team from a decade ago. 1359 01:09:33,212 --> 01:09:36,042 And increasingly with AI think that's actually going to become the case. 1360 01:09:36,182 --> 01:09:39,482 And I don't really know what that's going to, how it's going to change. 1361 01:09:40,267 --> 01:09:43,917 A lot of things, but I can imagine as we go forward that if we had better 1362 01:09:43,917 --> 01:09:47,117 primitives and had primitives that the AIs understood, that a lot of these kind 1363 01:09:47,117 --> 01:09:49,887 of problems that actually just require a whole lot of code, for example, like 1364 01:09:50,087 --> 01:09:53,977 building a really good UX, like a UI toolkit that would be cross platform, it's 1365 01:09:53,977 --> 01:09:57,317 possible that we could start to build AI systems that could actually design good 1366 01:09:57,317 --> 01:10:01,247 primitive tools, for computer systems and, I don't know what that means for us. 1367 01:10:01,287 --> 01:10:04,677 Like, I don't have any recommendations or advice or anything else, but it's 1368 01:10:04,927 --> 01:10:07,757 really interesting to start thinking about it as, you know, if, if your 1369 01:10:07,897 --> 01:10:11,647 productivity isn't limited by what you can personally code anymore, which is, 1370 01:10:11,687 --> 01:10:14,967 I think, going to increasingly be the case, then what do you want to build? 1371 01:10:15,027 --> 01:10:18,467 And how can we start building, you know, like, utilizing AI tools that 1372 01:10:18,677 --> 01:10:21,931 will increasingly, and obviously they're not quite yet, there yet, build large 1373 01:10:21,931 --> 01:10:26,662 swathes of working in usable software., I feel like this is just really open 1374 01:10:26,662 --> 01:10:29,702 question of what does it even mean to be a software developer, but also. 1375 01:10:30,337 --> 01:10:33,687 What could we do again, right, like that we can't do today because it would take 1376 01:10:33,687 --> 01:10:37,047 the resources of Google to be able to build something that we might be able 1377 01:10:37,047 --> 01:10:39,547 to do, you know, like if you wanted to build your own operating system 1378 01:10:39,547 --> 01:10:42,444 and your own browser from scratch, you could just ask an AI to do it. 1379 01:10:42,554 --> 01:10:43,134 How do we do that? 1380 01:10:43,647 --> 01:10:50,192 have you been able to derive sort of like a set of, invariants almost that 1381 01:10:50,217 --> 01:10:56,794 are still going to be true, in the age where, AI will be a meaningful part 1382 01:10:56,824 --> 01:10:59,524 of how software is created, et cetera. 1383 01:10:59,524 --> 01:11:04,481 Like, which aspects do you think are still meaningful for humans 1384 01:11:04,731 --> 01:11:07,107 to play a, meaningful role there? 1385 01:11:07,634 --> 01:11:08,424 I mean, it's a great question. 1386 01:11:08,424 --> 01:11:12,544 I feel like there's this massive economic, you know, loom thing that looms over 1387 01:11:12,544 --> 01:11:15,841 all of us of, If you can't use your mind to do things that an AI couldn't 1388 01:11:15,851 --> 01:11:18,131 do, then why would you ever be hired? 1389 01:11:18,445 --> 01:11:20,247 why would any human be hired for any job? 1390 01:11:20,317 --> 01:11:22,754 And, there's a threshold that we need to pass. 1391 01:11:23,014 --> 01:11:26,974 You know, obviously with computers and AI systems, we can become more productive 1392 01:11:26,974 --> 01:11:30,714 than we ever are today and produce more abundance and more resources and more 1393 01:11:30,714 --> 01:11:32,014 useful programs and everything else. 1394 01:11:32,014 --> 01:11:34,624 But if none of the humans are employed to do any of that, then 1395 01:11:34,624 --> 01:11:35,664 we've got a huge economic problem. 1396 01:11:36,081 --> 01:11:39,677 but The beautiful world on the other side of that, if we can possibly reach 1397 01:11:39,677 --> 01:11:43,544 it, I think has to look like humans actually building the software and 1398 01:11:43,554 --> 01:11:47,294 building like being able to be creative in all of the ways that we're born to be. 1399 01:11:47,344 --> 01:11:51,344 I think that there's some element that's honestly our birthright in creative 1400 01:11:51,354 --> 01:11:55,774 beings, being able to make stuff, you know, it feels so, so core to who we are. 1401 01:11:55,844 --> 01:11:58,384 And the more that I get in touch with myself, the more I just want to. 1402 01:11:58,824 --> 01:12:02,574 Build and play piano and write stories and do this kind of stuff. 1403 01:12:03,054 --> 01:12:03,124 So 1404 01:12:03,614 --> 01:12:07,801 play as sort of like the most natural state of, who we are. 1405 01:12:08,331 --> 01:12:12,307 Yeah, I did, again, this is a segue, that I'll, I'll try not 1406 01:12:12,307 --> 01:12:13,597 to drag us too, too far down. 1407 01:12:13,937 --> 01:12:18,621 I went to France a year and a half ago and, and attended a clowning intensive. 1408 01:12:18,621 --> 01:12:21,011 So physical comedy and performance for a month. 1409 01:12:21,376 --> 01:12:22,736 And it was horrific. 1410 01:12:22,756 --> 01:12:25,396 The, it was quite abusive in its own way. 1411 01:12:25,396 --> 01:12:28,476 The guy who's was teaching it has been teaching clowning for 40 years. 1412 01:12:28,476 --> 01:12:30,482 And, anyway, it was an incredible experience. 1413 01:12:30,512 --> 01:12:33,699 But, he said, you know, he's this like grizzled old Frenchman. 1414 01:12:33,699 --> 01:12:37,774 And he said that he thinks And he's trained Sacha Baron Cohen and all 1415 01:12:37,774 --> 01:12:40,344 these different people, but he thinks that the most beautiful thing that 1416 01:12:40,344 --> 01:12:43,904 exists in the world is watching a child play and, you know, so much 1417 01:12:43,904 --> 01:12:45,674 of clowning and physical comedy. 1418 01:12:45,714 --> 01:12:49,284 And I think creativity in general is rediscovering as adults, if we 1419 01:12:49,284 --> 01:12:52,761 need to, that spark that's inside all of us and that just wants to 1420 01:12:52,761 --> 01:12:56,071 build things and wants to play and wants to try stuff out and so on. 1421 01:12:56,071 --> 01:12:59,631 And I don't know, that's my, that's my hope for AI at least is that. 1422 01:13:00,386 --> 01:13:03,366 If you were to play, if you wanted to make your own sandbox, you know, 1423 01:13:03,366 --> 01:13:06,096 grow a garden, a software, whatever metaphor you want to think about it 1424 01:13:06,096 --> 01:13:08,086 as, then what do you want to make? 1425 01:13:08,126 --> 01:13:10,226 What, what are you called on to make? 1426 01:13:10,296 --> 01:13:13,846 You know, I live in a apartment building that overlooks a lot of the 1427 01:13:13,846 --> 01:13:18,344 city and, there's this idea of Dharma that's talked about in, in Smithsonian 1428 01:13:18,344 --> 01:13:22,151 philosophy, which is like, what is the duty that's your sacred duty? 1429 01:13:22,151 --> 01:13:23,501 That's yours alone to reach. 1430 01:13:23,721 --> 01:13:26,031 And that duty, by the way, might just be to like, be a really great parent. 1431 01:13:26,111 --> 01:13:28,631 It doesn't have to be anything grand or grandiose in any way, 1432 01:13:29,001 --> 01:13:32,311 but asking that question of what is it yours to do in the world? 1433 01:13:32,371 --> 01:13:35,201 That's yours uniquely that no one else will do if you don't do it. 1434 01:13:35,484 --> 01:13:37,224 I think that's really the question that we want to be asking 1435 01:13:37,224 --> 01:13:38,524 ourselves as creative workers. 1436 01:13:38,684 --> 01:13:42,454 and from that perspective, I'm excited about AI because hoping I mean, 1437 01:13:42,464 --> 01:13:44,834 I'm really hoping that it lets us answer the questions like that more. 1438 01:13:45,184 --> 01:13:48,084 And you know, like I don't think economically we need local-first 1439 01:13:48,104 --> 01:13:51,354 software, you know, like we can trudge along with the feudalism 1440 01:13:51,384 --> 01:13:55,274 of Google cloud services for, you know, probably for a very long time. 1441 01:13:55,361 --> 01:13:56,201 but I don't want that. 1442 01:13:56,281 --> 01:14:00,481 I want beautiful software programs that work in harmony with who I am as a person 1443 01:14:00,491 --> 01:14:04,221 and with in harmony with what kind of communities I want to be able to foster. 1444 01:14:04,591 --> 01:14:07,501 And from that perspective, I think that's like why I care about local-first 1445 01:14:07,521 --> 01:14:11,321 software and why I hope that more people care about it because I just think that. 1446 01:14:11,456 --> 01:14:15,426 We deserve, I don't know, we can just have nice things, you know, like the cloud 1447 01:14:15,616 --> 01:14:19,759 always feels like, feudal city states, you know, so back before we had democracy. 1448 01:14:19,759 --> 01:14:22,309 And before we had countries, you have these towns and the 1449 01:14:22,309 --> 01:14:23,909 town, it's not a democracy. 1450 01:14:24,129 --> 01:14:26,249 There's one ruler, the noble, the local noble. 1451 01:14:26,249 --> 01:14:28,869 And if you upset the noble, there's no laws necessarily. 1452 01:14:28,869 --> 01:14:32,169 That's a, recent invention, that the noble would say, no, not you. 1453 01:14:32,179 --> 01:14:34,529 And you'd be either be exiled if you're lucky or like, you 1454 01:14:34,529 --> 01:14:36,719 know, hung from the town square. 1455 01:14:36,769 --> 01:14:39,629 If you did something, the noble didn't like, and no one owns property. 1456 01:14:39,629 --> 01:14:40,979 Only the noble owns the whole town. 1457 01:14:40,999 --> 01:14:42,049 That's the rule, right? 1458 01:14:42,219 --> 01:14:46,019 And so if you have a house, you have a house because the noble has 1459 01:14:46,329 --> 01:14:47,979 graciously allowed you to live there. 1460 01:14:48,119 --> 01:14:50,639 And that's the rule, you know, and if the noble wants to. 1461 01:14:50,874 --> 01:14:52,124 Do whatever they want to do. 1462 01:14:52,134 --> 01:14:55,874 There's no higher law than the noble, and that feels like the software 1463 01:14:55,874 --> 01:14:59,494 ecosystem that we exist in today, where, you know, there's the Google city. 1464 01:14:59,514 --> 01:15:02,874 And as much as I have endless respect for so many individuals that I know 1465 01:15:02,874 --> 01:15:03,874 who I've worked with at Google. 1466 01:15:03,894 --> 01:15:05,044 I think they're amazing people. 1467 01:15:05,764 --> 01:15:07,804 The experience is Google is a feudal city state. 1468 01:15:08,134 --> 01:15:11,271 Where you walk into the gates and if the noble, with the local Lord 1469 01:15:11,281 --> 01:15:14,501 doesn't like you, then you can get banished at any moment out of Google. 1470 01:15:14,501 --> 01:15:15,301 There's no recourse. 1471 01:15:15,321 --> 01:15:16,561 There's no laws. 1472 01:15:16,561 --> 01:15:17,251 There's no rules. 1473 01:15:17,431 --> 01:15:18,431 It's not a democracy. 1474 01:15:18,667 --> 01:15:19,697 you don't have any privacy. 1475 01:15:19,707 --> 01:15:23,977 Everything you do is monitored 24 seven by the Google cameras that exist everywhere. 1476 01:15:24,207 --> 01:15:27,097 You know, and they're nice little plastic, you know, beautiful designed. 1477 01:15:27,352 --> 01:15:27,802 whatever. 1478 01:15:28,142 --> 01:15:31,062 And if you don't like it, you can go down the street to the Apple town where 1479 01:15:31,062 --> 01:15:34,292 everything is run by Apple and Apple has slightly different values from Google. 1480 01:15:35,062 --> 01:15:37,902 And I happen to like Apple's philosophy on privacy more than Google's, 1481 01:15:38,232 --> 01:15:39,542 but it's the same kind of world. 1482 01:15:39,612 --> 01:15:44,369 And I personally believe in democracy and I like that my streets aren't owned 1483 01:15:44,369 --> 01:15:47,486 by a company, call me crazy, but yeah. 1484 01:15:47,486 --> 01:15:50,956 And I don't know how it interacts with AI, but I feel like we've got, I don't know. 1485 01:15:50,966 --> 01:15:54,201 It's like, we've got this opportunity to being more creative, to make 1486 01:15:54,201 --> 01:15:57,571 more stuff, to not need billions of dollars of funding, and it's up 1487 01:15:57,571 --> 01:15:58,651 to us what we want to do with that. 1488 01:15:59,391 --> 01:16:03,871 And maybe it's a stretch and maybe I'm putting words in your mouth here, but, at 1489 01:16:03,871 --> 01:16:09,407 least you've used the word democracy, and, maybe that is also like something that 1490 01:16:09,757 --> 01:16:14,887 people see in local-first that is almost a more democratic approach to software. 1491 01:16:15,647 --> 01:16:16,827 Yeah, I really agree. 1492 01:16:16,917 --> 01:16:20,447 it's like, I care about local-first software the most for creative work, 1493 01:16:20,557 --> 01:16:22,807 for like, if I'm composing a song. 1494 01:16:23,062 --> 01:16:23,832 It's my song. 1495 01:16:24,182 --> 01:16:24,712 It's mine. 1496 01:16:24,822 --> 01:16:28,212 You know, it's not Google's or whichever cloud service I want to host that. 1497 01:16:28,442 --> 01:16:29,262 It's not theirs. 1498 01:16:29,482 --> 01:16:33,002 I don't want them to be able to look in it or change it or monetize 1499 01:16:33,012 --> 01:16:35,172 it or sell it on or anything else. 1500 01:16:35,242 --> 01:16:36,262 It's my work. 1501 01:16:36,432 --> 01:16:38,062 And if I want to work with you. 1502 01:16:38,347 --> 01:16:39,477 On making that song. 1503 01:16:39,707 --> 01:16:44,087 It should exist on both of our computers and be transmitted between our computers. 1504 01:16:44,177 --> 01:16:48,427 It's ours, you know, like there's some, I don't know, it feels like some principle. 1505 01:16:48,427 --> 01:16:49,427 It just feels so obvious. 1506 01:16:49,427 --> 01:16:51,577 And I don't know how I could possibly justify it. 1507 01:16:51,577 --> 01:16:52,619 It feels axiomatic. 1508 01:16:52,881 --> 01:16:55,831 I think a lot of people don't realize just how much, you know, Art and I feel like 1509 01:16:55,831 --> 01:16:58,541 I'm probably preaching to the converted with, you know, with a crowd listening 1510 01:16:58,541 --> 01:17:02,887 to this podcast, but we forget how much our computering experience is moderated 1511 01:17:02,887 --> 01:17:05,017 by big corporations, like big companies. 1512 01:17:05,407 --> 01:17:08,507 And I think that's really sad because our computers are amazing. 1513 01:17:08,702 --> 01:17:12,032 You know, like the computer sitting at your desk, like, I often think about this, 1514 01:17:12,082 --> 01:17:17,092 that computers are like, like two to five gigahertz, two to five billion things 1515 01:17:17,092 --> 01:17:20,922 every second, like, wow, you know, like, that's a lot of, that's a lot of steps. 1516 01:17:21,202 --> 01:17:23,932 And you can make those steps do anything you want, like you can write any 1517 01:17:23,932 --> 01:17:25,902 program, totally free in that regard. 1518 01:17:26,242 --> 01:17:28,142 So we could make programs that. 1519 01:17:28,397 --> 01:17:31,827 To do whatever service, whatever needs we want that we'll be able 1520 01:17:31,827 --> 01:17:34,547 to, you know, we've got all the technology, we've got CRDTs, and we've 1521 01:17:34,547 --> 01:17:37,817 got access to low level networking primitives and all of this stuff. 1522 01:17:38,114 --> 01:17:40,134 but I really want good software. 1523 01:17:40,207 --> 01:17:44,007 so that if I want to, like, I don't know, I want to make a diagram for a paper 1524 01:17:44,027 --> 01:17:45,477 that I've got good tools to do that with. 1525 01:17:45,517 --> 01:17:48,954 And I want to just whatever it is, I've got a bunch of photos and I want to share, 1526 01:17:49,014 --> 01:17:50,514 I've been getting into photography lately. 1527 01:17:50,764 --> 01:17:52,014 I want to share my photos with my friends. 1528 01:17:52,134 --> 01:17:54,174 I want to be able to just have software that lets me do that easily. 1529 01:17:54,561 --> 01:17:55,981 you know, like I really want to have. 1530 01:17:56,146 --> 01:17:56,936 collaborative software. 1531 01:17:56,936 --> 01:17:59,876 I want to be able to run a DND campaign on a, on a Wave or something that's 1532 01:17:59,996 --> 01:18:04,076 Wave like where it's not like owned by Google's computers and we have to all 1533 01:18:04,076 --> 01:18:07,456 agree to Google's terms of service to be able to continue having access to that. 1534 01:18:07,736 --> 01:18:09,716 It should just be something that we can all access. 1535 01:18:09,716 --> 01:18:12,526 And if I want to write some new custom software to help me run my 1536 01:18:12,526 --> 01:18:15,936 DND campaign, I want to be able to do that too and have it interact with the 1537 01:18:15,936 --> 01:18:17,566 same data model as everything else. 1538 01:18:17,933 --> 01:18:24,316 So yeah, I fully agree and I think often people who are not as comfortable yet 1539 01:18:24,350 --> 01:18:28,974 in the local-first bubble as, as we are, I think a lot of people kind of think 1540 01:18:28,984 --> 01:18:31,087 like, okay, why does local-first matter? 1541 01:18:31,382 --> 01:18:36,482 Maybe if, there's sort of the, this dystopian future where I can't trust 1542 01:18:36,482 --> 01:18:41,612 the government, I can't trust the clouds, I'm like a persecuted minority, 1543 01:18:41,952 --> 01:18:48,202 whatever it is, like, but it has people only assume local-first to be like 1544 01:18:48,222 --> 01:18:53,135 meaningful, when you're kind of, when a dystopian future has already arrived. 1545 01:18:53,475 --> 01:18:57,800 And I think you don't, sure, local-first is very meaningful in that part, but 1546 01:18:57,800 --> 01:19:01,240 that's not what I'm like a I'm optimist. 1547 01:19:01,250 --> 01:19:04,244 So I don't, anticipate a dystopian future. 1548 01:19:04,684 --> 01:19:06,914 And so I'm not a prepper, et cetera. 1549 01:19:07,090 --> 01:19:08,600 I'm not a local 1st prepper. 1550 01:19:08,867 --> 01:19:10,507 I'm a local 1st player. 1551 01:19:10,557 --> 01:19:15,714 Like, I want to have more of, like, the local for the playful state of mind. 1552 01:19:15,724 --> 01:19:22,084 Like, I. I'm so fortunate and privileged that I get to do what I love and, 1553 01:19:22,150 --> 01:19:24,170 still, like, make a living from it. 1554 01:19:24,260 --> 01:19:28,761 And, like, my ideal day that I, like, that I live each day is, like, that I had 1555 01:19:28,761 --> 01:19:32,151 a, like, a day full of play, basically. 1556 01:19:32,171 --> 01:19:37,471 And for me, play here means, like, discovering things, like, losing sleep 1557 01:19:37,481 --> 01:19:42,421 over a hard problem, but then getting the joy out of solving that and having sort 1558 01:19:42,421 --> 01:19:45,081 of my own agency over what I'm doing. 1559 01:19:45,651 --> 01:19:51,444 And, I think even like when a child plays, like a child is not told, like 1560 01:19:51,444 --> 01:19:56,921 now you have to build this thing, but it's their own agency to do what they 1561 01:19:56,921 --> 01:19:59,211 feel like and pursue their own goals. 1562 01:19:59,211 --> 01:20:01,161 And I think local-first can. 1563 01:20:01,491 --> 01:20:06,192 And able that in a similar way, how the web has lowered the bar 1564 01:20:06,192 --> 01:20:10,625 so much and therefore increase the agencies of individuals. 1565 01:20:10,625 --> 01:20:14,155 Like, and I think the same thing is happening right now with like AI assist 1566 01:20:14,205 --> 01:20:20,015 tools, where the barrier comes down even more for non programmers to build things. 1567 01:20:20,025 --> 01:20:22,752 It gives them agency, gives them ways to. 1568 01:20:23,347 --> 01:20:27,927 Playfully build things and I have the same hope for local-first 1569 01:20:27,947 --> 01:20:32,087 that it brings down one of the big barriers, which is data management. 1570 01:20:32,177 --> 01:20:34,257 And I'm very excited about that. 1571 01:20:34,717 --> 01:20:34,837 Yeah. 1572 01:20:34,837 --> 01:20:35,187 Me too. 1573 01:20:35,507 --> 01:20:35,777 Yeah. 1574 01:20:35,777 --> 01:20:38,587 I feel like there's a bunch of ways that we could be building better software. 1575 01:20:38,968 --> 01:20:43,045 And, I just want all my programs to interoperate, you know, If I'm editing 1576 01:20:43,065 --> 01:20:46,915 a text document, I want to be able to be typing something in a text editing 1577 01:20:46,915 --> 01:20:50,862 environment on my laptop and then, you know, I run out the door and I'm on a 1578 01:20:50,862 --> 01:20:54,352 train and I just opened up my phone and I can keep on editing it and I want all of 1579 01:20:54,352 --> 01:20:59,402 my software to work like that and I want there to be And it's like on, on Unix, 1580 01:20:59,402 --> 01:21:00,792 we have this sort of open file system. 1581 01:21:00,812 --> 01:21:03,712 There's any program can interact with the file system and edit files, which 1582 01:21:03,712 --> 01:21:06,732 is great except that the file system makes it really hard for two programs 1583 01:21:06,732 --> 01:21:09,812 to edit a file at the same time and have anything meaningful come out at all. 1584 01:21:10,292 --> 01:21:14,552 So most programs don't really interact with each other around the data unless 1585 01:21:14,552 --> 01:21:17,532 one program sort of saves something and another program opens it up later 1586 01:21:17,812 --> 01:21:20,142 and then you do something in that program and save something else out 1587 01:21:20,162 --> 01:21:21,112 and it has something else open it. 1588 01:21:21,492 --> 01:21:23,072 But with local-first software, I want. 1589 01:21:23,427 --> 01:21:26,667 Sort of like an ecosystem of all the programs on my computer to be interacting. 1590 01:21:27,117 --> 01:21:30,777 And then I also want to be able to have programs on my computer 1591 01:21:30,777 --> 01:21:31,957 and your computer interacting. 1592 01:21:32,267 --> 01:21:34,197 I feel like that should just be really easy to do. 1593 01:21:34,247 --> 01:21:37,272 Like it It's something that should be out of the box, and if every programmer 1594 01:21:37,272 --> 01:21:40,202 needs to re implement it and reinvent it from scratch, it's never going 1595 01:21:40,202 --> 01:21:43,372 to happen, but it's something that could just be built into the system. 1596 01:21:43,632 --> 01:21:48,742 I like this way of thinking about it, since my primary goal for local-first 1597 01:21:48,762 --> 01:21:54,002 right now is, like, step one is make it super, super easy, bring down the 1598 01:21:54,002 --> 01:21:56,222 barrier to build something meaningful. 1599 01:21:56,472 --> 01:22:02,022 For myself or a small group of people at all, but then step two, even 1600 01:22:02,022 --> 01:22:06,215 wider vision is like, okay, let's bring together those experiences 1601 01:22:06,215 --> 01:22:08,115 and bring them together in a way. 1602 01:22:08,115 --> 01:22:11,995 That's not just sort of like a, a best effort kind of thing where like, 1603 01:22:12,015 --> 01:22:14,575 oh, yeah, export JSON over here. 1604 01:22:14,835 --> 01:22:16,005 import over there. 1605 01:22:16,045 --> 01:22:19,865 And like, now it's like, you only have people's last names or something, 1606 01:22:20,145 --> 01:22:22,345 but at least there's some existence. 1607 01:22:22,655 --> 01:22:27,115 But I think this is almost like a second chapter that will probably take 1608 01:22:27,125 --> 01:22:31,765 a lot of effort and we need the solid foundations first, but the, yeah, the 1609 01:22:31,765 --> 01:22:36,468 prize of local-first can, ultimately lead to data interop in the same ways. 1610 01:22:36,468 --> 01:22:41,710 Like our brain doesn't work in silos, but our brain, like when the conversation 1611 01:22:41,710 --> 01:22:46,680 I'm having with you, I'm taking some ideas away from that and maybe bring 1612 01:22:46,680 --> 01:22:48,570 them to another conversation I have. 1613 01:22:48,830 --> 01:22:51,420 So my brain is already that big data bus. 1614 01:22:52,480 --> 01:22:55,340 And that is a promise that local-first can fulfill. 1615 01:22:55,853 --> 01:22:57,163 Yeah, I absolutely agree. 1616 01:22:57,223 --> 01:22:58,765 And so I feel like there's that piece. 1617 01:22:58,795 --> 01:23:01,355 And then the other piece is, there's things that we have as software 1618 01:23:01,355 --> 01:23:02,975 engineers that everyone should have. 1619 01:23:03,352 --> 01:23:06,395 my girlfriend works, she uses a, there's a content management 1620 01:23:06,395 --> 01:23:07,785 system that she uses at her work. 1621 01:23:07,935 --> 01:23:11,555 And I have access to, because I'm a software engineer, I use Git. 1622 01:23:11,850 --> 01:23:15,750 And with Git, I can have branches, and I can have pull requests, and I can see 1623 01:23:15,750 --> 01:23:17,320 all the changes and history of changes. 1624 01:23:17,590 --> 01:23:19,920 we've built those tools for ourselves, and then we haven't built them for 1625 01:23:19,920 --> 01:23:21,330 anyone else in any other industry. 1626 01:23:21,410 --> 01:23:22,860 And that, to me, is totally crazy. 1627 01:23:23,130 --> 01:23:25,350 It's like no one else, you know, like, we've kind of been really 1628 01:23:25,350 --> 01:23:26,500 selfish as software engineers. 1629 01:23:27,505 --> 01:23:27,815 It's 1630 01:23:27,855 --> 01:23:29,845 that's rule in the real world. 1631 01:23:30,115 --> 01:23:31,225 Yeah, exactly. 1632 01:23:31,285 --> 01:23:31,685 Exactly. 1633 01:23:31,685 --> 01:23:31,925 Right. 1634 01:23:31,955 --> 01:23:36,165 Yeah, but with local-first software, I, you know, like with these, these 1635 01:23:36,165 --> 01:23:39,115 primitives with these different ways of approaching software, I feel like 1636 01:23:39,115 --> 01:23:43,308 we can make a set of, primitives that should allow any program to do that. 1637 01:23:43,703 --> 01:23:46,333 Like it's, I'm really happy with the Ink and Switch guys and the work 1638 01:23:46,333 --> 01:23:47,610 that they're doing, guys and gals. 1639 01:23:47,757 --> 01:23:50,447 but there's also, like, I feel like that should just be the standard set of 1640 01:23:50,447 --> 01:23:52,417 primitives for most things I do, you know? 1641 01:23:52,677 --> 01:23:55,287 I want to be able to open up Photoshop and be editing a document 1642 01:23:55,307 --> 01:23:57,757 and have some commit type thing. 1643 01:23:57,777 --> 01:24:00,997 And if you're using a different image editing program, I should be 1644 01:24:00,997 --> 01:24:03,697 able to share it with you and you can just open up the document too. 1645 01:24:03,967 --> 01:24:06,673 And then if, I want to write some script that's going to interactively 1646 01:24:06,843 --> 01:24:10,173 make changes to the document that I'm editing, like the image I'm editing, 1647 01:24:10,313 --> 01:24:13,373 I should be able to have a, like a little program that just interacts with 1648 01:24:13,383 --> 01:24:16,563 the same data model that both of these programs we're using can interact with. 1649 01:24:16,913 --> 01:24:20,193 And it, it should let us, you know, and then also have the change history 1650 01:24:20,193 --> 01:24:22,693 and we can look through the history of changes and see who did what. 1651 01:24:22,723 --> 01:24:25,847 And we can have pull requests on a video editing session. 1652 01:24:25,847 --> 01:24:28,307 If we're editing a video together, I want to be able to have a 1653 01:24:28,307 --> 01:24:31,167 pull request on a different way that the edit comes together. 1654 01:24:31,537 --> 01:24:34,077 Like all of those kinds of things should just be built into the primitives 1655 01:24:34,107 --> 01:24:35,147 of the software that we write. 1656 01:24:35,377 --> 01:24:36,397 and the software that we use. 1657 01:24:36,457 --> 01:24:40,077 And, you know, like I was talking to someone recently who was saying, 1658 01:24:40,127 --> 01:24:42,717 he was like, Oh, I don't know how to explain it to the programmers that 1659 01:24:42,887 --> 01:24:44,197 the people want all of these things. 1660 01:24:44,197 --> 01:24:47,587 And I said, I was like, Oh, well tell them, imagine if you didn't 1661 01:24:47,587 --> 01:24:50,357 get to use Git and you went back to the world where it was like, you 1662 01:24:50,357 --> 01:24:52,497 know, blah, final, final to final. 1663 01:24:52,497 --> 01:24:53,917 No, actually the real final version. 1664 01:24:54,297 --> 01:24:57,447 This is actually the world that most people who aren't software engineers. 1665 01:24:57,562 --> 01:24:59,702 live in with most of the programs that they use today. 1666 01:25:00,045 --> 01:25:02,455 you know, in the best case, they've got, they've got something like Google Docs 1667 01:25:02,525 --> 01:25:06,517 that, you know, makes a little bait and switch where they have exactly the change 1668 01:25:06,517 --> 01:25:07,837 control that Google allows you to have. 1669 01:25:08,127 --> 01:25:11,457 And by the way, last I checked, Google's API for Docs doesn't actually give 1670 01:25:11,457 --> 01:25:12,647 you the change history of a document. 1671 01:25:12,997 --> 01:25:16,477 So, you know, once Google's got that change history, it's locked away in their 1672 01:25:16,477 --> 01:25:19,627 servers and you can't do anything with it or interact with it or even download 1673 01:25:19,627 --> 01:25:20,817 it for yourself, which is a real pity. 1674 01:25:21,283 --> 01:25:25,263 but we can just have programs and files living on our hard drives 1675 01:25:25,313 --> 01:25:28,203 and edit them and edit them with other people and see the change 1676 01:25:28,203 --> 01:25:29,443 history and do whatever we want to. 1677 01:25:29,713 --> 01:25:31,153 And I want everyone to have that capacity. 1678 01:25:31,233 --> 01:25:33,623 So, yeah, like it's obvious, right? 1679 01:25:33,988 --> 01:25:38,383 yeah, that's another great way to, to kind of think about the future. 1680 01:25:38,383 --> 01:25:42,333 Like, what have we as programmers figured out and how can we bring it? 1681 01:25:42,503 --> 01:25:46,553 How can, how can we reduce the distance of Seph's rule here? 1682 01:25:46,883 --> 01:25:51,263 And, how can we bring a lot of those things that for us are obvious? 1683 01:25:51,483 --> 01:25:56,323 into other programs, but I think that the reality is, it's not that some 1684 01:25:56,353 --> 01:25:58,223 product manager hasn't thought of it. 1685 01:25:58,607 --> 01:26:03,137 product managers have like, it's almost like the peak of the iceberg meme. 1686 01:26:03,463 --> 01:26:07,963 only the stuff that's floating above the sea level, that is the stuff that 1687 01:26:08,003 --> 01:26:12,927 was actually important enough and viable enough to build the stuff underneath 1688 01:26:13,282 --> 01:26:17,582 it's not built yet, it was thought of, but it was just too hard and not 1689 01:26:17,592 --> 01:26:20,052 meaningfully important enough to ship. 1690 01:26:20,482 --> 01:26:23,062 And I think local-first can bring down the cost of that. 1691 01:26:23,532 --> 01:26:27,655 Yeah, I couldn't agree more, and it's not just, too hard, it's even if they 1692 01:26:27,655 --> 01:26:30,805 do it, they've done it just for their application, you know, and so every 1693 01:26:30,805 --> 01:26:34,085 application ends up with its own bespoke way to do change editing and change 1694 01:26:34,085 --> 01:26:36,505 histories and everything else, and then none of them are collaborative, not 1695 01:26:36,505 --> 01:26:39,725 like none of them are interoperable, like what we really need is we need 1696 01:26:39,725 --> 01:26:43,680 something like the file system where every program that exists can interact 1697 01:26:43,680 --> 01:26:45,060 with some standard set of primitives. 1698 01:26:45,350 --> 01:26:48,370 And then every program can take for granted that the file system exists 1699 01:26:48,410 --> 01:26:49,680 and it sits underneath the program. 1700 01:26:50,110 --> 01:26:53,120 And then, if you have something like that, not only is it really easy for, 1701 01:26:53,290 --> 01:26:56,380 you know, product managers to build these features into their applications, which 1702 01:26:56,400 --> 01:26:59,150 I promise you, I agree with you, I've talked to a lot of them, they'd love it. 1703 01:26:59,180 --> 01:27:00,740 They really want collaborative editing. 1704 01:27:00,770 --> 01:27:01,710 You know, everyone wants this. 1705 01:27:02,187 --> 01:27:04,947 so not only could they do it easily, but then all of the collaborative 1706 01:27:04,947 --> 01:27:06,977 editing tools can all work together. 1707 01:27:07,027 --> 01:27:10,637 You know, they can all interoperate, which would just be so obviously great. 1708 01:27:12,038 --> 01:27:14,948 It's some people will like Vim and some people like Emacs and 1709 01:27:14,948 --> 01:27:16,058 some people like something else. 1710 01:27:16,098 --> 01:27:19,198 And, you know, why not have our documents able to be edited in 1711 01:27:19,218 --> 01:27:20,478 all of those programs, you know? 1712 01:27:20,768 --> 01:27:21,188 Yeah. 1713 01:27:21,528 --> 01:27:26,648 So I'm so grateful that we got to explore all of those ideas 1714 01:27:26,658 --> 01:27:28,958 that are clearly on your mind. 1715 01:27:28,998 --> 01:27:33,678 And I'm, Also so grateful for everyone who's making that a reality particular 1716 01:27:33,678 --> 01:27:37,998 shout out goes there to to Ink and Switch anyone who's really like defying 1717 01:27:37,998 --> 01:27:43,548 the strategy of the commons for like for software and I just want to see 1718 01:27:43,588 --> 01:27:47,948 more of that and I think a big step of that is like to like step one is 1719 01:27:47,948 --> 01:27:51,922 inspire people like open people's eyes of like, oh, we can do better. 1720 01:27:52,232 --> 01:27:57,432 and yeah, so with that, I just want to thank you so much for your 1721 01:27:57,432 --> 01:28:01,775 time, like, sharing all that we've already, when quite extensive on this 1722 01:28:01,775 --> 01:28:03,395 conversation, I feel like there is. 1723 01:28:03,520 --> 01:28:08,237 A lot of stuff that we should probably explore in a follow up conversation. 1724 01:28:08,267 --> 01:28:12,367 And we've already foreshadowed quite a bit of like what the folks at Ink and Switch 1725 01:28:12,377 --> 01:28:14,187 are brewing with Patchwork, et cetera. 1726 01:28:14,187 --> 01:28:17,607 So I'm really looking forward to learning more about that as well. 1727 01:28:18,117 --> 01:28:23,933 but, yeah, maybe the audience, if they want to see you, in person, we're 1728 01:28:23,933 --> 01:28:28,469 also planning the next local-first conference where, if everything works 1729 01:28:28,469 --> 01:28:30,439 out, you might be a speaker as well. 1730 01:28:30,739 --> 01:28:35,509 So, happily invite everyone to come to Berlin at the end of May, for 1731 01:28:35,625 --> 01:28:38,992 the conference and, to get a chance to talk to you in person as well. 1732 01:28:39,712 --> 01:28:40,852 I think that would be marvelous. 1733 01:28:40,922 --> 01:28:42,732 And I really want to echo that. 1734 01:28:42,762 --> 01:28:44,952 Thank you for all of the people that are doing the hard work. 1735 01:28:44,962 --> 01:28:47,062 I feel like this is something that's complicated enough. 1736 01:28:47,062 --> 01:28:47,952 We can't do it alone. 1737 01:28:48,122 --> 01:28:48,482 And. 1738 01:28:48,907 --> 01:28:51,387 You know, one of the beautiful things about software that is, lets 1739 01:28:51,387 --> 01:28:55,007 you do collaborative editing is We can collaborate on all of that. 1740 01:28:55,130 --> 01:28:55,487 Exactly. 1741 01:28:55,507 --> 01:28:59,667 And it's even like a virtual cycle where people working on that 1742 01:28:59,677 --> 01:29:01,247 makes it easier to collaborate. 1743 01:29:01,267 --> 01:29:05,847 So yeah, that's a very optimistic and hopeful vision for the future 1744 01:29:05,847 --> 01:29:07,267 with many challenges ahead. 1745 01:29:07,717 --> 01:29:10,047 But yeah, I want to end on a positive note. 1746 01:29:10,217 --> 01:29:14,607 Seph, thank you so much for like, yeah, sharing all of your 1747 01:29:14,927 --> 01:29:16,667 wisdom and thoughts with us here. 1748 01:29:17,057 --> 01:29:17,477 Thank you. 1749 01:29:18,517 --> 01:29:19,627 Thank you for inviting me. 1750 01:29:19,720 --> 01:29:22,840 this is lovely and I hope we have a chance to chat more in the future. 1751 01:29:23,546 --> 01:29:25,966 Thank you for listening to the localfirst.fm podcast. 1752 01:29:26,196 --> 01:29:28,646 If you've enjoyed this episode and haven't done so already, please 1753 01:29:28,916 --> 01:29:30,626 Please subscribe and leave a review. 1754 01:29:31,066 --> 01:29:33,626 Please also share this episode with your friends and colleagues. 1755 01:29:33,996 --> 01:29:36,986 Spreading the word about the podcast is a great way to support 1756 01:29:36,986 --> 01:29:38,866 it and to help me keep it going. 1757 01:29:39,376 --> 01:29:43,876 A special thanks again to Convex and ElectricSQL for supporting this podcast. 1758 01:29:44,276 --> 01:29:45,036 See you next time.