WEBVTT

1
00:00:04.799 --> 00:00:07.919
<v Speaker 1>Hey, folks, welcome back to another episode of the Ruby

2
00:00:08.000 --> 00:00:11.160
<v Speaker 1>Rogues podcast. This week, on our panel we have Ayush

3
00:00:11.279 --> 00:00:16.079
<v Speaker 1>Nowatya Hello. Hello, I'm Charles max Wood from top End Devs.

4
00:00:16.719 --> 00:00:19.719
<v Speaker 1>This week we have a special guest. We have David Henner. David,

5
00:00:20.239 --> 00:00:24.320
<v Speaker 1>you gave a talk at Rails World in September talking

6
00:00:24.359 --> 00:00:29.039
<v Speaker 1>about performance, and so we reached out because we thought,

7
00:00:29.079 --> 00:00:32.520
<v Speaker 1>you know, hey, it's it's interesting to talk about. You're

8
00:00:32.560 --> 00:00:35.920
<v Speaker 1>on the Zendesk Ruby scaling team, so it sounds like

9
00:00:35.960 --> 00:00:41.560
<v Speaker 1>you're working on I guess a non trivial application. I

10
00:00:41.560 --> 00:00:43.320
<v Speaker 1>don't know if it's just the traffic, but it seems

11
00:00:43.359 --> 00:00:47.759
<v Speaker 1>like it's it's an involved app. So yeah, do you

12
00:00:47.759 --> 00:00:50.000
<v Speaker 1>want to just give I guess any more introduction that

13
00:00:50.039 --> 00:00:51.799
<v Speaker 1>you want us to have and then we can dive

14
00:00:51.840 --> 00:00:54.880
<v Speaker 1>in and talk about how to do performance with Ruby.

15
00:00:56.880 --> 00:00:57.119
<v Speaker 2>Yeah.

16
00:00:57.159 --> 00:00:59.439
<v Speaker 3>I gave that talk, and the ironic part of that,

17
00:00:59.479 --> 00:01:03.359
<v Speaker 3>I gave that same well, I gave almost the same

18
00:01:03.439 --> 00:01:07.439
<v Speaker 3>talk within Zendesk, and it was it was originally an

19
00:01:07.519 --> 00:01:10.159
<v Speaker 3>hour and a half and then at Zendesk I had

20
00:01:10.159 --> 00:01:12.640
<v Speaker 3>to break it down to forty five minutes. And then

21
00:01:12.680 --> 00:01:14.159
<v Speaker 3>I thought I was dumb because I thought it was

22
00:01:14.159 --> 00:01:17.079
<v Speaker 3>a forty five minute talk for Raals World. I found

23
00:01:17.120 --> 00:01:22.400
<v Speaker 3>out it was a thirty minute talk. It's all so

24
00:01:22.480 --> 00:01:26.560
<v Speaker 3>I've got a lot more content, but yeah, thirty minutes

25
00:01:26.599 --> 00:01:30.840
<v Speaker 3>and that's normal. Probably, Wow, thirty minutes, it's not much time.

26
00:01:31.760 --> 00:01:35.120
<v Speaker 1>It's so funny to me because I talked to people

27
00:01:35.159 --> 00:01:37.359
<v Speaker 1>who haven't spoken at a conference or haven't you know,

28
00:01:37.400 --> 00:01:42.480
<v Speaker 1>given a talk in other settings. And you know, so

29
00:01:42.560 --> 00:01:45.120
<v Speaker 1>for example, at church, a lot of times, you know,

30
00:01:45.120 --> 00:01:47.200
<v Speaker 1>they'll have us give like a fifteen minute talk on

31
00:01:47.239 --> 00:01:47.760
<v Speaker 1>a topic.

32
00:01:48.280 --> 00:01:51.319
<v Speaker 2>But it's like, man, fifteen.

33
00:01:50.959 --> 00:01:53.640
<v Speaker 1>Minute talks are hard, and they're like, what, you only

34
00:01:53.640 --> 00:01:55.400
<v Speaker 1>have to come up with this much content, And I'm

35
00:01:55.400 --> 00:01:57.599
<v Speaker 1>like I always come up with an hour's worth of

36
00:01:57.599 --> 00:01:58.920
<v Speaker 1>content and have to cut it down.

37
00:01:59.400 --> 00:01:59.599
<v Speaker 3>Yeah.

38
00:01:59.640 --> 00:02:01.879
<v Speaker 2>Right, there's always more I could put in it.

39
00:02:01.920 --> 00:02:04.760
<v Speaker 1>And so it's knowing what to take out more than

40
00:02:05.040 --> 00:02:08.120
<v Speaker 1>knowing what to put in and then turning that into

41
00:02:08.199 --> 00:02:11.360
<v Speaker 1>a I guess, a cohesive narrative.

42
00:02:11.439 --> 00:02:15.400
<v Speaker 2>And yeah, anyway, having the flow is the hardest part. Yeah.

43
00:02:15.639 --> 00:02:17.840
<v Speaker 3>Today it's like, oh my god, I need to have

44
00:02:17.919 --> 00:02:20.719
<v Speaker 3>this and the original flow is so perfect that I

45
00:02:20.759 --> 00:02:25.599
<v Speaker 3>have actually tweaked down at my company. Then to asking

46
00:02:25.759 --> 00:02:28.400
<v Speaker 3>was like, yeah, I got this, And it wasn't until

47
00:02:28.639 --> 00:02:30.800
<v Speaker 3>two months before the conference talk when I had to

48
00:02:30.800 --> 00:02:36.639
<v Speaker 3>submit my papers. Oh thirty minutes. Oh oh no, let's

49
00:02:36.680 --> 00:02:40.800
<v Speaker 3>get that done. I think it turned out fairly well

50
00:02:40.800 --> 00:02:43.400
<v Speaker 3>though at the end of the day. I was the

51
00:02:43.520 --> 00:02:46.599
<v Speaker 3>last talk on the last day, right before Aaron Patterson talked, though,

52
00:02:46.960 --> 00:02:49.039
<v Speaker 3>and I will say that is the worst time slot

53
00:02:49.080 --> 00:02:52.319
<v Speaker 3>to have, like you're worried about your talk the whole time,

54
00:02:52.360 --> 00:02:54.360
<v Speaker 3>and first talk that I actually paid attention to I

55
00:02:54.360 --> 00:02:56.560
<v Speaker 3>was still kind of little amped up, and that was

56
00:02:56.599 --> 00:03:02.319
<v Speaker 3>Aaron's say goodbye speech. Basically, it's like right, dang.

57
00:03:03.199 --> 00:03:11.479
<v Speaker 1>Yeah, so yeah, I've been there too. I want to

58
00:03:11.520 --> 00:03:15.159
<v Speaker 1>just dive in. So you know what, what's kind of

59
00:03:15.159 --> 00:03:18.000
<v Speaker 1>the low hanging fruit in the rails performance world.

60
00:03:18.280 --> 00:03:21.319
<v Speaker 3>I think the big thing that people like, at least

61
00:03:21.360 --> 00:03:23.919
<v Speaker 3>I don't hear people talking about. And it's like everybody

62
00:03:23.960 --> 00:03:26.960
<v Speaker 3>focuses on. First off, a lot of people focus on

63
00:03:27.039 --> 00:03:29.759
<v Speaker 3>really hard things, and it's like, hey, let's change it

64
00:03:29.800 --> 00:03:31.919
<v Speaker 3>to a micro service. It's like, oh, yeah, that might

65
00:03:31.960 --> 00:03:34.039
<v Speaker 3>make it faster, but probably is just going to hold

66
00:03:34.039 --> 00:03:37.400
<v Speaker 3>a bunch of crust. But the big thing people don't

67
00:03:38.319 --> 00:03:43.599
<v Speaker 3>advertise in the community is just observability and like trying

68
00:03:43.639 --> 00:03:47.400
<v Speaker 3>to actually like find the things you need through. Let's

69
00:03:47.400 --> 00:03:51.039
<v Speaker 3>say I use data Dog as endsk, but everybody can

70
00:03:51.199 --> 00:03:55.039
<v Speaker 3>also complains about the cost of the observability and it's like,

71
00:03:55.360 --> 00:03:58.280
<v Speaker 3>right now, you can actually make your costs lower by

72
00:03:58.319 --> 00:04:01.199
<v Speaker 3>turning on software switches. You don't the observabilit one hundred

73
00:04:01.199 --> 00:04:03.400
<v Speaker 3>percent of time, for example, and you can actually have

74
00:04:04.120 --> 00:04:08.120
<v Speaker 3>like tricks around, like the observability layer just literally going

75
00:04:08.159 --> 00:04:12.159
<v Speaker 3>out and like Okay, if we monitor something and something

76
00:04:12.199 --> 00:04:15.360
<v Speaker 3>goes awry, turn on the observability layer. But don't turn

77
00:04:15.400 --> 00:04:17.680
<v Speaker 3>it out all the time, because if you do, you're

78
00:04:17.759 --> 00:04:21.040
<v Speaker 3>going to be paying half of your infrastructure talks or

79
00:04:21.120 --> 00:04:25.120
<v Speaker 3>or infrastructure costs to Data Dog. So I started to

80
00:04:25.160 --> 00:04:28.199
<v Speaker 3>talk with that and that was I hope a lot

81
00:04:28.240 --> 00:04:35.160
<v Speaker 3>of people got valuable as an dollar figures stuff out

82
00:04:35.160 --> 00:04:35.360
<v Speaker 3>of that.

83
00:04:35.959 --> 00:04:39.319
<v Speaker 1>But then like, hang on, because I have a question

84
00:04:39.360 --> 00:04:43.160
<v Speaker 1>about that. Yep, Because you know, I've used Century, I've

85
00:04:43.240 --> 00:04:49.680
<v Speaker 1>used roll Bar, I've used a new relic. I'm trying

86
00:04:49.720 --> 00:04:52.439
<v Speaker 1>to think of all the different ones that I've I've

87
00:04:52.560 --> 00:04:54.759
<v Speaker 1>used over the years. I mean most of them they

88
00:04:54.839 --> 00:04:57.079
<v Speaker 1>sponsor the show, and so I feel like I have to.

89
00:04:58.199 --> 00:04:59.959
<v Speaker 1>I have to feel good about it being a good

90
00:05:00.040 --> 00:05:03.000
<v Speaker 1>product before I go Okay, you can sponsor the show

91
00:05:03.040 --> 00:05:04.879
<v Speaker 1>and I can go out and say you should try

92
00:05:04.959 --> 00:05:08.800
<v Speaker 1>this one. And so I've tried a whole bunch of them,

93
00:05:08.839 --> 00:05:11.000
<v Speaker 1>but most of them you just install the gem and

94
00:05:11.040 --> 00:05:14.360
<v Speaker 1>then it just kind of, you know, behind the scenes,

95
00:05:14.399 --> 00:05:18.680
<v Speaker 1>does the work. And so my question there is how

96
00:05:18.720 --> 00:05:20.279
<v Speaker 1>do you put a switch around that? Do you just

97
00:05:20.319 --> 00:05:24.680
<v Speaker 1>put it into your initializer? And then so, lawyer, how

98
00:05:24.720 --> 00:05:25.360
<v Speaker 1>do you handle it?

99
00:05:25.920 --> 00:05:29.560
<v Speaker 3>In the talk I gave the actual code, but there

100
00:05:29.680 --> 00:05:32.759
<v Speaker 3>is a general. There is a general like, hey, it's

101
00:05:32.800 --> 00:05:36.439
<v Speaker 3>on or off, and we always have that general thing on.

102
00:05:36.680 --> 00:05:39.040
<v Speaker 3>So there's like the general. But then let's say in

103
00:05:39.120 --> 00:05:43.199
<v Speaker 3>the traces that you get a stack trace and the

104
00:05:43.240 --> 00:05:45.279
<v Speaker 3>default stat trace. I believe it is just one bar,

105
00:05:46.160 --> 00:05:50.279
<v Speaker 3>nothing extraordinary, but you can actually turn a whole bunch

106
00:05:50.399 --> 00:05:52.759
<v Speaker 3>of traces on within that trace.

107
00:05:52.839 --> 00:05:54.360
<v Speaker 2>Oh okay, break.

108
00:05:54.120 --> 00:05:57.120
<v Speaker 3>Down to see everything that's going on, and then you

109
00:05:57.160 --> 00:06:01.120
<v Speaker 3>can actually identify, oh, this part of the code, here's slow,

110
00:06:01.959 --> 00:06:06.079
<v Speaker 3>so bye by turning that on and off, like all

111
00:06:06.079 --> 00:06:07.439
<v Speaker 3>of it on or all of it off. If you

112
00:06:07.480 --> 00:06:10.759
<v Speaker 3>try it all on, all all of it off. I

113
00:06:10.759 --> 00:06:13.399
<v Speaker 3>don't know what our costs that data dog would be,

114
00:06:13.519 --> 00:06:16.879
<v Speaker 3>but I'd be willing that data dog would even say, hey, stop, uh,

115
00:06:17.439 --> 00:06:24.240
<v Speaker 3>you're overloading us, right, But no, that's the big thing

116
00:06:24.319 --> 00:06:28.519
<v Speaker 3>is like turning not the base layer on, it's all

117
00:06:28.519 --> 00:06:33.959
<v Speaker 3>the other little things they're optional. And then what those

118
00:06:33.959 --> 00:06:37.199
<v Speaker 3>optional traces are where the valuable data is though, Like

119
00:06:37.839 --> 00:06:39.920
<v Speaker 3>it's the stuff that you can figure within your own

120
00:06:39.959 --> 00:06:43.399
<v Speaker 3>application that gives you way more insight. It's like, hey,

121
00:06:43.399 --> 00:06:45.920
<v Speaker 3>I want to put a trace around this certain method

122
00:06:46.240 --> 00:06:48.720
<v Speaker 3>because I think it's slow. And then sometimes you do

123
00:06:48.800 --> 00:06:52.079
<v Speaker 3>that and you're like, oh, that's fast. Where's the slum part?

124
00:06:52.480 --> 00:06:55.360
<v Speaker 3>But if you put if you put that around enough thing,

125
00:06:55.680 --> 00:06:59.800
<v Speaker 3>enough things, and we basically our main application, at least

126
00:06:59.839 --> 00:07:03.600
<v Speaker 3>the ticketing inside of the application, we've we got the

127
00:07:03.639 --> 00:07:07.959
<v Speaker 3>observability layer, like just it's covering almost everything. So if

128
00:07:08.040 --> 00:07:11.240
<v Speaker 3>a certain customer starts to have slow response times, we

129
00:07:11.319 --> 00:07:13.639
<v Speaker 3>just turn it on. Really, oh, we can focus on

130
00:07:13.759 --> 00:07:16.000
<v Speaker 3>this part of the code and make the customer faster.

131
00:07:17.399 --> 00:07:18.839
<v Speaker 2>I got you. That makes sense.

132
00:07:21.639 --> 00:07:24.319
<v Speaker 3>But let's see what what am I doing now? Right now?

133
00:07:24.920 --> 00:07:27.000
<v Speaker 3>I'm doing something that's not in my talk. It wasn't

134
00:07:27.079 --> 00:07:31.560
<v Speaker 3>my talk, but it's also interesting. I think if you're

135
00:07:31.639 --> 00:07:33.959
<v Speaker 3>a big company or you're a small company, you might go, well,

136
00:07:34.000 --> 00:07:38.560
<v Speaker 3>why is that hard, And that would be we're changing

137
00:07:38.600 --> 00:07:42.399
<v Speaker 3>the default scope for our main ticketing object. And the

138
00:07:42.480 --> 00:07:44.879
<v Speaker 3>reason why we're doing that we're adding new columns to

139
00:07:46.000 --> 00:07:48.680
<v Speaker 3>and it just seems like, okay, we just change the queries.

140
00:07:48.720 --> 00:07:51.199
<v Speaker 3>Well you change every single query. You also have to

141
00:07:51.279 --> 00:07:53.480
<v Speaker 3>change every index from out from under the hood, and

142
00:07:53.519 --> 00:07:58.439
<v Speaker 3>you have to never have downtime and adding aex alone

143
00:07:58.920 --> 00:08:03.160
<v Speaker 3>on our ticketing tables, they're just so huge. You can't

144
00:08:03.199 --> 00:08:08.040
<v Speaker 3>just say, hey, DBAs add this. They'll say no to you.

145
00:08:08.879 --> 00:08:11.279
<v Speaker 1>So you can lock that table for I don't know

146
00:08:11.319 --> 00:08:12.879
<v Speaker 1>a few days exactly.

147
00:08:13.120 --> 00:08:17.000
<v Speaker 3>You can't do. So it is a juggling act that

148
00:08:17.519 --> 00:08:19.560
<v Speaker 3>luckily I don't have to deal with the DBA side

149
00:08:19.560 --> 00:08:22.839
<v Speaker 3>of it. I don't know what the problems are. And essentially,

150
00:08:23.639 --> 00:08:26.680
<v Speaker 3>when we move from a raw two to a RORA three,

151
00:08:27.160 --> 00:08:30.079
<v Speaker 3>it did two things. First off, it made some problems bigger,

152
00:08:30.240 --> 00:08:33.519
<v Speaker 3>so it made this a direction we needed to go.

153
00:08:34.000 --> 00:08:39.960
<v Speaker 3>But also have you heard of invisible indices? No, So

154
00:08:40.000 --> 00:08:43.679
<v Speaker 3>invisible indices is kind of what sounds like. Essentially, you

155
00:08:43.720 --> 00:08:46.120
<v Speaker 3>have an index and a lot of times you're scared,

156
00:08:46.159 --> 00:08:49.759
<v Speaker 3>too scared to delete any index because if you delete

157
00:08:49.759 --> 00:08:53.240
<v Speaker 3>an index, it's gone and maybe you actually affected your application.

158
00:08:53.799 --> 00:08:57.039
<v Speaker 3>So invisible basically says make it invisible. It's still there.

159
00:08:57.320 --> 00:09:00.799
<v Speaker 3>The sequel is still populating that index to make it

160
00:09:00.840 --> 00:09:04.480
<v Speaker 3>actually work, but you can see are there performance problems

161
00:09:04.480 --> 00:09:09.120
<v Speaker 3>with it? So we have not deleted an index for

162
00:09:09.200 --> 00:09:11.600
<v Speaker 3>fifteen years of our application, and now we're actually able

163
00:09:11.639 --> 00:09:13.919
<v Speaker 3>to go in and say, hey, if we actually delete

164
00:09:13.960 --> 00:09:16.679
<v Speaker 3>these induses, we can add new ones because we the

165
00:09:16.720 --> 00:09:21.759
<v Speaker 3>memory profile won't blow up. So that is the the

166
00:09:23.000 --> 00:09:25.879
<v Speaker 3>saving grace of allowing us to actually do this whole project.

167
00:09:26.120 --> 00:09:32.200
<v Speaker 3>Without that, we'd be too scared because well, having things

168
00:09:32.320 --> 00:09:35.519
<v Speaker 3>break is scary, a lout of money.

169
00:09:36.600 --> 00:09:37.799
<v Speaker 2>So I'm curious.

170
00:09:39.200 --> 00:09:43.279
<v Speaker 1>I mean, I've deleted indices off of databases that I've

171
00:09:43.279 --> 00:09:46.320
<v Speaker 1>worked on, but i haven't done it on like very

172
00:09:46.360 --> 00:09:49.440
<v Speaker 1>large tables. I've added into ses on very large tables

173
00:09:49.480 --> 00:09:56.080
<v Speaker 1>and watched the thing go ah, But deleting them doesn't

174
00:09:56.120 --> 00:09:58.039
<v Speaker 1>seem to have that same effect. So is there a

175
00:09:58.080 --> 00:10:01.639
<v Speaker 1>downside to deleting them other than some queries that use

176
00:10:01.639 --> 00:10:03.120
<v Speaker 1>those indicies might slow down.

177
00:10:03.480 --> 00:10:06.480
<v Speaker 3>Right, and you don't know what, like like when your

178
00:10:06.559 --> 00:10:11.399
<v Speaker 3>application is I think we have over I'm guessing to

179
00:10:11.440 --> 00:10:13.200
<v Speaker 3>have over a thousand repos for example.

180
00:10:13.799 --> 00:10:14.120
<v Speaker 2>Uh huh.

181
00:10:15.159 --> 00:10:21.120
<v Speaker 3>You can't figure out whether you have beat down every

182
00:10:21.600 --> 00:10:24.639
<v Speaker 3>location where every query that actually hits this. There's actually

183
00:10:25.240 --> 00:10:28.879
<v Speaker 3>I had to go through every query in our main

184
00:10:29.480 --> 00:10:33.759
<v Speaker 3>API and we separate our queries by the API queries,

185
00:10:33.799 --> 00:10:37.879
<v Speaker 3>and we separate it by non API queries. Let's just

186
00:10:38.159 --> 00:10:41.799
<v Speaker 3>that way. And the API queries is a manageable list

187
00:10:41.879 --> 00:10:44.519
<v Speaker 3>of things that it's like a couple hundred queries to

188
00:10:44.679 --> 00:10:47.240
<v Speaker 3>the ticketing table that actually happens. You can wrap your

189
00:10:47.240 --> 00:10:50.639
<v Speaker 3>head around that. But the non to API queries, I

190
00:10:50.759 --> 00:10:54.720
<v Speaker 3>think it was over forty thousand different unique queries. Oh wow,

191
00:10:55.039 --> 00:10:58.399
<v Speaker 3>go through each query and say would this index work

192
00:10:58.440 --> 00:11:00.600
<v Speaker 3>with this index work with no? No, no, no no.

193
00:11:01.600 --> 00:11:05.480
<v Speaker 1>So so it is complex.

194
00:11:06.240 --> 00:11:07.679
<v Speaker 2>So what's your approach to that then?

195
00:11:08.440 --> 00:11:13.120
<v Speaker 3>Uh? So that luckily the things we care more about

196
00:11:13.159 --> 00:11:16.960
<v Speaker 3>are the API queries, so we absolutely make sure that

197
00:11:16.960 --> 00:11:21.399
<v Speaker 3>those actually are working, and the non API queries. We're

198
00:11:21.399 --> 00:11:24.399
<v Speaker 3>actually moving a lot of that stuff to elastic search anyways.

199
00:11:25.200 --> 00:11:28.080
<v Speaker 3>So our long term fix is actually all those things

200
00:11:28.080 --> 00:11:31.879
<v Speaker 3>are never actually going to need a query. So, and

201
00:11:31.960 --> 00:11:34.519
<v Speaker 3>I don't know how the magic of that works, Like,

202
00:11:35.039 --> 00:11:36.759
<v Speaker 3>oh wow, you don't even need a query to get

203
00:11:36.759 --> 00:11:39.879
<v Speaker 3>the data. That's awesome. Okay, I'm guessing somebody's looking at

204
00:11:39.960 --> 00:11:42.200
<v Speaker 3>en logs or something like that and they're throwing that

205
00:11:42.360 --> 00:11:46.480
<v Speaker 3>information rate from the bin logs into seql. But I

206
00:11:46.519 --> 00:11:49.159
<v Speaker 3>have That's that's magic to me.

207
00:11:49.440 --> 00:11:52.919
<v Speaker 2>So I used, do you have anything you want to

208
00:11:52.960 --> 00:11:53.519
<v Speaker 2>jump in with?

209
00:11:54.840 --> 00:12:04.879
<v Speaker 4>Uh, haven't seen your talk. Probably probably some stupid questions. Really, Uh,

210
00:12:05.960 --> 00:12:09.200
<v Speaker 4>what kind of like where do you normally find performance

211
00:12:09.320 --> 00:12:13.000
<v Speaker 4>bottlenecks in like apps? You see? Because I know you

212
00:12:13.200 --> 00:12:18.080
<v Speaker 4>primarily are you're working for zenders, you've probably worked on

213
00:12:18.120 --> 00:12:20.320
<v Speaker 4>that product for quite a while. But I'm a freelancer,

214
00:12:20.399 --> 00:12:21.679
<v Speaker 4>So I look at I look at a lot of

215
00:12:21.679 --> 00:12:24.120
<v Speaker 4>code bases, and what I see and it's all it's

216
00:12:24.159 --> 00:12:27.720
<v Speaker 4>all rails. And what I see most of the time

217
00:12:27.840 --> 00:12:31.279
<v Speaker 4>is people just haven't thought through the database design properly

218
00:12:31.960 --> 00:12:36.360
<v Speaker 4>and they're doing all these funky joins or even worse,

219
00:12:36.519 --> 00:12:39.080
<v Speaker 4>getting stuff out of the database and doing things in

220
00:12:39.159 --> 00:12:42.840
<v Speaker 4>memory that you could quite easily do in the database.

221
00:12:43.000 --> 00:12:46.720
<v Speaker 4>And it's like it's quite common mistakes like that is

222
00:12:46.759 --> 00:12:52.720
<v Speaker 4>where I usually find performance bottlenecks. What's your experience in

223
00:12:52.759 --> 00:12:53.320
<v Speaker 4>that regard.

224
00:12:53.759 --> 00:12:56.759
<v Speaker 3>So the worst areas are where they add funky joints

225
00:12:56.840 --> 00:13:03.200
<v Speaker 3>because sometimes you can't solve the is very easily. The

226
00:13:03.639 --> 00:13:06.960
<v Speaker 3>talk was actually more focused on the coding aspect, like

227
00:13:07.080 --> 00:13:10.600
<v Speaker 3>just simple things that people do that they should know

228
00:13:10.679 --> 00:13:14.919
<v Speaker 3>about that they just don't do. So, for example, just

229
00:13:15.000 --> 00:13:19.840
<v Speaker 3>memorization and a little different memorization techniques. And one of

230
00:13:19.919 --> 00:13:22.639
<v Speaker 3>the cool things I brought up a zendes that we

231
00:13:22.679 --> 00:13:26.279
<v Speaker 3>do is we have what I it's kind of like

232
00:13:26.279 --> 00:13:30.360
<v Speaker 3>a singleton, but it's not. It's so our account object.

233
00:13:30.519 --> 00:13:32.519
<v Speaker 3>If you get an account, it doesn't matter how you

234
00:13:32.559 --> 00:13:37.039
<v Speaker 3>get that account. In the request cycle, you only need

235
00:13:37.080 --> 00:13:39.960
<v Speaker 3>one account object. So if you call it tickets dot account,

236
00:13:40.080 --> 00:13:41.799
<v Speaker 3>or if you call user dot account, or if you

237
00:13:41.840 --> 00:13:45.720
<v Speaker 3>call just get me the account through this method called

238
00:13:45.799 --> 00:13:48.320
<v Speaker 3>fetch account that we have, any way you get the account,

239
00:13:48.360 --> 00:13:51.360
<v Speaker 3>it is the same exact object. So one of the

240
00:13:51.399 --> 00:13:53.360
<v Speaker 3>cool things you can do based on that. So if

241
00:13:53.360 --> 00:13:57.759
<v Speaker 3>you get the same object, if you memoize your whatever

242
00:13:57.759 --> 00:14:01.000
<v Speaker 3>you're trying to memorize based on that one object, you

243
00:14:01.080 --> 00:14:07.679
<v Speaker 3>can instead of actually have a request where hey listen,

244
00:14:07.720 --> 00:14:10.000
<v Speaker 3>I'm going to memorize it on this object. But then

245
00:14:10.240 --> 00:14:12.960
<v Speaker 3>someplace else in the application, your memoir. You want to

246
00:14:13.039 --> 00:14:15.039
<v Speaker 3>use that, but you can't. You can't get to that

247
00:14:15.120 --> 00:14:18.840
<v Speaker 3>original object. We can actually memorize it on this god object,

248
00:14:19.360 --> 00:14:22.919
<v Speaker 3>and wherever we call that method again, it is memorized.

249
00:14:23.559 --> 00:14:27.120
<v Speaker 3>So that was I thought, a really cool way of

250
00:14:27.360 --> 00:14:31.279
<v Speaker 3>actually going about like memorizing something is having that god object,

251
00:14:31.519 --> 00:14:34.840
<v Speaker 3>and then you don't have to worry about Okay, and

252
00:14:34.879 --> 00:14:37.720
<v Speaker 3>the presenter we're calling it this way. In the controller

253
00:14:37.759 --> 00:14:39.360
<v Speaker 3>we're calling it this way, and the models we're calling

254
00:14:39.440 --> 00:14:43.159
<v Speaker 3>it this way. But we cannot tie those spaghetti pieces

255
00:14:43.159 --> 00:14:45.519
<v Speaker 3>of code together. But because we have that god object,

256
00:14:45.639 --> 00:14:48.120
<v Speaker 3>we can memorize it in one place and always access

257
00:14:48.200 --> 00:14:50.960
<v Speaker 3>the same data throughout and then never have to worry

258
00:14:51.000 --> 00:14:53.720
<v Speaker 3>about That was a cool thing that actually, well that

259
00:14:53.799 --> 00:14:54.519
<v Speaker 3>was in the talk.

260
00:14:54.799 --> 00:14:57.279
<v Speaker 2>But really, what are you use it for that or

261
00:14:57.360 --> 00:15:00.000
<v Speaker 2>using current attributes or something else.

262
00:15:00.039 --> 00:15:03.039
<v Speaker 3>Far as making it a god object. I wish I

263
00:15:03.120 --> 00:15:05.440
<v Speaker 3>knew that was well before I came into But I

264
00:15:05.480 --> 00:15:09.639
<v Speaker 3>think we're basically we created a method called fetch account

265
00:15:10.360 --> 00:15:15.080
<v Speaker 3>and one we call fetch account outside there, and then

266
00:15:15.519 --> 00:15:22.120
<v Speaker 3>in probably active record we override the account method an

267
00:15:22.159 --> 00:15:24.960
<v Speaker 3>active record, not even every one of our models has

268
00:15:25.159 --> 00:15:28.120
<v Speaker 3>an account method, so I'm guessing we override that and

269
00:15:28.200 --> 00:15:33.279
<v Speaker 3>just memoize the account in the instant variable and it

270
00:15:33.279 --> 00:15:35.919
<v Speaker 3>always goes back to that incident. That's just a guess.

271
00:15:36.759 --> 00:15:38.679
<v Speaker 3>I've not actually looked at that code because I haven't

272
00:15:38.720 --> 00:15:41.320
<v Speaker 3>needed to. And I was actually asked that at Rails World.

273
00:15:41.320 --> 00:15:44.559
<v Speaker 3>I should actually really get into it, but the person

274
00:15:44.559 --> 00:15:47.840
<v Speaker 3>who knows that best just left send us, so I'll

275
00:15:47.879 --> 00:15:51.320
<v Speaker 3>have to dive into code instead of ask questions.

276
00:15:51.720 --> 00:15:54.799
<v Speaker 4>Yeah, I thought current doctributes are probably a bit new.

277
00:15:55.720 --> 00:16:00.000
<v Speaker 4>Came and five or something that we.

278
00:16:00.200 --> 00:16:03.559
<v Speaker 3>Just upgraded to. Did we hit Rails eight yet seven?

279
00:16:04.360 --> 00:16:07.639
<v Speaker 3>Either way? Like, it's so good to be closer to

280
00:16:07.759 --> 00:16:14.399
<v Speaker 3>the edge. We're definitely on Rails seven for application. We're

281
00:16:14.399 --> 00:16:19.200
<v Speaker 3>on Rails four for like six years or something like that.

282
00:16:19.279 --> 00:16:23.360
<v Speaker 3>Who's so good to be closer to the edge.

283
00:16:25.039 --> 00:16:27.559
<v Speaker 1>Yeah, I've experienced that too. For a long time, I

284
00:16:27.600 --> 00:16:31.960
<v Speaker 1>was working on like Rails four five apps, and yeah,

285
00:16:32.080 --> 00:16:33.720
<v Speaker 1>the last year or so, I've been able to work

286
00:16:33.759 --> 00:16:38.399
<v Speaker 1>on Rail seven and Rails eight apps now. And what's

287
00:16:38.440 --> 00:16:40.320
<v Speaker 1>fun is you get to go back now and figure

288
00:16:40.360 --> 00:16:42.480
<v Speaker 1>out all the stuff that's been added in since. So,

289
00:16:43.159 --> 00:16:45.519
<v Speaker 1>you know, I got into like stimulus and Turbo, and

290
00:16:45.559 --> 00:16:48.600
<v Speaker 1>then figured out that oh look, Turbo actually will work

291
00:16:48.639 --> 00:16:54.440
<v Speaker 1>through your what's it action cable channels and so you

292
00:16:54.480 --> 00:16:57.559
<v Speaker 1>can you can push updates when you have sort of

293
00:16:57.600 --> 00:17:01.679
<v Speaker 1>out of band anyway, just all this stuff that it's like, okay,

294
00:17:01.799 --> 00:17:04.759
<v Speaker 1>I don't now need a full cycle to get this

295
00:17:05.319 --> 00:17:06.319
<v Speaker 1>these features to work.

296
00:17:06.680 --> 00:17:08.599
<v Speaker 3>So, being at a bigger company and we started on

297
00:17:08.759 --> 00:17:13.160
<v Speaker 3>Rails one or something like that, upgrading through there's obviously

298
00:17:13.240 --> 00:17:17.440
<v Speaker 3>monkey patches like throughout the years because well rails didn't

299
00:17:17.440 --> 00:17:19.759
<v Speaker 3>have certain things and now they do, and now taking

300
00:17:19.759 --> 00:17:23.200
<v Speaker 3>those monkey patches away is hard, which also means that

301
00:17:23.599 --> 00:17:27.119
<v Speaker 3>really adding the newest features of Rails is hard, in

302
00:17:27.160 --> 00:17:30.359
<v Speaker 3>fact almost impossible. But what we can do is like,

303
00:17:30.599 --> 00:17:33.880
<v Speaker 3>for example, is like, yeah, this week we upgraded to

304
00:17:34.079 --> 00:17:35.799
<v Speaker 3>Rails three to three, and all of a sudden, the

305
00:17:35.799 --> 00:17:38.519
<v Speaker 3>performance got a lot better. But also, like let's say.

306
00:17:38.359 --> 00:17:42.039
<v Speaker 2>In Ruby three yeah, or Ruby three three.

307
00:17:41.839 --> 00:17:43.960
<v Speaker 3>Sorry, Rails three three yeah.

308
00:17:44.119 --> 00:17:46.680
<v Speaker 2>I do remember upgrading to Rails three three back in

309
00:17:46.720 --> 00:17:47.440
<v Speaker 2>the day, but.

310
00:17:47.839 --> 00:17:50.839
<v Speaker 3>I remember upgrading the Rails three from two. That was hard.

311
00:17:50.960 --> 00:17:52.839
<v Speaker 2>But that was brutal. That was brutal.

312
00:17:53.400 --> 00:17:54.519
<v Speaker 4>That was the mob.

313
00:17:55.480 --> 00:18:02.720
<v Speaker 2>Yeah, it was yeah, it is the herb Any long before.

314
00:18:03.279 --> 00:18:04.640
<v Speaker 4>I don't have those, cause.

315
00:18:05.359 --> 00:18:06.799
<v Speaker 3>Oh I haven't.

316
00:18:07.119 --> 00:18:09.480
<v Speaker 1>Who'da did a ton of work on that? Yeah, it

317
00:18:09.519 --> 00:18:11.359
<v Speaker 1>was it was brutal.

318
00:18:12.799 --> 00:18:15.119
<v Speaker 3>But uh, where was I going with this? Oh? I

319
00:18:15.200 --> 00:18:17.880
<v Speaker 3>forgot my train of thought.

320
00:18:18.400 --> 00:18:19.839
<v Speaker 2>Upgraded to Ruby three.

321
00:18:20.599 --> 00:18:24.599
<v Speaker 3>Upgraded Ruby three. I don't think I'm going to remember

322
00:18:24.599 --> 00:18:29.079
<v Speaker 3>what I was thinking about. Oh, and like, for example,

323
00:18:29.119 --> 00:18:33.480
<v Speaker 3>with Ruby three, Uh, we had in our application. We

324
00:18:33.480 --> 00:18:37.119
<v Speaker 3>were very scared because we allowed, we had and still

325
00:18:37.279 --> 00:18:41.599
<v Speaker 3>do allow customers to add their own rej axes. Well,

326
00:18:41.599 --> 00:18:43.880
<v Speaker 3>if you had your own rejects, you can really slow

327
00:18:43.960 --> 00:18:48.079
<v Speaker 3>down and stop you're you can just kill an application

328
00:18:48.160 --> 00:18:50.880
<v Speaker 3>if you allowed the end users. So we had some

329
00:18:51.000 --> 00:18:53.720
<v Speaker 3>weird way of actually making it so they couldn't just

330
00:18:53.839 --> 00:18:57.720
<v Speaker 3>kill our system. But it spun up a process, and

331
00:18:57.720 --> 00:19:00.559
<v Speaker 3>that's spinning up a process took about a half second second.

332
00:19:00.880 --> 00:19:04.200
<v Speaker 3>Let's just say to actually spin up so it would run,

333
00:19:04.319 --> 00:19:08.000
<v Speaker 3>and it make sure that rejects would never actually just

334
00:19:08.119 --> 00:19:11.079
<v Speaker 3>be infinitely running. It would time it out at a

335
00:19:11.119 --> 00:19:16.039
<v Speaker 3>certain point. But doing that was well added a half

336
00:19:16.119 --> 00:19:20.599
<v Speaker 3>second every request. For example, Ruby three allows you to

337
00:19:20.640 --> 00:19:25.960
<v Speaker 3>actually by default have a timeout in your rejexes. So

338
00:19:26.039 --> 00:19:28.880
<v Speaker 3>now were in that extra process up. So now if

339
00:19:28.880 --> 00:19:33.440
<v Speaker 3>you're all most cases you're just running in rejects, that

340
00:19:33.519 --> 00:19:38.079
<v Speaker 3>takes a millisecond or two. Those other cases that actually

341
00:19:38.160 --> 00:19:42.799
<v Speaker 3>do time out, those do time out just by default.

342
00:19:42.839 --> 00:19:44.759
<v Speaker 3>With Ruby, we didn't have to actually do this weird

343
00:19:44.880 --> 00:19:48.680
<v Speaker 3>fancy trick to actually make it happen. So that was

344
00:19:48.720 --> 00:19:53.039
<v Speaker 3>actually a very very big upgrade for us because we've

345
00:19:53.079 --> 00:19:56.559
<v Speaker 3>had those rejects, allowed people to put rejects's in forever,

346
00:19:56.599 --> 00:19:59.480
<v Speaker 3>and we've had to protect against it forever, and that's

347
00:19:59.599 --> 00:20:05.000
<v Speaker 3>just just bad. I think I would have if I

348
00:20:05.039 --> 00:20:07.160
<v Speaker 3>was around way back then, it probably was like, no,

349
00:20:07.319 --> 00:20:09.880
<v Speaker 3>don't let them put their own rejectses and give them

350
00:20:09.960 --> 00:20:11.920
<v Speaker 3>an array of things that they can do. Don't give

351
00:20:11.960 --> 00:20:19.759
<v Speaker 3>them an infinite array, right yeah, but but yeah, of

352
00:20:19.839 --> 00:20:25.240
<v Speaker 3>our upgrades, it is just like looking at the code

353
00:20:25.279 --> 00:20:32.200
<v Speaker 3>that's old, and people don't when it is an application

354
00:20:32.279 --> 00:20:35.960
<v Speaker 3>is as big as it is. People cannot wrap their

355
00:20:36.000 --> 00:20:40.240
<v Speaker 3>head around the whole ticket, save request of the cycles.

356
00:20:40.279 --> 00:20:44.680
<v Speaker 3>Because we have everything gets into the ticket, there's triggers,

357
00:20:44.759 --> 00:20:50.359
<v Speaker 3>there's not just every layer, and essentially people can't wrap

358
00:20:50.359 --> 00:20:52.400
<v Speaker 3>their head around that. So once you put traces around this,

359
00:20:52.720 --> 00:20:58.039
<v Speaker 3>you find blatant like obvious mistakes and you just tackle

360
00:20:58.079 --> 00:20:59.599
<v Speaker 3>them one at a time, and most of the time

361
00:20:59.680 --> 00:21:04.400
<v Speaker 3>it's coding mistakes. It's not and it's not even a mistake.

362
00:21:05.039 --> 00:21:07.079
<v Speaker 3>It was I got to get this feature out fast.

363
00:21:07.240 --> 00:21:09.240
<v Speaker 3>People don't think about performance when you have to get

364
00:21:09.240 --> 00:21:15.480
<v Speaker 3>it out within a week. Right. But it's been good, actually,

365
00:21:15.640 --> 00:21:18.519
<v Speaker 3>like the amount that we've saved and the ticket cycle

366
00:21:18.640 --> 00:21:22.000
<v Speaker 3>and just not even ticket now we're actually since we

367
00:21:22.119 --> 00:21:24.319
<v Speaker 3>did such a good job, we've been given more and

368
00:21:24.359 --> 00:21:27.200
<v Speaker 3>more freedom to actually work in random areas of the code,

369
00:21:27.240 --> 00:21:31.240
<v Speaker 3>and just the amount of improvements that we've made. You

370
00:21:31.279 --> 00:21:37.640
<v Speaker 3>don't think of little coding things like, for example, scopes

371
00:21:37.759 --> 00:21:44.200
<v Speaker 3>versus conditional associations, like a scope. Every time you call

372
00:21:44.240 --> 00:21:47.480
<v Speaker 3>a scope, Rails makes the query. If you have a

373
00:21:47.480 --> 00:21:51.279
<v Speaker 3>conditional association, it makes a query and Rails by default

374
00:21:51.680 --> 00:21:57.759
<v Speaker 3>has that query cashed up. Just making that switch will

375
00:21:58.160 --> 00:22:01.720
<v Speaker 3>reduce the number of queries, and sometimes queries aren't very free,

376
00:22:01.759 --> 00:22:04.160
<v Speaker 3>so all of a sudden, you've just saved time. There

377
00:22:05.279 --> 00:22:10.079
<v Speaker 3>so many N plus one queries where that so?

378
00:22:10.079 --> 00:22:13.279
<v Speaker 2>So were you advocating for scopes or for.

379
00:22:15.279 --> 00:22:20.079
<v Speaker 3>Both? Most of the time conditional queries when when when

380
00:22:20.119 --> 00:22:23.200
<v Speaker 3>you're trying to like tweak the last bit of performance.

381
00:22:24.079 --> 00:22:29.720
<v Speaker 3>I would be advocating for conditional association. Okay, scopes are

382
00:22:29.720 --> 00:22:33.160
<v Speaker 3>not evil, it's just sometimes people don't realize. You know,

383
00:22:33.319 --> 00:22:37.119
<v Speaker 3>I'm using this in the scope within a loop for example.

384
00:22:38.000 --> 00:22:39.359
<v Speaker 2>Uh huh, And.

385
00:22:39.279 --> 00:22:42.599
<v Speaker 3>All of a sudden, I'm getting like like just query

386
00:22:42.640 --> 00:22:44.480
<v Speaker 3>after query after query, where if you don't put it

387
00:22:44.519 --> 00:22:46.759
<v Speaker 3>in a loop, and you if you use a conditional association,

388
00:22:47.240 --> 00:22:49.680
<v Speaker 3>that loop makes one query and you're you're.

389
00:22:49.559 --> 00:22:53.319
<v Speaker 1>Done right, So it automatically eliminates the N plus one query.

390
00:22:53.359 --> 00:22:59.000
<v Speaker 3>Is what you're saying, Yeah, well, yes, yes, but N

391
00:22:59.039 --> 00:23:01.400
<v Speaker 3>plus one query. I always think of n plus one

392
00:23:01.480 --> 00:23:03.799
<v Speaker 3>queriers is the things that you can add just includes

393
00:23:03.839 --> 00:23:06.799
<v Speaker 3>in and it just goes away. Yeah generally, yeah, but

394
00:23:06.880 --> 00:23:09.119
<v Speaker 3>this is an N plus one query that generates itself

395
00:23:09.200 --> 00:23:09.759
<v Speaker 3>a different way.

396
00:23:10.640 --> 00:23:14.759
<v Speaker 4>Yeah, if it was to do like some if I've

397
00:23:15.000 --> 00:23:16.799
<v Speaker 4>just built like a new feature and I just want

398
00:23:16.839 --> 00:23:21.839
<v Speaker 4>to reassure myself that I haven't made any stupid performance

399
00:23:21.880 --> 00:23:26.200
<v Speaker 4>mistakes or or anything like that. Like because again, like

400
00:23:26.400 --> 00:23:29.240
<v Speaker 4>with the work I do, it tends to perform, Like

401
00:23:29.400 --> 00:23:31.960
<v Speaker 4>performance doesn't really come into it because I tend to

402
00:23:31.960 --> 00:23:36.720
<v Speaker 4>work with startups and stuff, like what how do I

403
00:23:36.799 --> 00:23:41.200
<v Speaker 4>just go about like even testing like certain things in

404
00:23:41.319 --> 00:23:44.279
<v Speaker 4>my local dev environment in terms of like what do

405
00:23:44.319 --> 00:23:46.319
<v Speaker 4>I put in my Ruby good to check how long

406
00:23:46.359 --> 00:23:48.079
<v Speaker 4>stupp is taking? I don't even know that. That's how

407
00:23:48.119 --> 00:23:51.599
<v Speaker 4>stupid this question is, because you know, back to the basics.

408
00:23:52.079 --> 00:23:55.160
<v Speaker 3>You know, we have this debate all the time with

409
00:23:55.279 --> 00:23:58.640
<v Speaker 3>internally because essentially the only way to find out is

410
00:23:58.759 --> 00:24:01.720
<v Speaker 3>to have our huge customers. I don't name the customers,

411
00:24:01.759 --> 00:24:04.480
<v Speaker 3>but we have a few huge, wile customers, and you

412
00:24:04.519 --> 00:24:06.640
<v Speaker 3>put it on and you're going to find the problem

413
00:24:06.759 --> 00:24:10.759
<v Speaker 3>very quickly. But then there's also the aspect of a

414
00:24:10.799 --> 00:24:14.920
<v Speaker 3>new feature. Even when you deploy it looks great because

415
00:24:14.960 --> 00:24:18.720
<v Speaker 3>nobody's using it right. Then two years later somebody uses

416
00:24:18.720 --> 00:24:23.160
<v Speaker 3>it in a way that you don't anticipate. Reactive development

417
00:24:23.279 --> 00:24:25.720
<v Speaker 3>isn't terrible. I would say, at the end of the day,

418
00:24:25.759 --> 00:24:28.960
<v Speaker 3>your objective when you first get out is if you

419
00:24:28.960 --> 00:24:31.440
<v Speaker 3>write the code clean, you can clean it up later.

420
00:24:32.359 --> 00:24:36.039
<v Speaker 3>If you don't write the code clean, cleaning it up

421
00:24:36.119 --> 00:24:40.880
<v Speaker 3>later is almost impossible. So I would say for feature developers,

422
00:24:41.480 --> 00:24:44.720
<v Speaker 3>focus on keeping it clean, because once it's clean and

423
00:24:44.759 --> 00:24:49.079
<v Speaker 3>it's very easy to read, somebody else can maintain it later.

424
00:24:49.200 --> 00:24:53.279
<v Speaker 3>Then I would say that that's the case for like

425
00:24:53.400 --> 00:24:56.559
<v Speaker 3>any small startup. Just focus on cleaning and a lot

426
00:24:56.559 --> 00:25:02.359
<v Speaker 3>of different just review code and actually have an old job.

427
00:25:02.640 --> 00:25:06.599
<v Speaker 3>I had. There's a guy he he hated me. He

428
00:25:06.680 --> 00:25:11.880
<v Speaker 3>loved me, but I was just me because I would

429
00:25:11.880 --> 00:25:14.519
<v Speaker 3>always review code and I would be like a stickler

430
00:25:14.559 --> 00:25:17.799
<v Speaker 3>on making it really easy to read and maintainable and

431
00:25:17.799 --> 00:25:21.200
<v Speaker 3>stuff like that. He was hated me, and then he

432
00:25:21.240 --> 00:25:23.759
<v Speaker 3>eventually left that company, and I left that company, and

433
00:25:24.119 --> 00:25:27.839
<v Speaker 3>I'm talking to old people and I've heard him say

434
00:25:28.359 --> 00:25:31.480
<v Speaker 3>I miss Dave. Oh my god, I hated when he

435
00:25:31.559 --> 00:25:33.400
<v Speaker 3>reviewed our code. But now I'm at a company that

436
00:25:33.440 --> 00:25:36.000
<v Speaker 3>doesn't review code, and the crap that comes in here,

437
00:25:36.319 --> 00:25:41.160
<v Speaker 3>we can't maintain it. Yeah, maintainability is ninety percent of

438
00:25:41.200 --> 00:25:43.200
<v Speaker 3>getting your speed out of it, because if it's easy

439
00:25:43.200 --> 00:25:46.079
<v Speaker 3>to maintain, it's easy. He don't want to add the

440
00:25:46.599 --> 00:25:51.000
<v Speaker 3>the best trick for speed day one anyways, because if

441
00:25:51.000 --> 00:25:55.440
<v Speaker 3>the code is never used, who cares if it runs

442
00:25:55.559 --> 00:25:58.880
<v Speaker 3>a little, if it runs a two milliseconds slower, who

443
00:25:58.880 --> 00:26:01.480
<v Speaker 3>cares care about the features that all of a sudden

444
00:26:01.559 --> 00:26:07.480
<v Speaker 3>get like traction to make performance improvements? And then somebody,

445
00:26:08.200 --> 00:26:10.680
<v Speaker 3>a team like mine is probably always required a big

446
00:26:10.720 --> 00:26:13.599
<v Speaker 3>company is because eventually you get big enough where all

447
00:26:13.599 --> 00:26:16.000
<v Speaker 3>of a sudden, hey ten years ago, people weren't paying

448
00:26:16.039 --> 00:26:23.920
<v Speaker 3>attention to performance and now needs to and well, yeah, focus,

449
00:26:24.000 --> 00:26:25.880
<v Speaker 3>done well.

450
00:26:25.680 --> 00:26:26.799
<v Speaker 2>To your point on this.

451
00:26:28.400 --> 00:26:32.359
<v Speaker 1>So we're actually running into performance issues on this application

452
00:26:32.400 --> 00:26:35.799
<v Speaker 1>that I'm working on now for client. And what it

453
00:26:35.839 --> 00:26:39.640
<v Speaker 1>does is it it does this gigantic calculation across a

454
00:26:39.640 --> 00:26:45.039
<v Speaker 1>whole bunch of transactions on a hedge fund. And the

455
00:26:45.039 --> 00:26:48.279
<v Speaker 1>people that wrote it, I mean, it's impossible to read,

456
00:26:50.279 --> 00:26:52.400
<v Speaker 1>and so you know, you're trying to just parse through

457
00:26:52.400 --> 00:26:52.880
<v Speaker 1>it and go.

458
00:26:52.839 --> 00:26:54.680
<v Speaker 2>Okay, what what is it doing?

459
00:26:55.359 --> 00:26:57.799
<v Speaker 1>And it's super hard, right, But the thing is is

460
00:26:57.839 --> 00:27:00.839
<v Speaker 1>that it's it's in a psyche job. So it gets

461
00:27:00.920 --> 00:27:03.400
<v Speaker 1>kicked off and you know, it runs, and you know,

462
00:27:03.480 --> 00:27:05.599
<v Speaker 1>if it's a large fund, it can run forty five minutes,

463
00:27:05.640 --> 00:27:11.240
<v Speaker 1>an hour, two hours, and you know, I'm looking at

464
00:27:11.240 --> 00:27:13.400
<v Speaker 1>it and what we're you know, we had the conversation

465
00:27:13.519 --> 00:27:15.799
<v Speaker 1>where we're saying, well, it'd be really nice to break

466
00:27:15.799 --> 00:27:18.519
<v Speaker 1>this up, right so that you can parallelize some of

467
00:27:18.559 --> 00:27:20.799
<v Speaker 1>the work because you have multiple workers, and so you

468
00:27:20.839 --> 00:27:24.440
<v Speaker 1>know that would make it faster. And just getting to

469
00:27:24.480 --> 00:27:26.359
<v Speaker 1>the point where we can actually figure out where to

470
00:27:26.400 --> 00:27:31.160
<v Speaker 1>break it apart. Has been just I mean, it's been ugly,

471
00:27:31.640 --> 00:27:33.839
<v Speaker 1>and you know, yeah, if it had been written in

472
00:27:33.920 --> 00:27:38.400
<v Speaker 1>just a maintainable way, like you're talking about, where it's like, okay,

473
00:27:38.440 --> 00:27:41.680
<v Speaker 1>I see where this kind of breaks down and you know,

474
00:27:41.759 --> 00:27:44.039
<v Speaker 1>where it kind of goes into these methods and comes

475
00:27:44.079 --> 00:27:48.680
<v Speaker 1>back out, it'd be way easier to do because it's like, Okay,

476
00:27:48.680 --> 00:27:51.000
<v Speaker 1>we can turn these things into these things, and we

477
00:27:51.000 --> 00:27:52.200
<v Speaker 1>can do these.

478
00:27:52.000 --> 00:27:52.720
<v Speaker 2>Things over here.

479
00:27:52.839 --> 00:27:55.480
<v Speaker 1>We can put these safeguards in place to make sure

480
00:27:55.480 --> 00:27:59.640
<v Speaker 1>that it's not changing anything it shouldn't. But yeah, it's

481
00:27:59.640 --> 00:28:02.839
<v Speaker 1>going to be a major overhaul, but it's like the

482
00:28:02.880 --> 00:28:06.119
<v Speaker 1>core of the app, and so it's something that we're

483
00:28:06.160 --> 00:28:08.559
<v Speaker 1>going to have to do. And so it's just been

484
00:28:08.599 --> 00:28:11.200
<v Speaker 1>interesting to sit there and think about, Okay, yeah, if

485
00:28:11.200 --> 00:28:15.200
<v Speaker 1>this had been written in a maintainable, readable, understandable manner, right,

486
00:28:15.319 --> 00:28:17.640
<v Speaker 1>we're not even talking about how it executes or how

487
00:28:17.640 --> 00:28:20.240
<v Speaker 1>fast it is in any other way, it would have

488
00:28:20.279 --> 00:28:22.400
<v Speaker 1>made the fixes that we have to make to it

489
00:28:22.440 --> 00:28:28.119
<v Speaker 1>now so much, so much easier. Yeah, And ninety percent

490
00:28:28.119 --> 00:28:30.079
<v Speaker 1>of the problem is is that since it's all in

491
00:28:30.119 --> 00:28:36.279
<v Speaker 1>one job, it's it does everything serially right. It does

492
00:28:36.279 --> 00:28:41.480
<v Speaker 1>the whole process in one run without outsourcing any of

493
00:28:41.519 --> 00:28:41.839
<v Speaker 1>the work.

494
00:28:42.720 --> 00:28:45.839
<v Speaker 3>Yeah, everybody's ran into that application where they have a

495
00:28:45.880 --> 00:28:48.279
<v Speaker 3>twenty six thousand line file and you're.

496
00:28:48.119 --> 00:28:52.920
<v Speaker 1>Like what, Yeah, yeah, I don't think this one was

497
00:28:52.960 --> 00:28:55.400
<v Speaker 1>twenty six thousand, but it's a few thousand at least.

498
00:28:56.119 --> 00:28:58.480
<v Speaker 3>I'm thinking about a very specific contract they had a

499
00:28:58.480 --> 00:28:58.839
<v Speaker 3>long time.

500
00:28:59.000 --> 00:29:02.880
<v Speaker 2>Oh I'm sure. Yeah.

501
00:29:03.240 --> 00:29:05.400
<v Speaker 3>Oh god, my one of my co workers worked at

502
00:29:05.400 --> 00:29:08.240
<v Speaker 3>that job too. So if he listens to this, which

503
00:29:08.240 --> 00:29:10.079
<v Speaker 3>I'm sure you will, he'll get a good laugh out

504
00:29:10.119 --> 00:29:13.039
<v Speaker 3>of my comment right there. Yeah.

505
00:29:13.119 --> 00:29:15.880
<v Speaker 1>But but it's interesting because, yeah, when we talk about performance,

506
00:29:15.920 --> 00:29:20.519
<v Speaker 1>we don't often talk about clean code maintainability, you know,

507
00:29:20.720 --> 00:29:25.240
<v Speaker 1>and and those kinds of things, because we're just talking about, yeah,

508
00:29:25.240 --> 00:29:27.319
<v Speaker 1>what are the tweaks we can make?

509
00:29:27.359 --> 00:29:28.720
<v Speaker 2>And then when we get into it.

510
00:29:28.759 --> 00:29:30.599
<v Speaker 1>This is the other thing that I'm kind of pulling

511
00:29:30.640 --> 00:29:33.400
<v Speaker 1>out of what you've been talking about, is that a

512
00:29:33.440 --> 00:29:35.359
<v Speaker 1>lot of times the things that we're doing are not

513
00:29:35.599 --> 00:29:39.119
<v Speaker 1>just simple fixes, right, because you know N plus one queries,

514
00:29:39.119 --> 00:29:40.920
<v Speaker 1>it's like, okay, drop it includes.

515
00:29:40.480 --> 00:29:41.079
<v Speaker 2>On it, right.

516
00:29:42.079 --> 00:29:44.039
<v Speaker 1>You know, you want to make your query faster at

517
00:29:44.079 --> 00:29:47.279
<v Speaker 1>an index, right, And most of the time. Those simple

518
00:29:47.319 --> 00:29:50.359
<v Speaker 1>fixes will get you a long way, but you know,

519
00:29:50.440 --> 00:29:52.720
<v Speaker 1>you get too far down the line, and yeah, all

520
00:29:52.720 --> 00:29:54.799
<v Speaker 1>of a sudden, it's I have to restructure this to

521
00:29:54.880 --> 00:29:57.400
<v Speaker 1>run a different way, or it's not gonna write in

522
00:29:57.480 --> 00:30:00.000
<v Speaker 1>order to speed it up, or you know, there's gonna

523
00:30:00.160 --> 00:30:03.720
<v Speaker 1>be some some massive infrastructure changes in order to make

524
00:30:03.720 --> 00:30:06.319
<v Speaker 1>this faster, or you know, I have to change the

525
00:30:06.359 --> 00:30:08.920
<v Speaker 1>way I'm doing caching or something like that, where it's

526
00:30:08.960 --> 00:30:12.200
<v Speaker 1>not just this straightforward Oh okay, here's a shortcut. You

527
00:30:12.279 --> 00:30:15.400
<v Speaker 1>got some speed out of it, and there are those

528
00:30:15.440 --> 00:30:18.359
<v Speaker 1>I'm not saying they're not, but at a certain point,

529
00:30:18.440 --> 00:30:21.200
<v Speaker 1>you get to that place where it's like, okay, all

530
00:30:21.240 --> 00:30:25.160
<v Speaker 1>the all the quick fixes on this are done, and

531
00:30:25.240 --> 00:30:26.480
<v Speaker 1>it's still not good enough.

532
00:30:26.519 --> 00:30:27.160
<v Speaker 2>So now what?

533
00:30:28.599 --> 00:30:32.680
<v Speaker 1>And if your code is maintainable, if you know, if

534
00:30:32.720 --> 00:30:34.759
<v Speaker 1>you can approach it and understand it and know how

535
00:30:34.799 --> 00:30:38.440
<v Speaker 1>to change it, it makes that job a lot easier.

536
00:30:39.279 --> 00:30:42.359
<v Speaker 1>But it's it's also interesting because I've worked contracts where

537
00:30:42.359 --> 00:30:44.279
<v Speaker 1>it's like I'm not I'm not going to pay you

538
00:30:44.319 --> 00:30:46.000
<v Speaker 1>to write tests, and I'm not going to pay it

539
00:30:46.039 --> 00:30:48.160
<v Speaker 1>a refactor, and I'm not going to pay it right

540
00:30:48.519 --> 00:30:52.319
<v Speaker 1>and and I'm looking at them and going you realize

541
00:30:52.440 --> 00:30:55.359
<v Speaker 1>that I'm going to be faster for the first like month,

542
00:30:56.200 --> 00:30:59.359
<v Speaker 1>and then after that I'm going to have to refactor

543
00:30:59.480 --> 00:31:02.839
<v Speaker 1>or write test in order to understand what the hell

544
00:31:02.839 --> 00:31:05.559
<v Speaker 1>what this even does so that I can make it

545
00:31:05.599 --> 00:31:07.480
<v Speaker 1>do what you want or change what it does.

546
00:31:08.160 --> 00:31:13.480
<v Speaker 3>M Oh yeah, yeah. Without tests, I wouldn't be able

547
00:31:13.519 --> 00:31:16.559
<v Speaker 3>to do any of my work right. That that is

548
00:31:16.599 --> 00:31:19.759
<v Speaker 3>the key. And we don't have perfect test nobody probably does,

549
00:31:20.440 --> 00:31:22.599
<v Speaker 3>but we have enough tests where all of a sudden,

550
00:31:22.640 --> 00:31:25.440
<v Speaker 3>you change something and you can feel have a relative confidence.

551
00:31:25.480 --> 00:31:27.839
<v Speaker 3>And I think that is another thing about performance work

552
00:31:27.839 --> 00:31:31.079
<v Speaker 3>that you can't be afraid to change things and break it,

553
00:31:31.160 --> 00:31:35.359
<v Speaker 3>which means you need to have software switches everywhere where

554
00:31:35.359 --> 00:31:38.440
<v Speaker 3>you're turning it on and you're seeing if you broke.

555
00:31:38.799 --> 00:31:43.640
<v Speaker 3>We've had extremely good luck within my UH group of

556
00:31:44.000 --> 00:31:47.920
<v Speaker 3>turning these switches on and not breaking things. But if

557
00:31:48.000 --> 00:31:51.839
<v Speaker 3>without those switches and while the monitors that you set up,

558
00:31:52.359 --> 00:31:55.599
<v Speaker 3>you can't change anything because of fear, fear develop your

559
00:31:55.680 --> 00:31:58.279
<v Speaker 3>driven development. It's like for it talking about before, it's

560
00:31:58.279 --> 00:32:00.920
<v Speaker 3>like if you don't have like the indices that we

561
00:32:00.960 --> 00:32:02.920
<v Speaker 3>took away, we didn't take it away because we're scared

562
00:32:03.680 --> 00:32:06.559
<v Speaker 3>and was actually that was that before the show started.

563
00:32:06.599 --> 00:32:09.400
<v Speaker 3>There's during the show that I talked about the indices

564
00:32:09.680 --> 00:32:11.359
<v Speaker 3>forget anyways.

565
00:32:10.960 --> 00:32:13.079
<v Speaker 2>I don't remember, yeah.

566
00:32:12.640 --> 00:32:17.359
<v Speaker 3>Anyways, like yeah, so anyways, feared of a driven development

567
00:32:17.400 --> 00:32:20.680
<v Speaker 3>will like slow down performance too because you don't, as

568
00:32:20.720 --> 00:32:23.440
<v Speaker 3>you just said, you don't have tests. You're too scared

569
00:32:23.440 --> 00:32:28.200
<v Speaker 3>to make any changes, like U will work And I

570
00:32:28.240 --> 00:32:30.480
<v Speaker 3>don't know. My first couple jobs didn't have any tests.

571
00:32:30.480 --> 00:32:34.279
<v Speaker 3>And then ever since then, I've had several jobs where

572
00:32:34.319 --> 00:32:36.799
<v Speaker 3>I came in like nope, we're writing tests. No, I

573
00:32:36.839 --> 00:32:40.880
<v Speaker 3>don't get No, we're not. No, yeah, we were writing

574
00:32:40.960 --> 00:32:45.079
<v Speaker 3>tests and people are but how it's like, well, let's learn.

575
00:32:46.119 --> 00:32:46.559
<v Speaker 2>Yeah.

576
00:32:46.640 --> 00:32:49.079
<v Speaker 1>Well that's the other piece on the thing that I'm

577
00:32:49.119 --> 00:32:52.319
<v Speaker 1>working on is there aren't tests and so it's like

578
00:32:52.440 --> 00:32:55.400
<v Speaker 1>it's this mission critical thing that does all the valuations

579
00:32:55.400 --> 00:32:58.759
<v Speaker 1>for all of the hedge funds and all of your customers.

580
00:32:59.440 --> 00:33:03.440
<v Speaker 1>God and yeah, I mean I was just like you

581
00:33:03.640 --> 00:33:06.559
<v Speaker 1>you want us to refactor this, but you know, but

582
00:33:06.640 --> 00:33:07.759
<v Speaker 1>then I'm going putting a.

583
00:33:07.799 --> 00:33:13.200
<v Speaker 2>Test on this is it's ugly, is so ugly.

584
00:33:13.960 --> 00:33:18.839
<v Speaker 1>But the flip side is is that making it testable, right,

585
00:33:18.960 --> 00:33:21.160
<v Speaker 1>writing the test will force us to refactor some of it.

586
00:33:21.960 --> 00:33:27.559
<v Speaker 3>And when you wrote code without tests, typically methods all

587
00:33:27.559 --> 00:33:29.799
<v Speaker 3>of a sudden go from I like to keep my

588
00:33:29.839 --> 00:33:33.079
<v Speaker 3>methods within five lines of code and Ruby and Joba.

589
00:33:33.079 --> 00:33:35.359
<v Speaker 3>I'm sure it would be different, but five lines of code,

590
00:33:35.440 --> 00:33:38.559
<v Speaker 3>now that's not a rule, but you try to keep

591
00:33:38.599 --> 00:33:43.880
<v Speaker 3>them small. Whereas if somebody wrote the original code without tests,

592
00:33:44.119 --> 00:33:48.039
<v Speaker 3>usually they have one hundred let's just say, hundred line

593
00:33:48.079 --> 00:33:51.960
<v Speaker 3>methods are not uncommon. Trying to test a hundred line

594
00:33:52.000 --> 00:33:57.440
<v Speaker 3>method is like I felt, right, Uh, there's too many conditions.

595
00:33:57.440 --> 00:34:00.319
<v Speaker 3>There's like seven ifs here I do.

596
00:34:02.119 --> 00:34:07.000
<v Speaker 1>Yep, yeah, I I've heard that. I've heard that rule.

597
00:34:07.000 --> 00:34:08.280
<v Speaker 1>I've heard that rule all the way up to like

598
00:34:08.320 --> 00:34:11.159
<v Speaker 1>ten lines of code. Some people are a little bit

599
00:34:11.159 --> 00:34:14.440
<v Speaker 1>more rigid on it than others. My rule of thumb

600
00:34:14.559 --> 00:34:17.480
<v Speaker 1>is is if I'm talking to somebody and I'm explaining

601
00:34:17.519 --> 00:34:21.039
<v Speaker 1>how something works, and I try and everything, that kind

602
00:34:21.039 --> 00:34:23.199
<v Speaker 1>of happens at the same level, at the top level,

603
00:34:23.800 --> 00:34:28.800
<v Speaker 1>right it it retrieves the you know, or maybe not

604
00:34:28.880 --> 00:34:31.000
<v Speaker 1>even that right. That might be part of a lower step,

605
00:34:31.239 --> 00:34:35.119
<v Speaker 1>but usually it's it makes sure that these conditions are

606
00:34:35.159 --> 00:34:38.159
<v Speaker 1>met right, and then if the conditions are right, then

607
00:34:38.239 --> 00:34:42.000
<v Speaker 1>it makes sure that you know it locks the table, right,

608
00:34:42.400 --> 00:34:44.119
<v Speaker 1>does this other stuff in a transaction?

609
00:34:44.280 --> 00:34:44.400
<v Speaker 3>Right?

610
00:34:44.559 --> 00:34:47.639
<v Speaker 1>So there's this step right, Maybe the transaction is an

611
00:34:47.639 --> 00:34:50.880
<v Speaker 1>implementation deal further down. But if I can say these

612
00:34:50.920 --> 00:34:54.079
<v Speaker 1>are the five steps to do a thing right, and

613
00:34:54.119 --> 00:34:58.039
<v Speaker 1>they're all mostly at the same conceptual level, then that's

614
00:34:58.159 --> 00:34:58.599
<v Speaker 1>what my.

615
00:34:58.719 --> 00:34:59.719
<v Speaker 2>Method should look like.

616
00:35:00.199 --> 00:35:02.159
<v Speaker 1>And then underneath that it's like, okay, how do I

617
00:35:02.239 --> 00:35:05.880
<v Speaker 1>do this stage of the theme right? And again at

618
00:35:05.880 --> 00:35:08.719
<v Speaker 1>the conceptual level. And so once you start getting lower

619
00:35:08.760 --> 00:35:12.000
<v Speaker 1>into the code or when I've written it, what you

620
00:35:12.039 --> 00:35:16.320
<v Speaker 1>wind up seeing is is the bottom levels of the methods,

621
00:35:16.480 --> 00:35:19.119
<v Speaker 1>they'll have some things that look like their implementation right

622
00:35:19.119 --> 00:35:21.719
<v Speaker 1>where it's like I'm actually doing the query, and then

623
00:35:21.800 --> 00:35:24.760
<v Speaker 1>maybe there's a and then call this to do the

624
00:35:24.760 --> 00:35:27.199
<v Speaker 1>rest of the work because I feel like the retrieval

625
00:35:27.239 --> 00:35:30.079
<v Speaker 1>and the work are at the same level. But you know,

626
00:35:30.239 --> 00:35:32.920
<v Speaker 1>and then at the very bottom, yeah, it's just logic

627
00:35:33.760 --> 00:35:36.840
<v Speaker 1>and just just being able to approach that and say, Okay,

628
00:35:37.039 --> 00:35:39.920
<v Speaker 1>I see what the process is. Okay, I see what

629
00:35:39.960 --> 00:35:43.719
<v Speaker 1>the process for this part of the process is. That's

630
00:35:43.800 --> 00:35:45.760
<v Speaker 1>how I like to approach it. So yeah, so sometimes

631
00:35:45.760 --> 00:35:46.840
<v Speaker 1>I wind up with a twenty or.

632
00:35:46.880 --> 00:35:48.519
<v Speaker 2>Thirty line method.

633
00:35:49.880 --> 00:35:51.519
<v Speaker 1>But at the end of the day, I'm looking at

634
00:35:51.559 --> 00:35:54.920
<v Speaker 1>it and going, I understand, I can look at this

635
00:35:55.000 --> 00:35:55.840
<v Speaker 1>and know what it does.

636
00:35:58.119 --> 00:36:00.400
<v Speaker 3>I think if you can't look at the method and

637
00:36:00.480 --> 00:36:03.480
<v Speaker 3>understand what a piece of it does, it's time to

638
00:36:03.480 --> 00:36:04.519
<v Speaker 3>create another method name.

639
00:36:05.280 --> 00:36:06.679
<v Speaker 2>Yeah, well that's another one.

640
00:36:06.880 --> 00:36:10.559
<v Speaker 1>When I first got started, I kind of had this

641
00:36:10.719 --> 00:36:13.320
<v Speaker 1>ethos from Rails where it was like, you know, they

642
00:36:13.320 --> 00:36:16.800
<v Speaker 1>have convenient methods called like fine or you know, update

643
00:36:16.920 --> 00:36:18.519
<v Speaker 1>or things like that, and I was like, okay, so

644
00:36:18.559 --> 00:36:20.960
<v Speaker 1>I've got to come up with this short, you know,

645
00:36:21.119 --> 00:36:25.920
<v Speaker 1>concise name nowadays is like updates the thing on the thing,

646
00:36:27.320 --> 00:36:29.679
<v Speaker 1>because then you look at it and you're like, oh,

647
00:36:29.840 --> 00:36:30.800
<v Speaker 1>I know what this does.

648
00:36:32.280 --> 00:36:34.960
<v Speaker 3>I'll just make a guess on how many methods there

649
00:36:35.000 --> 00:36:38.360
<v Speaker 3>are that we've created just on our ticket object, and

650
00:36:38.639 --> 00:36:41.039
<v Speaker 3>it's got to be at least five hundred.

651
00:36:41.119 --> 00:36:42.159
<v Speaker 2>I don't know whether that's time.

652
00:36:42.280 --> 00:36:48.679
<v Speaker 3>Yeah, a thousand. You can't create little things, little update

653
00:36:49.679 --> 00:36:52.320
<v Speaker 3>method and know what the hell it's doing. You need

654
00:36:52.360 --> 00:36:52.920
<v Speaker 3>a bit Well.

655
00:36:54.440 --> 00:36:57.039
<v Speaker 1>It's it's also interesting because you're working on an application

656
00:36:57.079 --> 00:37:02.039
<v Speaker 1>that mostly focuses around the ticket so everything everything touches

657
00:37:02.119 --> 00:37:03.119
<v Speaker 1>this one core.

658
00:37:02.960 --> 00:37:07.679
<v Speaker 3>Piece absolutely, and we created several teams around it, right.

659
00:37:08.880 --> 00:37:11.199
<v Speaker 1>You know, I've worked on other projects that didn't have that,

660
00:37:11.360 --> 00:37:13.400
<v Speaker 1>but then they had like this core two or three

661
00:37:13.760 --> 00:37:17.239
<v Speaker 1>objects that were the same thing. I've almost never seen

662
00:37:17.280 --> 00:37:23.760
<v Speaker 1>an app where, you know, everything's spread across everything. The

663
00:37:24.079 --> 00:37:28.480
<v Speaker 1>only exception I can really think of is the way

664
00:37:28.480 --> 00:37:30.679
<v Speaker 1>that Top Endevs is put together. But that's because I

665
00:37:30.719 --> 00:37:35.920
<v Speaker 1>deliver several different types of media and so those kind

666
00:37:35.920 --> 00:37:38.679
<v Speaker 1>of get the between those and like the membership and

667
00:37:38.800 --> 00:37:42.440
<v Speaker 1>role management, you know, it kind of gets spread across

668
00:37:42.440 --> 00:37:44.480
<v Speaker 1>all of that because it's do you have access to it?

669
00:37:44.480 --> 00:37:45.440
<v Speaker 2>And then how do you deliver it?

670
00:37:45.760 --> 00:37:49.039
<v Speaker 1>And so you know, I get a wide swath of

671
00:37:49.159 --> 00:37:54.239
<v Speaker 1>things that people are going to be generally touching. But yeah,

672
00:37:54.280 --> 00:37:57.159
<v Speaker 1>I mean even within their little areas, right, it's podcast

673
00:37:57.199 --> 00:38:00.960
<v Speaker 1>episodes have a ton of stuff on them, right, course,

674
00:38:01.039 --> 00:38:03.639
<v Speaker 1>lessons have a ton of stuff on them. And and

675
00:38:03.679 --> 00:38:06.199
<v Speaker 1>it's for that same reason, right, because within that little

676
00:38:06.239 --> 00:38:10.840
<v Speaker 1>focused area, I've got that core piece and so understanding

677
00:38:10.880 --> 00:38:13.760
<v Speaker 1>that and then recognizing, okay, so I've got to optimize

678
00:38:13.880 --> 00:38:15.960
<v Speaker 1>and make it as easy to understand as possible.

679
00:38:16.000 --> 00:38:21.159
<v Speaker 3>Around this thing, there's some some somebody else is going

680
00:38:21.239 --> 00:38:22.800
<v Speaker 3>to maintain it and Chris, and you're.

681
00:38:23.519 --> 00:38:26.159
<v Speaker 2>That's right, but I'm the boss, so that laughs Purson

682
00:38:26.159 --> 00:38:26.679
<v Speaker 2>it quietly.

683
00:38:27.159 --> 00:38:31.119
<v Speaker 3>Granted I worked at a company, it will go nameless

684
00:38:31.159 --> 00:38:36.480
<v Speaker 3>that I before I got there. There's another topper that

685
00:38:36.599 --> 00:38:41.800
<v Speaker 3>only named this also, and they didn't have everything was

686
00:38:42.280 --> 00:38:45.599
<v Speaker 3>mixture between tabs and white space. There's always extra white

687
00:38:45.639 --> 00:38:48.280
<v Speaker 3>space at the end. Nobody actually had any cleanup around that.

688
00:38:48.599 --> 00:38:50.679
<v Speaker 3>So I wanted to want to created a script that

689
00:38:50.760 --> 00:38:54.199
<v Speaker 3>basically made it so everything spaces and there's no extra

690
00:38:54.239 --> 00:38:56.199
<v Speaker 3>white space at the Eddybody method. So you do it,

691
00:38:56.239 --> 00:38:59.119
<v Speaker 3>get blame in that and everybody thought I wrote terrible code.

692
00:38:59.119 --> 00:39:01.840
<v Speaker 3>I'm like, no, this is not my code right what

693
00:39:01.880 --> 00:39:04.559
<v Speaker 3>it is, but get blame wise.

694
00:39:05.599 --> 00:39:09.159
<v Speaker 1>Yeah, we've also, Yeah, I want to bring it back

695
00:39:09.159 --> 00:39:12.280
<v Speaker 1>to performance a little bit. Kind of hit the maintainability

696
00:39:12.800 --> 00:39:15.480
<v Speaker 1>idea pretty hard, and I think it's it's a critical

697
00:39:15.519 --> 00:39:18.440
<v Speaker 1>piece of this, right because you're going to suffer trying

698
00:39:18.480 --> 00:39:22.519
<v Speaker 1>to make performance happen with poorly maintained, poorly maintained or

699
00:39:22.559 --> 00:39:27.000
<v Speaker 1>hard to maintain code. But when you're so you were

700
00:39:27.000 --> 00:39:30.039
<v Speaker 1>talking about observability, I want to go back to that idea,

701
00:39:31.320 --> 00:39:33.559
<v Speaker 1>like what are you actually looking for? Do you do

702
00:39:33.599 --> 00:39:36.239
<v Speaker 1>you are you looking for kind of the like new

703
00:39:36.320 --> 00:39:38.360
<v Speaker 1>relic for example, We'll break it down and say you

704
00:39:38.400 --> 00:39:40.280
<v Speaker 1>spent this much time on your query, and this much

705
00:39:40.280 --> 00:39:44.280
<v Speaker 1>time rendering the view, and this much time working in

706
00:39:44.280 --> 00:39:46.679
<v Speaker 1>the controller, and this much time doing these other things.

707
00:39:47.440 --> 00:39:49.360
<v Speaker 1>Is that what you're looking at when you when you

708
00:39:49.400 --> 00:39:52.519
<v Speaker 1>see something slow or are you looking at some other

709
00:39:52.599 --> 00:39:55.800
<v Speaker 1>breakdown or some other numbers, or how do you approach

710
00:39:55.840 --> 00:39:56.599
<v Speaker 1>something like that?

711
00:39:57.800 --> 00:40:01.280
<v Speaker 3>Before we started the team, it was basically, this is

712
00:40:01.320 --> 00:40:03.519
<v Speaker 3>how long the presenter is taken, this is how long

713
00:40:03.599 --> 00:40:09.239
<v Speaker 3>the controller is taken, and various little methods throughout saying

714
00:40:10.000 --> 00:40:14.599
<v Speaker 3>they maybe validations. When we started this team, our first

715
00:40:14.639 --> 00:40:19.920
<v Speaker 3>objective was, hey, listen, we need observability everywhere. So almost

716
00:40:20.199 --> 00:40:23.960
<v Speaker 3>I'm not going to say every method, but every validator,

717
00:40:24.000 --> 00:40:28.400
<v Speaker 3>for example, is wrapped in a data dog optional data

718
00:40:28.400 --> 00:40:33.360
<v Speaker 3>dog tag where you can actually show really so literally

719
00:40:33.559 --> 00:40:37.199
<v Speaker 3>every not every method, but a significant portion of the

720
00:40:37.239 --> 00:40:40.840
<v Speaker 3>methods are actually showing. You can see and you can

721
00:40:40.920 --> 00:40:44.039
<v Speaker 3>narrow down exactly in the code very fast, because all

722
00:40:44.079 --> 00:40:45.760
<v Speaker 3>of a sudden, it's like you turn it down really

723
00:40:46.159 --> 00:40:49.920
<v Speaker 3>there it is, it's right there, and you might have like, okay,

724
00:40:49.960 --> 00:40:52.920
<v Speaker 3>it's within this section and there's three things going on

725
00:40:53.079 --> 00:40:56.960
<v Speaker 3>here one of these three, and there's sometimes what happens

726
00:40:57.000 --> 00:40:59.119
<v Speaker 3>is a lot of times it's one of the three.

727
00:40:59.280 --> 00:41:01.280
<v Speaker 3>We have the option of trying to figure out where

728
00:41:01.320 --> 00:41:03.159
<v Speaker 3>in the code. The slow part is where we have

729
00:41:03.239 --> 00:41:06.000
<v Speaker 3>the option of just deploying more code that will tell

730
00:41:06.079 --> 00:41:09.000
<v Speaker 3>us exactly where it is. And we've gotten to the

731
00:41:09.039 --> 00:41:13.280
<v Speaker 3>point where there is some empty gaps, especially with the

732
00:41:13.320 --> 00:41:16.519
<v Speaker 3>new features. When people add new features, they're not thinking

733
00:41:16.559 --> 00:41:19.239
<v Speaker 3>about adding traces and stuff like that. But we can

734
00:41:19.320 --> 00:41:22.360
<v Speaker 3>just really just go down and target exactly the method

735
00:41:22.360 --> 00:41:26.320
<v Speaker 3>that we're looking for. And we've had things like you

736
00:41:26.400 --> 00:41:28.320
<v Speaker 3>look at the code and you're like, oh, it looks fine,

737
00:41:28.360 --> 00:41:30.880
<v Speaker 3>but you don't see a loop. And then way over

738
00:41:30.920 --> 00:41:33.159
<v Speaker 3>here there's another loop, but that's in there. And then

739
00:41:33.199 --> 00:41:35.280
<v Speaker 3>the way over here there's another loop and that's in

740
00:41:35.320 --> 00:41:37.400
<v Speaker 3>there too. So you got I think they call that

741
00:41:37.519 --> 00:41:39.880
<v Speaker 3>ncube or whatnottens, like all of a sudden, like, oh,

742
00:41:39.960 --> 00:41:42.159
<v Speaker 3>obviously we need to do something with this, and then

743
00:41:42.239 --> 00:41:45.840
<v Speaker 3>you add some for that specific one. I just added

744
00:41:45.880 --> 00:41:49.840
<v Speaker 3>some memoization where all of a sudden, this last loop

745
00:41:49.960 --> 00:41:52.320
<v Speaker 3>was just literally just it wasn't even a loop anymore,

746
00:41:52.519 --> 00:41:57.800
<v Speaker 3>just calling it into a hash table look up and

747
00:41:57.800 --> 00:42:00.280
<v Speaker 3>it's just a fan So all of a sudden turned

748
00:42:00.280 --> 00:42:02.400
<v Speaker 3>it into an NQ but is still not good. But

749
00:42:02.880 --> 00:42:08.519
<v Speaker 3>the performance of NQ versus and squared or whatever is huge.

750
00:42:10.519 --> 00:42:12.679
<v Speaker 3>We got a big enough performance game there. All of

751
00:42:12.679 --> 00:42:21.519
<v Speaker 3>a sudden, I could run away from that problem.

752
00:42:18.760 --> 00:42:20.039
<v Speaker 2>Kick it down the road a little bit.

753
00:42:20.440 --> 00:42:22.320
<v Speaker 3>Oh my god. Some of the times you see the

754
00:42:22.320 --> 00:42:25.400
<v Speaker 3>code and you're like, in it's business decisions that people

755
00:42:25.440 --> 00:42:28.360
<v Speaker 3>make too. Do they make business decisions like yeah, I

756
00:42:28.400 --> 00:42:30.960
<v Speaker 3>can see why the developer wrote it like this, But

757
00:42:32.000 --> 00:42:37.039
<v Speaker 3>why didn't the developer tell you, no, no, we can't

758
00:42:37.119 --> 00:42:39.639
<v Speaker 3>do that. It's going to not perform in five years.

759
00:42:40.639 --> 00:42:45.960
<v Speaker 1>Yeah. Sometimes you don't know though, at the end of

760
00:42:46.000 --> 00:42:46.400
<v Speaker 1>the day.

761
00:42:46.559 --> 00:42:49.320
<v Speaker 3>The one thing that I didn't talk about today or

762
00:42:49.440 --> 00:42:52.880
<v Speaker 3>on might talk that I think is really important is

763
00:42:53.559 --> 00:42:57.119
<v Speaker 3>when you first create an application and you deploy it,

764
00:42:58.039 --> 00:43:00.880
<v Speaker 3>you can always set tight limits and the amount of

765
00:43:00.960 --> 00:43:05.000
<v Speaker 3>data that you have, so product limit limits. Say, hey, listen,

766
00:43:05.039 --> 00:43:10.639
<v Speaker 3>you can only have ten options in your drop down.

767
00:43:11.239 --> 00:43:15.239
<v Speaker 3>That's obviously exaggeration, but you're allowed to put any ten,

768
00:43:15.280 --> 00:43:18.719
<v Speaker 3>but you only get ten. You can always give more

769
00:43:19.599 --> 00:43:21.559
<v Speaker 3>and eventually say I'll give you more. I'll give you more,

770
00:43:21.599 --> 00:43:25.239
<v Speaker 3>I'll give you more. But going from hey, you get unlimited.

771
00:43:25.400 --> 00:43:28.519
<v Speaker 3>I remember the first thing I worked at at Zendesk

772
00:43:28.679 --> 00:43:32.239
<v Speaker 3>was you can have unlimited brands. Well, now the limit

773
00:43:32.360 --> 00:43:37.480
<v Speaker 3>is three hundred because we realize that unlimited brands means

774
00:43:37.559 --> 00:43:42.719
<v Speaker 3>almost well, unlimited complexity. And you can give me one

775
00:43:42.840 --> 00:43:46.280
<v Speaker 3>hundred thousand brands because and that's one hundred thousand domains

776
00:43:46.320 --> 00:43:50.559
<v Speaker 3>and that's the complexity around that is just too big.

777
00:43:50.679 --> 00:43:59.440
<v Speaker 3>So yeah, adding limits to your product. And as a developer,

778
00:43:59.480 --> 00:44:02.280
<v Speaker 3>I think that our responsibility to tell the product people

779
00:44:02.320 --> 00:44:05.639
<v Speaker 3>that there's areas in the code. You go, if we

780
00:44:05.719 --> 00:44:09.360
<v Speaker 3>have a hundred million of these, what does it? What's

781
00:44:09.400 --> 00:44:13.880
<v Speaker 3>the performance? It's sometimes very obviously we wouldn't be able

782
00:44:13.880 --> 00:44:16.119
<v Speaker 3>to have one hundred thousand of these right when we

783
00:44:16.639 --> 00:44:19.679
<v Speaker 3>first developing a product. Go back to your product manager

784
00:44:19.719 --> 00:44:24.880
<v Speaker 3>to say, hey, that feature, if somebody actually uses it

785
00:44:24.960 --> 00:44:27.880
<v Speaker 3>and use it a lot, it's not gonna work. And

786
00:44:27.920 --> 00:44:29.760
<v Speaker 3>they might come back and say, nobody would ever do that.

787
00:44:29.760 --> 00:44:32.159
<v Speaker 3>It's like, so, what's the problem with actually having a

788
00:44:32.199 --> 00:44:36.320
<v Speaker 3>limit if nobody's ever going to run into it? So

789
00:44:36.880 --> 00:44:39.519
<v Speaker 3>I think that's also very key, and that's not programming

790
00:44:39.559 --> 00:44:42.800
<v Speaker 3>per se. But I think ninety or a huge percentage

791
00:44:42.800 --> 00:44:45.679
<v Speaker 3>of our job as a programmers to go back to

792
00:44:45.719 --> 00:44:49.280
<v Speaker 3>the product managers and telling them, hey, listen, in three

793
00:44:49.360 --> 00:44:53.320
<v Speaker 3>years from now, we wouldn't want a drop down. We

794
00:44:53.400 --> 00:44:56.679
<v Speaker 3>had dropdowns for example that had over one hundred thousand

795
00:44:56.719 --> 00:44:57.440
<v Speaker 3>options in them.

796
00:44:58.159 --> 00:44:58.760
<v Speaker 2>Oh wow.

797
00:45:00.360 --> 00:45:03.679
<v Speaker 3>First off, the UI isn't very good, but just loading

798
00:45:03.719 --> 00:45:06.800
<v Speaker 3>them up and for example, for this one, this one

799
00:45:06.840 --> 00:45:09.360
<v Speaker 3>was cool and it wasn't actual talk because one of

800
00:45:09.360 --> 00:45:12.280
<v Speaker 3>the things that we did well that customer that had

801
00:45:12.280 --> 00:45:15.679
<v Speaker 3>one hundred thousand options, they churned because well, we're too

802
00:45:15.679 --> 00:45:19.800
<v Speaker 3>slow for them, right. We actually we probably would be

803
00:45:19.800 --> 00:45:23.760
<v Speaker 3>able to support maybe even one hundred thousand in the

804
00:45:23.800 --> 00:45:27.280
<v Speaker 3>options now because what we did is we changed our queries.

805
00:45:27.320 --> 00:45:30.840
<v Speaker 3>And our original queries was grabbing one hundred thousand active

806
00:45:30.880 --> 00:45:34.440
<v Speaker 3>record objects. And you can have one hundred thousand active

807
00:45:34.440 --> 00:45:38.960
<v Speaker 3>rectcord objects without a serious time penalty, right. But what

808
00:45:39.000 --> 00:45:42.599
<v Speaker 3>we do now is we pluck for the data, so

809
00:45:42.639 --> 00:45:44.440
<v Speaker 3>we get the data fields that we need, and we

810
00:45:44.480 --> 00:45:47.559
<v Speaker 3>only need like two or three fields out of records,

811
00:45:47.679 --> 00:45:50.760
<v Speaker 3>so you're not initializing one hundred thousand active record objects,

812
00:45:51.119 --> 00:45:57.960
<v Speaker 3>so you grab one hundred thousands options right in the array.

813
00:45:58.559 --> 00:46:01.239
<v Speaker 3>And then you populate it via the the erase slash

814
00:46:01.280 --> 00:46:03.239
<v Speaker 3>hash that you get back, and all of a sudden,

815
00:46:03.280 --> 00:46:05.480
<v Speaker 3>this is very fast now. And all of a sudden,

816
00:46:05.639 --> 00:46:08.320
<v Speaker 3>that customer that had one hundred thousand options that churned

817
00:46:08.400 --> 00:46:12.480
<v Speaker 3>five six years ago, we might be able to maintain

818
00:46:12.519 --> 00:46:16.039
<v Speaker 3>them now, but they're not coming back right. And that's

819
00:46:16.079 --> 00:46:18.840
<v Speaker 3>another reason why you have a performance teams. All of

820
00:46:18.840 --> 00:46:21.760
<v Speaker 3>a sudden, once you start have enough churn, people are like, oh,

821
00:46:21.880 --> 00:46:23.480
<v Speaker 3>customers are leaving because of performance.

822
00:46:24.199 --> 00:46:24.400
<v Speaker 2>Yeah.

823
00:46:24.960 --> 00:46:28.840
<v Speaker 4>Do you have any opinions around using things like five

824
00:46:29.000 --> 00:46:32.039
<v Speaker 4>ars of falcon in front of reels to improve performance?

825
00:46:33.000 --> 00:46:34.960
<v Speaker 4>Do you have any experience with that?

826
00:46:35.719 --> 00:46:46.320
<v Speaker 3>I wish I did. No, Yeah, that's good. Of the

827
00:46:46.320 --> 00:46:48.480
<v Speaker 3>answer as I can give you is yeah, no, I

828
00:46:48.559 --> 00:46:49.960
<v Speaker 3>have not used fibers at all.

829
00:46:50.440 --> 00:46:53.599
<v Speaker 4>So yeah, I just started a new side project and

830
00:46:53.639 --> 00:46:57.400
<v Speaker 4>I've put falcon and not because it's the performance intensive project.

831
00:46:57.400 --> 00:47:00.400
<v Speaker 4>It's just a side project that lets me play around

832
00:47:00.400 --> 00:47:03.599
<v Speaker 4>with new stuff with no risk. I was like, why not,

833
00:47:03.960 --> 00:47:04.639
<v Speaker 4>it'll be fun.

834
00:47:05.480 --> 00:47:07.559
<v Speaker 3>I did that for what I worked for the UFC

835
00:47:07.639 --> 00:47:09.519
<v Speaker 3>one time in the UFC thought they were gonna get

836
00:47:09.599 --> 00:47:14.840
<v Speaker 3>a lot of different but it just they thought day

837
00:47:14.880 --> 00:47:18.360
<v Speaker 3>one is gonna be bam. It's just an e commerce

838
00:47:18.400 --> 00:47:20.800
<v Speaker 3>store too, so it's not going to get that much traffic.

839
00:47:20.840 --> 00:47:23.760
<v Speaker 3>But UFC is like, but we're UFC. It's like yeah,

840
00:47:23.800 --> 00:47:28.480
<v Speaker 3>but like it's still like only very small part. Anyways. Yeah,

841
00:47:28.519 --> 00:47:31.639
<v Speaker 3>I remember I was able to play in that and

842
00:47:31.639 --> 00:47:34.400
<v Speaker 3>it's like, hey, I'm just going to tweak every part

843
00:47:34.440 --> 00:47:36.239
<v Speaker 3>of this e commerce app so you can go as

844
00:47:36.239 --> 00:47:39.000
<v Speaker 3>fast as possible. I think they launched and had almost

845
00:47:39.000 --> 00:47:42.760
<v Speaker 3>no traffic, but it was fast for the no traffic.

846
00:47:46.639 --> 00:47:47.519
<v Speaker 2>Yeah.

847
00:47:47.639 --> 00:47:50.199
<v Speaker 1>One thing that I'm running into with top end devs

848
00:47:50.280 --> 00:47:54.320
<v Speaker 1>is the search takes like five seconds to run.

849
00:47:54.960 --> 00:47:58.039
<v Speaker 3>So search is a very completely different team for us.

850
00:47:59.360 --> 00:48:05.159
<v Speaker 3>For us, it's the exact opposite. So our search team

851
00:48:05.280 --> 00:48:09.639
<v Speaker 3>is better than my sequel. Like whatever they're doing, they've

852
00:48:09.639 --> 00:48:16.920
<v Speaker 3>made it index things quite fast, so we've done. There's

853
00:48:18.000 --> 00:48:22.400
<v Speaker 3>APIs that sometimes you need. They needed to be like

854
00:48:23.000 --> 00:48:26.280
<v Speaker 3>no most current data, so you were going after SQEL,

855
00:48:26.840 --> 00:48:30.239
<v Speaker 3>But there's APIs where it's like, hey, if it's delayed

856
00:48:30.239 --> 00:48:35.280
<v Speaker 3>by two hundred milliseconds, is it that big of a

857
00:48:35.320 --> 00:48:38.440
<v Speaker 3>deal that we don't return all the tickets. We minus

858
00:48:38.519 --> 00:48:40.519
<v Speaker 3>all the tickets except for the one last one that

859
00:48:40.519 --> 00:48:46.360
<v Speaker 3>they put in right, and in those cases we've found

860
00:48:46.440 --> 00:48:49.280
<v Speaker 3>the performance of a LASS search is so much faster, like,

861
00:48:49.679 --> 00:48:53.000
<v Speaker 3>well we'll get our response times response times, we're just

862
00:48:53.079 --> 00:48:54.159
<v Speaker 3>dropping half for example.

863
00:48:55.320 --> 00:48:57.159
<v Speaker 1>Yeah, that's the thing that I've been looking at lately.

864
00:48:57.320 --> 00:49:03.719
<v Speaker 1>Is I put in PG search and yeah, it's just

865
00:49:03.960 --> 00:49:07.880
<v Speaker 1>you know, doing a multi search across all the models.

866
00:49:07.920 --> 00:49:10.039
<v Speaker 1>I mean, it will give you back a result, but

867
00:49:10.639 --> 00:49:12.880
<v Speaker 1>I had to tell the proxy server that sits in

868
00:49:12.880 --> 00:49:16.519
<v Speaker 1>front of it, come all proxy, not to time out

869
00:49:16.599 --> 00:49:19.480
<v Speaker 1>so fast in order to get those results. And yeah,

870
00:49:19.480 --> 00:49:22.199
<v Speaker 1>I've been looking at possibly moving to elastic search because

871
00:49:22.199 --> 00:49:26.360
<v Speaker 1>I hear it's really just stinking fast. I was using

872
00:49:26.400 --> 00:49:30.000
<v Speaker 1>another search engine, mealy Search, but the problem I had

873
00:49:30.000 --> 00:49:34.440
<v Speaker 1>there was that they I couldn't I could only search

874
00:49:34.519 --> 00:49:38.840
<v Speaker 1>one type of object at a time, and so I

875
00:49:38.880 --> 00:49:40.760
<v Speaker 1>had to go and say, okay, give me all the episodes,

876
00:49:40.760 --> 00:49:43.679
<v Speaker 1>give me all the podcast and it was fairly fast,

877
00:49:44.400 --> 00:49:47.760
<v Speaker 1>but I hated making six queries to it to get

878
00:49:47.800 --> 00:49:50.119
<v Speaker 1>all the different things because I kind of want just

879
00:49:50.159 --> 00:49:53.960
<v Speaker 1>the most relevant thing to show up first. And so yeah,

880
00:49:53.960 --> 00:49:55.800
<v Speaker 1>that's where I'm looking at elastic search, because I think

881
00:49:55.840 --> 00:49:57.880
<v Speaker 1>elastic search doesn't make you do that.

882
00:49:58.119 --> 00:50:01.440
<v Speaker 3>So yeah, we have a differ team that maintains that. So

883
00:50:01.559 --> 00:50:05.000
<v Speaker 3>that's another place where I just use plastic search and

884
00:50:05.039 --> 00:50:08.719
<v Speaker 3>I was fast in our system, but we have That's

885
00:50:08.760 --> 00:50:11.920
<v Speaker 3>the thing about being at a big company. There's areas

886
00:50:11.960 --> 00:50:15.280
<v Speaker 3>where you know how to use it within your company,

887
00:50:15.320 --> 00:50:17.239
<v Speaker 3>but to set it up or anything to be an

888
00:50:17.239 --> 00:50:22.880
<v Speaker 3>expert on it. No, Yeah, that's where I missed the

889
00:50:23.000 --> 00:50:26.360
<v Speaker 3>being a startup get you get to be an expert,

890
00:50:26.440 --> 00:50:30.760
<v Speaker 3>or at least you get to play with more tools.

891
00:50:31.320 --> 00:50:38.280
<v Speaker 2>Right, So, are there any other big secrets.

892
00:50:37.719 --> 00:50:39.960
<v Speaker 1>That you want to share with us or thoughts before

893
00:50:39.960 --> 00:50:43.719
<v Speaker 1>we head into picks.

894
00:50:43.760 --> 00:50:47.239
<v Speaker 3>Nothing that's coming in to mind. But I mean, as

895
00:50:47.280 --> 00:50:53.559
<v Speaker 3>I said, we have. I mean I'm creating a whole

896
00:50:53.559 --> 00:50:55.519
<v Speaker 3>new talk. For example, I think I told you before

897
00:50:55.519 --> 00:50:58.519
<v Speaker 3>we started, it's like how graph ql is going to be,

898
00:50:58.880 --> 00:51:02.280
<v Speaker 3>uh speed up a whole bunch of things for us,

899
00:51:02.440 --> 00:51:07.519
<v Speaker 3>and then just there's so many different areas that I

900
00:51:07.559 --> 00:51:09.639
<v Speaker 3>was not able to hit that now I'm going to

901
00:51:09.840 --> 00:51:14.840
<v Speaker 3>I'm submitting cocks right now to actually talk about those.

902
00:51:14.880 --> 00:51:19.079
<v Speaker 3>But those are not well thought out in my brain yet,

903
00:51:19.119 --> 00:51:22.159
<v Speaker 3>So I don't think I should be a talking about

904
00:51:22.440 --> 00:51:22.920
<v Speaker 3>right now.

905
00:51:24.000 --> 00:51:26.840
<v Speaker 1>Yeah, you mentioned graph ql, and I have to say

906
00:51:26.920 --> 00:51:31.320
<v Speaker 1>my experience implementing things in graph Ql has been not

907
00:51:31.440 --> 00:51:36.800
<v Speaker 1>my favorite thing that I've ever done. But you're talking

908
00:51:36.840 --> 00:51:41.599
<v Speaker 1>about a performance aspect of it is. Yeah, I'm a

909
00:51:41.639 --> 00:51:43.800
<v Speaker 1>little curious what you're looking at there. I know that

910
00:51:44.480 --> 00:51:46.719
<v Speaker 1>with graph ql, the thing that people tend to like

911
00:51:46.840 --> 00:51:48.440
<v Speaker 1>is that you make one query and you get all

912
00:51:48.480 --> 00:51:49.840
<v Speaker 1>the data you need one go.

913
00:51:50.960 --> 00:51:53.719
<v Speaker 2>So is that where the speed up comes from or

914
00:51:53.760 --> 00:51:54.440
<v Speaker 2>is it something else?

915
00:51:54.760 --> 00:51:59.480
<v Speaker 3>No? No, So we don't use Ruby every place, and

916
00:51:59.559 --> 00:52:02.840
<v Speaker 3>our graph Ql endpoints we use Java. Then we're actually

917
00:52:02.840 --> 00:52:05.559
<v Speaker 3>only using them internally. We're not using them externally yet,

918
00:52:05.679 --> 00:52:09.639
<v Speaker 3>but internally it hits our Java service. Java does an

919
00:52:09.679 --> 00:52:13.239
<v Speaker 3>amazing job of paralyzing things. So then Java makes like

920
00:52:14.360 --> 00:52:20.480
<v Speaker 3>fifty ten probably, but let's say fifty different rest requests

921
00:52:20.880 --> 00:52:24.920
<v Speaker 3>to gain application gets them all back way faster than

922
00:52:24.960 --> 00:52:28.559
<v Speaker 3>if they was compiling up, and then that comes back

923
00:52:28.599 --> 00:52:30.840
<v Speaker 3>to the Java app. The Java app knows how to

924
00:52:30.880 --> 00:52:33.400
<v Speaker 3>configure and put it all in the way it's supposed

925
00:52:33.440 --> 00:52:35.199
<v Speaker 3>to put it back, and then serializes it and sent

926
00:52:35.400 --> 00:52:39.159
<v Speaker 3>back to the requester of the actual appeatt And because

927
00:52:39.199 --> 00:52:42.920
<v Speaker 3>of the paralyzation of that, it's so much faster because

928
00:52:43.000 --> 00:52:47.760
<v Speaker 3>rest requests right now in our application, we have something

929
00:52:47.840 --> 00:52:51.440
<v Speaker 3>what we call internally side loads, where you can basically

930
00:52:51.440 --> 00:52:53.840
<v Speaker 3>say I want anything I want. It's almost like a

931
00:52:53.880 --> 00:52:56.360
<v Speaker 3>poor man's graph QL. Well, if all of a sudden

932
00:52:56.360 --> 00:53:00.639
<v Speaker 3>you're doing that serially, it's just the response times here,

933
00:53:01.360 --> 00:53:04.960
<v Speaker 3>so graftl speeding us up because it's basically forcing us

934
00:53:05.000 --> 00:53:09.119
<v Speaker 3>to come back to true RESTful responses that are really fast.

935
00:53:10.119 --> 00:53:14.880
<v Speaker 1>All right, cool, Well, let's go ahead and do some

936
00:53:14.920 --> 00:53:17.599
<v Speaker 1>picks before we get to those.

937
00:53:17.719 --> 00:53:21.559
<v Speaker 2>If people want to follow you online, where they find you, I.

938
00:53:21.480 --> 00:53:24.599
<v Speaker 3>Think get hub or LinkedIn, or you'd find me. Dr

939
00:53:24.719 --> 00:53:27.159
<v Speaker 3>Henter is usually what you find me. If you look

940
00:53:27.159 --> 00:53:30.719
<v Speaker 3>for Dr Henter, get Hubb or Dr Henter. I think

941
00:53:30.760 --> 00:53:35.239
<v Speaker 3>get LinkedIn. Even Dr Henner in my Gmail would work

942
00:53:35.280 --> 00:53:37.079
<v Speaker 3>too awesome.

943
00:53:38.599 --> 00:53:41.800
<v Speaker 2>All right, well, let's go ahead and do some picks.

944
00:53:43.159 --> 00:53:45.079
<v Speaker 2>Are you sure? Do you have some picks for us?

945
00:53:45.960 --> 00:53:46.159
<v Speaker 3>Yeah?

946
00:53:46.239 --> 00:53:49.840
<v Speaker 4>Hang on one second, I have broken broad for my client,

947
00:53:50.119 --> 00:53:51.159
<v Speaker 4>which is all the fun.

948
00:53:53.880 --> 00:53:54.599
<v Speaker 3>I'm flaxing.

949
00:53:54.960 --> 00:53:55.440
<v Speaker 2>I'm on it.

950
00:53:55.480 --> 00:53:57.400
<v Speaker 3>I'll give you five minutes. I'm on it.

951
00:54:00.599 --> 00:54:03.440
<v Speaker 4>Perfect timing, isn't it shouldn't I shouldn't have imrged. I

952
00:54:03.519 --> 00:54:06.119
<v Speaker 4>merged up on requests just before coming onto this collision

953
00:54:06.199 --> 00:54:06.679
<v Speaker 4>to done that.

954
00:54:08.920 --> 00:54:11.079
<v Speaker 1>Yeah, so I used when he got real quiet over

955
00:54:11.119 --> 00:54:11.880
<v Speaker 1>there that that's.

956
00:54:11.760 --> 00:54:12.440
<v Speaker 2>What was going on.

957
00:54:12.480 --> 00:54:16.760
<v Speaker 4>It was like, yeah, yeah, sorry about that.

958
00:54:17.079 --> 00:54:17.800
<v Speaker 2>Sorry picks.

959
00:54:18.559 --> 00:54:21.360
<v Speaker 4>I'm gonna start with a very selfish pick, which is

960
00:54:21.760 --> 00:54:24.840
<v Speaker 4>I just relaunched one of my side projects called Skatagun

961
00:54:24.880 --> 00:54:29.599
<v Speaker 4>dot Email, which has been in hibernation for like two

962
00:54:29.599 --> 00:54:32.239
<v Speaker 4>and a half years because of the joys of sales

963
00:54:32.360 --> 00:54:37.679
<v Speaker 4>tax and EU V eight. I was using Stripe for

964
00:54:37.719 --> 00:54:40.079
<v Speaker 4>payments on my accounters Like, yeah, you know, you can't

965
00:54:40.079 --> 00:54:43.400
<v Speaker 4>do that because you'll have to collect V eight for

966
00:54:43.480 --> 00:54:46.440
<v Speaker 4>everyone in the EU. And I'm like, okay, thanks for

967
00:54:46.480 --> 00:54:51.639
<v Speaker 4>telling me that now. So I've moved payments over to paddle, uh,

968
00:54:51.800 --> 00:54:54.719
<v Speaker 4>which took a lot longer because I got distracted by

969
00:54:54.960 --> 00:54:58.119
<v Speaker 4>this stuff, but it's it's back now. So Skatagun dot

970
00:54:58.159 --> 00:55:03.559
<v Speaker 4>Email has relaunched it Tuesday. So that's one pick.

971
00:55:05.320 --> 00:55:05.559
<v Speaker 3>The I.

972
00:55:07.079 --> 00:55:09.360
<v Speaker 4>Usually do like a music or a TV show pick,

973
00:55:09.599 --> 00:55:12.840
<v Speaker 4>So I'll go to the TV show this time. Severance

974
00:55:12.920 --> 00:55:17.920
<v Speaker 4>on Apple TV season two just started. It's uh weird,

975
00:55:18.039 --> 00:55:20.800
<v Speaker 4>and I like it. I like it very much. It's

976
00:55:20.840 --> 00:55:23.280
<v Speaker 4>been a very strong start. I think it was quite

977
00:55:23.280 --> 00:55:26.800
<v Speaker 4>a cliffhanger ending in season one, and the show has

978
00:55:26.840 --> 00:55:29.320
<v Speaker 4>started off really strong, so if you haven't watched it,

979
00:55:29.360 --> 00:55:30.159
<v Speaker 4>i'd recommend that.

980
00:55:30.960 --> 00:55:32.159
<v Speaker 2>Just getting the links here for that.

981
00:55:32.920 --> 00:55:38.800
<v Speaker 1>I've got a couple of picks I'm gonna put out there, so,

982
00:55:39.639 --> 00:55:42.320
<v Speaker 1>as most of you probably know, I tend to do

983
00:55:42.880 --> 00:55:46.119
<v Speaker 1>the board game picks as part of my picks, So

984
00:55:49.159 --> 00:55:53.360
<v Speaker 1>I'm going to put out The game is called Cascadero,

985
00:55:55.519 --> 00:55:57.239
<v Speaker 1>and it's.

986
00:55:59.079 --> 00:56:00.039
<v Speaker 2>It's got some.

987
00:56:00.079 --> 00:56:04.280
<v Speaker 1>Elements that are similar to other board games that I've played.

988
00:56:04.280 --> 00:56:06.639
<v Speaker 1>So there's kind of a there's a track that you

989
00:56:06.719 --> 00:56:10.159
<v Speaker 1>advance up, and you get rewards for hitting certain milestones,

990
00:56:11.519 --> 00:56:15.639
<v Speaker 1>and you also get points for hitting certain milestones. The

991
00:56:15.679 --> 00:56:18.400
<v Speaker 1>way that you advance up the track is you so

992
00:56:18.559 --> 00:56:22.199
<v Speaker 1>there's a kingdom and the king has dyed, and so

993
00:56:22.360 --> 00:56:27.679
<v Speaker 1>you're basically you're out there connecting the cities and things

994
00:56:27.760 --> 00:56:31.599
<v Speaker 1>like that and spreading the word on the new king

995
00:56:31.719 --> 00:56:36.000
<v Speaker 1>or whatever. And so you put little horsemen down on

996
00:56:36.039 --> 00:56:41.119
<v Speaker 1>the on the board around these towns and you're connecting

997
00:56:41.199 --> 00:56:44.360
<v Speaker 1>up the towns, and you get bonus points for say,

998
00:56:44.360 --> 00:56:47.639
<v Speaker 1>connecting two towns to the same color. So the first

999
00:56:47.679 --> 00:56:49.360
<v Speaker 1>time you do that for any given color there are

1000
00:56:49.360 --> 00:56:52.719
<v Speaker 1>five colors, then you.

1001
00:56:51.920 --> 00:56:54.559
<v Speaker 2>You get points you advance up the board.

1002
00:56:55.760 --> 00:56:59.360
<v Speaker 1>If you are the first person to that city and

1003
00:56:59.400 --> 00:57:02.280
<v Speaker 1>it's not the first horseman that you've put down in

1004
00:57:02.400 --> 00:57:05.239
<v Speaker 1>the group, then you get one point. And if you're

1005
00:57:05.239 --> 00:57:09.039
<v Speaker 1>the second, third, fourth, I guess you can do fourth

1006
00:57:10.440 --> 00:57:13.920
<v Speaker 1>because other people can connect onto it as well, right,

1007
00:57:15.159 --> 00:57:17.320
<v Speaker 1>but it's it's per group. So when you connect a

1008
00:57:17.480 --> 00:57:20.400
<v Speaker 1>group to a city and you're the second or third,

1009
00:57:20.440 --> 00:57:23.000
<v Speaker 1>or fourth person, you move your thing up the advanced

1010
00:57:23.039 --> 00:57:25.480
<v Speaker 1>track or advance it up the track of that color

1011
00:57:25.599 --> 00:57:28.360
<v Speaker 1>two spaces instead of one. And then if there's a

1012
00:57:28.360 --> 00:57:30.960
<v Speaker 1>herald on the city, then you add one to whatever

1013
00:57:31.000 --> 00:57:35.119
<v Speaker 1>you get to advance it. And then there's a bonus

1014
00:57:35.159 --> 00:57:40.400
<v Speaker 1>for having connected two cities of all five colors with

1015
00:57:40.519 --> 00:57:43.719
<v Speaker 1>any you know across any of or all of your groups.

1016
00:57:43.960 --> 00:57:48.199
<v Speaker 1>And then there are also point bonuses for getting all

1017
00:57:48.239 --> 00:57:51.400
<v Speaker 1>five of your markers past the first it's kind of

1018
00:57:51.400 --> 00:57:55.880
<v Speaker 1>a finish line three on the second finish line, or

1019
00:57:55.880 --> 00:57:58.000
<v Speaker 1>getting being the first person to get one all the

1020
00:57:58.000 --> 00:58:01.000
<v Speaker 1>way to the end of one of the lines. And

1021
00:58:01.039 --> 00:58:03.320
<v Speaker 1>the way that you win is you have the most

1022
00:58:03.440 --> 00:58:09.400
<v Speaker 1>points of the people that get there their piece all

1023
00:58:09.440 --> 00:58:11.400
<v Speaker 1>the way to the end of whatever color they're playing.

1024
00:58:12.119 --> 00:58:14.599
<v Speaker 1>So when I was playing, I was playing as Red,

1025
00:58:15.280 --> 00:58:17.719
<v Speaker 1>and so I made sure I got my piece all

1026
00:58:17.760 --> 00:58:19.440
<v Speaker 1>the way to the end of Red, and then I

1027
00:58:19.480 --> 00:58:20.760
<v Speaker 1>tried to get it all the way to the end

1028
00:58:20.760 --> 00:58:22.920
<v Speaker 1>of yellow as well, but I didn't have to do that.

1029
00:58:24.840 --> 00:58:26.760
<v Speaker 1>And then one of the other guys that I was

1030
00:58:26.800 --> 00:58:28.360
<v Speaker 1>playing with got his all the way to the end

1031
00:58:28.360 --> 00:58:30.440
<v Speaker 1>of blue, which was the color he was playing, but

1032
00:58:30.519 --> 00:58:32.119
<v Speaker 1>he did that on his last turn, and if he

1033
00:58:32.159 --> 00:58:34.239
<v Speaker 1>hadn't gotten it there, even though he had more points

1034
00:58:34.280 --> 00:58:36.440
<v Speaker 1>than I did, because I got mine to the end

1035
00:58:36.480 --> 00:58:37.360
<v Speaker 1>of the track, I won.

1036
00:58:37.760 --> 00:58:39.000
<v Speaker 2>And so what your.

1037
00:58:38.840 --> 00:58:42.000
<v Speaker 1>Goal is is you want to be the person who

1038
00:58:42.000 --> 00:58:44.039
<v Speaker 1>gets it all the way to the end and has

1039
00:58:44.079 --> 00:58:46.199
<v Speaker 1>the most points. But the way you end the game

1040
00:58:46.440 --> 00:58:48.880
<v Speaker 1>is by getting more than fifty points. As soon as

1041
00:58:48.880 --> 00:58:52.440
<v Speaker 1>somebody crosses that fifty point threshold, all the other players

1042
00:58:52.440 --> 00:58:55.440
<v Speaker 1>get one more turn and then it ends. Or when

1043
00:58:55.519 --> 00:58:59.039
<v Speaker 1>somebody runs out of horsemen and can't place another horseman,

1044
00:58:59.119 --> 00:59:00.800
<v Speaker 1>that's the other way it ends. And that's the way

1045
00:59:00.800 --> 00:59:02.320
<v Speaker 1>I ended for us, because we had never played it

1046
00:59:02.360 --> 00:59:04.880
<v Speaker 1>before and so we weren't racking up the points the

1047
00:59:04.880 --> 00:59:06.119
<v Speaker 1>way that we should have been.

1048
00:59:06.639 --> 00:59:09.920
<v Speaker 2>But anyway, it was pretty fun. And then they're like.

1049
00:59:09.800 --> 00:59:12.199
<v Speaker 1>I said, there are different rewards up the track that

1050
00:59:12.920 --> 00:59:15.960
<v Speaker 1>you know, so you can advance another marker up the track,

1051
00:59:16.039 --> 00:59:19.280
<v Speaker 1>or you can place another horseman, or you can move

1052
00:59:19.320 --> 00:59:21.239
<v Speaker 1>a horseman or just stuff like that.

1053
00:59:21.639 --> 00:59:24.360
<v Speaker 2>So anyway, it was pretty fun Cascadero.

1054
00:59:25.480 --> 00:59:27.320
<v Speaker 1>It came out in twenty twenty four, so it's a

1055
00:59:27.360 --> 00:59:30.360
<v Speaker 1>relatively new game and board game Geek gives it a

1056
00:59:30.360 --> 00:59:34.079
<v Speaker 1>weight of two point five to three, which means that

1057
00:59:34.159 --> 00:59:36.960
<v Speaker 1>if you're kind of a casual player, this might be

1058
00:59:37.559 --> 00:59:41.599
<v Speaker 1>a little bit complicated, but not so complicated that you're

1059
00:59:41.719 --> 00:59:43.920
<v Speaker 1>not going to enjoy it. I have to say that

1060
00:59:46.679 --> 00:59:51.639
<v Speaker 1>the complicated part is just keeping track of what you've

1061
00:59:51.679 --> 00:59:56.280
<v Speaker 1>connected with your groups, and then you know, keeping track

1062
00:59:56.320 --> 00:59:58.760
<v Speaker 1>of how to move stuff up the track, and you

1063
00:59:58.840 --> 01:00:00.639
<v Speaker 1>get used to that in the first time minutes or so,

1064
01:00:01.199 --> 01:00:03.960
<v Speaker 1>and then I would probably wait it once you understand

1065
01:00:03.960 --> 01:00:06.800
<v Speaker 1>those two things at like one point nine. I mean,

1066
01:00:06.840 --> 01:00:09.960
<v Speaker 1>it's it's just those couple of concepts you have to

1067
01:00:09.960 --> 01:00:13.639
<v Speaker 1>get used to and then you're good to go. It

1068
01:00:13.679 --> 01:00:15.559
<v Speaker 1>took us about there were three of us playing. It

1069
01:00:15.559 --> 01:00:18.559
<v Speaker 1>took us what forty five minutes maybe an hour, and

1070
01:00:18.599 --> 01:00:20.519
<v Speaker 1>that was with us learning the game. So I would,

1071
01:00:20.519 --> 01:00:22.719
<v Speaker 1>I would assume that it probably takes you know, if

1072
01:00:22.719 --> 01:00:25.719
<v Speaker 1>you have four or five people playing, you know, I

1073
01:00:25.840 --> 01:00:28.800
<v Speaker 1>thank you forty five minutes. So anyway, it was fun.

1074
01:00:29.400 --> 01:00:32.800
<v Speaker 1>I definitely enjoyed it. One of my buddies is teaching

1075
01:00:32.840 --> 01:00:36.679
<v Speaker 1>the hot games at salt Con in March, which is

1076
01:00:36.760 --> 01:00:40.199
<v Speaker 1>the big board game convention up in Layton, Utah.

1077
01:00:40.320 --> 01:00:45.039
<v Speaker 2>And yeah, anyway, so that was one of the games

1078
01:00:45.039 --> 01:00:45.559
<v Speaker 2>he had to learn.

1079
01:00:45.559 --> 01:00:48.920
<v Speaker 1>We'll probably pick up another one later, but yeah, I

1080
01:00:49.000 --> 01:00:51.840
<v Speaker 1>really enjoyed it, So I'm gonna pick that. My wife

1081
01:00:51.840 --> 01:00:55.800
<v Speaker 1>and I for TV shows, we just started watching season

1082
01:00:55.800 --> 01:01:01.039
<v Speaker 1>two of The Night Agent and we enjoyed the first

1083
01:01:01.079 --> 01:01:07.960
<v Speaker 1>season a lot, so I'll pick that as well. Let

1084
01:01:07.960 --> 01:01:09.199
<v Speaker 1>me see if I get a link for that.

1085
01:01:09.719 --> 01:01:13.440
<v Speaker 2>And then I am starting to.

1086
01:01:15.360 --> 01:01:18.199
<v Speaker 1>Put together meetups and stuff for ruby Geniuses, so if

1087
01:01:18.199 --> 01:01:21.559
<v Speaker 1>you go to rubygeniuses dot com. I kind of so

1088
01:01:22.679 --> 01:01:24.480
<v Speaker 1>it took me a little longer to get it launched

1089
01:01:24.480 --> 01:01:27.199
<v Speaker 1>than I wanted to. And the reason essentially is that

1090
01:01:28.679 --> 01:01:30.840
<v Speaker 1>the stuff that I'm doing for top end devs as

1091
01:01:30.840 --> 01:01:36.719
<v Speaker 1>far as like delivering courses and podcasts and stuff like that,

1092
01:01:36.960 --> 01:01:38.800
<v Speaker 1>I've been talking to other people who want to use

1093
01:01:38.840 --> 01:01:39.239
<v Speaker 1>the system.

1094
01:01:39.280 --> 01:01:42.480
<v Speaker 2>I'm using and so rather than do the smart thing.

1095
01:01:42.320 --> 01:01:45.199
<v Speaker 1>And just deploy them a copy, I made it a

1096
01:01:45.280 --> 01:01:47.199
<v Speaker 1>multi tenant app so I can charge them for it.

1097
01:01:47.639 --> 01:01:51.000
<v Speaker 1>So that that took a bit of work to kind

1098
01:01:51.039 --> 01:01:53.519
<v Speaker 1>of get everything figured out and learn how to do

1099
01:01:53.599 --> 01:01:59.719
<v Speaker 1>multi tenancy with Stripe connect on you know, on my app,

1100
01:02:00.199 --> 01:02:02.639
<v Speaker 1>make sure I'm getting all the right web hooks and

1101
01:02:02.679 --> 01:02:05.119
<v Speaker 1>all that stuff. But it's basically done. So if you

1102
01:02:05.119 --> 01:02:07.719
<v Speaker 1>want to go sign up, I'm going to change the

1103
01:02:07.760 --> 01:02:09.800
<v Speaker 1>price today. I'm going to move it down to forty

1104
01:02:09.840 --> 01:02:15.400
<v Speaker 1>seven dollars just because I'm still pretty happy about the inauguration.

1105
01:02:14.960 --> 01:02:17.039
<v Speaker 2>Of Donald Trump and he's president at forty seven.

1106
01:02:17.960 --> 01:02:19.559
<v Speaker 1>But yeah, so if you want to go and sign

1107
01:02:19.639 --> 01:02:21.599
<v Speaker 1>up for forty seven dollars, it will go back up

1108
01:02:21.599 --> 01:02:24.880
<v Speaker 1>to ninety seven dollars in a few weeks and that'll

1109
01:02:24.920 --> 01:02:28.880
<v Speaker 1>give you access to I'm essentially I'm putting together videos kind.

1110
01:02:28.719 --> 01:02:32.920
<v Speaker 2>Of like railscast was or go Rails or Drifting Ruby.

1111
01:02:34.480 --> 01:02:37.360
<v Speaker 1>My focus is going to be essentially I'm going to

1112
01:02:37.400 --> 01:02:39.760
<v Speaker 1>say here's my project, and then you're gonna get a

1113
01:02:39.840 --> 01:02:42.400
<v Speaker 1>video of me working on the project every week, and

1114
01:02:42.440 --> 01:02:45.320
<v Speaker 1>it might be interspersed with and this is something that

1115
01:02:45.360 --> 01:02:47.039
<v Speaker 1>I fixed on top end devs. Right, So if I

1116
01:02:47.079 --> 01:02:50.119
<v Speaker 1>get elastic search working for the search for example, I

1117
01:02:50.199 --> 01:02:53.599
<v Speaker 1>might work that in the first app I'm building is

1118
01:02:53.639 --> 01:02:59.000
<v Speaker 1>actually to help track bills through the Utah legislature, and

1119
01:02:59.079 --> 01:03:01.679
<v Speaker 1>so it's going to be hitting their APIs and working

1120
01:03:01.719 --> 01:03:04.760
<v Speaker 1>around the gaping holes in their APIs.

1121
01:03:04.320 --> 01:03:06.320
<v Speaker 2>Because they have gaping holes in their APIs.

1122
01:03:07.400 --> 01:03:09.480
<v Speaker 1>So there may be some screen scraping and things like

1123
01:03:09.519 --> 01:03:11.920
<v Speaker 1>that to get all the data in and then yeah,

1124
01:03:12.000 --> 01:03:15.280
<v Speaker 1>putting together the alerts and stuff like that, so you know,

1125
01:03:15.440 --> 01:03:19.119
<v Speaker 1>just you know, you get a notice that says, hey,

1126
01:03:19.159 --> 01:03:22.559
<v Speaker 1>your bill went to committee, or you know, your bill

1127
01:03:22.599 --> 01:03:25.199
<v Speaker 1>had its second reading, and so if it has a

1128
01:03:25.239 --> 01:03:27.960
<v Speaker 1>third reading and passes, then it passes, you know, and

1129
01:03:28.079 --> 01:03:29.920
<v Speaker 1>just kind of working through all that stuff and then

1130
01:03:29.960 --> 01:03:33.079
<v Speaker 1>helping people connect with their legislators because I feel like

1131
01:03:33.159 --> 01:03:35.559
<v Speaker 1>if we have more people involved in the legislative process

1132
01:03:36.119 --> 01:03:39.079
<v Speaker 1>and talking to their legislators, regardless of which side of

1133
01:03:39.079 --> 01:03:41.360
<v Speaker 1>the aisle you're on, I think.

1134
01:03:41.159 --> 01:03:42.519
<v Speaker 2>We generally get better.

1135
01:03:43.920 --> 01:03:46.360
<v Speaker 1>Legislation because I think most of the things when we're

1136
01:03:46.400 --> 01:03:49.000
<v Speaker 1>talking about roads and schools and things like that, we

1137
01:03:49.280 --> 01:03:52.599
<v Speaker 1>generally agree on what we want, whether you're right or left,

1138
01:03:53.119 --> 01:03:55.800
<v Speaker 1>and So what I want is I want moms and

1139
01:03:55.880 --> 01:04:00.840
<v Speaker 1>dads talking to the legislators and saying you're passing, you're

1140
01:04:00.880 --> 01:04:02.960
<v Speaker 1>pushing this education bill, but that's not what we want,

1141
01:04:04.039 --> 01:04:06.079
<v Speaker 1>you know, or things like that. So so that's what

1142
01:04:06.119 --> 01:04:07.719
<v Speaker 1>I'm going to be working through and just showing people

1143
01:04:07.760 --> 01:04:10.599
<v Speaker 1>how to do that. It's probably going to have some

1144
01:04:10.639 --> 01:04:15.719
<v Speaker 1>premium features too that involve AI and doing bill summaries

1145
01:04:15.760 --> 01:04:19.880
<v Speaker 1>for AI. I'm already doing this for another project, and

1146
01:04:19.920 --> 01:04:21.480
<v Speaker 1>so yeah, you're going to get kind of a wide

1147
01:04:21.480 --> 01:04:24.800
<v Speaker 1>breadth of things out of this. Also creating groups so

1148
01:04:24.920 --> 01:04:30.440
<v Speaker 1>people can discuss bills together. I want to give organizations

1149
01:04:30.480 --> 01:04:33.679
<v Speaker 1>an option for putting together their slate of bills and

1150
01:04:33.719 --> 01:04:36.840
<v Speaker 1>where they stand on it, and give them some way

1151
01:04:36.840 --> 01:04:39.840
<v Speaker 1>of posting that on their websites. So those are kind

1152
01:04:39.880 --> 01:04:41.239
<v Speaker 1>of the features that I'm going to be putting in

1153
01:04:41.320 --> 01:04:47.000
<v Speaker 1>so you know, imbedible stuff. So anyway, if you're looking

1154
01:04:47.039 --> 01:04:48.840
<v Speaker 1>to learn any of those things, then then you want

1155
01:04:48.880 --> 01:04:51.559
<v Speaker 1>to sign up for that. We're also doing the meetups

1156
01:04:52.320 --> 01:04:54.760
<v Speaker 1>and we'll be going through some of the technologies, maybe

1157
01:04:54.800 --> 01:04:57.199
<v Speaker 1>a little more in depth, so where in the videos

1158
01:04:57.199 --> 01:05:00.280
<v Speaker 1>I'll be showing you I'm building this feature using Turbo,

1159
01:05:01.360 --> 01:05:03.480
<v Speaker 1>I may go through, Hey, here are all the features

1160
01:05:03.519 --> 01:05:08.719
<v Speaker 1>that turbo offers in this way or comal or I've

1161
01:05:08.719 --> 01:05:11.000
<v Speaker 1>had people ask me for all kinds of stuff. If

1162
01:05:11.000 --> 01:05:13.880
<v Speaker 1>you connect with me on LinkedIn too, I'll actually get

1163
01:05:13.880 --> 01:05:15.639
<v Speaker 1>on a call with you and ask you what you

1164
01:05:15.679 --> 01:05:19.000
<v Speaker 1>want to learn. So anyway, I've been way more long

1165
01:05:19.000 --> 01:05:22.760
<v Speaker 1>winded on that than I want. But yeah, so that's

1166
01:05:22.840 --> 01:05:26.159
<v Speaker 1>all going to be coming out through Rubygeniuses dot com

1167
01:05:26.800 --> 01:05:29.599
<v Speaker 1>and yeah, so hopefully that's in the wheelhouse of things

1168
01:05:29.639 --> 01:05:32.239
<v Speaker 1>you want. But yeah, we're going to be doing meetups

1169
01:05:32.280 --> 01:05:36.840
<v Speaker 1>and tutorials and screencasts and courses in the whole nine

1170
01:05:36.880 --> 01:05:38.880
<v Speaker 1>yards and you get access to all of that through

1171
01:05:38.920 --> 01:05:39.480
<v Speaker 1>the membership.

1172
01:05:39.559 --> 01:05:42.280
<v Speaker 2>So anyway, David, what are your picks?

1173
01:05:42.559 --> 01:05:45.920
<v Speaker 3>Yes, So, I have a coworker actually that I work

1174
01:05:46.039 --> 01:05:50.760
<v Speaker 3>side by side with that's publishing a book soon and

1175
01:05:50.800 --> 01:05:54.280
<v Speaker 3>it's called rail Scales. He actually gives more talks about

1176
01:05:55.159 --> 01:05:59.440
<v Speaker 3>scaling rails than I do. But Christian Polantis is his

1177
01:06:00.199 --> 01:06:03.719
<v Speaker 3>the author's name, book name, Ral Scales. I'm actually very

1178
01:06:03.760 --> 01:06:06.039
<v Speaker 3>interested in to see what it looks like and I

1179
01:06:06.079 --> 01:06:07.760
<v Speaker 3>can't wait to get myself a copy. I hope I

1180
01:06:07.800 --> 01:06:10.960
<v Speaker 3>get myself a free copy.

1181
01:06:11.039 --> 01:06:15.519
<v Speaker 2>Yeah, become a technical reviewer. They give those out for free.

1182
01:06:16.320 --> 01:06:18.639
<v Speaker 3>Well, I mean he works with me and he's yeah,

1183
01:06:19.159 --> 01:06:21.280
<v Speaker 3>I'll tell him. I gave him a shout out. There

1184
01:06:21.360 --> 01:06:26.599
<v Speaker 3>you go, you go. What else? I actually have one

1185
01:06:26.639 --> 01:06:34.320
<v Speaker 3>other coworker that he wrote an article on AWS about

1186
01:06:34.440 --> 01:06:38.719
<v Speaker 3>scaling Zendesk And if you do a search for the

1187
01:06:38.760 --> 01:06:46.079
<v Speaker 3>guy's name is Anatoly aws Zendesk Performance, So Anatoly Aws

1188
01:06:46.440 --> 01:06:51.840
<v Speaker 3>Zendesk Performance, you will find his article in Google and

1189
01:06:52.159 --> 01:06:54.039
<v Speaker 3>he talks about some of the things that we've been doing.

1190
01:06:54.400 --> 01:06:56.800
<v Speaker 3>Much more on the infrastructure side. He's a much more

1191
01:06:56.800 --> 01:06:59.199
<v Speaker 3>of an infrastructure than a Ruby guy, but I work

1192
01:06:59.320 --> 01:07:06.039
<v Speaker 3>side by side of the He's absolutely brilliant. Also, if

1193
01:07:06.079 --> 01:07:09.719
<v Speaker 3>anybody's hiring product manager or managers in general, I know

1194
01:07:09.800 --> 01:07:12.320
<v Speaker 3>several that got laid off, So feel free to ping

1195
01:07:12.360 --> 01:07:15.760
<v Speaker 3>me on LinkedIn because I feel like there's some good

1196
01:07:15.760 --> 01:07:18.079
<v Speaker 3>people out there that I know that I'd love to

1197
01:07:18.199 --> 01:07:25.280
<v Speaker 3>connect to other people. And lastly, you guys probably don't

1198
01:07:25.320 --> 01:07:30.199
<v Speaker 3>know Swift, but Swift is essentially an interactive game that

1199
01:07:30.239 --> 01:07:34.360
<v Speaker 3>you connect to a bicycle a bicycle trainer, and I

1200
01:07:34.519 --> 01:07:39.360
<v Speaker 3>absolutely love it. I'm I mean, I every night like

1201
01:07:39.480 --> 01:07:42.280
<v Speaker 3>I do races sometimes and the last few nights I've

1202
01:07:42.280 --> 01:07:44.679
<v Speaker 3>been doing races. I am not a racer. I am

1203
01:07:44.679 --> 01:07:47.559
<v Speaker 3>not that fast, But at the end of the day,

1204
01:07:47.559 --> 01:07:50.639
<v Speaker 3>I'll still go in and do the races. And I

1205
01:07:50.679 --> 01:07:55.159
<v Speaker 3>think the category ds I'm taught. I'm I'm the best

1206
01:07:55.159 --> 01:07:56.519
<v Speaker 3>of the worst category.

1207
01:07:56.960 --> 01:07:57.599
<v Speaker 2>Oh, there you go.

1208
01:07:58.440 --> 01:08:01.760
<v Speaker 3>So as soon as I get the next category, I'll

1209
01:08:01.760 --> 01:08:03.719
<v Speaker 3>get destroyed. Yeah.

1210
01:08:03.760 --> 01:08:05.719
<v Speaker 1>I got a membership to Swift when I bought my

1211
01:08:05.760 --> 01:08:10.159
<v Speaker 1>bike trainer because I have a Wahoo trainer and or.

1212
01:08:10.159 --> 01:08:14.000
<v Speaker 3>The is it the bike? Okay, I got the Kicker bike.

1213
01:08:15.119 --> 01:08:19.279
<v Speaker 2>Okay, Yeah, I've only used it once or twice. In fact,

1214
01:08:19.319 --> 01:08:20.199
<v Speaker 2>I think it expired.

1215
01:08:20.840 --> 01:08:25.399
<v Speaker 1>But yeah, it's cool because it's yeah, it's almost like,

1216
01:08:25.920 --> 01:08:29.119
<v Speaker 1>well I guess it's not almost like, but it's it's

1217
01:08:29.199 --> 01:08:31.760
<v Speaker 1>kind of fun to just ride your bike.

1218
01:08:31.920 --> 01:08:34.000
<v Speaker 3>And yeah, if you're.

1219
01:08:34.279 --> 01:08:36.479
<v Speaker 2>Harder up the hills and all that stuff.

1220
01:08:36.119 --> 01:08:39.319
<v Speaker 3>And exactly, and then that you're in Utah, so you

1221
01:08:39.319 --> 01:08:41.319
<v Speaker 3>you suffer from the coldness and you don't want to

1222
01:08:41.319 --> 01:08:41.760
<v Speaker 3>be biking.

1223
01:08:42.520 --> 01:08:44.640
<v Speaker 1>Oh yeah, I don't train outside. I'm training for a

1224
01:08:44.720 --> 01:08:46.720
<v Speaker 1>triathlon now this year. I want to do either an

1225
01:08:46.760 --> 01:08:47.960
<v Speaker 1>iron Man or half iron Man.

1226
01:08:48.000 --> 01:08:51.039
<v Speaker 3>I haven't decided I'd do that with you, but I

1227
01:08:51.039 --> 01:08:55.680
<v Speaker 3>think my knees would say no on the running. In fact,

1228
01:08:55.720 --> 01:08:58.680
<v Speaker 3>I got an MRI scheduled for next week from my shoulders,

1229
01:08:58.720 --> 01:09:05.199
<v Speaker 3>so man, I'm breaking down. Yeah, and last I.

1230
01:09:05.159 --> 01:09:07.760
<v Speaker 1>Watched my dad fall apart, and I just I feel

1231
01:09:07.760 --> 01:09:09.319
<v Speaker 1>like I need to keep moving, so I don't.

1232
01:09:09.479 --> 01:09:12.600
<v Speaker 3>So the last day I was going to give this

1233
01:09:13.479 --> 01:09:16.239
<v Speaker 3>my last thing to saying go Bills because I'm hoping

1234
01:09:16.359 --> 01:09:19.600
<v Speaker 3>for the Super Bowl. But well I still say go

1235
01:09:19.680 --> 01:09:21.600
<v Speaker 3>Bills because I love them.

1236
01:09:21.960 --> 01:09:25.399
<v Speaker 2>Okay, so have you decided if you're rooting for the

1237
01:09:25.399 --> 01:09:26.359
<v Speaker 2>Eagles or the Chiefs?

1238
01:09:27.920 --> 01:09:30.720
<v Speaker 3>Have I decided whether I'm watching the Super Bowls?

1239
01:09:32.000 --> 01:09:32.600
<v Speaker 2>Fair enough?

1240
01:09:35.640 --> 01:09:38.199
<v Speaker 3>You know, I don't hate the Chiefs, but at the

1241
01:09:38.239 --> 01:09:40.760
<v Speaker 3>same time, I got to root for the Eagles just

1242
01:09:40.800 --> 01:09:45.800
<v Speaker 3>because they I don't want the Chiefs to win three

1243
01:09:45.800 --> 01:09:49.680
<v Speaker 3>times in a row. They're not bad, They're not the

1244
01:09:50.359 --> 01:09:53.239
<v Speaker 3>Patriots where I hated them, but still I don't want

1245
01:09:53.239 --> 01:09:54.800
<v Speaker 3>to win three times in a row. And I think

1246
01:09:54.840 --> 01:09:56.640
<v Speaker 3>that their fan base understands that too.

1247
01:09:57.920 --> 01:09:58.199
<v Speaker 2>Yeah.

1248
01:09:58.239 --> 01:10:00.439
<v Speaker 1>I like both teams, so I'm not sure or which

1249
01:10:00.479 --> 01:10:02.640
<v Speaker 1>way I'm swinging yet, but.

1250
01:10:04.199 --> 01:10:04.920
<v Speaker 2>A right good deal?

1251
01:10:05.399 --> 01:10:07.640
<v Speaker 3>What was that was amazing? This year?

1252
01:10:08.239 --> 01:10:10.479
<v Speaker 1>All right, well, I'm gonna go ahead and end the stream,

1253
01:10:10.520 --> 01:10:14.159
<v Speaker 1>but thanks for coming, thank you, and until next time,

1254
01:10:14.239 --> 01:10:15.159
<v Speaker 1>folks max out
