
localfirst.fm
·E21
#21 – Seph Gentle: Google Wave, eg-walker, creativity, AI
Episode Transcript
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.