0:49:16 I think that's a nice segue.
0:49:17 And we've been mostly covering sort
of like the, the more cultural aspects
0:49:21 of Linear so far, given this is the
local-first podcast where we haven't
0:49:27 yet talked too much except for the
beginning about syncing, et cetera.
0:49:31 And I don't think we need to spend
another hour and hour going all
0:49:35 the way there, but maybe just
briefly connecting the dots there.
0:49:38 I think the reason.
0:49:40 that what gives you this competitive
advantage allows you to build that high
0:49:44 quality product is that you have laid that
foundation with the, the sync engine that
0:49:51 takes out of like the, the picture, the
entire complexity nightmare that, moving
0:49:57 data from A to B and back to A can be.
0:50:00 And so you've solved that and like
on your shoulders of Giant, now
0:50:05 the, the the, the product can be
built by people who don't have all
0:50:09 of that knowledge of data syncing.
0:50:12 And I think that is like a superpower
that enables new products like Linear.
0:50:17 Yeah.
0:50:17 I mean, I do have a talk
on, your conference on that.
0:50:20 It's, it's probably
available on YouTube as well.
0:50:23 If you want to, if you want to check it
out and put it into the, I don't know,
0:50:26 notes for this, this, this podcast.
0:50:28 But yeah, in short, like, The
initial idea of the sync engine was
0:50:32 not to make it developer friendly.
0:50:34 That sort of happened as an afterthought.
0:50:36 And that was, in my mind, maybe the
more more important aspect in the end.
0:50:41 Like, we wanted it to be fast and support
offline mode and enable, the application
0:50:45 to be quick and that is important, but
what we found out what, what we like even
0:50:49 more was that engineers would be able
to just ship features much, much faster
0:50:55 without having to think about a vast,
area of, of A functionality that usually
0:51:00 takes quite a bit of time, which is sort
of error handling or networking, waiting
0:51:03 for things to come back, supporting
two different code paths for like when
0:51:07 you make your local changes versus when
somebody else makes those edits for you.
0:51:12 It's all abstracted away so that you
don't need to think about these things.
0:51:16 And it works for certain
kinds of applications.
0:51:19 Definitely not all like if you're
building, something that has, a lot of
0:51:23 information or building a search engine
and obviously not, like, you need to be
0:51:26 able to have that data locally or pretty
close to your, to your clients and be able
0:51:31 to sort of fetch the pieces that you see
on screens and then keep them up to date.
0:51:35 But for anything that
resembles an application.
0:51:37 That has sort of a limited set of data,
and that data piece can, like, the
0:51:41 amount of data that you have in the
whole application can be large, but it
0:51:44 still needs to be limited to, what you
can browse at a , given point in time.
0:51:48 And then this model just
works absolutely beautifully.
0:51:51 And.
0:51:52 I sort of had this inkling at Uber
already, like, I don't want to
0:51:55 build anything in the traditional
sort of networking model anymore.
0:51:59 Like, I think sort of sync is such a
better user or developer experience.
0:52:04 And, and the Linear, like, it's, it's
clear that, I, I, I, well, I won't ever
0:52:09 have a job after Linear, but, if I did,
I, I, I would not work in any other way
0:52:14 than just doing a sync engine again.
0:52:16 I'm working in this environment
because it just makes the, yeah, the
0:52:20 developer experience so much faster
and you can just ship functionality.
0:52:22 Like, the easiest way to think about
it is to literally say that, you're
0:52:27 effectively just building the front end.
0:52:29 You have, data in memory, you've got
data objects, which you render on screen.
0:52:33 Then you modify those and that's it.
0:52:36 Your feature is done.
0:52:37 Everything else is handled,
the synchronization, other
0:52:40 users making the same edits.
0:52:42 There's nothing else you need to
do in order to build a feature.
0:52:45 You just build the frontend and
you're done with your entire feature.
0:52:49 And that's pretty powerful.
0:52:51 And I think that also like empowers the
already capable front end developers
0:52:57 even further, since I think so far
in this more traditional three tier
0:53:04 web app where you have your, your
front end that you're building.
0:53:07 And then somehow like you're doing your,
your fetches or RPC calls, et cetera.
0:53:13 But then you also need to worry about
like, okay, sorry, I need to serialize a
0:53:16 bit of data over there, send it over here.
0:53:19 Now I need to do something there.
0:53:21 And like, Oh, what if.
0:53:22 This now changes and I
need to send this back.
0:53:25 If we can take that entire part out of
the picture and front end developers are
0:53:30 only dealing with like the, the client
side state management, and that's it.
0:53:34 And then either you have, you're
relying on like a external sync engine
0:53:40 that already works super well for you
and you just need to integrate it, or
0:53:44 you have the luxury of having someone
like yourself in a team who builds
0:53:49 your own, runs it, et cetera, which
I think will be not always required.
0:53:55 I think the better the off the shelf
sync engines will get the more products
0:54:00 can already be built with that.
0:54:02 And I think someone like yourself
will rather be needed when a
0:54:06 product really diverges from
that, from that standard path.
0:54:10 And so I would probably say that
maybe in a couple of years from now,
0:54:15 you could probably build something
like Linear in terms of like the
0:54:19 data syncing capabilities with like
something like automerge, et cetera.
0:54:24 Some of those.
0:54:25 Upcoming sync engines, and then
it's probably rather a matter of can
0:54:30 it also handle all of the scaling
patterns and the extra user experience
0:54:35 patterns that you want to really nail.
0:54:38 I want to give an example of,
like, how hard RPC actually is.
0:54:42 Because I don't think people
understand, like, before they've tried
0:54:46 it out and then run into these edge
cases, which always are edge cases.
0:54:49 But once you run into them, you're
like, oh, shit, what do I do now?
0:54:53 You need to rethink your
entire architecture in order
0:54:55 to make that, make that work.
0:54:56 So A simple example, you've got,
some sort of model object and it
0:55:01 has two properties, and the user
makes a change to those properties
0:55:05 and sends it out as an RPC call.
0:55:08 And you're also connected with a WebSocket
to receive changes that other people do.
0:55:12 Now, you send out the RPC call and
wait for sort of acknowledgement
0:55:16 for the server um, that, you
know, everything was applied fine.
0:55:20 While that's going on, you receive a
packet that, another user updated a
0:55:24 certain property on that model object.
0:55:27 What do you do?
0:55:28 Like, and that becomes a really, really
hard problem because suddenly, like,
0:55:33 you, you really don't know what to do.
0:55:35 Like, you can't rely just on
that RPC call coming back.
0:55:38 Because, again, your backend has
multiple servers on it, so you can't
0:55:42 rely on the timing of these things.
0:55:44 It's not just, one single server
running things, you know, serially.
0:55:48 It's multiple servers writing to
the database, and then somebody is
0:55:51 able to sort of send you a message,
and the RPC call might go through.
0:55:56 have already been sent but hasn't reached
you yet because the network is slow.
0:56:00 So when you receive that RPC
code, you don't know if all the
0:56:04 values in there are up to date.
0:56:06 And now you need to figure out what to do
with the updates for that model object.
0:56:11 And when you realize that, you're
like, Yeah, I effectively need
0:56:14 to implement another sync engine
in order to make that happen.
0:56:17 There needs to be a queue of sorts.
0:56:19 And it becomes very, very complex.
0:56:22 It's funny.
0:56:22 So like, it's a sort of a boiling frog
situation where you start out with like
0:56:28 your, your blissfully ignorant happy
path of just like doing a fetch call
0:56:34 to your backend and like, you get your
data back and you test this on localhost
0:56:39 with like your one client over there and
your locally running server over there.
0:56:43 And like, everything just works and like
you ship the feature, like you mark the
0:56:49 issue as done on, on Linear, but then as
it goes on production and like multiple
0:56:55 users hit it, you get some really cryptic
error messages that you, you even have a
0:57:00 super hard time replicating that locally
and you, you've spent hours on it.
0:57:04 Hours and hours and days and days,
like reading through log messages.
0:57:07 Oh, we realized I actually, we don't have
the right log messages for that in place.
0:57:11 So you'll need to spend another two
weeks shipping that until you've like,
0:57:16 finally have all of like the signal that
you pull out of the giant bag of noise.
0:57:21 To finally, like, have at
least some confirmation of
0:57:25 that something is going wrong.
0:57:27 And once you have that hypothesis
to even replicate it locally that's
0:57:31 already takes heaps and heaps of time.
0:57:34 And then, like, The way how you pull
yourself out of that is by step by step,
0:57:41 applying changes that will ultimately lead
you to a sync engine, but that's such a
0:57:46 painful and inefficient way to get there.
0:57:50 I think it's, primarily probably
a problem to get, get us from.
0:57:54 A to B, like A being the status quo
of the world right now, where like
0:58:00 everything is built with the sort of RPC
ish way to B where most products where
0:58:05 it's a good fit are built with sync
engines is probably just that instilled
0:58:10 tribe knowledge that by now like all
the technologies are sort of like.
0:58:15 Fostering that, that status quo where like
all the libraries are built around RPC
0:58:23 and we're, we're kind of blind to, yeah,
it's kind of the spoiling frog situation
0:58:28 where it's already cooking like crazy,
but we don't realize it yet how much
0:58:32 complexity we've built for ourselves.
0:58:34 And how simple things could be.
0:58:36 For sure.
0:58:37 So it becomes simpler to not you
know, implement that WebSocket and
0:58:40 just have the user hit refresh to
get the latest version of that page
0:58:44 and be ignorant about or bliss.
0:58:46 Yeah,
0:58:47 exactly.
0:58:48 Which just dials up the temperature,
0:58:52 but this is where I'm so excited about
Linear and the success of Linear since
0:58:58 people can't ignore products like Linear.
0:59:02 There's like, Oh my gosh,
what makes it so great?
0:59:05 And then people want to.
0:59:06 understand how did you like explain the
success and sure a lot of it will be
0:59:11 attributed to like oh they have such
those great people and they have such
0:59:16 great design and they have that amount
of like border radius but then a lot
0:59:22 of it will also come down to the to
the implementation this is what I where
0:59:26 I hope that this will drive a lot of
like Similar to how Nike focuses not as
0:59:32 much on the products, but on the great
athletes, you're the great athlete.
0:59:35 And I'm very much looking forward
that people want to be like you.
0:59:40 I really, enjoy working in a
local-first environment, and I hope that
0:59:44 everybody else picks that up as well.
0:59:47 And there's starting to be tooling
around it, around the, local-first as
0:59:51 well, that you can use out of the box.
0:59:53 That will probably work
for most of the cases.
0:59:56 It will still be hard to scale that up.
0:59:58 But at least you can get started and
maybe then figure out whether you need