WEBVTT

1
00:00:04.519 --> 00:00:07.799
<v Speaker 1>Hey folks, welcome back to the Ruby Rokes podcast.

2
00:00:08.039 --> 00:00:10.759
<v Speaker 2>This week, on our panel we have Valentino Stole and

3
00:00:10.919 --> 00:00:15.320
<v Speaker 2>now I'm Charles Maxwood from top End Devs. Go check

4
00:00:15.359 --> 00:00:18.960
<v Speaker 2>out my latest and greatest at AI for Ruby dot com.

5
00:00:19.640 --> 00:00:21.239
<v Speaker 2>We have a special guest this week and that is

6
00:00:21.359 --> 00:00:25.839
<v Speaker 2>JP Kamara. JP, you've been writing about concurrency.

7
00:00:27.120 --> 00:00:29.640
<v Speaker 3>We were chatting before. You live back East.

8
00:00:29.679 --> 00:00:31.000
<v Speaker 2>I don't know if you want to go into more

9
00:00:31.039 --> 00:00:34.960
<v Speaker 2>detail than that, but yeah, well maybe you should give

10
00:00:35.000 --> 00:00:35.679
<v Speaker 2>us just a little.

11
00:00:35.479 --> 00:00:36.320
<v Speaker 3>Bit of your background.

12
00:00:36.439 --> 00:00:40.000
<v Speaker 2>And we invited you for Ruby Concurrency series, so if

13
00:00:40.000 --> 00:00:40.920
<v Speaker 2>there's a story behind that.

14
00:00:40.880 --> 00:00:41.719
<v Speaker 3>I'd love to hear that too.

15
00:00:42.719 --> 00:00:43.000
<v Speaker 4>Sure.

16
00:00:43.200 --> 00:00:47.079
<v Speaker 5>Yeah, thanks for having me. Like I said, I'm JPI Kamara.

17
00:00:47.159 --> 00:00:49.840
<v Speaker 4>I'm yeah. I live in Rhode Island. It's on the

18
00:00:49.840 --> 00:00:50.439
<v Speaker 4>East Coast.

19
00:00:50.920 --> 00:00:54.159
<v Speaker 5>I'm a principal engineer at a company called Walthbox, and

20
00:00:54.600 --> 00:00:58.000
<v Speaker 5>I've been doing Ruby development for about I've been developing

21
00:00:58.039 --> 00:00:59.960
<v Speaker 5>for like sixteen seventeen years, but I've been doing Ruby

22
00:01:00.039 --> 00:01:03.920
<v Speaker 5>development for about twelve years, and some other languages mixed

23
00:01:03.920 --> 00:01:06.920
<v Speaker 5>in there as well, and so I write technical blog

24
00:01:06.959 --> 00:01:09.200
<v Speaker 5>posts over at jpcimara dot com and for the past

25
00:01:09.480 --> 00:01:13.719
<v Speaker 5>year actually I started about a year ago writing a

26
00:01:13.879 --> 00:01:17.959
<v Speaker 5>series on Ruby currency something concurrency in general, something I'm

27
00:01:17.959 --> 00:01:21.159
<v Speaker 5>super interested in, and I've wanted to create like a

28
00:01:21.200 --> 00:01:24.439
<v Speaker 5>great in depth resource for the Ruby community. And so

29
00:01:24.719 --> 00:01:27.560
<v Speaker 5>as a result of doing that as well, I ended

30
00:01:27.640 --> 00:01:31.400
<v Speaker 5>up contributing a bit to the GVL Instrumentation API. I

31
00:01:31.439 --> 00:01:34.680
<v Speaker 5>contributed the mac os support. Yeah, so I've done a

32
00:01:34.680 --> 00:01:35.920
<v Speaker 5>little bit with that. So I've worked a little bit

33
00:01:35.959 --> 00:01:40.640
<v Speaker 5>with Jean Busier and Ivo Angoe with his GBL tracing gem.

34
00:01:40.920 --> 00:01:45.280
<v Speaker 5>And i contributed the macOS support for Coeci's mn thread

35
00:01:45.319 --> 00:01:48.159
<v Speaker 5>scheduler for Ruby three point three.

36
00:01:48.319 --> 00:01:49.040
<v Speaker 4>So it's it's been.

37
00:01:49.000 --> 00:01:51.560
<v Speaker 5>Pretty fun, Like I've it's been a lot of work,

38
00:01:51.599 --> 00:01:53.200
<v Speaker 5>and I still have a lot left to do, but

39
00:01:53.239 --> 00:01:55.000
<v Speaker 5>it's it's taught me a lot. It's allowed me to

40
00:01:55.239 --> 00:01:59.200
<v Speaker 5>like contribute to Ruby itself. I've learned, you know, I'm

41
00:01:59.200 --> 00:02:03.560
<v Speaker 5>a very terrible C programmer now and so so yeah,

42
00:02:03.799 --> 00:02:06.400
<v Speaker 5>it's been an interesting year kind of digging into this.

43
00:02:06.439 --> 00:02:08.639
<v Speaker 5>And so about about three months ago I started releasing

44
00:02:08.639 --> 00:02:11.759
<v Speaker 5>the first parts of the series and those have been

45
00:02:11.840 --> 00:02:13.000
<v Speaker 5>pretty well received so far.

46
00:02:13.919 --> 00:02:17.639
<v Speaker 1>Nice, well, thanks for the work, Yeah, I look forward

47
00:02:17.680 --> 00:02:18.520
<v Speaker 1>to benefiting from it.

48
00:02:19.599 --> 00:02:21.719
<v Speaker 5>Yeah, I hope people can like it's I mean, the

49
00:02:21.759 --> 00:02:24.560
<v Speaker 5>GVL Instrumentation API. I'm using it like kind of as

50
00:02:24.639 --> 00:02:26.479
<v Speaker 5>like an educational resource. That's kind of how I got

51
00:02:26.520 --> 00:02:27.639
<v Speaker 5>into it. I was like, Oh, I really want to

52
00:02:27.639 --> 00:02:30.680
<v Speaker 5>be able to show people like how threads coordinate, how

53
00:02:30.719 --> 00:02:33.680
<v Speaker 5>the GVL plays into that. And Evo, I think you've

54
00:02:33.680 --> 00:02:35.319
<v Speaker 5>had on the on the show a couple of times.

55
00:02:36.599 --> 00:02:39.319
<v Speaker 5>His GVL tracing gem creates like a UI layer for that,

56
00:02:39.400 --> 00:02:41.120
<v Speaker 5>and so I'm using that as a basis for both

57
00:02:41.639 --> 00:02:44.360
<v Speaker 5>using his gem and also creating some like animations of

58
00:02:44.400 --> 00:02:46.199
<v Speaker 5>like how threads swap between each other and.

59
00:02:46.199 --> 00:02:46.719
<v Speaker 4>Stuff like that.

60
00:02:46.919 --> 00:02:49.280
<v Speaker 5>So that'll be in my next blog post that hasn't

61
00:02:49.280 --> 00:02:51.719
<v Speaker 5>come out yet, which is specifically digging into threads.

62
00:02:52.879 --> 00:02:54.280
<v Speaker 4>Yeah.

63
00:02:54.439 --> 00:02:54.840
<v Speaker 3>Very cool.

64
00:02:54.919 --> 00:02:55.120
<v Speaker 4>Yeah.

65
00:02:55.159 --> 00:02:58.000
<v Speaker 2>Well, and it's funny because you know, you said you've

66
00:02:58.000 --> 00:03:00.159
<v Speaker 2>been around the Ruby community for like twelve years. I

67
00:03:00.199 --> 00:03:04.039
<v Speaker 2>can't remember how long Valentino has been doing this, but.

68
00:03:03.960 --> 00:03:05.919
<v Speaker 3>You know it's been it's been a while.

69
00:03:05.759 --> 00:03:10.479
<v Speaker 2>Right, I've been doing this, what sixteen seventeen years, and

70
00:03:10.919 --> 00:03:14.199
<v Speaker 2>you know I got into programming getting into Ruby, right, So.

71
00:03:16.639 --> 00:03:18.719
<v Speaker 1>Anyway, it's it's interesting because.

72
00:03:18.439 --> 00:03:21.680
<v Speaker 2>I don't think anyone's given a coherent explanation, even back

73
00:03:21.719 --> 00:03:24.360
<v Speaker 2>when we were just kind of doing like DRB and threads,

74
00:03:25.319 --> 00:03:28.159
<v Speaker 2>given a coherent explanation of Hey, this is what this

75
00:03:28.319 --> 00:03:28.960
<v Speaker 2>is and this is.

76
00:03:28.879 --> 00:03:29.560
<v Speaker 3>How it works.

77
00:03:29.840 --> 00:03:33.680
<v Speaker 2>Right, people just complained about the gotchas, Right I tried

78
00:03:33.759 --> 00:03:36.719
<v Speaker 2>using threads and oh so bad.

79
00:03:37.240 --> 00:03:40.319
<v Speaker 1>Right, So this is this is very much needed.

80
00:03:40.360 --> 00:03:43.680
<v Speaker 2>The other thing is is that a lot of the

81
00:03:43.800 --> 00:03:48.280
<v Speaker 2>naysayers on Ruby uh cite some of the issues with concurrency,

82
00:03:48.919 --> 00:03:53.520
<v Speaker 2>and you know, it's like it's like, no, it's it's there, right,

83
00:03:53.599 --> 00:03:55.639
<v Speaker 2>if you want to use it, you can use it.

84
00:03:57.479 --> 00:03:57.680
<v Speaker 3>You know.

85
00:03:57.800 --> 00:04:00.280
<v Speaker 2>That doesn't necessarily still make it the best to for

86
00:04:00.360 --> 00:04:02.879
<v Speaker 2>every single job, but it does a lot more than

87
00:04:02.879 --> 00:04:03.800
<v Speaker 2>you're given a credit for.

88
00:04:04.000 --> 00:04:11.080
<v Speaker 5>So yeah, absolutely, yeah, I mean in terms of, yeah,

89
00:04:11.080 --> 00:04:13.319
<v Speaker 5>how people perceive it, you know, there there is a

90
00:04:13.639 --> 00:04:14.840
<v Speaker 5>just to go back to like how.

91
00:04:14.719 --> 00:04:17.199
<v Speaker 4>People used to think about it.

92
00:04:17.319 --> 00:04:19.439
<v Speaker 5>I don't remember how many years ago it was, but

93
00:04:19.560 --> 00:04:21.279
<v Speaker 5>like I don't know how well and I like it's

94
00:04:21.319 --> 00:04:22.560
<v Speaker 5>a pretty well known book, but I don't know if

95
00:04:22.600 --> 00:04:24.839
<v Speaker 5>you guys are familiar with Jesse Stormer, I think his

96
00:04:25.279 --> 00:04:28.000
<v Speaker 5>last name is. He created the series called Working with

97
00:04:28.079 --> 00:04:31.720
<v Speaker 5>Ruby and so and so he was working with Ruby

98
00:04:31.759 --> 00:04:34.839
<v Speaker 5>processes and working with Ruby threads, so like those were

99
00:04:34.920 --> 00:04:37.759
<v Speaker 5>sort of my Like I had a lot of experience

100
00:04:37.800 --> 00:04:40.519
<v Speaker 5>in other languages with concurrency, but once I came to Ruby,

101
00:04:40.560 --> 00:04:42.000
<v Speaker 5>like I didn't do a lot with it at first,

102
00:04:42.000 --> 00:04:43.879
<v Speaker 5>you know, I did like rail stuff and everything, and

103
00:04:43.879 --> 00:04:45.759
<v Speaker 5>then I ended up reading those books and they really

104
00:04:45.759 --> 00:04:47.639
<v Speaker 5>gave me a much deeper insight, and I kind of

105
00:04:47.680 --> 00:04:50.079
<v Speaker 5>wanted this to be sort of like a this series

106
00:04:50.199 --> 00:04:53.279
<v Speaker 5>is kind of like a successor to that, and like,

107
00:04:53.439 --> 00:04:56.879
<v Speaker 5>in addition, like just more context about it, because it

108
00:04:56.920 --> 00:04:58.800
<v Speaker 5>does a good job of kind of explaining like these

109
00:04:58.800 --> 00:05:01.079
<v Speaker 5>are the things you can do with threads, and Ruby

110
00:05:01.160 --> 00:05:05.639
<v Speaker 5>between threads and processes in particular, gives you the majority

111
00:05:05.680 --> 00:05:09.399
<v Speaker 5>of what you need to do any to do anything really,

112
00:05:09.519 --> 00:05:14.720
<v Speaker 5>and that's obviously demonstrated by companies handling you know, millions,

113
00:05:14.759 --> 00:05:16.480
<v Speaker 5>billions of requests all that sort of stuff.

114
00:05:16.480 --> 00:05:18.879
<v Speaker 4>Like it's very capable and you just have to know

115
00:05:18.920 --> 00:05:19.480
<v Speaker 4>how to use it.

116
00:05:20.079 --> 00:05:21.959
<v Speaker 5>And yeah, the great part with his books is they're

117
00:05:21.959 --> 00:05:23.680
<v Speaker 5>a little outdated, but like a lot of the core

118
00:05:23.720 --> 00:05:25.800
<v Speaker 5>stuff is still there and great and they're all free

119
00:05:25.879 --> 00:05:28.959
<v Speaker 5>now too, Yeah, so you can work them on the site.

120
00:05:28.600 --> 00:05:32.600
<v Speaker 5>But yeah, it's definitely the concurrency the state of conurrency

121
00:05:32.639 --> 00:05:34.920
<v Speaker 5>today in Ruby is is very different. Like there's a

122
00:05:34.959 --> 00:05:38.279
<v Speaker 5>lot more education. There's a lot more understanding of how

123
00:05:38.319 --> 00:05:40.360
<v Speaker 5>to handle like threading issues and things like that. There's

124
00:05:40.360 --> 00:05:43.199
<v Speaker 5>a lot more deep like embedding of how threading works

125
00:05:43.240 --> 00:05:44.839
<v Speaker 5>into a lot of the different tools that we use,

126
00:05:44.879 --> 00:05:49.319
<v Speaker 5>like Puma, Sidekick, solid qu all those things. And there's

127
00:05:49.319 --> 00:05:51.079
<v Speaker 5>so many great abstractions. A lot of time you don't

128
00:05:51.079 --> 00:05:52.759
<v Speaker 5>even really need to use them. You can just use

129
00:05:52.759 --> 00:05:55.079
<v Speaker 5>the abstractions, you know, And that's that's sort of what

130
00:05:55.120 --> 00:05:57.160
<v Speaker 5>I advocate for a while also just trying to educate

131
00:05:57.199 --> 00:05:59.519
<v Speaker 5>on also how to use them and how they.

132
00:05:59.360 --> 00:06:00.560
<v Speaker 4>Work sort of thing.

133
00:06:01.120 --> 00:06:02.120
<v Speaker 6>Can we take a step back?

134
00:06:02.920 --> 00:06:06.120
<v Speaker 4>Sure? Yeah, absolutely, Like I always I.

135
00:06:06.079 --> 00:06:11.160
<v Speaker 6>Always get like I always get thrown by like okay,

136
00:06:11.279 --> 00:06:14.560
<v Speaker 6>like what is parallelism, what is concurrency? Like how they're related,

137
00:06:14.639 --> 00:06:17.920
<v Speaker 6>how they're not sure you know, and how they like,

138
00:06:18.519 --> 00:06:21.920
<v Speaker 6>you know, how the handshake works with the system level

139
00:06:21.959 --> 00:06:25.720
<v Speaker 6>stuff right, like each operating system has their own like

140
00:06:25.879 --> 00:06:29.480
<v Speaker 6>implementation of like how to you know, process things like

141
00:06:29.839 --> 00:06:31.959
<v Speaker 6>how is it all related? Like can we just like

142
00:06:32.120 --> 00:06:33.759
<v Speaker 6>identify what we're talking about here?

143
00:06:35.160 --> 00:06:36.360
<v Speaker 4>Sure? Yeah?

144
00:06:36.439 --> 00:06:37.920
<v Speaker 5>And I'm not sure if you're teeing me up for

145
00:06:37.959 --> 00:06:39.920
<v Speaker 5>the section of my most recent black post that goes

146
00:06:39.920 --> 00:06:42.519
<v Speaker 5>into what is concurrency? Perhaps you are, well, we'll play

147
00:06:42.560 --> 00:06:48.160
<v Speaker 5>it if you are. But yeah, so, like there's it's

148
00:06:48.160 --> 00:06:50.399
<v Speaker 5>a great point that people kind of throw around the

149
00:06:50.399 --> 00:06:53.680
<v Speaker 5>words concurrency and parallelism and they think of them as

150
00:06:53.720 --> 00:06:55.519
<v Speaker 5>sort of meaning the same things, and they're they're a

151
00:06:55.560 --> 00:06:59.800
<v Speaker 5>little bit different. But like concurrency is essentially how do

152
00:06:59.879 --> 00:07:02.519
<v Speaker 5>I break up a bunch of tasks so that they

153
00:07:02.519 --> 00:07:06.319
<v Speaker 5>can kind of work independently, And I can and they

154
00:07:06.319 --> 00:07:08.279
<v Speaker 5>can be isolated, and so I can kind of have

155
00:07:08.360 --> 00:07:12.079
<v Speaker 5>like a good sense of how to test them in isolation,

156
00:07:12.240 --> 00:07:15.360
<v Speaker 5>how to run things in isolation, but coordinate them and

157
00:07:15.560 --> 00:07:17.680
<v Speaker 5>but it doesn't really matter like how they actually get

158
00:07:17.720 --> 00:07:20.120
<v Speaker 5>run behind the scenes. So concurrency is kind of how

159
00:07:20.160 --> 00:07:24.160
<v Speaker 5>you break up a bunch of tasks that may work together,

160
00:07:24.680 --> 00:07:26.600
<v Speaker 5>but it may be that they actually just swap back

161
00:07:26.600 --> 00:07:29.759
<v Speaker 5>and forth between each other. So for instance, like yeah, please.

162
00:07:29.800 --> 00:07:31.959
<v Speaker 2>I was gonna I was just going to say, here,

163
00:07:31.959 --> 00:07:34.000
<v Speaker 2>we're gonna say for instance, and I was going to say, well,

164
00:07:34.879 --> 00:07:38.480
<v Speaker 2>then technically people should be familiar with the idea of concurrency,

165
00:07:38.560 --> 00:07:40.959
<v Speaker 2>just with like your job cues on your rails app.

166
00:07:40.920 --> 00:07:45.439
<v Speaker 5>Right, Absolutely, job ques are a perfect example of concurrency

167
00:07:45.480 --> 00:07:49.319
<v Speaker 5>because especially in you know, the Ruby version that most

168
00:07:49.319 --> 00:07:53.319
<v Speaker 5>of us use, you know, see Ruby. Most you know,

169
00:07:53.439 --> 00:07:56.480
<v Speaker 5>Ruby code is constrained by what I don't want to

170
00:07:56.519 --> 00:07:58.319
<v Speaker 5>jump too far into this right now, but it's constrained

171
00:07:58.360 --> 00:08:00.879
<v Speaker 5>by something so that only one pe of actual Ruby

172
00:08:00.920 --> 00:08:03.199
<v Speaker 5>code can run at the same time. And so because

173
00:08:03.199 --> 00:08:05.199
<v Speaker 5>of that, most of the jobs you write, you know,

174
00:08:05.279 --> 00:08:07.959
<v Speaker 5>what they're really doing whenever they're running, like CPU bound

175
00:08:08.079 --> 00:08:10.560
<v Speaker 5>ruby code is they're they're hopping between each other. It's

176
00:08:10.560 --> 00:08:12.759
<v Speaker 5>like I've got job A. It runs for a little bit,

177
00:08:12.839 --> 00:08:14.480
<v Speaker 5>Job B runs for a little bit, Job C runs

178
00:08:14.480 --> 00:08:17.439
<v Speaker 5>for a little bit. And then where the real value

179
00:08:17.639 --> 00:08:20.720
<v Speaker 5>of having threading and Ruby comes from is where you

180
00:08:20.720 --> 00:08:23.879
<v Speaker 5>can actually paralyze things. So if we get to the

181
00:08:23.920 --> 00:08:29.240
<v Speaker 5>parallel aspect of it, Ruby can't paralyze actual like running

182
00:08:29.319 --> 00:08:32.320
<v Speaker 5>Ruby code suit bub bound ruby code, but anything that

183
00:08:32.440 --> 00:08:35.279
<v Speaker 5>what's called blocks, like anything that blocks in your code

184
00:08:35.679 --> 00:08:38.639
<v Speaker 5>can be effectively paralyzed. So, for instance, if job A, B,

185
00:08:38.759 --> 00:08:41.360
<v Speaker 5>and C all make a query. You know, job A

186
00:08:41.480 --> 00:08:44.840
<v Speaker 5>makes a query, it blocks, Job B makes a query,

187
00:08:44.919 --> 00:08:47.039
<v Speaker 5>it blocks, Job C makes a query, it blocks. They're

188
00:08:47.080 --> 00:08:50.440
<v Speaker 5>all running those queries in parallel, and so A job

189
00:08:50.480 --> 00:08:53.759
<v Speaker 5>system is absolutely the like perfect example of concurrency in Ruby,

190
00:08:53.759 --> 00:08:57.720
<v Speaker 5>where like, you have these independent tasks that all run

191
00:08:57.759 --> 00:09:00.480
<v Speaker 5>and are swapping between each other, and at certain points

192
00:09:00.519 --> 00:09:04.159
<v Speaker 5>can actually run directly in parallel, so you can actually

193
00:09:04.159 --> 00:09:09.639
<v Speaker 5>have three things running simultaneously. Whereas concurrency as a as

194
00:09:09.639 --> 00:09:12.360
<v Speaker 5>a basic principle, sometimes they run at the same time,

195
00:09:12.440 --> 00:09:14.799
<v Speaker 5>sometimes they hop back and forth between each other. The

196
00:09:14.840 --> 00:09:17.000
<v Speaker 5>concurrency is kind of that abstraction that lets you not

197
00:09:17.080 --> 00:09:21.039
<v Speaker 5>care about it. I write these independent tasks operating system

198
00:09:21.200 --> 00:09:23.919
<v Speaker 5>Ruby run time handle this for me, make it parallel

199
00:09:24.000 --> 00:09:28.039
<v Speaker 5>sometimes otherwise you know, just hop between them, share resources.

200
00:09:27.480 --> 00:09:28.120
<v Speaker 4>That sort of thing.

201
00:09:28.799 --> 00:09:32.480
<v Speaker 5>Right Does that does that kind of help define it

202
00:09:32.519 --> 00:09:33.840
<v Speaker 5>a little bit Valentino.

203
00:09:33.519 --> 00:09:34.799
<v Speaker 4>Or or do you want more on that?

204
00:09:35.720 --> 00:09:39.759
<v Speaker 6>Yeah? Well that's great. I mean I loved how your

205
00:09:39.840 --> 00:09:43.480
<v Speaker 6>latest articles kind of summarize it as an orchestrator is

206
00:09:43.559 --> 00:09:47.799
<v Speaker 6>being concurrency, and you know, parallelism is more of just

207
00:09:47.879 --> 00:09:50.960
<v Speaker 6>like the things running at the same exact time. It

208
00:09:51.000 --> 00:09:54.840
<v Speaker 6>doesn't really matter, like you know, there's there's nothing anything

209
00:09:54.919 --> 00:09:56.840
<v Speaker 6>waiting for it, so.

210
00:09:56.960 --> 00:09:59.679
<v Speaker 2>Right, yeah, I kind of want to jump in here though,

211
00:09:59.720 --> 00:10:03.679
<v Speaker 2>because some people are going to say, okay, well, but

212
00:10:03.840 --> 00:10:05.720
<v Speaker 2>why why do I care and why do I need

213
00:10:05.759 --> 00:10:06.320
<v Speaker 2>to know about it?

214
00:10:06.399 --> 00:10:06.559
<v Speaker 6>Right?

215
00:10:06.600 --> 00:10:10.240
<v Speaker 2>Because the why do I care might be that it's

216
00:10:10.279 --> 00:10:11.679
<v Speaker 2>faster or more efficient or.

217
00:10:11.600 --> 00:10:13.360
<v Speaker 3>Whatever myriad of other reasons.

218
00:10:13.440 --> 00:10:15.039
<v Speaker 2>Right, But then why do I even need to know

219
00:10:15.080 --> 00:10:17.960
<v Speaker 2>about it, especially if there is an orchestrator behind the

220
00:10:17.960 --> 00:10:19.200
<v Speaker 2>scenes that does it all for me?

221
00:10:20.200 --> 00:10:26.360
<v Speaker 5>M Yeah, that's a good question. I think there's a

222
00:10:26.360 --> 00:10:28.000
<v Speaker 5>couple of layers to why you might want to care

223
00:10:28.039 --> 00:10:30.360
<v Speaker 5>about it. So the start of the series, I wrote,

224
00:10:30.360 --> 00:10:32.679
<v Speaker 5>so you know, the piece we're kind of coming in

225
00:10:32.720 --> 00:10:36.200
<v Speaker 5>at for anybody listening to this episode is, you know,

226
00:10:36.240 --> 00:10:38.039
<v Speaker 5>we came out at the point of the blog post

227
00:10:38.120 --> 00:10:42.240
<v Speaker 5>Ruby methods are Colorless, which talks about how like what

228
00:10:42.360 --> 00:10:46.039
<v Speaker 5>the different primitives of Ruby are for concurrency and parallelism,

229
00:10:46.120 --> 00:10:48.440
<v Speaker 5>because some things in Ruby can't actually run in parallel

230
00:10:48.679 --> 00:10:49.320
<v Speaker 5>and we can talk.

231
00:10:49.240 --> 00:10:52.159
<v Speaker 6>Right, So what is what do you mean by colors? Like,

232
00:10:52.519 --> 00:10:55.679
<v Speaker 6>I was curious about this. I love your explanation of

233
00:10:55.679 --> 00:10:58.679
<v Speaker 6>your post, but you want to clear that up.

234
00:10:59.320 --> 00:11:01.080
<v Speaker 4>Yeah, absolutely, that's a that's a great point.

235
00:11:01.960 --> 00:11:04.799
<v Speaker 5>So colorless programming was actually a concept I had no

236
00:11:04.879 --> 00:11:05.799
<v Speaker 5>idea about a year ago.

237
00:11:05.799 --> 00:11:06.039
<v Speaker 4>Either.

238
00:11:06.080 --> 00:11:08.200
<v Speaker 5>That's kind of like part of what got me going

239
00:11:08.200 --> 00:11:10.600
<v Speaker 5>in this whole thing. Is somebody just literally I don't

240
00:11:10.600 --> 00:11:11.879
<v Speaker 5>know if you guys have heard of the Prime Egen.

241
00:11:12.000 --> 00:11:16.919
<v Speaker 5>He's this like kind of JavaScript personality. And he talked

242
00:11:16.960 --> 00:11:19.279
<v Speaker 5>about like colorless programming and go and I'm like, what

243
00:11:19.559 --> 00:11:21.080
<v Speaker 5>I was like, I'd never heard that term before. What

244
00:11:21.120 --> 00:11:23.879
<v Speaker 5>does colorless mean? Same as kind of you're asking right now?

245
00:11:24.759 --> 00:11:27.039
<v Speaker 5>And so I looked into it, and what really colorless

246
00:11:27.080 --> 00:11:31.759
<v Speaker 5>means is that there's some languages that and JavaScript is

247
00:11:31.759 --> 00:11:33.679
<v Speaker 5>the example that we use here, but some languages, when

248
00:11:33.679 --> 00:11:37.600
<v Speaker 5>you want to do things concurrently or in parallel or whatever,

249
00:11:37.639 --> 00:11:40.559
<v Speaker 5>you have to explicitly say like, hey, this piece of code,

250
00:11:40.639 --> 00:11:43.679
<v Speaker 5>I want you to do this asynchronous thing now.

251
00:11:43.679 --> 00:11:44.919
<v Speaker 4>And the most common way you'll find in.

252
00:11:44.960 --> 00:11:48.000
<v Speaker 5>Languages is you literally say, like, here's an async piece

253
00:11:48.039 --> 00:11:49.799
<v Speaker 5>of code. When I go to run it, I have

254
00:11:49.840 --> 00:11:52.120
<v Speaker 5>to tell you I would like you to await this

255
00:11:52.159 --> 00:11:54.720
<v Speaker 5>thing to finish, right, and.

256
00:11:54.320 --> 00:11:59.799
<v Speaker 2>So contact Yeah, yeah, my word's not working, but yeah,

257
00:12:00.759 --> 00:12:03.600
<v Speaker 2>they have keywords a sync a weight exactly.

258
00:12:03.679 --> 00:12:06.279
<v Speaker 5>Yeah, JavaScript has a sink a weight. Rust also actually

259
00:12:06.320 --> 00:12:09.360
<v Speaker 5>has a sinklewight. Python, a bunch of other languages, there's

260
00:12:09.399 --> 00:12:11.840
<v Speaker 5>like kind of a fork in some languages have chosen

261
00:12:11.879 --> 00:12:13.600
<v Speaker 5>to go a sink a weight, and some languages have

262
00:12:13.720 --> 00:12:16.440
<v Speaker 5>chosen to go a different way. And so when you

263
00:12:16.480 --> 00:12:19.559
<v Speaker 5>have a sinkle weight, it effectively like I describe it

264
00:12:19.600 --> 00:12:22.000
<v Speaker 5>as kind of like infecting your code in a sense.

265
00:12:22.120 --> 00:12:24.360
<v Speaker 5>It's like every piece of code that wants to use

266
00:12:24.440 --> 00:12:27.840
<v Speaker 5>this asink a weight syntax has to buy into it.

267
00:12:27.879 --> 00:12:30.639
<v Speaker 5>You're always like, it's these layers of like I'm calling

268
00:12:30.679 --> 00:12:32.679
<v Speaker 5>a sinkle weight, Okay, the thing calling that has to

269
00:12:32.679 --> 00:12:34.240
<v Speaker 5>do a sinkle weight, the think calling that, and the

270
00:12:34.279 --> 00:12:36.279
<v Speaker 5>moment you don't do that, you kind of get into

271
00:12:36.279 --> 00:12:40.399
<v Speaker 5>this like clunky syntax promises and all that stuff. And

272
00:12:40.480 --> 00:12:43.360
<v Speaker 5>so the cool thing about colorless languages and Ruby and

273
00:12:43.600 --> 00:12:48.120
<v Speaker 5>some other languages as well is that the run time

274
00:12:48.200 --> 00:12:51.279
<v Speaker 5>takes care of that asynchronous behavior for you.

275
00:12:51.120 --> 00:12:53.320
<v Speaker 4>You don't have to worry about saying like I'm about

276
00:12:53.360 --> 00:12:53.759
<v Speaker 4>to do this.

277
00:12:53.840 --> 00:12:55.600
<v Speaker 5>I want to do this asyncrenous thing, so I have

278
00:12:55.639 --> 00:12:58.200
<v Speaker 5>to know to call await a sinc all those types

279
00:12:58.200 --> 00:13:01.320
<v Speaker 5>of things, and Ruby like you say, like I want

280
00:13:01.320 --> 00:13:03.320
<v Speaker 5>to call this thing. I want to let's say an

281
00:13:03.440 --> 00:13:05.679
<v Speaker 5>HTP request, And so I make my HDP request and

282
00:13:05.759 --> 00:13:07.480
<v Speaker 5>Ruby goes like, oh, hey, this is a bocking thing.

283
00:13:07.919 --> 00:13:10.360
<v Speaker 5>I'm just gonna tell your thread or your fiber or

284
00:13:10.399 --> 00:13:12.639
<v Speaker 5>whatever go to sleep for now. I'll take care of

285
00:13:12.679 --> 00:13:14.320
<v Speaker 5>this for you behind the scenes. And if there's any

286
00:13:14.320 --> 00:13:16.360
<v Speaker 5>other threads or fibers running, you know, like if our

287
00:13:16.440 --> 00:13:18.919
<v Speaker 5>job example, if there's another job that needs to do something, hey,

288
00:13:18.960 --> 00:13:20.879
<v Speaker 5>you can do something now. And so I don't have

289
00:13:20.919 --> 00:13:22.679
<v Speaker 5>as a programmer, I don't have to worry about that.

290
00:13:22.720 --> 00:13:25.720
<v Speaker 5>I don't have to have that infect my code. And

291
00:13:25.759 --> 00:13:28.279
<v Speaker 5>the reason they call it colorless is from an article

292
00:13:28.279 --> 00:13:31.120
<v Speaker 5>from twenty fifteen where he referred to like, you have

293
00:13:31.279 --> 00:13:34.480
<v Speaker 5>red and blue functions. So hopefully I don't get it wrong,

294
00:13:34.519 --> 00:13:36.480
<v Speaker 5>but red, I think, is the asynchronous function. In blue

295
00:13:36.559 --> 00:13:39.799
<v Speaker 5>is your synchronous functions, and so like you end up

296
00:13:39.799 --> 00:13:42.679
<v Speaker 5>having this like a coloring of your code. Every ACYNC

297
00:13:42.679 --> 00:13:44.759
<v Speaker 5>function is this red one. Every nine a sync is

298
00:13:44.759 --> 00:13:46.559
<v Speaker 5>this blue one. And the moment you want to do

299
00:13:46.799 --> 00:13:49.159
<v Speaker 5>an ACYNC thing, you have to make your function red.

300
00:13:49.360 --> 00:13:51.279
<v Speaker 5>And if that function calling it wants to do an

301
00:13:51.320 --> 00:13:53.159
<v Speaker 5>ACINC thing, you make that function red. And so you

302
00:13:53.399 --> 00:13:57.279
<v Speaker 5>have this color to your program and this distinct syntax.

303
00:13:57.279 --> 00:13:59.600
<v Speaker 5>And then Ruby you don't have to have that color.

304
00:14:00.039 --> 00:14:02.759
<v Speaker 5>In some other languages as well, like Java, actually in fact,

305
00:14:02.960 --> 00:14:07.720
<v Speaker 5>is also a colorless language. So so yeah, that's that's

306
00:14:07.759 --> 00:14:08.840
<v Speaker 5>the colorless concept.

307
00:14:10.399 --> 00:14:14.559
<v Speaker 2>Not too Yeah, so let's rope this back into Okay,

308
00:14:14.639 --> 00:14:16.559
<v Speaker 2>so I don't have to I don't have to color

309
00:14:16.600 --> 00:14:18.720
<v Speaker 2>my methods, So why do I care?

310
00:14:19.960 --> 00:14:20.320
<v Speaker 4>Yeah.

311
00:14:20.399 --> 00:14:22.360
<v Speaker 5>So, so the series kind of goes into a couple

312
00:14:22.399 --> 00:14:24.480
<v Speaker 5>of aspects of it. The first part of it is

313
00:14:24.559 --> 00:14:28.080
<v Speaker 5>really it's two parts, and it's called your Ruby programs

314
00:14:28.120 --> 00:14:31.919
<v Speaker 5>are multi threaded And the thing that I want the

315
00:14:32.000 --> 00:14:34.840
<v Speaker 5>point of me writing those articles was part of the series,

316
00:14:34.840 --> 00:14:37.480
<v Speaker 5>but also just part of my own interaction with different

317
00:14:37.519 --> 00:14:39.480
<v Speaker 5>gems and things over the years that I've had threading

318
00:14:39.480 --> 00:14:41.840
<v Speaker 5>bugs in them, because I think it's easy to forget

319
00:14:41.879 --> 00:14:46.519
<v Speaker 5>that in almost every programming language you use, behind the scenes,

320
00:14:46.600 --> 00:14:49.200
<v Speaker 5>there are there is concurrency happening, whether you want it

321
00:14:49.320 --> 00:14:52.360
<v Speaker 5>or not. Right if you're using Kuma, you've got threads running.

322
00:14:52.480 --> 00:14:55.120
<v Speaker 5>You're using Sidekick or a solid q, you've got threads running.

323
00:14:55.480 --> 00:14:57.559
<v Speaker 5>Even if you're using like a process based server, there's

324
00:14:57.600 --> 00:14:59.720
<v Speaker 5>there's concurrency elements that are running there, and so being

325
00:14:59.759 --> 00:15:02.639
<v Speaker 5>away of them helps you write safer code.

326
00:15:02.919 --> 00:15:04.519
<v Speaker 4>So, just as a baseline, just if.

327
00:15:04.360 --> 00:15:08.480
<v Speaker 5>You want to like create code that is safe to run,

328
00:15:08.600 --> 00:15:11.120
<v Speaker 5>there's certain things that you need to identify, and to

329
00:15:11.200 --> 00:15:13.360
<v Speaker 5>identify those like so for instance, like I go into

330
00:15:14.679 --> 00:15:17.000
<v Speaker 5>you know, like global variables, right, it seems so obvious,

331
00:15:17.240 --> 00:15:20.480
<v Speaker 5>but there are still there's legitimately still times where I

332
00:15:20.480 --> 00:15:23.320
<v Speaker 5>interact with gems and I've submitted some some fixes and

333
00:15:23.320 --> 00:15:26.639
<v Speaker 5>stuff for certain gems where there's just global variables being used,

334
00:15:27.120 --> 00:15:29.320
<v Speaker 5>and they work fine as long as your threads don't

335
00:15:29.360 --> 00:15:31.960
<v Speaker 5>end up swapping between each other. And so you especially

336
00:15:31.960 --> 00:15:34.159
<v Speaker 5>in CEE ruby, like a lot of times they won't

337
00:15:34.200 --> 00:15:35.919
<v Speaker 5>swap between each other, and so things seem to be okay,

338
00:15:35.919 --> 00:15:37.480
<v Speaker 5>and then you just have these random errors, or you

339
00:15:37.480 --> 00:15:40.039
<v Speaker 5>have these random data coruptions, or you have like users

340
00:15:40.159 --> 00:15:42.679
<v Speaker 5>data get mixed together. And so part of the reason

341
00:15:42.720 --> 00:15:44.320
<v Speaker 5>that I think people should care and should have an

342
00:15:44.360 --> 00:15:46.919
<v Speaker 5>understanding about how concurrency works is just for their own

343
00:15:47.639 --> 00:15:49.440
<v Speaker 5>just to keep your code like safe and to understand

344
00:15:49.440 --> 00:15:52.240
<v Speaker 5>the principles to keep your code safe. It's actually not

345
00:15:52.440 --> 00:15:55.279
<v Speaker 5>super hard to do, but there's certain certain key things

346
00:15:55.279 --> 00:15:58.440
<v Speaker 5>that you should understand to keep your code consistent. And

347
00:15:58.480 --> 00:16:00.600
<v Speaker 5>on top of that, I know kind of gone long

348
00:16:00.600 --> 00:16:02.200
<v Speaker 5>winded on that a little bit. But the other reason

349
00:16:02.200 --> 00:16:04.320
<v Speaker 5>to care about the currency is it helps you scale

350
00:16:04.360 --> 00:16:07.799
<v Speaker 5>your applications right right, At a smaller scale with applications

351
00:16:08.200 --> 00:16:10.879
<v Speaker 5>probably doesn't matter too much if you really understand it.

352
00:16:11.120 --> 00:16:12.759
<v Speaker 5>But as you you know, as you get into like

353
00:16:13.639 --> 00:16:16.480
<v Speaker 5>tens of thousands, hundreds of thousands, millions of jobs and

354
00:16:16.519 --> 00:16:19.440
<v Speaker 5>requests and things how you tune and how you organize

355
00:16:19.440 --> 00:16:21.679
<v Speaker 5>your code and what you call and how what or

356
00:16:21.720 --> 00:16:24.080
<v Speaker 5>do you call it, and suddenly starts being really valuable

357
00:16:24.159 --> 00:16:26.200
<v Speaker 5>and understanding, like, oh, if I know how a thread

358
00:16:26.200 --> 00:16:27.919
<v Speaker 5>works or a fiber works, and I run this code

359
00:16:27.960 --> 00:16:31.720
<v Speaker 5>this way, I can scale my application better, right, And

360
00:16:31.759 --> 00:16:33.799
<v Speaker 5>so so yeah, that's that's kind of and you know,

361
00:16:34.120 --> 00:16:35.639
<v Speaker 5>the third part for me is just I just find

362
00:16:35.679 --> 00:16:37.799
<v Speaker 5>it very interesting. So if you're somebody who just likes

363
00:16:37.840 --> 00:16:40.120
<v Speaker 5>reading about interesting things and you like reveal a lot,

364
00:16:40.440 --> 00:16:42.200
<v Speaker 5>you know, I find it interesting in that regard.

365
00:16:42.440 --> 00:16:45.919
<v Speaker 2>So so yeah, I love the curiosity by the way.

366
00:16:46.080 --> 00:16:47.399
<v Speaker 3>I feel the same way.

367
00:16:47.799 --> 00:16:51.000
<v Speaker 2>And then I started getting into after we talk to

368
00:16:51.000 --> 00:16:53.519
<v Speaker 2>Obie Fernandez on the AI stuff, and I.

369
00:16:53.480 --> 00:16:55.279
<v Speaker 3>Just I can't put it down.

370
00:16:55.320 --> 00:16:57.799
<v Speaker 1>I just I can't make myself put it away.

371
00:16:58.120 --> 00:17:02.279
<v Speaker 5>So sure, and that's one of the the most enjoyable things. Yes,

372
00:17:02.519 --> 00:17:07.279
<v Speaker 5>rightest with a piece of programming or a particular technique

373
00:17:07.359 --> 00:17:07.720
<v Speaker 5>or whatever.

374
00:17:07.759 --> 00:17:09.240
<v Speaker 4>It's just yeah, it's the most fun.

375
00:17:09.880 --> 00:17:10.079
<v Speaker 3>Right.

376
00:17:10.240 --> 00:17:12.920
<v Speaker 2>But going back to your other point, you know, whether

377
00:17:12.960 --> 00:17:17.359
<v Speaker 2>it's Puma or Falcon or something else, you know at

378
00:17:17.400 --> 00:17:20.359
<v Speaker 2>your web server or you know, depending on how your

379
00:17:20.440 --> 00:17:23.000
<v Speaker 2>job queueing works, you know, whether it's using threads or

380
00:17:23.039 --> 00:17:26.119
<v Speaker 2>fibers or processes or something else. And they tend to

381
00:17:26.200 --> 00:17:30.559
<v Speaker 2>use them blend of them, actually a lot of them, right, So,

382
00:17:30.559 --> 00:17:33.400
<v Speaker 2>so understanding how they orchestrate some of that, Yeah, you

383
00:17:33.680 --> 00:17:36.480
<v Speaker 2>can get more horsepower out of your machine.

384
00:17:36.799 --> 00:17:38.039
<v Speaker 4>Absolutely, yeah.

385
00:17:38.240 --> 00:17:41.720
<v Speaker 5>And sometimes you know, like there's there's great abstractions like

386
00:17:42.119 --> 00:17:44.880
<v Speaker 5>Falcin or Puma or Sidekick, but even your own code.

387
00:17:44.920 --> 00:17:47.000
<v Speaker 5>Sometimes you know, you might be like, oh, like I've

388
00:17:47.039 --> 00:17:49.400
<v Speaker 5>got the synchronous piece of code, but I need to

389
00:17:49.519 --> 00:17:52.240
<v Speaker 5>like call a few different APIs, right, and if you can,

390
00:17:52.359 --> 00:17:53.839
<v Speaker 5>if they're not dependent on each other and you can

391
00:17:53.880 --> 00:17:55.920
<v Speaker 5>call them a parallel, it's great to know how to

392
00:17:55.960 --> 00:17:57.759
<v Speaker 5>do that, and like what's the best tool to do that?

393
00:17:57.799 --> 00:17:58.759
<v Speaker 4>What are the gotchas?

394
00:17:58.799 --> 00:18:01.640
<v Speaker 5>And you know, I'll get into that like later in

395
00:18:01.640 --> 00:18:03.759
<v Speaker 5>the series as well, but like you know, largely, I think.

396
00:18:03.640 --> 00:18:05.000
<v Speaker 4>For like your own code that you're writing.

397
00:18:05.119 --> 00:18:08.359
<v Speaker 5>I tend to say, like, you know, don't thread if

398
00:18:08.359 --> 00:18:10.400
<v Speaker 5>you don't have to, because you can you can shoot

399
00:18:10.400 --> 00:18:11.799
<v Speaker 5>yourself in the foot if you do. But if you're

400
00:18:11.799 --> 00:18:13.279
<v Speaker 5>going to do something that you want to have some

401
00:18:13.359 --> 00:18:15.720
<v Speaker 5>amount of like parallelism fr I oh or blocking operations,

402
00:18:15.759 --> 00:18:18.200
<v Speaker 5>you know, I tend to recommend like ACYNC because I

403
00:18:18.279 --> 00:18:21.160
<v Speaker 5>just think it's a lot more deterministic. So that's like

404
00:18:21.240 --> 00:18:24.160
<v Speaker 5>fiber scheduler and that sort of stuff. It's more deterministic.

405
00:18:24.160 --> 00:18:27.119
<v Speaker 5>I think it has better tooling around it. Yeah, and

406
00:18:27.119 --> 00:18:30.400
<v Speaker 5>it just there's less of a chance of screwing something

407
00:18:30.480 --> 00:18:33.000
<v Speaker 5>up because it operates in a single thread and all

408
00:18:33.039 --> 00:18:37.920
<v Speaker 5>that kind of stuff. But yeah, I feel like every

409
00:18:37.960 --> 00:18:39.640
<v Speaker 5>time I talk about something, I just sort of trail

410
00:18:39.680 --> 00:18:40.279
<v Speaker 5>off at the end.

411
00:18:41.319 --> 00:18:43.039
<v Speaker 4>But here we.

412
00:18:43.039 --> 00:18:47.799
<v Speaker 6>Are, and these are no I'm with you. I've been

413
00:18:47.839 --> 00:18:50.519
<v Speaker 6>trying to take on more and more of like doing

414
00:18:50.799 --> 00:18:53.960
<v Speaker 6>more things at once, and I'm I'm finding I shoot

415
00:18:54.000 --> 00:18:59.480
<v Speaker 6>myself in the foot often because you don't think about like, Okay,

416
00:18:59.519 --> 00:19:03.000
<v Speaker 6>well you're performing all these things at once and you're blocking.

417
00:19:03.440 --> 00:19:06.920
<v Speaker 6>Now you're waiting for each of those instead of just

418
00:19:06.960 --> 00:19:08.880
<v Speaker 6>your waiting for one, and it's more, you know, it's

419
00:19:08.960 --> 00:19:11.200
<v Speaker 6>less deterministic the more things that you start to do

420
00:19:11.240 --> 00:19:15.599
<v Speaker 6>in parallel, because more things can go wrong. So I'm curious, like,

421
00:19:16.480 --> 00:19:19.079
<v Speaker 6>you know, how do you go about deciding like before

422
00:19:19.079 --> 00:19:21.880
<v Speaker 6>you even start like diving in, Like how are you like, okay,

423
00:19:21.880 --> 00:19:26.599
<v Speaker 6>well this makes sense, like to run concurrently, like using

424
00:19:26.640 --> 00:19:29.680
<v Speaker 6>threads or fibers, Like what are your like decision points

425
00:19:29.720 --> 00:19:32.079
<v Speaker 6>for these kinds of of tasks.

426
00:19:33.440 --> 00:19:37.240
<v Speaker 5>Yeah, that's that's a great question. I mean, I think

427
00:19:37.279 --> 00:19:39.960
<v Speaker 5>as a base decision, you know. And I had a

428
00:19:39.960 --> 00:19:43.119
<v Speaker 5>little bit of a like Twitter interaction about like a

429
00:19:43.160 --> 00:19:46.079
<v Speaker 5>recent tweet about somebody suggesting something and realizing it was

430
00:19:46.079 --> 00:19:48.880
<v Speaker 5>actually not thread safe and going back and forth a

431
00:19:48.880 --> 00:19:50.839
<v Speaker 5>little bit with like Samuel Williams and a couple other

432
00:19:50.920 --> 00:19:54.319
<v Speaker 5>people about you know, it's actually best to start off

433
00:19:54.359 --> 00:19:56.839
<v Speaker 5>by saying, like maybe just don't like, you know, let

434
00:19:56.960 --> 00:19:59.960
<v Speaker 5>let you know, start the baseline you should always start with,

435
00:20:00.599 --> 00:20:04.359
<v Speaker 5>is let's use these like battle hardened great tools that

436
00:20:04.400 --> 00:20:07.119
<v Speaker 5>are available in the community, you know, like a sidekick,

437
00:20:07.400 --> 00:20:10.079
<v Speaker 5>solid Q good job sort of thing for my background jobs,

438
00:20:10.519 --> 00:20:13.559
<v Speaker 5>like a Falcon or a Puma for my server, and

439
00:20:14.079 --> 00:20:16.880
<v Speaker 5>start off by tuning those right, That's the first place

440
00:20:16.920 --> 00:20:19.880
<v Speaker 5>that I would ever start off tuning something is saying, Okay,

441
00:20:19.920 --> 00:20:23.079
<v Speaker 5>like I want to scale up more, what kind of

442
00:20:23.079 --> 00:20:25.319
<v Speaker 5>traffic do I get? Do I do? Should I have

443
00:20:25.359 --> 00:20:27.799
<v Speaker 5>more threads? Should I have more processes? That sort of thing,

444
00:20:27.839 --> 00:20:30.240
<v Speaker 5>And so, like the first layer of concurrency for me

445
00:20:30.319 --> 00:20:34.759
<v Speaker 5>is always just taking advantage of the tools themselves, and

446
00:20:34.799 --> 00:20:38.240
<v Speaker 5>then deeper than that, I think is figuring out, well, Okay,

447
00:20:38.240 --> 00:20:41.680
<v Speaker 5>within these tools, how can I better split up my work?

448
00:20:42.720 --> 00:20:44.920
<v Speaker 5>And so like what I'll kind of get to is

449
00:20:44.960 --> 00:20:47.559
<v Speaker 5>really like the lowest level of concurrency for me is

450
00:20:48.079 --> 00:20:49.480
<v Speaker 5>the point I get to where I'm like, Okay, now

451
00:20:49.480 --> 00:20:50.240
<v Speaker 5>I'm actually going.

452
00:20:50.160 --> 00:20:52.400
<v Speaker 4>To use a thread or acing because I'll use.

453
00:20:52.319 --> 00:20:53.960
<v Speaker 5>That as my last resort, even though like I have

454
00:20:54.000 --> 00:20:56.440
<v Speaker 5>a lot of familiarity with it and I do use them.

455
00:20:56.839 --> 00:20:58.319
<v Speaker 5>It's it's kind of like, I'll use that as the

456
00:20:58.359 --> 00:21:00.799
<v Speaker 5>last piece. Because the best thing you can do, especially

457
00:21:00.799 --> 00:21:03.880
<v Speaker 5>if you want to split stuff into concurrent pieces, is

458
00:21:03.920 --> 00:21:05.720
<v Speaker 5>to start like utilizing your job system.

459
00:21:05.759 --> 00:21:08.519
<v Speaker 4>Really kind of like like Charles said earlier.

460
00:21:08.279 --> 00:21:10.680
<v Speaker 5>On or you go by Chuck right, Sorry, yeah, no,

461
00:21:12.799 --> 00:21:14.200
<v Speaker 5>I feel like I've heard Chuck for years, and for

462
00:21:14.200 --> 00:21:17.880
<v Speaker 5>some reason I just looked at mister Charles Maxwett i'll

463
00:21:17.880 --> 00:21:22.000
<v Speaker 5>preferred to as. But basically, yeah, you say like, okay, well,

464
00:21:22.000 --> 00:21:23.039
<v Speaker 5>now I want to I want to.

465
00:21:22.960 --> 00:21:24.039
<v Speaker 4>Increase my concurrency.

466
00:21:24.440 --> 00:21:28.319
<v Speaker 5>So I might have like particular operations, I'll have more

467
00:21:28.359 --> 00:21:30.920
<v Speaker 5>threads in like a Puma or a falcon. But maybe

468
00:21:30.920 --> 00:21:32.880
<v Speaker 5>I now then go like, okay, well, now I want

469
00:21:32.920 --> 00:21:35.160
<v Speaker 5>to I want to increase my concurrency for my jobs,

470
00:21:35.559 --> 00:21:37.400
<v Speaker 5>And so you start to think about, Okay, how do

471
00:21:37.440 --> 00:21:39.680
<v Speaker 5>I coordinate these jobs? How do I split them into

472
00:21:39.720 --> 00:21:44.799
<v Speaker 5>smaller pieces of work? And so so that's that's kind

473
00:21:44.799 --> 00:21:46.200
<v Speaker 5>of the next layer for me. The first one is

474
00:21:46.240 --> 00:21:48.160
<v Speaker 5>I just kind of tweak things about servers, make sure

475
00:21:48.200 --> 00:21:50.160
<v Speaker 5>like my throughpit is good, and then I might just

476
00:21:50.160 --> 00:21:52.079
<v Speaker 5>start to say, like, okay, this particular job is kind

477
00:21:52.079 --> 00:21:52.480
<v Speaker 5>of slow.

478
00:21:52.880 --> 00:21:54.000
<v Speaker 4>How can I break that up?

479
00:21:54.839 --> 00:21:56.960
<v Speaker 5>And so to use Psychic as an example, like Psychic

480
00:21:57.000 --> 00:22:01.599
<v Speaker 5>actually just embedded I think iteration support to their gems.

481
00:22:01.640 --> 00:22:03.480
<v Speaker 5>So like that's one aspect where you kind of can

482
00:22:03.519 --> 00:22:05.039
<v Speaker 5>like split up your work that way. But if you

483
00:22:05.039 --> 00:22:07.480
<v Speaker 5>actually wanted to run it concurrently, you know, Psydekic has

484
00:22:07.519 --> 00:22:11.440
<v Speaker 5>batches for instance, good job has batches. I'm actually trying

485
00:22:11.440 --> 00:22:13.319
<v Speaker 5>to add batched support to solid q as well, because

486
00:22:13.359 --> 00:22:15.359
<v Speaker 5>I think it's a really valuable feature. So I have

487
00:22:15.440 --> 00:22:17.839
<v Speaker 5>a care submited for that. Yeah, I hope it gets

488
00:22:17.839 --> 00:22:20.079
<v Speaker 5>through soon. And so initially Rosa she was really kind

489
00:22:20.079 --> 00:22:21.599
<v Speaker 5>about it. She was like, this is awesome, but we're

490
00:22:21.599 --> 00:22:23.480
<v Speaker 5>not going to use it right now, so like if

491
00:22:23.519 --> 00:22:25.519
<v Speaker 5>other people want to try it and use it, like

492
00:22:25.599 --> 00:22:29.000
<v Speaker 5>we'll we'll kind of evaluate it from there so that.

493
00:22:28.960 --> 00:22:30.480
<v Speaker 3>I think you and I want it.

494
00:22:31.240 --> 00:22:34.160
<v Speaker 5>Yeah, Like batches are awesome because you know, I've used

495
00:22:34.160 --> 00:22:36.200
<v Speaker 5>them in Sidechic, but it is a paid feature, and

496
00:22:36.240 --> 00:22:38.400
<v Speaker 5>so soliq having batches, I think could be really fabulous

497
00:22:38.440 --> 00:22:40.400
<v Speaker 5>for people because then you can say, oh, now I

498
00:22:40.440 --> 00:22:41.640
<v Speaker 5>want to break up this piece of work, but I

499
00:22:41.640 --> 00:22:43.599
<v Speaker 5>still want to do it in this like in these lanes.

500
00:22:43.640 --> 00:22:46.359
<v Speaker 5>The nice constraints of this framework. So if I break

501
00:22:46.359 --> 00:22:47.640
<v Speaker 5>it up and I put it in a batch, and

502
00:22:47.680 --> 00:22:49.160
<v Speaker 5>I say like, hey, at the end of this batch,

503
00:22:49.240 --> 00:22:51.079
<v Speaker 5>do this thing for me that I can safely coordinate

504
00:22:51.079 --> 00:22:53.000
<v Speaker 5>my work and I can split it up into small pieces,

505
00:22:53.039 --> 00:22:55.559
<v Speaker 5>you know, And so so that's like the next layer

506
00:22:55.599 --> 00:22:58.279
<v Speaker 5>for me, and then the layer after that when you've

507
00:22:58.359 --> 00:23:00.599
<v Speaker 5>kind of exhausted your tools and you're like, I really

508
00:23:00.599 --> 00:23:02.119
<v Speaker 5>need to do this thing inline it might be in

509
00:23:02.160 --> 00:23:03.680
<v Speaker 5>a job, it might be in a web request is

510
00:23:03.720 --> 00:23:06.880
<v Speaker 5>to start saying, okay, I want to use a thread

511
00:23:07.039 --> 00:23:09.079
<v Speaker 5>or a fiber or something like that, and that's when

512
00:23:09.279 --> 00:23:11.680
<v Speaker 5>generally I would bring in, like I said, like async

513
00:23:11.720 --> 00:23:14.079
<v Speaker 5>for myself, right, I would bring in a SYNC and say, like,

514
00:23:14.119 --> 00:23:15.839
<v Speaker 5>I want to make these database connections, I want to

515
00:23:15.839 --> 00:23:18.000
<v Speaker 5>do these network requests. I want to do file io

516
00:23:18.920 --> 00:23:20.920
<v Speaker 5>or even like encryption or something. You know, if you

517
00:23:21.039 --> 00:23:23.319
<v Speaker 5>like kind of shell out, you can you can paralyze

518
00:23:23.359 --> 00:23:26.279
<v Speaker 5>that as well. And so I use a SYNC to

519
00:23:26.319 --> 00:23:29.279
<v Speaker 5>coordinate that because for one thing, async operates in a

520
00:23:29.319 --> 00:23:31.240
<v Speaker 5>single thread, so I don't have to worry about like

521
00:23:31.319 --> 00:23:34.880
<v Speaker 5>these weird semantics of threads and like caching at the

522
00:23:34.920 --> 00:23:38.359
<v Speaker 5>OS lever level and all this weird stuff. And then

523
00:23:39.519 --> 00:23:42.200
<v Speaker 5>and it just has better abstractions, like it's a full

524
00:23:42.279 --> 00:23:45.000
<v Speaker 5>featured library versus like threads are a very primitive thing.

525
00:23:45.319 --> 00:23:46.759
<v Speaker 5>If I was going to use threads, I would use

526
00:23:46.759 --> 00:23:48.680
<v Speaker 5>like concurrent, Ruvie or something like that. But I would

527
00:23:48.759 --> 00:23:50.920
<v Speaker 5>kind of I would say, like probably go with a sing.

528
00:23:51.160 --> 00:23:52.920
<v Speaker 5>The point you would maybe need to go to threads

529
00:23:52.920 --> 00:23:55.079
<v Speaker 5>we can talk about later, but for the most part,

530
00:23:55.119 --> 00:23:57.200
<v Speaker 5>for your own code. You can usually use a sync

531
00:23:57.200 --> 00:23:59.839
<v Speaker 5>but that's kind of my mental model for it, is like,

532
00:24:00.279 --> 00:24:02.960
<v Speaker 5>use the tools at the highest level, start splitting up

533
00:24:02.960 --> 00:24:04.839
<v Speaker 5>within those tools, and then if I really need to,

534
00:24:04.960 --> 00:24:07.000
<v Speaker 5>and sometimes you do and I've I've done plenty of

535
00:24:07.000 --> 00:24:10.240
<v Speaker 5>this is split your code using a library like a sink,

536
00:24:10.240 --> 00:24:14.119
<v Speaker 5>where you just have more control. And when I say determinism,

537
00:24:14.119 --> 00:24:16.680
<v Speaker 5>what I just mean is like there's very clear, like

538
00:24:17.079 --> 00:24:19.680
<v Speaker 5>clear cut points in your acinc code where things will

539
00:24:19.759 --> 00:24:22.000
<v Speaker 5>swap out and you can you can know what those

540
00:24:22.039 --> 00:24:24.079
<v Speaker 5>are very clearly, Whereas in threads, it's kind of like

541
00:24:24.240 --> 00:24:26.200
<v Speaker 5>it's a free fra all, like any piece of your

542
00:24:26.200 --> 00:24:28.359
<v Speaker 5>code and a thread can technically swap out at any time,

543
00:24:28.640 --> 00:24:31.359
<v Speaker 5>and there's all sorts of gotcha's that can come along

544
00:24:31.400 --> 00:24:35.680
<v Speaker 5>with that. Yeah, So that's how I break things down myself.

545
00:24:36.359 --> 00:24:39.240
<v Speaker 6>Do you have any like rules of THEMB for like

546
00:24:39.319 --> 00:24:42.319
<v Speaker 6>how many things you do within your acinc calls, Like

547
00:24:42.480 --> 00:24:45.200
<v Speaker 6>do you try and like keep like the responsibility low?

548
00:24:45.359 --> 00:24:47.319
<v Speaker 6>Like how do you think through that?

549
00:24:48.839 --> 00:24:55.359
<v Speaker 5>Yeah, it's another good question. I think it's partially just

550
00:24:55.400 --> 00:24:58.839
<v Speaker 5>depended on I think to your point about like deciding

551
00:24:58.880 --> 00:25:00.440
<v Speaker 5>on how much you want to do like part of

552
00:25:00.480 --> 00:25:03.519
<v Speaker 5>it is complexity, right, you know, if you're doing you know,

553
00:25:04.200 --> 00:25:06.079
<v Speaker 5>and also it's just like the constraints of what you're

554
00:25:06.079 --> 00:25:08.480
<v Speaker 5>gonna interact with, right like if I'm gonna if I'm

555
00:25:08.480 --> 00:25:11.000
<v Speaker 5>gonna split apart things to try to make like rett

556
00:25:11.000 --> 00:25:13.200
<v Speaker 5>as calls. Let's say, you know, there's there might be

557
00:25:13.240 --> 00:25:15.200
<v Speaker 5>an upper limit on how many connections you can even

558
00:25:15.240 --> 00:25:18.200
<v Speaker 5>make it once, or API calls there may be an

559
00:25:18.279 --> 00:25:20.160
<v Speaker 5>upper limit on how many I can even make it once.

560
00:25:20.359 --> 00:25:21.880
<v Speaker 5>But a lot of times for those types of things,

561
00:25:21.960 --> 00:25:24.039
<v Speaker 5>like you can you can scale them up pretty high,

562
00:25:24.160 --> 00:25:26.160
<v Speaker 5>especially when it comes to a sync because fibers are

563
00:25:26.160 --> 00:25:28.440
<v Speaker 5>so light weight and they use such an efficient model

564
00:25:28.440 --> 00:25:31.920
<v Speaker 5>behind the scenes. Like you know, I've written code that's

565
00:25:32.079 --> 00:25:34.880
<v Speaker 5>opening up connections to like thousands of things before and

566
00:25:34.920 --> 00:25:38.160
<v Speaker 5>it's been fine. But it also I think I think

567
00:25:38.160 --> 00:25:41.759
<v Speaker 5>it's probably on like the how like I guess like

568
00:25:41.799 --> 00:25:44.680
<v Speaker 5>heterogeneous those tasks are, right, Like if they're all different

569
00:25:44.680 --> 00:25:47.119
<v Speaker 5>tasks doing all like different weird things, you probably want

570
00:25:47.119 --> 00:25:49.240
<v Speaker 5>to start like coordinating them, splitting them maybe into like

571
00:25:49.279 --> 00:25:50.599
<v Speaker 5>multiple jobs to go into each.

572
00:25:50.519 --> 00:25:51.400
<v Speaker 4>Other or something like that.

573
00:25:51.480 --> 00:25:54.319
<v Speaker 5>But you can once you're in it, and once you're

574
00:25:54.359 --> 00:25:56.920
<v Speaker 5>doing Nason code, like you can scale it up pretty far,

575
00:25:57.039 --> 00:26:00.160
<v Speaker 5>and so the constraints start to become less about your

576
00:26:00.160 --> 00:26:02.079
<v Speaker 5>own code and really more about like what can my

577
00:26:02.160 --> 00:26:04.599
<v Speaker 5>database server handle, what can the be I'm calling handle?

578
00:26:04.960 --> 00:26:07.160
<v Speaker 5>What are their throttles? You know, those types of things,

579
00:26:07.200 --> 00:26:09.960
<v Speaker 5>And so that's when you start coordinating. And and ACYNC

580
00:26:10.000 --> 00:26:12.279
<v Speaker 5>does come with some tools that you can say like, hey,

581
00:26:13.799 --> 00:26:15.880
<v Speaker 5>I'm going to hand off these tasks and I'll create

582
00:26:15.920 --> 00:26:17.880
<v Speaker 5>all the tasks I need, but they're gonna be bound

583
00:26:17.880 --> 00:26:20.079
<v Speaker 5>by like a what's called like a barrier. Right, you

584
00:26:20.119 --> 00:26:22.559
<v Speaker 5>can say, like there's a barrier of like five and

585
00:26:22.599 --> 00:26:24.599
<v Speaker 5>so at once only five will run, and then the

586
00:26:24.599 --> 00:26:26.319
<v Speaker 5>next five will run, and the next five run that

587
00:26:26.400 --> 00:26:30.000
<v Speaker 5>sort of thing, and so so yeah, like within those

588
00:26:30.559 --> 00:26:33.279
<v Speaker 5>I don't the limit is usually imposed for me more

589
00:26:33.359 --> 00:26:36.720
<v Speaker 5>around like what are the external resources? And then I

590
00:26:36.720 --> 00:26:39.039
<v Speaker 5>guess to follow upon that. You also don't want to

591
00:26:39.039 --> 00:26:41.359
<v Speaker 5>like overload your memory, right, Like so you yeah, you can't.

592
00:26:41.400 --> 00:26:43.039
<v Speaker 5>You're not gonna make a thousand requests and then get

593
00:26:43.039 --> 00:26:44.839
<v Speaker 5>a thousand responses back and then load them all on

594
00:26:44.839 --> 00:26:47.119
<v Speaker 5>the memory and now your server crashes, right, Like you

595
00:26:47.160 --> 00:26:49.240
<v Speaker 5>have to you have to be sensible about that.

596
00:26:49.359 --> 00:26:51.200
<v Speaker 4>And actually, I have a.

597
00:26:51.200 --> 00:26:54.359
<v Speaker 5>Chapter or a blog post later on called I think

598
00:26:54.400 --> 00:26:57.799
<v Speaker 5>I call it concurrent streaming Ruby, where I like want

599
00:26:57.839 --> 00:27:00.519
<v Speaker 5>to go into approaches for how to do things in

600
00:27:00.559 --> 00:27:03.480
<v Speaker 5>a more streaming type of way, which I think is valuable,

601
00:27:03.559 --> 00:27:05.720
<v Speaker 5>especially when you try to break down tasks and keep

602
00:27:05.720 --> 00:27:07.160
<v Speaker 5>your memory low and all that stuff.

603
00:27:07.279 --> 00:27:08.880
<v Speaker 4>So that's your question.

604
00:27:11.240 --> 00:27:12.799
<v Speaker 6>Yeah, I think that you make it like a great

605
00:27:12.799 --> 00:27:14.759
<v Speaker 6>points there, and it.

606
00:27:14.720 --> 00:27:18.559
<v Speaker 2>Makes me think smiling inside at somebody dedusting their own.

607
00:27:20.119 --> 00:27:24.000
<v Speaker 5>Oh yeah, yeah, you could definitely do it when you

608
00:27:24.039 --> 00:27:25.880
<v Speaker 5>know then you yeah, you want to have some kind

609
00:27:25.880 --> 00:27:27.960
<v Speaker 5>of like proxy or some in place, but no matter why,

610
00:27:28.039 --> 00:27:30.599
<v Speaker 5>you can definitely ded us yourself if you're not careful.

611
00:27:30.799 --> 00:27:34.920
<v Speaker 6>So that's funny. Yeah, I mean, I think that's a

612
00:27:34.960 --> 00:27:37.599
<v Speaker 6>great point in general with concurrency is like it's very

613
00:27:37.599 --> 00:27:40.359
<v Speaker 6>easy to eat up resources if you start to like

614
00:27:40.400 --> 00:27:44.000
<v Speaker 6>grow things too big. But it does bring up a

615
00:27:44.000 --> 00:27:48.960
<v Speaker 6>good point of like I guess my next topic of discussion,

616
00:27:48.960 --> 00:27:52.480
<v Speaker 6>which is like sharing, like data sharing right, like, And

617
00:27:52.519 --> 00:27:56.400
<v Speaker 6>I like that you mentioned, uh, you know, using sidekick

618
00:27:56.559 --> 00:27:59.480
<v Speaker 6>as like before you get into this space, because I

619
00:27:59.519 --> 00:28:03.160
<v Speaker 6>think it does create that separation of data layering that

620
00:28:03.240 --> 00:28:05.880
<v Speaker 6>I think is important when working with all of this

621
00:28:05.960 --> 00:28:09.519
<v Speaker 6>concurrency stuff in that you give it a task, right,

622
00:28:09.640 --> 00:28:12.400
<v Speaker 6>like the data that it needs to operate, and then

623
00:28:12.440 --> 00:28:15.559
<v Speaker 6>it tries to work within it. But that then there's

624
00:28:15.599 --> 00:28:19.759
<v Speaker 6>still this weird blurred line. I feel like where Okay, well,

625
00:28:19.920 --> 00:28:22.480
<v Speaker 6>you like let's say you drop an ID to a

626
00:28:22.519 --> 00:28:25.720
<v Speaker 6>sidekick task and then I use a shared database connection

627
00:28:25.799 --> 00:28:30.000
<v Speaker 6>pool to you know, make calls. You know, how does

628
00:28:30.039 --> 00:28:33.160
<v Speaker 6>that work in the acink space? And like how do

629
00:28:33.240 --> 00:28:35.680
<v Speaker 6>you try and reason about it to make make things

630
00:28:35.680 --> 00:28:36.599
<v Speaker 6>not too crazy?

631
00:28:36.880 --> 00:28:37.319
<v Speaker 4>Right? Like?

632
00:28:38.359 --> 00:28:42.920
<v Speaker 5>Yeah, that that is that that's another another great point

633
00:28:43.000 --> 00:28:45.680
<v Speaker 5>of like and I will use the sidecake example specifically,

634
00:28:47.079 --> 00:28:50.960
<v Speaker 5>and yeah, it's it's kind of like when you the

635
00:28:51.000 --> 00:28:54.359
<v Speaker 5>lower you get at every level, you have some amount

636
00:28:54.359 --> 00:28:55.240
<v Speaker 5>of shared resources.

637
00:28:55.240 --> 00:28:56.440
<v Speaker 4>Like is the point you're making right?

638
00:28:56.519 --> 00:28:58.599
<v Speaker 5>Like yeah, when I'm at the lowest level, I've got

639
00:28:58.599 --> 00:29:00.039
<v Speaker 5>a bunch of threads and they're all like sharing this

640
00:29:00.160 --> 00:29:01.759
<v Speaker 5>piece of memory, right, And so they're like, oh, there's

641
00:29:01.839 --> 00:29:04.799
<v Speaker 5>like it's so non deterministic and I can overwrite other

642
00:29:04.799 --> 00:29:05.440
<v Speaker 5>people all stuff.

643
00:29:05.480 --> 00:29:06.000
<v Speaker 4>That's no good.

644
00:29:06.240 --> 00:29:09.720
<v Speaker 5>But to your point, it's in a way exactly the same.

645
00:29:09.920 --> 00:29:12.119
<v Speaker 5>At another level up, I've got a sidekick job. It

646
00:29:12.119 --> 00:29:14.279
<v Speaker 5>gets an ID from the database like what is a database.

647
00:29:14.319 --> 00:29:18.559
<v Speaker 5>A database is a shared resource and and actually I

648
00:29:18.640 --> 00:29:21.759
<v Speaker 5>think in the second part of the series, I use uh,

649
00:29:21.799 --> 00:29:24.319
<v Speaker 5>I think I use Rettis as the example there where

650
00:29:24.319 --> 00:29:26.839
<v Speaker 5>I talk about a few race conditions, and so that's

651
00:29:26.880 --> 00:29:29.759
<v Speaker 5>kind of what you're you're you're alluding to, right there

652
00:29:29.880 --> 00:29:33.119
<v Speaker 5>is like there's even though, like you can't necessarily like

653
00:29:33.640 --> 00:29:35.359
<v Speaker 5>when you're doing something in thread you could actually like

654
00:29:35.359 --> 00:29:38.160
<v Speaker 5>corrupt memory for instance, like if you were had actual

655
00:29:38.200 --> 00:29:40.319
<v Speaker 5>threads operated at the same time. It's a little harder

656
00:29:40.319 --> 00:29:43.480
<v Speaker 5>to do in see Ruby because you've got yeah, like yeah,

657
00:29:43.519 --> 00:29:45.759
<v Speaker 5>like especially if you use something like a j Ruby

658
00:29:45.920 --> 00:29:47.960
<v Speaker 5>or or a Truffle Ruby or something where like purely

659
00:29:48.000 --> 00:29:50.440
<v Speaker 5>parallel you can really corrupt things. But you can definitely

660
00:29:50.440 --> 00:29:54.319
<v Speaker 5>do that in Sea Ruby too, and so so like

661
00:29:54.359 --> 00:29:55.960
<v Speaker 5>there's that aspect of it. But at you know, at

662
00:29:55.960 --> 00:29:58.720
<v Speaker 5>a database level, like actually corrupting it is kind of difficult.

663
00:29:58.880 --> 00:30:00.240
<v Speaker 4>But you can still have of.

664
00:30:00.200 --> 00:30:03.319
<v Speaker 5>Things like race conditions where I go like, oh, yeah, hey,

665
00:30:03.359 --> 00:30:05.480
<v Speaker 5>does this thing exist in the database yet? Now it doesn't,

666
00:30:05.559 --> 00:30:06.960
<v Speaker 5>so I'm going to add it. And then another sort

667
00:30:06.960 --> 00:30:08.119
<v Speaker 5>it is like hey does this thing exist in the

668
00:30:08.200 --> 00:30:09.720
<v Speaker 5>database yet? Now I'm going to add it and so

669
00:30:09.759 --> 00:30:11.759
<v Speaker 5>you both just like slam into each other. And if

670
00:30:11.759 --> 00:30:13.480
<v Speaker 5>you don't have uniqueness constraints for all these things, you're

671
00:30:13.480 --> 00:30:14.599
<v Speaker 5>creating duplicate values.

672
00:30:14.880 --> 00:30:16.039
<v Speaker 4>You're overwriting values.

673
00:30:16.079 --> 00:30:19.839
<v Speaker 5>And so there's these race condition things called check then act,

674
00:30:20.119 --> 00:30:21.880
<v Speaker 5>which is like I check if it exists, and then

675
00:30:21.920 --> 00:30:23.880
<v Speaker 5>I act, And so if you don't coordinate those, you

676
00:30:23.880 --> 00:30:27.119
<v Speaker 5>can overwrite each other's data or read, modify, write, where

677
00:30:27.160 --> 00:30:28.880
<v Speaker 5>I read a piece of data, I modify it, I

678
00:30:28.880 --> 00:30:30.279
<v Speaker 5>write it back. And if a bunch of us are

679
00:30:30.319 --> 00:30:32.680
<v Speaker 5>doing that at once, we're all going to be right

680
00:30:32.720 --> 00:30:36.079
<v Speaker 5>and jump to the database. And so it's a great

681
00:30:36.119 --> 00:30:38.559
<v Speaker 5>point that even in Sidekick, if you really want to

682
00:30:38.599 --> 00:30:42.000
<v Speaker 5>be sure that I'm like operating on this particular ID

683
00:30:42.240 --> 00:30:45.599
<v Speaker 5>and it's safe, you probably want to utilize something like

684
00:30:45.599 --> 00:30:49.640
<v Speaker 5>a lock, like a database lock, right, And so you know,

685
00:30:49.640 --> 00:30:51.960
<v Speaker 5>it's sort of like I guess it's like the concept

686
00:30:52.039 --> 00:30:54.079
<v Speaker 5>like turtles all the way down. It's like it's like

687
00:30:54.279 --> 00:30:56.680
<v Speaker 5>shared resources all the ways down where you have to

688
00:30:56.680 --> 00:30:58.480
<v Speaker 5>figure out ways to safely share them, and a lot

689
00:30:58.519 --> 00:31:01.319
<v Speaker 5>of times, like you know this, this probably comes up

690
00:31:01.359 --> 00:31:04.200
<v Speaker 5>more at like a scale, I think, and in scale

691
00:31:04.200 --> 00:31:06.440
<v Speaker 5>is relative, right, like it could be ten thousand jobs.

692
00:31:06.440 --> 00:31:07.920
<v Speaker 4>It doesn't have to be a million jobs.

693
00:31:08.240 --> 00:31:09.839
<v Speaker 5>But you know, a lot of times when you're at

694
00:31:09.839 --> 00:31:11.559
<v Speaker 5>a smaller level, like locking all the time is not

695
00:31:11.599 --> 00:31:13.559
<v Speaker 5>totally necessary. But if you have an ID coming through

696
00:31:13.599 --> 00:31:15.119
<v Speaker 5>and you have a really critical piece of data that

697
00:31:15.160 --> 00:31:17.599
<v Speaker 5>you want to update, you probably should acquire a lock

698
00:31:17.640 --> 00:31:19.599
<v Speaker 5>to that row. And then the first thing you do

699
00:31:19.640 --> 00:31:21.920
<v Speaker 5>after acquiring that lock is go like, hey, is this

700
00:31:22.039 --> 00:31:24.400
<v Speaker 5>has this been updated? Does this condition already met? And

701
00:31:24.440 --> 00:31:26.000
<v Speaker 5>if it is, you just drop out of the job,

702
00:31:26.240 --> 00:31:28.640
<v Speaker 5>right because you the first thing a lock does is

703
00:31:28.680 --> 00:31:30.839
<v Speaker 5>it acquires and then reads the row, and so like,

704
00:31:30.920 --> 00:31:33.319
<v Speaker 5>you know, I have the freshest data, nobody else can

705
00:31:33.359 --> 00:31:35.920
<v Speaker 5>access it. And so that's kind of your your way

706
00:31:35.960 --> 00:31:38.880
<v Speaker 5>of core. That's one of the simpler ways of coordinating

707
00:31:38.880 --> 00:31:41.160
<v Speaker 5>your jobs is to say, while I'm doing this thing,

708
00:31:41.480 --> 00:31:43.279
<v Speaker 5>let me be certain I'm going to lock this row,

709
00:31:43.319 --> 00:31:44.759
<v Speaker 5>I'm gonna do my operation.

710
00:31:44.440 --> 00:31:45.759
<v Speaker 4>And then I'm going to move on from there.

711
00:31:47.279 --> 00:31:50.279
<v Speaker 5>So yeah, I feel like I got a little bit

712
00:31:50.319 --> 00:31:53.799
<v Speaker 5>lost in answering the question, but but yeah, like that's

713
00:31:53.799 --> 00:31:55.759
<v Speaker 5>that's kind of how it would handle it the psychic level.

714
00:31:55.839 --> 00:31:56.720
<v Speaker 5>Is there follow up to that?

715
00:31:58.279 --> 00:32:01.319
<v Speaker 6>Ah? So many I feel like this is This is

716
00:32:01.359 --> 00:32:04.119
<v Speaker 6>definitely one of like I think the trickiest parts of

717
00:32:04.240 --> 00:32:09.000
<v Speaker 6>like Okay, you're foraying into the concurrency realm and then

718
00:32:09.279 --> 00:32:11.480
<v Speaker 6>and then you it's like you realize after the fact

719
00:32:11.480 --> 00:32:16.200
<v Speaker 6>that it wasn't worth it. Sure, yeah, in a lot

720
00:32:16.200 --> 00:32:18.640
<v Speaker 6>of ways, right, Like if I guess it comes back

721
00:32:18.680 --> 00:32:21.480
<v Speaker 6>to like, Okay, we'll understand the concepts and know what

722
00:32:21.519 --> 00:32:23.960
<v Speaker 6>you're doing before you get into it, but you know,

723
00:32:23.960 --> 00:32:25.880
<v Speaker 6>it's hard to also get into it at the same time.

724
00:32:26.200 --> 00:32:30.680
<v Speaker 6>And I think understanding how like you know, what is

725
00:32:30.720 --> 00:32:33.559
<v Speaker 6>shared and what isn't and kind of how the messages

726
00:32:33.640 --> 00:32:37.920
<v Speaker 6>I guess passed to each other through that orchestration layer

727
00:32:39.279 --> 00:32:42.160
<v Speaker 6>is important. So like how do you go about reasoning

728
00:32:42.400 --> 00:32:47.240
<v Speaker 6>about that? You know, like as far as like do

729
00:32:47.279 --> 00:32:52.319
<v Speaker 6>you have like a very like rigid template for what

730
00:32:52.960 --> 00:32:55.640
<v Speaker 6>kinds of data get shared or or.

731
00:32:55.640 --> 00:32:59.480
<v Speaker 5>Don't if we if we were to kind of utilize

732
00:32:59.480 --> 00:33:02.640
<v Speaker 5>like the database psychic kind of example again maybe.

733
00:33:02.400 --> 00:33:04.960
<v Speaker 6>Sure, or or even the file system, right, like that's

734
00:33:04.960 --> 00:33:05.559
<v Speaker 6>a common one.

735
00:33:05.920 --> 00:33:08.400
<v Speaker 4>Yeah, sure, yeah, that's a good point.

736
00:33:10.039 --> 00:33:12.799
<v Speaker 5>I'll take a step back even actually, and as I'm

737
00:33:12.799 --> 00:33:15.119
<v Speaker 5>thinking about it more, you know, I think it's something

738
00:33:15.160 --> 00:33:18.640
<v Speaker 5>we take for granted as like we when it's in

739
00:33:18.680 --> 00:33:20.759
<v Speaker 5>a job, there is a different set of constraints, but

740
00:33:20.799 --> 00:33:22.920
<v Speaker 5>it is actually a similar set of constraints even in

741
00:33:22.960 --> 00:33:27.039
<v Speaker 5>a web process, right you know, we a web process

742
00:33:27.119 --> 00:33:29.440
<v Speaker 5>even if it isn't threaded, even if it's just processes

743
00:33:29.480 --> 00:33:31.640
<v Speaker 5>you're like on Unicorn or pitchfork or something like that,

744
00:33:31.720 --> 00:33:35.440
<v Speaker 5>it's purely just processes. There's no threads. You can have

745
00:33:35.599 --> 00:33:39.400
<v Speaker 5>a five different users submit the same update or submit

746
00:33:39.440 --> 00:33:41.480
<v Speaker 5>different updates to the same resource at the same time,

747
00:33:41.519 --> 00:33:43.599
<v Speaker 5>and how do you coordinate that? So it's sort of

748
00:33:43.640 --> 00:33:46.599
<v Speaker 5>like there is a it's you know, the juice isn't

749
00:33:46.599 --> 00:33:48.319
<v Speaker 5>worth the squeeze kind of thing, where like you get

750
00:33:48.319 --> 00:33:50.759
<v Speaker 5>really deep into concurrency, but you're always kind of thinking

751
00:33:50.759 --> 00:33:52.079
<v Speaker 5>about it a little bit and how much does it

752
00:33:52.079 --> 00:33:53.720
<v Speaker 5>matter to you? And I think at a base level

753
00:33:54.079 --> 00:33:59.039
<v Speaker 5>a lot of times most things it kind it's it's

754
00:33:59.039 --> 00:34:02.519
<v Speaker 5>probably going to sort itself. It's like last one wins whatever,

755
00:34:02.720 --> 00:34:06.559
<v Speaker 5>you know, like how much can you actually guarantee And

756
00:34:06.599 --> 00:34:09.079
<v Speaker 5>it's really the level of like that and what the

757
00:34:09.079 --> 00:34:11.159
<v Speaker 5>importance of that guarantee on the data is For a

758
00:34:11.199 --> 00:34:14.320
<v Speaker 5>lot of data, Hey, five people submitted updates, last one one,

759
00:34:14.480 --> 00:34:16.400
<v Speaker 5>I don't know like you got five updates. If you

760
00:34:16.400 --> 00:34:18.199
<v Speaker 5>have a version system, you can look at the versions

761
00:34:18.199 --> 00:34:20.039
<v Speaker 5>that came through. If somebody right saying they're like, hey,

762
00:34:20.119 --> 00:34:22.199
<v Speaker 5>why did this happen, it's like, oh, well, I can

763
00:34:22.199 --> 00:34:24.199
<v Speaker 5>see my logs or I can see versions and say like, well,

764
00:34:24.199 --> 00:34:26.119
<v Speaker 5>you have five people submit it the last one one.

765
00:34:26.239 --> 00:34:27.159
<v Speaker 4>That's just how it works.

766
00:34:27.880 --> 00:34:29.960
<v Speaker 1>And so then how often does that happen?

767
00:34:30.679 --> 00:34:33.360
<v Speaker 4>Exactly? Not very often. Yeah, And the same can be

768
00:34:33.400 --> 00:34:34.440
<v Speaker 4>said about your jobs too.

769
00:34:34.440 --> 00:34:36.440
<v Speaker 5>I think a lot of times, like, really, how often

770
00:34:36.480 --> 00:34:40.679
<v Speaker 5>is it that fifteen different updates in jobs happen on

771
00:34:40.719 --> 00:34:42.800
<v Speaker 5>the same resource or the same job gets and cued

772
00:34:42.800 --> 00:34:44.760
<v Speaker 5>a bunch of times? And there's ways you can mitigate

773
00:34:44.760 --> 00:34:47.079
<v Speaker 5>that too, you know, there's like uniqueness gems and stuff

774
00:34:47.119 --> 00:34:49.599
<v Speaker 5>like that for your jobs. And so I think sort

775
00:34:49.599 --> 00:34:51.199
<v Speaker 5>of like the way I look at like how to

776
00:34:51.320 --> 00:34:53.960
<v Speaker 5>approach concurrency on your servers and your job servers is

777
00:34:54.000 --> 00:34:56.719
<v Speaker 5>like the simplest approach wins, which is, unless you're going

778
00:34:56.760 --> 00:34:59.559
<v Speaker 5>to corrupt something, the last one wins, and there it is.

779
00:35:00.280 --> 00:35:02.920
<v Speaker 5>But then when you have a particular resource that it

780
00:35:02.960 --> 00:35:04.840
<v Speaker 5>really just comes down to how important is it that

781
00:35:04.880 --> 00:35:07.199
<v Speaker 5>I exactly get this resource right? And that's when I'll

782
00:35:07.239 --> 00:35:10.639
<v Speaker 5>start to apply like a lock or a uniqueness gem

783
00:35:10.880 --> 00:35:13.679
<v Speaker 5>or something like that, or a batch process or those

784
00:35:13.960 --> 00:35:16.440
<v Speaker 5>sorts of things. So I always try to come at

785
00:35:16.480 --> 00:35:19.920
<v Speaker 5>it from an angle of the simplest solution first and

786
00:35:19.960 --> 00:35:23.079
<v Speaker 5>then the requirements of how dire it is that my

787
00:35:23.159 --> 00:35:26.559
<v Speaker 5>data is always exactly right or it doesn't get coordinated

788
00:35:26.639 --> 00:35:30.239
<v Speaker 5>improperly dictate. Yeah, that's sort of the framework for me.

789
00:35:30.280 --> 00:35:33.239
<v Speaker 5>It's like the simple solution wins if we, you know,

790
00:35:34.000 --> 00:35:36.239
<v Speaker 5>evaluate the requirements and if there's a requirement that you

791
00:35:36.280 --> 00:35:39.119
<v Speaker 5>have to be rock solid about five people can update

792
00:35:39.159 --> 00:35:41.719
<v Speaker 5>this and it like complains to four of them, then

793
00:35:41.760 --> 00:35:43.159
<v Speaker 5>you do that, you know, and you can add that

794
00:35:43.239 --> 00:35:46.880
<v Speaker 5>lock there or that sort of thing, because I think,

795
00:35:46.880 --> 00:35:49.440
<v Speaker 5>I mean, honestly, like I think most systems probably have

796
00:35:50.039 --> 00:35:54.159
<v Speaker 5>these little like oddball inconsistent pieces of data that come

797
00:35:54.239 --> 00:35:56.079
<v Speaker 5>up and you just don't realize it and it just

798
00:35:56.119 --> 00:35:59.559
<v Speaker 5>doesn't matter most of the time, you know, but occasionally

799
00:35:59.599 --> 00:36:02.280
<v Speaker 5>does or occasionally it's really important, depending on what industry

800
00:36:02.280 --> 00:36:03.159
<v Speaker 5>you're in or what piece of.

801
00:36:03.159 --> 00:36:03.719
<v Speaker 4>Data it is.

802
00:36:04.559 --> 00:36:07.960
<v Speaker 5>So yeah, that's that's sort of my loose framework. I

803
00:36:07.960 --> 00:36:10.840
<v Speaker 5>guess the simplicity first, and then based on the requirements

804
00:36:10.840 --> 00:36:12.679
<v Speaker 5>and the importance.

805
00:36:12.199 --> 00:36:14.320
<v Speaker 4>Of the data. You start to apply locks and you

806
00:36:14.360 --> 00:36:15.559
<v Speaker 4>start to apply other tools.

807
00:36:17.119 --> 00:36:19.960
<v Speaker 6>Are there some tasks where you're like you think right away,

808
00:36:20.079 --> 00:36:21.599
<v Speaker 6>like I'm just going to a sync this because then

809
00:36:21.599 --> 00:36:22.960
<v Speaker 6>I'll just rip through all these.

810
00:36:22.960 --> 00:36:27.000
<v Speaker 5>I was going to ask that, Yeah, I think a

811
00:36:27.039 --> 00:36:32.199
<v Speaker 5>lot of that. Really, I try to evaluate. I try

812
00:36:32.239 --> 00:36:35.239
<v Speaker 5>to evaluate like upfront scale of a task, and that

813
00:36:35.280 --> 00:36:38.280
<v Speaker 5>will sort of help me dictate how much I want

814
00:36:38.280 --> 00:36:41.360
<v Speaker 5>to do. So for instance, like let's say you're you're

815
00:36:41.400 --> 00:36:44.159
<v Speaker 5>allowing users to upload like these huge files or something,

816
00:36:44.199 --> 00:36:46.239
<v Speaker 5>and you need to do some processing on them well,

817
00:36:46.360 --> 00:36:48.840
<v Speaker 5>or like or your constraints are like, hey, I'm trying

818
00:36:48.840 --> 00:36:52.519
<v Speaker 5>to think of a good example. Let's say like people

819
00:36:52.519 --> 00:36:55.280
<v Speaker 5>can upload they want to like bulk import data into

820
00:36:55.320 --> 00:36:56.920
<v Speaker 5>your system or something, so they can upload a bunch

821
00:36:56.920 --> 00:37:00.880
<v Speaker 5>of like CSPs or Excel files or whatever, and depending

822
00:37:00.880 --> 00:37:02.519
<v Speaker 5>on what constraints you put on it, like, that's a

823
00:37:02.679 --> 00:37:06.039
<v Speaker 5>pretty paralyzable task. And so my first thought for something

824
00:37:06.079 --> 00:37:08.599
<v Speaker 5>like that really would probably go to, like, okay, can

825
00:37:08.639 --> 00:37:11.840
<v Speaker 5>I like, what's my strategy for uploading these on the

826
00:37:11.840 --> 00:37:13.840
<v Speaker 5>front end, and then once it gets to the back end,

827
00:37:14.360 --> 00:37:16.840
<v Speaker 5>I want I know that unless I constrain it. This

828
00:37:16.960 --> 00:37:18.760
<v Speaker 5>user could like take down my server, like they send

829
00:37:18.800 --> 00:37:21.159
<v Speaker 5>me a five hundred megaby file. I load the whole

830
00:37:21.159 --> 00:37:22.519
<v Speaker 5>thing in the memory, I try to operate through it,

831
00:37:22.519 --> 00:37:25.400
<v Speaker 5>and it's like crap, that process just crashed right Well, okay,

832
00:37:25.400 --> 00:37:26.920
<v Speaker 5>So in that case, what I probably want to do

833
00:37:26.960 --> 00:37:28.480
<v Speaker 5>is I probably want to offload it to a job,

834
00:37:29.440 --> 00:37:31.639
<v Speaker 5>and I probably want to try to chunk up that

835
00:37:31.679 --> 00:37:33.320
<v Speaker 5>file up front, like the first step of my job,

836
00:37:33.400 --> 00:37:35.599
<v Speaker 5>you know, using a batch, I might say, okay, let

837
00:37:35.599 --> 00:37:38.079
<v Speaker 5>me split this into five pieces and then run those

838
00:37:38.119 --> 00:37:41.159
<v Speaker 5>in parallel. And that's that's a really nicely paralyzable task.

839
00:37:41.199 --> 00:37:44.079
<v Speaker 5>And so there are definitely things like that where like

840
00:37:44.159 --> 00:37:47.800
<v Speaker 5>the size of the data indicates to me like I

841
00:37:47.840 --> 00:37:52.480
<v Speaker 5>need to do some some ACYNC kind of processing.

842
00:37:52.000 --> 00:37:53.159
<v Speaker 4>And split it up right away.

843
00:37:53.440 --> 00:37:54.800
<v Speaker 5>But you know, if you've got a cred forum and

844
00:37:54.800 --> 00:37:57.239
<v Speaker 5>you're submitting five fields, like but whatever, I don't need

845
00:37:57.280 --> 00:37:59.440
<v Speaker 5>to do any special there. But even within that you

846
00:37:59.440 --> 00:38:01.119
<v Speaker 5>can get a challenge just too, right, Like maybe you

847
00:38:01.199 --> 00:38:03.639
<v Speaker 5>have this like really complicated form and in that case

848
00:38:03.679 --> 00:38:05.440
<v Speaker 5>you might not do a sink, but you might try

849
00:38:05.480 --> 00:38:07.239
<v Speaker 5>to do like a you know, an insert all and

850
00:38:07.360 --> 00:38:09.079
<v Speaker 5>rails or something like that, right, It's like, oh, yeah,

851
00:38:09.119 --> 00:38:11.239
<v Speaker 5>I could just insert each record, but I've got fifty

852
00:38:11.239 --> 00:38:13.920
<v Speaker 5>different records and now it's going to take three seconds

853
00:38:13.920 --> 00:38:16.239
<v Speaker 5>to do like individual steps, so I would do an

854
00:38:16.239 --> 00:38:18.840
<v Speaker 5>insert all and so. But yeah, like there's there's definitely

855
00:38:18.840 --> 00:38:21.679
<v Speaker 5>tasks that get presented to you, and the size of

856
00:38:21.679 --> 00:38:24.000
<v Speaker 5>your application I think dictates it too, and how many

857
00:38:24.079 --> 00:38:25.719
<v Speaker 5>users you have where you're like, yeah, if I had

858
00:38:25.760 --> 00:38:27.719
<v Speaker 5>five users, this would scale pretty well if I just

859
00:38:27.760 --> 00:38:29.800
<v Speaker 5>did it all here. But now I've got, you know,

860
00:38:30.000 --> 00:38:32.800
<v Speaker 5>five thousand users, and so if a bunch of them

861
00:38:32.800 --> 00:38:34.599
<v Speaker 5>do this at once, I really need.

862
00:38:34.440 --> 00:38:35.159
<v Speaker 4>To paralyze this.

863
00:38:35.199 --> 00:38:36.960
<v Speaker 5>And I can do it pretty easily using a sink

864
00:38:37.039 --> 00:38:40.320
<v Speaker 5>or sidekick or whatever. So there's definitely things we're up front.

865
00:38:40.320 --> 00:38:42.159
<v Speaker 5>Like as much as I say simplicity, there's definitely things

866
00:38:42.199 --> 00:38:44.320
<v Speaker 5>up front where I'm like, I need to do some streaming.

867
00:38:44.440 --> 00:38:46.519
<v Speaker 5>I need to split this into multiple tasks. I want

868
00:38:46.519 --> 00:38:49.440
<v Speaker 5>to use threads and processes and all those things to

869
00:38:49.519 --> 00:38:52.079
<v Speaker 5>my benefit so that instead of taking fifteen minutes to

870
00:38:52.119 --> 00:38:54.960
<v Speaker 5>process this five hundred MEGABI file, I do it in

871
00:38:55.159 --> 00:38:57.960
<v Speaker 5>five seconds or ten seconds, right, And you can do

872
00:38:58.000 --> 00:39:00.360
<v Speaker 5>that kind of stuff by splitting this out and it's

873
00:39:00.400 --> 00:39:02.960
<v Speaker 5>such a satisfying thing too, right, So, like I think performance,

874
00:39:03.000 --> 00:39:04.559
<v Speaker 5>I don't know if about for you guys, performance is

875
00:39:04.559 --> 00:39:08.000
<v Speaker 5>like one of the most satisfying things to improve, and

876
00:39:08.079 --> 00:39:11.800
<v Speaker 5>paralyzation can often get you that, you know, at a

877
00:39:11.840 --> 00:39:14.360
<v Speaker 5>cost of some complexity. But but it's a good feeling

878
00:39:14.400 --> 00:39:16.599
<v Speaker 5>to take something from like five hours down to like

879
00:39:16.880 --> 00:39:21.559
<v Speaker 5>two minutes or something, right, Yeah, Yeah, So.

880
00:39:21.480 --> 00:39:23.599
<v Speaker 2>I was gonna say when I when I shave off

881
00:39:23.639 --> 00:39:26.679
<v Speaker 2>a couple of milliseconds, I don't always care, but yeah,

882
00:39:26.719 --> 00:39:29.119
<v Speaker 2>the five hours to two minutes, it's like I'm a

883
00:39:29.159 --> 00:39:30.119
<v Speaker 2>freaking badass.

884
00:39:30.679 --> 00:39:34.159
<v Speaker 4>Oh yeah, that's the best feeling. Oh my gosh.

885
00:39:34.239 --> 00:39:37.119
<v Speaker 5>Yeah, but you're right, Yeah, milliseconds. There have been points

886
00:39:37.119 --> 00:39:40.559
<v Speaker 5>in my life where I've cared about milliseconds, but mostly

887
00:39:40.639 --> 00:39:42.679
<v Speaker 5>just as like it's probably just like a pride thing.

888
00:39:42.719 --> 00:39:45.559
<v Speaker 5>At that point you're like, why is this fifty milliseconds?

889
00:39:45.559 --> 00:39:47.639
<v Speaker 5>Like it should be ten or something. It's like, it

890
00:39:47.679 --> 00:39:50.119
<v Speaker 5>does not matter day to day those types of things,

891
00:39:50.400 --> 00:39:52.800
<v Speaker 5>unless you're like like a Shopify or something like, Yeah,

892
00:39:52.840 --> 00:39:55.679
<v Speaker 5>shaving off forty milliseconds for Shopify probably makes the difference

893
00:39:55.679 --> 00:39:57.599
<v Speaker 5>for some things or doing but for most of.

894
00:39:57.679 --> 00:39:58.760
<v Speaker 4>Yeah, it doesn't.

895
00:39:59.239 --> 00:40:02.840
<v Speaker 2>But even then, and it's not the forty milliseconds, it's hey,

896
00:40:03.199 --> 00:40:06.880
<v Speaker 2>we saved ourselves, you know, sixty thousand dollars in compute

897
00:40:06.920 --> 00:40:09.719
<v Speaker 2>across all of the repluts, Right, that's the big number

898
00:40:09.760 --> 00:40:11.960
<v Speaker 2>that gives you the badass feelings, you know what I mean.

899
00:40:12.000 --> 00:40:12.679
<v Speaker 4>That's a good point.

900
00:40:12.760 --> 00:40:15.480
<v Speaker 5>Yeah, you deploy a new version of Ruby with wyj

901
00:40:15.679 --> 00:40:18.920
<v Speaker 5>and you get like twenty percent faster. Yeah, you're someone

902
00:40:18.960 --> 00:40:20.599
<v Speaker 5>like shop of our GitHub and it's like, well, I

903
00:40:20.679 --> 00:40:24.360
<v Speaker 5>just save literally saved us millions of dollars. Right, that's incredible. Right,

904
00:40:24.480 --> 00:40:25.119
<v Speaker 5>that's a good point.

905
00:40:25.280 --> 00:40:25.440
<v Speaker 4>Yeah.

906
00:40:25.760 --> 00:40:28.519
<v Speaker 6>I always wonder with like the the you know, the

907
00:40:28.559 --> 00:40:31.679
<v Speaker 6>push for serviluss, like you would think that, like you know,

908
00:40:32.400 --> 00:40:34.960
<v Speaker 6>your cup, compute time would be like the most important

909
00:40:34.960 --> 00:40:39.639
<v Speaker 6>thing at that point, like because because you're you're paying

910
00:40:40.039 --> 00:40:43.079
<v Speaker 6>for whatever time it takes for the thing to run, right.

911
00:40:43.159 --> 00:40:46.400
<v Speaker 2>Yeah, But I think it depends it We're off on

912
00:40:46.440 --> 00:40:49.239
<v Speaker 2>a tangent, But I think it depends on what what

913
00:40:49.280 --> 00:40:51.719
<v Speaker 2>the critical feature is of it, right, And so if

914
00:40:51.760 --> 00:40:55.559
<v Speaker 2>the critical feature is something other than the compute time, right,

915
00:40:55.599 --> 00:41:01.199
<v Speaker 2>it's accuracy or you know, some other aspect of of

916
00:41:01.239 --> 00:41:04.079
<v Speaker 2>what you're doing that affects the user, and the user

917
00:41:04.119 --> 00:41:05.199
<v Speaker 2>will spend more with you.

918
00:41:05.239 --> 00:41:05.480
<v Speaker 3>Maybe.

919
00:41:05.519 --> 00:41:09.920
<v Speaker 2>Yeah, Anyway, it's not it's not always one metric and

920
00:41:09.960 --> 00:41:12.760
<v Speaker 2>it's not always one metric across the same problem set, so.

921
00:41:14.039 --> 00:41:16.280
<v Speaker 5>Right, And I mean, you know, when you spread things out,

922
00:41:16.440 --> 00:41:19.920
<v Speaker 5>even if the added like compute time may seem higher,

923
00:41:19.960 --> 00:41:21.280
<v Speaker 5>a lot of times you do end up getting things

924
00:41:21.320 --> 00:41:24.320
<v Speaker 5>done faster. So like the sequential version, but I haven't,

925
00:41:24.360 --> 00:41:27.280
<v Speaker 5>I personally haven't done a ton of like full servilist stuff.

926
00:41:27.280 --> 00:41:29.079
<v Speaker 5>So's it's not something I think about all the time.

927
00:41:29.440 --> 00:41:32.159
<v Speaker 5>And the cold starts scaring me so much, So.

928
00:41:33.159 --> 00:41:41.800
<v Speaker 2>I mean, that's that's that's another version of of paralylization though,

929
00:41:41.880 --> 00:41:44.360
<v Speaker 2>is the serverless, right, you're just pushing the cloud cloud

930
00:41:44.400 --> 00:41:44.760
<v Speaker 2>to it.

931
00:41:45.559 --> 00:41:49.679
<v Speaker 5>That's true, It's yeah, it's kind of like it's again

932
00:41:49.760 --> 00:41:52.679
<v Speaker 5>like the layers of concurrency go beyond what a language

933
00:41:52.679 --> 00:41:54.719
<v Speaker 5>offers you, and then you start you know, you've got

934
00:41:54.719 --> 00:41:57.320
<v Speaker 5>the lowest level, then you've got like processes, then you've

935
00:41:57.320 --> 00:42:00.000
<v Speaker 5>got how you coordinate your servers, and yeah, serverleist technical

936
00:42:01.000 --> 00:42:03.400
<v Speaker 5>it's like you know, quote unquote like infinitely scalable, right,

937
00:42:03.440 --> 00:42:05.800
<v Speaker 5>It's just everything's just popping up anytime you need it.

938
00:42:06.159 --> 00:42:08.320
<v Speaker 5>And so there's just more and more layers of what

939
00:42:08.360 --> 00:42:12.679
<v Speaker 5>that concurrency means. But I think for Ruby specifically, you know,

940
00:42:12.800 --> 00:42:15.239
<v Speaker 5>you benefit a lot more from tuning at the Ruby

941
00:42:15.320 --> 00:42:17.639
<v Speaker 5>level before you get up to higher levels, because if

942
00:42:17.639 --> 00:42:19.920
<v Speaker 5>you don't do that, then you tend to you might

943
00:42:20.719 --> 00:42:23.360
<v Speaker 5>use a lot more memory, for instance. So like you know,

944
00:42:23.400 --> 00:42:25.679
<v Speaker 5>if you don't take advantage of processes and copy on

945
00:42:25.719 --> 00:42:28.400
<v Speaker 5>write and stuff like that, then every process is going

946
00:42:28.480 --> 00:42:29.639
<v Speaker 5>to take the same amount of memory.

947
00:42:29.639 --> 00:42:30.239
<v Speaker 4>You can't take it.

948
00:42:30.239 --> 00:42:33.119
<v Speaker 5>You can't have any benefit from forking or I think

949
00:42:33.159 --> 00:42:36.480
<v Speaker 5>you talked to John Bossier about like Pitchfork on one

950
00:42:36.519 --> 00:42:39.719
<v Speaker 5>podcast maybe, and like you know, pitchfork has like reforking,

951
00:42:39.760 --> 00:42:42.000
<v Speaker 5>and like you get really optimized memory there. And if

952
00:42:42.000 --> 00:42:45.280
<v Speaker 5>you if you try to do things from like a

953
00:42:45.320 --> 00:42:48.519
<v Speaker 5>serve purely servilest perspectives, like everything's pretty much taken.

954
00:42:48.360 --> 00:42:50.360
<v Speaker 4>The same amount of it, you can't do anything about it.

955
00:42:50.280 --> 00:42:52.519
<v Speaker 5>Whereas if you if you isolate a little bit more,

956
00:42:52.719 --> 00:42:55.440
<v Speaker 5>you can get really efficient memory working on a more

957
00:42:55.440 --> 00:42:57.800
<v Speaker 5>isolated level. And then and then it's it's a similar

958
00:42:57.800 --> 00:42:59.719
<v Speaker 5>thing to I shaved off thirty milli seconds, Well I

959
00:42:59.719 --> 00:43:02.079
<v Speaker 5>should abouf two hundred megabytes of memory right over the

960
00:43:02.320 --> 00:43:04.920
<v Speaker 5>over the spectrum of all my processes. Now I get

961
00:43:04.920 --> 00:43:07.519
<v Speaker 5>an extra like process or two or three or whatever,

962
00:43:08.320 --> 00:43:12.320
<v Speaker 5>and so now I have more capacity. And processes are

963
00:43:12.320 --> 00:43:14.400
<v Speaker 5>one of the best forms of capacity because they have

964
00:43:14.440 --> 00:43:17.199
<v Speaker 5>a lot lower latency, which I think is kind of

965
00:43:17.199 --> 00:43:20.000
<v Speaker 5>one of the benefits of like a unicorn or pitchfork latency.

966
00:43:20.320 --> 00:43:25.440
<v Speaker 5>Process is really good. Yeah, just just it's.

967
00:43:26.400 --> 00:43:28.800
<v Speaker 6>Building on building on top of the idea of like

968
00:43:28.880 --> 00:43:31.679
<v Speaker 6>you use what the language offers you, Like you've been

969
00:43:32.079 --> 00:43:35.480
<v Speaker 6>getting more involved in the language, right, yeah, and kind

970
00:43:35.480 --> 00:43:37.800
<v Speaker 6>of where that is, so like where where does maybe

971
00:43:37.920 --> 00:43:41.360
<v Speaker 6>ruby Like where is it missing things and pieces of

972
00:43:41.400 --> 00:43:44.199
<v Speaker 6>this puzzle, like what is being worked on that you

973
00:43:44.239 --> 00:43:46.760
<v Speaker 6>can like maybe shed some light on that I could

974
00:43:46.840 --> 00:43:47.599
<v Speaker 6>use some improvement.

975
00:43:48.360 --> 00:43:49.320
<v Speaker 3>After you answer this.

976
00:43:50.199 --> 00:43:52.679
<v Speaker 4>Sure sounds very like secretive or die or.

977
00:43:54.480 --> 00:43:56.000
<v Speaker 3>I just don't want to use the question.

978
00:43:56.400 --> 00:43:59.960
<v Speaker 4>Answer this question correctly and you'll live blue.

979
00:44:00.039 --> 00:44:05.400
<v Speaker 5>Yeah, yeah, exactly. I feel like like a Monty python.

980
00:44:05.440 --> 00:44:07.360
<v Speaker 5>I just got like ejected into the air kind of thing.

981
00:44:08.880 --> 00:44:12.079
<v Speaker 4>So yeah, I I you know, I don't want to

982
00:44:12.119 --> 00:44:12.679
<v Speaker 4>I don't want.

983
00:44:12.519 --> 00:44:14.119
<v Speaker 5>To speak too much for the language self, right, Like

984
00:44:14.159 --> 00:44:16.719
<v Speaker 5>I'm not a core maintainer or anything like that. I've

985
00:44:16.800 --> 00:44:19.480
<v Speaker 5>I've you know, I've I've submitted, you know, I've I've

986
00:44:19.519 --> 00:44:22.119
<v Speaker 5>contributed some stuff to the MN thread scheduler. And and

987
00:44:22.519 --> 00:44:27.159
<v Speaker 5>there's actually a local guy, Sunghan Jung, who is a

988
00:44:27.400 --> 00:44:30.199
<v Speaker 5>he's a student researcher at Brown and he's done some

989
00:44:30.239 --> 00:44:32.039
<v Speaker 5>really interesting stuff with ractors. So I've been going back

990
00:44:32.039 --> 00:44:33.880
<v Speaker 5>and forth with him a bit. But to me, I

991
00:44:33.920 --> 00:44:38.559
<v Speaker 5>think in terms of the language itself and expanding on that,

992
00:44:38.599 --> 00:44:40.920
<v Speaker 5>there's like there's a bunch of pieces in place already

993
00:44:41.039 --> 00:44:46.000
<v Speaker 5>that I think just need maybe more like contributor coordination

994
00:44:46.119 --> 00:44:48.480
<v Speaker 5>or community involvement or something like that. And in particular,

995
00:44:48.519 --> 00:44:52.039
<v Speaker 5>I think those are you know, Samuel Williams is like

996
00:44:53.039 --> 00:44:55.239
<v Speaker 5>insane in terms of how much contribution he's done for.

997
00:44:55.199 --> 00:44:55.800
<v Speaker 4>The fiber stuff.

998
00:44:55.800 --> 00:44:57.679
<v Speaker 5>He's right, he goes into like every project and he's

999
00:44:57.719 --> 00:44:59.639
<v Speaker 5>like do this, do this, do this, and fibers are

1000
00:44:59.639 --> 00:45:01.480
<v Speaker 5>work great and then that benefits it. So like fibers

1001
00:45:01.519 --> 00:45:03.079
<v Speaker 5>are in like pretty good hands with him, and those

1002
00:45:03.119 --> 00:45:07.039
<v Speaker 5>are going in a good direction. Ractors, you know, I'm

1003
00:45:07.039 --> 00:45:09.440
<v Speaker 5>sure I believe you've talked to people about ractors before,

1004
00:45:09.440 --> 00:45:12.679
<v Speaker 5>and ractors are sort of like, you know, they're almost

1005
00:45:12.679 --> 00:45:14.800
<v Speaker 5>like this like unfulfilled promise. It's like we've all I

1006
00:45:14.840 --> 00:45:17.920
<v Speaker 5>was like super excited about ractors for RUB three, and

1007
00:45:18.440 --> 00:45:21.760
<v Speaker 5>they're just always like not quite there. And so I

1008
00:45:22.079 --> 00:45:26.119
<v Speaker 5>would like to see more like community involvement in ractors

1009
00:45:26.159 --> 00:45:27.960
<v Speaker 5>so that people can take advantage of more of that

1010
00:45:28.039 --> 00:45:30.880
<v Speaker 5>actual parallelism. And I think if ractors got more stable

1011
00:45:30.880 --> 00:45:33.119
<v Speaker 5>than they are now, people would probably start to like

1012
00:45:33.119 --> 00:45:34.960
<v Speaker 5>integrate them more into gems. And then now you have

1013
00:45:35.039 --> 00:45:38.800
<v Speaker 5>like a truly parallel thing that doesn't take a whole

1014
00:45:38.800 --> 00:45:41.119
<v Speaker 5>new process of memory, right, because you can do parallel

1015
00:45:41.199 --> 00:45:43.480
<v Speaker 5>Ruby otherwise, but its processes they use a lot more

1016
00:45:43.480 --> 00:45:45.920
<v Speaker 5>memory all that stuff, and so with ractors it's a

1017
00:45:45.960 --> 00:45:48.800
<v Speaker 5>pure parallelism thing. And so I think there's like key

1018
00:45:49.440 --> 00:45:53.239
<v Speaker 5>inconsistent features in though in those that if those got fixed,

1019
00:45:53.679 --> 00:45:55.760
<v Speaker 5>we could get maybe more community involvement and we could

1020
00:45:55.800 --> 00:45:58.960
<v Speaker 5>expand the area of ractors. The other piece that I

1021
00:45:59.000 --> 00:46:01.760
<v Speaker 5>think is really thataluable that it was the piece that

1022
00:46:01.800 --> 00:46:04.239
<v Speaker 5>I contributed to MACO support for is the m N

1023
00:46:04.320 --> 00:46:08.039
<v Speaker 5>thread scheduler. And so I think the m N thread

1024
00:46:08.079 --> 00:46:12.000
<v Speaker 5>scheduler is probably one of the most potentially beneficial things

1025
00:46:12.000 --> 00:46:13.880
<v Speaker 5>to the ecosystem. And the nice thing about it is

1026
00:46:13.880 --> 00:46:16.320
<v Speaker 5>it can be potentially beneficial without anybody really having to

1027
00:46:16.320 --> 00:46:18.639
<v Speaker 5>do much of anything. And so the M and thread

1028
00:46:18.639 --> 00:46:22.280
<v Speaker 5>schedule it basically just says like it operates a lot

1029
00:46:22.280 --> 00:46:25.119
<v Speaker 5>more like go co routines. Like in in our go

1030
00:46:25.199 --> 00:46:26.719
<v Speaker 5>routines and go you have go routines, and like you

1031
00:46:26.760 --> 00:46:28.280
<v Speaker 5>don't think about threads, You don't think about anything. You

1032
00:46:28.360 --> 00:46:31.159
<v Speaker 5>just like I just create five million go routines and whatever.

1033
00:46:31.199 --> 00:46:32.760
<v Speaker 5>They just they just do my work. And so the

1034
00:46:33.079 --> 00:46:35.599
<v Speaker 5>MN thread scheduler is trying to fill like a somewhat

1035
00:46:35.639 --> 00:46:39.519
<v Speaker 5>similar role in that it backs itself with some actual

1036
00:46:39.760 --> 00:46:41.800
<v Speaker 5>OS threads, but a lot of the rest of it

1037
00:46:41.920 --> 00:46:44.320
<v Speaker 5>uses the same kind of principle as fibers. They use

1038
00:46:44.360 --> 00:46:47.119
<v Speaker 5>this thing called a reactor and it uses some like

1039
00:46:47.159 --> 00:46:49.000
<v Speaker 5>efficient OS processing and stuff.

1040
00:46:48.719 --> 00:46:49.239
<v Speaker 4>To handle it.

1041
00:46:49.519 --> 00:46:52.079
<v Speaker 5>And so I think if if MN thread scheduling support

1042
00:46:52.119 --> 00:46:55.199
<v Speaker 5>got really strong, more servers could enable that, and it

1043
00:46:55.199 --> 00:46:57.599
<v Speaker 5>would actually you would be able to support like the

1044
00:46:57.639 --> 00:47:00.920
<v Speaker 5>same level of concurrency on existing servers with less threads

1045
00:47:00.920 --> 00:47:03.880
<v Speaker 5>and so less memory, overhead less CPU, overhead less thread

1046
00:47:03.880 --> 00:47:08.519
<v Speaker 5>schedule or coordination, and so from an outsider's perspective who's

1047
00:47:08.519 --> 00:47:12.360
<v Speaker 5>contributed a bit to see Ruby itself, that's probably like

1048
00:47:12.400 --> 00:47:14.719
<v Speaker 5>my hierarchy. It's like Samue Williams is doing a great

1049
00:47:14.800 --> 00:47:16.960
<v Speaker 5>job promoting and doing great stuff with fibers, like that's

1050
00:47:16.960 --> 00:47:20.599
<v Speaker 5>in pretty good hands. Ractors and MN thread scheduling are

1051
00:47:20.639 --> 00:47:23.639
<v Speaker 5>kind of like pretty much in Koichi's camp, and I

1052
00:47:23.639 --> 00:47:27.320
<v Speaker 5>would like to see that get expanded more and that

1053
00:47:27.519 --> 00:47:31.599
<v Speaker 5>MN thread scheduler get more like full support. We start

1054
00:47:31.639 --> 00:47:34.119
<v Speaker 5>seeing it used in servers and like being better able

1055
00:47:34.119 --> 00:47:36.199
<v Speaker 5>to scale servers. And then kind of the cherry on

1056
00:47:36.239 --> 00:47:38.559
<v Speaker 5>top to that is if we got better actor support,

1057
00:47:38.559 --> 00:47:40.559
<v Speaker 5>then people can reach for that and say, I've got

1058
00:47:40.559 --> 00:47:42.199
<v Speaker 5>this super parallel thing, like I want to do some

1059
00:47:42.239 --> 00:47:44.000
<v Speaker 5>image processing or something, and I don't want to spend

1060
00:47:44.039 --> 00:47:45.960
<v Speaker 5>up another process. Whatever I hand it off to. This

1061
00:47:46.079 --> 00:47:48.519
<v Speaker 5>ractor operates in parallel while I'm doing this other thing.

1062
00:47:48.679 --> 00:47:51.800
<v Speaker 5>Perfect I've got my parallel stuff in Ruby, And so

1063
00:47:51.800 --> 00:47:54.199
<v Speaker 5>those are kind of the three areas for me. Like

1064
00:47:54.239 --> 00:47:57.679
<v Speaker 5>threading itself is just like a pretty solid long term thing.

1065
00:47:59.039 --> 00:48:02.119
<v Speaker 5>The MN thread schedule, or if it succeeds, I think,

1066
00:48:02.159 --> 00:48:04.679
<v Speaker 5>would would kind of take over for that and become

1067
00:48:04.800 --> 00:48:07.960
<v Speaker 5>like the new default, and it would probably increase the

1068
00:48:08.639 --> 00:48:10.719
<v Speaker 5>would hopefully increase the performance for a lot of servers.

1069
00:48:10.800 --> 00:48:13.280
<v Speaker 5>Or at the very least decrease the overhead of those servers.

1070
00:48:14.519 --> 00:48:16.599
<v Speaker 5>So yeah, those are those are kind of the perspectives

1071
00:48:16.639 --> 00:48:21.320
<v Speaker 5>of of seeing the internals of Ruby. I've been trying

1072
00:48:21.360 --> 00:48:23.119
<v Speaker 5>to read more ractor source code too, to see if

1073
00:48:23.119 --> 00:48:25.119
<v Speaker 5>I can help with some of that stuff, because I

1074
00:48:25.159 --> 00:48:28.079
<v Speaker 5>really want ractors to be more stable, and I think

1075
00:48:28.480 --> 00:48:32.480
<v Speaker 5>like Sung Hung's work. He created a server called Moro,

1076
00:48:32.719 --> 00:48:34.920
<v Speaker 5>so we could probably reference that or something. It's like

1077
00:48:34.920 --> 00:48:38.119
<v Speaker 5>an actual ractor based server, and it's it's sort of

1078
00:48:38.199 --> 00:48:40.760
<v Speaker 5>like a bit of a toy project, but like the

1079
00:48:40.840 --> 00:48:43.960
<v Speaker 5>principles could be like kind of powerful for certain things,

1080
00:48:44.000 --> 00:48:46.760
<v Speaker 5>but because of bugs that are in ractors, it just

1081
00:48:46.840 --> 00:48:49.559
<v Speaker 5>hit a wall and it hasn't gone any further since then.

1082
00:48:50.800 --> 00:48:54.360
<v Speaker 5>But yeah, and then threat skied driller fibers. Let's let's

1083
00:48:54.360 --> 00:48:57.280
<v Speaker 5>get ractors going to that's my answer there.

1084
00:48:57.760 --> 00:49:00.840
<v Speaker 1>My follow up question was along some of the same lines.

1085
00:49:01.480 --> 00:49:03.880
<v Speaker 2>I mean, you're talking about features that we either have

1086
00:49:04.239 --> 00:49:08.639
<v Speaker 2>and could use or you know, maybe could I guess

1087
00:49:08.679 --> 00:49:13.480
<v Speaker 2>become more usable in the future. But I was also

1088
00:49:13.599 --> 00:49:17.400
<v Speaker 2>thinking along the lines of things like you know, wyget

1089
00:49:17.440 --> 00:49:21.480
<v Speaker 2>for example, not not in the sense of concurrency, but

1090
00:49:21.519 --> 00:49:25.039
<v Speaker 2>wyjet was you know, you'd compile with a flag, or

1091
00:49:25.079 --> 00:49:27.559
<v Speaker 2>you'd you know, you'd turn it on and now you

1092
00:49:27.559 --> 00:49:30.639
<v Speaker 2>can kind of you can turn it on without using

1093
00:49:30.679 --> 00:49:33.159
<v Speaker 2>the flag when you compile it, or you can you know,

1094
00:49:33.199 --> 00:49:37.400
<v Speaker 2>you can kind of have it on by default. Are

1095
00:49:37.400 --> 00:49:40.239
<v Speaker 2>there features that are in Ruby that you have to

1096
00:49:40.559 --> 00:49:42.639
<v Speaker 2>turn on that way or are there tweaks that you

1097
00:49:42.679 --> 00:49:46.360
<v Speaker 2>can make or flags you can give the VM that

1098
00:49:46.360 --> 00:49:50.719
<v Speaker 2>that also allow you to do more concurrency or better concurrency.

1099
00:49:52.199 --> 00:49:53.639
<v Speaker 4>Yeah, that's a really interesting question.

1100
00:49:53.840 --> 00:49:57.719
<v Speaker 5>I I don't have a I'm trying to think through

1101
00:49:57.760 --> 00:49:59.599
<v Speaker 5>if there's anything that like sticks out to me, you

1102
00:49:59.679 --> 00:50:03.920
<v Speaker 5>know that. I think again, like the nine thread thread

1103
00:50:03.920 --> 00:50:06.719
<v Speaker 5>scheduler is still kind of experimental, but I think it

1104
00:50:06.719 --> 00:50:09.159
<v Speaker 5>would become sort of that kind of thing, like I

1105
00:50:09.199 --> 00:50:12.760
<v Speaker 5>see it's serving a similar role to WYGI, where like

1106
00:50:13.800 --> 00:50:15.679
<v Speaker 5>you know once once why it's just a thing you

1107
00:50:15.679 --> 00:50:17.119
<v Speaker 5>can kind of like say like okay, I want to

1108
00:50:17.119 --> 00:50:18.639
<v Speaker 5>turn this on and like things just get better. I

1109
00:50:18.639 --> 00:50:21.159
<v Speaker 5>think the AMIN scheduled thread scheduler could be that same

1110
00:50:21.239 --> 00:50:24.280
<v Speaker 5>kind of role for a server or for sidekick or something,

1111
00:50:24.280 --> 00:50:26.880
<v Speaker 5>because the overhead of those becomes lower and now you

1112
00:50:26.960 --> 00:50:30.079
<v Speaker 5>just kind of get like technically you could you can

1113
00:50:30.119 --> 00:50:32.639
<v Speaker 5>scale your server higher based on that. So that's that's

1114
00:50:32.639 --> 00:50:34.280
<v Speaker 5>probably the only one that comes to mind, but it's

1115
00:50:34.320 --> 00:50:37.960
<v Speaker 5>not really one that you can actually utilize on production today,

1116
00:50:38.000 --> 00:50:42.000
<v Speaker 5>so it's not a good answer in that regard. Otherwise,

1117
00:50:44.360 --> 00:50:46.480
<v Speaker 5>I guess actually, probably the one that comes to mind

1118
00:50:46.519 --> 00:50:51.400
<v Speaker 5>that actually exists that you could tweak something or whatever

1119
00:50:51.480 --> 00:50:54.480
<v Speaker 5>to turn on to potentially get some benefit is probably reforking.

1120
00:50:55.000 --> 00:50:57.159
<v Speaker 5>That's the only one I can really think of, and

1121
00:50:57.199 --> 00:51:00.920
<v Speaker 5>so Poom, both Poma and pitchfork have a capable for reforking,

1122
00:51:02.199 --> 00:51:04.960
<v Speaker 5>and reforking is something I haven't really dug into too

1123
00:51:05.039 --> 00:51:06.840
<v Speaker 5>much myself, but it just comes to mind as like

1124
00:51:06.880 --> 00:51:09.480
<v Speaker 5>a hey, like if you turn this on, if you

1125
00:51:09.519 --> 00:51:14.159
<v Speaker 5>take advantage of this, you can potentially have processes that

1126
00:51:14.760 --> 00:51:17.000
<v Speaker 5>take close to as you know, like near as much

1127
00:51:17.079 --> 00:51:19.440
<v Speaker 5>memory as like a thread would, but can actually run

1128
00:51:19.480 --> 00:51:21.719
<v Speaker 5>in parallel, so you kind of get like that that

1129
00:51:21.880 --> 00:51:24.559
<v Speaker 5>ractor flavor without having to like change how you code everything.

1130
00:51:25.519 --> 00:51:27.639
<v Speaker 5>And so so yeah, reforking is probably the only thing

1131
00:51:27.679 --> 00:51:30.320
<v Speaker 5>I can think of that's like semi built in right

1132
00:51:30.360 --> 00:51:32.119
<v Speaker 5>now that you can take advantage of the certain things.

1133
00:51:32.159 --> 00:51:34.960
<v Speaker 5>And I'm curious to see if more tools end up

1134
00:51:34.960 --> 00:51:37.239
<v Speaker 5>picking up on the reforking concept. It's still technically I

1135
00:51:37.239 --> 00:51:39.920
<v Speaker 5>think experimental in Puma. It's obviously like the flag show

1136
00:51:39.960 --> 00:51:43.679
<v Speaker 5>future of Pitchfork, and that's what Shopify is using and

1137
00:51:43.679 --> 00:51:46.440
<v Speaker 5>that I think saved them. It was like something it

1138
00:51:46.480 --> 00:51:48.679
<v Speaker 5>was like eleven or fifteen percent of like memory and

1139
00:51:48.760 --> 00:51:49.920
<v Speaker 5>latency or something like that.

1140
00:51:49.960 --> 00:51:51.119
<v Speaker 4>I think it was. It was.

1141
00:51:51.199 --> 00:51:54.679
<v Speaker 5>It was a There's an article that John Boucier posted

1142
00:51:54.719 --> 00:51:56.760
<v Speaker 5>about it because I was I was asking at one point,

1143
00:51:56.880 --> 00:51:57.639
<v Speaker 5>like how.

1144
00:51:57.559 --> 00:51:58.039
<v Speaker 4>Is this doing?

1145
00:51:58.079 --> 00:52:00.199
<v Speaker 5>And then a little bit later they had posted ale

1146
00:52:00.280 --> 00:52:01.880
<v Speaker 5>saying like pitchworks on prod.

1147
00:52:02.239 --> 00:52:04.320
<v Speaker 4>Here's the benefits that we got out of it.

1148
00:52:04.440 --> 00:52:06.920
<v Speaker 5>So that's probably the only thing I can think of

1149
00:52:07.039 --> 00:52:10.079
<v Speaker 5>today that you could take advantage of that figure not

1150
00:52:10.239 --> 00:52:12.679
<v Speaker 5>but I bet there are things out there, and I

1151
00:52:12.719 --> 00:52:14.639
<v Speaker 5>hope that there's more things I find as I dig

1152
00:52:14.679 --> 00:52:17.119
<v Speaker 5>into the series that I'm like, oh wow, like yeah,

1153
00:52:17.119 --> 00:52:18.920
<v Speaker 5>I can tweak this thing. I can tweak this like

1154
00:52:18.960 --> 00:52:21.360
<v Speaker 5>stack size or something like that. It's like you know

1155
00:52:21.400 --> 00:52:24.320
<v Speaker 5>when you're trying to scale and tune your your Ruby instance,

1156
00:52:24.679 --> 00:52:25.679
<v Speaker 5>you can take advantage of that.

1157
00:52:26.480 --> 00:52:26.719
<v Speaker 3>Yeah.

1158
00:52:27.599 --> 00:52:30.519
<v Speaker 6>Yeah, it's funny. I remember seeing the fallout from all

1159
00:52:30.559 --> 00:52:33.920
<v Speaker 6>of the Pitchfork stuff and it. It kind of like

1160
00:52:34.000 --> 00:52:36.239
<v Speaker 6>was a reflection of all the work they had done previously,

1161
00:52:36.280 --> 00:52:39.559
<v Speaker 6>like with copy on right and like objection right. Yeah,

1162
00:52:39.559 --> 00:52:42.719
<v Speaker 6>it's like a culmination of events that just like oh, hey,

1163
00:52:42.840 --> 00:52:46.159
<v Speaker 6>look we like shaved off this massive chunk of time.

1164
00:52:46.039 --> 00:52:48.960
<v Speaker 4>Right, Like that's a great point that it really does.

1165
00:52:49.039 --> 00:52:51.320
<v Speaker 1>It really has it all together and now all four

1166
00:52:51.400 --> 00:52:52.559
<v Speaker 1>lines appeared.

1167
00:52:52.239 --> 00:52:54.280
<v Speaker 4>At one exactly. Yeah.

1168
00:52:54.280 --> 00:52:56.519
<v Speaker 5>That's that's that's like the best way to describe it,

1169
00:52:56.519 --> 00:52:59.079
<v Speaker 5>because you're right, like earlier versions I seem to remember.

1170
00:52:59.079 --> 00:53:01.960
<v Speaker 5>I think it was like Ruby two or something like that.

1171
00:53:02.039 --> 00:53:03.559
<v Speaker 5>When it came out, it was like, oh, we've got

1172
00:53:03.599 --> 00:53:05.480
<v Speaker 5>like copy on wright, but they when they did a

1173
00:53:05.519 --> 00:53:08.079
<v Speaker 5>garbage collection to like marked every object, it was like, right,

1174
00:53:08.320 --> 00:53:10.639
<v Speaker 5>all the copy on right goes away. They've done all

1175
00:53:10.679 --> 00:53:13.360
<v Speaker 5>this work to improve that. Over time, it's easy to

1176
00:53:13.400 --> 00:53:15.639
<v Speaker 5>forget about that stuff because it's come so far.

1177
00:53:16.039 --> 00:53:16.679
<v Speaker 4>But it isn't.

1178
00:53:16.679 --> 00:53:18.840
<v Speaker 5>I mean, like you know, I do see like an

1179
00:53:18.840 --> 00:53:21.519
<v Speaker 5>incredible amount of work, like looking at the issue tracker

1180
00:53:21.519 --> 00:53:22.920
<v Speaker 5>and all that stuff that these people are doing. You

1181
00:53:22.960 --> 00:53:25.800
<v Speaker 5>watch like Ruby Kaygi talks and stuff where someone's like, like,

1182
00:53:26.400 --> 00:53:27.239
<v Speaker 5>was it Jeremy Evans.

1183
00:53:27.280 --> 00:53:28.280
<v Speaker 4>I think he did a talk on.

1184
00:53:28.320 --> 00:53:31.320
<v Speaker 5>Like it's like, oh, this particular thing I made it

1185
00:53:31.360 --> 00:53:33.039
<v Speaker 5>like a no up because you don't actually like use

1186
00:53:33.079 --> 00:53:35.119
<v Speaker 5>this particular object or like unless you do this other thing.

1187
00:53:35.239 --> 00:53:37.519
<v Speaker 5>And so it like saves like five megabytes of memories.

1188
00:53:37.559 --> 00:53:40.360
<v Speaker 5>Like all these small things just culminate together and we

1189
00:53:40.400 --> 00:53:42.639
<v Speaker 5>all just we all just benefit from it, which is awesome,

1190
00:53:44.239 --> 00:53:45.880
<v Speaker 5>not stuff you would think of as like a higher

1191
00:53:45.920 --> 00:53:49.280
<v Speaker 5>level programmer like I think we all are, which is like, oh,

1192
00:53:49.320 --> 00:53:50.800
<v Speaker 5>like I'm thinking about like how do I make these

1193
00:53:50.840 --> 00:53:53.559
<v Speaker 5>like HTP requests better? And they're like how do I

1194
00:53:53.679 --> 00:53:56.199
<v Speaker 5>make how can I do a million iterations instead of

1195
00:53:56.280 --> 00:53:59.719
<v Speaker 5>right five hundred thousand? You're like, cool, that's great. I'm

1196
00:53:59.719 --> 00:54:04.320
<v Speaker 5>glad you thing about that. Yeah, yeah, I know.

1197
00:54:04.320 --> 00:54:07.079
<v Speaker 6>It's it's the race to see, Okay, well our resource

1198
00:54:07.159 --> 00:54:09.000
<v Speaker 6>is cheap enough that we could just have like more

1199
00:54:09.039 --> 00:54:12.840
<v Speaker 6>resources or like like you know, does it really matter

1200
00:54:12.880 --> 00:54:14.960
<v Speaker 6>that we're making things more performant in the end, right,

1201
00:54:15.039 --> 00:54:17.360
<v Speaker 6>Like I don't really know, but I'm glad people are

1202
00:54:17.360 --> 00:54:17.880
<v Speaker 6>working on it.

1203
00:54:17.960 --> 00:54:22.719
<v Speaker 2>Well, It's it's interesting you bring that up, because at scale,

1204
00:54:22.880 --> 00:54:26.119
<v Speaker 2>all the tiny things add up. But if you back

1205
00:54:26.159 --> 00:54:29.000
<v Speaker 2>it all the way off to hey, Chuck's running his

1206
00:54:29.119 --> 00:54:33.639
<v Speaker 2>stuff out of a garage and linode, right, yeah, you know,

1207
00:54:33.800 --> 00:54:36.800
<v Speaker 2>so you know, and then that's effectively what I'm doing. Right,

1208
00:54:36.840 --> 00:54:39.480
<v Speaker 2>I'm in my house and I run things from here

1209
00:54:39.519 --> 00:54:43.960
<v Speaker 2>and you know, host on linod. So if if I

1210
00:54:44.000 --> 00:54:49.440
<v Speaker 2>can get more resources out of that server or maybe

1211
00:54:49.480 --> 00:54:53.800
<v Speaker 2>two servers or however, I have it set up before

1212
00:54:53.880 --> 00:54:56.360
<v Speaker 2>I have to scale or figure out some of this

1213
00:54:56.400 --> 00:55:00.599
<v Speaker 2>other stuff. I mean, it's it's not just down to hey,

1214
00:55:01.239 --> 00:55:04.000
<v Speaker 2>the server's more efficient, but it's also hey, I can

1215
00:55:04.039 --> 00:55:06.159
<v Speaker 2>get much further down the road before I have to

1216
00:55:06.199 --> 00:55:09.079
<v Speaker 2>add complexity and figure out how to do the ops

1217
00:55:09.119 --> 00:55:11.079
<v Speaker 2>to make this stuff come together.

1218
00:55:12.199 --> 00:55:15.280
<v Speaker 5>So it benefits people on both ends, right, It's almost

1219
00:55:15.280 --> 00:55:17.800
<v Speaker 5>like it benefits people on both ends the most, and

1220
00:55:17.800 --> 00:55:20.239
<v Speaker 5>then in between it's kind of like varying levels. But yeah,

1221
00:55:20.280 --> 00:55:22.199
<v Speaker 5>when you're at that that lower end, we're like, I

1222
00:55:22.239 --> 00:55:24.320
<v Speaker 5>just really, I don't I want to spend like eight

1223
00:55:24.360 --> 00:55:26.239
<v Speaker 5>dollars a month on this thing. Like yeah, if you

1224
00:55:26.280 --> 00:55:29.440
<v Speaker 5>shave off fifteen megabytes of memory, it's like, oh, that

1225
00:55:29.519 --> 00:55:31.599
<v Speaker 5>actually did benefit me. Now I can like do this

1226
00:55:31.639 --> 00:55:33.960
<v Speaker 5>extra request or whatever. So that's a really good point.

1227
00:55:34.239 --> 00:55:36.760
<v Speaker 2>Yeah, And then the other thing is is my scaling

1228
00:55:36.760 --> 00:55:39.280
<v Speaker 2>strategy is I'm going to buy bigger source.

1229
00:55:39.400 --> 00:55:40.159
<v Speaker 4>Right sure?

1230
00:55:40.400 --> 00:55:42.760
<v Speaker 2>Yeah, yeah, you know, and it's like live in that

1231
00:55:42.920 --> 00:55:46.440
<v Speaker 2>land and it's easy and it's cheap anyway.

1232
00:55:47.159 --> 00:55:50.119
<v Speaker 6>I always like, you know, can I run it on

1233
00:55:50.159 --> 00:55:53.440
<v Speaker 6>a pie? You know, and like it's like the crux

1234
00:55:53.559 --> 00:55:56.639
<v Speaker 6>of like you know, they're so cheap and like you know,

1235
00:55:57.000 --> 00:56:00.000
<v Speaker 6>can you just install it and make it work there? Yeah?

1236
00:56:00.039 --> 00:56:04.119
<v Speaker 6>And like that's that's honestly a significant barrier because like

1237
00:56:04.320 --> 00:56:09.400
<v Speaker 6>it is a resource constraint like yeah, but but it

1238
00:56:09.400 --> 00:56:12.000
<v Speaker 6>does have like a very specific value that's very small.

1239
00:56:12.079 --> 00:56:15.239
<v Speaker 6>So like you know, I like that to be my

1240
00:56:16.360 --> 00:56:18.920
<v Speaker 6>I put my like you know, point of can I

1241
00:56:18.920 --> 00:56:20.960
<v Speaker 6>get this to work here? And it makes me wonder

1242
00:56:21.000 --> 00:56:22.840
<v Speaker 6>like you know, but you know, if I had a

1243
00:56:22.880 --> 00:56:26.119
<v Speaker 6>Commodore sixty four lying around, like could I run anything

1244
00:56:26.159 --> 00:56:29.559
<v Speaker 6>on that? Like I don't know, sure, probably probably not much,

1245
00:56:29.639 --> 00:56:32.079
<v Speaker 6>you know, like right yeah.

1246
00:56:31.960 --> 00:56:34.559
<v Speaker 5>Probably yeah, probably not most like higher level languages. I

1247
00:56:34.559 --> 00:56:37.119
<v Speaker 5>mean I'm not even sure. Maybe like an m ruby

1248
00:56:37.199 --> 00:56:39.360
<v Speaker 5>or something, because I know m ruby is like like

1249
00:56:39.480 --> 00:56:44.360
<v Speaker 5>targets like like my Coro controller type device yeah so yeah,

1250
00:56:44.440 --> 00:56:48.559
<v Speaker 5>embedded devices yeah, so maybe there. But yeah, it was

1251
00:56:48.559 --> 00:56:50.480
<v Speaker 5>like an interesting talk. I think it maybe it's ruby,

1252
00:56:50.519 --> 00:56:53.360
<v Speaker 5>kaygi or something about they're using like m ruby like

1253
00:56:53.960 --> 00:56:56.239
<v Speaker 5>it was for like it was during COVID and they

1254
00:56:56.239 --> 00:56:57.800
<v Speaker 5>were doing it was to do like martial arts, like

1255
00:56:57.840 --> 00:56:58.679
<v Speaker 5>remotely or whatever.

1256
00:56:58.679 --> 00:57:00.960
<v Speaker 4>I'm not sure if you guys. I think they use like.

1257
00:57:01.079 --> 00:57:05.000
<v Speaker 5>M ruby to like control like the the smaller units,

1258
00:57:05.039 --> 00:57:07.360
<v Speaker 5>and then they used like j ruby to do like

1259
00:57:07.360 --> 00:57:10.360
<v Speaker 5>an android apt to like control how the thing responded

1260
00:57:10.400 --> 00:57:13.119
<v Speaker 5>to it. And yeah, so, but that's true, like a

1261
00:57:13.159 --> 00:57:15.719
<v Speaker 5>common arcy is before. Yeah, wo anything round there. I

1262
00:57:15.760 --> 00:57:19.719
<v Speaker 5>guess see probably would c probably can always run it everywhere,

1263
00:57:19.760 --> 00:57:23.079
<v Speaker 5>depending on how you write it. But I sort of

1264
00:57:23.119 --> 00:57:25.480
<v Speaker 5>promised myself my whole life, I would like most of

1265
00:57:25.519 --> 00:57:27.400
<v Speaker 5>my programming career, I'm like, I'm never gonna learn. See

1266
00:57:27.440 --> 00:57:29.480
<v Speaker 5>that seems like why would I do that? And now

1267
00:57:29.519 --> 00:57:31.519
<v Speaker 5>I'm doing it because it's it is still just like

1268
00:57:31.719 --> 00:57:33.679
<v Speaker 5>if you want to get into little levels of languages

1269
00:57:33.760 --> 00:57:35.840
<v Speaker 5>or anything, it's it's still the one to use, and

1270
00:57:36.760 --> 00:57:39.039
<v Speaker 5>it's pretty It's not terribly hard to learn, but it

1271
00:57:39.079 --> 00:57:42.960
<v Speaker 5>is terribly hard to not destroy everything with by accident.

1272
00:57:43.039 --> 00:57:46.880
<v Speaker 6>But yeah, so I'm curious, Like I know, we're like

1273
00:57:46.920 --> 00:57:51.519
<v Speaker 6>almost out of time here, but like I always wonder like, Okay,

1274
00:57:51.559 --> 00:57:53.840
<v Speaker 6>like if I have this thing like running on you know,

1275
00:57:53.920 --> 00:57:56.039
<v Speaker 6>a pie or something like this, like you think, okay,

1276
00:57:56.039 --> 00:57:58.000
<v Speaker 6>well I just buy another pie and I can replicate

1277
00:57:58.039 --> 00:58:01.119
<v Speaker 6>it the process and like spread over the machines, Like

1278
00:58:01.440 --> 00:58:04.360
<v Speaker 6>you know, how easy is that from like a concurrency

1279
00:58:04.400 --> 00:58:08.199
<v Speaker 6>perspective like within Ruby, Like is that like a forking

1280
00:58:08.519 --> 00:58:10.679
<v Speaker 6>or like not even a forking, but like there's is

1281
00:58:10.679 --> 00:58:14.360
<v Speaker 6>there even like a shared like you know system library

1282
00:58:14.440 --> 00:58:17.239
<v Speaker 6>or built in way to do that kind of thing?

1283
00:58:17.880 --> 00:58:23.199
<v Speaker 6>Or am I kind of sll dependent on IBM or

1284
00:58:23.239 --> 00:58:26.360
<v Speaker 6>something that have a library that I have to use?

1285
00:58:27.920 --> 00:58:30.800
<v Speaker 5>Yeah, I'm not sure I have the best answer there.

1286
00:58:30.840 --> 00:58:33.679
<v Speaker 5>I I've always liked the idea of like pies and

1287
00:58:33.679 --> 00:58:35.760
<v Speaker 5>and uh you know our do we know stuff like that,

1288
00:58:35.800 --> 00:58:37.400
<v Speaker 5>and I'll buy them and then I'll like I end

1289
00:58:37.519 --> 00:58:39.440
<v Speaker 5>up really doing very much with them and just feel

1290
00:58:39.440 --> 00:58:43.960
<v Speaker 5>sad about it. But uh, yeah, that's interesting. I think

1291
00:58:44.000 --> 00:58:48.320
<v Speaker 5>it probably would be like an m ruby type thing.

1292
00:58:48.320 --> 00:58:50.719
<v Speaker 5>I would imagine, depending on I mean, some pies can

1293
00:58:50.719 --> 00:58:54.480
<v Speaker 5>actually have pretty okay hardware on them right to my understanding,

1294
00:58:54.519 --> 00:58:56.679
<v Speaker 5>Like they're not they're not super beefy, but they're certainly

1295
00:58:56.719 --> 00:58:57.480
<v Speaker 5>not like an rdino.

1296
00:58:58.960 --> 00:59:00.559
<v Speaker 4>Is that is that to say?

1297
00:59:01.679 --> 00:59:04.000
<v Speaker 1>Yeah, I think so, Yeah, yeah, I think you can

1298
00:59:04.079 --> 00:59:04.840
<v Speaker 1>run rails on a.

1299
00:59:05.679 --> 00:59:08.159
<v Speaker 5>Yeah, so I think you probably could take advantage of

1300
00:59:08.199 --> 00:59:10.400
<v Speaker 5>all of the regular concurrency.

1301
00:59:10.599 --> 00:59:12.400
<v Speaker 6>Like what I would what I would love is just

1302
00:59:12.400 --> 00:59:15.039
<v Speaker 6>to have like you know, k eights or like kubernetties,

1303
00:59:15.119 --> 00:59:17.280
<v Speaker 6>but like in a physical form, you know where I

1304
00:59:17.360 --> 00:59:20.480
<v Speaker 6>just I just add, right, that's a.

1305
00:59:20.400 --> 00:59:23.800
<v Speaker 5>Super cool idea. Yeah, And I honestly like what comes

1306
00:59:23.800 --> 00:59:25.960
<v Speaker 5>to mind first for that sort of thing is probably

1307
00:59:26.039 --> 00:59:29.119
<v Speaker 5>like something like a SYNC type based you know, because

1308
00:59:29.280 --> 00:59:32.480
<v Speaker 5>it's fibers. They're a lot lower overhead, they take less memory,

1309
00:59:32.920 --> 00:59:35.280
<v Speaker 5>you know, they you know, on a on a pie,

1310
00:59:35.360 --> 00:59:37.679
<v Speaker 5>you probably don't have a lot of cores or any pores.

1311
00:59:37.679 --> 00:59:38.159
<v Speaker 4>I'm not sure.

1312
00:59:38.159 --> 00:59:39.920
<v Speaker 5>Well, I mean obviously have some coors, but I don't

1313
00:59:40.039 --> 00:59:43.440
<v Speaker 5>You're probably not much beyond like a double cores or something.

1314
00:59:43.519 --> 00:59:44.239
<v Speaker 4>Yeah, exactly.

1315
00:59:45.480 --> 00:59:47.960
<v Speaker 5>And so like having a couple of processes and then

1316
00:59:48.000 --> 00:59:51.960
<v Speaker 5>being able to use fibers to communicate between things, and yeah,

1317
00:59:52.000 --> 00:59:53.440
<v Speaker 5>that's kind of a cool idea of like you add

1318
00:59:53.440 --> 00:59:58.360
<v Speaker 5>another pie, it's just like another no develop on right, Yeah.

1319
00:59:57.320 --> 00:59:59.119
<v Speaker 1>Yeah, I would so like to use d r B

1320
00:59:59.320 --> 00:59:59.840
<v Speaker 1>under the cover.

1321
01:00:00.719 --> 01:00:01.480
<v Speaker 4>You probably could.

1322
01:00:01.559 --> 01:00:03.159
<v Speaker 5>Yeah, if you run it to really like just like

1323
01:00:03.199 --> 01:00:07.480
<v Speaker 5>communicate it through like a more like RPC type interface. Yeah,

1324
01:00:07.519 --> 01:00:09.880
<v Speaker 5>communicating DRB through those would probably make the most sense

1325
01:00:10.000 --> 01:00:13.559
<v Speaker 5>rather than trying to do some other layer or whatever.

1326
01:00:13.760 --> 01:00:16.360
<v Speaker 5>So yeah, communicating DRB now, I really want to try

1327
01:00:16.400 --> 01:00:19.440
<v Speaker 5>DRB and fibers together actually, because I'm sure it's worse.

1328
01:00:19.559 --> 01:00:23.159
<v Speaker 2>I bet, I bet that's and and if it's not

1329
01:00:23.480 --> 01:00:29.000
<v Speaker 2>a workable solution, I can't imagine it would take very much.

1330
01:00:29.199 --> 01:00:32.039
<v Speaker 5>Yeah, and probably just because we've spoken about it into

1331
01:00:32.039 --> 01:00:35.760
<v Speaker 5>the air, Samuel Williams has probably hurt it somewhere, Like

1332
01:00:36.519 --> 01:00:39.320
<v Speaker 5>I sense a sense a fiber solution that that needs

1333
01:00:39.320 --> 01:00:42.960
<v Speaker 5>to be done. So if it doesn't work, probably, yeah,

1334
01:00:43.119 --> 01:00:45.519
<v Speaker 5>Like I it's like hardly I can ever go to

1335
01:00:45.639 --> 01:00:48.480
<v Speaker 5>like a random Ruby project and I'd be like Samuel

1336
01:00:48.480 --> 01:00:49.719
<v Speaker 5>Williams just supposed to think here.

1337
01:00:49.760 --> 01:00:51.119
<v Speaker 4>It's like he's the dudes everywhere.

1338
01:00:51.119 --> 01:00:54.119
<v Speaker 5>He's like, what is it like Andrew Kane or something

1339
01:00:54.199 --> 01:00:57.400
<v Speaker 5>the instacar made like five million gems, Like they're they're

1340
01:00:57.519 --> 01:00:59.719
<v Speaker 5>very like similar type people where I'm like, I don't

1341
01:00:59.719 --> 01:01:01.760
<v Speaker 5>know how you are involved in all these things and

1342
01:01:01.880 --> 01:01:03.239
<v Speaker 5>have like a family and all this stuff.

1343
01:01:03.360 --> 01:01:06.320
<v Speaker 4>Right, that's great. But yeah, that's that.

1344
01:01:06.320 --> 01:01:08.320
<v Speaker 5>That does sound like a pretty reasonable solution sort of

1345
01:01:08.440 --> 01:01:10.719
<v Speaker 5>because d RB uses like a it's like more like

1346
01:01:10.760 --> 01:01:14.079
<v Speaker 5>a binary protocol type thing, right, yeah, yeah, communicate between

1347
01:01:14.079 --> 01:01:14.440
<v Speaker 5>each other.

1348
01:01:14.920 --> 01:01:18.119
<v Speaker 2>Yeah, yeah, I don't see why you couldn't sneak that

1349
01:01:18.199 --> 01:01:22.119
<v Speaker 2>up inside a fiber and then yeah, definitely inness communicate.

1350
01:01:22.880 --> 01:01:23.480
<v Speaker 4>I thought it would.

1351
01:01:23.639 --> 01:01:26.840
<v Speaker 5>It would just work, Yeah, it would probably, Yeah, I

1352
01:01:26.840 --> 01:01:29.119
<v Speaker 5>think it would. I would be surprised if it didn't

1353
01:01:29.119 --> 01:01:31.719
<v Speaker 5>because the mechanisms for how they communicate are probably all

1354
01:01:31.719 --> 01:01:35.400
<v Speaker 5>the level sockets and stuff like that that fibers support perfectly.

1355
01:01:35.840 --> 01:01:37.920
<v Speaker 5>So I'm looking forward to your your blog posts or

1356
01:01:37.960 --> 01:01:42.599
<v Speaker 5>your open source product up. We'll call it PA or

1357
01:01:42.599 --> 01:01:45.079
<v Speaker 5>something like that. It's like Pybernetti's or something.

1358
01:01:46.440 --> 01:01:46.920
<v Speaker 3>That's right.

1359
01:01:47.480 --> 01:01:48.280
<v Speaker 4>Yeah, I'm excited.

1360
01:01:48.400 --> 01:01:51.360
<v Speaker 3>Valentino is going to have sky Net running in his house.

1361
01:01:52.000 --> 01:01:53.760
<v Speaker 5>Right, He's just like you walk into a room and

1362
01:01:53.800 --> 01:01:56.199
<v Speaker 5>he's just covered in like raspberry pies or like what

1363
01:01:56.320 --> 01:01:57.400
<v Speaker 5>happened and like they.

1364
01:01:57.280 --> 01:01:59.280
<v Speaker 6>I'll tell you what was with all this AI stuff?

1365
01:01:59.360 --> 01:02:01.840
<v Speaker 6>You know, I'm gonna make an AI clone of myself

1366
01:02:01.880 --> 01:02:04.039
<v Speaker 6>and then eventually just like have all the side projects

1367
01:02:04.039 --> 01:02:05.280
<v Speaker 6>work done, you know, right.

1368
01:02:05.760 --> 01:02:09.719
<v Speaker 5>You're like, I always wanted to work and it's like, heyne.

1369
01:02:09.320 --> 01:02:11.360
<v Speaker 6>Eight team, Yeah, go for it.

1370
01:02:11.840 --> 01:02:17.920
<v Speaker 5>Right exactly. That sounds super fun. Actually I'm curious. Yeah,

1371
01:02:18.239 --> 01:02:20.400
<v Speaker 5>I mean, not the taking over our lives thing, but.

1372
01:02:20.280 --> 01:02:25.639
<v Speaker 6>They the Pipernettes. We'll start like that, small big steps.

1373
01:02:25.280 --> 01:02:29.000
<v Speaker 3>You know, Valentino will be the pie guy, the pie guy.

1374
01:02:29.079 --> 01:02:33.599
<v Speaker 2>Yeah, all right, well we're devolving.

1375
01:02:33.679 --> 01:02:35.000
<v Speaker 3>Let's jump into picks and.

1376
01:02:36.760 --> 01:02:41.039
<v Speaker 4>Once you Yeah, it's fun. But the moment you get

1377
01:02:41.079 --> 01:02:44.199
<v Speaker 4>to Pypernetties, that's when you know you got right.

1378
01:02:44.320 --> 01:02:47.800
<v Speaker 5>Yeah, somebody go to a bakery after this for sure.

1379
01:02:48.400 --> 01:02:54.880
<v Speaker 2>Oh all right, Valentino, what are you picked?

1380
01:02:56.280 --> 01:02:56.440
<v Speaker 6>Ah?

1381
01:02:56.639 --> 01:02:57.360
<v Speaker 4>Sure, Yeah.

1382
01:02:57.360 --> 01:02:59.760
<v Speaker 6>I've been working on a lot of fun AI stuff lately.

1383
01:03:01.039 --> 01:03:04.800
<v Speaker 6>I started this thing, uh where I'm trying to fine

1384
01:03:04.840 --> 01:03:08.039
<v Speaker 6>tune a l M specifically for Ruby co generation.

1385
01:03:08.760 --> 01:03:08.920
<v Speaker 2>Uh.

1386
01:03:09.719 --> 01:03:13.559
<v Speaker 6>And I started at Ruby Lang dot Ai and I'm

1387
01:03:13.920 --> 01:03:18.400
<v Speaker 6>I'm just almost wrapping up a library to go through

1388
01:03:18.400 --> 01:03:20.679
<v Speaker 6>the whole fine tuning process, just kind of for fun.

1389
01:03:21.159 --> 01:03:23.119
<v Speaker 6>All of this is just for fun. I hope something

1390
01:03:23.199 --> 01:03:27.599
<v Speaker 6>actually works from it, but yeah, you know, everything's Python generated,

1391
01:03:27.639 --> 01:03:31.119
<v Speaker 6>so we should have a Ruby you know, tuned version

1392
01:03:31.119 --> 01:03:34.719
<v Speaker 6>of that. And I got in touch with the hugging face. Uh,

1393
01:03:35.079 --> 01:03:40.400
<v Speaker 6>you know leaderboards and they have very specific evaluators. Somebody

1394
01:03:40.400 --> 01:03:42.599
<v Speaker 6>made a Ruby one, so I'm gonna try and use

1395
01:03:43.039 --> 01:03:47.239
<v Speaker 6>the data for that. So yeah, so Ruby lang dot

1396
01:03:47.280 --> 01:03:49.320
<v Speaker 6>ai is something I'm working on a lot of fun

1397
01:03:49.400 --> 01:03:51.880
<v Speaker 6>and another way I tried, so we have like a

1398
01:03:51.960 --> 01:03:56.679
<v Speaker 6>Ruby Ai Builders discord if you're not familiar. It's so

1399
01:03:56.760 --> 01:03:59.760
<v Speaker 6>much fun. Just a bunch of Ruby people like playing

1400
01:03:59.800 --> 01:04:03.480
<v Speaker 6>with Ai stuff and sharing what we're learning. And I've

1401
01:04:03.519 --> 01:04:07.840
<v Speaker 6>submitted this thing called the podcast Buddy. I just open

1402
01:04:07.920 --> 01:04:11.199
<v Speaker 6>source it and it basically just listens to your mic

1403
01:04:11.719 --> 01:04:15.039
<v Speaker 6>and uses whisper locally and transcribe stuff and then it

1404
01:04:15.159 --> 01:04:17.920
<v Speaker 6>like ongoingly just summarizes and you can interrupt it and

1405
01:04:18.039 --> 01:04:20.880
<v Speaker 6>ask it questions and it'll answer back like textas speech.

1406
01:04:21.159 --> 01:04:22.840
<v Speaker 6>There's a lot of fun I'm trying to get like

1407
01:04:22.920 --> 01:04:25.480
<v Speaker 6>other people like to help me start building it on

1408
01:04:25.760 --> 01:04:28.800
<v Speaker 6>because it's like kind of just stupid and fun and funny.

1409
01:04:29.360 --> 01:04:33.599
<v Speaker 6>And so I come, come hack on it podcast buddy,

1410
01:04:33.599 --> 01:04:37.119
<v Speaker 6>code name VP podcast Buddy, And I'm gonna try and

1411
01:04:37.119 --> 01:04:40.039
<v Speaker 6>bring it on this podcast and have some fuff with

1412
01:04:40.079 --> 01:04:41.719
<v Speaker 6>it too, but we'll see.

1413
01:04:43.360 --> 01:04:46.920
<v Speaker 2>A nice Yeah, it's it's interesting you talk about that,

1414
01:04:46.960 --> 01:04:50.760
<v Speaker 2>I'm gonna veer into my picks because what I want

1415
01:04:50.800 --> 01:04:55.559
<v Speaker 2>to do is I want to essentially build a podcast assistant,

1416
01:04:55.599 --> 01:05:00.880
<v Speaker 2>but it's more on the management and things like that,

1417
01:05:00.920 --> 01:05:02.719
<v Speaker 2>all the stuff that I'm doing to run the podcast.

1418
01:05:02.800 --> 01:05:06.880
<v Speaker 2>So you know, let's say that JP couldn't come on

1419
01:05:07.079 --> 01:05:09.400
<v Speaker 2>at our regular time, and so I could just tell

1420
01:05:09.440 --> 01:05:12.719
<v Speaker 2>the assistant, Hey, find out when he's free, and find

1421
01:05:12.719 --> 01:05:14.679
<v Speaker 2>out when the other hosts are free, and let them

1422
01:05:14.719 --> 01:05:16.559
<v Speaker 2>get a scheduled right, and so then it does all

1423
01:05:16.599 --> 01:05:19.960
<v Speaker 2>the emails and coordination and you know, stuff like that,

1424
01:05:20.159 --> 01:05:21.400
<v Speaker 2>and finds the time.

1425
01:05:22.719 --> 01:05:26.440
<v Speaker 3>Another one is if I get an email.

1426
01:05:26.159 --> 01:05:27.800
<v Speaker 2>From JP and he's like, you know, when I was

1427
01:05:27.840 --> 01:05:30.920
<v Speaker 2>talking about that one thing, I didn't say it quite right,

1428
01:05:31.000 --> 01:05:34.679
<v Speaker 2>and I'd rather just drop it. I typically don't do

1429
01:05:34.719 --> 01:05:38.719
<v Speaker 2>that because it's a giant hassle. If it's if it's

1430
01:05:38.719 --> 01:05:41.400
<v Speaker 2>before we publish it, it's a lot less hassle, and

1431
01:05:41.440 --> 01:05:43.920
<v Speaker 2>I'm more inclined to do it. But afterward I usually

1432
01:05:43.920 --> 01:05:46.280
<v Speaker 2>just tell people know, right, But it'd be interesting to

1433
01:05:46.320 --> 01:05:48.840
<v Speaker 2>be able to tell the assistant, Hey, go find where

1434
01:05:48.920 --> 01:05:51.239
<v Speaker 2>JP was talking about this thing and take it out

1435
01:05:51.360 --> 01:05:53.719
<v Speaker 2>and then have it, you know, work through the transcript,

1436
01:05:53.800 --> 01:05:57.480
<v Speaker 2>find the timestamp, you know, cut it out, all that stuff,

1437
01:05:59.039 --> 01:06:02.119
<v Speaker 2>and so yeah, yeah, this is where my mind has

1438
01:06:02.119 --> 01:06:05.280
<v Speaker 2>been lately, is, Hey, I do all this managerial stuff

1439
01:06:05.280 --> 01:06:08.760
<v Speaker 2>that I don't love, and you know, MICHAELA does a

1440
01:06:08.800 --> 01:06:11.000
<v Speaker 2>lot of it, but I keep thinking that I could

1441
01:06:11.079 --> 01:06:17.719
<v Speaker 2>have her doing other things that are more not aud automatable,

1442
01:06:18.199 --> 01:06:21.159
<v Speaker 2>if that's a word, right, things that I can't have

1443
01:06:21.199 --> 01:06:24.119
<v Speaker 2>the AI do, or things that I can't easily have

1444
01:06:24.199 --> 01:06:26.719
<v Speaker 2>the AI do. And so, you know, when we were

1445
01:06:26.719 --> 01:06:30.320
<v Speaker 2>talking to Obie Fernandez and he was talking about having

1446
01:06:30.320 --> 01:06:32.760
<v Speaker 2>these assistants that do these different things, some of those

1447
01:06:32.760 --> 01:06:38.239
<v Speaker 2>were pieces of things that I'm looking at. You know, Hey,

1448
01:06:38.280 --> 01:06:41.679
<v Speaker 2>we have a new sponsor. You know, here's when it's

1449
01:06:41.679 --> 01:06:45.639
<v Speaker 2>going to run. That kind of a thing. Though, I'm

1450
01:06:45.760 --> 01:06:48.559
<v Speaker 2>I'm also considering just not doing sponsors anymore, but that's

1451
01:06:48.639 --> 01:06:53.000
<v Speaker 2>that's a different conversation, you know, or at least just

1452
01:06:53.159 --> 01:06:59.159
<v Speaker 2>sponsor with my own products. But yeah, so so anyway,

1453
01:06:59.599 --> 01:07:04.039
<v Speaker 2>interesting interesting stuff. I usually do a board game pick

1454
01:07:04.280 --> 01:07:06.519
<v Speaker 2>as my first pick, so I'm going to veer into

1455
01:07:06.519 --> 01:07:11.119
<v Speaker 2>that really quickly. My wife and I went to the

1456
01:07:11.159 --> 01:07:15.079
<v Speaker 2>game store. Incidentally, our neighbors own the game store, so

1457
01:07:16.360 --> 01:07:18.320
<v Speaker 2>we're paying for their kids Christmas when we go there.

1458
01:07:18.360 --> 01:07:23.880
<v Speaker 2>But anyway, we picked up an Unlock, and I'm not

1459
01:07:23.920 --> 01:07:27.840
<v Speaker 2>sure if people are familiar with Unlock, and I'm not

1460
01:07:27.880 --> 01:07:35.239
<v Speaker 2>sure that board game Geek actually has ratings.

1461
01:07:34.880 --> 01:07:36.400
<v Speaker 3>For just unlocks in general.

1462
01:07:40.239 --> 01:07:42.199
<v Speaker 1>It looks like they've got a couple of different versions.

1463
01:07:42.239 --> 01:07:51.519
<v Speaker 2>Anyway, the Unlock Escape Adventures from twenty seventeen. That one

1464
01:07:51.559 --> 01:07:53.679
<v Speaker 2>has a board game weight of two point one zero.

1465
01:07:53.920 --> 01:07:56.920
<v Speaker 2>I'm guessing they're all probably pretty similar. Anyway, what it

1466
01:07:57.000 --> 01:08:00.159
<v Speaker 2>is is it's basically an escape room in a card game,

1467
01:08:01.280 --> 01:08:04.760
<v Speaker 2>and you have an app on your phone and so

1468
01:08:05.440 --> 01:08:07.360
<v Speaker 2>some of the things that you get from the cards

1469
01:08:07.599 --> 01:08:09.159
<v Speaker 2>you put the number from the card.

1470
01:08:08.960 --> 01:08:11.639
<v Speaker 1>In and then you interact with the machine or.

1471
01:08:13.239 --> 01:08:15.079
<v Speaker 3>Things like that. So we bought one.

1472
01:08:15.840 --> 01:08:19.880
<v Speaker 2>The one that we bought, it has three adventures in it,

1473
01:08:20.720 --> 01:08:22.560
<v Speaker 2>and they're all based on different board games. So one's

1474
01:08:22.560 --> 01:08:25.199
<v Speaker 2>based on Ticket to Ride, one based on Mysterium, and

1475
01:08:25.239 --> 01:08:29.039
<v Speaker 2>the other was based on something else that I can't

1476
01:08:29.079 --> 01:08:30.720
<v Speaker 2>remember at the moment, but it's another board game that

1477
01:08:30.800 --> 01:08:33.880
<v Speaker 2>we played fairly frequently and so that was fun.

1478
01:08:33.880 --> 01:08:35.000
<v Speaker 3>We did the Mysterium one.

1479
01:08:35.159 --> 01:08:37.239
<v Speaker 2>We got stuck a couple of times, so it took

1480
01:08:37.279 --> 01:08:39.640
<v Speaker 2>us ninety minutes to do a sixty minute escape room,

1481
01:08:40.399 --> 01:08:44.880
<v Speaker 2>but honestly, about twenty minutes of us of it was

1482
01:08:44.960 --> 01:08:49.239
<v Speaker 2>we figured out. So in mysterium, you have a place,

1483
01:08:49.479 --> 01:08:51.960
<v Speaker 2>you have a person, and you have a murder weapon.

1484
01:08:52.640 --> 01:08:55.920
<v Speaker 2>And so in the unlock, you were doing the same thing.

1485
01:08:55.960 --> 01:08:59.960
<v Speaker 2>You were finding the place, the murder weapon and the

1486
01:09:00.159 --> 01:09:01.199
<v Speaker 2>and the culprit.

1487
01:09:01.720 --> 01:09:02.199
<v Speaker 3>And so.

1488
01:09:04.239 --> 01:09:06.680
<v Speaker 2>We found the location and we couldn't figure out what

1489
01:09:06.680 --> 01:09:08.359
<v Speaker 2>to do next, and what we needed to do was go.

1490
01:09:08.319 --> 01:09:11.039
<v Speaker 3>Report it back to the the policeman.

1491
01:09:11.840 --> 01:09:14.800
<v Speaker 2>So you know, otherwise it would have been seventy minutes

1492
01:09:14.840 --> 01:09:16.039
<v Speaker 2>for the eighty minute unlock.

1493
01:09:17.119 --> 01:09:19.680
<v Speaker 3>But anyway, it was a lot of fun. We really

1494
01:09:19.760 --> 01:09:20.239
<v Speaker 3>enjoy them.

1495
01:09:20.800 --> 01:09:23.079
<v Speaker 2>What I tend to find is that so she and

1496
01:09:23.079 --> 01:09:25.439
<v Speaker 2>I just did it together, they tend to be a

1497
01:09:25.439 --> 01:09:27.279
<v Speaker 2>little bit more fun with a few more people, So

1498
01:09:27.359 --> 01:09:29.840
<v Speaker 2>three or four people, we've done it with six or

1499
01:09:29.880 --> 01:09:33.359
<v Speaker 2>seven people, and that tends to get a little bit chaotic,

1500
01:09:33.439 --> 01:09:35.960
<v Speaker 2>and if you want to be involved in solving the puzzles,

1501
01:09:37.159 --> 01:09:39.640
<v Speaker 2>it just it gets a little bit hard. Sometimes it's like,

1502
01:09:39.760 --> 01:09:41.600
<v Speaker 2>you know, you have four people leaning over the same

1503
01:09:41.680 --> 01:09:43.399
<v Speaker 2>card and it just anyway.

1504
01:09:43.479 --> 01:09:45.880
<v Speaker 3>But I really enjoy them they're a lot of fun.

1505
01:09:45.920 --> 01:09:51.039
<v Speaker 2>We also have a Star Wars set of unlocks, and

1506
01:09:51.079 --> 01:09:54.000
<v Speaker 2>so what you do is you open up the unlock

1507
01:09:54.000 --> 01:09:55.359
<v Speaker 2>app and you just tell it which one you have

1508
01:09:56.359 --> 01:09:59.079
<v Speaker 2>and then you play through it. Anyway, they're really really fun,

1509
01:09:59.560 --> 01:10:03.399
<v Speaker 2>So I'm gonna go ahead and put that in as

1510
01:10:03.399 --> 01:10:06.680
<v Speaker 2>a pick. I had somebody complaint on JavaScript Jabber that

1511
01:10:06.720 --> 01:10:07.760
<v Speaker 2>I got long winded on my.

1512
01:10:07.720 --> 01:10:10.119
<v Speaker 3>Picks, so I'm gonna just keep it short.

1513
01:10:11.479 --> 01:10:14.199
<v Speaker 2>I've been watching the Olympic soccer. That's about the only

1514
01:10:14.239 --> 01:10:16.439
<v Speaker 2>part of the Olympics I'm interested in. My wife is

1515
01:10:16.479 --> 01:10:20.680
<v Speaker 2>watching like everything else except the Olympic soccer. But that's

1516
01:10:20.720 --> 01:10:26.039
<v Speaker 2>been fun, and so I'm gonna pick that, and then yeah,

1517
01:10:26.079 --> 01:10:29.000
<v Speaker 2>I'm this week or next week, I'm gonna have Ruby

1518
01:10:29.000 --> 01:10:32.319
<v Speaker 2>Geniuses and AI for Ruby dot com. Both of those

1519
01:10:32.319 --> 01:10:35.159
<v Speaker 2>domains will be up and you can join in the

1520
01:10:35.159 --> 01:10:41.920
<v Speaker 2>fun where we're doing weekly calls, get a newsletter that

1521
01:10:42.039 --> 01:10:44.840
<v Speaker 2>kind of a thing, so that you know, we can

1522
01:10:44.920 --> 01:10:48.159
<v Speaker 2>kind of have these conversations in different ways. And then yeah,

1523
01:10:48.279 --> 01:10:51.920
<v Speaker 2>definitely go join the AI group on Discord because they're awesome.

1524
01:10:53.159 --> 01:10:55.039
<v Speaker 3>All right, JP, what are your picks?

1525
01:10:55.880 --> 01:10:57.960
<v Speaker 5>Yeah, I mean, I do want to say just the

1526
01:10:58.079 --> 01:11:00.319
<v Speaker 5>unlike sounds super fun. And I also have just always

1527
01:11:00.319 --> 01:11:02.399
<v Speaker 5>marveled that you always having a board game pick. You

1528
01:11:02.439 --> 01:11:04.640
<v Speaker 5>must have like a wing of your house that's just

1529
01:11:04.720 --> 01:11:08.520
<v Speaker 5>literally exclusively board games. I just I can't like place

1530
01:11:08.560 --> 01:11:09.399
<v Speaker 5>it in my brain, but.

1531
01:11:11.199 --> 01:11:12.239
<v Speaker 4>I can't even imagine.

1532
01:11:12.319 --> 01:11:15.159
<v Speaker 5>Yeah, but you can pretty much like, you know, fifty

1533
01:11:15.159 --> 01:11:16.960
<v Speaker 5>two ish weeks a year have a board game pick.

1534
01:11:17.119 --> 01:11:20.640
<v Speaker 3>Just sometimes I duplicate them, but yeah.

1535
01:11:20.239 --> 01:11:23.079
<v Speaker 5>Okay, yeah, yeah, I love board games when I hardly

1536
01:11:23.560 --> 01:11:26.840
<v Speaker 5>get around to playing them, but it's in trouble, So yeah,

1537
01:11:26.840 --> 01:11:29.079
<v Speaker 5>I've got I've got a couple of picks. So I

1538
01:11:29.159 --> 01:11:33.039
<v Speaker 5>was on Jason Sweat's Code Jason recently, and we were

1539
01:11:33.039 --> 01:11:35.840
<v Speaker 5>talking a lot about like smarts and how people like

1540
01:11:35.920 --> 01:11:39.439
<v Speaker 5>their mindset, how like how you can learn and things

1541
01:11:39.520 --> 01:11:41.199
<v Speaker 5>like that, and it reminded me that like, a very

1542
01:11:41.199 --> 01:11:43.960
<v Speaker 5>influential book for me is Mindset by Carol Dweck.

1543
01:11:44.680 --> 01:11:47.680
<v Speaker 4>But yeah, super good. I always loved.

1544
01:11:47.439 --> 01:11:51.039
<v Speaker 5>It pre kids, very influential for me with my kids

1545
01:11:51.079 --> 01:11:54.920
<v Speaker 5>as well, just trying to you know, embark in part

1546
01:11:55.000 --> 01:11:58.560
<v Speaker 5>that growth mindset versus a fixed mindset. So just a

1547
01:11:58.560 --> 01:12:01.039
<v Speaker 5>great book that I kind of commend to everybody.

1548
01:12:02.439 --> 01:12:03.359
<v Speaker 4>The other one is like.

1549
01:12:06.000 --> 01:12:08.880
<v Speaker 5>Being about to go on the podcast previously, I just

1550
01:12:08.920 --> 01:12:12.640
<v Speaker 5>started noticing everybody like how anybody sounds on a podcast

1551
01:12:12.880 --> 01:12:14.720
<v Speaker 5>and made me feel like I can't just use my AirPods.

1552
01:12:14.920 --> 01:12:17.159
<v Speaker 5>So hopefully this sounds pretty good. But I went out,

1553
01:12:17.199 --> 01:12:18.520
<v Speaker 5>I went to Best Buy and I got like a

1554
01:12:18.560 --> 01:12:21.279
<v Speaker 5>Wave three, so like not super expensive. It was like

1555
01:12:21.279 --> 01:12:23.520
<v Speaker 5>one hundred and forty bucks or something, and it's not crazy,

1556
01:12:23.560 --> 01:12:25.199
<v Speaker 5>you know, not like a five hundred dollars one or something,

1557
01:12:25.199 --> 01:12:27.319
<v Speaker 5>but I just wanted to have a better my quality.

1558
01:12:27.359 --> 01:12:28.920
<v Speaker 5>And I use it for all my meetings and stuff

1559
01:12:28.960 --> 01:12:31.159
<v Speaker 5>now too, so I use it for other stuff as well.

1560
01:12:31.199 --> 01:12:33.239
<v Speaker 5>But I've been pretty happy with that, and it just

1561
01:12:33.479 --> 01:12:35.760
<v Speaker 5>I think it sounds a lot better than.

1562
01:12:35.680 --> 01:12:37.800
<v Speaker 4>Just like some air pods or something, right, So I'm

1563
01:12:37.800 --> 01:12:38.560
<v Speaker 4>pretty happy to that.

1564
01:12:38.640 --> 01:12:41.600
<v Speaker 5>And then the third one is just literally just the

1565
01:12:41.640 --> 01:12:43.840
<v Speaker 5>concept of going to a meetup. I've started so the

1566
01:12:43.840 --> 01:12:46.760
<v Speaker 5>Boston Boston's fairly nearby to me, it's about an hour drive,

1567
01:12:46.840 --> 01:12:49.960
<v Speaker 5>and I've their meetup started again and it's been great,

1568
01:12:50.000 --> 01:12:52.439
<v Speaker 5>Like I've just been meeting great Rubius the Boston Ruby

1569
01:12:52.479 --> 01:12:55.479
<v Speaker 5>group meetup I've gotten to meet like that's actually where

1570
01:12:55.520 --> 01:12:57.760
<v Speaker 5>I met Jason Sweat and Kevin Newton when they were

1571
01:12:57.760 --> 01:13:01.399
<v Speaker 5>doing some presentations, and just cool people in the Ruby community.

1572
01:13:01.479 --> 01:13:03.239
<v Speaker 5>So I've been really happy that I've kind of been

1573
01:13:03.279 --> 01:13:07.760
<v Speaker 5>reconnecting with that and getting more involved. So so yeah,

1574
01:13:07.960 --> 01:13:09.640
<v Speaker 5>and then I guess I could pick my own blog series,

1575
01:13:09.640 --> 01:13:11.560
<v Speaker 5>but that seems a little self serving. But you can

1576
01:13:11.600 --> 01:13:15.399
<v Speaker 5>go to jpcamara dot com and read about concurrency. Uh so, yeah,

1577
01:13:15.439 --> 01:13:18.199
<v Speaker 5>those are those are my picks, two picks in a concept.

1578
01:13:19.439 --> 01:13:23.279
<v Speaker 3>Awesome. Well, thanks for coming.

1579
01:13:24.119 --> 01:13:26.159
<v Speaker 4>Yeah, thanks for having me. This is super fun.

1580
01:13:27.199 --> 01:13:29.000
<v Speaker 3>All right, we'll wrap it up here. Till next time,

1581
01:13:29.000 --> 01:13:29.840
<v Speaker 3>Folks max out
