0:48:48 I mean, fundamentally as engineers,
you navigate them one by one, you
0:48:52 know, while sweating profusely.
0:48:55 That's how that goes, I think.
0:48:56 yeah, I feel like there's, there's
a bunch of interesting problems in
0:48:58 all of the things that you've said.
0:49:00 I had a few, couple small conversations
with PVH, talking about, he built this
0:49:04 thing based around lenses of, of how
data can evolve over time in a Cambria.
0:49:09 That was it.
0:49:09 Yeah.
0:49:10 Um, in local-first software.
0:49:11 And I have a bunch of my
own thoughts about that.
0:49:13 And you know, like I've got
designs in mind that I'd love
0:49:16 to experiment and play with.
0:49:18 So there's something there, which is,
you know, like it's really interesting.
0:49:21 HTML, has evolved beautifully over time.
0:49:24 Like HTML has barely changed at
all since it was first introduced.
0:49:28 like we've introduced new tags,
but almost like all of the
0:49:30 tags still follow the same.
0:49:32 Fundamentally XML style
structure, and that's wonderful.
0:49:36 It's wonderful.
0:49:36 It's been able to evolve like that.
0:49:38 Email has evolved slightly
less gracefully, but emails.
0:49:41 I think email up email programs
from the 70s probably still work
0:49:44 today with most modern emails,
which is incredible, even though.
0:49:48 Email messages themselves are
almost impossible to pass correctly.
0:49:51 And, I've got a lot of
thoughts about that as well.
0:49:53 I've got some friends who work at
FastMail and they've, pinned me to the
0:49:55 wall with things about email that I
had no idea about that are horrific.
0:49:59 but there's this open problem,
which is how can data models change.
0:50:02 So there's a, set of problems
there, which I'd love to solve.
0:50:05 There's a set of problems around,
how is our data stored and sent.
0:50:09 in my mind, what I would
really like to have is.
0:50:11 I feel like there's some kinds of programs
where I actually really You know, I'm so
0:50:16 sorry to the Ink and Switch folks, I'm
quite happy for there to be a centralized
0:50:18 server for Discord, or for IRC.
0:50:20 For something like that, when there's
a place that we all go to, I'm quite
0:50:23 happy for there to be one computer
that's authoritative and decides, you
0:50:26 know, all of the messages that are and
aren't part of the log of messages.
0:50:30 I feel the same way about banks.
0:50:32 I'm more than happy for them to use
a centralized transactional database.
0:50:35 I'm not a Bitcoin absolutist by any means.
0:50:37 I think decentralized
databases work great.
0:50:39 but I'd really like some set of
primitives where, The primitives that
0:50:41 I use in my computer program, like what
I embed into my program and use, are
0:50:45 the same set of primitives that I could
use either with a centralized server,
0:50:48 which has transactions and various
other ergonomics, or with something
0:50:51 like Automerge or Yjs, where, I'm
actually collaboratively editing a CRDT.
0:50:56 And I feel like there's a lot of overlap
there around what's the shape of the data.
0:50:59 What does the change look like?
0:51:01 You know, subscriptions, which
also you almost always want
0:51:03 in a centralized use case.
0:51:05 and then there's a bunch of
questions around performance.
0:51:08 so I wrote a CRDT library of my own called
Diamond Types I haven't kept up with all
0:51:11 of the demands that I've made of myself.
0:51:13 busy and distracted, but I use that.
0:51:15 That was the test bed in original
place where I built Eg-walker,
0:51:18 which is an algorithm that I've
written a paper on, which is just
0:51:20 for collaborative text editing.
0:51:21 and I wanted to make
it really, really fast.
0:51:23 And people kept saying, well,
but don't you know that if you
0:51:26 collaboratively edit a text document
in something like Yjs or Automerge,
0:51:29 it stores every single keystroke
that's ever made to the document.
0:51:32 And these documents are going to get
huge, and we need some way to be able to
0:51:35 prune history, and it's really important.
0:51:37 So I said, well, Look, that might,
I agree, I think that's a very
0:51:40 interesting and important problem.
0:51:42 But let's first start, let's just
start by trying to make it as fast
0:51:45 as possible and as small as possible.
0:51:46 So, you know, even if we prune
it, it's going to be pruned
0:51:49 to be even smaller regardless.
0:51:50 this is always when I do a lot of
performance work and people, a lot of
0:51:54 times people reach for multi threading.
0:51:56 Let's, let's spawn it across lots of
threads on your computer, which is a fine
0:51:59 approach, but It's almost always better
to start with trying to make it run as
0:52:02 fast as you can on one thread before
you run it across multiple threads.
0:52:04 I mean, this is why the M1 series
of, of Apple was like such a big
0:52:08 deal because it showed like, okay,
we can actually do a lot better even
0:52:12 in a single threaded environment.
0:52:15 Exactly.
0:52:15 Yeah, but It turns out that, the
collaboratively editable text documents
0:52:19 don't actually grow very fast.
0:52:21 the amount of data, the number
of bytes on disk is tiny.
0:52:23 And, and yeah, like I think
that it might be useful to
0:52:25 build software to prune anyway.
0:52:27 And I've got a bunch of, you know, like
I've thought a lot about that problem
0:52:29 because people keep talking about it.
0:52:30 but from an engineering perspective,
a lot of the time we can just keep all
0:52:33 of the data and it's actually fine.
0:52:34 We just need to, for example, store
it in some slightly more efficient
0:52:37 way sometimes than raw JSON.
0:52:38 And, you know, and like, that's the
thing that we need to think about.
0:52:41 modern computers are so fast.
0:52:43 Like, yeah,
0:52:44 I feel like similar to what you've
mentioned before with quoting Paul
0:52:49 Graham of like, what was the quote again?
0:52:52 It's it's what would it be ridiculous
to not have in a hundred years?
0:52:55 Yeah, exactly.
0:52:56 So you imagine a hundred years, it's
like, we still don't have something.
0:52:58 It's crazy.
0:52:59 Then it's, okay, well, if we didn't have
that in 100 years, it would be crazy.
0:53:02 Could we just build it today?
0:53:04 Exactly.
0:53:05 So similar to that, we can also ask
ourselves more often, like, Which things
0:53:10 would actually be totally fine that
historically we always like shied away
0:53:14 from and that sort of like by now, there's
sort of like this, picture of like a baby
0:53:20 elephant kind of, pinned to a pole and
it's like, it has learned it cannot escape
0:53:25 and now it's, a full upgrown, elephant
and still, pinned to this tiny pole.
0:53:29 I think there's like, a lot of
similar stuff, the way, how we go
0:53:33 about programming and we need to
unlearn, forget about some things.
0:53:38 And this is, I feel like also why
some of the most brilliant, new
0:53:42 technologies are by people, by, by
newcomers, like new generations of
0:53:47 programmers who are like blissfully
unaware of some of like the old stigma.
0:53:53 And this is how we get new ideas as well.
0:53:56 yeah, I really agree with that.
0:53:57 there's something that it doesn't,
I keep thinking about, there
0:53:59 was a, there was the Unix room.
0:54:01 So Unix was invented in a place by some
people and they sat in a room together and
0:54:06 they had one computer and they would write
programs and show them to each other.
0:54:08 And someone wrote spell, you know,
and, and someone wrote like, they
0:54:12 wrote these different little Unix
programs and said, Hey, check it out.
0:54:15 And then, some people, made the
pipe operator and made piping work.
0:54:18 And they started to be able
to connect these programs
0:54:20 together to be able to make.
0:54:21 You know, quite complex programs just as
a series of small programs pipe together.
0:54:25 This is a really beautiful
primitive, and it's a beautiful
0:54:28 thing that, someone created.
0:54:29 And we have it on all
of our modern terminals.
0:54:32 I think there's even a version on Windows,
but all Unixes have something like this.
0:54:35 I feel like at some point we gave
up trying to invent new kinds of
0:54:38 primitives like that, and I dunno
why, but it feels like the sort of
0:54:41 thing that we should be able to do.
0:54:43 Obviously, you know, I sometimes
think about, we've been
0:54:46 talking about the web a bit.
0:54:47 And, we have this beautiful idea,
which is, so we've got these
0:54:50 two different ideas right now.
0:54:52 We've got a desktop application, and
desktop applications have access to
0:54:55 everything that the user has access
to by default, which is interesting.
0:54:57 And Apple's trying to change this,
but keeps getting in trouble for it.
0:55:00 desktop applications are binaries.
0:55:02 They're always native
binaries on every platform.
0:55:04 And they have access to some
set of native, APIs and they
0:55:07 can make sys calls directly.
0:55:08 And then we have another set of
applications called web applications,
0:55:11 which is sandboxed by a browser and,
you know, historically only written
0:55:14 in JavaScript and written in a way
that they can operate on every, every
0:55:17 computer, but only inside the web browser.
0:55:19 And like.
0:55:20 Web applications are really successful, I
think, not because of the web browser, but
0:55:24 because you don't have to install them.
0:55:26 And people sort of forget this, but
they're kind of equivalent, except
0:55:29 this one you have to install for
some reason, and this one you don't.
0:55:32 And because you don't have to install
a web app, people spend a lot of
0:55:34 time optimizing them for size.
0:55:36 So you load up the New York Times and
it'll load a lot of Crap, probably,
0:55:40 but we're looking on the order of
maybe half a meg of JavaScript.
0:55:42 Maybe it's a couple megs of
JavaScript and some images.
0:55:45 Um, whereas if I install, you know,
I haven't actually tried this.
0:55:47 I'm going to get in trouble by
somebody who will actually go and
0:55:49 look, but you look at most iPhone
apps, for example, and they, there
0:55:53 are hundreds of megabytes in size.
0:55:54 I think the Uber app is like
300 megs or something crazy.
0:55:57 Like the Facebook app is huge
and it doesn't even have content.
0:56:00 Like it's not even like
the Uber app is loading.
0:56:02 It's like installing databases.
0:56:04 Who even knows what's in there?
0:56:06 But then web applications are written
in slow languages and I just feel like
0:56:09 it's like well, we could just make
a new platform and we could give it
0:56:13 a new kind of application where you
don't have to install it, but also it
0:56:15 gets access to some set of beautiful
native primitives that might be even
0:56:19 better than what the web provides
today for applications themselves.
0:56:22 Like the web obviously is
designed as a document.
0:56:25 Viewing platform and then we've could
have hacked on applications because it
0:56:28 was so convenient, and we could make
it so that data is just transparently
0:56:32 available and accessible between programs
beautifully using all of the tools and
0:56:36 technologies we've been talking about.
0:56:38 but no one works on this stuff because
we sort of take for granted, it's
0:56:41 like, there's the ruins of old Rome,
you know, and that's, that's like Unix
0:56:44 or it's the, you know, the machine
code and x86 assembly and then modern,
0:56:48 you know, people say, oh, well, Then
they build the web browser and then we
0:56:51 build on top of the web browser react.
0:56:53 And then you build an application on top
of react, but then the application slows.
0:56:56 So you do some other wacky
thing on top of that.
0:56:58 And it's like, you know, underneath the
city is this giant, you know, all of
0:57:02 these ruins that are all full of code
and all being used by modern programs.
0:57:06 But that so many people, particularly
young engineers, they have no
0:57:09 idea about all of this crap.
0:57:10 They just know that if they type the
right thing into a react application,
0:57:13 that they'll get something on the screen.
0:57:15 But all of that stuff, we can actually
like, you know, burn it all if we want
0:57:19 to, and then go and make beautiful things
right from the very base of computers.
0:57:23 Yeah.
0:57:24 I mean, I think there's this sort of
like innovators dilemma and I think this,
0:57:29 you mentioning email as an example, I
think this is one of the words, since
0:57:33 you, you just emails and browsers,
like you, you just cannot get away
0:57:38 with like not supporting the old stuff.
0:57:40 And this is where, If you build a
brand new thing, you don't have to,
0:57:45 account for all of like the historic
mess, and you can just start over.
0:57:49 And, I think this is probably just having
the, the courage or naivety to start over.
0:57:58 I think that that's highly underrated.
0:58:00 and also for the record, I've just
checked, blank loading New York times.
0:58:04 It's like currently five megabytes of
just javaScript and, depending on, well,
0:58:09 and 20 megs, of like other stuff that
I've loaded, like with images and so on.
0:58:14 So, I think that this just proves the
point, like even for New York times,
0:58:18 like five megs of JavaScript, it's fine.
0:58:21 I don't want to know how much of
that is like ads related, et cetera,
0:58:25 but, I just want to encourage
people to rethink their, like their
0:58:30 learned, thinking about trade offs.
0:58:33 Like we're, it's at the same time,
we're kind of indoctrinated with like,
0:58:37 okay, we need to make the initial
page load as quick as possible.
0:58:42 We always have connectivity.
0:58:44 I'd like to alter that slightly
and say like, when we're connected.
0:58:49 We probably have pretty good connectivity.
0:58:51 So let's embrace that, but we're,
not going to be always connected
0:58:55 for the moments where we don't
have perfect connectivity.
0:58:58 Let's, like piggyback on the times
when we had good connectivity and we
0:59:04 should just sync the deltas instead of
like reloading everything every time.
0:59:08 Also goes back to the build problem, the
build system problem that we had before.
0:59:14 Since we don't build things in a
principled enough way, so we don't
0:59:17 trust the stuff that was there before,
and so that leads to us reloading
0:59:22 everything from scratch all the time.
0:59:24 And, I think that's another big
culprit of, systems problems.
0:59:29 I read a great article a while ago,
comparing the size of JavaScript bundles
0:59:33 with War and Peace, saying like, you know,
could you, how many copies of War and
0:59:38 Peace could fit in your JavaScript bundle?
0:59:40 and it's quite a lot.
0:59:41 and the other thing I sometimes
think about is, how many bytes of
0:59:44 data would it take if you took a
screenshot of your website, even as a
0:59:48 PNG, and then sent me the screenshot,
would that be larger or smaller
0:59:52 than it takes to load your website?
0:59:54 And if the answer is that your
screenshot would be smaller than all
0:59:56 of the code that you send me, then
maybe you're doing something wrong.
0:59:59 but even then, like, yeah, I really
encourage people to also think
1:00:03 about from the perspective of,
the web browser, it's all code.
1:00:07 You know, if you, if you start digging,
it's code a really long way down.
1:00:11 And all of that code can be changed.
1:00:13 Like web browsers are open source.
1:00:14 I've got some quite famously,
infamously, I've got some source
1:00:17 code, in Google Chrome, to be able to
interact with Xbox game controllers.
1:00:20 I'm not sure if it's still
there, but, I wrote, a user land,
1:00:25 USB driver for Google Chrome.
1:00:28 so that if you're on Mac OS in
particular, so if you plug in an Xbox
1:00:30 game controller to a Mac computer and you
want to play video games, in browsers,
1:00:36 then the Xbox controller will work.
1:00:38 But there's so much stuff like that, that
like, you know, and I think that's almost
1:00:40 crazy that that, that is in Google Chrome.
1:00:43 it should be the operating system,
but there's lots of perimeters
1:00:45 that we could put in Google Chrome.
1:00:47 That would mean that, you know, if
there's some, if there are things
1:00:49 that we want to be able to have
access to as web developers, We can
1:00:52 build them in as primitives, and
everyone can get access to them.
1:00:54 Like, a lot of the standards committees,
you can just go to them, it turns out.
1:00:57 You know, like, there's open mailing
lists of the people that build
1:01:00 all of this stuff, and they're
just nerds like us, you know?
1:01:02 Like, they've just got all of
their own crotchety, angry opinions
1:01:05 that they'll tell you about if
you give them half a chance.
1:01:07 but, I don't know.
1:01:08 I feel like there's not enough
conversation around all this
1:01:11 stuff, how it could be better.
1:01:12 Going back slightly to the moment where
you reflected on that kind of the creation
1:01:19 of primitives, what I found, at least
looking back at my own creative work,
1:01:25 what I found easier to than just forcing a
primitive into existing out of thin air is
1:01:32 rather embrace sort of like organic chaos,
and then study it really hard and then
1:01:39 see basically out of the existing mess.
1:01:43 typically if you look hard enough,
if you observe hard enough, you
1:01:46 can, observe some things that
later can emerge as primitives.
1:01:53 And, this is where almost
paradoxically the more requirements
1:01:57 I apply on a certain system.
1:02:01 The more it becomes
like simpler over time.
1:02:05 And so I've basically just taken more
kind of like inner peace by like, not
1:02:10 knowing the primitives upfront right away.
1:02:13 I'm basically just trying
to solve the problem.
1:02:15 Like I happily say yes to a few
problems and I've had enough, past
1:02:22 experience where out of that mess.
1:02:24 through lucky coincidences, I realized,
okay, here's some useful, more general
1:02:30 primitives and in hindsight, those
primitives look very obvious and
1:02:34 someone who then looks at that system
and maybe builds a similar one, they
1:02:39 can already embrace those primitive
ideas and, build on top of them, the
1:02:44 beginning, but I think for novel, new
primitives, I think the most likely path
1:02:51 for them to come into existence is out
of emergence and not out of like forcing
1:02:56 them into existence out of thin air.
1:02:58 I agree with everything and I'm a
little bit dubious on that last point.
1:03:03 And just to push back a little
bit, I think that it's got to
1:03:05 be this push and pull, you know,
like they're both so important.
1:03:10 I really like what you said though.
1:03:11 Again, Rich Hickey, who, You
should watch all of his talks.
1:03:15 Anyone who's listening to this, he's
much more insightful than I will ever
1:03:18 be, I think, but he gave a talk once and
he said, he talked about hammock driven
1:03:22 development as in software development
driven by writing some code and then
1:03:27 going outside and lying in a hammock
and thinking really hard about it.
1:03:30 And just, just letting it percolate,
like letting the design that you've
1:03:34 come up with percolate and say, how does
this problem actually really want to be
1:03:37 solved if I were to do a good job at it?
1:03:39 and instead of sort of half arsing a
million things and having everyone across
1:03:43 the industry half arse the same set of
eight things, you know, lists and so
1:03:46 on, I don't know, I can't help but think
that if, if a few people spend some time.
1:03:51 Some serious time thinking a lot about
lists, we could have some really nice
1:03:54 lists in web browsers and all these
different things and then it would
1:03:57 just be solved for everybody, you know,
1:03:58 maybe this is, this is why I've
prefaced it with like, that's being
1:04:02 for me, the easier path, like for me,
step one is half arsing something.
1:04:07 And then looking at it, but I need to
have it be laid out wrong first for me
1:04:12 to spot, oh, this is, this is how right.
1:04:15 Looks like some more brilliant people
than me can probably skip step one.
1:04:20 But for me, this one has
been a more proven approach.
1:04:24 I mean, it's the same for me.
1:04:25 I used to teach programming and
something, you know, my students would.
1:04:29 Sort of sometimes come to me asking me
how they should design their program
1:04:32 before they even start writing any code.
1:04:34 And I'm convinced that you know
the least about your program,
1:04:38 like you know the least about the
program before you start writing it.
1:04:40 That's the time that you will
know the least that you will
1:04:42 ever know about this problem.
1:04:44 So you're the least qualified you're
ever going to be to design it correctly.
1:04:47 You know, so you become qualified by
throwing something on the screen and
1:04:51 then taking the time to reflect on the
knowledge that you've gained to figure out
1:04:54 how it could be written in a better way.
1:04:56 it's, yeah, I absolutely agree.
1:04:59 And I think this is also this underscore
is like one of the most important things
1:05:04 that I hold dearly in the craft of
software engineering, which is the ease
1:05:08 of iteration and the speed of iteration.
1:05:11 And this is where I spend a obscene
amount of time on just like making
1:05:15 so that I have fun and iterating.
1:05:19 That it's very cheap for me
to get it wrong 10 times and
1:05:23 it's fun to do every iteration.
1:05:26 but if it's gruesome to do one
iteration, then you just, run
1:05:30 out of like joy and energy.
1:05:32 Until you get to the right point.
1:05:34 So making the iteration cycles, it's
like, it sounds very obvious, but I
1:05:38 think very few people actually put
in the work since it's also partially
1:05:42 some pretty annoying work, like getting
your, like your monorepo set up, all
1:05:47 dialed in, like particular, like which
JavaScript package manager should you use?
1:05:51 Like all of like those stupid things,
but getting all of that stuff dialed in,
1:05:55 I think that the reward is, quite big.
1:05:58 I mean.
1:05:59 I assume that you've read this, but,
again, to plug more things that people
1:06:02 should read if they haven't, there's
that beautiful essay of Worse is
1:06:05 Better, that talks about all of this.
1:06:07 And I feel like, yeah, I think that
life exists like in the intersection
1:06:11 of thinking it through and just
throwing something at the wall.
1:06:14 And I think all good software is going
to have elements of both of these things
1:06:17 where, you know, there's not too much
upfront design and upfront thinking,
1:06:21 but there's not too little of it either.
1:06:22 You know, like there's got to be some
amount of time, but after you've written
1:06:25 a whole lot of code, you take a step back
and you say, how should this have been?
1:06:28 If I knew everything I knew
now, how would I build it?
1:06:30 And I think everything beautiful
and everything incredible has
1:06:33 a lot of those feedback loops.
1:06:35 Like I listened to an amazing talk at,
GDC, the Game Developers Conference,
1:06:38 once talking about this, and he said
essentially all good games are made
1:06:41 by having some ideas, writing them
in code, trying them out, and then
1:06:45 throwing out 80 percent of them because
they weren't very good ideas, but 20
1:06:47 percent of them were really good ideas.
1:06:49 And he said in that talk that
the quality of any program that
1:06:52 you make is proportional to the
number of iteration cycles you get
1:06:55 through, not how long one cycle is.
1:06:57 The number of iteration cycles,
just the sheer amount of repetition
1:07:01 that you go through in writing code,
reflecting, changing the code, making
1:07:05 it better, writing more code and so on.
1:07:07 And I think it's, yeah, I
think it's a beautiful idea.
1:07:10 I've been doing improv comedy classes
lately and over the last few years and
1:07:14 in improv we learn it's, you can't plan.
1:07:17 There's no planning.
1:07:17 You don't have a meeting with
your, the people you share the
1:07:20 stage with before the show starts.
1:07:22 So everything is just asking
the question of what comes next?
1:07:25 Like, which I feel like
is this life philosophy.
1:07:27 Just at every moment, what comes next?
1:07:29 And maybe what comes next
is writing more code.
1:07:31 And maybe what comes next is
stepping away and thinking about
1:07:33 the code and refactoring it.
1:07:34 But, like, I feel like that's
the right question just to
1:07:37 hold, you know, consciously.
1:07:39 so you've given me two segues now to
ask you about another topic that I
1:07:43 think is very top of mind for you.
1:07:44 So one is sort of this almost evolution,
like, nature evolution of software
1:07:50 and good products, et cetera, where
it's all about the iteration cycles.
1:07:53 That's like how biology works.
1:07:55 So this is why we as humans exist, et
cetera, and why other good things exist.
1:08:00 and then also asking the
question, what is next?
1:08:03 That is, that's the essence
of how an LLM works.
1:08:07 So I think you've been thinking
a lot about, the topic of AI and
1:08:11 what that means for our culture of
programmers and software creatives.
1:08:17 So I'm, I'm curious, what are some
of the leading questions for you
1:08:22 are when you're rethinking and
like digging into the topic of AI?