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.