WEBVTT

1
00:00:05.240 --> 00:00:08.759
<v Speaker 1>Hey folks, welcome back to another episode of JavaScript Jabber.

2
00:00:09.160 --> 00:00:11.640
<v Speaker 2>This week on our panel, we have a j O'Neil.

3
00:00:12.279 --> 00:00:17.160
<v Speaker 3>Yo yo yo coming at you live from a broken

4
00:00:17.239 --> 00:00:21.000
<v Speaker 3>Stater No, sorry, not stater solenoid.

5
00:00:22.519 --> 00:00:23.000
<v Speaker 4>Okay.

6
00:00:24.280 --> 00:00:25.800
<v Speaker 2>We also have Steve Edwards.

7
00:00:26.519 --> 00:00:30.120
<v Speaker 5>Yo coming at you. Just one yo for me from

8
00:00:30.239 --> 00:00:31.399
<v Speaker 5>Claudy and Cool Portland.

9
00:00:32.960 --> 00:00:36.679
<v Speaker 1>I'm Charles Maxwood from Top End Devs. And this week

10
00:00:36.719 --> 00:00:39.960
<v Speaker 1>we have a special guest that is Stephen Haberman.

11
00:00:40.520 --> 00:00:42.640
<v Speaker 2>Steven, do you want to introduce yourself? I don't think

12
00:00:42.640 --> 00:00:43.640
<v Speaker 2>we've had you on before.

13
00:00:44.240 --> 00:00:46.600
<v Speaker 6>Yeah, sure, I will do a singular yo as well,

14
00:00:47.560 --> 00:00:52.560
<v Speaker 6>coming from Omaha, Nebraska and yeah, yeah, really appreciate you

15
00:00:52.600 --> 00:00:57.359
<v Speaker 6>having me on. In terms of intros right now, I'm

16
00:00:57.359 --> 00:01:00.320
<v Speaker 6>a back end you know, team lead type in engineer

17
00:01:00.439 --> 00:01:04.719
<v Speaker 6>at home Bound. You mentioned construction, so we're talking about Joyce,

18
00:01:04.799 --> 00:01:09.920
<v Speaker 6>our joystore m home Bounds, a residential construction startup. So

19
00:01:09.959 --> 00:01:15.079
<v Speaker 6>we besides just building SaaS software, well that's kind of

20
00:01:15.079 --> 00:01:17.159
<v Speaker 6>the record. We don't build sas software. We're built software

21
00:01:17.239 --> 00:01:19.920
<v Speaker 6>for the back end up. The main thing our company

22
00:01:20.319 --> 00:01:24.480
<v Speaker 6>is built Home is build construction resident shams. And yeah

23
00:01:24.519 --> 00:01:24.799
<v Speaker 6>that's me.

24
00:01:25.680 --> 00:01:29.480
<v Speaker 1>Yeah, So you talked about the Joyce or m Yeah,

25
00:01:29.480 --> 00:01:31.480
<v Speaker 1>I think you emailed me about it, and that's how

26
00:01:31.719 --> 00:01:37.239
<v Speaker 1>how I found it. Anyway, I'm just wondering as we

27
00:01:37.280 --> 00:01:40.959
<v Speaker 1>get into this, first of all, what problem does it solve?

28
00:01:41.040 --> 00:01:44.239
<v Speaker 2>Then maybe that's tied up in why you built it.

29
00:01:44.760 --> 00:01:48.519
<v Speaker 6>Yeah, sure, no, that's a great question. And so where

30
00:01:48.640 --> 00:01:51.200
<v Speaker 6>where choice came from was a few years ago. We

31
00:01:51.200 --> 00:01:54.599
<v Speaker 6>were setting up to build our back end stack. You know,

32
00:01:54.599 --> 00:01:56.920
<v Speaker 6>we're a typescript shop. We do a lot of touch

33
00:01:56.959 --> 00:01:59.959
<v Speaker 6>script on the front end, react very standards sort of stuff,

34
00:02:00.079 --> 00:02:02.680
<v Speaker 6>and wanted to do various standard stuff on the back

35
00:02:02.760 --> 00:02:05.879
<v Speaker 6>end as well, and we picked graph QL as are

36
00:02:06.159 --> 00:02:09.199
<v Speaker 6>you know, layer in between at the time, which bastually

37
00:02:09.240 --> 00:02:12.159
<v Speaker 6>still enjoy I know, you know that can be some

38
00:02:12.479 --> 00:02:15.000
<v Speaker 6>that can be a tangent for later. But so we

39
00:02:15.039 --> 00:02:17.960
<v Speaker 6>started off writing our graph QL back end in type

40
00:02:17.960 --> 00:02:20.719
<v Speaker 6>script and you know, went to go pick an orm

41
00:02:20.800 --> 00:02:22.599
<v Speaker 6>because that's kind of what you do when you do

42
00:02:22.639 --> 00:02:26.840
<v Speaker 6>these things. This is probably twenty nineteen or so. And

43
00:02:27.000 --> 00:02:29.000
<v Speaker 6>one of the things that we ran into just right

44
00:02:29.000 --> 00:02:31.599
<v Speaker 6>away was just pervasive M plus ones and a graph

45
00:02:31.680 --> 00:02:34.080
<v Speaker 6>QL and back end. So you know, graph CUOL is

46
00:02:34.080 --> 00:02:37.479
<v Speaker 6>not like your typical endpoints right where in the typical

47
00:02:37.560 --> 00:02:41.240
<v Speaker 6>web endpoint, you know, slash authors or whatever, you know

48
00:02:41.319 --> 00:02:42.960
<v Speaker 6>exactly what your endpoint is going to do, so you

49
00:02:43.000 --> 00:02:45.759
<v Speaker 6>can do one big query kind of upfront to you know,

50
00:02:45.840 --> 00:02:49.919
<v Speaker 6>preload your data as much as you can and then

51
00:02:50.039 --> 00:02:54.199
<v Speaker 6>let your logic run, you know, afterwards. But graph ql

52
00:02:54.280 --> 00:02:57.159
<v Speaker 6>has such a dynamic you know, there is no single endpoint.

53
00:02:57.159 --> 00:03:01.439
<v Speaker 6>Every quarter is so dynamic that you know, the engineer

54
00:03:01.479 --> 00:03:06.039
<v Speaker 6>can't just upfront write the exact you know, preload or

55
00:03:06.120 --> 00:03:08.719
<v Speaker 6>query or whatnot that it's going to magically load the

56
00:03:08.800 --> 00:03:12.479
<v Speaker 6>data in a perform a way. So we've been using

57
00:03:12.520 --> 00:03:15.080
<v Speaker 6>another ORM or two at the time, but we're just

58
00:03:15.159 --> 00:03:17.199
<v Speaker 6>really struggling with M plus ones and so that was

59
00:03:17.240 --> 00:03:22.080
<v Speaker 6>really joyce first claim to fame is that we had

60
00:03:22.080 --> 00:03:24.159
<v Speaker 6>started out doing some co generation from the schema and

61
00:03:24.199 --> 00:03:26.520
<v Speaker 6>that sort of thing, which is very standard now in

62
00:03:26.520 --> 00:03:31.400
<v Speaker 6>a lot of ORMs. But yeah, we're just wanted to

63
00:03:31.400 --> 00:03:34.439
<v Speaker 6>fundamentally solve M plus ones and so we started out

64
00:03:34.439 --> 00:03:37.039
<v Speaker 6>putting Joyce on top of the Facebook data loader project,

65
00:03:37.159 --> 00:03:40.400
<v Speaker 6>which uses this little you know, that event loop tic

66
00:03:40.560 --> 00:03:43.919
<v Speaker 6>trick if you guys are familiar with that, to you know,

67
00:03:43.960 --> 00:03:48.520
<v Speaker 6>if you know the N plus one problem, right, if

68
00:03:48.520 --> 00:03:50.159
<v Speaker 6>I've got an author and I'm gonna read some books,

69
00:03:50.159 --> 00:03:51.800
<v Speaker 6>and then the books I'm gonna read the book reviews,

70
00:03:51.800 --> 00:03:55.400
<v Speaker 6>it's really easy for as you go down your object

71
00:03:55.439 --> 00:03:58.800
<v Speaker 6>graph to like make a query for every single books, reviews,

72
00:03:58.840 --> 00:04:01.159
<v Speaker 6>over and over and over and over over right and

73
00:04:01.199 --> 00:04:03.840
<v Speaker 6>plus one, I guess. You know, let me know. If

74
00:04:03.879 --> 00:04:05.439
<v Speaker 6>you want me to go slower through the N plus

75
00:04:05.439 --> 00:04:06.360
<v Speaker 6>one problem.

76
00:04:06.080 --> 00:04:07.840
<v Speaker 5>Well, yeah, I'm gonna say, I'll give it a real

77
00:04:07.879 --> 00:04:10.280
<v Speaker 5>quick definition. I wanted to get into that quick before

78
00:04:10.280 --> 00:04:14.039
<v Speaker 5>we love too far. So basically, if you have, you know,

79
00:04:14.120 --> 00:04:18.360
<v Speaker 5>your books and author problems, the N plus one problem is.

80
00:04:18.319 --> 00:04:19.120
<v Speaker 4>Where you do it.

81
00:04:19.399 --> 00:04:22.000
<v Speaker 5>You know, a query for how would you put it?

82
00:04:22.040 --> 00:04:22.480
<v Speaker 2>An author?

83
00:04:23.040 --> 00:04:24.879
<v Speaker 5>So if you have an author that has multiple books,

84
00:04:24.879 --> 00:04:27.800
<v Speaker 5>you're doing a query for every book, right, give me

85
00:04:28.680 --> 00:04:30.800
<v Speaker 5>this author in this book, this author and this book,

86
00:04:30.800 --> 00:04:33.240
<v Speaker 5>this author in this book. Whereas if to solve that problem,

87
00:04:33.319 --> 00:04:35.920
<v Speaker 5>you can do one big query, give me this author

88
00:04:36.279 --> 00:04:39.839
<v Speaker 5>and all their books, you know, in one query altogether

89
00:04:39.920 --> 00:04:42.319
<v Speaker 5>all the book I d's I guess. So that's the

90
00:04:42.399 --> 00:04:45.800
<v Speaker 5>basic N plus one. I'm sure there's better explanations.

91
00:04:45.199 --> 00:04:47.279
<v Speaker 4>But that's that's what I have.

92
00:04:48.920 --> 00:04:53.720
<v Speaker 6>Yeah, And it's really easy to happen to happen. So

93
00:04:53.839 --> 00:04:57.759
<v Speaker 6>Joyce is an entity based r M. So it is

94
00:04:57.839 --> 00:05:01.399
<v Speaker 6>very inspired by like Ruby and active record and some

95
00:05:01.439 --> 00:05:04.759
<v Speaker 6>of the other og entity or ms. You know, if

96
00:05:04.759 --> 00:05:06.279
<v Speaker 6>you go all the way back to you know, Og

97
00:05:06.399 --> 00:05:08.199
<v Speaker 6>hybridn ate and Java hybridnade back in the day and

98
00:05:08.240 --> 00:05:12.639
<v Speaker 6>those sort of things. But there's pros and cons of

99
00:05:12.879 --> 00:05:15.519
<v Speaker 6>an entity or m type approach where you know, you

100
00:05:15.560 --> 00:05:18.120
<v Speaker 6>think of your I really like to think of a

101
00:05:18.160 --> 00:05:21.279
<v Speaker 6>database schema as a graph and a connected graph and

102
00:05:21.319 --> 00:05:25.560
<v Speaker 6>that sort of thing. But if you think of them

103
00:05:25.560 --> 00:05:28.120
<v Speaker 6>as objects, it's really easy, which is kind of the

104
00:05:28.120 --> 00:05:32.759
<v Speaker 6>slippery slope of a leaky abstraction, right, because if you

105
00:05:32.800 --> 00:05:35.639
<v Speaker 6>think of your entities as objects, which is what entity

106
00:05:35.720 --> 00:05:38.680
<v Speaker 6>or ms do, it's really easy for programmers to accidentally

107
00:05:38.720 --> 00:05:43.319
<v Speaker 6>write four loops that cause database queries, right, because if

108
00:05:43.399 --> 00:05:45.680
<v Speaker 6>you have an author object and you're like, oh, I'm

109
00:05:45.720 --> 00:05:48.480
<v Speaker 6>just gonna ask for the books, you know, one of

110
00:05:48.480 --> 00:05:50.600
<v Speaker 6>the things that entity based or ms do is is

111
00:05:50.639 --> 00:05:52.680
<v Speaker 6>they do this lazy loading of like, oh, you don't

112
00:05:52.680 --> 00:05:55.839
<v Speaker 6>have the books, so go get those for you, which

113
00:05:55.839 --> 00:05:57.439
<v Speaker 6>seems really nice. But as soon as you do that

114
00:05:57.480 --> 00:06:00.879
<v Speaker 6>in a for loop, now you've you've got an M

115
00:06:00.879 --> 00:06:04.279
<v Speaker 6>plus one, and that's been a problem in or MS,

116
00:06:04.319 --> 00:06:06.680
<v Speaker 6>just like fundamentally forever. You know, as soon as you

117
00:06:06.759 --> 00:06:11.199
<v Speaker 6>start doing and what's what's annoying is when it's it's

118
00:06:11.199 --> 00:06:13.160
<v Speaker 6>more obvious when it's in the small. You know, if

119
00:06:13.199 --> 00:06:16.920
<v Speaker 6>you've got an endpoint and you're right in your one

120
00:06:16.959 --> 00:06:19.839
<v Speaker 6>endpoint file and you've right there in the code, you've

121
00:06:19.839 --> 00:06:21.279
<v Speaker 6>got a for loop, You're like, well, I loaded the

122
00:06:21.319 --> 00:06:23.360
<v Speaker 6>authors and then within that I'm loading the books. It's

123
00:06:23.439 --> 00:06:26.279
<v Speaker 6>very obvious within this file that I need to you know,

124
00:06:26.319 --> 00:06:29.000
<v Speaker 6>hoist my data loading up out of more my fore loop.

125
00:06:29.519 --> 00:06:32.519
<v Speaker 6>But what's kind of insiduous about entity based or MS

126
00:06:32.639 --> 00:06:36.480
<v Speaker 6>is is when you start running side effects and other

127
00:06:36.959 --> 00:06:39.519
<v Speaker 6>drive business logic. Like you know, entity or ms. They

128
00:06:39.560 --> 00:06:42.439
<v Speaker 6>like to put methods inside the author class to do

129
00:06:42.519 --> 00:06:45.040
<v Speaker 6>some business logic or have an author life cycle hook

130
00:06:45.160 --> 00:06:47.439
<v Speaker 6>or or these sort of things. And as soon as

131
00:06:47.560 --> 00:06:51.360
<v Speaker 6>some of those side effects start, you know accidentally or

132
00:06:51.639 --> 00:06:56.240
<v Speaker 6>sort of what's the emergent behavior being called in a loop?

133
00:06:56.959 --> 00:06:58.560
<v Speaker 6>Now you know, you're back to an N plus one.

134
00:06:59.040 --> 00:07:01.879
<v Speaker 6>And what was maybe interesting about graph QL was just

135
00:07:01.920 --> 00:07:04.439
<v Speaker 6>like how quickly that happened, right, So like if you're

136
00:07:04.560 --> 00:07:07.000
<v Speaker 6>in a rails back end, you can go, you know,

137
00:07:07.079 --> 00:07:09.959
<v Speaker 6>two or three years and you know, fight your you know,

138
00:07:10.199 --> 00:07:11.920
<v Speaker 6>you have your every two weeks and plus one that

139
00:07:12.000 --> 00:07:15.240
<v Speaker 6>somebody goes and you know, figures out a production where

140
00:07:15.240 --> 00:07:17.920
<v Speaker 6>it's happening and tries to magically hoist the data loading

141
00:07:18.000 --> 00:07:21.279
<v Speaker 6>up to the top of the endpoint. And and that's

142
00:07:21.319 --> 00:07:23.199
<v Speaker 6>just kind of a cost of doing business in a

143
00:07:23.199 --> 00:07:27.000
<v Speaker 6>big rails back end. And but you can kind of

144
00:07:27.000 --> 00:07:29.319
<v Speaker 6>get away with it, you know, until you your scale

145
00:07:29.439 --> 00:07:32.240
<v Speaker 6>is too big or whatnot. And maybe what's unique, and

146
00:07:32.600 --> 00:07:35.120
<v Speaker 6>maybe I think why graph ql has maybe not been

147
00:07:35.160 --> 00:07:37.800
<v Speaker 6>as popular as it could have been is just how

148
00:07:37.839 --> 00:07:39.959
<v Speaker 6>easy that is to happen. It happens right away in

149
00:07:40.000 --> 00:07:43.639
<v Speaker 6>graph ql. And so that was really what Joyce set

150
00:07:43.680 --> 00:07:45.560
<v Speaker 6>up to solve, was we wanted to make a back

151
00:07:45.639 --> 00:07:49.519
<v Speaker 6>graph ko background back end that didn't suck, to go

152
00:07:49.639 --> 00:07:52.879
<v Speaker 6>right right, and we leaned on this Facebook data loader,

153
00:07:53.399 --> 00:07:55.600
<v Speaker 6>which did actually come out of the graph ql community.

154
00:07:55.639 --> 00:07:58.399
<v Speaker 6>It's it's you know, we're sitting on shoulders of giants

155
00:07:58.399 --> 00:08:01.839
<v Speaker 6>and those sort of things. But maybe what's unique about

156
00:08:01.879 --> 00:08:04.399
<v Speaker 6>Joyce is the data loader pattern had been around for

157
00:08:04.399 --> 00:08:08.560
<v Speaker 6>a long time, but engineers were generally expected to integrate

158
00:08:08.600 --> 00:08:11.079
<v Speaker 6>it by hand, right, you go into this graph QL

159
00:08:11.160 --> 00:08:15.160
<v Speaker 6>resolver and do your data loader logic or then you

160
00:08:15.160 --> 00:08:18.600
<v Speaker 6>know there's i know, the graph quol frameworks like the

161
00:08:18.639 --> 00:08:24.279
<v Speaker 6>fastifies and we're curious and those were of things that

162
00:08:24.439 --> 00:08:26.279
<v Speaker 6>you know, they have the data loader pattern built into it,

163
00:08:26.319 --> 00:08:28.399
<v Speaker 6>but you as the engineer had to go make use

164
00:08:28.439 --> 00:08:32.159
<v Speaker 6>of it, and that's his boiler plate and nobody does it,

165
00:08:32.200 --> 00:08:35.039
<v Speaker 6>and it's it's kind of annoying. So Joyce claimed the

166
00:08:35.080 --> 00:08:40.200
<v Speaker 6>thing was that it's like every operation asterisks, there's one

167
00:08:40.279 --> 00:08:42.799
<v Speaker 6>or two that don't, especially like paginated it's very hard

168
00:08:42.840 --> 00:08:47.440
<v Speaker 6>to do passionated autobashion. But otherwise, like every operation and

169
00:08:47.519 --> 00:08:50.799
<v Speaker 6>joyed auto batches through data loader. So if you asked

170
00:08:50.799 --> 00:08:54.200
<v Speaker 6>for an author and you accidentally out ask for an

171
00:08:54.200 --> 00:08:56.279
<v Speaker 6>author and a loop and you asked for fifty, that's

172
00:08:56.360 --> 00:08:59.879
<v Speaker 6>you know, one sequel call if you accidentally or not

173
00:09:00.039 --> 00:09:03.440
<v Speaker 6>and accidentally, you know, on purpose, load a bunch of

174
00:09:03.480 --> 00:09:05.080
<v Speaker 6>books in a for loop, or a bunch of books

175
00:09:05.080 --> 00:09:07.279
<v Speaker 6>in a life cycle event, or a bunch of you know,

176
00:09:07.559 --> 00:09:11.440
<v Speaker 6>in a graph QL NaSTA graph col resolver. Basically, every

177
00:09:11.480 --> 00:09:15.519
<v Speaker 6>operation enjoiced goes through a data liiver for free and

178
00:09:15.639 --> 00:09:22.000
<v Speaker 6>gets auto batched, and yeah, that's what got us started

179
00:09:22.000 --> 00:09:22.519
<v Speaker 6>down the path.

180
00:09:24.159 --> 00:09:27.399
<v Speaker 3>How are you doing that? Do you do you await

181
00:09:27.480 --> 00:09:29.360
<v Speaker 3>at the end. I'm actually looking for an example on

182
00:09:29.399 --> 00:09:32.200
<v Speaker 3>your website, you see if I if I can see

183
00:09:32.240 --> 00:09:35.159
<v Speaker 3>what this looks like. But I'm imagining you must not

184
00:09:35.320 --> 00:09:38.360
<v Speaker 3>await in the loop because the data obviously isn't there

185
00:09:38.440 --> 00:09:40.240
<v Speaker 3>if you're waiting for it to batch, So you must

186
00:09:40.279 --> 00:09:43.559
<v Speaker 3>await at the end of the loop or something like that,

187
00:09:43.919 --> 00:09:47.039
<v Speaker 3>or or you're putting it in a callback or something

188
00:09:47.080 --> 00:09:50.320
<v Speaker 3>that some sort of handler rather than a promise.

189
00:09:51.080 --> 00:09:55.960
<v Speaker 6>Yep, we had some good docs. Let's see if you

190
00:09:56.000 --> 00:09:59.639
<v Speaker 6>go to goals and then avoiding mplus ones over on

191
00:09:59.639 --> 00:10:05.600
<v Speaker 6>the OCCA probably describes it pretty well, really soulfully. And

192
00:10:06.360 --> 00:10:09.080
<v Speaker 6>I mean the wrinkle is that we we sit on

193
00:10:09.120 --> 00:10:13.279
<v Speaker 6>top of nodes promises. Promises are really amazing because they

194
00:10:13.519 --> 00:10:16.600
<v Speaker 6>because they're on the event loop and you you always

195
00:10:16.600 --> 00:10:19.480
<v Speaker 6>have to await them, which which it's ironic because in

196
00:10:19.519 --> 00:10:22.240
<v Speaker 6>like twenty ten, this was like everything he did in

197
00:10:22.320 --> 00:10:23.840
<v Speaker 6>node had to do a callback and it was really

198
00:10:23.919 --> 00:10:28.519
<v Speaker 6>terrible and every you know, everybody hated it. But yeah,

199
00:10:28.960 --> 00:10:31.879
<v Speaker 6>the people do a node in twenty ten, man that

200
00:10:32.240 --> 00:10:33.799
<v Speaker 6>you were that was hardcore.

201
00:10:33.519 --> 00:10:35.440
<v Speaker 2>But banging rocks together?

202
00:10:36.000 --> 00:10:39.080
<v Speaker 6>Yeah right, Oh what's so ironic is is this how

203
00:10:39.159 --> 00:10:42.919
<v Speaker 6>well JavaScript is a language and touch script especially on

204
00:10:42.960 --> 00:10:46.039
<v Speaker 6>top of it, have evolved since then too, you know,

205
00:10:46.240 --> 00:10:48.559
<v Speaker 6>add acy, kuwait and all of these things, such that

206
00:10:49.279 --> 00:10:51.600
<v Speaker 6>it's termed what was really annoying? This event move model

207
00:10:51.799 --> 00:10:54.120
<v Speaker 6>of only one thread at a time. It's a really

208
00:10:54.159 --> 00:10:58.759
<v Speaker 6>a pretty pleasant environment to work in. And so to

209
00:10:58.799 --> 00:11:02.639
<v Speaker 6>get back to what data leader this is basically because

210
00:11:02.679 --> 00:11:06.360
<v Speaker 6>you have to await everything anyway, the promise in the

211
00:11:06.360 --> 00:11:10.000
<v Speaker 6>event loop is basically what sets a really fast timer

212
00:11:10.039 --> 00:11:12.559
<v Speaker 6>for you. So like, pretend we weren't in JavaScript, we

213
00:11:12.559 --> 00:11:14.759
<v Speaker 6>were in Java or you know, o G Java or

214
00:11:14.799 --> 00:11:16.639
<v Speaker 6>something like this, and you're like, okay, well I'm going

215
00:11:16.720 --> 00:11:19.320
<v Speaker 6>to do you know, ten wire calls or twenty of

216
00:11:19.360 --> 00:11:21.480
<v Speaker 6>wire calls. But I don't really know how many I'm

217
00:11:21.519 --> 00:11:23.799
<v Speaker 6>going to do, right, because before you start your four loop,

218
00:11:23.840 --> 00:11:25.840
<v Speaker 6>you don't know if there's five books or ten books

219
00:11:26.399 --> 00:11:27.919
<v Speaker 6>or you know how many books that four loop is

220
00:11:27.960 --> 00:11:31.399
<v Speaker 6>going to go through. And so you kind of but

221
00:11:31.559 --> 00:11:33.240
<v Speaker 6>but you don't you want to make that first book

222
00:11:33.279 --> 00:11:35.120
<v Speaker 6>call and I have it not go right away, right,

223
00:11:35.120 --> 00:11:37.559
<v Speaker 6>because like as soon as the io leaves the server,

224
00:11:37.720 --> 00:11:39.919
<v Speaker 6>you know there's your inmplus one. So you want to

225
00:11:39.960 --> 00:11:43.279
<v Speaker 6>go through your your probbial four loop. You know, maybe

226
00:11:43.279 --> 00:11:45.600
<v Speaker 6>this is a graph QL server run time or whatever,

227
00:11:45.639 --> 00:11:48.159
<v Speaker 6>but you know, let's think of it as a four loop.

228
00:11:49.080 --> 00:11:50.960
<v Speaker 6>You want to like ask for book one, ask for

229
00:11:51.000 --> 00:11:52.879
<v Speaker 6>book two, ask for book three, ask for book four,

230
00:11:52.960 --> 00:11:55.799
<v Speaker 6>and have these like not actually happen yet. You want

231
00:11:55.799 --> 00:11:57.879
<v Speaker 6>them to just be I'm going to goad and jump

232
00:11:57.919 --> 00:12:00.759
<v Speaker 6>to the term promises. You want to to be a

233
00:12:00.759 --> 00:12:04.240
<v Speaker 6>promise of a book, and you want to wait until

234
00:12:04.360 --> 00:12:06.200
<v Speaker 6>you've asked for all of the books. And there's the

235
00:12:06.240 --> 00:12:08.159
<v Speaker 6>hard thing is you don't know when you're done in

236
00:12:08.440 --> 00:12:11.320
<v Speaker 6>most environments, right, So like an og JAVA or something

237
00:12:11.360 --> 00:12:14.120
<v Speaker 6>like this, you'd write a four loop and you would

238
00:12:14.120 --> 00:12:15.360
<v Speaker 6>get to the end of the fore loop and then

239
00:12:15.440 --> 00:12:17.720
<v Speaker 6>you would have to like tell the run time to like, Okay,

240
00:12:17.759 --> 00:12:20.080
<v Speaker 6>I'm at the end of the fore loop, ask for

241
00:12:20.120 --> 00:12:23.320
<v Speaker 6>all my books. You know, flush my book calls and

242
00:12:23.759 --> 00:12:27.000
<v Speaker 6>you could do that, but nobody does. And so what's

243
00:12:27.000 --> 00:12:30.639
<v Speaker 6>really interesting about promises instead is that the very first

244
00:12:30.879 --> 00:12:33.320
<v Speaker 6>you know time you asked for a book, it puts

245
00:12:33.360 --> 00:12:35.399
<v Speaker 6>a little I want to use the term poison building,

246
00:12:35.440 --> 00:12:37.759
<v Speaker 6>but that's not quite right. It puts a little hint

247
00:12:37.799 --> 00:12:39.960
<v Speaker 6>at the end of the event loop, which is going

248
00:12:40.039 --> 00:12:41.600
<v Speaker 6>to run right away, right right. It's not like a

249
00:12:41.679 --> 00:12:43.840
<v Speaker 6>set and Millie's fifty or a set Milli's one hundred.

250
00:12:44.159 --> 00:12:47.799
<v Speaker 6>It just says, like, you know, in just a little bit,

251
00:12:48.159 --> 00:12:51.799
<v Speaker 6>the next tick, right, plush, plush, my sequel calls and

252
00:12:51.840 --> 00:12:53.799
<v Speaker 6>that's it. Like that, that's the end of the trick,

253
00:12:54.200 --> 00:12:58.440
<v Speaker 6>and it's It's really pretty surprising how such a simple

254
00:12:58.480 --> 00:13:03.799
<v Speaker 6>little idea can you know, fundamentally transform the performance in

255
00:13:04.240 --> 00:13:07.720
<v Speaker 6>ergonomics right of choice, like with joice and things. Using

256
00:13:07.799 --> 00:13:14.320
<v Speaker 6>data Vader, you get this really elegant you know, ervergence, autobatching.

257
00:13:15.000 --> 00:13:16.639
<v Speaker 6>It just works, it always works. You don't have to

258
00:13:16.679 --> 00:13:18.480
<v Speaker 6>do anything to get it.

259
00:13:19.600 --> 00:13:23.919
<v Speaker 3>Yeah. I think that Objection does something similar to this too,

260
00:13:23.919 --> 00:13:25.720
<v Speaker 3>at least it does with its query builder. You may

261
00:13:25.759 --> 00:13:29.600
<v Speaker 3>have taken it a step further and that you're you're

262
00:13:29.679 --> 00:13:36.399
<v Speaker 3>exposing a query builder kind of implicitly, so as you're

263
00:13:36.440 --> 00:13:39.879
<v Speaker 3>going through the loop, the query builder continues until you're

264
00:13:39.919 --> 00:13:42.600
<v Speaker 3>done with the loop. I haven't actually, I don't know

265
00:13:42.639 --> 00:13:44.879
<v Speaker 3>if I've actually tried this an objection to know whether

266
00:13:44.960 --> 00:13:48.879
<v Speaker 3>or not it's doing something similar with with the n

267
00:13:48.919 --> 00:13:52.399
<v Speaker 3>plus one problem. But it the query builder in general

268
00:13:52.519 --> 00:13:56.080
<v Speaker 3>is built that way, but it's more of a chaining

269
00:13:56.240 --> 00:13:58.879
<v Speaker 3>type of thing, like you you can keep chaining the

270
00:13:58.960 --> 00:14:02.639
<v Speaker 3>query builder and then it waits until next tick to

271
00:14:02.759 --> 00:14:06.200
<v Speaker 3>actually resolve the query builder into something. So by the

272
00:14:06.320 --> 00:14:09.559
<v Speaker 3>time you await it, you're awaiting whatever is at the

273
00:14:09.639 --> 00:14:11.440
<v Speaker 3>end of the chain, not what's at the beginning of

274
00:14:11.480 --> 00:14:14.480
<v Speaker 3>the chain, or or the chain collapses. I'm not really

275
00:14:14.519 --> 00:14:18.240
<v Speaker 3>sure what the how the mechanism works, but I do

276
00:14:18.360 --> 00:14:22.480
<v Speaker 3>know that it has it has similar magic where there's

277
00:14:22.559 --> 00:14:26.799
<v Speaker 3>state management inside of the query builder that's waiting for

278
00:14:26.840 --> 00:14:30.879
<v Speaker 3>that next tick in order to resolve the query builder.

279
00:14:30.879 --> 00:14:33.720
<v Speaker 3>And this this looks This looks similar, but it's got

280
00:14:33.840 --> 00:14:38.919
<v Speaker 3>more of a a naive looking you know, like like

281
00:14:39.000 --> 00:14:42.840
<v Speaker 3>it looks naive and then you it look it looks

282
00:14:42.840 --> 00:14:45.159
<v Speaker 3>like you have a dot each, So rather than using

283
00:14:45.279 --> 00:14:48.960
<v Speaker 3>the four loop on it, you use it. Well, I'm

284
00:14:49.559 --> 00:14:51.759
<v Speaker 3>I see where you're you're building the query. I don't

285
00:14:51.759 --> 00:14:54.320
<v Speaker 3>see where you actually use the query. I saw one example,

286
00:14:54.519 --> 00:14:56.879
<v Speaker 3>like there was a dot each. Is that what you're providing?

287
00:14:56.960 --> 00:14:59.720
<v Speaker 3>So people don't people don't call four each, they call

288
00:14:59.799 --> 00:15:00.360
<v Speaker 3>dot each.

289
00:15:03.519 --> 00:15:06.120
<v Speaker 6>I'm trying to find that dot each that you're referencing.

290
00:15:06.600 --> 00:15:08.320
<v Speaker 6>Oh you might.

291
00:15:09.159 --> 00:15:11.320
<v Speaker 3>Oh that was that was an example of ruby code.

292
00:15:11.360 --> 00:15:14.120
<v Speaker 6>Never mind, Yes, sorry, yeah.

293
00:15:13.360 --> 00:15:14.519
<v Speaker 2>That is a very ruby thing.

294
00:15:14.600 --> 00:15:19.840
<v Speaker 6>Yes, yeah, yeah, you know I didn't actually use rails

295
00:15:19.840 --> 00:15:21.919
<v Speaker 6>for like years and years and years, but did just

296
00:15:21.960 --> 00:15:25.080
<v Speaker 6>stuff rails and active record to be thoroughly impressed with

297
00:15:25.159 --> 00:15:30.240
<v Speaker 6>the ergonomics and and so Joyce is kind of unashamedly

298
00:15:31.480 --> 00:15:34.360
<v Speaker 6>tries to you know, borrow as much ergonomics and best

299
00:15:34.399 --> 00:15:36.960
<v Speaker 6>practices as we can for active records. And so you'll

300
00:15:37.000 --> 00:15:39.759
<v Speaker 6>see some active record isms, especially in the docks of

301
00:15:39.879 --> 00:15:44.559
<v Speaker 6>you know how well, and particularly the M plus ones.

302
00:15:44.679 --> 00:15:47.200
<v Speaker 6>I guess that would be one thing I think we

303
00:15:47.279 --> 00:15:49.159
<v Speaker 6>kind of use this as a talking point is how

304
00:15:50.840 --> 00:15:54.240
<v Speaker 6>active record, I would have heard, has not really solved

305
00:15:54.480 --> 00:16:01.080
<v Speaker 6>like in the same way the joyst has solved M

306
00:16:01.120 --> 00:16:03.600
<v Speaker 6>plus ones. You know, inactive record is is kind of

307
00:16:03.600 --> 00:16:05.200
<v Speaker 6>this whack a mole job of finding where you need

308
00:16:05.200 --> 00:16:09.320
<v Speaker 6>to do your load hint, you know, preload hint. And

309
00:16:09.879 --> 00:16:11.519
<v Speaker 6>we can get into it maybe a little later, but

310
00:16:11.519 --> 00:16:13.960
<v Speaker 6>but Choice does have the concept of preload hints to

311
00:16:14.320 --> 00:16:19.120
<v Speaker 6>make all of your weights go away, which which is

312
00:16:19.159 --> 00:16:21.480
<v Speaker 6>maybe a tangent. And so in Joyce you can do

313
00:16:21.519 --> 00:16:24.000
<v Speaker 6>preloadhnts because you'll get more ergonomics and you don't have

314
00:16:24.039 --> 00:16:28.639
<v Speaker 6>to awight coat, but you don't have to, like you'll

315
00:16:28.639 --> 00:16:32.279
<v Speaker 6>still get this emergent auto batching behavior even without. And

316
00:16:32.960 --> 00:16:35.200
<v Speaker 6>it's interesting you mentioned objection. I'll have to go. Look,

317
00:16:35.279 --> 00:16:38.440
<v Speaker 6>it's been a while since i've you know, for sure

318
00:16:38.519 --> 00:16:42.879
<v Speaker 6>taken a look at the other or ms around. I

319
00:16:42.919 --> 00:16:45.200
<v Speaker 6>think a lot of the ORMs that I've seen, you know,

320
00:16:45.279 --> 00:16:47.279
<v Speaker 6>do require these hints for the engineer to like know

321
00:16:47.440 --> 00:16:50.000
<v Speaker 6>upfront what's going to happen, you know, to know upfront

322
00:16:50.000 --> 00:16:51.480
<v Speaker 6>that in my query I need to ask for this,

323
00:16:51.519 --> 00:16:52.720
<v Speaker 6>and in my query I need to ask for this

324
00:16:52.759 --> 00:16:54.639
<v Speaker 6>because later somebody is going to use it, right, because

325
00:16:54.720 --> 00:16:56.960
<v Speaker 6>later somebody is going to do a for loop. And

326
00:16:57.240 --> 00:17:03.279
<v Speaker 6>that's really the beauty of the approach is it's there's

327
00:17:03.600 --> 00:17:07.319
<v Speaker 6>you know, any emergent behavior that actually accidentally runs accidentally

328
00:17:07.400 --> 00:17:10.440
<v Speaker 6>or on purpose runs in a loop gets the gets

329
00:17:10.440 --> 00:17:11.079
<v Speaker 6>the autovension.

330
00:17:13.559 --> 00:17:16.559
<v Speaker 3>Okay, yeah, so if I I would love it if

331
00:17:16.680 --> 00:17:19.480
<v Speaker 3>with your N plus ones lazy loading in a loop, example,

332
00:17:19.599 --> 00:17:24.039
<v Speaker 3>if if it continued like the next one or three

333
00:17:24.119 --> 00:17:27.960
<v Speaker 3>lines or whatever comes after this, I get what's happening there.

334
00:17:28.000 --> 00:17:31.319
<v Speaker 3>But then I wonder, how would I use this, because

335
00:17:31.319 --> 00:17:35.119
<v Speaker 3>it because you know, every everything's alighted away as to

336
00:17:35.160 --> 00:17:37.440
<v Speaker 3>how I use it, And just for the mental model

337
00:17:37.559 --> 00:17:40.440
<v Speaker 3>of it, I'm like, do it, do I await it

338
00:17:40.519 --> 00:17:45.160
<v Speaker 3>a final time? Or do I what I.

339
00:17:45.119 --> 00:17:47.039
<v Speaker 6>See what you're saying. Maybe go to the load safe

340
00:17:47.079 --> 00:17:50.079
<v Speaker 6>relations page right below this you'll get a little bit

341
00:17:50.079 --> 00:17:54.799
<v Speaker 6>of a few more Synceax examples of like using acting

342
00:17:54.880 --> 00:17:59.240
<v Speaker 6>the entities and the relations on the entities, so we

343
00:17:59.319 --> 00:18:01.680
<v Speaker 6>do wrap our relations, you know. So this would be

344
00:18:01.720 --> 00:18:04.200
<v Speaker 6>author dot books, you know, that's the books relation or

345
00:18:04.480 --> 00:18:08.720
<v Speaker 6>author dut publishers, the publisher relation, and some of the

346
00:18:08.720 --> 00:18:11.599
<v Speaker 6>og ORMs like type orm at least back when I

347
00:18:11.640 --> 00:18:14.079
<v Speaker 6>did it, and I'm ninety percent sure they still do that,

348
00:18:14.960 --> 00:18:18.079
<v Speaker 6>and even the java ORMs the hybernates in the world.

349
00:18:18.119 --> 00:18:21.599
<v Speaker 6>What a model of those like? As the array directly right,

350
00:18:21.720 --> 00:18:26.039
<v Speaker 6>author dot books is literally a book array, but it's

351
00:18:26.079 --> 00:18:27.920
<v Speaker 6>not really because it has to be lazy loaded, right,

352
00:18:27.960 --> 00:18:30.599
<v Speaker 6>and so then they do various proxy lazy loading magic

353
00:18:30.640 --> 00:18:32.559
<v Speaker 6>to make it look like a book array as soon

354
00:18:32.599 --> 00:18:35.000
<v Speaker 6>as you access it. We go ahead and wrap all

355
00:18:35.000 --> 00:18:39.279
<v Speaker 6>of our relations and these little rappers that you can

356
00:18:39.359 --> 00:18:41.480
<v Speaker 6>either ask to be loaded. So like on that load

357
00:18:41.519 --> 00:18:46.480
<v Speaker 6>safe relations, you'll if the publisher's not loaded yet, the

358
00:18:46.519 --> 00:18:48.000
<v Speaker 6>type system knows about it. If this is kind of

359
00:18:48.000 --> 00:18:51.799
<v Speaker 6>the tangent that I was alluding to earlier, is that

360
00:18:52.119 --> 00:18:54.799
<v Speaker 6>when I used type orm back in the day, because

361
00:18:54.839 --> 00:18:58.400
<v Speaker 6>of this, the type system would never know whether something

362
00:18:58.519 --> 00:19:01.079
<v Speaker 6>was loaded or not. Right, if you just gave me

363
00:19:01.079 --> 00:19:03.960
<v Speaker 6>an author and I wanted to get to the books,

364
00:19:04.680 --> 00:19:07.720
<v Speaker 6>sure I could do author books, but but I didn't

365
00:19:07.720 --> 00:19:10.160
<v Speaker 6>really know whether that had been loaded or not.

366
00:19:11.160 --> 00:19:14.279
<v Speaker 3>And if they're all monads, it's monads all the way down.

367
00:19:14.799 --> 00:19:20.319
<v Speaker 6>Well you're getting yes, you're getting that. Yeah, and so

368
00:19:21.359 --> 00:19:31.240
<v Speaker 6>correct use of monads. Nice. No, Actually, well, you guys

369
00:19:31.240 --> 00:19:35.880
<v Speaker 6>talked about effect recently, right, how those guys on the podcast.

370
00:19:35.880 --> 00:19:37.880
<v Speaker 6>I think that's how that go by the TS effect

371
00:19:41.680 --> 00:19:45.279
<v Speaker 6>Or maybe I'm getting my podcast mixed up. Well, the

372
00:19:46.359 --> 00:19:49.640
<v Speaker 6>promise promise is basically a monad unless you talk to

373
00:19:49.680 --> 00:19:51.720
<v Speaker 6>the TS affect people, and the TS effect people have

374
00:19:51.759 --> 00:19:54.400
<v Speaker 6>strong opinions how promise is not the perfect monad, and

375
00:19:54.440 --> 00:19:58.160
<v Speaker 6>they have their own effect that is the more perfect monad.

376
00:19:58.759 --> 00:20:00.799
<v Speaker 6>Which is fine, but I I don't know. I think

377
00:20:00.960 --> 00:20:05.839
<v Speaker 6>it's a little maybe academic and promising is just fine

378
00:20:05.839 --> 00:20:07.279
<v Speaker 6>to me, I guess so for.

379
00:20:07.359 --> 00:20:11.519
<v Speaker 3>The people at home, yeah, that have never encountered somebody

380
00:20:11.680 --> 00:20:14.759
<v Speaker 3>who can both know what a monad is and explain

381
00:20:14.839 --> 00:20:17.400
<v Speaker 3>it in a way that other people can understand at

382
00:20:17.400 --> 00:20:21.079
<v Speaker 3>the same time. I am the singularity. Now, a monad

383
00:20:21.160 --> 00:20:26.720
<v Speaker 3>is simply an object that encapsulates a value that is

384
00:20:26.880 --> 00:20:29.680
<v Speaker 3>not the value itself. So, for example, if you have

385
00:20:30.880 --> 00:20:35.200
<v Speaker 3>answer is equal to forty two, that's a value. If

386
00:20:35.200 --> 00:20:37.559
<v Speaker 3>you were to wrap answer in a promise so that

387
00:20:37.640 --> 00:20:39.799
<v Speaker 3>you have to do something else like call dot then

388
00:20:39.880 --> 00:20:42.640
<v Speaker 3>or in some way unwrap it in order to get

389
00:20:42.680 --> 00:20:45.839
<v Speaker 3>the value forty two out of it, that's a monad.

390
00:20:48.119 --> 00:20:50.680
<v Speaker 6>Yeah, and I think it's applicable here because I think

391
00:20:50.720 --> 00:20:53.480
<v Speaker 6>one of the things moments are great about is delaying evaluation.

392
00:20:54.200 --> 00:20:56.079
<v Speaker 6>You know, to your example, when you ask for forty

393
00:20:56.079 --> 00:20:58.160
<v Speaker 6>two and it's just like forty two is right there.

394
00:20:58.480 --> 00:21:01.240
<v Speaker 6>You know, there's no ability to do like metaprogramming around

395
00:21:01.279 --> 00:21:05.079
<v Speaker 6>that or you know, but if you're you know, you

396
00:21:05.160 --> 00:21:07.279
<v Speaker 6>mentioned monad wrapping the value that you have to ask

397
00:21:07.359 --> 00:21:11.039
<v Speaker 6>for the fact that monad's fundamental and promises. You know,

398
00:21:11.200 --> 00:21:14.160
<v Speaker 6>is is if you squint a monad, you have to

399
00:21:14.200 --> 00:21:18.640
<v Speaker 6>ask it for its value. That that delayed execution is

400
00:21:18.640 --> 00:21:23.000
<v Speaker 6>what allows you to do fun things like autobatchet sequel calls.

401
00:21:25.240 --> 00:21:27.440
<v Speaker 5>So one thing that's interesting here and looking at this

402
00:21:28.240 --> 00:21:30.279
<v Speaker 5>is I come from them. I live in the PHP

403
00:21:30.400 --> 00:21:32.920
<v Speaker 5>world of Claravel, and I'm sing a heck of a

404
00:21:32.960 --> 00:21:36.640
<v Speaker 5>lot of similarities here, sure, just in terms of relationships

405
00:21:36.640 --> 00:21:38.720
<v Speaker 5>and definitions and how you load them, how you get

406
00:21:38.759 --> 00:21:43.319
<v Speaker 5>them the syntax hopefully a good way you're using Yes, yeah,

407
00:21:43.359 --> 00:21:46.039
<v Speaker 5>you're using dot instead of you know, as an arrow

408
00:21:46.160 --> 00:21:50.200
<v Speaker 5>since P versus no. But yeah, so that to me

409
00:21:50.319 --> 00:21:52.799
<v Speaker 5>that looks very similar.

410
00:21:54.240 --> 00:21:56.720
<v Speaker 6>Yeah, I mean we try to be very boring in

411
00:21:56.759 --> 00:21:59.519
<v Speaker 6>a good way and then like, uh, you know, but

412
00:21:59.680 --> 00:22:04.799
<v Speaker 6>still have the value adds that or innovations that make

413
00:22:04.839 --> 00:22:05.880
<v Speaker 6>it different so to say.

414
00:22:06.000 --> 00:22:10.680
<v Speaker 7>But yeah, but yeah, you know, Aja you had mentioned,

415
00:22:11.839 --> 00:22:13.160
<v Speaker 7>what does it just look like to even get the

416
00:22:13.200 --> 00:22:15.960
<v Speaker 7>data out that this next a load safe relations hopefully

417
00:22:16.039 --> 00:22:16.359
<v Speaker 7>shows you.

418
00:22:16.359 --> 00:22:18.960
<v Speaker 6>It's very soon. You know, you go to you have

419
00:22:19.000 --> 00:22:22.519
<v Speaker 6>an author, you go to your publisher. You ask for it, yes,

420
00:22:22.559 --> 00:22:25.559
<v Speaker 6>for the books, you ask for the things. Maybe the

421
00:22:25.559 --> 00:22:28.119
<v Speaker 6>second code example of the load safe relations is an

422
00:22:28.119 --> 00:22:31.880
<v Speaker 6>interesting thing to talk about because it shows the difference

423
00:22:31.880 --> 00:22:34.640
<v Speaker 6>between like a dot load that returns a promise versus

424
00:22:34.680 --> 00:22:40.000
<v Speaker 6>a dot get that returns it synchronously. So promises are

425
00:22:40.000 --> 00:22:42.559
<v Speaker 6>actually kind of annoying. They're very boiler plate because you've

426
00:22:42.559 --> 00:22:46.160
<v Speaker 6>got to await everything. Right. So if you've got a

427
00:22:46.200 --> 00:22:50.640
<v Speaker 6>little you know, let's say ten to twenty line method,

428
00:22:51.079 --> 00:22:53.680
<v Speaker 6>and you want to go from you know, the books,

429
00:22:53.720 --> 00:22:56.880
<v Speaker 6>to the book reviews to the review comments, and every

430
00:22:56.880 --> 00:23:01.559
<v Speaker 6>single one of those is is as you know, you're

431
00:23:01.599 --> 00:23:05.480
<v Speaker 6>gonna have to await promise all your top loop. You're

432
00:23:05.480 --> 00:23:07.759
<v Speaker 6>gonna have to wait, promise all your inner loop, and

433
00:23:07.799 --> 00:23:09.599
<v Speaker 6>you're gonna have to wait, you know, promise all your

434
00:23:09.640 --> 00:23:12.519
<v Speaker 6>third loop, and it, you know, and then flat map

435
00:23:12.599 --> 00:23:16.400
<v Speaker 6>the promises together and something something something something, and you

436
00:23:16.440 --> 00:23:20.400
<v Speaker 6>can do it. But you know it's I couldn't you know.

437
00:23:21.160 --> 00:23:23.000
<v Speaker 6>I guess I'd ask GDP to write it for me

438
00:23:23.039 --> 00:23:27.079
<v Speaker 6>the first time round. But but what joyceless you do

439
00:23:27.160 --> 00:23:29.799
<v Speaker 6>with these load safe relations is if you do? You know,

440
00:23:29.799 --> 00:23:33.200
<v Speaker 6>So I just made a big deal about how the

441
00:23:33.319 --> 00:23:35.720
<v Speaker 6>auto bashing of our sequel behavior is very emergent. You

442
00:23:36.200 --> 00:23:39.039
<v Speaker 6>don't have to declare load hints and preload hints to

443
00:23:39.119 --> 00:23:43.720
<v Speaker 6>get that performance of those. But if you do, you know,

444
00:23:43.759 --> 00:23:45.519
<v Speaker 6>at a load hint, you know one of these like

445
00:23:45.640 --> 00:23:47.200
<v Speaker 6>I want the author and I want the publisher and

446
00:23:47.240 --> 00:23:49.359
<v Speaker 6>the comments in the books, which I think is you know,

447
00:23:49.400 --> 00:23:52.279
<v Speaker 6>aj kind of like the objection query builder is my

448
00:23:52.319 --> 00:23:53.759
<v Speaker 6>guess of what that syntax looks like.

449
00:23:55.079 --> 00:23:57.839
<v Speaker 3>I've tried to forget it. I've tried, I've tried to

450
00:23:57.839 --> 00:24:01.039
<v Speaker 3>erase it from my memory. I'm done with r MS,

451
00:24:01.119 --> 00:24:04.039
<v Speaker 3>by the way. I'm a sonic for node and CQC

452
00:24:04.440 --> 00:24:08.880
<v Speaker 3>for everything else. They've burned me too many times and

453
00:24:08.920 --> 00:24:10.680
<v Speaker 3>I just can't find the value in the end of

454
00:24:10.640 --> 00:24:11.960
<v Speaker 3>the Yes.

455
00:24:12.000 --> 00:24:14.799
<v Speaker 6>Well that there's our second half of the recording, for sure,

456
00:24:15.200 --> 00:24:20.440
<v Speaker 6>we can get to that. The but you know, back

457
00:24:20.480 --> 00:24:23.480
<v Speaker 6>to the loads versus the gets is that if you

458
00:24:23.519 --> 00:24:25.759
<v Speaker 6>do do these loads, which are optional you don't have

459
00:24:25.799 --> 00:24:28.200
<v Speaker 6>to do for performance, it actually changes the types and

460
00:24:28.240 --> 00:24:31.640
<v Speaker 6>the type system. So these get methods that let you like,

461
00:24:31.680 --> 00:24:33.720
<v Speaker 6>there's no a weights now, right, so like it used

462
00:24:33.759 --> 00:24:34.920
<v Speaker 6>to be if I had a loop and a loop

463
00:24:34.920 --> 00:24:36.559
<v Speaker 6>and a loop, but I have to await every single

464
00:24:36.559 --> 00:24:41.319
<v Speaker 6>time I touched a relation. If you do these load hints.

465
00:24:41.759 --> 00:24:45.839
<v Speaker 6>We'll add in because joys and the choice run time

466
00:24:46.039 --> 00:24:49.440
<v Speaker 6>and the typescript type system knows the data is there,

467
00:24:50.039 --> 00:24:52.039
<v Speaker 6>we'll add synchronous methods for you to be able to

468
00:24:52.079 --> 00:24:54.119
<v Speaker 6>get at it. Just do this, get to this skit,

469
00:24:54.200 --> 00:24:56.759
<v Speaker 6>and it's as if it was a raised in memory

470
00:24:57.039 --> 00:24:59.480
<v Speaker 6>or our entities of memory, because it is now and

471
00:24:59.720 --> 00:25:01.559
<v Speaker 6>we know that it is now right. Whereas if you

472
00:25:01.599 --> 00:25:04.720
<v Speaker 6>hadn't done that load hint, we don't really know. You know,

473
00:25:04.759 --> 00:25:06.799
<v Speaker 6>there might be an I'll call there and so you

474
00:25:06.920 --> 00:25:11.200
<v Speaker 6>have to await. But I would say that's probably the

475
00:25:11.240 --> 00:25:13.480
<v Speaker 6>second on the list of what you know, what makes things,

476
00:25:13.799 --> 00:25:16.599
<v Speaker 6>what makes joyce novel and pleasant, it is maybe this

477
00:25:16.920 --> 00:25:20.079
<v Speaker 6>load safe relations to just remove some of the aweight

478
00:25:20.200 --> 00:25:21.079
<v Speaker 6>dunks that you would know.

479
00:25:23.599 --> 00:25:29.160
<v Speaker 3>You're telling me that by virtue of calling aweightauthor dot

480
00:25:29.200 --> 00:25:34.880
<v Speaker 3>books dot load online three online four, the type script

481
00:25:35.000 --> 00:25:38.839
<v Speaker 3>checker knows that author dot books dot get exists, and

482
00:25:38.920 --> 00:25:43.440
<v Speaker 3>it wouldn't know that if online three I hadn't run

483
00:25:43.759 --> 00:25:45.720
<v Speaker 3>the load Uh.

484
00:25:46.200 --> 00:25:48.000
<v Speaker 6>Yeah, you know, if you if we're on the same

485
00:25:48.079 --> 00:25:50.000
<v Speaker 6>we're on the load safe relations. We're in the second

486
00:25:50.000 --> 00:25:52.680
<v Speaker 6>code block of that page.

487
00:25:52.880 --> 00:25:55.880
<v Speaker 3>The second code block of that page Okay, now I'm

488
00:25:55.880 --> 00:26:01.279
<v Speaker 3>looking loads. Yeah, the very first section. Now looking at

489
00:26:01.279 --> 00:26:05.279
<v Speaker 3>the second code block. Okay, author, dot publisher, dot get ye.

490
00:26:05.359 --> 00:26:09.079
<v Speaker 3>And you're saying, you're saying that because oh no, this

491
00:26:09.160 --> 00:26:11.160
<v Speaker 3>is oh this is different, this is different. Okay. So

492
00:26:11.440 --> 00:26:15.559
<v Speaker 3>it's looking at what load returns, and it's determining from

493
00:26:15.559 --> 00:26:19.279
<v Speaker 3>what load returns. I was actually looking in the second

494
00:26:19.519 --> 00:26:24.440
<v Speaker 3>section where or is it the third section? I was.

495
00:26:24.519 --> 00:26:26.319
<v Speaker 3>I was a little bit further down. Okay, yes, I

496
00:26:26.400 --> 00:26:28.079
<v Speaker 3>was a little bit further down. I was looking at

497
00:26:28.160 --> 00:26:32.720
<v Speaker 3>the after it says yuck, and it says anyway, I

498
00:26:33.000 --> 00:26:35.240
<v Speaker 3>think I I think I get, I think I get

499
00:26:35.279 --> 00:26:39.640
<v Speaker 3>what's going on. But no, my question still stands, so yuck.

500
00:26:39.759 --> 00:26:43.160
<v Speaker 3>Given this compilation, some r ms in the JavaScript space

501
00:26:43.680 --> 00:26:46.440
<v Speaker 3>sometimes fudge collections must be a sync da dad and

502
00:26:46.519 --> 00:26:50.400
<v Speaker 3>then it and then it has three lines here and

503
00:26:50.480 --> 00:26:53.279
<v Speaker 3>so there's one line where it awight dot load for author,

504
00:26:54.160 --> 00:26:57.599
<v Speaker 3>and then there's another line for a weight dot load

505
00:26:57.680 --> 00:27:02.039
<v Speaker 3>the books. But that one is not doing books equals right.

506
00:27:02.200 --> 00:27:05.519
<v Speaker 3>So this one, the type checker still wouldn't know for

507
00:27:05.640 --> 00:27:08.759
<v Speaker 3>certain that dot get exists because this one didn't do

508
00:27:08.799 --> 00:27:13.720
<v Speaker 3>a book's equals authored books dot load right. Right, yeah, okay, okay,

509
00:27:13.759 --> 00:27:16.480
<v Speaker 3>all right, now now I'm on board because typescript does

510
00:27:16.480 --> 00:27:18.680
<v Speaker 3>a lot of magic. It does a lot of magic,

511
00:27:18.720 --> 00:27:21.200
<v Speaker 3>and I have sure I have fought with some of

512
00:27:21.200 --> 00:27:23.240
<v Speaker 3>that magic. And you were you were teaching me new

513
00:27:23.359 --> 00:27:25.000
<v Speaker 3>I thought you were teaching me new magic that I

514
00:27:25.039 --> 00:27:29.240
<v Speaker 3>needed to know. But but no, it's it's it's it's

515
00:27:29.279 --> 00:27:32.119
<v Speaker 3>old magic, old magic. Got it.

516
00:27:32.160 --> 00:27:37.079
<v Speaker 6>I'm with you, right, Yeah. The example could probably be

517
00:27:37.160 --> 00:27:39.160
<v Speaker 6>cleaned up a little bit. I don't know why the

518
00:27:39.160 --> 00:27:41.960
<v Speaker 6>camera keeps going out of focus, but uh, the intent

519
00:27:42.160 --> 00:27:46.400
<v Speaker 6>was to show that type O REM was probably the

520
00:27:46.920 --> 00:27:50.000
<v Speaker 6>m other ORM I've used the most before Ritey joiced it,

521
00:27:50.039 --> 00:27:51.799
<v Speaker 6>and it was five years ago, so I have to,

522
00:27:51.839 --> 00:27:53.640
<v Speaker 6>you know, add all sorts of disclaimers that maybe they

523
00:27:53.680 --> 00:28:00.799
<v Speaker 6>fixed things camerah that you know, you'd have to like

524
00:28:00.839 --> 00:28:03.759
<v Speaker 6>magically access a relation in one part of the code

525
00:28:03.799 --> 00:28:05.960
<v Speaker 6>base to then like access it in another, and it

526
00:28:05.960 --> 00:28:08.119
<v Speaker 6>would just it would just work over there and you

527
00:28:08.160 --> 00:28:10.559
<v Speaker 6>wouldn't have to await it. And I don't know, it

528
00:28:10.599 --> 00:28:14.839
<v Speaker 6>was kind of magic magic at the distance, as I recall,

529
00:28:14.960 --> 00:28:17.039
<v Speaker 6>But but disclaimers, that was a while ago, and it

530
00:28:17.119 --> 00:28:20.119
<v Speaker 6>was what that section was attempting to show, but yeah,

531
00:28:20.200 --> 00:28:21.720
<v Speaker 6>can probably be for stuffed a little bit.

532
00:28:23.000 --> 00:28:25.240
<v Speaker 3>Right, Well, I'm with you. I think that this is

533
00:28:25.400 --> 00:28:30.599
<v Speaker 3>in some ways, like like many good solutions. When you

534
00:28:30.640 --> 00:28:33.279
<v Speaker 3>see it, it's obvious and you wonder why doesn't everyone

535
00:28:33.279 --> 00:28:35.960
<v Speaker 3>do it this way? Like looking at it, it doesn't

536
00:28:35.960 --> 00:28:39.079
<v Speaker 3>look like, oh, you did something super intelligent that required

537
00:28:39.119 --> 00:28:42.480
<v Speaker 3>the brain of a thousand men combined into one. Sure,

538
00:28:42.519 --> 00:28:44.799
<v Speaker 3>you know, it looks it looks like well, dove, of

539
00:28:44.839 --> 00:28:47.240
<v Speaker 3>course you do it this way, but other people weren't

540
00:28:47.240 --> 00:28:49.880
<v Speaker 3>doing this way. So you are the genius. You're the

541
00:28:49.920 --> 00:28:51.880
<v Speaker 3>genius that discovered the simple way to do it.

542
00:28:52.119 --> 00:28:54.240
<v Speaker 6>Sure, I found I found data loader first.

543
00:28:54.000 --> 00:28:54.359
<v Speaker 4>I guess.

544
00:28:55.079 --> 00:28:58.839
<v Speaker 6>But yes, yeah, yeah, I mean that's kind of the

545
00:28:58.839 --> 00:29:01.799
<v Speaker 6>intent is is that again? You know, shout out to

546
00:29:01.839 --> 00:29:05.000
<v Speaker 6>the rails active record fos of boring is good? Right,

547
00:29:06.359 --> 00:29:07.599
<v Speaker 6>you know some of the other things that we do

548
00:29:07.680 --> 00:29:09.960
<v Speaker 6>try and do well, I'm this might tiptoe aj into

549
00:29:10.000 --> 00:29:12.880
<v Speaker 6>your like orems you know, are terrible sort of thing.

550
00:29:13.079 --> 00:29:17.519
<v Speaker 6>We try to like make first class notions around domain

551
00:29:17.519 --> 00:29:20.640
<v Speaker 6>and modeling. Right, so like we try to think of

552
00:29:20.759 --> 00:29:22.960
<v Speaker 6>not just tables in the database, but try and think

553
00:29:22.960 --> 00:29:26.359
<v Speaker 6>of like our entities as a graph. And you know,

554
00:29:26.400 --> 00:29:29.440
<v Speaker 6>how are we modeling the world? You know, I like

555
00:29:29.480 --> 00:29:35.519
<v Speaker 6>domain driven design, although there are can they're sign a

556
00:29:35.720 --> 00:29:38.440
<v Speaker 6>kind of some complexities in cargo culting ish around some

557
00:29:38.480 --> 00:29:39.880
<v Speaker 6>of the domain driven design stuff.

558
00:29:39.920 --> 00:29:43.720
<v Speaker 3>But you'll have to give me the simple explanation of

559
00:29:43.759 --> 00:29:46.839
<v Speaker 3>domain driven design because with all of the you know,

560
00:29:46.880 --> 00:29:50.400
<v Speaker 3>the xdds that exist.

561
00:29:49.599 --> 00:29:53.680
<v Speaker 6>I mean, it's an older notion from so. Eric Evans

562
00:29:53.960 --> 00:29:56.400
<v Speaker 6>was the guy in you know, probably twenty ten or so,

563
00:29:56.559 --> 00:29:59.640
<v Speaker 6>two thousand and five or so that popularized the term.

564
00:30:00.279 --> 00:30:03.160
<v Speaker 6>Really a lot of it was, you know, you biquitous

565
00:30:03.200 --> 00:30:06.400
<v Speaker 6>language and engineers speaking in the same language as your

566
00:30:06.480 --> 00:30:10.440
<v Speaker 6>business users and uh, you know, really modeling the entities

567
00:30:12.279 --> 00:30:14.119
<v Speaker 6>in their world, you know, in the code and that

568
00:30:14.200 --> 00:30:17.559
<v Speaker 6>sort of thing. And well, for me, that was the

569
00:30:17.839 --> 00:30:20.400
<v Speaker 6>you know, eighty percent of what domain driven design was about.

570
00:30:20.519 --> 00:30:27.519
<v Speaker 3>Anyway, Sorry, I heard words. What did you say? Take it?

571
00:30:27.680 --> 00:30:29.880
<v Speaker 3>Take it one take it one layer lower, like like

572
00:30:29.960 --> 00:30:33.079
<v Speaker 3>remove the buzz the buzzwords from it if you can.

573
00:30:33.119 --> 00:30:36.200
<v Speaker 6>And yeah, well, so ubiquitous language is like you know,

574
00:30:36.240 --> 00:30:39.240
<v Speaker 6>if the if you talk to your uh you know,

575
00:30:39.519 --> 00:30:41.559
<v Speaker 6>so I do a lot of back office ish sort

576
00:30:41.599 --> 00:30:43.440
<v Speaker 6>of software, right, so so if I'm talking to a

577
00:30:43.519 --> 00:30:46.200
<v Speaker 6>user of my software and they they call something a bill,

578
00:30:46.599 --> 00:30:48.640
<v Speaker 6>I probably want to call that a bill in the

579
00:30:48.640 --> 00:30:50.799
<v Speaker 6>code base, right, like like we want to remove these

580
00:30:50.799 --> 00:30:53.640
<v Speaker 6>sort of like talking past each other where you know,

581
00:30:53.839 --> 00:30:56.680
<v Speaker 6>I call the or or I don't. I don't I

582
00:30:56.720 --> 00:30:58.359
<v Speaker 6>call it something different, or I don't even have the

583
00:30:58.400 --> 00:31:01.200
<v Speaker 6>concept of a bill right it with within the code base,

584
00:31:02.720 --> 00:31:05.079
<v Speaker 6>or you know, for any of the other you know

585
00:31:05.119 --> 00:31:11.160
<v Speaker 6>sort of workflow. You know, you know, I'm falling back

586
00:31:11.160 --> 00:31:15.000
<v Speaker 6>on like you know, uh, crowd app, you know, credas,

587
00:31:15.200 --> 00:31:17.440
<v Speaker 6>enterprise spreadsheets and those sort of things where you're you're

588
00:31:17.440 --> 00:31:20.799
<v Speaker 6>making software for business users running a business that you know,

589
00:31:20.880 --> 00:31:23.640
<v Speaker 6>all of the business concepts have a matching concept in

590
00:31:23.680 --> 00:31:26.640
<v Speaker 6>the code that kind of matches it as much as

591
00:31:26.640 --> 00:31:31.599
<v Speaker 6>you can, and you know you don't want to, yeah,

592
00:31:31.640 --> 00:31:33.960
<v Speaker 6>as much as you can. And so that's the the

593
00:31:34.119 --> 00:31:38.319
<v Speaker 6>ubiquitous language side of things, and and the domain driven

594
00:31:38.359 --> 00:31:40.240
<v Speaker 6>design sort of things is kind of a set of

595
00:31:40.279 --> 00:31:43.880
<v Speaker 6>patterns around you know it really kind of I want

596
00:31:43.880 --> 00:31:46.319
<v Speaker 6>to say it's at the heart of it. But you know,

597
00:31:46.440 --> 00:31:49.119
<v Speaker 6>if there's a bill concept to the user, you probably

598
00:31:49.119 --> 00:31:52.519
<v Speaker 6>have a bill entity. And if the user has a

599
00:31:52.799 --> 00:31:54.839
<v Speaker 6>you know, bank account concept, you probably have a bank

600
00:31:54.839 --> 00:31:57.440
<v Speaker 6>account concept and that sort of thing. So just you know,

601
00:31:57.720 --> 00:32:01.839
<v Speaker 6>modeling the world that you're building your system around in

602
00:32:01.839 --> 00:32:05.559
<v Speaker 6>your code base, I guess better explanation hopefully.

603
00:32:06.200 --> 00:32:09.440
<v Speaker 3>So, so just more of a one to one between

604
00:32:09.480 --> 00:32:12.160
<v Speaker 3>the way that you would speak about the business rules,

605
00:32:12.599 --> 00:32:15.839
<v Speaker 3>as in, when a customer places an order, it puts

606
00:32:15.880 --> 00:32:20.000
<v Speaker 3>an eyem in the shopping cart and then it triggers

607
00:32:20.000 --> 00:32:22.160
<v Speaker 3>the payment, So you would you would just have a

608
00:32:22.200 --> 00:32:24.759
<v Speaker 3>pretty much a one to one with that, where okay,

609
00:32:24.759 --> 00:32:27.119
<v Speaker 3>then there's a shopping cart object, there's a customer object,

610
00:32:27.160 --> 00:32:31.839
<v Speaker 3>there's a there's a payment object. So just the idea

611
00:32:31.880 --> 00:32:36.400
<v Speaker 3>of being fairly fairly one to one, not not having

612
00:32:36.440 --> 00:32:41.759
<v Speaker 3>too many abstractions over what the the the need is

613
00:32:42.000 --> 00:32:44.799
<v Speaker 3>for the customer to get done and the way the

614
00:32:44.839 --> 00:32:48.000
<v Speaker 3>software does the design is built.

615
00:32:48.680 --> 00:32:52.920
<v Speaker 6>Okay, Yeah, which you know you mentioned the you know

616
00:32:52.960 --> 00:32:55.039
<v Speaker 6>a lot of the joyisms like that they look very

617
00:32:55.119 --> 00:33:00.519
<v Speaker 6>natural and and kind of default er. What I think

618
00:33:00.559 --> 00:33:02.559
<v Speaker 6>the ubigotis language is kind of the same thing. I

619
00:33:02.559 --> 00:33:05.200
<v Speaker 6>don't think it's super innovative per se. It's just a

620
00:33:05.279 --> 00:33:09.079
<v Speaker 6>term for I think probably what most people do by

621
00:33:09.079 --> 00:33:18.880
<v Speaker 6>default anyway, you know, potentially, But yeah, well, and so

622
00:33:19.039 --> 00:33:21.799
<v Speaker 6>along the lines of the domain modeling side of things.

623
00:33:21.799 --> 00:33:24.680
<v Speaker 6>We try to, you know, add some first class features

624
00:33:24.680 --> 00:33:27.640
<v Speaker 6>on top of just just a table, just a database

625
00:33:27.640 --> 00:33:30.599
<v Speaker 6>table and just columns. Right, so we try to be

626
00:33:30.720 --> 00:33:35.160
<v Speaker 6>very explicit about well we can get into some of

627
00:33:35.160 --> 00:33:37.359
<v Speaker 6>our reactivity sort of things. But you know, even if

628
00:33:37.359 --> 00:33:40.640
<v Speaker 6>you start talking about database tables, you know, some of

629
00:33:40.680 --> 00:33:44.200
<v Speaker 6>your tables are you know, primitive columns, which is great,

630
00:33:44.240 --> 00:33:46.160
<v Speaker 6>and some of them are your foreign key columns which

631
00:33:46.160 --> 00:33:49.359
<v Speaker 6>are your relations and all. All of that's fine. We

632
00:33:49.400 --> 00:33:52.680
<v Speaker 6>want to talk about let's do a cross sense of

633
00:33:52.720 --> 00:33:55.279
<v Speaker 6>the validation rules. So you know, while this might get

634
00:33:55.279 --> 00:33:58.000
<v Speaker 6>a j will tiptoe into your you know, just stats

635
00:33:58.000 --> 00:34:00.200
<v Speaker 6>for ORM sort of discussion. Like one of the things

636
00:34:00.200 --> 00:34:06.599
<v Speaker 6>that I do, I think entity ORMs so and and

637
00:34:06.680 --> 00:34:09.599
<v Speaker 6>the economy between. So I mentioned the term entity based

638
00:34:09.679 --> 00:34:12.239
<v Speaker 6>or amalot, I would say. The other style of working

639
00:34:12.239 --> 00:34:15.679
<v Speaker 6>with data is quiry builders, right, So the quary builders

640
00:34:15.719 --> 00:34:19.239
<v Speaker 6>of the node world are like the prismas Drizzle are

641
00:34:19.280 --> 00:34:22.039
<v Speaker 6>probably the big two these days. Keithley is another, if

642
00:34:22.039 --> 00:34:25.360
<v Speaker 6>I'm saying their name right. But on the query builder

643
00:34:25.400 --> 00:34:29.159
<v Speaker 6>side of the spectrum, you issue every single call that

644
00:34:29.199 --> 00:34:34.119
<v Speaker 6>the ORM does. You do directly, right, you make the

645
00:34:34.199 --> 00:34:39.760
<v Speaker 6>query and it the quary builders just facilitates. You're doing

646
00:34:39.760 --> 00:34:41.920
<v Speaker 6>that in a very you know, nicer syntax than writing

647
00:34:42.039 --> 00:34:44.360
<v Speaker 6>raw sequel, and you you know, hopefully you'll get some

648
00:34:44.360 --> 00:34:47.079
<v Speaker 6>type safety from it because the quarry builder looks at

649
00:34:47.079 --> 00:34:49.159
<v Speaker 6>your database schema and does some type checking of your

650
00:34:49.239 --> 00:34:50.880
<v Speaker 6>typescript DSL and that sort of thing.

651
00:34:50.960 --> 00:34:55.079
<v Speaker 3>So that's maybe maybe it does, maybe it doesn't.

652
00:34:55.719 --> 00:34:59.400
<v Speaker 6>Sure, yeah, yeah, and so so those are the quarry

653
00:34:59.440 --> 00:35:04.559
<v Speaker 6>builders in But my maybe slight quibal is that I

654
00:35:04.559 --> 00:35:07.119
<v Speaker 6>don't I almost don't consider those r ms. I've got

655
00:35:07.159 --> 00:35:09.119
<v Speaker 6>a plug blog post I want to go right about

656
00:35:09.119 --> 00:35:11.880
<v Speaker 6>like what the O in RM means. And I guess

657
00:35:12.400 --> 00:35:15.519
<v Speaker 6>maybe this is just my I know, this is my biases,

658
00:35:16.400 --> 00:35:18.360
<v Speaker 6>but the O and an r M to me has

659
00:35:18.400 --> 00:35:20.360
<v Speaker 6>always kind of meant an entity, right, Like, if I'm

660
00:35:20.440 --> 00:35:21.800
<v Speaker 6>using an r M, I expect.

661
00:35:21.559 --> 00:35:25.559
<v Speaker 3>There to be an oh for entity, Yes, you know,

662
00:35:25.760 --> 00:35:26.639
<v Speaker 3>firm firm.

663
00:35:26.840 --> 00:35:29.159
<v Speaker 6>I guess it's really the term I'm looking for here.

664
00:35:29.559 --> 00:35:32.440
<v Speaker 3>But yeah, yeah, for the ten.

665
00:35:32.280 --> 00:35:34.559
<v Speaker 6>To fifteen years I used r ms like you know,

666
00:35:34.559 --> 00:35:37.760
<v Speaker 6>the hybernates and the GPAs and all of those other

667
00:35:37.960 --> 00:35:40.320
<v Speaker 6>in the active record, right, Like every RM i'd used

668
00:35:40.400 --> 00:35:42.480
<v Speaker 6>up until like three or four years ago in the

669
00:35:42.519 --> 00:35:45.400
<v Speaker 6>note community had entities. Maybe you had an author file,

670
00:35:45.480 --> 00:35:47.760
<v Speaker 6>a book file, a book review file, a comic file,

671
00:35:47.800 --> 00:35:49.320
<v Speaker 6>and maybe it was jop a code, or maybe it

672
00:35:49.400 --> 00:35:52.440
<v Speaker 6>was Ruby code or whatever, and it seems like THEE

673
00:35:52.880 --> 00:35:54.159
<v Speaker 6>the go ahead.

674
00:35:54.760 --> 00:35:58.519
<v Speaker 3>I think that the common pattern is that the O

675
00:35:58.719 --> 00:36:00.920
<v Speaker 3>r M is built on the queer builder, and so

676
00:36:01.000 --> 00:36:05.320
<v Speaker 3>the query builder trips through the ORM. Because you use

677
00:36:05.400 --> 00:36:08.719
<v Speaker 3>the ORM, it uses the query builder. It returns you

678
00:36:08.760 --> 00:36:12.320
<v Speaker 3>a partially built query builder object. Then you add on

679
00:36:12.719 --> 00:36:20.559
<v Speaker 3>dot select name, age, and so the ORM is giving

680
00:36:20.599 --> 00:36:25.280
<v Speaker 3>you In many cases it's giving you both. Because to

681
00:36:25.320 --> 00:36:29.639
<v Speaker 3>the point of you know, the conference slides of graph QL, Yeah,

682
00:36:30.280 --> 00:36:34.480
<v Speaker 3>why load the entire ten fifteen columns if all you

683
00:36:34.559 --> 00:36:37.119
<v Speaker 3>need is two? And the answer to that is, of course,

684
00:36:37.159 --> 00:36:38.760
<v Speaker 3>well you're going to need the other ten or fifteen

685
00:36:38.800 --> 00:36:40.559
<v Speaker 3>otherwise you wouldn't have them, so you might as well

686
00:36:40.559 --> 00:36:41.719
<v Speaker 3>load them and then just cash them.

687
00:36:41.760 --> 00:36:44.159
<v Speaker 6>That's cheap. Yeah, we're in a row orient in storage.

688
00:36:44.280 --> 00:36:48.760
<v Speaker 6>So no, you're you're right that For a long time,

689
00:36:48.800 --> 00:36:51.039
<v Speaker 6>and if you said ORM, it did mean both. It

690
00:36:51.079 --> 00:36:53.480
<v Speaker 6>meant you had an author file and a book file

691
00:36:53.519 --> 00:36:55.400
<v Speaker 6>and a book review file. But the worms came with

692
00:36:55.400 --> 00:36:57.280
<v Speaker 6>the quiry builders, like the hybridates of the world, so

693
00:36:57.320 --> 00:37:01.599
<v Speaker 6>that you could, you know, or ms kind of by default.

694
00:37:01.599 --> 00:37:03.519
<v Speaker 6>Of course, you're really good at the very boring credit

695
00:37:03.599 --> 00:37:05.559
<v Speaker 6>quaries like an insert update the lead of an author

696
00:37:05.599 --> 00:37:07.960
<v Speaker 6>of book, you know, book review. They can knock those

697
00:37:08.000 --> 00:37:11.239
<v Speaker 6>things out any any day, every day. What gets hard

698
00:37:11.280 --> 00:37:13.199
<v Speaker 6>is the queries that like, oh I want to join

699
00:37:13.239 --> 00:37:15.280
<v Speaker 6>and left join over here and then group by then

700
00:37:15.280 --> 00:37:16.880
<v Speaker 6>having and all of those other sort of things is

701
00:37:16.920 --> 00:37:20.639
<v Speaker 6>really where ORMs are not so great, but historically have

702
00:37:20.679 --> 00:37:23.400
<v Speaker 6>come with quiry builders in them somewhere to at least

703
00:37:23.440 --> 00:37:25.920
<v Speaker 6>try and let you do that, which maybe another unique

704
00:37:25.920 --> 00:37:27.800
<v Speaker 6>thing about joys. We don't have that. Like, I think

705
00:37:27.800 --> 00:37:30.559
<v Speaker 6>that's a very hard problem to solve, and I haven't

706
00:37:31.320 --> 00:37:36.000
<v Speaker 6>decided to tackle it yet just because I mean, the

707
00:37:36.000 --> 00:37:38.280
<v Speaker 6>stuff you can do in SQL, I'd rather just write SQL.

708
00:37:38.360 --> 00:37:41.320
<v Speaker 6>Like I think there's a yeah, yeah, you know that

709
00:37:41.440 --> 00:37:43.480
<v Speaker 6>there's this psychotomy where people think that, well, if you

710
00:37:43.559 --> 00:37:45.760
<v Speaker 6>use an ORM, you have to do everything through the ORM,

711
00:37:45.880 --> 00:37:47.079
<v Speaker 6>or if you do a quiry builder, you have to

712
00:37:47.119 --> 00:37:48.320
<v Speaker 6>do everything through the quiry builder.

713
00:37:48.800 --> 00:37:52.480
<v Speaker 3>And now we're getting into interesting. Yeah, now we're getting

714
00:37:52.480 --> 00:37:54.800
<v Speaker 3>into a very interesting area. And I and now I'm

715
00:37:54.880 --> 00:37:57.320
<v Speaker 3>very very interested, you know, to hear more of what

716
00:37:57.360 --> 00:38:01.000
<v Speaker 3>you're saying, because sure, I think that from from my perspective,

717
00:38:01.360 --> 00:38:04.280
<v Speaker 3>from what I've seen, you know, being in software the

718
00:38:04.360 --> 00:38:07.360
<v Speaker 3>last twenty years, and O rms have existed longer than that.

719
00:38:07.519 --> 00:38:11.760
<v Speaker 3>But from what I've seen, the r RM came about

720
00:38:11.880 --> 00:38:18.039
<v Speaker 3>because Postgress became popular, and suddenly people wanted the the

721
00:38:19.599 --> 00:38:22.239
<v Speaker 3>you know, the hoity toity people that were using postgress

722
00:38:22.280 --> 00:38:25.400
<v Speaker 3>my rather than my sequel, or the people that just

723
00:38:25.440 --> 00:38:27.800
<v Speaker 3>wanted to do the lowly people that were using sql

724
00:38:27.880 --> 00:38:30.920
<v Speaker 3>light rather than my sequel. They wanted to be able

725
00:38:30.960 --> 00:38:33.840
<v Speaker 3>to say, my open source project is for you too,

726
00:38:34.639 --> 00:38:37.719
<v Speaker 3>and so rather than having their project work really well

727
00:38:37.760 --> 00:38:41.800
<v Speaker 3>with my sequel, they started making compromises so that would

728
00:38:41.800 --> 00:38:44.639
<v Speaker 3>work just as poorly with Postgress or with sql light

729
00:38:45.280 --> 00:38:47.960
<v Speaker 3>as it would work with my sqel. But from my

730
00:38:48.239 --> 00:38:51.320
<v Speaker 3>from my framing, that's how O rms came about was

731
00:38:51.960 --> 00:38:55.800
<v Speaker 3>instead of let's let's just use the tools of the database,

732
00:38:55.880 --> 00:38:59.480
<v Speaker 3>well let's castrate them so we might as well just

733
00:38:59.519 --> 00:39:00.320
<v Speaker 3>be using ago.

734
00:39:01.719 --> 00:39:03.000
<v Speaker 6>Yeah, that's an interesting.

735
00:39:02.880 --> 00:39:05.320
<v Speaker 3>LONGO didn't exist yet, right.

736
00:39:05.440 --> 00:39:07.559
<v Speaker 6>Right, right, right, No, you're right, there is a race

737
00:39:07.599 --> 00:39:10.599
<v Speaker 6>to like the lowest common denominator across databases, you know,

738
00:39:10.679 --> 00:39:14.760
<v Speaker 6>for the r ms that so you know, Joyce is

739
00:39:14.880 --> 00:39:18.239
<v Speaker 6>very tiny, and so we only support post grade right now,

740
00:39:18.960 --> 00:39:21.320
<v Speaker 6>which is not really on purpose so to say that's

741
00:39:21.360 --> 00:39:24.039
<v Speaker 6>just the only thing that we've needed personally.

742
00:39:24.280 --> 00:39:27.559
<v Speaker 3>But because you're hoiity toity, No, we're small.

743
00:39:27.760 --> 00:39:28.199
<v Speaker 2>I just.

744
00:39:29.679 --> 00:39:34.920
<v Speaker 3>I'm easy. I'm easy because I was saying, that's.

745
00:39:33.119 --> 00:39:35.199
<v Speaker 6>Paying me to go go, right, But my sequel driver

746
00:39:35.320 --> 00:39:36.840
<v Speaker 6>if you want, I hope I hope.

747
00:39:36.599 --> 00:39:38.559
<v Speaker 3>You never do. But I hope you never do. I

748
00:39:38.559 --> 00:39:40.920
<v Speaker 3>hope that you just keep because some of the great

749
00:39:40.960 --> 00:39:46.400
<v Speaker 3>projects out there, they as they grow, they start saying, oh,

750
00:39:46.440 --> 00:39:49.159
<v Speaker 3>well we are like this is happening with SQL see right.

751
00:39:49.239 --> 00:39:52.840
<v Speaker 3>SQL see was a postgress only thing. And now they're like, okay, well,

752
00:39:52.880 --> 00:39:55.119
<v Speaker 3>we're also going to support my sequel and we're also

753
00:39:55.159 --> 00:39:57.920
<v Speaker 3>going to support sequel light. And rather than just supporting GO,

754
00:39:58.119 --> 00:40:00.320
<v Speaker 3>which I'm totally fine with them doing the Jason format

755
00:40:00.360 --> 00:40:03.559
<v Speaker 3>because that's a way of abstraction that seems right, they're like, oh,

756
00:40:03.599 --> 00:40:07.199
<v Speaker 3>and we're gonna have a Typescript specific driver and we're

757
00:40:07.199 --> 00:40:09.880
<v Speaker 3>gonna have a Python specific and so now the project's

758
00:40:09.920 --> 00:40:14.599
<v Speaker 3>kind of you know it ye, Like, I guess it's

759
00:40:14.639 --> 00:40:17.280
<v Speaker 3>not a paid product, so you can't complain. The author's

760
00:40:17.320 --> 00:40:19.800
<v Speaker 3>gonna do whatever the author wants to do. But instead

761
00:40:19.800 --> 00:40:24.079
<v Speaker 3>of chasing dollars, the author's chasing stars, which means that

762
00:40:24.199 --> 00:40:27.719
<v Speaker 3>now you get more stars by introducing to a new

763
00:40:27.760 --> 00:40:30.679
<v Speaker 3>community once you've captured the stars of one community. So

764
00:40:31.119 --> 00:40:35.000
<v Speaker 3>making your Postcress Driver better isn't going to get you

765
00:40:35.159 --> 00:40:38.719
<v Speaker 3>but another ten percent of stars. Creating a my sequel

766
00:40:38.800 --> 00:40:42.239
<v Speaker 3>driver is going to double your stars, right, and so

767
00:40:42.360 --> 00:40:45.199
<v Speaker 3>then the quality of the Postcress Driver, or at least

768
00:40:45.239 --> 00:40:48.960
<v Speaker 3>the response time to issues with the Postcress Driver go down.

769
00:40:49.039 --> 00:40:51.159
<v Speaker 3>When it's like, but this is why I wanted it.

770
00:40:51.199 --> 00:40:54.519
<v Speaker 3>So I hope you never support my sequel, not because

771
00:40:54.559 --> 00:40:56.960
<v Speaker 3>my sequel is bad, but just because if you could

772
00:40:56.960 --> 00:41:00.719
<v Speaker 3>focus on doing one thing, well yeah, then it'll work.

773
00:41:00.760 --> 00:41:03.599
<v Speaker 6>Well yeah, go ahead.

774
00:41:03.679 --> 00:41:05.519
<v Speaker 2>Go ahead, Steven, and I'll jump in.

775
00:41:05.840 --> 00:41:07.119
<v Speaker 6>Well, I was gonna say I should just hang up

776
00:41:07.159 --> 00:41:10.400
<v Speaker 6>now because because like, uh, Joyce doesn't have a lot

777
00:41:10.400 --> 00:41:12.400
<v Speaker 6>of users, and one of the reasons I'm here is like, hey,

778
00:41:12.440 --> 00:41:14.320
<v Speaker 6>a lot of people should use Choyce. You know, we

779
00:41:14.360 --> 00:41:16.840
<v Speaker 6>think it's great we're kind of fan boys of it obviously,

780
00:41:17.000 --> 00:41:19.199
<v Speaker 6>and I love for more people use it, but they're

781
00:41:19.199 --> 00:41:21.119
<v Speaker 6>gonna ask for more things. They're going to ask for

782
00:41:21.159 --> 00:41:23.559
<v Speaker 6>sequel support with my sequel support, and they're gonna ask

783
00:41:23.599 --> 00:41:24.880
<v Speaker 6>for this, and they're gonna ask for this, And I

784
00:41:24.920 --> 00:41:28.599
<v Speaker 6>really have qualms, you know, go back and forth. Like

785
00:41:28.599 --> 00:41:31.039
<v Speaker 6>when you're a project small and dedicated, you can do

786
00:41:31.039 --> 00:41:34.559
<v Speaker 6>whatever you want to it and and we can do

787
00:41:34.599 --> 00:41:34.960
<v Speaker 6>that now.

788
00:41:35.480 --> 00:41:38.360
<v Speaker 3>But just charge money, Just charge money. Just say it's

789
00:41:38.480 --> 00:41:41.039
<v Speaker 3>it's it's thirty bucks a year, it's ninety nine bucks

790
00:41:41.079 --> 00:41:43.639
<v Speaker 3>a year for all right, ex features.

791
00:41:44.360 --> 00:41:47.599
<v Speaker 1>I'm going to say my say, I'm gonna say what

792
00:41:47.639 --> 00:41:51.199
<v Speaker 1>I'm thinking here because I mean so much of this

793
00:41:51.320 --> 00:41:53.480
<v Speaker 1>kind of cuts both ways, if you know what I mean, right,

794
00:41:54.039 --> 00:41:57.920
<v Speaker 1>So it really pays off to have a focused o

795
00:41:58.079 --> 00:42:00.920
<v Speaker 1>RM that just does the stuff people want to do

796
00:42:01.039 --> 00:42:05.039
<v Speaker 1>right and and to make the case right, if you're

797
00:42:05.079 --> 00:42:08.519
<v Speaker 1>using an orm for Mango, it only supports Mango, right.

798
00:42:09.320 --> 00:42:12.679
<v Speaker 1>If there's if there's something else that kind of looks

799
00:42:12.719 --> 00:42:14.920
<v Speaker 1>if you squint at it like Mango and kind of

800
00:42:14.960 --> 00:42:17.039
<v Speaker 1>works if you squint at it like Mango.

801
00:42:17.519 --> 00:42:20.400
<v Speaker 2>Nobody's writing extensions for those other systems.

802
00:42:20.480 --> 00:42:22.639
<v Speaker 1>Right, And I get that we're kind of in a

803
00:42:22.679 --> 00:42:29.559
<v Speaker 1>world where yeah, all of the different sequel based systems

804
00:42:29.679 --> 00:42:34.719
<v Speaker 1>use sql ra if, right, So you know, so you

805
00:42:34.719 --> 00:42:37.440
<v Speaker 1>can kind of flirt with it. But the thing that

806
00:42:37.480 --> 00:42:41.159
<v Speaker 1>I'm seeing too, right is so I you know, it's

807
00:42:41.159 --> 00:42:43.360
<v Speaker 1>funny because we've all kind of said I work in

808
00:42:43.719 --> 00:42:46.000
<v Speaker 1>not JavaScript most of the time these days. Ors you

809
00:42:46.000 --> 00:42:49.079
<v Speaker 1>know something like that, right, Laravel or go or in

810
00:42:49.159 --> 00:42:53.519
<v Speaker 1>my case Ruby. One thing that I've seen with this

811
00:42:53.880 --> 00:42:59.199
<v Speaker 1>is with the with the Ruby with active record. Yeah,

812
00:42:59.239 --> 00:43:03.119
<v Speaker 1>you use the post gross driver and then active record

813
00:43:03.119 --> 00:43:06.760
<v Speaker 1>takes advantage of that to query the database. But if

814
00:43:06.800 --> 00:43:09.800
<v Speaker 1>you want other features that postgress provides that are not

815
00:43:10.199 --> 00:43:14.400
<v Speaker 1>you you know, specifically provided by active record or specifically

816
00:43:14.400 --> 00:43:17.760
<v Speaker 1>provided by that driver, you can pull in other libraries

817
00:43:17.800 --> 00:43:21.639
<v Speaker 1>that add the functionality. And so it really depends on

818
00:43:21.840 --> 00:43:24.880
<v Speaker 1>what your goal is in my opinion, right, is your

819
00:43:24.920 --> 00:43:28.480
<v Speaker 1>goal just to solve the particular problem that you guys have, right,

820
00:43:28.599 --> 00:43:30.960
<v Speaker 1>Because if that's the case, and it does a really

821
00:43:31.000 --> 00:43:33.800
<v Speaker 1>good job of it, and then yeah, other people who

822
00:43:33.840 --> 00:43:38.159
<v Speaker 1>are using PostgresSQL and are writing back end code, I'm

823
00:43:38.199 --> 00:43:42.840
<v Speaker 1>presuming you're using express or something. You're right, Yeah, pull, pull,

824
00:43:42.880 --> 00:43:46.360
<v Speaker 1>in pull in joice right, makes sense. If you're using

825
00:43:46.400 --> 00:43:51.199
<v Speaker 1>my SQL then and you really want a joicst like thing,

826
00:43:52.320 --> 00:43:55.400
<v Speaker 1>you can fork it or you can find something else.

827
00:43:56.000 --> 00:44:01.079
<v Speaker 3>But yeah, just give people a script that installs Postgress correctly,

828
00:44:01.119 --> 00:44:02.880
<v Speaker 3>with the users set up to be able to create.

829
00:44:02.960 --> 00:44:05.440
<v Speaker 6>There there we go. Yeah, I do think well, you

830
00:44:05.480 --> 00:44:07.960
<v Speaker 6>mentioned active record. I think active record has walked the

831
00:44:08.000 --> 00:44:11.840
<v Speaker 6>line really well of sporting a lot of databases and.

832
00:44:12.239 --> 00:44:14.519
<v Speaker 1>Yeah, but it does not like I use Postgress, and

833
00:44:14.559 --> 00:44:16.920
<v Speaker 1>it does not do everything that Postgress does. It does

834
00:44:17.800 --> 00:44:20.880
<v Speaker 1>a vast majority of the things that most people use,

835
00:44:20.960 --> 00:44:22.519
<v Speaker 1>and so it does a really good job there, but

836
00:44:22.559 --> 00:44:23.519
<v Speaker 1>it doesn't do everything.

837
00:44:23.840 --> 00:44:25.559
<v Speaker 6>Yeah, I think some of this might get back to that,

838
00:44:25.719 --> 00:44:28.000
<v Speaker 6>Like I'm the you know, when do you use the

839
00:44:28.119 --> 00:44:29.920
<v Speaker 6>or M and when do you just use a red

840
00:44:30.000 --> 00:44:35.880
<v Speaker 6>sequel and a quary builder? Right? And that my impression,

841
00:44:35.920 --> 00:44:37.800
<v Speaker 6>and maybe it's my bias and my assumption is that

842
00:44:37.800 --> 00:44:39.559
<v Speaker 6>a lot of people have been burned by the r

843
00:44:39.639 --> 00:44:41.719
<v Speaker 6>m's of the world. I'm sure there's a lot of reasons.

844
00:44:42.280 --> 00:44:43.920
<v Speaker 6>We can get to yours when you get to but

845
00:44:44.280 --> 00:44:46.920
<v Speaker 6>is this like obsession with putting everything that some projects

846
00:44:46.920 --> 00:44:48.719
<v Speaker 6>have not every but a lot of projects have with

847
00:44:48.719 --> 00:44:51.519
<v Speaker 6>like making everything go through the ORM, right, which, then

848
00:44:51.599 --> 00:44:53.320
<v Speaker 6>you know, Charles, you run into like, well, the ORM

849
00:44:53.320 --> 00:44:55.159
<v Speaker 6>doesn't do this for post creder, doesn't do that for

850
00:44:55.800 --> 00:45:00.199
<v Speaker 6>you know, my sequel or whatnot. And I don't have

851
00:45:00.280 --> 00:45:02.719
<v Speaker 6>that strict of an opinion about it insofar as like

852
00:45:02.880 --> 00:45:07.320
<v Speaker 6>I think borms that do ninety percent of your applications

853
00:45:07.639 --> 00:45:11.000
<v Speaker 6>boring cred quarries, right, which which is by far the

854
00:45:11.079 --> 00:45:13.400
<v Speaker 6>far far majority of queries we do, is super boring

855
00:45:13.440 --> 00:45:17.960
<v Speaker 6>crub that is probably exactly the same sequel across five

856
00:45:18.079 --> 00:45:19.519
<v Speaker 6>to eight top databases.

857
00:45:19.679 --> 00:45:19.840
<v Speaker 4>Right.

858
00:45:20.639 --> 00:45:22.920
<v Speaker 6>I think Joyce really can pretty easily support the my

859
00:45:23.000 --> 00:45:24.880
<v Speaker 6>squels and seql lights and all of those for the

860
00:45:25.000 --> 00:45:28.679
<v Speaker 6>subset of you know, really common crud queries. And then

861
00:45:28.760 --> 00:45:30.679
<v Speaker 6>like you know, when you need to escape patch out

862
00:45:30.719 --> 00:45:33.159
<v Speaker 6>to like the you know whatever left joint syntax that

863
00:45:33.239 --> 00:45:36.400
<v Speaker 6>only post grade supports, I think that's perfectly fine. Go

864
00:45:36.519 --> 00:45:39.159
<v Speaker 6>use your you know, uh just wright, go write some

865
00:45:39.239 --> 00:45:43.400
<v Speaker 6>raw SQL and do some you know, low level quarries

866
00:45:43.400 --> 00:45:46.559
<v Speaker 6>where you need it. And I think that happens so

867
00:45:48.199 --> 00:45:49.840
<v Speaker 6>when you need it, you really need it, but it

868
00:45:49.840 --> 00:45:52.599
<v Speaker 6>happens so frequently in a large application. It's like sub

869
00:45:52.679 --> 00:45:54.960
<v Speaker 6>five percent of the time, probably five ten percent of

870
00:45:54.960 --> 00:45:58.079
<v Speaker 6>the time that you can still get a ton of

871
00:45:58.079 --> 00:46:01.280
<v Speaker 6>benefit from the entity or side of things through all

872
00:46:01.280 --> 00:46:03.880
<v Speaker 6>of the super boiler plate stuff. And and also for

873
00:46:03.960 --> 00:46:06.039
<v Speaker 6>the that super boiler place stuff I think is also

874
00:46:06.119 --> 00:46:09.280
<v Speaker 6>what's most common commonly is supported across the you know,

875
00:46:09.480 --> 00:46:13.239
<v Speaker 6>most popular databases. So we are a post ray right now,

876
00:46:13.400 --> 00:46:16.039
<v Speaker 6>but only But I don't think it'll be a big

877
00:46:16.079 --> 00:46:20.400
<v Speaker 6>shift from our vision to Polina my sequel or something

878
00:46:20.440 --> 00:46:23.079
<v Speaker 6>like that. Get when do we get to it?

879
00:46:23.360 --> 00:46:26.840
<v Speaker 3>So tell me more about raw dogging the sequel. Yeah,

880
00:46:27.639 --> 00:46:34.039
<v Speaker 3>how do you how do you approach that? Because it

881
00:46:34.159 --> 00:46:38.559
<v Speaker 3>seems like it I again back to the why arms exist.

882
00:46:38.599 --> 00:46:41.960
<v Speaker 3>I think they started out because people wanted to support

883
00:46:42.039 --> 00:46:45.480
<v Speaker 3>seql light and postgrass and they're my sequel projects, That's

884
00:46:45.519 --> 00:46:48.119
<v Speaker 3>what it seems like. But then once they were there,

885
00:46:48.320 --> 00:46:51.400
<v Speaker 3>it started to kind of like functional programming was also

886
00:46:52.079 --> 00:46:55.599
<v Speaker 3>you know, hitting one of its uh one of its phases,

887
00:46:55.719 --> 00:46:57.960
<v Speaker 3>and so it's like, oh, look, I could do the chaining,

888
00:46:58.000 --> 00:47:00.679
<v Speaker 3>I could do I do all the functional program Functional

889
00:47:00.679 --> 00:47:07.360
<v Speaker 3>programming is more amenable to relational algebras opposed to the

890
00:47:07.519 --> 00:47:10.480
<v Speaker 3>Java style programming that it was you know, existed at

891
00:47:10.480 --> 00:47:12.800
<v Speaker 3>the time that this stuff seemed to be really taking

892
00:47:12.800 --> 00:47:15.440
<v Speaker 3>off from from you know, my point in history, which

893
00:47:15.480 --> 00:47:17.039
<v Speaker 3>I'm you know, I missed a bunch of fit because

894
00:47:17.039 --> 00:47:20.159
<v Speaker 3>I came in kind of not I thought I was

895
00:47:20.199 --> 00:47:21.880
<v Speaker 3>in the early days. Maybe I was more towards the

896
00:47:21.880 --> 00:47:24.760
<v Speaker 3>middle of it than I thought. But anyway, so, so

897
00:47:24.880 --> 00:47:28.400
<v Speaker 3>you've got that, and then but so then the whole

898
00:47:28.400 --> 00:47:30.480
<v Speaker 3>thing is, well, you know, now it's typed, and now

899
00:47:30.519 --> 00:47:33.119
<v Speaker 3>it works in your language, and now and so and

900
00:47:33.159 --> 00:47:36.239
<v Speaker 3>so SQL became the bad guy. It's like, well, the

901
00:47:36.320 --> 00:47:40.199
<v Speaker 3>o RM isn't just so that you can support multiple databases.

902
00:47:40.239 --> 00:47:44.480
<v Speaker 3>It's actually because it is the morally superior choice. Good

903
00:47:44.639 --> 00:47:49.119
<v Speaker 3>people use rms because they're good people, and and so

904
00:47:49.239 --> 00:47:51.639
<v Speaker 3>then so so it's like, well, if you buy into

905
00:47:51.679 --> 00:47:54.199
<v Speaker 3>the idea of an ORM, then you're a good person.

906
00:47:54.480 --> 00:47:56.239
<v Speaker 3>And if you're a good person, you're not gonna raw

907
00:47:56.280 --> 00:47:59.519
<v Speaker 3>dog the sequel, are you, because then you lose your portability,

908
00:47:59.559 --> 00:48:01.880
<v Speaker 3>and then you lose your functional programming, and then you

909
00:48:01.920 --> 00:48:07.360
<v Speaker 3>lose all the things that are so enlightened. So how

910
00:48:07.480 --> 00:48:09.800
<v Speaker 3>how do you have this the economy where you gonna say,

911
00:48:09.840 --> 00:48:12.679
<v Speaker 3>use joys to RM? But actually, yeah, rob Dog the

912
00:48:12.679 --> 00:48:13.519
<v Speaker 3>sequel when you need to.

913
00:48:15.239 --> 00:48:23.320
<v Speaker 6>I don't know, I just do. I mean the excellent well,

914
00:48:23.360 --> 00:48:25.760
<v Speaker 6>I mean I've tried to use r ms in the

915
00:48:25.760 --> 00:48:30.239
<v Speaker 6>past that you know, you get their dsls get so

916
00:48:30.360 --> 00:48:33.119
<v Speaker 6>contorted to try and support every little thing in SQL

917
00:48:33.159 --> 00:48:35.039
<v Speaker 6>that you'd want to do in a typescript DSL and

918
00:48:35.079 --> 00:48:39.400
<v Speaker 6>that sort of thing that you're just you know why,

919
00:48:39.760 --> 00:48:41.679
<v Speaker 6>you know, even if it's type to like I really

920
00:48:41.679 --> 00:48:44.440
<v Speaker 6>love types, right, I really love static typing. I love code,

921
00:48:44.440 --> 00:48:47.159
<v Speaker 6>you know, generating you know, the database schema and pulling

922
00:48:47.159 --> 00:48:50.400
<v Speaker 6>those you know, like the act of what active record does,

923
00:48:50.480 --> 00:48:54.079
<v Speaker 6>like that, you know, is really what joys trades to do.

924
00:48:54.079 --> 00:48:56.840
<v Speaker 6>You granted at coaching times, so the typescript compiler can

925
00:48:56.880 --> 00:48:59.920
<v Speaker 6>see it. But like there's a limit to where like

926
00:49:00.079 --> 00:49:03.000
<v Speaker 6>let's just write some sequel. And I think especially because

927
00:49:03.000 --> 00:49:05.000
<v Speaker 6>it just doesn't happen that often, right, Like, and that's

928
00:49:05.000 --> 00:49:06.559
<v Speaker 6>what makes me feel not so bad about it, Right

929
00:49:06.639 --> 00:49:08.239
<v Speaker 6>Like if I had a one hundred thousand line code

930
00:49:08.239 --> 00:49:10.519
<v Speaker 6>based in fifty thousand of it, or like entities and

931
00:49:10.800 --> 00:49:13.360
<v Speaker 6>the other fifty thousand were you know, raw dog sequel,

932
00:49:13.360 --> 00:49:15.559
<v Speaker 6>and it was very hard to see when you you

933
00:49:15.599 --> 00:49:19.039
<v Speaker 6>would use each and you you know, there were little

934
00:49:19.079 --> 00:49:20.719
<v Speaker 6>camps of like on this one you you know, which

935
00:49:20.719 --> 00:49:22.480
<v Speaker 6>one do you use and that sort of thing. But

936
00:49:23.760 --> 00:49:26.920
<v Speaker 6>at least on the projects that we've got going on

937
00:49:26.960 --> 00:49:29.280
<v Speaker 6>so far, like like, it's really pretty obvious that you

938
00:49:30.079 --> 00:49:32.519
<v Speaker 6>early seems like it that that you know, you do

939
00:49:32.639 --> 00:49:34.000
<v Speaker 6>use the r M for as much as you can,

940
00:49:34.480 --> 00:49:36.559
<v Speaker 6>but then those last few and in terms of what

941
00:49:36.559 --> 00:49:38.360
<v Speaker 6>it actually looks like, we don't have a little bit

942
00:49:38.360 --> 00:49:41.440
<v Speaker 6>of glue. So right now, Joyce sits on top of Connects,

943
00:49:41.480 --> 00:49:43.599
<v Speaker 6>which is just another it's one of these query builders.

944
00:49:43.599 --> 00:49:46.400
<v Speaker 6>It's like the key sleep and that's what Joyce itself

945
00:49:46.440 --> 00:49:49.840
<v Speaker 6>sends the queries through. And so we use the same

946
00:49:49.880 --> 00:49:53.599
<v Speaker 6>connection pools as Connects, if I'm saying that right. And

947
00:49:54.559 --> 00:49:55.639
<v Speaker 6>so if you.

948
00:49:55.400 --> 00:49:57.960
<v Speaker 3>Do, it's after the Lego alternative.

949
00:49:57.920 --> 00:50:02.679
<v Speaker 6>Yeah, yeah, yeah. And so when you want to you know,

950
00:50:02.760 --> 00:50:04.840
<v Speaker 6>broad dog to your sequel, you just get the connects

951
00:50:05.400 --> 00:50:08.159
<v Speaker 6>d s L from the same I mean, I say DSL,

952
00:50:08.199 --> 00:50:10.079
<v Speaker 6>but but there's it is a DSL, but it's it's

953
00:50:10.159 --> 00:50:12.760
<v Speaker 6>it's much lower level. It's much closer than the sequel

954
00:50:13.400 --> 00:50:15.480
<v Speaker 6>and it's not as type to me's for thing, and

955
00:50:15.719 --> 00:50:17.719
<v Speaker 6>you just do a few of them and you know,

956
00:50:17.719 --> 00:50:20.119
<v Speaker 6>make sure you write tests and I don't know, I

957
00:50:20.119 --> 00:50:24.599
<v Speaker 6>don't care that the code ends up being cleaner. And yeah, oh,

958
00:50:24.960 --> 00:50:26.679
<v Speaker 6>I wanted to follow the tangent you had mentioned that,

959
00:50:26.719 --> 00:50:30.320
<v Speaker 6>you know, ORMs were really great for cross database compatibility. Actually,

960
00:50:30.360 --> 00:50:33.039
<v Speaker 6>I don't know if that's the case. I know that

961
00:50:33.039 --> 00:50:35.400
<v Speaker 6>that is a purported benefit of the ORMs, but just like,

962
00:50:35.400 --> 00:50:38.079
<v Speaker 6>how often have you really seen a project my great databases?

963
00:50:38.199 --> 00:50:43.440
<v Speaker 6>Like it's just like, well, that's the thing, Like it's

964
00:50:43.440 --> 00:50:45.000
<v Speaker 6>not gonna I think that.

965
00:50:44.719 --> 00:50:47.039
<v Speaker 3>There's an impetus, right, I mean you have to go

966
00:50:47.119 --> 00:50:49.440
<v Speaker 3>back to the root cause. What's the root cause? Well,

967
00:50:49.559 --> 00:50:53.400
<v Speaker 3>I believe the root cause is more stars and back

968
00:50:53.400 --> 00:50:57.000
<v Speaker 3>then there wasn't GitHub, but still download count on SourceForge, right,

969
00:50:57.760 --> 00:51:00.559
<v Speaker 3>That's that I think is the thing is that people

970
00:51:00.639 --> 00:51:02.840
<v Speaker 3>wanted to see the number tick because if you're not

971
00:51:02.880 --> 00:51:05.360
<v Speaker 3>getting paid in dollars, you want to get paid in

972
00:51:05.400 --> 00:51:09.760
<v Speaker 3>social credit. And I believe that what it was is

973
00:51:09.800 --> 00:51:12.159
<v Speaker 3>they wanted to get other people in their community to

974
00:51:12.280 --> 00:51:14.519
<v Speaker 3>wash that download tick or source sports go up.

975
00:51:14.840 --> 00:51:16.760
<v Speaker 6>I'll give you that. That's that is an interesting dissertionon

976
00:51:16.760 --> 00:51:18.400
<v Speaker 6>I'll have to think about that the whole Like, you know,

977
00:51:19.239 --> 00:51:22.480
<v Speaker 6>then you mentioned the sq C goes after the all

978
00:51:22.480 --> 00:51:24.039
<v Speaker 6>of the seql light users and that sort of thing.

979
00:51:24.880 --> 00:51:26.280
<v Speaker 6>I don't know, I'll step back a little bit, like

980
00:51:27.159 --> 00:51:30.079
<v Speaker 6>more than like cross database compe, Like I'm gonna we

981
00:51:30.199 --> 00:51:34.320
<v Speaker 6>use abos aurra at at homebound. It's amazing. I'm going

982
00:51:34.360 --> 00:51:36.119
<v Speaker 6>to run on Aurora for the next you know, twenty

983
00:51:36.199 --> 00:51:38.079
<v Speaker 6>years if I can. Like it just gets as big

984
00:51:38.119 --> 00:51:40.000
<v Speaker 6>as you you know, want it to. And granted you

985
00:51:40.079 --> 00:51:42.840
<v Speaker 6>have to pay for it, but it's an amazing product

986
00:51:42.960 --> 00:51:46.079
<v Speaker 6>and I have no desire to run on anything other

987
00:51:46.119 --> 00:51:50.920
<v Speaker 6>than that. But oh, but that's not why I use

988
00:51:50.960 --> 00:51:53.480
<v Speaker 6>the r M. Why use the r M is business

989
00:51:53.559 --> 00:51:58.679
<v Speaker 6>variant enforcement, right, So validation rules such that you know what,

990
00:51:58.760 --> 00:52:03.719
<v Speaker 6>I my my just credulity with the Corey builder approach

991
00:52:03.960 --> 00:52:06.400
<v Speaker 6>is like, you know, let's say I'm in my author endpoint,

992
00:52:06.559 --> 00:52:08.760
<v Speaker 6>I'm in my save author endpoint, and I'm going to

993
00:52:08.840 --> 00:52:11.199
<v Speaker 6>do an insert an update. Let's say I'm going to

994
00:52:11.280 --> 00:52:14.280
<v Speaker 6>update the author Okay, so somebody raw dogs an update

995
00:52:14.280 --> 00:52:18.559
<v Speaker 6>to the author table. What business rules did they check? Well,

996
00:52:18.559 --> 00:52:21.039
<v Speaker 6>you know, before they switched that first name, before they

997
00:52:21.119 --> 00:52:24.039
<v Speaker 6>updated the you know, book title, or before they increased

998
00:52:24.039 --> 00:52:28.960
<v Speaker 6>the book rating, and like how many derive values, validation

999
00:52:29.039 --> 00:52:31.280
<v Speaker 6>rules and drive values are trying to watch whatever they

1000
00:52:31.320 --> 00:52:34.199
<v Speaker 6>just updated, right? So uh, you know, let's say that

1001
00:52:34.280 --> 00:52:37.199
<v Speaker 6>the author has a star count right and or or

1002
00:52:37.840 --> 00:52:41.360
<v Speaker 6>you know these sort of you know, Active record has

1003
00:52:41.400 --> 00:52:44.199
<v Speaker 6>some countercashers that we haven't quite flung that yet, but

1004
00:52:44.280 --> 00:52:46.280
<v Speaker 6>just in general, the idea of you know, after you

1005
00:52:46.400 --> 00:52:49.599
<v Speaker 6>update this row in the database, something else needs to

1006
00:52:49.639 --> 00:52:52.239
<v Speaker 6>know about it. And that's why I use RMS. I

1007
00:52:52.280 --> 00:52:54.280
<v Speaker 6>would just be super scared of like raw dog and

1008
00:52:54.320 --> 00:52:56.599
<v Speaker 6>a s an update to an author and forgetting what

1009
00:52:56.719 --> 00:52:58.840
<v Speaker 6>else did I have to do? You know, what other

1010
00:52:58.920 --> 00:53:02.280
<v Speaker 6>validation rules did I have to run? What other dragau

1011
00:53:02.320 --> 00:53:04.960
<v Speaker 6>should have to update? And those are the two things.

1012
00:53:05.320 --> 00:53:07.159
<v Speaker 6>You know, we were kind of into the third phase

1013
00:53:07.199 --> 00:53:09.639
<v Speaker 6>of what joyce is amazing yet you know M plus

1014
00:53:09.679 --> 00:53:12.760
<v Speaker 6>one and you know avoidance was the first one. Second

1015
00:53:12.760 --> 00:53:16.079
<v Speaker 6>one is those you know, populate hints to move a

1016
00:53:16.320 --> 00:53:19.440
<v Speaker 6>get rid of a weight gunk. And the third one

1017
00:53:19.599 --> 00:53:23.920
<v Speaker 6>is this like not only validation rules and life cycle hooks,

1018
00:53:23.960 --> 00:53:26.320
<v Speaker 6>like active record has the you know, we have active

1019
00:53:26.320 --> 00:53:29.800
<v Speaker 6>record style before flushes and before updates, we do cross

1020
00:53:29.960 --> 00:53:33.840
<v Speaker 6>entity reactivity, which is kind of a fancy marketing praise

1021
00:53:33.880 --> 00:53:35.480
<v Speaker 6>from it. So I guess I am kind of putting

1022
00:53:35.559 --> 00:53:38.400
<v Speaker 6>on my my marketing hat here. But so you know,

1023
00:53:38.440 --> 00:53:41.079
<v Speaker 6>on the front end, reactivity is a big catchphrase right

1024
00:53:41.119 --> 00:53:43.800
<v Speaker 6>of when you update the component over here, you know,

1025
00:53:43.880 --> 00:53:46.639
<v Speaker 6>the reactivity is updating all of the component. You update state,

1026
00:53:46.719 --> 00:53:48.719
<v Speaker 6>you know, you update state once and then it gets

1027
00:53:48.719 --> 00:53:49.679
<v Speaker 6>broadcasted out.

1028
00:53:50.199 --> 00:53:52.559
<v Speaker 3>Well, I've heard about it. I haven't seen it, but

1029
00:53:52.599 --> 00:53:53.400
<v Speaker 3>I've heard about it.

1030
00:53:53.599 --> 00:53:57.400
<v Speaker 6>Yeah, sure, Well Joyce basically brings that concept to the

1031
00:53:57.440 --> 00:54:00.159
<v Speaker 6>back end. So like when in a Joyce entity, when

1032
00:54:00.199 --> 00:54:02.920
<v Speaker 6>you update an author and let's say the author first

1033
00:54:02.960 --> 00:54:05.920
<v Speaker 6>name or the author last name, we will watch notably

1034
00:54:06.000 --> 00:54:08.639
<v Speaker 6>for like validation rules on the author itself. Like you know,

1035
00:54:08.719 --> 00:54:11.599
<v Speaker 6>the the really simple ones are the validation rules you'll

1036
00:54:11.639 --> 00:54:14.639
<v Speaker 6>see in a ZOD or some sort of schema based

1037
00:54:15.440 --> 00:54:17.480
<v Speaker 6>partier that they just look just at the field and

1038
00:54:17.559 --> 00:54:19.320
<v Speaker 6>just to the primitive values in the field. Isn't too

1039
00:54:19.400 --> 00:54:21.559
<v Speaker 6>long or is it too short? Is it an email rejects?

1040
00:54:21.639 --> 00:54:24.199
<v Speaker 6>Is it not no? Or whatever? And those are fine,

1041
00:54:24.320 --> 00:54:26.159
<v Speaker 6>you know, that's that's what a ZOD can do for you.

1042
00:54:27.119 --> 00:54:30.119
<v Speaker 6>But you know, when you start talking business and varianceisconds

1043
00:54:30.159 --> 00:54:32.280
<v Speaker 6>back to like some of the bigotous language and being

1044
00:54:32.400 --> 00:54:34.679
<v Speaker 6>driven design when you go talk to your you know,

1045
00:54:35.760 --> 00:54:38.239
<v Speaker 6>your business users and they're like, well, I have this

1046
00:54:38.239 --> 00:54:41.800
<v Speaker 6>this rule. I use the term invariant, this business rule

1047
00:54:41.800 --> 00:54:43.920
<v Speaker 6>that I want to just always be true. You know,

1048
00:54:44.039 --> 00:54:46.119
<v Speaker 6>I want this to always be true. And it's probably

1049
00:54:46.119 --> 00:54:48.079
<v Speaker 6>not going to look at just what the first name is.

1050
00:54:48.079 --> 00:54:50.159
<v Speaker 6>Is the first name too long or too short?

1051
00:54:50.239 --> 00:54:50.360
<v Speaker 3>Right?

1052
00:54:50.400 --> 00:54:53.119
<v Speaker 6>It might look at well, are you know the first

1053
00:54:53.199 --> 00:54:55.159
<v Speaker 6>name can't be the last name or or you know,

1054
00:54:55.199 --> 00:54:57.280
<v Speaker 6>it's going to look at multiple fields at once, right,

1055
00:54:58.000 --> 00:55:01.559
<v Speaker 6>just on with one on one entity. But then it's

1056
00:55:01.559 --> 00:55:04.280
<v Speaker 6>also very common for like the rules to want to

1057
00:55:04.320 --> 00:55:07.199
<v Speaker 6>like look across entities like well, if my author is

1058
00:55:08.519 --> 00:55:12.119
<v Speaker 6>has some sort of status, right, if my author is employed,

1059
00:55:12.840 --> 00:55:14.920
<v Speaker 6>And then my other validation rule in the books, like

1060
00:55:14.920 --> 00:55:18.880
<v Speaker 6>the books can be you know, sold or something like this, right,

1061
00:55:19.599 --> 00:55:22.480
<v Speaker 6>and so these sort of cross and variant validation rules.

1062
00:55:22.800 --> 00:55:27.280
<v Speaker 6>That's why I use ORMs, and and I hope you know,

1063
00:55:27.280 --> 00:55:29.039
<v Speaker 6>I can't speak for others, but that's that's what I

1064
00:55:29.079 --> 00:55:35.119
<v Speaker 6>would assume is an attraction to the ORM is not

1065
00:55:35.199 --> 00:55:37.960
<v Speaker 6>just like abstraction from the SQL database I'm using.

1066
00:55:38.639 --> 00:55:42.000
<v Speaker 3>So I guess in that sense I build my own

1067
00:55:42.199 --> 00:55:45.519
<v Speaker 3>RM because I prefer to have business logic in a

1068
00:55:45.639 --> 00:55:49.039
<v Speaker 3>separate layer from storage logic. I see these these two

1069
00:55:49.039 --> 00:55:54.559
<v Speaker 3>things is fundamentally different. And as I you know, I'm

1070
00:55:54.559 --> 00:55:58.960
<v Speaker 3>going through in refactoring code and like like looking through projects,

1071
00:55:59.039 --> 00:56:02.840
<v Speaker 3>as as I tend to do being you know, consultant,

1072
00:56:04.559 --> 00:56:08.840
<v Speaker 3>I think that the worst, like the weakest abstractions are

1073
00:56:08.840 --> 00:56:14.239
<v Speaker 3>the ones that combine storage and messaging with business logic,

1074
00:56:14.280 --> 00:56:18.280
<v Speaker 3>because business logic is the most likely to change. And

1075
00:56:18.360 --> 00:56:22.000
<v Speaker 3>so anytime that storage and messaging are together with business

1076
00:56:22.039 --> 00:56:24.599
<v Speaker 3>logic or you know, either one of those or together

1077
00:56:24.679 --> 00:56:29.239
<v Speaker 3>with business logic, then it it just it's always a

1078
00:56:29.320 --> 00:56:32.239
<v Speaker 3>nightmare when X needs to change, well now you have

1079
00:56:32.280 --> 00:56:35.599
<v Speaker 3>to go change Y and Z as well. You know.

1080
00:56:35.760 --> 00:56:39.480
<v Speaker 3>So I'm I'm very I'm very much a business logic

1081
00:56:39.519 --> 00:56:43.440
<v Speaker 3>goes in the business logic place. Yeah, And that's so

1082
00:56:43.920 --> 00:56:47.840
<v Speaker 3>fundamentally my stack, my ideal stack is routing is global.

1083
00:56:48.480 --> 00:56:54.599
<v Speaker 3>Business logic is per component. Storage is more or less

1084
00:56:54.679 --> 00:57:01.159
<v Speaker 3>global slash hierarchical. But like the business logic uses the storage,

1085
00:57:01.159 --> 00:57:04.840
<v Speaker 3>it's not in the storage. And then messaging likewise, messaging

1086
00:57:04.920 --> 00:57:08.679
<v Speaker 3>might be global with like some hierarchical component to it.

1087
00:57:09.159 --> 00:57:12.400
<v Speaker 3>But yeah, the business logic uses the messaging. So what

1088
00:57:12.559 --> 00:57:14.840
<v Speaker 3>I'll do, which you don't see this in a lot

1089
00:57:14.840 --> 00:57:17.079
<v Speaker 3>of code bases because people like to abstract it away,

1090
00:57:17.119 --> 00:57:20.360
<v Speaker 3>because I want to function that's like save that's going

1091
00:57:20.440 --> 00:57:24.119
<v Speaker 3>to do the business logic, do the storage logic, and

1092
00:57:24.159 --> 00:57:27.519
<v Speaker 3>do the message logic altogether. What I'll do is I'll

1093
00:57:27.599 --> 00:57:31.079
<v Speaker 3>literally like call the get function, take the data, call

1094
00:57:31.119 --> 00:57:34.519
<v Speaker 3>the business function on the data, and then take the result,

1095
00:57:34.599 --> 00:57:38.360
<v Speaker 3>and then call the messaging function. But then then whenever

1096
00:57:38.440 --> 00:57:41.960
<v Speaker 3>it's time to refactor, whenever business logic changes, it's like

1097
00:57:42.039 --> 00:57:44.480
<v Speaker 3>I got to go and just change that one thing.

1098
00:57:44.519 --> 00:57:47.800
<v Speaker 3>I don't have to go change my storage module or

1099
00:57:47.840 --> 00:57:49.440
<v Speaker 3>my messaging module or or whatever.

1100
00:57:49.480 --> 00:57:51.960
<v Speaker 6>Sure, yeah, no, I mean what you're saying reminds me

1101
00:57:52.000 --> 00:57:53.840
<v Speaker 6>a lot of I mean I've seen I've seen those

1102
00:57:53.920 --> 00:57:56.119
<v Speaker 6>architectures in the past. I've worked in those code bases,

1103
00:57:56.599 --> 00:58:00.159
<v Speaker 6>and it's a very familiar argument, I guess, especially you

1104
00:58:00.199 --> 00:58:03.360
<v Speaker 6>saw it, you know fifteen, you know, twenty years ago.

1105
00:58:03.440 --> 00:58:06.960
<v Speaker 6>In the Java world, there's a very strong push to

1106
00:58:06.960 --> 00:58:09.519
<v Speaker 6>have well the terms the same POJOs. You know, plain

1107
00:58:09.599 --> 00:58:12.199
<v Speaker 6>old although this was Java now, you you know plain

1108
00:58:12.199 --> 00:58:15.119
<v Speaker 6>at old JavaScript object or plain old Java object you know,

1109
00:58:15.159 --> 00:58:16.760
<v Speaker 6>passed between your layers, and you had to have a

1110
00:58:16.760 --> 00:58:18.880
<v Speaker 6>storage layer, and that was the only place they could

1111
00:58:18.880 --> 00:58:23.119
<v Speaker 6>put like data into your your your POJOs. I guess

1112
00:58:23.159 --> 00:58:24.480
<v Speaker 6>what you know? I think this is what I learned

1113
00:58:24.519 --> 00:58:27.440
<v Speaker 6>from active record and the pattern in general, but then

1114
00:58:27.480 --> 00:58:33.239
<v Speaker 6>also Ruby. The implementation is that if your storage matches,

1115
00:58:33.320 --> 00:58:35.440
<v Speaker 6>this gets to kind of the domain model, the concept

1116
00:58:35.440 --> 00:58:38.320
<v Speaker 6>in your bigder's language. If your storage schema matches what

1117
00:58:38.440 --> 00:58:42.119
<v Speaker 6>your you know, potos supposed to be anyway, the storage

1118
00:58:42.159 --> 00:58:46.360
<v Speaker 6>layer just goes away. Right, There is no storage layer anymore.

1119
00:58:46.679 --> 00:58:46.880
<v Speaker 4>You know.

1120
00:58:46.960 --> 00:58:49.920
<v Speaker 6>That's that's what the active record pattern fundamentally does. And

1121
00:58:50.280 --> 00:58:52.400
<v Speaker 6>I think there is an assumption there that you can

1122
00:58:52.440 --> 00:58:56.360
<v Speaker 6>control your schema, right, So like you know, twenty years ago,

1123
00:58:56.400 --> 00:58:59.360
<v Speaker 6>when your schema was controlled by the Oracle database admin,

1124
00:58:59.440 --> 00:59:01.320
<v Speaker 6>that you had this amid scripts to once a week

1125
00:59:01.400 --> 00:59:03.239
<v Speaker 6>for him to maybe add a table if you ask

1126
00:59:03.360 --> 00:59:05.559
<v Speaker 6>nicely enough, right, and all of these other sort of things.

1127
00:59:05.920 --> 00:59:07.679
<v Speaker 6>You had really shitty database schemist.

1128
00:59:07.719 --> 00:59:07.800
<v Speaker 4>Right.

1129
00:59:07.840 --> 00:59:10.760
<v Speaker 6>They were just ugly and they were wrong, and they

1130
00:59:10.880 --> 00:59:13.559
<v Speaker 6>modeled the data, you know, had ugly names and that

1131
00:59:13.559 --> 00:59:15.280
<v Speaker 6>sort of thing. And so the ORMs way back in

1132
00:59:15.280 --> 00:59:17.639
<v Speaker 6>the day, like hibernates of the world. Part of what

1133
00:59:17.679 --> 00:59:20.599
<v Speaker 6>they tried to do was like fix the terrible database schema. Right,

1134
00:59:20.639 --> 00:59:22.880
<v Speaker 6>you would write your mapping files or your storage layer

1135
00:59:23.239 --> 00:59:25.599
<v Speaker 6>to try and you know, get the data out of

1136
00:59:25.639 --> 00:59:28.440
<v Speaker 6>the super ugly database and put it into your super

1137
00:59:28.480 --> 00:59:31.679
<v Speaker 6>pristine oh kojo later. Right, that was all you know,

1138
00:59:31.719 --> 00:59:35.519
<v Speaker 6>your ivory tower of which you really wanted it to be.

1139
00:59:36.199 --> 00:59:39.719
<v Speaker 6>And to me, that's that's where the whole you know,

1140
00:59:39.880 --> 00:59:42.559
<v Speaker 6>or MS or the Vietnam of computer science came from.

1141
00:59:43.000 --> 00:59:47.960
<v Speaker 6>Is that the Yeah, this notion that that you have,

1142
00:59:48.840 --> 00:59:51.639
<v Speaker 6>oh right, the object relational mismatch you know, that'll get

1143
00:59:51.679 --> 00:59:53.760
<v Speaker 6>you know, thrown around, is in like somehow objects are

1144
00:59:53.760 --> 00:59:56.400
<v Speaker 6>just fun only different from relations. I don't. I don't

1145
00:59:56.440 --> 00:59:58.360
<v Speaker 6>think that they are like you know, I think if

1146
00:59:58.400 --> 01:00:00.199
<v Speaker 6>you they don't have to be anyway. I I think

1147
01:00:00.199 --> 01:00:02.400
<v Speaker 6>they were back in the day when you've had super terrible,

1148
01:00:02.559 --> 01:00:05.239
<v Speaker 6>terrible oracle database schemas that you wanted to map onto

1149
01:00:05.320 --> 01:00:08.800
<v Speaker 6>your different set of you know, objects, you know, that

1150
01:00:08.880 --> 01:00:11.639
<v Speaker 6>was an impedance. But that was not because of the technologies.

1151
01:00:11.679 --> 01:00:14.840
<v Speaker 6>That was just you know, because your schemas were so terrible.

1152
01:00:15.360 --> 01:00:18.480
<v Speaker 6>But you know, if you have the freedom to make

1153
01:00:18.559 --> 01:00:21.559
<v Speaker 6>your your you know, database schema what it really should be.

1154
01:00:21.840 --> 01:00:23.360
<v Speaker 6>You know, if you have an author, you have an

1155
01:00:23.360 --> 01:00:25.360
<v Speaker 6>author's table. If you have a book, you have a bookstable,

1156
01:00:25.400 --> 01:00:27.599
<v Speaker 6>and you know the columns match which you wants them

1157
01:00:27.599 --> 01:00:30.000
<v Speaker 6>to be, and you can change them with migrations extremely

1158
01:00:30.039 --> 01:00:33.480
<v Speaker 6>quickly in a C I CD pipeline. I think that

1159
01:00:34.239 --> 01:00:36.800
<v Speaker 6>impedance goes away and you start thinking of your your

1160
01:00:36.960 --> 01:00:39.679
<v Speaker 6>relational database as a graph database, really just a graph

1161
01:00:39.760 --> 01:00:42.800
<v Speaker 6>database at skills really well, because for whatever reason, graph

1162
01:00:42.880 --> 01:00:46.519
<v Speaker 6>databases haven't really taken off and can you know whatever,

1163
01:00:46.599 --> 01:00:49.280
<v Speaker 6>but you know, you think of your relational database as

1164
01:00:49.280 --> 01:00:51.920
<v Speaker 6>a graph database. And now your storage leader. Coming back

1165
01:00:51.920 --> 01:00:53.440
<v Speaker 6>to where you put your business edge, there is no

1166
01:00:53.480 --> 01:00:56.679
<v Speaker 6>storage layer. The RM just doesn't. And so now what

1167
01:00:56.800 --> 01:00:59.719
<v Speaker 6>the entity has become is not a storage layer. They

1168
01:00:59.760 --> 01:01:02.280
<v Speaker 6>are business logic player, right, so when you're you know,

1169
01:01:02.320 --> 01:01:04.639
<v Speaker 6>you say, well, I'll have my business off somewhere else.

1170
01:01:04.880 --> 01:01:08.079
<v Speaker 6>This is one of my criticisms of the quiry builders

1171
01:01:08.079 --> 01:01:09.440
<v Speaker 6>is that you have to do just what you did. So,

1172
01:01:09.480 --> 01:01:12.519
<v Speaker 6>like Joyce and our entities, we provide a framework for

1173
01:01:12.679 --> 01:01:15.440
<v Speaker 6>business logic and we've we've attempted to vet it and

1174
01:01:15.480 --> 01:01:18.480
<v Speaker 6>attempted to organize it and attempted to, you know, design

1175
01:01:18.480 --> 01:01:23.280
<v Speaker 6>a really pleasant way to organize your business logic. I'm

1176
01:01:23.280 --> 01:01:25.039
<v Speaker 6>gonna say, like separate from your storage layer. But there

1177
01:01:25.039 --> 01:01:26.920
<v Speaker 6>is no storage layer. That's kind of the point.

1178
01:01:27.519 --> 01:01:31.360
<v Speaker 3>Such that, well, there is a storage layer, it's just

1179
01:01:32.239 --> 01:01:36.360
<v Speaker 3>abstracted in some way. I mean, there's obviously there sure

1180
01:01:36.559 --> 01:01:37.639
<v Speaker 3>is a storage layer.

1181
01:01:38.360 --> 01:01:41.719
<v Speaker 1>Active record does this by convention, right, And so you

1182
01:01:41.719 --> 01:01:46.920
<v Speaker 1>don't think about it because it's mostly invisible, right. And

1183
01:01:46.960 --> 01:01:50.199
<v Speaker 1>I think I think that's what you're saying, Steven. And

1184
01:01:50.280 --> 01:01:54.079
<v Speaker 1>what I find is that this probably works ninety five

1185
01:01:54.159 --> 01:01:56.199
<v Speaker 1>percent of the time, and then the other five percent

1186
01:01:56.239 --> 01:01:58.320
<v Speaker 1>of the time you have to go play the game

1187
01:01:58.440 --> 01:02:02.039
<v Speaker 1>of Okay, I've got something that's a little more complicated

1188
01:02:02.480 --> 01:02:05.800
<v Speaker 1>than just business logic in this one narrow vein of

1189
01:02:06.079 --> 01:02:10.360
<v Speaker 1>users for example, Right, And so what I wind up

1190
01:02:10.360 --> 01:02:12.960
<v Speaker 1>doing is I wind up creating some other entity that

1191
01:02:13.000 --> 01:02:15.960
<v Speaker 1>manages that business logic and that workflow and all the

1192
01:02:15.960 --> 01:02:17.840
<v Speaker 1>things that are involved in that. You can call it

1193
01:02:17.880 --> 01:02:20.199
<v Speaker 1>a component, you can call it a service, you can

1194
01:02:20.239 --> 01:02:23.000
<v Speaker 1>call it whatever you want. But yeah, you wind up

1195
01:02:23.039 --> 01:02:26.239
<v Speaker 1>solving that in a different way. And I think sometimes

1196
01:02:26.280 --> 01:02:30.199
<v Speaker 1>people get into the arena of saying I don't like

1197
01:02:30.480 --> 01:02:33.159
<v Speaker 1>rms because they don't solve things in this five percent

1198
01:02:33.280 --> 01:02:36.079
<v Speaker 1>or three percent of the time exactly. And the reality

1199
01:02:36.199 --> 01:02:38.320
<v Speaker 1>is is it's like, look, it does all this stuff

1200
01:02:38.320 --> 01:02:40.880
<v Speaker 1>for me the other ninety five to ninety seven percent

1201
01:02:40.920 --> 01:02:42.880
<v Speaker 1>of the time, and so I'm gonna use it because

1202
01:02:42.920 --> 01:02:45.039
<v Speaker 1>it gets all of this garbage out of the way

1203
01:02:45.320 --> 01:02:47.840
<v Speaker 1>and it makes all of the storage stuff invisible to me,

1204
01:02:48.280 --> 01:02:49.960
<v Speaker 1>and it gives me a place to put the stuff

1205
01:02:49.960 --> 01:02:52.800
<v Speaker 1>that I care about and then yeah, I'm gonna have

1206
01:02:52.840 --> 01:02:54.920
<v Speaker 1>to go and I'm gonna have to special cases other crop.

1207
01:02:55.360 --> 01:02:57.559
<v Speaker 6>Yeah, which is fine.

1208
01:02:56.920 --> 01:03:00.880
<v Speaker 3>And that is actually my plug for or sq C

1209
01:03:01.639 --> 01:03:04.800
<v Speaker 3>is that it gets all of the crap out of

1210
01:03:04.840 --> 01:03:10.280
<v Speaker 3>the way. But there's the only constraints that it has

1211
01:03:10.440 --> 01:03:16.000
<v Speaker 3>is that it can't do meta table stuff like for example,

1212
01:03:16.000 --> 01:03:17.960
<v Speaker 3>and I don't think active record does this either, Like

1213
01:03:18.000 --> 01:03:24.519
<v Speaker 3>if you wanted to create a table dynamically, like let's

1214
01:03:24.559 --> 01:03:27.679
<v Speaker 3>say that you were doing something like Snowflake, where you

1215
01:03:27.760 --> 01:03:31.519
<v Speaker 3>need to create tables on the fly to represent csvs

1216
01:03:31.559 --> 01:03:35.360
<v Speaker 3>that people are importing, sq C is not the right

1217
01:03:35.400 --> 01:03:38.760
<v Speaker 3>tool for that job. Sure, but that is in your

1218
01:03:38.920 --> 01:03:42.119
<v Speaker 3>like zero point one percent. I think like it's very

1219
01:03:42.239 --> 01:03:46.079
<v Speaker 3>rare that you need to do meta manipulations on a

1220
01:03:46.119 --> 01:03:49.400
<v Speaker 3>table in an application that you're like multi vendoring your

1221
01:03:49.440 --> 01:03:52.519
<v Speaker 3>application in that kind of way. But like for all

1222
01:03:52.559 --> 01:03:57.039
<v Speaker 3>the stuff that it but all the stuff that an

1223
01:03:57.039 --> 01:04:00.760
<v Speaker 3>orm is gonna do, typically C is going to do

1224
01:04:00.840 --> 01:04:03.480
<v Speaker 3>for you. It's just that you just write the sequel,

1225
01:04:03.519 --> 01:04:05.639
<v Speaker 3>and you write the sequel as specific as you want.

1226
01:04:06.360 --> 01:04:11.440
<v Speaker 3>And what it does is it uses the Postgress query builder,

1227
01:04:11.559 --> 01:04:14.559
<v Speaker 3>like it links to the C code, and so it

1228
01:04:14.679 --> 01:04:17.119
<v Speaker 3>runs the C code and then it gets back basically

1229
01:04:18.000 --> 01:04:21.320
<v Speaker 3>the like it knows what the C code object is

1230
01:04:21.360 --> 01:04:23.800
<v Speaker 3>going to be, and then it translates that to JSON

1231
01:04:24.199 --> 01:04:26.840
<v Speaker 3>and then translates that to GO or in the case

1232
01:04:26.880 --> 01:04:28.920
<v Speaker 3>of Go, it might do direct because they didn't have

1233
01:04:28.960 --> 01:04:32.519
<v Speaker 3>the Jason adapter. The Jason adapter came before they created

1234
01:04:32.559 --> 01:04:34.800
<v Speaker 3>the adapter that goes to the other languages like Python

1235
01:04:34.840 --> 01:04:38.719
<v Speaker 3>and Typescript. Originally it was just straight from Postgress to GO.

1236
01:04:39.360 --> 01:04:44.960
<v Speaker 3>But anyway, so it hasn't it. It reads from the

1237
01:04:45.000 --> 01:04:50.199
<v Speaker 3>Postgress specific type system into a broad type system, into

1238
01:04:50.719 --> 01:04:55.079
<v Speaker 3>the languages type system, and so you get all of

1239
01:04:55.159 --> 01:04:58.199
<v Speaker 3>the typing, you get all of the objects. It's very

1240
01:04:58.239 --> 01:05:03.400
<v Speaker 3>easy to yeah, any anyway, so so that that's where

1241
01:05:03.519 --> 01:05:07.360
<v Speaker 3>that's where SQL SEE in particular, I think is is

1242
01:05:07.360 --> 01:05:10.719
<v Speaker 3>the best in class. Although it's it's probably not something

1243
01:05:10.800 --> 01:05:13.199
<v Speaker 3>many people have a mental model for because as far

1244
01:05:13.199 --> 01:05:14.599
<v Speaker 3>as I know, it's the only one of its kind.

1245
01:05:14.599 --> 01:05:17.599
<v Speaker 3>It's it's another one of those obvious ideas where once

1246
01:05:17.639 --> 01:05:19.360
<v Speaker 3>you see it, it's like, oh, why haven't we been

1247
01:05:19.440 --> 01:05:23.400
<v Speaker 3>doing this for the last twenty thirty years? But yeah,

1248
01:05:23.440 --> 01:05:25.920
<v Speaker 3>you know again, but nobody did it.

1249
01:05:25.920 --> 01:05:28.599
<v Speaker 6>It is a cute approach. I doe like the novel

1250
01:05:28.599 --> 01:05:31.519
<v Speaker 6>well for my caveat would be for you know when

1251
01:05:31.599 --> 01:05:33.519
<v Speaker 6>Charles said the last two to three you know, four

1252
01:05:33.519 --> 01:05:35.599
<v Speaker 6>percent of things that are really gnarly and you have

1253
01:05:35.639 --> 01:05:38.000
<v Speaker 6>to like reach outside of the box. I think the

1254
01:05:38.039 --> 01:05:40.360
<v Speaker 6>sequel c approach is really pretty novel and great for

1255
01:05:40.840 --> 01:05:43.599
<v Speaker 6>giving you a file to just write your super one

1256
01:05:43.599 --> 01:05:45.920
<v Speaker 6>off according and that sort of thing. I guess for

1257
01:05:46.000 --> 01:05:48.039
<v Speaker 6>the other ninety five percent of things, I don't use it.

1258
01:05:48.800 --> 01:05:49.039
<v Speaker 6>What's that.

1259
01:05:49.800 --> 01:05:53.119
<v Speaker 2>I don't think I've ever used sql SE SQL SEE yeah.

1260
01:05:53.119 --> 01:05:54.400
<v Speaker 3>I don't know if they have a Ruby adapter.

1261
01:05:55.559 --> 01:05:58.119
<v Speaker 6>Yeah, I mean the yeah, the concept.

1262
01:05:58.280 --> 01:06:02.400
<v Speaker 1>Is I'm playing more and more in the JavaScript realm

1263
01:06:02.440 --> 01:06:04.440
<v Speaker 1>anyway anyway, sorry I keep jumping in.

1264
01:06:04.719 --> 01:06:06.960
<v Speaker 3>Oh no, that's no obviously.

1265
01:06:07.960 --> 01:06:11.159
<v Speaker 6>The well yeah, so the the t ld R O

1266
01:06:11.280 --> 01:06:13.880
<v Speaker 6>SQL CEE is that usually you know, we talk about

1267
01:06:13.960 --> 01:06:16.760
<v Speaker 6>raw dogging SQL, right, so usually raw docking SQL in

1268
01:06:16.840 --> 01:06:19.679
<v Speaker 6>most languages is you just go do an embedded sequel stream,

1269
01:06:19.840 --> 01:06:20.760
<v Speaker 6>you know, inside.

1270
01:06:20.440 --> 01:06:23.840
<v Speaker 3>Of your and you lose the types and you lose.

1271
01:06:23.719 --> 01:06:25.599
<v Speaker 6>The types and you're just building a great big squel

1272
01:06:25.599 --> 01:06:28.559
<v Speaker 6>statement as a string. And maybe you use a string

1273
01:06:28.559 --> 01:06:31.199
<v Speaker 6>builder or maybe you you know, you somehow piece together

1274
01:06:31.239 --> 01:06:33.480
<v Speaker 6>what is in your language fundamentally a stream.

1275
01:06:33.320 --> 01:06:35.679
<v Speaker 3>And then then you have a typo in in in

1276
01:06:35.840 --> 01:06:38.280
<v Speaker 3>the name of people where you transpose the O and

1277
01:06:38.320 --> 01:06:40.239
<v Speaker 3>the e and you don't find out until you deploy.

1278
01:06:41.000 --> 01:06:43.880
<v Speaker 6>Uh. And so what's novel about SQL, see is they

1279
01:06:43.880 --> 01:06:46.480
<v Speaker 6>have you write this instead your your query and a

1280
01:06:46.840 --> 01:06:49.719
<v Speaker 6>dedicated file outside of your you know, your language, whether

1281
01:06:49.719 --> 01:06:51.840
<v Speaker 6>it's GO or typescript or whatever called like you know,

1282
01:06:51.920 --> 01:06:54.880
<v Speaker 6>my query dot sql. You know, get authors dot sql

1283
01:06:55.039 --> 01:06:57.559
<v Speaker 6>or you know, read authors dot sql or insert authors

1284
01:06:57.599 --> 01:07:00.679
<v Speaker 6>dot sql and you write literally the the sequel that's

1285
01:07:00.679 --> 01:07:02.760
<v Speaker 6>going to go to the database and you get it.

1286
01:07:02.840 --> 01:07:05.760
<v Speaker 6>Used variable interprelation like dollars sign one dollars tent two.

1287
01:07:06.440 --> 01:07:07.920
<v Speaker 6>And then what they do is they just you know,

1288
01:07:07.960 --> 01:07:11.440
<v Speaker 6>they parse that seqel type check it, and then generate

1289
01:07:11.440 --> 01:07:13.320
<v Speaker 6>a little binding around it that says like oh, if

1290
01:07:13.320 --> 01:07:16.559
<v Speaker 6>you you know, they cogen out a wrapper, that's a method,

1291
01:07:16.960 --> 01:07:18.920
<v Speaker 6>you know, a method that will really just load that

1292
01:07:18.960 --> 01:07:21.400
<v Speaker 6>little SEQL file and then call it. So it really

1293
01:07:21.440 --> 01:07:23.599
<v Speaker 6>is a pretty neat way to get, like you out

1294
01:07:23.639 --> 01:07:27.079
<v Speaker 6>of like writing raw dog sequel inside of strings in

1295
01:07:27.119 --> 01:07:29.519
<v Speaker 6>the database or sorry, in your in your typescript file,

1296
01:07:29.599 --> 01:07:32.079
<v Speaker 6>or you're going five into like what is actually a

1297
01:07:32.079 --> 01:07:37.159
<v Speaker 6>SQL file. I actually think that's pretty great. My disclaimer

1298
01:07:37.159 --> 01:07:39.159
<v Speaker 6>would be like for those three to four to five

1299
01:07:39.199 --> 01:07:41.519
<v Speaker 6>percent of cases where I want to be raw dogging sqel,

1300
01:07:42.000 --> 01:07:43.920
<v Speaker 6>and the other ninety five percent, which is like the

1301
01:07:44.000 --> 01:07:47.239
<v Speaker 6>super boring update author's credit statement that not only is

1302
01:07:47.400 --> 01:07:49.679
<v Speaker 6>the very boilerplate to write the the you know, update

1303
01:07:49.679 --> 01:07:52.039
<v Speaker 6>authors SQL which which you know I don't want to

1304
01:07:52.039 --> 01:07:53.719
<v Speaker 6>write but maybe you could say, is not fine, but

1305
01:07:53.880 --> 01:07:55.840
<v Speaker 6>all of the invariants that I need to go make

1306
01:07:55.840 --> 01:07:58.400
<v Speaker 6>sure still pass right, like sure I updated the author,

1307
01:07:59.000 --> 01:08:01.239
<v Speaker 6>what other business rules.

1308
01:08:01.039 --> 01:08:03.400
<v Speaker 3>Or but that's all in your business logic. That's all

1309
01:08:03.440 --> 01:08:05.880
<v Speaker 3>in your business logic. So that's that's still now, like

1310
01:08:05.920 --> 01:08:08.679
<v Speaker 3>you still get that, you don't bypass that.

1311
01:08:10.559 --> 01:08:12.320
<v Speaker 6>Do seq C have a way tell you how to

1312
01:08:12.320 --> 01:08:14.559
<v Speaker 6>structure your business logic or that's just like on you

1313
01:08:14.639 --> 01:08:15.760
<v Speaker 6>to figure out a way to do it.

1314
01:08:16.319 --> 01:08:17.720
<v Speaker 3>Well, I mean you do it the same way you

1315
01:08:17.720 --> 01:08:20.520
<v Speaker 3>do it anywhere else, right, whether you're using SQL or not.

1316
01:08:20.680 --> 01:08:23.079
<v Speaker 3>So you just sq C takes care of the storage

1317
01:08:23.119 --> 01:08:28.119
<v Speaker 3>layer and you you But okay, I mean I don't

1318
01:08:28.119 --> 01:08:29.920
<v Speaker 3>want to. I don't want to do and yeah, I

1319
01:08:29.920 --> 01:08:30.520
<v Speaker 3>don't want to go.

1320
01:08:30.479 --> 01:08:34.800
<v Speaker 2>To so sure, yeah.

1321
01:08:35.119 --> 01:08:38.079
<v Speaker 6>Maybe one last thing about it is that I think

1322
01:08:37.880 --> 01:08:40.079
<v Speaker 6>the corea builders of the world, and this is I

1323
01:08:40.119 --> 01:08:42.319
<v Speaker 6>would include SEQC in that, but also the Christmas and

1324
01:08:42.640 --> 01:08:44.880
<v Speaker 6>drizzles and all of these leave as an exercise to

1325
01:08:44.920 --> 01:08:50.079
<v Speaker 6>the reader how to structure their business logic, right, like

1326
01:08:50.079 --> 01:08:52.159
<v Speaker 6>like when to invoke it, how to structure it, where

1327
01:08:52.199 --> 01:08:55.680
<v Speaker 6>to put it. And that actually is the most the

1328
01:08:55.720 --> 01:08:58.159
<v Speaker 6>thing that the choice is focused on is like sure

1329
01:08:58.800 --> 01:09:01.159
<v Speaker 6>eighty percent, well you know, sixty percent of is an

1330
01:09:01.159 --> 01:09:03.279
<v Speaker 6>orient to get data out of your database. The other

1331
01:09:03.319 --> 01:09:06.880
<v Speaker 6>forty is a way to structure your business logic. Instead

1332
01:09:06.880 --> 01:09:08.479
<v Speaker 6>of everybody having to kind of make up their own

1333
01:09:08.520 --> 01:09:11.000
<v Speaker 6>and hope they do it right and in those sort

1334
01:09:11.000 --> 01:09:13.279
<v Speaker 6>of things. Grant it is a very opinionated way to

1335
01:09:13.319 --> 01:09:16.359
<v Speaker 6>structure because it uses entities, and it uses life cycle hooks,

1336
01:09:16.359 --> 01:09:20.880
<v Speaker 6>and it uses some reactivity is it? But it isn't

1337
01:09:20.880 --> 01:09:22.680
<v Speaker 6>pin neated.

1338
01:09:22.760 --> 01:09:26.319
<v Speaker 3>It is interesting, and I think that psychologically there's there's

1339
01:09:26.359 --> 01:09:31.840
<v Speaker 3>an effect there that that's really valid because people, you know,

1340
01:09:32.039 --> 01:09:34.720
<v Speaker 3>people go both ways about frameworks, you know, like I

1341
01:09:34.760 --> 01:09:37.600
<v Speaker 3>love a framework because it guides me. I hate frameworks

1342
01:09:37.600 --> 01:09:42.880
<v Speaker 3>because it constricts me. Right, And I think that you

1343
01:09:42.920 --> 01:09:46.159
<v Speaker 3>could have a framework that is here's how to put

1344
01:09:46.159 --> 01:09:48.119
<v Speaker 3>your you know, where to put your business logic, and

1345
01:09:48.159 --> 01:09:50.680
<v Speaker 3>then here's where you plug in your storage adapter. But

1346
01:09:50.800 --> 01:09:53.239
<v Speaker 3>I think that people are more familiar with the idea

1347
01:09:53.319 --> 01:09:55.920
<v Speaker 3>that the ORM is going to be the framework that

1348
01:09:56.000 --> 01:09:59.920
<v Speaker 3>dictates business logic rules with the data association.

1349
01:10:00.560 --> 01:10:03.319
<v Speaker 6>Yeah, which is what we do, yeah, bread and butter.

1350
01:10:03.399 --> 01:10:05.680
<v Speaker 3>Yeah, yep. Cool.

1351
01:10:05.720 --> 01:10:08.520
<v Speaker 1>Well, I think this has been so interesting to just

1352
01:10:08.600 --> 01:10:11.520
<v Speaker 1>kind of listen in on more than participate in. Usually

1353
01:10:11.560 --> 01:10:16.560
<v Speaker 1>I'm jabbering all the time. Sure, but if people want

1354
01:10:16.600 --> 01:10:19.199
<v Speaker 1>to learn more, where do they go find more information?

1355
01:10:19.680 --> 01:10:22.199
<v Speaker 6>Yeah? Sure, you know, so we're joy stash or m

1356
01:10:22.479 --> 01:10:25.520
<v Speaker 6>period I O and you had mentioned you, and if

1357
01:10:25.560 --> 01:10:27.760
<v Speaker 6>you just google for Joyce or m we do kind

1358
01:10:27.760 --> 01:10:31.760
<v Speaker 6>of come up higher in the and the results. We've

1359
01:10:31.760 --> 01:10:35.319
<v Speaker 6>got to get hump project feel free too. Oh and oh,

1360
01:10:35.359 --> 01:10:36.720
<v Speaker 6>we use to have a slack. But what's the thing

1361
01:10:36.720 --> 01:10:40.119
<v Speaker 6>that you you say is discord? You know discord? Uh, actually,

1362
01:10:40.399 --> 01:10:42.039
<v Speaker 6>I'm make sure I'm locked into that when if I

1363
01:10:42.560 --> 01:10:46.199
<v Speaker 6>mentioned it. But yeah, feel free to to stop by.

1364
01:10:46.960 --> 01:10:49.319
<v Speaker 6>You know, I want to make the disclaimer for the

1365
01:10:49.359 --> 01:10:51.520
<v Speaker 6>audience that the the r mu US is a big

1366
01:10:51.560 --> 01:10:53.920
<v Speaker 6>bet on your code base, right, and so we take

1367
01:10:54.039 --> 01:10:56.520
<v Speaker 6>very seriously that if you structure your code base around Joyce,

1368
01:10:56.560 --> 01:10:59.079
<v Speaker 6>that that you're taking a bet. And we really do

1369
01:10:59.600 --> 01:11:02.319
<v Speaker 6>respect and appreciate that. But yeah, but would love to

1370
01:11:02.359 --> 01:11:06.119
<v Speaker 6>have anybody kick the tires and point us out. You know, AJ,

1371
01:11:06.279 --> 01:11:07.760
<v Speaker 6>you've found a few things in the docks that could

1372
01:11:07.800 --> 01:11:10.279
<v Speaker 6>probably be for stuff. Would love to have you know,

1373
01:11:10.319 --> 01:11:12.600
<v Speaker 6>any issues around those things to help you on boarding

1374
01:11:12.640 --> 01:11:16.039
<v Speaker 6>process or things that we're missing. Would really appreciate it.

1375
01:11:19.159 --> 01:11:22.840
<v Speaker 2>Cool, Well, let's go ahead and do our picks now.

1376
01:11:22.880 --> 01:11:24.960
<v Speaker 1>It sounds like you may have listened to an episode

1377
01:11:25.000 --> 01:11:26.920
<v Speaker 1>of the show, so you probably know what picks are.

1378
01:11:27.920 --> 01:11:29.039
<v Speaker 2>Just for anyone who's new.

1379
01:11:29.680 --> 01:11:32.600
<v Speaker 1>I haven't said this in a while, but picks are

1380
01:11:32.600 --> 01:11:34.159
<v Speaker 1>basically shout outs about anything.

1381
01:11:34.319 --> 01:11:36.439
<v Speaker 2>So I usually do board games.

1382
01:11:36.479 --> 01:11:39.760
<v Speaker 1>We've had other people on Ruby Rogues we had picks

1383
01:11:39.760 --> 01:11:42.439
<v Speaker 1>and they you know, one guy did beer picks every week.

1384
01:11:43.800 --> 01:11:45.479
<v Speaker 2>You know, people pick TV shows.

1385
01:11:45.800 --> 01:11:48.079
<v Speaker 1>People pick tech stuff too, right, I mean this is

1386
01:11:48.119 --> 01:11:49.319
<v Speaker 1>a technical show.

1387
01:11:50.479 --> 01:11:51.399
<v Speaker 2>We've had people.

1388
01:11:51.119 --> 01:11:54.079
<v Speaker 1>Pick political candidates, though I'm not jazzed about that all

1389
01:11:54.119 --> 01:11:57.199
<v Speaker 1>the time because people have feels about that, right, and

1390
01:11:57.279 --> 01:11:59.600
<v Speaker 1>that's not really what we're about. But if you care

1391
01:11:59.600 --> 01:12:04.439
<v Speaker 1>about it, you can say it. So anyway, let's go

1392
01:12:04.479 --> 01:12:06.279
<v Speaker 1>ahead and start with Steve and then we'll work our

1393
01:12:06.319 --> 01:12:08.359
<v Speaker 1>way through the panel.

1394
01:12:09.680 --> 01:12:10.319
<v Speaker 4>Yeah, Steven.

1395
01:12:10.840 --> 01:12:12.520
<v Speaker 5>First of all, i'd like to point out I appreciate

1396
01:12:12.560 --> 01:12:14.840
<v Speaker 5>that you spell your first in the correct way, not

1397
01:12:15.079 --> 01:12:16.279
<v Speaker 5>with ian.

1398
01:12:16.960 --> 01:12:17.279
<v Speaker 6>Sure.

1399
01:12:17.680 --> 01:12:19.119
<v Speaker 4>I meant to note that at the beginning.

1400
01:12:19.920 --> 01:12:22.479
<v Speaker 2>Uh, back for my brother about eight times.

1401
01:12:23.399 --> 01:12:25.520
<v Speaker 5>What's funny is and I think I might have mentioned

1402
01:12:25.520 --> 01:12:29.199
<v Speaker 5>this before. I have a brother named Steven. He spelled

1403
01:12:29.199 --> 01:12:32.520
<v Speaker 5>it with a V. He's adopted, uh, and so he

1404
01:12:32.640 --> 01:12:34.600
<v Speaker 5>was already named that one my parents adopted. So we're

1405
01:12:34.600 --> 01:12:37.800
<v Speaker 5>big Stephen, little Steve or I prefer handsome Steve, not

1406
01:12:37.880 --> 01:12:38.600
<v Speaker 5>so handsome Steve.

1407
01:12:38.640 --> 01:12:40.199
<v Speaker 4>You know, it just depends on text.

1408
01:12:40.920 --> 01:12:46.439
<v Speaker 5>But anyway, in regards to two picks, my picks are

1409
01:12:46.479 --> 01:12:49.760
<v Speaker 5>generally the highlight of any episode in there my dad

1410
01:12:49.840 --> 01:12:54.760
<v Speaker 5>jokes of the week, So be prepared to laugh yourself silly,

1411
01:12:55.279 --> 01:13:00.000
<v Speaker 5>just kidding, all right. So, for instance, I asked my wife,

1412
01:13:00.239 --> 01:13:03.840
<v Speaker 5>being a she's a rather non technical person, shall we say,

1413
01:13:04.439 --> 01:13:07.119
<v Speaker 5>I asked her why her password was spelled out snow

1414
01:13:07.159 --> 01:13:10.560
<v Speaker 5>white and the seven dwarves, And she said, I was

1415
01:13:10.560 --> 01:13:12.399
<v Speaker 5>told it had it to be at least eight characters.

1416
01:13:14.680 --> 01:13:17.239
<v Speaker 3>You got it.

1417
01:13:17.800 --> 01:13:20.000
<v Speaker 2>Yeah, that was better than most of the ones he

1418
01:13:20.119 --> 01:13:20.640
<v Speaker 2>comes up with.

1419
01:13:23.560 --> 01:13:24.199
<v Speaker 4>Yeah, I was.

1420
01:13:24.399 --> 01:13:26.880
<v Speaker 5>I was sitting in traffic the other day and that's

1421
01:13:26.920 --> 01:13:33.119
<v Speaker 5>probably why I got run over. Right. And then question

1422
01:13:33.199 --> 01:13:36.399
<v Speaker 5>of the week. If dentists make their money off of

1423
01:13:36.399 --> 01:13:39.279
<v Speaker 5>people with bad teeth, why should I trust a toothpaste

1424
01:13:39.279 --> 01:13:41.840
<v Speaker 5>that nine out of ten dentists recommend.

1425
01:13:44.520 --> 01:13:45.720
<v Speaker 4>It's all about self interest?

1426
01:13:45.760 --> 01:13:47.199
<v Speaker 3>You know, got them?

1427
01:13:48.000 --> 01:13:49.720
<v Speaker 2>I think that's a fair kafiat.

1428
01:13:50.840 --> 01:13:55.199
<v Speaker 4>No, it was like I give you have you anyway?

1429
01:13:56.239 --> 01:13:58.600
<v Speaker 3>I think not out of ten dentists recommend all of

1430
01:13:58.640 --> 01:13:59.439
<v Speaker 3>the toothpastes.

1431
01:14:00.239 --> 01:14:04.560
<v Speaker 4>Right, just Anny, please use something. Those are my picks.

1432
01:14:05.079 --> 01:14:07.159
<v Speaker 2>Nine out of ten dentists that we paid to say.

1433
01:14:07.159 --> 01:14:10.800
<v Speaker 2>So anyway, is the asterisk?

1434
01:14:11.159 --> 01:14:14.039
<v Speaker 3>All right? So since we're on this topic of SQL,

1435
01:14:14.760 --> 01:14:18.359
<v Speaker 3>I'm just gonna throw down. There's a typescript to jazz

1436
01:14:18.439 --> 01:14:21.680
<v Speaker 3>doc module that'll be linked. It's called TS hyphen two

1437
01:14:21.920 --> 01:14:25.279
<v Speaker 3>hyphen js doc. It's exactly what it sounds because I

1438
01:14:25.279 --> 01:14:28.239
<v Speaker 3>don't like typescript. I hate typescript. I think typescript is

1439
01:14:28.239 --> 01:14:32.560
<v Speaker 3>an abomination. You know this. I love types, and I

1440
01:14:32.640 --> 01:14:35.199
<v Speaker 3>love that the typescript checker is getting better and better

1441
01:14:35.279 --> 01:14:39.560
<v Speaker 3>at being able to interpret JavaScript in JavaScript types, and

1442
01:14:39.600 --> 01:14:41.439
<v Speaker 3>I hope that that goes forward. I'd love to see

1443
01:14:41.439 --> 01:14:44.680
<v Speaker 3>one day where you know, maybe collectively we can just

1444
01:14:44.760 --> 01:14:47.399
<v Speaker 3>all drop typescript because the typescript checker is so good

1445
01:14:47.399 --> 01:14:50.319
<v Speaker 3>at JavaScript types that you don't even need to annotate anymore.

1446
01:14:50.359 --> 01:14:53.399
<v Speaker 3>It just gets it. That would be Amazing's that's like

1447
01:14:53.560 --> 01:14:59.039
<v Speaker 3>zig level. The other thing is there's a module called

1448
01:14:59.239 --> 01:15:03.479
<v Speaker 3>my sequel dump TS my SQL hyphen dump pipal t

1449
01:15:03.479 --> 01:15:06.399
<v Speaker 3>iphen ts and this will allow you, of course to

1450
01:15:06.600 --> 01:15:10.800
<v Speaker 3>dump tables out of your my SQL database and then

1451
01:15:10.840 --> 01:15:12.439
<v Speaker 3>get the typescript of them, and then you can run

1452
01:15:12.479 --> 01:15:14.359
<v Speaker 3>the typescript to jes doc to get the jas dock

1453
01:15:14.439 --> 01:15:16.359
<v Speaker 3>of them, and then you can start to you can

1454
01:15:16.439 --> 01:15:20.079
<v Speaker 3>start to make your code better in the sense of

1455
01:15:20.119 --> 01:15:23.039
<v Speaker 3>being able to have type checking, you know, misspellings checked,

1456
01:15:23.039 --> 01:15:28.439
<v Speaker 3>et cetera, and add to them. Yeah, I don't think

1457
01:15:28.439 --> 01:15:31.600
<v Speaker 3>that you would need if you're going this route, I don't.

1458
01:15:31.960 --> 01:15:34.640
<v Speaker 3>I think joycet is solving this problem for you. If

1459
01:15:34.640 --> 01:15:38.039
<v Speaker 3>you're adopting JOYST I don't think you'd need these. But

1460
01:15:38.119 --> 01:15:39.760
<v Speaker 3>this would be in the case where you have an

1461
01:15:39.800 --> 01:15:43.359
<v Speaker 3>existing project and you're trying to get certain parts of

1462
01:15:43.359 --> 01:15:46.359
<v Speaker 3>that project in a in a better way so that

1463
01:15:46.439 --> 01:15:49.880
<v Speaker 3>you can feel safer and sleep better at night about it. Then,

1464
01:15:49.920 --> 01:15:54.159
<v Speaker 3>of course sq se SQLC like I said, it's kind

1465
01:15:54.159 --> 01:15:58.119
<v Speaker 3>of like a reverse sequel query builder because you just

1466
01:15:58.199 --> 01:16:01.359
<v Speaker 3>write the sequel and then it gives you the queries.

1467
01:16:02.199 --> 01:16:08.720
<v Speaker 3>And it's not a binding. Just to be clear, it is, well,

1468
01:16:08.720 --> 01:16:10.479
<v Speaker 3>I mean it is a binding from the perspective that

1469
01:16:10.520 --> 01:16:13.840
<v Speaker 3>it uses the sequel driver. But it's it's not it's

1470
01:16:13.880 --> 01:16:20.800
<v Speaker 3>not calling that that well, it builds, it builds out

1471
01:16:21.439 --> 01:16:24.760
<v Speaker 3>it it builds it out. It's not it's not copying well,

1472
01:16:24.800 --> 01:16:26.760
<v Speaker 3>it is copying from the file. It's not using the

1473
01:16:26.760 --> 01:16:29.119
<v Speaker 3>file you created anyway you can see what it is.

1474
01:16:29.520 --> 01:16:32.520
<v Speaker 3>But sq C I think is the smartest approach because

1475
01:16:32.560 --> 01:16:35.079
<v Speaker 3>it seems like it covers not the ninety five percent

1476
01:16:35.199 --> 01:16:38.399
<v Speaker 3>but the ninety nine point five percent in terms of

1477
01:16:38.479 --> 01:16:41.920
<v Speaker 3>as long as you don't need to do meditable manipulations,

1478
01:16:42.199 --> 01:16:44.640
<v Speaker 3>it's got your back and it's and since you have

1479
01:16:44.680 --> 01:16:48.880
<v Speaker 3>to learn SQL anyway, query builders don't alleviate your need

1480
01:16:48.920 --> 01:16:51.439
<v Speaker 3>to learn SQL. If they did, then I'd say, yeah,

1481
01:16:51.520 --> 01:16:53.079
<v Speaker 3>let's get on the query builder. But the truth of

1482
01:16:53.119 --> 01:16:55.800
<v Speaker 3>the matter is, at the end of the day, chat

1483
01:16:55.840 --> 01:16:59.960
<v Speaker 3>GPT is going to be bomb awesome at generating CQ

1484
01:17:00.279 --> 01:17:02.680
<v Speaker 3>for you, and it's going to be mediocre at best

1485
01:17:02.680 --> 01:17:07.119
<v Speaker 3>at generating queries in your query builder of choice. Well,

1486
01:17:07.359 --> 01:17:09.479
<v Speaker 3>I don't know. I haven't tried it with that specific

1487
01:17:09.520 --> 01:17:14.039
<v Speaker 3>use case in the most recent version, but my previous

1488
01:17:14.159 --> 01:17:17.279
<v Speaker 3>experience with it was it does awesome its SQL, and

1489
01:17:17.319 --> 01:17:20.079
<v Speaker 3>it's really mediocre when it comes to the SQL abstractions.

1490
01:17:20.560 --> 01:17:23.640
<v Speaker 3>So sql C is something that seems to pair really

1491
01:17:23.640 --> 01:17:26.319
<v Speaker 3>well with LMS in terms of being able to get

1492
01:17:26.359 --> 01:17:31.479
<v Speaker 3>the statistically likely correct sequel, which sl really lends itself

1493
01:17:31.520 --> 01:17:35.199
<v Speaker 3>incredibly well to statistical analysis, like that's a match made

1494
01:17:35.239 --> 01:17:39.279
<v Speaker 3>in heaven then Sloanik. Sloanik is kind of a different

1495
01:17:39.319 --> 01:17:44.239
<v Speaker 3>approach in terms of you are putting your queries inside

1496
01:17:44.399 --> 01:17:51.239
<v Speaker 3>of templates, inside of your JavaScript code, but it is

1497
01:17:51.800 --> 01:17:54.199
<v Speaker 3>it's kind of a middle ground between SQLC and a

1498
01:17:54.239 --> 01:17:58.640
<v Speaker 3>query builder in that it's doing the query building dynamically,

1499
01:17:58.680 --> 01:18:02.279
<v Speaker 3>but you are getting the type check on it. But

1500
01:18:02.439 --> 01:18:04.479
<v Speaker 3>SQL see I think, I think sql C is the

1501
01:18:04.520 --> 01:18:07.720
<v Speaker 3>real gold, but sloanik is something that's certainly an interesting option.

1502
01:18:07.800 --> 01:18:12.159
<v Speaker 3>And then you've got template blocks that are SQL tagged

1503
01:18:12.159 --> 01:18:14.439
<v Speaker 3>and so you can get highlighting and stuff like that.

1504
01:18:14.880 --> 01:18:18.640
<v Speaker 3>And then so that's the SEQL stuff that out of

1505
01:18:18.640 --> 01:18:22.640
<v Speaker 3>the way. Two other quick things, swift UI seems like

1506
01:18:22.680 --> 01:18:27.199
<v Speaker 3>amazing and the Android jetpack composed is either it's either

1507
01:18:27.560 --> 01:18:30.039
<v Speaker 3>the clone of swift ui or swift u I is

1508
01:18:30.079 --> 01:18:32.840
<v Speaker 3>the clone of that. And you know Apple likes to

1509
01:18:32.880 --> 01:18:35.319
<v Speaker 3>perfect things when it clones them and then pretend like

1510
01:18:35.359 --> 01:18:38.359
<v Speaker 3>it's the first because it's so good that you know,

1511
01:18:38.680 --> 01:18:40.199
<v Speaker 3>they knock it out of the park when they do it.

1512
01:18:40.600 --> 01:18:43.560
<v Speaker 3>But there's two talks swift UI essentials and introduction is

1513
01:18:43.600 --> 01:18:46.399
<v Speaker 3>swift u I. And if I close my eyes, what

1514
01:18:46.439 --> 01:18:49.039
<v Speaker 3>I hear is react React, React react, But when I

1515
01:18:49.079 --> 01:18:51.439
<v Speaker 3>open my eyes, what I see looks more like view

1516
01:18:51.479 --> 01:18:54.840
<v Speaker 3>and like, oh this actually, this actually looks like it

1517
01:18:54.840 --> 01:18:57.800
<v Speaker 3>would work. Because there's there's the there's the promise of react,

1518
01:18:57.840 --> 01:18:59.600
<v Speaker 3>and then there's the reality that we're all kind of

1519
01:18:59.600 --> 01:19:02.720
<v Speaker 3>familiar swift Ui seems to be both the promise and

1520
01:19:02.760 --> 01:19:05.880
<v Speaker 3>the reality of react. I'm really interested to get more

1521
01:19:05.920 --> 01:19:08.279
<v Speaker 3>into it. And then last thing, I am going to

1522
01:19:08.319 --> 01:19:13.399
<v Speaker 3>make a political pick. I Oh, Trump just makes me

1523
01:19:13.479 --> 01:19:17.880
<v Speaker 3>so ah, can we not have good choices? But then

1524
01:19:18.000 --> 01:19:20.800
<v Speaker 3>but then every time, every time I think we're the

1525
01:19:20.880 --> 01:19:23.279
<v Speaker 3>dregs where the bottom of the barrel? Can this get

1526
01:19:23.279 --> 01:19:26.720
<v Speaker 3>any worse? Then it's like he does an interview that's

1527
01:19:26.760 --> 01:19:29.199
<v Speaker 3>with people that are a different audience, because when he

1528
01:19:29.239 --> 01:19:33.279
<v Speaker 3>speaks to the general public, I'm just like, oh, please no.

1529
01:19:34.319 --> 01:19:37.159
<v Speaker 3>But then sometimes when he speaks to a specific audience,

1530
01:19:37.199 --> 01:19:38.840
<v Speaker 3>it's like, all of a sudden, he's a genius that

1531
01:19:38.960 --> 01:19:41.760
<v Speaker 3>understands how the world works. And so he gave this

1532
01:19:41.840 --> 01:19:46.439
<v Speaker 3>interview or did this presentation in Q and A with Frontline,

1533
01:19:46.720 --> 01:19:50.520
<v Speaker 3>and like everything that he said was actually intelligent, And

1534
01:19:50.560 --> 01:19:52.760
<v Speaker 3>then I had to challenge all my beliefs again. And

1535
01:19:55.760 --> 01:19:56.479
<v Speaker 3>those are my picks.

1536
01:19:56.880 --> 01:20:03.079
<v Speaker 2>What yeah.

1537
01:20:03.119 --> 01:20:05.239
<v Speaker 1>I think everybody who listens to this show on a

1538
01:20:05.239 --> 01:20:08.359
<v Speaker 1>regular basis knows that I'm heavily politically involved. I'm just

1539
01:20:08.359 --> 01:20:12.520
<v Speaker 1>not gonna comment, at least not here. I am working

1540
01:20:12.600 --> 01:20:16.600
<v Speaker 1>on some politically focused shows, and if you don't agree

1541
01:20:16.600 --> 01:20:18.039
<v Speaker 1>with my opinions and you don't want to hear.

1542
01:20:17.960 --> 01:20:21.800
<v Speaker 2>Them, don't listen to that show. I'm going to jump

1543
01:20:21.800 --> 01:20:22.760
<v Speaker 2>in with a couple of things.

1544
01:20:22.760 --> 01:20:25.239
<v Speaker 1>So I'm going to do a board game pick really quickly,

1545
01:20:28.239 --> 01:20:32.239
<v Speaker 1>and that game is what did we play last time

1546
01:20:33.319 --> 01:20:35.680
<v Speaker 1>we played Biblios. That's what we played. So if you

1547
01:20:35.680 --> 01:20:38.920
<v Speaker 1>haven't played Biblios, it's a card game. I'm gonna try

1548
01:20:38.960 --> 01:20:42.399
<v Speaker 1>and do this in less than a minute. But effectively,

1549
01:20:42.439 --> 01:20:46.479
<v Speaker 1>you have dice that are set out and it's if

1550
01:20:46.600 --> 01:20:49.840
<v Speaker 1>it's the score for getting the most books of that

1551
01:20:49.960 --> 01:20:52.880
<v Speaker 1>color and so, and then there are cards will let

1552
01:20:52.920 --> 01:20:53.560
<v Speaker 1>you change.

1553
01:20:53.359 --> 01:20:55.119
<v Speaker 2>The dice, so you can make it one higher or

1554
01:20:55.119 --> 01:20:55.640
<v Speaker 2>one lower.

1555
01:20:56.520 --> 01:21:01.079
<v Speaker 1>And then you're either capturing a card out of the

1556
01:21:01.119 --> 01:21:05.960
<v Speaker 1>cards that you drew, your picking a card that somebody

1557
01:21:05.960 --> 01:21:09.079
<v Speaker 1>else didn't want on their turn, or you're bidding on

1558
01:21:09.199 --> 01:21:12.560
<v Speaker 1>cards with gold after all the cards have been picked

1559
01:21:13.319 --> 01:21:16.920
<v Speaker 1>and so and then whoever has the most in whatever

1560
01:21:16.960 --> 01:21:20.199
<v Speaker 1>color you get those dice. Whoever has the most pips

1561
01:21:20.199 --> 01:21:23.000
<v Speaker 1>showing on the tops of their dice that they wont wins.

1562
01:21:22.760 --> 01:21:26.119
<v Speaker 2>It's more or less that simple board game. Geek rates it.

1563
01:21:26.359 --> 01:21:27.560
<v Speaker 1>I don't have it up in front of me, but

1564
01:21:27.640 --> 01:21:29.279
<v Speaker 1>it was like one point seven to eight or something

1565
01:21:29.319 --> 01:21:33.000
<v Speaker 1>like that. So it's very approachable if you're casual gamer.

1566
01:21:34.000 --> 01:21:37.640
<v Speaker 1>Fun game, probably a half hour game with four players.

1567
01:21:38.439 --> 01:21:41.479
<v Speaker 1>So I'm gonna pick biblios and then.

1568
01:21:43.199 --> 01:21:45.520
<v Speaker 2>I've got a couple of other picks. I went to

1569
01:21:45.560 --> 01:21:48.199
<v Speaker 2>my doctor a couple of weeks ago.

1570
01:21:50.079 --> 01:21:52.039
<v Speaker 1>Maybe I don't talk about this as much, but I

1571
01:21:52.279 --> 01:21:57.119
<v Speaker 1>have type two diabetes and the doctor prescribed me, among

1572
01:21:57.159 --> 01:22:06.079
<v Speaker 1>other things, this it's a blood glucose monitor. Now, the

1573
01:22:06.119 --> 01:22:07.960
<v Speaker 1>ones that I've used in the past, you poke your finger,

1574
01:22:08.039 --> 01:22:10.479
<v Speaker 1>you bleed onto a little test strip, and you have

1575
01:22:10.520 --> 01:22:12.359
<v Speaker 1>to remember to do it on a regular basis, and

1576
01:22:12.399 --> 01:22:15.159
<v Speaker 1>I'm not so good at that, and so I would

1577
01:22:15.239 --> 01:22:17.279
<v Speaker 1>run into the issue where, you know, I'd show up

1578
01:22:17.279 --> 01:22:18.880
<v Speaker 1>at the doctors and he's like, have you been testing

1579
01:22:18.920 --> 01:22:20.760
<v Speaker 1>your blood sugar? My answer was always not for a

1580
01:22:20.760 --> 01:22:27.840
<v Speaker 1>few months. So he prescribed me. This system is called

1581
01:22:27.880 --> 01:22:32.760
<v Speaker 1>the Freestyle Libre three and I'm not sure if you

1582
01:22:32.760 --> 01:22:35.600
<v Speaker 1>can even see it on the camera, but I've got one. Yeah,

1583
01:22:35.640 --> 01:22:37.159
<v Speaker 1>you can kind of see it right there on my arm,

1584
01:22:38.239 --> 01:22:43.319
<v Speaker 1>so you know, yeah, it connects to my phone. And

1585
01:22:43.399 --> 01:22:46.439
<v Speaker 1>so I'm much better at checking my blood sugger because

1586
01:22:46.479 --> 01:22:49.079
<v Speaker 1>i'll you know, periodically look.

1587
01:22:49.680 --> 01:22:55.399
<v Speaker 2>And it's also it's funny. I can't remember which book it.

1588
01:22:55.520 --> 01:22:57.279
<v Speaker 1>Was, but there was a book that talked about the

1589
01:22:57.279 --> 01:23:00.359
<v Speaker 1>concept of keystone habits, and those are the habit that

1590
01:23:00.399 --> 01:23:02.159
<v Speaker 1>get you to do all of the other things right.

1591
01:23:02.239 --> 01:23:04.960
<v Speaker 1>So if you're eating right, then you have a tendency

1592
01:23:05.000 --> 01:23:07.399
<v Speaker 1>to exercise because you're thinking about your fitness more and

1593
01:23:07.439 --> 01:23:10.359
<v Speaker 1>things like that. And so this has been good for

1594
01:23:10.439 --> 01:23:12.760
<v Speaker 1>me because it's kind of a reminder. I'll check my

1595
01:23:12.760 --> 01:23:14.640
<v Speaker 1>blood sugar and then I'll remember I haven't taken my

1596
01:23:14.680 --> 01:23:17.840
<v Speaker 1>medicine yet and so anyway, so there are things like

1597
01:23:17.880 --> 01:23:19.560
<v Speaker 1>that that kind of come out of it. But anyway,

1598
01:23:19.600 --> 01:23:23.560
<v Speaker 1>it's really cool. I've had a little bit of trouble

1599
01:23:23.640 --> 01:23:27.800
<v Speaker 1>with them staying on. So last night I woke up

1600
01:23:27.800 --> 01:23:29.680
<v Speaker 1>in the middle of the night because I got an

1601
01:23:29.680 --> 01:23:32.039
<v Speaker 1>alert on my phone that said that my blood sugar

1602
01:23:32.199 --> 01:23:36.600
<v Speaker 1>was dangerously low, and so you know, I went downstairs

1603
01:23:36.640 --> 01:23:39.520
<v Speaker 1>and ate something to try and get it to go up,

1604
01:23:39.560 --> 01:23:41.960
<v Speaker 1>and then when I came back upstairs, it said that

1605
01:23:42.039 --> 01:23:44.680
<v Speaker 1>the sensor was no longer working and it was dangerously

1606
01:23:44.760 --> 01:23:47.399
<v Speaker 1>low because it had actually come out of my arm

1607
01:23:48.239 --> 01:23:50.560
<v Speaker 1>and then had gotten poked back into my arm but

1608
01:23:50.600 --> 01:23:53.680
<v Speaker 1>not all the way, and so the tissue it was

1609
01:23:54.039 --> 01:23:57.159
<v Speaker 1>testing was not right. It was given it a bad reading,

1610
01:23:57.720 --> 01:23:59.960
<v Speaker 1>so I have had some weird issues with it.

1611
01:24:00.640 --> 01:24:02.880
<v Speaker 2>I put this one on this morning right to replace it.

1612
01:24:03.640 --> 01:24:05.119
<v Speaker 1>The nice thing is, though, is that I went on

1613
01:24:05.159 --> 01:24:07.960
<v Speaker 1>the website for the company and apparently they'll replace them

1614
01:24:08.000 --> 01:24:11.600
<v Speaker 1>if they come out early, so I just requested a

1615
01:24:11.640 --> 01:24:14.720
<v Speaker 1>new one because I have to pay for my insurance

1616
01:24:14.760 --> 01:24:18.399
<v Speaker 1>doesn't cover these, and they're like twenty twenty five bucks

1617
01:24:18.439 --> 01:24:19.479
<v Speaker 1>a pop, but they last for.

1618
01:24:19.399 --> 01:24:22.840
<v Speaker 2>Like two weeks at a time. So anyway, cool stuff.

1619
01:24:22.880 --> 01:24:24.119
<v Speaker 2>I really really dig it.

1620
01:24:24.920 --> 01:24:26.680
<v Speaker 1>And then lastly, I'm just going to put in a

1621
01:24:26.680 --> 01:24:30.199
<v Speaker 1>brief plug for JavaScript Geniuses. One of the things I

1622
01:24:30.239 --> 01:24:33.079
<v Speaker 1>think really helps people level up is if you're talking

1623
01:24:33.119 --> 01:24:36.960
<v Speaker 1>to other people on a regular basis, doing things like meetups,

1624
01:24:38.039 --> 01:24:39.680
<v Speaker 1>and so I'm providing all of those. So if you

1625
01:24:39.760 --> 01:24:42.600
<v Speaker 1>join JavaScript Geniuses, you'll get access to I'm gonna start

1626
01:24:42.600 --> 01:24:46.720
<v Speaker 1>doing videos they walk you through different JavaScript themes.

1627
01:24:46.720 --> 01:24:48.039
<v Speaker 2>So maybe I'll do a video on Joyce.

1628
01:24:48.159 --> 01:24:51.439
<v Speaker 1>I don't know, it's not on my it's not on

1629
01:24:51.439 --> 01:24:55.119
<v Speaker 1>my list yet, but we'll see anyway. Yeah, yeah, so

1630
01:24:55.159 --> 01:24:58.600
<v Speaker 1>we'll get into other stuff, maybe VAT or you know,

1631
01:24:58.720 --> 01:25:02.279
<v Speaker 1>doing agentic AI or things like that. There's all kinds

1632
01:25:02.279 --> 01:25:03.359
<v Speaker 1>of stuff I want to figure out how to do

1633
01:25:03.359 --> 01:25:06.680
<v Speaker 1>with JavaScript. So we'll do that and I'll demo it,

1634
01:25:06.760 --> 01:25:08.399
<v Speaker 1>or I'll have people come on and demo it. So

1635
01:25:08.399 --> 01:25:10.439
<v Speaker 1>maybe we'll have Steve come and talk to us about

1636
01:25:11.359 --> 01:25:14.720
<v Speaker 1>or Steven come and talk to us about Joyce. Anyway,

1637
01:25:14.800 --> 01:25:18.920
<v Speaker 1>we also do accountability calls on Monday. There's a book

1638
01:25:18.920 --> 01:25:22.159
<v Speaker 1>club and we're getting into the AI book from Obi

1639
01:25:22.159 --> 01:25:25.159
<v Speaker 1>Fernandez right now. We also do a personal development book.

1640
01:25:25.159 --> 01:25:29.359
<v Speaker 1>We're doing Awaken the Giant Within by Tony Robbins. And

1641
01:25:29.680 --> 01:25:31.119
<v Speaker 1>you can come to as much or as little of

1642
01:25:31.159 --> 01:25:34.520
<v Speaker 1>this as you want, but anyway, so it's just a

1643
01:25:34.560 --> 01:25:38.560
<v Speaker 1>way of doing community based learning and then you know,

1644
01:25:38.640 --> 01:25:41.479
<v Speaker 1>giving you videos that walk through stuff. So go to

1645
01:25:41.600 --> 01:25:43.840
<v Speaker 1>JavaScript Geniuses dot com. I will have that up this

1646
01:25:43.920 --> 01:25:48.560
<v Speaker 1>afternoon and then you can go in join the vun

1647
01:25:49.800 --> 01:25:51.399
<v Speaker 1>Steven what are your picks.

1648
01:25:52.399 --> 01:25:54.760
<v Speaker 6>Yeah, well I came in without one, so I'm just

1649
01:25:54.760 --> 01:25:58.840
<v Speaker 6>gonna have one. It's a project called grow Fast g

1650
01:25:59.359 --> 01:26:03.720
<v Speaker 6>r Fast grew Fast, and it's by this guy Benji

1651
01:26:03.840 --> 01:26:08.159
<v Speaker 6>out of the UK. He also does well, Charles, you've

1652
01:26:08.199 --> 01:26:12.119
<v Speaker 6>done active record Ruby stuff sidekick right in the Ruby community.

1653
01:26:12.159 --> 01:26:14.279
<v Speaker 6>So this guy kind of has the node version of that.

1654
01:26:14.399 --> 01:26:17.039
<v Speaker 6>Graph file Worker is the name of grafile Worker is

1655
01:26:17.039 --> 01:26:21.920
<v Speaker 6>probably his main project right now. And we use the

1656
01:26:21.920 --> 01:26:24.600
<v Speaker 6>graph file worker as like our sidekick and it works great.

1657
01:26:24.640 --> 01:26:27.960
<v Speaker 6>We you know, we like it and really props to him.

1658
01:26:27.960 --> 01:26:34.399
<v Speaker 6>He's trying to go the you know, make a business

1659
01:26:34.439 --> 01:26:36.800
<v Speaker 6>out of it, right, like not chasing after VC money,

1660
01:26:36.840 --> 01:26:38.680
<v Speaker 6>but trying to do some support and upgrades and that

1661
01:26:38.720 --> 01:26:40.319
<v Speaker 6>sort of thing, which is really amazing, you know.

1662
01:26:40.359 --> 01:26:42.800
<v Speaker 2>PROPSI in uh what they did with sidekicks.

1663
01:26:42.880 --> 01:26:49.079
<v Speaker 6>So yeah, yeah, oh I would have known him had

1664
01:26:49.119 --> 01:26:53.119
<v Speaker 6>you not asked me, but yes, uh the well, so

1665
01:26:53.119 --> 01:26:55.720
<v Speaker 6>anyway you want to Benji's other projects other than graph

1666
01:26:55.760 --> 01:26:59.039
<v Speaker 6>file Worker is this graff Fast, which is really like

1667
01:26:59.079 --> 01:27:02.680
<v Speaker 6>a ground up thinking of how a GRAPHQL run time

1668
01:27:02.720 --> 01:27:05.039
<v Speaker 6>should be, so it doesn't change graph l syntax or

1669
01:27:05.079 --> 01:27:08.439
<v Speaker 6>graph col clients or are how anybody really talks to

1670
01:27:08.479 --> 01:27:13.159
<v Speaker 6>a graph ql server. But it fundamentally, like so Joyce

1671
01:27:13.199 --> 01:27:15.479
<v Speaker 6>has to when we went through all of Joyce like

1672
01:27:15.680 --> 01:27:18.479
<v Speaker 6>using promises to like fix up all of you know,

1673
01:27:18.520 --> 01:27:20.199
<v Speaker 6>all of the n plus ones that would have happened.

1674
01:27:20.680 --> 01:27:23.720
<v Speaker 6>Grapast is a really that that just like fundamentally happens

1675
01:27:23.760 --> 01:27:27.319
<v Speaker 6>with how most graph qol servers are implemented. Like when

1676
01:27:27.359 --> 01:27:30.600
<v Speaker 6>you know the Apollo in the graph qol community or

1677
01:27:30.600 --> 01:27:33.399
<v Speaker 6>in the no community, we have Apollo server and we're

1678
01:27:33.479 --> 01:27:37.079
<v Speaker 6>curious and oh, you know, there's probably two or three

1679
01:27:37.159 --> 01:27:40.399
<v Speaker 6>or four others, but they all work this really inefficient way.

1680
01:27:41.560 --> 01:27:43.319
<v Speaker 6>If you go from an author to a book to

1681
01:27:43.319 --> 01:27:45.680
<v Speaker 6>a book review, it just like it hammers, like each

1682
01:27:45.760 --> 01:27:48.000
<v Speaker 6>layer down in the graph is just call call call

1683
01:27:48.039 --> 01:27:52.520
<v Speaker 6>call call. It's just like fundamentally is as you get

1684
01:27:52.560 --> 01:27:54.640
<v Speaker 6>down in the graph, treating every single graph note as

1685
01:27:54.640 --> 01:27:57.159
<v Speaker 6>its own call. And this grast thing just like really

1686
01:27:57.319 --> 01:28:00.159
<v Speaker 6>flips it on its head. And even as you go

1687
01:28:00.279 --> 01:28:04.319
<v Speaker 6>down the graph, it's it's making one call for for

1688
01:28:04.479 --> 01:28:06.720
<v Speaker 6>all of the nodes that you're processing. So I think

1689
01:28:06.760 --> 01:28:11.600
<v Speaker 6>it has a really great opportunity to undo a lot

1690
01:28:11.680 --> 01:28:15.159
<v Speaker 6>of the performance sort of like hideousness that most graph

1691
01:28:15.239 --> 01:28:19.880
<v Speaker 6>q al things either have to just you know, back INDs,

1692
01:28:19.880 --> 01:28:21.880
<v Speaker 6>either have to just deal with or patch around, which

1693
01:28:21.920 --> 01:28:25.760
<v Speaker 6>is what we did and Joyce and yeah, it's still

1694
01:28:25.840 --> 01:28:28.640
<v Speaker 6>super small projects and I need to spend more time

1695
01:28:28.720 --> 01:28:30.800
<v Speaker 6>with it, but that is my pick. I think it's

1696
01:28:30.800 --> 01:28:31.479
<v Speaker 6>pretty neat.

1697
01:28:33.439 --> 01:28:33.800
<v Speaker 2>Awesome.

1698
01:28:34.159 --> 01:28:34.479
<v Speaker 3>All right.

1699
01:28:34.560 --> 01:28:36.439
<v Speaker 2>Well, if people want to connect with you, where where

1700
01:28:36.439 --> 01:28:38.319
<v Speaker 2>do they find you? Yeah?

1701
01:28:38.359 --> 01:28:41.960
<v Speaker 6>Sure, you know the joysto or m dot I ow,

1702
01:28:42.039 --> 01:28:43.600
<v Speaker 6>I do have a blog that I need to get to.

1703
01:28:43.760 --> 01:28:46.439
<v Speaker 6>It's I'm a little bit embarrassed about the name. It's

1704
01:28:46.520 --> 01:28:49.680
<v Speaker 6>draconianoverlord dot com. But I picked it a long time ago.

1705
01:28:49.880 --> 01:28:52.359
<v Speaker 6>I love it when I was younger and a little

1706
01:28:52.439 --> 01:28:53.600
<v Speaker 6>more idealistic.

1707
01:28:53.760 --> 01:28:58.319
<v Speaker 3>Maybe not idealistic, but Draconian Overlord is idealistic.

1708
01:28:58.960 --> 01:29:01.319
<v Speaker 6>Yeah right, Yeah there was a uh but uh.

1709
01:29:01.399 --> 01:29:04.239
<v Speaker 2>Aspirational depend to what your ideals are.

1710
01:29:04.760 --> 01:29:08.600
<v Speaker 6>Yeah right. But also the domain name was available, like

1711
01:29:09.239 --> 01:29:10.880
<v Speaker 6>I thought of it fifteen years ago, and it's like

1712
01:29:10.920 --> 01:29:13.399
<v Speaker 6>holy domain name is available. So anyway, that's my blog.

1713
01:29:13.840 --> 01:29:13.960
<v Speaker 4>Uh.

1714
01:29:14.159 --> 01:29:16.560
<v Speaker 6>And you know, a lot of the writing is kind

1715
01:29:16.600 --> 01:29:19.880
<v Speaker 6>of older for my earlier jaa you know Java sort

1716
01:29:19.920 --> 01:29:22.760
<v Speaker 6>of heyday back in the day. But yeah, I need

1717
01:29:22.840 --> 01:29:25.000
<v Speaker 6>to post more stuff there if anybody wants to go by,

1718
01:29:25.479 --> 01:29:26.960
<v Speaker 6>but Joyce would be the main place, you know. I

1719
01:29:27.039 --> 01:29:30.439
<v Speaker 6>love to have anybody drop by and say Hi, all.

1720
01:29:30.319 --> 01:29:30.760
<v Speaker 2>Right, cool.

1721
01:29:30.840 --> 01:29:34.720
<v Speaker 3>And I do want to say I like the philosophy

1722
01:29:34.800 --> 01:29:38.199
<v Speaker 3>of Joyce. I want to I just I just want

1723
01:29:38.279 --> 01:29:40.520
<v Speaker 3>to make it clear because I'm the naysayer out of

1724
01:29:40.560 --> 01:29:43.039
<v Speaker 3>the group, Like I'm the one who's always like skeptic.

1725
01:29:43.520 --> 01:29:46.439
<v Speaker 3>I don't believe it's gonna work. Why would anybody want

1726
01:29:46.439 --> 01:29:50.600
<v Speaker 3>to use this? And I like the philosophy. You really

1727
01:29:50.640 --> 01:29:53.479
<v Speaker 3>got me when you said, well, if you need the

1728
01:29:53.560 --> 01:29:57.039
<v Speaker 3>fancy stuff that's the five percent, like, just go do

1729
01:29:57.119 --> 01:30:00.479
<v Speaker 3>the sequel that that's that that you're gonna focus on.

1730
01:30:00.880 --> 01:30:04.399
<v Speaker 3>Just be the good. Just be good at the stuff

1731
01:30:04.560 --> 01:30:06.439
<v Speaker 3>that is the simple that people need the most, and

1732
01:30:06.600 --> 01:30:09.920
<v Speaker 3>not try to cater towards the stuff where people really

1733
01:30:09.960 --> 01:30:13.920
<v Speaker 3>should Just go do the sequel. That philosophy makes me

1734
01:30:14.039 --> 01:30:17.159
<v Speaker 3>believe that this is going to have and hopefully an

1735
01:30:17.199 --> 01:30:20.159
<v Speaker 3>eternal advantage over a lot of the other ones where

1736
01:30:20.199 --> 01:30:25.000
<v Speaker 3>they try to give you these like halfway kind of things.

1737
01:30:25.479 --> 01:30:27.960
<v Speaker 3>So that that's the main point. But it looks, it

1738
01:30:28.039 --> 01:30:32.199
<v Speaker 3>looks good, and like I said, ILike it looks obvious.

1739
01:30:32.399 --> 01:30:34.800
<v Speaker 3>It looks like, well, doesn't take a genius to figure

1740
01:30:34.840 --> 01:30:37.439
<v Speaker 3>this out. It did, but it's you know, when you

1741
01:30:37.520 --> 01:30:40.520
<v Speaker 3>look at it, sure it looks it looks obvious.

1742
01:30:41.039 --> 01:30:43.000
<v Speaker 6>Yeah, no, I appreciate it. I mean that's high praise

1743
01:30:43.319 --> 01:30:46.680
<v Speaker 6>for the looking obvious is totally the goal, that's what

1744
01:30:46.800 --> 01:30:48.279
<v Speaker 6>we're after, So I really appreciate that.

1745
01:30:49.199 --> 01:30:51.720
<v Speaker 2>Yeah, by the way, it was Mike Perham, that is

1746
01:30:51.840 --> 01:30:53.119
<v Speaker 2>the psych chic guy.

1747
01:30:53.399 --> 01:30:55.399
<v Speaker 6>Actually, I don't think I could have told you that.

1748
01:30:55.479 --> 01:30:57.840
<v Speaker 6>I had completely forgotten this mea but yes, yeah, that

1749
01:30:57.960 --> 01:30:58.399
<v Speaker 6>sounds right.

1750
01:30:58.520 --> 01:31:00.399
<v Speaker 2>Yeah, we've had him on Ruby Road because he's a

1751
01:31:00.439 --> 01:31:00.920
<v Speaker 2>truer guy.

1752
01:31:01.000 --> 01:31:04.920
<v Speaker 1>Anyway, let's go ahead and wrap it up until next time,

1753
01:31:04.960 --> 01:31:05.960
<v Speaker 1>folks max out.

1754
01:31:08.640 --> 01:31:09.079
<v Speaker 5>Mm hmm
