WEBVTT
1
00:00:04.799 --> 00:00:07.919
Hey, folks, welcome back to another episode of the Ruby
2
00:00:08.000 --> 00:00:11.160
Rogues podcast. This week, on our panel we have Ayush
3
00:00:11.279 --> 00:00:16.079
Nowatya Hello. Hello, I'm Charles max Wood from top End Devs.
4
00:00:16.719 --> 00:00:19.719
This week we have a special guest. We have David Henner. David,
5
00:00:20.239 --> 00:00:24.320
you gave a talk at Rails World in September talking
6
00:00:24.359 --> 00:00:29.039
about performance, and so we reached out because we thought,
7
00:00:29.079 --> 00:00:32.520
you know, hey, it's it's interesting to talk about. You're
8
00:00:32.560 --> 00:00:35.920
on the Zendesk Ruby scaling team, so it sounds like
9
00:00:35.960 --> 00:00:41.560
you're working on I guess a non trivial application. I
10
00:00:41.560 --> 00:00:43.320
don't know if it's just the traffic, but it seems
11
00:00:43.359 --> 00:00:47.759
like it's it's an involved app. So yeah, do you
12
00:00:47.759 --> 00:00:50.000
want to just give I guess any more introduction that
13
00:00:50.039 --> 00:00:51.799
you want us to have and then we can dive
14
00:00:51.840 --> 00:00:54.880
in and talk about how to do performance with Ruby.
15
00:00:56.880 --> 00:00:57.119
Yeah.
16
00:00:57.159 --> 00:00:59.439
I gave that talk, and the ironic part of that,
17
00:00:59.479 --> 00:01:03.359
I gave that same well, I gave almost the same
18
00:01:03.439 --> 00:01:07.439
talk within Zendesk, and it was it was originally an
19
00:01:07.519 --> 00:01:10.159
hour and a half and then at Zendesk I had
20
00:01:10.159 --> 00:01:12.640
to break it down to forty five minutes. And then
21
00:01:12.680 --> 00:01:14.159
I thought I was dumb because I thought it was
22
00:01:14.159 --> 00:01:17.079
a forty five minute talk for Raals World. I found
23
00:01:17.120 --> 00:01:22.400
out it was a thirty minute talk. It's all so
24
00:01:22.480 --> 00:01:26.560
I've got a lot more content, but yeah, thirty minutes
25
00:01:26.599 --> 00:01:30.840
and that's normal. Probably, Wow, thirty minutes, it's not much time.
26
00:01:31.760 --> 00:01:35.120
It's so funny to me because I talked to people
27
00:01:35.159 --> 00:01:37.359
who haven't spoken at a conference or haven't you know,
28
00:01:37.400 --> 00:01:42.480
given a talk in other settings. And you know, so
29
00:01:42.560 --> 00:01:45.120
for example, at church, a lot of times, you know,
30
00:01:45.120 --> 00:01:47.200
they'll have us give like a fifteen minute talk on
31
00:01:47.239 --> 00:01:47.760
a topic.
32
00:01:48.280 --> 00:01:51.319
But it's like, man, fifteen.
33
00:01:50.959 --> 00:01:53.640
Minute talks are hard, and they're like, what, you only
34
00:01:53.640 --> 00:01:55.400
have to come up with this much content, And I'm
35
00:01:55.400 --> 00:01:57.599
like I always come up with an hour's worth of
36
00:01:57.599 --> 00:01:58.920
content and have to cut it down.
37
00:01:59.400 --> 00:01:59.599
Yeah.
38
00:01:59.640 --> 00:02:01.879
Right, there's always more I could put in it.
39
00:02:01.920 --> 00:02:04.760
And so it's knowing what to take out more than
40
00:02:05.040 --> 00:02:08.120
knowing what to put in and then turning that into
41
00:02:08.199 --> 00:02:11.360
a I guess, a cohesive narrative.
42
00:02:11.439 --> 00:02:15.400
And yeah, anyway, having the flow is the hardest part. Yeah.
43
00:02:15.639 --> 00:02:17.840
Today it's like, oh my god, I need to have
44
00:02:17.919 --> 00:02:20.719
this and the original flow is so perfect that I
45
00:02:20.759 --> 00:02:25.599
have actually tweaked down at my company. Then to asking
46
00:02:25.759 --> 00:02:28.400
was like, yeah, I got this, And it wasn't until
47
00:02:28.639 --> 00:02:30.800
two months before the conference talk when I had to
48
00:02:30.800 --> 00:02:36.639
submit my papers. Oh thirty minutes. Oh oh no, let's
49
00:02:36.680 --> 00:02:40.800
get that done. I think it turned out fairly well
50
00:02:40.800 --> 00:02:43.400
though at the end of the day. I was the
51
00:02:43.520 --> 00:02:46.599
last talk on the last day, right before Aaron Patterson talked, though,
52
00:02:46.960 --> 00:02:49.039
and I will say that is the worst time slot
53
00:02:49.080 --> 00:02:52.319
to have, like you're worried about your talk the whole time,
54
00:02:52.360 --> 00:02:54.360
and first talk that I actually paid attention to I
55
00:02:54.360 --> 00:02:56.560
was still kind of little amped up, and that was
56
00:02:56.599 --> 00:03:02.319
Aaron's say goodbye speech. Basically, it's like right, dang.
57
00:03:03.199 --> 00:03:11.479
Yeah, so yeah, I've been there too. I want to
58
00:03:11.520 --> 00:03:15.159
just dive in. So you know what, what's kind of
59
00:03:15.159 --> 00:03:18.000
the low hanging fruit in the rails performance world.
60
00:03:18.280 --> 00:03:21.319
I think the big thing that people like, at least
61
00:03:21.360 --> 00:03:23.919
I don't hear people talking about. And it's like everybody
62
00:03:23.960 --> 00:03:26.960
focuses on. First off, a lot of people focus on
63
00:03:27.039 --> 00:03:29.759
really hard things, and it's like, hey, let's change it
64
00:03:29.800 --> 00:03:31.919
to a micro service. It's like, oh, yeah, that might
65
00:03:31.960 --> 00:03:34.039
make it faster, but probably is just going to hold
66
00:03:34.039 --> 00:03:37.400
a bunch of crust. But the big thing people don't
67
00:03:38.319 --> 00:03:43.599
advertise in the community is just observability and like trying
68
00:03:43.639 --> 00:03:47.400
to actually like find the things you need through. Let's
69
00:03:47.400 --> 00:03:51.039
say I use data Dog as endsk, but everybody can
70
00:03:51.199 --> 00:03:55.039
also complains about the cost of the observability and it's like,
71
00:03:55.360 --> 00:03:58.280
right now, you can actually make your costs lower by
72
00:03:58.319 --> 00:04:01.199
turning on software switches. You don't the observabilit one hundred
73
00:04:01.199 --> 00:04:03.400
percent of time, for example, and you can actually have
74
00:04:04.120 --> 00:04:08.120
like tricks around, like the observability layer just literally going
75
00:04:08.159 --> 00:04:12.159
out and like Okay, if we monitor something and something
76
00:04:12.199 --> 00:04:15.360
goes awry, turn on the observability layer. But don't turn
77
00:04:15.400 --> 00:04:17.680
it out all the time, because if you do, you're
78
00:04:17.759 --> 00:04:21.040
going to be paying half of your infrastructure talks or
79
00:04:21.120 --> 00:04:25.120
or infrastructure costs to Data Dog. So I started to
80
00:04:25.160 --> 00:04:28.199
talk with that and that was I hope a lot
81
00:04:28.240 --> 00:04:35.160
of people got valuable as an dollar figures stuff out
82
00:04:35.160 --> 00:04:35.360
of that.
83
00:04:35.959 --> 00:04:39.319
But then like, hang on, because I have a question
84
00:04:39.360 --> 00:04:43.160
about that. Yep, Because you know, I've used Century, I've
85
00:04:43.240 --> 00:04:49.680
used roll Bar, I've used a new relic. I'm trying
86
00:04:49.720 --> 00:04:52.439
to think of all the different ones that I've I've
87
00:04:52.560 --> 00:04:54.759
used over the years. I mean most of them they
88
00:04:54.839 --> 00:04:57.079
sponsor the show, and so I feel like I have to.
89
00:04:58.199 --> 00:04:59.959
I have to feel good about it being a good
90
00:05:00.040 --> 00:05:03.000
product before I go Okay, you can sponsor the show
91
00:05:03.040 --> 00:05:04.879
and I can go out and say you should try
92
00:05:04.959 --> 00:05:08.800
this one. And so I've tried a whole bunch of them,
93
00:05:08.839 --> 00:05:11.000
but most of them you just install the gem and
94
00:05:11.040 --> 00:05:14.360
then it just kind of, you know, behind the scenes,
95
00:05:14.399 --> 00:05:18.680
does the work. And so my question there is how
96
00:05:18.720 --> 00:05:20.279
do you put a switch around that? Do you just
97
00:05:20.319 --> 00:05:24.680
put it into your initializer? And then so, lawyer, how
98
00:05:24.720 --> 00:05:25.360
do you handle it?
99
00:05:25.920 --> 00:05:29.560
In the talk I gave the actual code, but there
100
00:05:29.680 --> 00:05:32.759
is a general. There is a general like, hey, it's
101
00:05:32.800 --> 00:05:36.439
on or off, and we always have that general thing on.
102
00:05:36.680 --> 00:05:39.040
So there's like the general. But then let's say in
103
00:05:39.120 --> 00:05:43.199
the traces that you get a stack trace and the
104
00:05:43.240 --> 00:05:45.279
default stat trace. I believe it is just one bar,
105
00:05:46.160 --> 00:05:50.279
nothing extraordinary, but you can actually turn a whole bunch
106
00:05:50.399 --> 00:05:52.759
of traces on within that trace.
107
00:05:52.839 --> 00:05:54.360
Oh okay, break.
108
00:05:54.120 --> 00:05:57.120
Down to see everything that's going on, and then you
109
00:05:57.160 --> 00:06:01.120
can actually identify, oh, this part of the code, here's slow,
110
00:06:01.959 --> 00:06:06.079
so bye by turning that on and off, like all
111
00:06:06.079 --> 00:06:07.439
of it on or all of it off. If you
112
00:06:07.480 --> 00:06:10.759
try it all on, all all of it off. I
113
00:06:10.759 --> 00:06:13.399
don't know what our costs that data dog would be,
114
00:06:13.519 --> 00:06:16.879
but I'd be willing that data dog would even say, hey, stop, uh,
115
00:06:17.439 --> 00:06:24.240
you're overloading us, right, But no, that's the big thing
116
00:06:24.319 --> 00:06:28.519
is like turning not the base layer on, it's all
117
00:06:28.519 --> 00:06:33.959
the other little things they're optional. And then what those
118
00:06:33.959 --> 00:06:37.199
optional traces are where the valuable data is though, Like
119
00:06:37.839 --> 00:06:39.920
it's the stuff that you can figure within your own
120
00:06:39.959 --> 00:06:43.399
application that gives you way more insight. It's like, hey,
121
00:06:43.399 --> 00:06:45.920
I want to put a trace around this certain method
122
00:06:46.240 --> 00:06:48.720
because I think it's slow. And then sometimes you do
123
00:06:48.800 --> 00:06:52.079
that and you're like, oh, that's fast. Where's the slum part?
124
00:06:52.480 --> 00:06:55.360
But if you put if you put that around enough thing,
125
00:06:55.680 --> 00:06:59.800
enough things, and we basically our main application, at least
126
00:06:59.839 --> 00:07:03.600
the ticketing inside of the application, we've we got the
127
00:07:03.639 --> 00:07:07.959
observability layer, like just it's covering almost everything. So if
128
00:07:08.040 --> 00:07:11.240
a certain customer starts to have slow response times, we
129
00:07:11.319 --> 00:07:13.639
just turn it on. Really, oh, we can focus on
130
00:07:13.759 --> 00:07:16.000
this part of the code and make the customer faster.
131
00:07:17.399 --> 00:07:18.839
I got you. That makes sense.
132
00:07:21.639 --> 00:07:24.319
But let's see what what am I doing now? Right now?
133
00:07:24.920 --> 00:07:27.000
I'm doing something that's not in my talk. It wasn't
134
00:07:27.079 --> 00:07:31.560
my talk, but it's also interesting. I think if you're
135
00:07:31.639 --> 00:07:33.959
a big company or you're a small company, you might go, well,
136
00:07:34.000 --> 00:07:38.560
why is that hard, And that would be we're changing
137
00:07:38.600 --> 00:07:42.399
the default scope for our main ticketing object. And the
138
00:07:42.480 --> 00:07:44.879
reason why we're doing that we're adding new columns to
139
00:07:46.000 --> 00:07:48.680
and it just seems like, okay, we just change the queries.
140
00:07:48.720 --> 00:07:51.199
Well you change every single query. You also have to
141
00:07:51.279 --> 00:07:53.480
change every index from out from under the hood, and
142
00:07:53.519 --> 00:07:58.439
you have to never have downtime and adding aex alone
143
00:07:58.920 --> 00:08:03.160
on our ticketing tables, they're just so huge. You can't
144
00:08:03.199 --> 00:08:08.040
just say, hey, DBAs add this. They'll say no to you.
145
00:08:08.879 --> 00:08:11.279
So you can lock that table for I don't know
146
00:08:11.319 --> 00:08:12.879
a few days exactly.
147
00:08:13.120 --> 00:08:17.000
You can't do. So it is a juggling act that
148
00:08:17.519 --> 00:08:19.560
luckily I don't have to deal with the DBA side
149
00:08:19.560 --> 00:08:22.839
of it. I don't know what the problems are. And essentially,
150
00:08:23.639 --> 00:08:26.680
when we move from a raw two to a RORA three,
151
00:08:27.160 --> 00:08:30.079
it did two things. First off, it made some problems bigger,
152
00:08:30.240 --> 00:08:33.519
so it made this a direction we needed to go.
153
00:08:34.000 --> 00:08:39.960
But also have you heard of invisible indices? No, So
154
00:08:40.000 --> 00:08:43.679
invisible indices is kind of what sounds like. Essentially, you
155
00:08:43.720 --> 00:08:46.120
have an index and a lot of times you're scared,
156
00:08:46.159 --> 00:08:49.759
too scared to delete any index because if you delete
157
00:08:49.759 --> 00:08:53.240
an index, it's gone and maybe you actually affected your application.
158
00:08:53.799 --> 00:08:57.039
So invisible basically says make it invisible. It's still there.
159
00:08:57.320 --> 00:09:00.799
The sequel is still populating that index to make it
160
00:09:00.840 --> 00:09:04.480
actually work, but you can see are there performance problems
161
00:09:04.480 --> 00:09:09.120
with it? So we have not deleted an index for
162
00:09:09.200 --> 00:09:11.600
fifteen years of our application, and now we're actually able
163
00:09:11.639 --> 00:09:13.919
to go in and say, hey, if we actually delete
164
00:09:13.960 --> 00:09:16.679
these induses, we can add new ones because we the
165
00:09:16.720 --> 00:09:21.759
memory profile won't blow up. So that is the the
166
00:09:23.000 --> 00:09:25.879
saving grace of allowing us to actually do this whole project.
167
00:09:26.120 --> 00:09:32.200
Without that, we'd be too scared because well, having things
168
00:09:32.320 --> 00:09:35.519
break is scary, a lout of money.
169
00:09:36.600 --> 00:09:37.799
So I'm curious.
170
00:09:39.200 --> 00:09:43.279
I mean, I've deleted indices off of databases that I've
171
00:09:43.279 --> 00:09:46.320
worked on, but i haven't done it on like very
172
00:09:46.360 --> 00:09:49.440
large tables. I've added into ses on very large tables
173
00:09:49.480 --> 00:09:56.080
and watched the thing go ah, But deleting them doesn't
174
00:09:56.120 --> 00:09:58.039
seem to have that same effect. So is there a
175
00:09:58.080 --> 00:10:01.639
downside to deleting them other than some queries that use
176
00:10:01.639 --> 00:10:03.120
those indicies might slow down.
177
00:10:03.480 --> 00:10:06.480
Right, and you don't know what, like like when your
178
00:10:06.559 --> 00:10:11.399
application is I think we have over I'm guessing to
179
00:10:11.440 --> 00:10:13.200
have over a thousand repos for example.
180
00:10:13.799 --> 00:10:14.120
Uh huh.
181
00:10:15.159 --> 00:10:21.120
You can't figure out whether you have beat down every
182
00:10:21.600 --> 00:10:24.639
location where every query that actually hits this. There's actually
183
00:10:25.240 --> 00:10:28.879
I had to go through every query in our main
184
00:10:29.480 --> 00:10:33.759
API and we separate our queries by the API queries,
185
00:10:33.799 --> 00:10:37.879
and we separate it by non API queries. Let's just
186
00:10:38.159 --> 00:10:41.799
that way. And the API queries is a manageable list
187
00:10:41.879 --> 00:10:44.519
of things that it's like a couple hundred queries to
188
00:10:44.679 --> 00:10:47.240
the ticketing table that actually happens. You can wrap your
189
00:10:47.240 --> 00:10:50.639
head around that. But the non to API queries, I
190
00:10:50.759 --> 00:10:54.720
think it was over forty thousand different unique queries. Oh wow,
191
00:10:55.039 --> 00:10:58.399
go through each query and say would this index work
192
00:10:58.440 --> 00:11:00.600
with this index work with no? No, no, no no.
193
00:11:01.600 --> 00:11:05.480
So so it is complex.
194
00:11:06.240 --> 00:11:07.679
So what's your approach to that then?
195
00:11:08.440 --> 00:11:13.120
Uh? So that luckily the things we care more about
196
00:11:13.159 --> 00:11:16.960
are the API queries, so we absolutely make sure that
197
00:11:16.960 --> 00:11:21.399
those actually are working, and the non API queries. We're
198
00:11:21.399 --> 00:11:24.399
actually moving a lot of that stuff to elastic search anyways.
199
00:11:25.200 --> 00:11:28.080
So our long term fix is actually all those things
200
00:11:28.080 --> 00:11:31.879
are never actually going to need a query. So, and
201
00:11:31.960 --> 00:11:34.519
I don't know how the magic of that works, Like,
202
00:11:35.039 --> 00:11:36.759
oh wow, you don't even need a query to get
203
00:11:36.759 --> 00:11:39.879
the data. That's awesome. Okay, I'm guessing somebody's looking at
204
00:11:39.960 --> 00:11:42.200
en logs or something like that and they're throwing that
205
00:11:42.360 --> 00:11:46.480
information rate from the bin logs into seql. But I
206
00:11:46.519 --> 00:11:49.159
have That's that's magic to me.
207
00:11:49.440 --> 00:11:52.919
So I used, do you have anything you want to
208
00:11:52.960 --> 00:11:53.519
jump in with?
209
00:11:54.840 --> 00:12:04.879
Uh, haven't seen your talk. Probably probably some stupid questions. Really, Uh,
210
00:12:05.960 --> 00:12:09.200
what kind of like where do you normally find performance
211
00:12:09.320 --> 00:12:13.000
bottlenecks in like apps? You see? Because I know you
212
00:12:13.200 --> 00:12:18.080
primarily are you're working for zenders, you've probably worked on
213
00:12:18.120 --> 00:12:20.320
that product for quite a while. But I'm a freelancer,
214
00:12:20.399 --> 00:12:21.679
So I look at I look at a lot of
215
00:12:21.679 --> 00:12:24.120
code bases, and what I see and it's all it's
216
00:12:24.159 --> 00:12:27.720
all rails. And what I see most of the time
217
00:12:27.840 --> 00:12:31.279
is people just haven't thought through the database design properly
218
00:12:31.960 --> 00:12:36.360
and they're doing all these funky joins or even worse,
219
00:12:36.519 --> 00:12:39.080
getting stuff out of the database and doing things in
220
00:12:39.159 --> 00:12:42.840
memory that you could quite easily do in the database.
221
00:12:43.000 --> 00:12:46.720
And it's like it's quite common mistakes like that is
222
00:12:46.759 --> 00:12:52.720
where I usually find performance bottlenecks. What's your experience in
223
00:12:52.759 --> 00:12:53.320
that regard.
224
00:12:53.759 --> 00:12:56.759
So the worst areas are where they add funky joints
225
00:12:56.840 --> 00:13:03.200
because sometimes you can't solve the is very easily. The
226
00:13:03.639 --> 00:13:06.960
talk was actually more focused on the coding aspect, like
227
00:13:07.080 --> 00:13:10.600
just simple things that people do that they should know
228
00:13:10.679 --> 00:13:14.919
about that they just don't do. So, for example, just
229
00:13:15.000 --> 00:13:19.840
memorization and a little different memorization techniques. And one of
230
00:13:19.919 --> 00:13:22.639
the cool things I brought up a zendes that we
231
00:13:22.679 --> 00:13:26.279
do is we have what I it's kind of like
232
00:13:26.279 --> 00:13:30.360
a singleton, but it's not. It's so our account object.
233
00:13:30.519 --> 00:13:32.519
If you get an account, it doesn't matter how you
234
00:13:32.559 --> 00:13:37.039
get that account. In the request cycle, you only need
235
00:13:37.080 --> 00:13:39.960
one account object. So if you call it tickets dot account,
236
00:13:40.080 --> 00:13:41.799
or if you call user dot account, or if you
237
00:13:41.840 --> 00:13:45.720
call just get me the account through this method called
238
00:13:45.799 --> 00:13:48.320
fetch account that we have, any way you get the account,
239
00:13:48.360 --> 00:13:51.360
it is the same exact object. So one of the
240
00:13:51.399 --> 00:13:53.360
cool things you can do based on that. So if
241
00:13:53.360 --> 00:13:57.759
you get the same object, if you memoize your whatever
242
00:13:57.759 --> 00:14:01.000
you're trying to memorize based on that one object, you
243
00:14:01.080 --> 00:14:07.679
can instead of actually have a request where hey listen,
244
00:14:07.720 --> 00:14:10.000
I'm going to memorize it on this object. But then
245
00:14:10.240 --> 00:14:12.960
someplace else in the application, your memoir. You want to
246
00:14:13.039 --> 00:14:15.039
use that, but you can't. You can't get to that
247
00:14:15.120 --> 00:14:18.840
original object. We can actually memorize it on this god object,
248
00:14:19.360 --> 00:14:22.919
and wherever we call that method again, it is memorized.
249
00:14:23.559 --> 00:14:27.120
So that was I thought, a really cool way of
250
00:14:27.360 --> 00:14:31.279
actually going about like memorizing something is having that god object,
251
00:14:31.519 --> 00:14:34.840
and then you don't have to worry about Okay, and
252
00:14:34.879 --> 00:14:37.720
the presenter we're calling it this way. In the controller
253
00:14:37.759 --> 00:14:39.360
we're calling it this way, and the models we're calling
254
00:14:39.440 --> 00:14:43.159
it this way. But we cannot tie those spaghetti pieces
255
00:14:43.159 --> 00:14:45.519
of code together. But because we have that god object,
256
00:14:45.639 --> 00:14:48.120
we can memorize it in one place and always access
257
00:14:48.200 --> 00:14:50.960
the same data throughout and then never have to worry
258
00:14:51.000 --> 00:14:53.720
about That was a cool thing that actually, well that
259
00:14:53.799 --> 00:14:54.519
was in the talk.
260
00:14:54.799 --> 00:14:57.279
But really, what are you use it for that or
261
00:14:57.360 --> 00:15:00.000
using current attributes or something else.
262
00:15:00.039 --> 00:15:03.039
Far as making it a god object. I wish I
263
00:15:03.120 --> 00:15:05.440
knew that was well before I came into But I
264
00:15:05.480 --> 00:15:09.639
think we're basically we created a method called fetch account
265
00:15:10.360 --> 00:15:15.080
and one we call fetch account outside there, and then
266
00:15:15.519 --> 00:15:22.120
in probably active record we override the account method an
267
00:15:22.159 --> 00:15:24.960
active record, not even every one of our models has
268
00:15:25.159 --> 00:15:28.120
an account method, so I'm guessing we override that and
269
00:15:28.200 --> 00:15:33.279
just memoize the account in the instant variable and it
270
00:15:33.279 --> 00:15:35.919
always goes back to that incident. That's just a guess.
271
00:15:36.759 --> 00:15:38.679
I've not actually looked at that code because I haven't
272
00:15:38.720 --> 00:15:41.320
needed to. And I was actually asked that at Rails World.
273
00:15:41.320 --> 00:15:44.559
I should actually really get into it, but the person
274
00:15:44.559 --> 00:15:47.840
who knows that best just left send us, so I'll
275
00:15:47.879 --> 00:15:51.320
have to dive into code instead of ask questions.
276
00:15:51.720 --> 00:15:54.799
Yeah, I thought current doctributes are probably a bit new.
277
00:15:55.720 --> 00:16:00.000
Came and five or something that we.
278
00:16:00.200 --> 00:16:03.559
Just upgraded to. Did we hit Rails eight yet seven?
279
00:16:04.360 --> 00:16:07.639
Either way? Like, it's so good to be closer to
280
00:16:07.759 --> 00:16:14.399
the edge. We're definitely on Rails seven for application. We're
281
00:16:14.399 --> 00:16:19.200
on Rails four for like six years or something like that.
282
00:16:19.279 --> 00:16:23.360
Who's so good to be closer to the edge.
283
00:16:25.039 --> 00:16:27.559
Yeah, I've experienced that too. For a long time, I
284
00:16:27.600 --> 00:16:31.960
was working on like Rails four five apps, and yeah,
285
00:16:32.080 --> 00:16:33.720
the last year or so, I've been able to work
286
00:16:33.759 --> 00:16:38.399
on Rail seven and Rails eight apps now. And what's
287
00:16:38.440 --> 00:16:40.320
fun is you get to go back now and figure
288
00:16:40.360 --> 00:16:42.480
out all the stuff that's been added in since. So,
289
00:16:43.159 --> 00:16:45.519
you know, I got into like stimulus and Turbo, and
290
00:16:45.559 --> 00:16:48.600
then figured out that oh look, Turbo actually will work
291
00:16:48.639 --> 00:16:54.440
through your what's it action cable channels and so you
292
00:16:54.480 --> 00:16:57.559
can you can push updates when you have sort of
293
00:16:57.600 --> 00:17:01.679
out of band anyway, just all this stuff that it's like, okay,
294
00:17:01.799 --> 00:17:04.759
I don't now need a full cycle to get this
295
00:17:05.319 --> 00:17:06.319
these features to work.
296
00:17:06.680 --> 00:17:08.599
So, being at a bigger company and we started on
297
00:17:08.759 --> 00:17:13.160
Rails one or something like that, upgrading through there's obviously
298
00:17:13.240 --> 00:17:17.440
monkey patches like throughout the years because well rails didn't
299
00:17:17.440 --> 00:17:19.759
have certain things and now they do, and now taking
300
00:17:19.759 --> 00:17:23.200
those monkey patches away is hard, which also means that
301
00:17:23.599 --> 00:17:27.119
really adding the newest features of Rails is hard, in
302
00:17:27.160 --> 00:17:30.359
fact almost impossible. But what we can do is like,
303
00:17:30.599 --> 00:17:33.880
for example, is like, yeah, this week we upgraded to
304
00:17:34.079 --> 00:17:35.799
Rails three to three, and all of a sudden, the
305
00:17:35.799 --> 00:17:38.519
performance got a lot better. But also, like let's say.
306
00:17:38.359 --> 00:17:42.039
In Ruby three yeah, or Ruby three three.
307
00:17:41.839 --> 00:17:43.960
Sorry, Rails three three yeah.
308
00:17:44.119 --> 00:17:46.680
I do remember upgrading to Rails three three back in
309
00:17:46.720 --> 00:17:47.440
the day, but.
310
00:17:47.839 --> 00:17:50.839
I remember upgrading the Rails three from two. That was hard.
311
00:17:50.960 --> 00:17:52.839
But that was brutal. That was brutal.
312
00:17:53.400 --> 00:17:54.519
That was the mob.
313
00:17:55.480 --> 00:18:02.720
Yeah, it was yeah, it is the herb Any long before.
314
00:18:03.279 --> 00:18:04.640
I don't have those, cause.
315
00:18:05.359 --> 00:18:06.799
Oh I haven't.
316
00:18:07.119 --> 00:18:09.480
Who'da did a ton of work on that? Yeah, it
317
00:18:09.519 --> 00:18:11.359
was it was brutal.
318
00:18:12.799 --> 00:18:15.119
But uh, where was I going with this? Oh? I
319
00:18:15.200 --> 00:18:17.880
forgot my train of thought.
320
00:18:18.400 --> 00:18:19.839
Upgraded to Ruby three.
321
00:18:20.599 --> 00:18:24.599
Upgraded Ruby three. I don't think I'm going to remember
322
00:18:24.599 --> 00:18:29.079
what I was thinking about. Oh, and like, for example,
323
00:18:29.119 --> 00:18:33.480
with Ruby three, Uh, we had in our application. We
324
00:18:33.480 --> 00:18:37.119
were very scared because we allowed, we had and still
325
00:18:37.279 --> 00:18:41.599
do allow customers to add their own rej axes. Well,
326
00:18:41.599 --> 00:18:43.880
if you had your own rejects, you can really slow
327
00:18:43.960 --> 00:18:48.079
down and stop you're you can just kill an application
328
00:18:48.160 --> 00:18:50.880
if you allowed the end users. So we had some
329
00:18:51.000 --> 00:18:53.720
weird way of actually making it so they couldn't just
330
00:18:53.839 --> 00:18:57.720
kill our system. But it spun up a process, and
331
00:18:57.720 --> 00:19:00.559
that's spinning up a process took about a half second second.
332
00:19:00.880 --> 00:19:04.200
Let's just say to actually spin up so it would run,
333
00:19:04.319 --> 00:19:08.000
and it make sure that rejects would never actually just
334
00:19:08.119 --> 00:19:11.079
be infinitely running. It would time it out at a
335
00:19:11.119 --> 00:19:16.039
certain point. But doing that was well added a half
336
00:19:16.119 --> 00:19:20.599
second every request. For example, Ruby three allows you to
337
00:19:20.640 --> 00:19:25.960
actually by default have a timeout in your rejexes. So
338
00:19:26.039 --> 00:19:28.880
now were in that extra process up. So now if
339
00:19:28.880 --> 00:19:33.440
you're all most cases you're just running in rejects, that
340
00:19:33.519 --> 00:19:38.079
takes a millisecond or two. Those other cases that actually
341
00:19:38.160 --> 00:19:42.799
do time out, those do time out just by default.
342
00:19:42.839 --> 00:19:44.759
With Ruby, we didn't have to actually do this weird
343
00:19:44.880 --> 00:19:48.680
fancy trick to actually make it happen. So that was
344
00:19:48.720 --> 00:19:53.039
actually a very very big upgrade for us because we've
345
00:19:53.079 --> 00:19:56.559
had those rejects, allowed people to put rejects's in forever,
346
00:19:56.599 --> 00:19:59.480
and we've had to protect against it forever, and that's
347
00:19:59.599 --> 00:20:05.000
just just bad. I think I would have if I
348
00:20:05.039 --> 00:20:07.160
was around way back then, it probably was like, no,
349
00:20:07.319 --> 00:20:09.880
don't let them put their own rejectses and give them
350
00:20:09.960 --> 00:20:11.920
an array of things that they can do. Don't give
351
00:20:11.960 --> 00:20:19.759
them an infinite array, right yeah, but but yeah, of
352
00:20:19.839 --> 00:20:25.240
our upgrades, it is just like looking at the code
353
00:20:25.279 --> 00:20:32.200
that's old, and people don't when it is an application
354
00:20:32.279 --> 00:20:35.960
is as big as it is. People cannot wrap their
355
00:20:36.000 --> 00:20:40.240
head around the whole ticket, save request of the cycles.
356
00:20:40.279 --> 00:20:44.680
Because we have everything gets into the ticket, there's triggers,
357
00:20:44.759 --> 00:20:50.359
there's not just every layer, and essentially people can't wrap
358
00:20:50.359 --> 00:20:52.400
their head around that. So once you put traces around this,
359
00:20:52.720 --> 00:20:58.039
you find blatant like obvious mistakes and you just tackle
360
00:20:58.079 --> 00:20:59.599
them one at a time, and most of the time
361
00:20:59.680 --> 00:21:04.400
it's coding mistakes. It's not and it's not even a mistake.
362
00:21:05.039 --> 00:21:07.079
It was I got to get this feature out fast.
363
00:21:07.240 --> 00:21:09.240
People don't think about performance when you have to get
364
00:21:09.240 --> 00:21:15.480
it out within a week. Right. But it's been good, actually,
365
00:21:15.640 --> 00:21:18.519
like the amount that we've saved and the ticket cycle
366
00:21:18.640 --> 00:21:22.000
and just not even ticket now we're actually since we
367
00:21:22.119 --> 00:21:24.319
did such a good job, we've been given more and
368
00:21:24.359 --> 00:21:27.200
more freedom to actually work in random areas of the code,
369
00:21:27.240 --> 00:21:31.240
and just the amount of improvements that we've made. You
370
00:21:31.279 --> 00:21:37.640
don't think of little coding things like, for example, scopes
371
00:21:37.759 --> 00:21:44.200
versus conditional associations, like a scope. Every time you call
372
00:21:44.240 --> 00:21:47.480
a scope, Rails makes the query. If you have a
373
00:21:47.480 --> 00:21:51.279
conditional association, it makes a query and Rails by default
374
00:21:51.680 --> 00:21:57.759
has that query cashed up. Just making that switch will
375
00:21:58.160 --> 00:22:01.720
reduce the number of queries, and sometimes queries aren't very free,
376
00:22:01.759 --> 00:22:04.160
so all of a sudden, you've just saved time. There
377
00:22:05.279 --> 00:22:10.079
so many N plus one queries where that so?
378
00:22:10.079 --> 00:22:13.279
So were you advocating for scopes or for.
379
00:22:15.279 --> 00:22:20.079
Both? Most of the time conditional queries when when when
380
00:22:20.119 --> 00:22:23.200
you're trying to like tweak the last bit of performance.
381
00:22:24.079 --> 00:22:29.720
I would be advocating for conditional association. Okay, scopes are
382
00:22:29.720 --> 00:22:33.160
not evil, it's just sometimes people don't realize. You know,
383
00:22:33.319 --> 00:22:37.119
I'm using this in the scope within a loop for example.
384
00:22:38.000 --> 00:22:39.359
Uh huh, And.
385
00:22:39.279 --> 00:22:42.599
All of a sudden, I'm getting like like just query
386
00:22:42.640 --> 00:22:44.480
after query after query, where if you don't put it
387
00:22:44.519 --> 00:22:46.759
in a loop, and you if you use a conditional association,
388
00:22:47.240 --> 00:22:49.680
that loop makes one query and you're you're.
389
00:22:49.559 --> 00:22:53.319
Done right, So it automatically eliminates the N plus one query.
390
00:22:53.359 --> 00:22:59.000
Is what you're saying, Yeah, well, yes, yes, but N
391
00:22:59.039 --> 00:23:01.400
plus one query. I always think of n plus one
392
00:23:01.480 --> 00:23:03.799
queriers is the things that you can add just includes
393
00:23:03.839 --> 00:23:06.799
in and it just goes away. Yeah generally, yeah, but
394
00:23:06.880 --> 00:23:09.119
this is an N plus one query that generates itself
395
00:23:09.200 --> 00:23:09.759
a different way.
396
00:23:10.640 --> 00:23:14.759
Yeah, if it was to do like some if I've
397
00:23:15.000 --> 00:23:16.799
just built like a new feature and I just want
398
00:23:16.839 --> 00:23:21.839
to reassure myself that I haven't made any stupid performance
399
00:23:21.880 --> 00:23:26.200
mistakes or or anything like that. Like because again, like
400
00:23:26.400 --> 00:23:29.240
with the work I do, it tends to perform, Like
401
00:23:29.400 --> 00:23:31.960
performance doesn't really come into it because I tend to
402
00:23:31.960 --> 00:23:36.720
work with startups and stuff, like what how do I
403
00:23:36.799 --> 00:23:41.200
just go about like even testing like certain things in
404
00:23:41.319 --> 00:23:44.279
my local dev environment in terms of like what do
405
00:23:44.319 --> 00:23:46.319
I put in my Ruby good to check how long
406
00:23:46.359 --> 00:23:48.079
stupp is taking? I don't even know that. That's how
407
00:23:48.119 --> 00:23:51.599
stupid this question is, because you know, back to the basics.
408
00:23:52.079 --> 00:23:55.160
You know, we have this debate all the time with
409
00:23:55.279 --> 00:23:58.640
internally because essentially the only way to find out is
410
00:23:58.759 --> 00:24:01.720
to have our huge customers. I don't name the customers,
411
00:24:01.759 --> 00:24:04.480
but we have a few huge, wile customers, and you
412
00:24:04.519 --> 00:24:06.640
put it on and you're going to find the problem
413
00:24:06.759 --> 00:24:10.759
very quickly. But then there's also the aspect of a
414
00:24:10.799 --> 00:24:14.920
new feature. Even when you deploy it looks great because
415
00:24:14.960 --> 00:24:18.720
nobody's using it right. Then two years later somebody uses
416
00:24:18.720 --> 00:24:23.160
it in a way that you don't anticipate. Reactive development
417
00:24:23.279 --> 00:24:25.720
isn't terrible. I would say, at the end of the day,
418
00:24:25.759 --> 00:24:28.960
your objective when you first get out is if you
419
00:24:28.960 --> 00:24:31.440
write the code clean, you can clean it up later.
420
00:24:32.359 --> 00:24:36.039
If you don't write the code clean, cleaning it up
421
00:24:36.119 --> 00:24:40.880
later is almost impossible. So I would say for feature developers,
422
00:24:41.480 --> 00:24:44.720
focus on keeping it clean, because once it's clean and
423
00:24:44.759 --> 00:24:49.079
it's very easy to read, somebody else can maintain it later.
424
00:24:49.200 --> 00:24:53.279
Then I would say that that's the case for like
425
00:24:53.400 --> 00:24:56.559
any small startup. Just focus on cleaning and a lot
426
00:24:56.559 --> 00:25:02.359
of different just review code and actually have an old job.
427
00:25:02.640 --> 00:25:06.599
I had. There's a guy he he hated me. He
428
00:25:06.680 --> 00:25:11.880
loved me, but I was just me because I would
429
00:25:11.880 --> 00:25:14.519
always review code and I would be like a stickler
430
00:25:14.559 --> 00:25:17.799
on making it really easy to read and maintainable and
431
00:25:17.799 --> 00:25:21.200
stuff like that. He was hated me, and then he
432
00:25:21.240 --> 00:25:23.759
eventually left that company, and I left that company, and
433
00:25:24.119 --> 00:25:27.839
I'm talking to old people and I've heard him say
434
00:25:28.359 --> 00:25:31.480
I miss Dave. Oh my god, I hated when he
435
00:25:31.559 --> 00:25:33.400
reviewed our code. But now I'm at a company that
436
00:25:33.440 --> 00:25:36.000
doesn't review code, and the crap that comes in here,
437
00:25:36.319 --> 00:25:41.160
we can't maintain it. Yeah, maintainability is ninety percent of
438
00:25:41.200 --> 00:25:43.200
getting your speed out of it, because if it's easy
439
00:25:43.200 --> 00:25:46.079
to maintain, it's easy. He don't want to add the
440
00:25:46.599 --> 00:25:51.000
the best trick for speed day one anyways, because if
441
00:25:51.000 --> 00:25:55.440
the code is never used, who cares if it runs
442
00:25:55.559 --> 00:25:58.880
a little, if it runs a two milliseconds slower, who
443
00:25:58.880 --> 00:26:01.480
cares care about the features that all of a sudden
444
00:26:01.559 --> 00:26:07.480
get like traction to make performance improvements? And then somebody,
445
00:26:08.200 --> 00:26:10.680
a team like mine is probably always required a big
446
00:26:10.720 --> 00:26:13.599
company is because eventually you get big enough where all
447
00:26:13.599 --> 00:26:16.000
of a sudden, hey ten years ago, people weren't paying
448
00:26:16.039 --> 00:26:23.920
attention to performance and now needs to and well, yeah, focus,
449
00:26:24.000 --> 00:26:25.880
done well.
450
00:26:25.680 --> 00:26:26.799
To your point on this.
451
00:26:28.400 --> 00:26:32.359
So we're actually running into performance issues on this application
452
00:26:32.400 --> 00:26:35.799
that I'm working on now for client. And what it
453
00:26:35.839 --> 00:26:39.640
does is it it does this gigantic calculation across a
454
00:26:39.640 --> 00:26:45.039
whole bunch of transactions on a hedge fund. And the
455
00:26:45.039 --> 00:26:48.279
people that wrote it, I mean, it's impossible to read,
456
00:26:50.279 --> 00:26:52.400
and so you know, you're trying to just parse through
457
00:26:52.400 --> 00:26:52.880
it and go.
458
00:26:52.839 --> 00:26:54.680
Okay, what what is it doing?
459
00:26:55.359 --> 00:26:57.799
And it's super hard, right, But the thing is is
460
00:26:57.839 --> 00:27:00.839
that it's it's in a psyche job. So it gets
461
00:27:00.920 --> 00:27:03.400
kicked off and you know, it runs, and you know,
462
00:27:03.480 --> 00:27:05.599
if it's a large fund, it can run forty five minutes,
463
00:27:05.640 --> 00:27:11.240
an hour, two hours, and you know, I'm looking at
464
00:27:11.240 --> 00:27:13.400
it and what we're you know, we had the conversation
465
00:27:13.519 --> 00:27:15.799
where we're saying, well, it'd be really nice to break
466
00:27:15.799 --> 00:27:18.519
this up, right so that you can parallelize some of
467
00:27:18.559 --> 00:27:20.799
the work because you have multiple workers, and so you
468
00:27:20.839 --> 00:27:24.440
know that would make it faster. And just getting to
469
00:27:24.480 --> 00:27:26.359
the point where we can actually figure out where to
470
00:27:26.400 --> 00:27:31.160
break it apart. Has been just I mean, it's been ugly,
471
00:27:31.640 --> 00:27:33.839
and you know, yeah, if it had been written in
472
00:27:33.920 --> 00:27:38.400
just a maintainable way, like you're talking about, where it's like, okay,
473
00:27:38.440 --> 00:27:41.680
I see where this kind of breaks down and you know,
474
00:27:41.759 --> 00:27:44.039
where it kind of goes into these methods and comes
475
00:27:44.079 --> 00:27:48.680
back out, it'd be way easier to do because it's like, Okay,
476
00:27:48.680 --> 00:27:51.000
we can turn these things into these things, and we
477
00:27:51.000 --> 00:27:52.200
can do these.
478
00:27:52.000 --> 00:27:52.720
Things over here.
479
00:27:52.839 --> 00:27:55.480
We can put these safeguards in place to make sure
480
00:27:55.480 --> 00:27:59.640
that it's not changing anything it shouldn't. But yeah, it's
481
00:27:59.640 --> 00:28:02.839
going to be a major overhaul, but it's like the
482
00:28:02.880 --> 00:28:06.119
core of the app, and so it's something that we're
483
00:28:06.160 --> 00:28:08.559
going to have to do. And so it's just been
484
00:28:08.599 --> 00:28:11.200
interesting to sit there and think about, Okay, yeah, if
485
00:28:11.200 --> 00:28:15.200
this had been written in a maintainable, readable, understandable manner, right,
486
00:28:15.319 --> 00:28:17.640
we're not even talking about how it executes or how
487
00:28:17.640 --> 00:28:20.240
fast it is in any other way, it would have
488
00:28:20.279 --> 00:28:22.400
made the fixes that we have to make to it
489
00:28:22.440 --> 00:28:28.119
now so much, so much easier. Yeah, And ninety percent
490
00:28:28.119 --> 00:28:30.079
of the problem is is that since it's all in
491
00:28:30.119 --> 00:28:36.279
one job, it's it does everything serially right. It does
492
00:28:36.279 --> 00:28:41.480
the whole process in one run without outsourcing any of
493
00:28:41.519 --> 00:28:41.839
the work.
494
00:28:42.720 --> 00:28:45.839
Yeah, everybody's ran into that application where they have a
495
00:28:45.880 --> 00:28:48.279
twenty six thousand line file and you're.
496
00:28:48.119 --> 00:28:52.920
Like what, Yeah, yeah, I don't think this one was
497
00:28:52.960 --> 00:28:55.400
twenty six thousand, but it's a few thousand at least.
498
00:28:56.119 --> 00:28:58.480
I'm thinking about a very specific contract they had a
499
00:28:58.480 --> 00:28:58.839
long time.
500
00:28:59.000 --> 00:29:02.880
Oh I'm sure. Yeah.
501
00:29:03.240 --> 00:29:05.400
Oh god, my one of my co workers worked at
502
00:29:05.400 --> 00:29:08.240
that job too. So if he listens to this, which
503
00:29:08.240 --> 00:29:10.079
I'm sure you will, he'll get a good laugh out
504
00:29:10.119 --> 00:29:13.039
of my comment right there. Yeah.
505
00:29:13.119 --> 00:29:15.880
But but it's interesting because, yeah, when we talk about performance,
506
00:29:15.920 --> 00:29:20.519
we don't often talk about clean code maintainability, you know,
507
00:29:20.720 --> 00:29:25.240
and and those kinds of things, because we're just talking about, yeah,
508
00:29:25.240 --> 00:29:27.319
what are the tweaks we can make?
509
00:29:27.359 --> 00:29:28.720
And then when we get into it.
510
00:29:28.759 --> 00:29:30.599
This is the other thing that I'm kind of pulling
511
00:29:30.640 --> 00:29:33.400
out of what you've been talking about, is that a
512
00:29:33.440 --> 00:29:35.359
lot of times the things that we're doing are not
513
00:29:35.599 --> 00:29:39.119
just simple fixes, right, because you know N plus one queries,
514
00:29:39.119 --> 00:29:40.920
it's like, okay, drop it includes.
515
00:29:40.480 --> 00:29:41.079
On it, right.
516
00:29:42.079 --> 00:29:44.039
You know, you want to make your query faster at
517
00:29:44.079 --> 00:29:47.279
an index, right, And most of the time. Those simple
518
00:29:47.319 --> 00:29:50.359
fixes will get you a long way, but you know,
519
00:29:50.440 --> 00:29:52.720
you get too far down the line, and yeah, all
520
00:29:52.720 --> 00:29:54.799
of a sudden, it's I have to restructure this to
521
00:29:54.880 --> 00:29:57.400
run a different way, or it's not gonna write in
522
00:29:57.480 --> 00:30:00.000
order to speed it up, or you know, there's gonna
523
00:30:00.160 --> 00:30:03.720
be some some massive infrastructure changes in order to make
524
00:30:03.720 --> 00:30:06.319
this faster, or you know, I have to change the
525
00:30:06.359 --> 00:30:08.920
way I'm doing caching or something like that, where it's
526
00:30:08.960 --> 00:30:12.200
not just this straightforward Oh okay, here's a shortcut. You
527
00:30:12.279 --> 00:30:15.400
got some speed out of it, and there are those
528
00:30:15.440 --> 00:30:18.359
I'm not saying they're not, but at a certain point,
529
00:30:18.440 --> 00:30:21.200
you get to that place where it's like, okay, all
530
00:30:21.240 --> 00:30:25.160
the all the quick fixes on this are done, and
531
00:30:25.240 --> 00:30:26.480
it's still not good enough.
532
00:30:26.519 --> 00:30:27.160
So now what?
533
00:30:28.599 --> 00:30:32.680
And if your code is maintainable, if you know, if
534
00:30:32.720 --> 00:30:34.759
you can approach it and understand it and know how
535
00:30:34.799 --> 00:30:38.440
to change it, it makes that job a lot easier.
536
00:30:39.279 --> 00:30:42.359
But it's it's also interesting because I've worked contracts where
537
00:30:42.359 --> 00:30:44.279
it's like I'm not I'm not going to pay you
538
00:30:44.319 --> 00:30:46.000
to write tests, and I'm not going to pay it
539
00:30:46.039 --> 00:30:48.160
a refactor, and I'm not going to pay it right
540
00:30:48.519 --> 00:30:52.319
and and I'm looking at them and going you realize
541
00:30:52.440 --> 00:30:55.359
that I'm going to be faster for the first like month,
542
00:30:56.200 --> 00:30:59.359
and then after that I'm going to have to refactor
543
00:30:59.480 --> 00:31:02.839
or write test in order to understand what the hell
544
00:31:02.839 --> 00:31:05.559
what this even does so that I can make it
545
00:31:05.599 --> 00:31:07.480
do what you want or change what it does.
546
00:31:08.160 --> 00:31:13.480
M Oh yeah, yeah. Without tests, I wouldn't be able
547
00:31:13.519 --> 00:31:16.559
to do any of my work right. That that is
548
00:31:16.599 --> 00:31:19.759
the key. And we don't have perfect test nobody probably does,
549
00:31:20.440 --> 00:31:22.599
but we have enough tests where all of a sudden,
550
00:31:22.640 --> 00:31:25.440
you change something and you can feel have a relative confidence.
551
00:31:25.480 --> 00:31:27.839
And I think that is another thing about performance work
552
00:31:27.839 --> 00:31:31.079
that you can't be afraid to change things and break it,
553
00:31:31.160 --> 00:31:35.359
which means you need to have software switches everywhere where
554
00:31:35.359 --> 00:31:38.440
you're turning it on and you're seeing if you broke.
555
00:31:38.799 --> 00:31:43.640
We've had extremely good luck within my UH group of
556
00:31:44.000 --> 00:31:47.920
turning these switches on and not breaking things. But if
557
00:31:48.000 --> 00:31:51.839
without those switches and while the monitors that you set up,
558
00:31:52.359 --> 00:31:55.599
you can't change anything because of fear, fear develop your
559
00:31:55.680 --> 00:31:58.279
driven development. It's like for it talking about before, it's
560
00:31:58.279 --> 00:32:00.920
like if you don't have like the indices that we
561
00:32:00.960 --> 00:32:02.920
took away, we didn't take it away because we're scared
562
00:32:03.680 --> 00:32:06.559
and was actually that was that before the show started.
563
00:32:06.599 --> 00:32:09.400
There's during the show that I talked about the indices
564
00:32:09.680 --> 00:32:11.359
forget anyways.
565
00:32:10.960 --> 00:32:13.079
I don't remember, yeah.
566
00:32:12.640 --> 00:32:17.359
Anyways, like yeah, so anyways, feared of a driven development
567
00:32:17.400 --> 00:32:20.680
will like slow down performance too because you don't, as
568
00:32:20.720 --> 00:32:23.440
you just said, you don't have tests. You're too scared
569
00:32:23.440 --> 00:32:28.200
to make any changes, like U will work And I
570
00:32:28.240 --> 00:32:30.480
don't know. My first couple jobs didn't have any tests.
571
00:32:30.480 --> 00:32:34.279
And then ever since then, I've had several jobs where
572
00:32:34.319 --> 00:32:36.799
I came in like nope, we're writing tests. No, I
573
00:32:36.839 --> 00:32:40.880
don't get No, we're not. No, yeah, we were writing
574
00:32:40.960 --> 00:32:45.079
tests and people are but how it's like, well, let's learn.
575
00:32:46.119 --> 00:32:46.559
Yeah.
576
00:32:46.640 --> 00:32:49.079
Well that's the other piece on the thing that I'm
577
00:32:49.119 --> 00:32:52.319
working on is there aren't tests and so it's like
578
00:32:52.440 --> 00:32:55.400
it's this mission critical thing that does all the valuations
579
00:32:55.400 --> 00:32:58.759
for all of the hedge funds and all of your customers.
580
00:32:59.440 --> 00:33:03.440
God and yeah, I mean I was just like you
581
00:33:03.640 --> 00:33:06.559
you want us to refactor this, but you know, but
582
00:33:06.640 --> 00:33:07.759
then I'm going putting a.
583
00:33:07.799 --> 00:33:13.200
Test on this is it's ugly, is so ugly.
584
00:33:13.960 --> 00:33:18.839
But the flip side is is that making it testable, right,
585
00:33:18.960 --> 00:33:21.160
writing the test will force us to refactor some of it.
586
00:33:21.960 --> 00:33:27.559
And when you wrote code without tests, typically methods all
587
00:33:27.559 --> 00:33:29.799
of a sudden go from I like to keep my
588
00:33:29.839 --> 00:33:33.079
methods within five lines of code and Ruby and Joba.
589
00:33:33.079 --> 00:33:35.359
I'm sure it would be different, but five lines of code,
590
00:33:35.440 --> 00:33:38.559
now that's not a rule, but you try to keep
591
00:33:38.599 --> 00:33:43.880
them small. Whereas if somebody wrote the original code without tests,
592
00:33:44.119 --> 00:33:48.039
usually they have one hundred let's just say, hundred line
593
00:33:48.079 --> 00:33:51.960
methods are not uncommon. Trying to test a hundred line
594
00:33:52.000 --> 00:33:57.440
method is like I felt, right, Uh, there's too many conditions.
595
00:33:57.440 --> 00:34:00.319
There's like seven ifs here I do.
596
00:34:02.119 --> 00:34:07.000
Yep, yeah, I I've heard that. I've heard that rule.
597
00:34:07.000 --> 00:34:08.280
I've heard that rule all the way up to like
598
00:34:08.320 --> 00:34:11.159
ten lines of code. Some people are a little bit
599
00:34:11.159 --> 00:34:14.440
more rigid on it than others. My rule of thumb
600
00:34:14.559 --> 00:34:17.480
is is if I'm talking to somebody and I'm explaining
601
00:34:17.519 --> 00:34:21.039
how something works, and I try and everything, that kind
602
00:34:21.039 --> 00:34:23.199
of happens at the same level, at the top level,
603
00:34:23.800 --> 00:34:28.800
right it it retrieves the you know, or maybe not
604
00:34:28.880 --> 00:34:31.000
even that right. That might be part of a lower step,
605
00:34:31.239 --> 00:34:35.119
but usually it's it makes sure that these conditions are
606
00:34:35.159 --> 00:34:38.159
met right, and then if the conditions are right, then
607
00:34:38.239 --> 00:34:42.000
it makes sure that you know it locks the table, right,
608
00:34:42.400 --> 00:34:44.119
does this other stuff in a transaction?
609
00:34:44.280 --> 00:34:44.400
Right?
610
00:34:44.559 --> 00:34:47.639
So there's this step right, Maybe the transaction is an
611
00:34:47.639 --> 00:34:50.880
implementation deal further down. But if I can say these
612
00:34:50.920 --> 00:34:54.079
are the five steps to do a thing right, and
613
00:34:54.119 --> 00:34:58.039
they're all mostly at the same conceptual level, then that's
614
00:34:58.159 --> 00:34:58.599
what my.
615
00:34:58.719 --> 00:34:59.719
Method should look like.
616
00:35:00.199 --> 00:35:02.159
And then underneath that it's like, okay, how do I
617
00:35:02.239 --> 00:35:05.880
do this stage of the theme right? And again at
618
00:35:05.880 --> 00:35:08.719
the conceptual level. And so once you start getting lower
619
00:35:08.760 --> 00:35:12.000
into the code or when I've written it, what you
620
00:35:12.039 --> 00:35:16.320
wind up seeing is is the bottom levels of the methods,
621
00:35:16.480 --> 00:35:19.119
they'll have some things that look like their implementation right
622
00:35:19.119 --> 00:35:21.719
where it's like I'm actually doing the query, and then
623
00:35:21.800 --> 00:35:24.760
maybe there's a and then call this to do the
624
00:35:24.760 --> 00:35:27.199
rest of the work because I feel like the retrieval
625
00:35:27.239 --> 00:35:30.079
and the work are at the same level. But you know,
626
00:35:30.239 --> 00:35:32.920
and then at the very bottom, yeah, it's just logic
627
00:35:33.760 --> 00:35:36.840
and just just being able to approach that and say, Okay,
628
00:35:37.039 --> 00:35:39.920
I see what the process is. Okay, I see what
629
00:35:39.960 --> 00:35:43.719
the process for this part of the process is. That's
630
00:35:43.800 --> 00:35:45.760
how I like to approach it. So yeah, so sometimes
631
00:35:45.760 --> 00:35:46.840
I wind up with a twenty or.
632
00:35:46.880 --> 00:35:48.519
Thirty line method.
633
00:35:49.880 --> 00:35:51.519
But at the end of the day, I'm looking at
634
00:35:51.559 --> 00:35:54.920
it and going, I understand, I can look at this
635
00:35:55.000 --> 00:35:55.840
and know what it does.
636
00:35:58.119 --> 00:36:00.400
I think if you can't look at the method and
637
00:36:00.480 --> 00:36:03.480
understand what a piece of it does, it's time to
638
00:36:03.480 --> 00:36:04.519
create another method name.
639
00:36:05.280 --> 00:36:06.679
Yeah, well that's another one.
640
00:36:06.880 --> 00:36:10.559
When I first got started, I kind of had this
641
00:36:10.719 --> 00:36:13.320
ethos from Rails where it was like, you know, they
642
00:36:13.320 --> 00:36:16.800
have convenient methods called like fine or you know, update
643
00:36:16.920 --> 00:36:18.519
or things like that, and I was like, okay, so
644
00:36:18.559 --> 00:36:20.960
I've got to come up with this short, you know,
645
00:36:21.119 --> 00:36:25.920
concise name nowadays is like updates the thing on the thing,
646
00:36:27.320 --> 00:36:29.679
because then you look at it and you're like, oh,
647
00:36:29.840 --> 00:36:30.800
I know what this does.
648
00:36:32.280 --> 00:36:34.960
I'll just make a guess on how many methods there
649
00:36:35.000 --> 00:36:38.360
are that we've created just on our ticket object, and
650
00:36:38.639 --> 00:36:41.039
it's got to be at least five hundred.
651
00:36:41.119 --> 00:36:42.159
I don't know whether that's time.
652
00:36:42.280 --> 00:36:48.679
Yeah, a thousand. You can't create little things, little update
653
00:36:49.679 --> 00:36:52.320
method and know what the hell it's doing. You need
654
00:36:52.360 --> 00:36:52.920
a bit Well.
655
00:36:54.440 --> 00:36:57.039
It's it's also interesting because you're working on an application
656
00:36:57.079 --> 00:37:02.039
that mostly focuses around the ticket so everything everything touches
657
00:37:02.119 --> 00:37:03.119
this one core.
658
00:37:02.960 --> 00:37:07.679
Piece absolutely, and we created several teams around it, right.
659
00:37:08.880 --> 00:37:11.199
You know, I've worked on other projects that didn't have that,
660
00:37:11.360 --> 00:37:13.400
but then they had like this core two or three
661
00:37:13.760 --> 00:37:17.239
objects that were the same thing. I've almost never seen
662
00:37:17.280 --> 00:37:23.760
an app where, you know, everything's spread across everything. The
663
00:37:24.079 --> 00:37:28.480
only exception I can really think of is the way
664
00:37:28.480 --> 00:37:30.679
that Top Endevs is put together. But that's because I
665
00:37:30.719 --> 00:37:35.920
deliver several different types of media and so those kind
666
00:37:35.920 --> 00:37:38.679
of get the between those and like the membership and
667
00:37:38.800 --> 00:37:42.440
role management, you know, it kind of gets spread across
668
00:37:42.440 --> 00:37:44.480
all of that because it's do you have access to it?
669
00:37:44.480 --> 00:37:45.440
And then how do you deliver it?
670
00:37:45.760 --> 00:37:49.039
And so you know, I get a wide swath of
671
00:37:49.159 --> 00:37:54.239
things that people are going to be generally touching. But yeah,
672
00:37:54.280 --> 00:37:57.159
I mean even within their little areas, right, it's podcast
673
00:37:57.199 --> 00:38:00.960
episodes have a ton of stuff on them, right, course,
674
00:38:01.039 --> 00:38:03.639
lessons have a ton of stuff on them. And and
675
00:38:03.679 --> 00:38:06.199
it's for that same reason, right, because within that little
676
00:38:06.239 --> 00:38:10.840
focused area, I've got that core piece and so understanding
677
00:38:10.880 --> 00:38:13.760
that and then recognizing, okay, so I've got to optimize
678
00:38:13.880 --> 00:38:15.960
and make it as easy to understand as possible.
679
00:38:16.000 --> 00:38:21.159
Around this thing, there's some some somebody else is going
680
00:38:21.239 --> 00:38:22.800
to maintain it and Chris, and you're.
681
00:38:23.519 --> 00:38:26.159
That's right, but I'm the boss, so that laughs Purson
682
00:38:26.159 --> 00:38:26.679
it quietly.
683
00:38:27.159 --> 00:38:31.119
Granted I worked at a company, it will go nameless
684
00:38:31.159 --> 00:38:36.480
that I before I got there. There's another topper that
685
00:38:36.599 --> 00:38:41.800
only named this also, and they didn't have everything was
686
00:38:42.280 --> 00:38:45.599
mixture between tabs and white space. There's always extra white
687
00:38:45.639 --> 00:38:48.280
space at the end. Nobody actually had any cleanup around that.
688
00:38:48.599 --> 00:38:50.679
So I wanted to want to created a script that
689
00:38:50.760 --> 00:38:54.199
basically made it so everything spaces and there's no extra
690
00:38:54.239 --> 00:38:56.199
white space at the Eddybody method. So you do it,
691
00:38:56.239 --> 00:38:59.119
get blame in that and everybody thought I wrote terrible code.
692
00:38:59.119 --> 00:39:01.840
I'm like, no, this is not my code right what
693
00:39:01.880 --> 00:39:04.559
it is, but get blame wise.
694
00:39:05.599 --> 00:39:09.159
Yeah, we've also, Yeah, I want to bring it back
695
00:39:09.159 --> 00:39:12.280
to performance a little bit. Kind of hit the maintainability
696
00:39:12.800 --> 00:39:15.480
idea pretty hard, and I think it's it's a critical
697
00:39:15.519 --> 00:39:18.440
piece of this, right because you're going to suffer trying
698
00:39:18.480 --> 00:39:22.519
to make performance happen with poorly maintained, poorly maintained or
699
00:39:22.559 --> 00:39:27.000
hard to maintain code. But when you're so you were
700
00:39:27.000 --> 00:39:30.039
talking about observability, I want to go back to that idea,
701
00:39:31.320 --> 00:39:33.559
like what are you actually looking for? Do you do
702
00:39:33.599 --> 00:39:36.239
you are you looking for kind of the like new
703
00:39:36.320 --> 00:39:38.360
relic for example, We'll break it down and say you
704
00:39:38.400 --> 00:39:40.280
spent this much time on your query, and this much
705
00:39:40.280 --> 00:39:44.280
time rendering the view, and this much time working in
706
00:39:44.280 --> 00:39:46.679
the controller, and this much time doing these other things.
707
00:39:47.440 --> 00:39:49.360
Is that what you're looking at when you when you
708
00:39:49.400 --> 00:39:52.519
see something slow or are you looking at some other
709
00:39:52.599 --> 00:39:55.800
breakdown or some other numbers, or how do you approach
710
00:39:55.840 --> 00:39:56.599
something like that?
711
00:39:57.800 --> 00:40:01.280
Before we started the team, it was basically, this is
712
00:40:01.320 --> 00:40:03.519
how long the presenter is taken, this is how long
713
00:40:03.599 --> 00:40:09.239
the controller is taken, and various little methods throughout saying
714
00:40:10.000 --> 00:40:14.599
they maybe validations. When we started this team, our first
715
00:40:14.639 --> 00:40:19.920
objective was, hey, listen, we need observability everywhere. So almost
716
00:40:20.199 --> 00:40:23.960
I'm not going to say every method, but every validator,
717
00:40:24.000 --> 00:40:28.400
for example, is wrapped in a data dog optional data
718
00:40:28.400 --> 00:40:33.360
dog tag where you can actually show really so literally
719
00:40:33.559 --> 00:40:37.199
every not every method, but a significant portion of the
720
00:40:37.239 --> 00:40:40.840
methods are actually showing. You can see and you can
721
00:40:40.920 --> 00:40:44.039
narrow down exactly in the code very fast, because all
722
00:40:44.079 --> 00:40:45.760
of a sudden, it's like you turn it down really
723
00:40:46.159 --> 00:40:49.920
there it is, it's right there, and you might have like, okay,
724
00:40:49.960 --> 00:40:52.920
it's within this section and there's three things going on
725
00:40:53.079 --> 00:40:56.960
here one of these three, and there's sometimes what happens
726
00:40:57.000 --> 00:40:59.119
is a lot of times it's one of the three.
727
00:40:59.280 --> 00:41:01.280
We have the option of trying to figure out where
728
00:41:01.320 --> 00:41:03.159
in the code. The slow part is where we have
729
00:41:03.239 --> 00:41:06.000
the option of just deploying more code that will tell
730
00:41:06.079 --> 00:41:09.000
us exactly where it is. And we've gotten to the
731
00:41:09.039 --> 00:41:13.280
point where there is some empty gaps, especially with the
732
00:41:13.320 --> 00:41:16.519
new features. When people add new features, they're not thinking
733
00:41:16.559 --> 00:41:19.239
about adding traces and stuff like that. But we can
734
00:41:19.320 --> 00:41:22.360
just really just go down and target exactly the method
735
00:41:22.360 --> 00:41:26.320
that we're looking for. And we've had things like you
736
00:41:26.400 --> 00:41:28.320
look at the code and you're like, oh, it looks fine,
737
00:41:28.360 --> 00:41:30.880
but you don't see a loop. And then way over
738
00:41:30.920 --> 00:41:33.159
here there's another loop, but that's in there. And then
739
00:41:33.199 --> 00:41:35.280
the way over here there's another loop and that's in
740
00:41:35.320 --> 00:41:37.400
there too. So you got I think they call that
741
00:41:37.519 --> 00:41:39.880
ncube or whatnottens, like all of a sudden, like, oh,
742
00:41:39.960 --> 00:41:42.159
obviously we need to do something with this, and then
743
00:41:42.239 --> 00:41:45.840
you add some for that specific one. I just added
744
00:41:45.880 --> 00:41:49.840
some memoization where all of a sudden, this last loop
745
00:41:49.960 --> 00:41:52.320
was just literally just it wasn't even a loop anymore,
746
00:41:52.519 --> 00:41:57.800
just calling it into a hash table look up and
747
00:41:57.800 --> 00:42:00.280
it's just a fan So all of a sudden turned
748
00:42:00.280 --> 00:42:02.400
it into an NQ but is still not good. But
749
00:42:02.880 --> 00:42:08.519
the performance of NQ versus and squared or whatever is huge.
750
00:42:10.519 --> 00:42:12.679
We got a big enough performance game there. All of
751
00:42:12.679 --> 00:42:21.519
a sudden, I could run away from that problem.
752
00:42:18.760 --> 00:42:20.039
Kick it down the road a little bit.
753
00:42:20.440 --> 00:42:22.320
Oh my god. Some of the times you see the
754
00:42:22.320 --> 00:42:25.400
code and you're like, in it's business decisions that people
755
00:42:25.440 --> 00:42:28.360
make too. Do they make business decisions like yeah, I
756
00:42:28.400 --> 00:42:30.960
can see why the developer wrote it like this, But
757
00:42:32.000 --> 00:42:37.039
why didn't the developer tell you, no, no, we can't
758
00:42:37.119 --> 00:42:39.639
do that. It's going to not perform in five years.
759
00:42:40.639 --> 00:42:45.960
Yeah. Sometimes you don't know though, at the end of
760
00:42:46.000 --> 00:42:46.400
the day.
761
00:42:46.559 --> 00:42:49.320
The one thing that I didn't talk about today or
762
00:42:49.440 --> 00:42:52.880
on might talk that I think is really important is
763
00:42:53.559 --> 00:42:57.119
when you first create an application and you deploy it,
764
00:42:58.039 --> 00:43:00.880
you can always set tight limits and the amount of
765
00:43:00.960 --> 00:43:05.000
data that you have, so product limit limits. Say, hey, listen,
766
00:43:05.039 --> 00:43:10.639
you can only have ten options in your drop down.
767
00:43:11.239 --> 00:43:15.239
That's obviously exaggeration, but you're allowed to put any ten,
768
00:43:15.280 --> 00:43:18.719
but you only get ten. You can always give more
769
00:43:19.599 --> 00:43:21.559
and eventually say I'll give you more. I'll give you more,
770
00:43:21.599 --> 00:43:25.239
I'll give you more. But going from hey, you get unlimited.
771
00:43:25.400 --> 00:43:28.519
I remember the first thing I worked at at Zendesk
772
00:43:28.679 --> 00:43:32.239
was you can have unlimited brands. Well, now the limit
773
00:43:32.360 --> 00:43:37.480
is three hundred because we realize that unlimited brands means
774
00:43:37.559 --> 00:43:42.719
almost well, unlimited complexity. And you can give me one
775
00:43:42.840 --> 00:43:46.280
hundred thousand brands because and that's one hundred thousand domains
776
00:43:46.320 --> 00:43:50.559
and that's the complexity around that is just too big.
777
00:43:50.679 --> 00:43:59.440
So yeah, adding limits to your product. And as a developer,
778
00:43:59.480 --> 00:44:02.280
I think that our responsibility to tell the product people
779
00:44:02.320 --> 00:44:05.639
that there's areas in the code. You go, if we
780
00:44:05.719 --> 00:44:09.360
have a hundred million of these, what does it? What's
781
00:44:09.400 --> 00:44:13.880
the performance? It's sometimes very obviously we wouldn't be able
782
00:44:13.880 --> 00:44:16.119
to have one hundred thousand of these right when we
783
00:44:16.639 --> 00:44:19.679
first developing a product. Go back to your product manager
784
00:44:19.719 --> 00:44:24.880
to say, hey, that feature, if somebody actually uses it
785
00:44:24.960 --> 00:44:27.880
and use it a lot, it's not gonna work. And
786
00:44:27.920 --> 00:44:29.760
they might come back and say, nobody would ever do that.
787
00:44:29.760 --> 00:44:32.159
It's like, so, what's the problem with actually having a
788
00:44:32.199 --> 00:44:36.320
limit if nobody's ever going to run into it? So
789
00:44:36.880 --> 00:44:39.519
I think that's also very key, and that's not programming
790
00:44:39.559 --> 00:44:42.800
per se. But I think ninety or a huge percentage
791
00:44:42.800 --> 00:44:45.679
of our job as a programmers to go back to
792
00:44:45.719 --> 00:44:49.280
the product managers and telling them, hey, listen, in three
793
00:44:49.360 --> 00:44:53.320
years from now, we wouldn't want a drop down. We
794
00:44:53.400 --> 00:44:56.679
had dropdowns for example that had over one hundred thousand
795
00:44:56.719 --> 00:44:57.440
options in them.
796
00:44:58.159 --> 00:44:58.760
Oh wow.
797
00:45:00.360 --> 00:45:03.679
First off, the UI isn't very good, but just loading
798
00:45:03.719 --> 00:45:06.800
them up and for example, for this one, this one
799
00:45:06.840 --> 00:45:09.360
was cool and it wasn't actual talk because one of
800
00:45:09.360 --> 00:45:12.280
the things that we did well that customer that had
801
00:45:12.280 --> 00:45:15.679
one hundred thousand options, they churned because well, we're too
802
00:45:15.679 --> 00:45:19.800
slow for them, right. We actually we probably would be
803
00:45:19.800 --> 00:45:23.760
able to support maybe even one hundred thousand in the
804
00:45:23.800 --> 00:45:27.280
options now because what we did is we changed our queries.
805
00:45:27.320 --> 00:45:30.840
And our original queries was grabbing one hundred thousand active
806
00:45:30.880 --> 00:45:34.440
record objects. And you can have one hundred thousand active
807
00:45:34.440 --> 00:45:38.960
rectcord objects without a serious time penalty, right. But what
808
00:45:39.000 --> 00:45:42.599
we do now is we pluck for the data, so
809
00:45:42.639 --> 00:45:44.440
we get the data fields that we need, and we
810
00:45:44.480 --> 00:45:47.559
only need like two or three fields out of records,
811
00:45:47.679 --> 00:45:50.760
so you're not initializing one hundred thousand active record objects,
812
00:45:51.119 --> 00:45:57.960
so you grab one hundred thousands options right in the array.
813
00:45:58.559 --> 00:46:01.239
And then you populate it via the the erase slash
814
00:46:01.280 --> 00:46:03.239
hash that you get back, and all of a sudden,
815
00:46:03.280 --> 00:46:05.480
this is very fast now. And all of a sudden,
816
00:46:05.639 --> 00:46:08.320
that customer that had one hundred thousand options that churned
817
00:46:08.400 --> 00:46:12.480
five six years ago, we might be able to maintain
818
00:46:12.519 --> 00:46:16.039
them now, but they're not coming back right. And that's
819
00:46:16.079 --> 00:46:18.840
another reason why you have a performance teams. All of
820
00:46:18.840 --> 00:46:21.760
a sudden, once you start have enough churn, people are like, oh,
821
00:46:21.880 --> 00:46:23.480
customers are leaving because of performance.
822
00:46:24.199 --> 00:46:24.400
Yeah.
823
00:46:24.960 --> 00:46:28.840
Do you have any opinions around using things like five
824
00:46:29.000 --> 00:46:32.039
ars of falcon in front of reels to improve performance?
825
00:46:33.000 --> 00:46:34.960
Do you have any experience with that?
826
00:46:35.719 --> 00:46:46.320
I wish I did. No, Yeah, that's good. Of the
827
00:46:46.320 --> 00:46:48.480
answer as I can give you is yeah, no, I
828
00:46:48.559 --> 00:46:49.960
have not used fibers at all.
829
00:46:50.440 --> 00:46:53.599
So yeah, I just started a new side project and
830
00:46:53.639 --> 00:46:57.400
I've put falcon and not because it's the performance intensive project.
831
00:46:57.400 --> 00:47:00.400
It's just a side project that lets me play around
832
00:47:00.400 --> 00:47:03.599
with new stuff with no risk. I was like, why not,
833
00:47:03.960 --> 00:47:04.639
it'll be fun.
834
00:47:05.480 --> 00:47:07.559
I did that for what I worked for the UFC
835
00:47:07.639 --> 00:47:09.519
one time in the UFC thought they were gonna get
836
00:47:09.599 --> 00:47:14.840
a lot of different but it just they thought day
837
00:47:14.880 --> 00:47:18.360
one is gonna be bam. It's just an e commerce
838
00:47:18.400 --> 00:47:20.800
store too, so it's not going to get that much traffic.
839
00:47:20.840 --> 00:47:23.760
But UFC is like, but we're UFC. It's like yeah,
840
00:47:23.800 --> 00:47:28.480
but like it's still like only very small part. Anyways. Yeah,
841
00:47:28.519 --> 00:47:31.639
I remember I was able to play in that and
842
00:47:31.639 --> 00:47:34.400
it's like, hey, I'm just going to tweak every part
843
00:47:34.440 --> 00:47:36.239
of this e commerce app so you can go as
844
00:47:36.239 --> 00:47:39.000
fast as possible. I think they launched and had almost
845
00:47:39.000 --> 00:47:42.760
no traffic, but it was fast for the no traffic.
846
00:47:46.639 --> 00:47:47.519
Yeah.
847
00:47:47.639 --> 00:47:50.199
One thing that I'm running into with top end devs
848
00:47:50.280 --> 00:47:54.320
is the search takes like five seconds to run.
849
00:47:54.960 --> 00:47:58.039
So search is a very completely different team for us.
850
00:47:59.360 --> 00:48:05.159
For us, it's the exact opposite. So our search team
851
00:48:05.280 --> 00:48:09.639
is better than my sequel. Like whatever they're doing, they've
852
00:48:09.639 --> 00:48:16.920
made it index things quite fast, so we've done. There's
853
00:48:18.000 --> 00:48:22.400
APIs that sometimes you need. They needed to be like
854
00:48:23.000 --> 00:48:26.280
no most current data, so you were going after SQEL,
855
00:48:26.840 --> 00:48:30.239
But there's APIs where it's like, hey, if it's delayed
856
00:48:30.239 --> 00:48:35.280
by two hundred milliseconds, is it that big of a
857
00:48:35.320 --> 00:48:38.440
deal that we don't return all the tickets. We minus
858
00:48:38.519 --> 00:48:40.519
all the tickets except for the one last one that
859
00:48:40.519 --> 00:48:46.360
they put in right, and in those cases we've found
860
00:48:46.440 --> 00:48:49.280
the performance of a LASS search is so much faster, like,
861
00:48:49.679 --> 00:48:53.000
well we'll get our response times response times, we're just
862
00:48:53.079 --> 00:48:54.159
dropping half for example.
863
00:48:55.320 --> 00:48:57.159
Yeah, that's the thing that I've been looking at lately.
864
00:48:57.320 --> 00:49:03.719
Is I put in PG search and yeah, it's just
865
00:49:03.960 --> 00:49:07.880
you know, doing a multi search across all the models.
866
00:49:07.920 --> 00:49:10.039
I mean, it will give you back a result, but
867
00:49:10.639 --> 00:49:12.880
I had to tell the proxy server that sits in
868
00:49:12.880 --> 00:49:16.519
front of it, come all proxy, not to time out
869
00:49:16.599 --> 00:49:19.480
so fast in order to get those results. And yeah,
870
00:49:19.480 --> 00:49:22.199
I've been looking at possibly moving to elastic search because
871
00:49:22.199 --> 00:49:26.360
I hear it's really just stinking fast. I was using
872
00:49:26.400 --> 00:49:30.000
another search engine, mealy Search, but the problem I had
873
00:49:30.000 --> 00:49:34.440
there was that they I couldn't I could only search
874
00:49:34.519 --> 00:49:38.840
one type of object at a time, and so I
875
00:49:38.880 --> 00:49:40.760
had to go and say, okay, give me all the episodes,
876
00:49:40.760 --> 00:49:43.679
give me all the podcast and it was fairly fast,
877
00:49:44.400 --> 00:49:47.760
but I hated making six queries to it to get
878
00:49:47.800 --> 00:49:50.119
all the different things because I kind of want just
879
00:49:50.159 --> 00:49:53.960
the most relevant thing to show up first. And so yeah,
880
00:49:53.960 --> 00:49:55.800
that's where I'm looking at elastic search, because I think
881
00:49:55.840 --> 00:49:57.880
elastic search doesn't make you do that.
882
00:49:58.119 --> 00:50:01.440
So yeah, we have a differ team that maintains that. So
883
00:50:01.559 --> 00:50:05.000
that's another place where I just use plastic search and
884
00:50:05.039 --> 00:50:08.719
I was fast in our system, but we have That's
885
00:50:08.760 --> 00:50:11.920
the thing about being at a big company. There's areas
886
00:50:11.960 --> 00:50:15.280
where you know how to use it within your company,
887
00:50:15.320 --> 00:50:17.239
but to set it up or anything to be an
888
00:50:17.239 --> 00:50:22.880
expert on it. No, Yeah, that's where I missed the
889
00:50:23.000 --> 00:50:26.360
being a startup get you get to be an expert,
890
00:50:26.440 --> 00:50:30.760
or at least you get to play with more tools.
891
00:50:31.320 --> 00:50:38.280
Right, So, are there any other big secrets.
892
00:50:37.719 --> 00:50:39.960
That you want to share with us or thoughts before
893
00:50:39.960 --> 00:50:43.719
we head into picks.
894
00:50:43.760 --> 00:50:47.239
Nothing that's coming in to mind. But I mean, as
895
00:50:47.280 --> 00:50:53.559
I said, we have. I mean I'm creating a whole
896
00:50:53.559 --> 00:50:55.519
new talk. For example, I think I told you before
897
00:50:55.519 --> 00:50:58.519
we started, it's like how graph ql is going to be,
898
00:50:58.880 --> 00:51:02.280
uh speed up a whole bunch of things for us,
899
00:51:02.440 --> 00:51:07.519
and then just there's so many different areas that I
900
00:51:07.559 --> 00:51:09.639
was not able to hit that now I'm going to
901
00:51:09.840 --> 00:51:14.840
I'm submitting cocks right now to actually talk about those.
902
00:51:14.880 --> 00:51:19.079
But those are not well thought out in my brain yet,
903
00:51:19.119 --> 00:51:22.159
So I don't think I should be a talking about
904
00:51:22.440 --> 00:51:22.920
right now.
905
00:51:24.000 --> 00:51:26.840
Yeah, you mentioned graph ql, and I have to say
906
00:51:26.920 --> 00:51:31.320
my experience implementing things in graph Ql has been not
907
00:51:31.440 --> 00:51:36.800
my favorite thing that I've ever done. But you're talking
908
00:51:36.840 --> 00:51:41.599
about a performance aspect of it is. Yeah, I'm a
909
00:51:41.639 --> 00:51:43.800
little curious what you're looking at there. I know that
910
00:51:44.480 --> 00:51:46.719
with graph ql, the thing that people tend to like
911
00:51:46.840 --> 00:51:48.440
is that you make one query and you get all
912
00:51:48.480 --> 00:51:49.840
the data you need one go.
913
00:51:50.960 --> 00:51:53.719
So is that where the speed up comes from or
914
00:51:53.760 --> 00:51:54.440
is it something else?
915
00:51:54.760 --> 00:51:59.480
No? No, So we don't use Ruby every place, and
916
00:51:59.559 --> 00:52:02.840
our graph Ql endpoints we use Java. Then we're actually
917
00:52:02.840 --> 00:52:05.559
only using them internally. We're not using them externally yet,
918
00:52:05.679 --> 00:52:09.639
but internally it hits our Java service. Java does an
919
00:52:09.679 --> 00:52:13.239
amazing job of paralyzing things. So then Java makes like
920
00:52:14.360 --> 00:52:20.480
fifty ten probably, but let's say fifty different rest requests
921
00:52:20.880 --> 00:52:24.920
to gain application gets them all back way faster than
922
00:52:24.960 --> 00:52:28.559
if they was compiling up, and then that comes back
923
00:52:28.599 --> 00:52:30.840
to the Java app. The Java app knows how to
924
00:52:30.880 --> 00:52:33.400
configure and put it all in the way it's supposed
925
00:52:33.440 --> 00:52:35.199
to put it back, and then serializes it and sent
926
00:52:35.400 --> 00:52:39.159
back to the requester of the actual appeatt And because
927
00:52:39.199 --> 00:52:42.920
of the paralyzation of that, it's so much faster because
928
00:52:43.000 --> 00:52:47.760
rest requests right now in our application, we have something
929
00:52:47.840 --> 00:52:51.440
what we call internally side loads, where you can basically
930
00:52:51.440 --> 00:52:53.840
say I want anything I want. It's almost like a
931
00:52:53.880 --> 00:52:56.360
poor man's graph QL. Well, if all of a sudden
932
00:52:56.360 --> 00:53:00.639
you're doing that serially, it's just the response times here,
933
00:53:01.360 --> 00:53:04.960
so graftl speeding us up because it's basically forcing us
934
00:53:05.000 --> 00:53:09.119
to come back to true RESTful responses that are really fast.
935
00:53:10.119 --> 00:53:14.880
All right, cool, Well, let's go ahead and do some
936
00:53:14.920 --> 00:53:17.599
picks before we get to those.
937
00:53:17.719 --> 00:53:21.559
If people want to follow you online, where they find you, I.
938
00:53:21.480 --> 00:53:24.599
Think get hub or LinkedIn, or you'd find me. Dr
939
00:53:24.719 --> 00:53:27.159
Henter is usually what you find me. If you look
940
00:53:27.159 --> 00:53:30.719
for Dr Henter, get Hubb or Dr Henter. I think
941
00:53:30.760 --> 00:53:35.239
get LinkedIn. Even Dr Henner in my Gmail would work
942
00:53:35.280 --> 00:53:37.079
too awesome.
943
00:53:38.599 --> 00:53:41.800
All right, well, let's go ahead and do some picks.
944
00:53:43.159 --> 00:53:45.079
Are you sure? Do you have some picks for us?
945
00:53:45.960 --> 00:53:46.159
Yeah?
946
00:53:46.239 --> 00:53:49.840
Hang on one second, I have broken broad for my client,
947
00:53:50.119 --> 00:53:51.159
which is all the fun.
948
00:53:53.880 --> 00:53:54.599
I'm flaxing.
949
00:53:54.960 --> 00:53:55.440
I'm on it.
950
00:53:55.480 --> 00:53:57.400
I'll give you five minutes. I'm on it.
951
00:54:00.599 --> 00:54:03.440
Perfect timing, isn't it shouldn't I shouldn't have imrged. I
952
00:54:03.519 --> 00:54:06.119
merged up on requests just before coming onto this collision
953
00:54:06.199 --> 00:54:06.679
to done that.
954
00:54:08.920 --> 00:54:11.079
Yeah, so I used when he got real quiet over
955
00:54:11.119 --> 00:54:11.880
there that that's.
956
00:54:11.760 --> 00:54:12.440
What was going on.
957
00:54:12.480 --> 00:54:16.760
It was like, yeah, yeah, sorry about that.
958
00:54:17.079 --> 00:54:17.800
Sorry picks.
959
00:54:18.559 --> 00:54:21.360
I'm gonna start with a very selfish pick, which is
960
00:54:21.760 --> 00:54:24.840
I just relaunched one of my side projects called Skatagun
961
00:54:24.880 --> 00:54:29.599
dot Email, which has been in hibernation for like two
962
00:54:29.599 --> 00:54:32.239
and a half years because of the joys of sales
963
00:54:32.360 --> 00:54:37.679
tax and EU V eight. I was using Stripe for
964
00:54:37.719 --> 00:54:40.079
payments on my accounters Like, yeah, you know, you can't
965
00:54:40.079 --> 00:54:43.400
do that because you'll have to collect V eight for
966
00:54:43.480 --> 00:54:46.440
everyone in the EU. And I'm like, okay, thanks for
967
00:54:46.480 --> 00:54:51.639
telling me that now. So I've moved payments over to paddle, uh,
968
00:54:51.800 --> 00:54:54.719
which took a lot longer because I got distracted by
969
00:54:54.960 --> 00:54:58.119
this stuff, but it's it's back now. So Skatagun dot
970
00:54:58.159 --> 00:55:03.559
Email has relaunched it Tuesday. So that's one pick.
971
00:55:05.320 --> 00:55:05.559
The I.
972
00:55:07.079 --> 00:55:09.360
Usually do like a music or a TV show pick,
973
00:55:09.599 --> 00:55:12.840
So I'll go to the TV show this time. Severance
974
00:55:12.920 --> 00:55:17.920
on Apple TV season two just started. It's uh weird,
975
00:55:18.039 --> 00:55:20.800
and I like it. I like it very much. It's
976
00:55:20.840 --> 00:55:23.280
been a very strong start. I think it was quite
977
00:55:23.280 --> 00:55:26.800
a cliffhanger ending in season one, and the show has
978
00:55:26.840 --> 00:55:29.320
started off really strong, so if you haven't watched it,
979
00:55:29.360 --> 00:55:30.159
i'd recommend that.
980
00:55:30.960 --> 00:55:32.159
Just getting the links here for that.
981
00:55:32.920 --> 00:55:38.800
I've got a couple of picks I'm gonna put out there, so,
982
00:55:39.639 --> 00:55:42.320
as most of you probably know, I tend to do
983
00:55:42.880 --> 00:55:46.119
the board game picks as part of my picks, So
984
00:55:49.159 --> 00:55:53.360
I'm going to put out The game is called Cascadero,
985
00:55:55.519 --> 00:55:57.239
and it's.
986
00:55:59.079 --> 00:56:00.039
It's got some.
987
00:56:00.079 --> 00:56:04.280
Elements that are similar to other board games that I've played.
988
00:56:04.280 --> 00:56:06.639
So there's kind of a there's a track that you
989
00:56:06.719 --> 00:56:10.159
advance up, and you get rewards for hitting certain milestones,
990
00:56:11.519 --> 00:56:15.639
and you also get points for hitting certain milestones. The
991
00:56:15.679 --> 00:56:18.400
way that you advance up the track is you so
992
00:56:18.559 --> 00:56:22.199
there's a kingdom and the king has dyed, and so
993
00:56:22.360 --> 00:56:27.679
you're basically you're out there connecting the cities and things
994
00:56:27.760 --> 00:56:31.599
like that and spreading the word on the new king
995
00:56:31.719 --> 00:56:36.000
or whatever. And so you put little horsemen down on
996
00:56:36.039 --> 00:56:41.119
the on the board around these towns and you're connecting
997
00:56:41.199 --> 00:56:44.360
up the towns, and you get bonus points for say,
998
00:56:44.360 --> 00:56:47.639
connecting two towns to the same color. So the first
999
00:56:47.679 --> 00:56:49.360
time you do that for any given color there are
1000
00:56:49.360 --> 00:56:52.719
five colors, then you.
1001
00:56:51.920 --> 00:56:54.559
You get points you advance up the board.
1002
00:56:55.760 --> 00:56:59.360
If you are the first person to that city and
1003
00:56:59.400 --> 00:57:02.280
it's not the first horseman that you've put down in
1004
00:57:02.400 --> 00:57:05.239
the group, then you get one point. And if you're
1005
00:57:05.239 --> 00:57:09.039
the second, third, fourth, I guess you can do fourth
1006
00:57:10.440 --> 00:57:13.920
because other people can connect onto it as well, right,
1007
00:57:15.159 --> 00:57:17.320
but it's it's per group. So when you connect a
1008
00:57:17.480 --> 00:57:20.400
group to a city and you're the second or third,
1009
00:57:20.440 --> 00:57:23.000
or fourth person, you move your thing up the advanced
1010
00:57:23.039 --> 00:57:25.480
track or advance it up the track of that color
1011
00:57:25.599 --> 00:57:28.360
two spaces instead of one. And then if there's a
1012
00:57:28.360 --> 00:57:30.960
herald on the city, then you add one to whatever
1013
00:57:31.000 --> 00:57:35.119
you get to advance it. And then there's a bonus
1014
00:57:35.159 --> 00:57:40.400
for having connected two cities of all five colors with
1015
00:57:40.519 --> 00:57:43.719
any you know across any of or all of your groups.
1016
00:57:43.960 --> 00:57:48.199
And then there are also point bonuses for getting all
1017
00:57:48.239 --> 00:57:51.400
five of your markers past the first it's kind of
1018
00:57:51.400 --> 00:57:55.880
a finish line three on the second finish line, or
1019
00:57:55.880 --> 00:57:58.000
getting being the first person to get one all the
1020
00:57:58.000 --> 00:58:01.000
way to the end of one of the lines. And
1021
00:58:01.039 --> 00:58:03.320
the way that you win is you have the most
1022
00:58:03.440 --> 00:58:09.400
points of the people that get there their piece all
1023
00:58:09.440 --> 00:58:11.400
the way to the end of whatever color they're playing.
1024
00:58:12.119 --> 00:58:14.599
So when I was playing, I was playing as Red,
1025
00:58:15.280 --> 00:58:17.719
and so I made sure I got my piece all
1026
00:58:17.760 --> 00:58:19.440
the way to the end of Red, and then I
1027
00:58:19.480 --> 00:58:20.760
tried to get it all the way to the end
1028
00:58:20.760 --> 00:58:22.920
of yellow as well, but I didn't have to do that.
1029
00:58:24.840 --> 00:58:26.760
And then one of the other guys that I was
1030
00:58:26.800 --> 00:58:28.360
playing with got his all the way to the end
1031
00:58:28.360 --> 00:58:30.440
of blue, which was the color he was playing, but
1032
00:58:30.519 --> 00:58:32.119
he did that on his last turn, and if he
1033
00:58:32.159 --> 00:58:34.239
hadn't gotten it there, even though he had more points
1034
00:58:34.280 --> 00:58:36.440
than I did, because I got mine to the end
1035
00:58:36.480 --> 00:58:37.360
of the track, I won.
1036
00:58:37.760 --> 00:58:39.000
And so what your.
1037
00:58:38.840 --> 00:58:42.000
Goal is is you want to be the person who
1038
00:58:42.000 --> 00:58:44.039
gets it all the way to the end and has
1039
00:58:44.079 --> 00:58:46.199
the most points. But the way you end the game
1040
00:58:46.440 --> 00:58:48.880
is by getting more than fifty points. As soon as
1041
00:58:48.880 --> 00:58:52.440
somebody crosses that fifty point threshold, all the other players
1042
00:58:52.440 --> 00:58:55.440
get one more turn and then it ends. Or when
1043
00:58:55.519 --> 00:58:59.039
somebody runs out of horsemen and can't place another horseman,
1044
00:58:59.119 --> 00:59:00.800
that's the other way it ends. And that's the way
1045
00:59:00.800 --> 00:59:02.320
I ended for us, because we had never played it
1046
00:59:02.360 --> 00:59:04.880
before and so we weren't racking up the points the
1047
00:59:04.880 --> 00:59:06.119
way that we should have been.
1048
00:59:06.639 --> 00:59:09.920
But anyway, it was pretty fun. And then they're like.
1049
00:59:09.800 --> 00:59:12.199
I said, there are different rewards up the track that
1050
00:59:12.920 --> 00:59:15.960
you know, so you can advance another marker up the track,
1051
00:59:16.039 --> 00:59:19.280
or you can place another horseman, or you can move
1052
00:59:19.320 --> 00:59:21.239
a horseman or just stuff like that.
1053
00:59:21.639 --> 00:59:24.360
So anyway, it was pretty fun Cascadero.
1054
00:59:25.480 --> 00:59:27.320
It came out in twenty twenty four, so it's a
1055
00:59:27.360 --> 00:59:30.360
relatively new game and board game Geek gives it a
1056
00:59:30.360 --> 00:59:34.079
weight of two point five to three, which means that
1057
00:59:34.159 --> 00:59:36.960
if you're kind of a casual player, this might be
1058
00:59:37.559 --> 00:59:41.599
a little bit complicated, but not so complicated that you're
1059
00:59:41.719 --> 00:59:43.920
not going to enjoy it. I have to say that
1060
00:59:46.679 --> 00:59:51.639
the complicated part is just keeping track of what you've
1061
00:59:51.679 --> 00:59:56.280
connected with your groups, and then you know, keeping track
1062
00:59:56.320 --> 00:59:58.760
of how to move stuff up the track, and you
1063
00:59:58.840 --> 01:00:00.639
get used to that in the first time minutes or so,
1064
01:00:01.199 --> 01:00:03.960
and then I would probably wait it once you understand
1065
01:00:03.960 --> 01:00:06.800
those two things at like one point nine. I mean,
1066
01:00:06.840 --> 01:00:09.960
it's it's just those couple of concepts you have to
1067
01:00:09.960 --> 01:00:13.639
get used to and then you're good to go. It
1068
01:00:13.679 --> 01:00:15.559
took us about there were three of us playing. It
1069
01:00:15.559 --> 01:00:18.559
took us what forty five minutes maybe an hour, and
1070
01:00:18.599 --> 01:00:20.519
that was with us learning the game. So I would,
1071
01:00:20.519 --> 01:00:22.719
I would assume that it probably takes you know, if
1072
01:00:22.719 --> 01:00:25.719
you have four or five people playing, you know, I
1073
01:00:25.840 --> 01:00:28.800
thank you forty five minutes. So anyway, it was fun.
1074
01:00:29.400 --> 01:00:32.800
I definitely enjoyed it. One of my buddies is teaching
1075
01:00:32.840 --> 01:00:36.679
the hot games at salt Con in March, which is
1076
01:00:36.760 --> 01:00:40.199
the big board game convention up in Layton, Utah.
1077
01:00:40.320 --> 01:00:45.039
And yeah, anyway, so that was one of the games
1078
01:00:45.039 --> 01:00:45.559
he had to learn.
1079
01:00:45.559 --> 01:00:48.920
We'll probably pick up another one later, but yeah, I
1080
01:00:49.000 --> 01:00:51.840
really enjoyed it, So I'm gonna pick that. My wife
1081
01:00:51.840 --> 01:00:55.800
and I for TV shows, we just started watching season
1082
01:00:55.800 --> 01:01:01.039
two of The Night Agent and we enjoyed the first
1083
01:01:01.079 --> 01:01:07.960
season a lot, so I'll pick that as well. Let
1084
01:01:07.960 --> 01:01:09.199
me see if I get a link for that.
1085
01:01:09.719 --> 01:01:13.440
And then I am starting to.
1086
01:01:15.360 --> 01:01:18.199
Put together meetups and stuff for ruby Geniuses, so if
1087
01:01:18.199 --> 01:01:21.559
you go to rubygeniuses dot com. I kind of so
1088
01:01:22.679 --> 01:01:24.480
it took me a little longer to get it launched
1089
01:01:24.480 --> 01:01:27.199
than I wanted to. And the reason essentially is that
1090
01:01:28.679 --> 01:01:30.840
the stuff that I'm doing for top end devs as
1091
01:01:30.840 --> 01:01:36.719
far as like delivering courses and podcasts and stuff like that,
1092
01:01:36.960 --> 01:01:38.800
I've been talking to other people who want to use
1093
01:01:38.840 --> 01:01:39.239
the system.
1094
01:01:39.280 --> 01:01:42.480
I'm using and so rather than do the smart thing.
1095
01:01:42.320 --> 01:01:45.199
And just deploy them a copy, I made it a
1096
01:01:45.280 --> 01:01:47.199
multi tenant app so I can charge them for it.
1097
01:01:47.639 --> 01:01:51.000
So that that took a bit of work to kind
1098
01:01:51.039 --> 01:01:53.519
of get everything figured out and learn how to do
1099
01:01:53.599 --> 01:01:59.719
multi tenancy with Stripe connect on you know, on my app,
1100
01:02:00.199 --> 01:02:02.639
make sure I'm getting all the right web hooks and
1101
01:02:02.679 --> 01:02:05.119
all that stuff. But it's basically done. So if you
1102
01:02:05.119 --> 01:02:07.719
want to go sign up, I'm going to change the
1103
01:02:07.760 --> 01:02:09.800
price today. I'm going to move it down to forty
1104
01:02:09.840 --> 01:02:15.400
seven dollars just because I'm still pretty happy about the inauguration.
1105
01:02:14.960 --> 01:02:17.039
Of Donald Trump and he's president at forty seven.
1106
01:02:17.960 --> 01:02:19.559
But yeah, so if you want to go and sign
1107
01:02:19.639 --> 01:02:21.599
up for forty seven dollars, it will go back up
1108
01:02:21.599 --> 01:02:24.880
to ninety seven dollars in a few weeks and that'll
1109
01:02:24.920 --> 01:02:28.880
give you access to I'm essentially I'm putting together videos kind.
1110
01:02:28.719 --> 01:02:32.920
Of like railscast was or go Rails or Drifting Ruby.
1111
01:02:34.480 --> 01:02:37.360
My focus is going to be essentially I'm going to
1112
01:02:37.400 --> 01:02:39.760
say here's my project, and then you're gonna get a
1113
01:02:39.840 --> 01:02:42.400
video of me working on the project every week, and
1114
01:02:42.440 --> 01:02:45.320
it might be interspersed with and this is something that
1115
01:02:45.360 --> 01:02:47.039
I fixed on top end devs. Right, So if I
1116
01:02:47.079 --> 01:02:50.119
get elastic search working for the search for example, I
1117
01:02:50.199 --> 01:02:53.599
might work that in the first app I'm building is
1118
01:02:53.639 --> 01:02:59.000
actually to help track bills through the Utah legislature, and
1119
01:02:59.079 --> 01:03:01.679
so it's going to be hitting their APIs and working
1120
01:03:01.719 --> 01:03:04.760
around the gaping holes in their APIs.
1121
01:03:04.320 --> 01:03:06.320
Because they have gaping holes in their APIs.
1122
01:03:07.400 --> 01:03:09.480
So there may be some screen scraping and things like
1123
01:03:09.519 --> 01:03:11.920
that to get all the data in and then yeah,
1124
01:03:12.000 --> 01:03:15.280
putting together the alerts and stuff like that, so you know,
1125
01:03:15.440 --> 01:03:19.119
just you know, you get a notice that says, hey,
1126
01:03:19.159 --> 01:03:22.559
your bill went to committee, or you know, your bill
1127
01:03:22.599 --> 01:03:25.199
had its second reading, and so if it has a
1128
01:03:25.239 --> 01:03:27.960
third reading and passes, then it passes, you know, and
1129
01:03:28.079 --> 01:03:29.920
just kind of working through all that stuff and then
1130
01:03:29.960 --> 01:03:33.079
helping people connect with their legislators because I feel like
1131
01:03:33.159 --> 01:03:35.559
if we have more people involved in the legislative process
1132
01:03:36.119 --> 01:03:39.079
and talking to their legislators, regardless of which side of
1133
01:03:39.079 --> 01:03:41.360
the aisle you're on, I think.
1134
01:03:41.159 --> 01:03:42.519
We generally get better.
1135
01:03:43.920 --> 01:03:46.360
Legislation because I think most of the things when we're
1136
01:03:46.400 --> 01:03:49.000
talking about roads and schools and things like that, we
1137
01:03:49.280 --> 01:03:52.599
generally agree on what we want, whether you're right or left,
1138
01:03:53.119 --> 01:03:55.800
and So what I want is I want moms and
1139
01:03:55.880 --> 01:04:00.840
dads talking to the legislators and saying you're passing, you're
1140
01:04:00.880 --> 01:04:02.960
pushing this education bill, but that's not what we want,
1141
01:04:04.039 --> 01:04:06.079
you know, or things like that. So so that's what
1142
01:04:06.119 --> 01:04:07.719
I'm going to be working through and just showing people
1143
01:04:07.760 --> 01:04:10.599
how to do that. It's probably going to have some
1144
01:04:10.639 --> 01:04:15.719
premium features too that involve AI and doing bill summaries
1145
01:04:15.760 --> 01:04:19.880
for AI. I'm already doing this for another project, and
1146
01:04:19.920 --> 01:04:21.480
so yeah, you're going to get kind of a wide
1147
01:04:21.480 --> 01:04:24.800
breadth of things out of this. Also creating groups so
1148
01:04:24.920 --> 01:04:30.440
people can discuss bills together. I want to give organizations
1149
01:04:30.480 --> 01:04:33.679
an option for putting together their slate of bills and
1150
01:04:33.719 --> 01:04:36.840
where they stand on it, and give them some way
1151
01:04:36.840 --> 01:04:39.840
of posting that on their websites. So those are kind
1152
01:04:39.880 --> 01:04:41.239
of the features that I'm going to be putting in
1153
01:04:41.320 --> 01:04:47.000
so you know, imbedible stuff. So anyway, if you're looking
1154
01:04:47.039 --> 01:04:48.840
to learn any of those things, then then you want
1155
01:04:48.880 --> 01:04:51.559
to sign up for that. We're also doing the meetups
1156
01:04:52.320 --> 01:04:54.760
and we'll be going through some of the technologies, maybe
1157
01:04:54.800 --> 01:04:57.199
a little more in depth, so where in the videos
1158
01:04:57.199 --> 01:05:00.280
I'll be showing you I'm building this feature using Turbo,
1159
01:05:01.360 --> 01:05:03.480
I may go through, Hey, here are all the features
1160
01:05:03.519 --> 01:05:08.719
that turbo offers in this way or comal or I've
1161
01:05:08.719 --> 01:05:11.000
had people ask me for all kinds of stuff. If
1162
01:05:11.000 --> 01:05:13.880
you connect with me on LinkedIn too, I'll actually get
1163
01:05:13.880 --> 01:05:15.639
on a call with you and ask you what you
1164
01:05:15.679 --> 01:05:19.000
want to learn. So anyway, I've been way more long
1165
01:05:19.000 --> 01:05:22.760
winded on that than I want. But yeah, so that's
1166
01:05:22.840 --> 01:05:26.159
all going to be coming out through Rubygeniuses dot com
1167
01:05:26.800 --> 01:05:29.599
and yeah, so hopefully that's in the wheelhouse of things
1168
01:05:29.639 --> 01:05:32.239
you want. But yeah, we're going to be doing meetups
1169
01:05:32.280 --> 01:05:36.840
and tutorials and screencasts and courses in the whole nine
1170
01:05:36.880 --> 01:05:38.880
yards and you get access to all of that through
1171
01:05:38.920 --> 01:05:39.480
the membership.
1172
01:05:39.559 --> 01:05:42.280
So anyway, David, what are your picks?
1173
01:05:42.559 --> 01:05:45.920
Yes, So, I have a coworker actually that I work
1174
01:05:46.039 --> 01:05:50.760
side by side with that's publishing a book soon and
1175
01:05:50.800 --> 01:05:54.280
it's called rail Scales. He actually gives more talks about
1176
01:05:55.159 --> 01:05:59.440
scaling rails than I do. But Christian Polantis is his
1177
01:06:00.199 --> 01:06:03.719
the author's name, book name, Ral Scales. I'm actually very
1178
01:06:03.760 --> 01:06:06.039
interested in to see what it looks like and I
1179
01:06:06.079 --> 01:06:07.760
can't wait to get myself a copy. I hope I
1180
01:06:07.800 --> 01:06:10.960
get myself a free copy.
1181
01:06:11.039 --> 01:06:15.519
Yeah, become a technical reviewer. They give those out for free.
1182
01:06:16.320 --> 01:06:18.639
Well, I mean he works with me and he's yeah,
1183
01:06:19.159 --> 01:06:21.280
I'll tell him. I gave him a shout out. There
1184
01:06:21.360 --> 01:06:26.599
you go, you go. What else? I actually have one
1185
01:06:26.639 --> 01:06:34.320
other coworker that he wrote an article on AWS about
1186
01:06:34.440 --> 01:06:38.719
scaling Zendesk And if you do a search for the
1187
01:06:38.760 --> 01:06:46.079
guy's name is Anatoly aws Zendesk Performance, So Anatoly Aws
1188
01:06:46.440 --> 01:06:51.840
Zendesk Performance, you will find his article in Google and
1189
01:06:52.159 --> 01:06:54.039
he talks about some of the things that we've been doing.
1190
01:06:54.400 --> 01:06:56.800
Much more on the infrastructure side. He's a much more
1191
01:06:56.800 --> 01:06:59.199
of an infrastructure than a Ruby guy, but I work
1192
01:06:59.320 --> 01:07:06.039
side by side of the He's absolutely brilliant. Also, if
1193
01:07:06.079 --> 01:07:09.719
anybody's hiring product manager or managers in general, I know
1194
01:07:09.800 --> 01:07:12.320
several that got laid off, So feel free to ping
1195
01:07:12.360 --> 01:07:15.760
me on LinkedIn because I feel like there's some good
1196
01:07:15.760 --> 01:07:18.079
people out there that I know that I'd love to
1197
01:07:18.199 --> 01:07:25.280
connect to other people. And lastly, you guys probably don't
1198
01:07:25.320 --> 01:07:30.199
know Swift, but Swift is essentially an interactive game that
1199
01:07:30.239 --> 01:07:34.360
you connect to a bicycle a bicycle trainer, and I
1200
01:07:34.519 --> 01:07:39.360
absolutely love it. I'm I mean, I every night like
1201
01:07:39.480 --> 01:07:42.280
I do races sometimes and the last few nights I've
1202
01:07:42.280 --> 01:07:44.679
been doing races. I am not a racer. I am
1203
01:07:44.679 --> 01:07:47.559
not that fast, But at the end of the day,
1204
01:07:47.559 --> 01:07:50.639
I'll still go in and do the races. And I
1205
01:07:50.679 --> 01:07:55.159
think the category ds I'm taught. I'm I'm the best
1206
01:07:55.159 --> 01:07:56.519
of the worst category.
1207
01:07:56.960 --> 01:07:57.599
Oh, there you go.
1208
01:07:58.440 --> 01:08:01.760
So as soon as I get the next category, I'll
1209
01:08:01.760 --> 01:08:03.719
get destroyed. Yeah.
1210
01:08:03.760 --> 01:08:05.719
I got a membership to Swift when I bought my
1211
01:08:05.760 --> 01:08:10.159
bike trainer because I have a Wahoo trainer and or.
1212
01:08:10.159 --> 01:08:14.000
The is it the bike? Okay, I got the Kicker bike.
1213
01:08:15.119 --> 01:08:19.279
Okay, Yeah, I've only used it once or twice. In fact,
1214
01:08:19.319 --> 01:08:20.199
I think it expired.
1215
01:08:20.840 --> 01:08:25.399
But yeah, it's cool because it's yeah, it's almost like,
1216
01:08:25.920 --> 01:08:29.119
well I guess it's not almost like, but it's it's
1217
01:08:29.199 --> 01:08:31.760
kind of fun to just ride your bike.
1218
01:08:31.920 --> 01:08:34.000
And yeah, if you're.
1219
01:08:34.279 --> 01:08:36.479
Harder up the hills and all that stuff.
1220
01:08:36.119 --> 01:08:39.319
And exactly, and then that you're in Utah, so you
1221
01:08:39.319 --> 01:08:41.319
you suffer from the coldness and you don't want to
1222
01:08:41.319 --> 01:08:41.760
be biking.
1223
01:08:42.520 --> 01:08:44.640
Oh yeah, I don't train outside. I'm training for a
1224
01:08:44.720 --> 01:08:46.720
triathlon now this year. I want to do either an
1225
01:08:46.760 --> 01:08:47.960
iron Man or half iron Man.
1226
01:08:48.000 --> 01:08:51.039
I haven't decided I'd do that with you, but I
1227
01:08:51.039 --> 01:08:55.680
think my knees would say no on the running. In fact,
1228
01:08:55.720 --> 01:08:58.680
I got an MRI scheduled for next week from my shoulders,
1229
01:08:58.720 --> 01:09:05.199
so man, I'm breaking down. Yeah, and last I.
1230
01:09:05.159 --> 01:09:07.760
Watched my dad fall apart, and I just I feel
1231
01:09:07.760 --> 01:09:09.319
like I need to keep moving, so I don't.
1232
01:09:09.479 --> 01:09:12.600
So the last day I was going to give this
1233
01:09:13.479 --> 01:09:16.239
my last thing to saying go Bills because I'm hoping
1234
01:09:16.359 --> 01:09:19.600
for the Super Bowl. But well I still say go
1235
01:09:19.680 --> 01:09:21.600
Bills because I love them.
1236
01:09:21.960 --> 01:09:25.399
Okay, so have you decided if you're rooting for the
1237
01:09:25.399 --> 01:09:26.359
Eagles or the Chiefs?
1238
01:09:27.920 --> 01:09:30.720
Have I decided whether I'm watching the Super Bowls?
1239
01:09:32.000 --> 01:09:32.600
Fair enough?
1240
01:09:35.640 --> 01:09:38.199
You know, I don't hate the Chiefs, but at the
1241
01:09:38.239 --> 01:09:40.760
same time, I got to root for the Eagles just
1242
01:09:40.800 --> 01:09:45.800
because they I don't want the Chiefs to win three
1243
01:09:45.800 --> 01:09:49.680
times in a row. They're not bad, They're not the
1244
01:09:50.359 --> 01:09:53.239
Patriots where I hated them, but still I don't want
1245
01:09:53.239 --> 01:09:54.800
to win three times in a row. And I think
1246
01:09:54.840 --> 01:09:56.640
that their fan base understands that too.
1247
01:09:57.920 --> 01:09:58.199
Yeah.
1248
01:09:58.239 --> 01:10:00.439
I like both teams, so I'm not sure or which
1249
01:10:00.479 --> 01:10:02.640
way I'm swinging yet, but.
1250
01:10:04.199 --> 01:10:04.920
A right good deal?
1251
01:10:05.399 --> 01:10:07.640
What was that was amazing? This year?
1252
01:10:08.239 --> 01:10:10.479
All right, well, I'm gonna go ahead and end the stream,
1253
01:10:10.520 --> 01:10:14.159
but thanks for coming, thank you, and until next time,
1254
01:10:14.239 --> 01:10:15.159
folks max out
1
00:00:04.799 --> 00:00:07.919
Hey, folks, welcome back to another episode of the Ruby
2
00:00:08.000 --> 00:00:11.160
Rogues podcast. This week, on our panel we have Ayush
3
00:00:11.279 --> 00:00:16.079
Nowatya Hello. Hello, I'm Charles max Wood from top End Devs.
4
00:00:16.719 --> 00:00:19.719
This week we have a special guest. We have David Henner. David,
5
00:00:20.239 --> 00:00:24.320
you gave a talk at Rails World in September talking
6
00:00:24.359 --> 00:00:29.039
about performance, and so we reached out because we thought,
7
00:00:29.079 --> 00:00:32.520
you know, hey, it's it's interesting to talk about. You're
8
00:00:32.560 --> 00:00:35.920
on the Zendesk Ruby scaling team, so it sounds like
9
00:00:35.960 --> 00:00:41.560
you're working on I guess a non trivial application. I
10
00:00:41.560 --> 00:00:43.320
don't know if it's just the traffic, but it seems
11
00:00:43.359 --> 00:00:47.759
like it's it's an involved app. So yeah, do you
12
00:00:47.759 --> 00:00:50.000
want to just give I guess any more introduction that
13
00:00:50.039 --> 00:00:51.799
you want us to have and then we can dive
14
00:00:51.840 --> 00:00:54.880
in and talk about how to do performance with Ruby.
15
00:00:56.880 --> 00:00:57.119
Yeah.
16
00:00:57.159 --> 00:00:59.439
I gave that talk, and the ironic part of that,
17
00:00:59.479 --> 00:01:03.359
I gave that same well, I gave almost the same
18
00:01:03.439 --> 00:01:07.439
talk within Zendesk, and it was it was originally an
19
00:01:07.519 --> 00:01:10.159
hour and a half and then at Zendesk I had
20
00:01:10.159 --> 00:01:12.640
to break it down to forty five minutes. And then
21
00:01:12.680 --> 00:01:14.159
I thought I was dumb because I thought it was
22
00:01:14.159 --> 00:01:17.079
a forty five minute talk for Raals World. I found
23
00:01:17.120 --> 00:01:22.400
out it was a thirty minute talk. It's all so
24
00:01:22.480 --> 00:01:26.560
I've got a lot more content, but yeah, thirty minutes
25
00:01:26.599 --> 00:01:30.840
and that's normal. Probably, Wow, thirty minutes, it's not much time.
26
00:01:31.760 --> 00:01:35.120
It's so funny to me because I talked to people
27
00:01:35.159 --> 00:01:37.359
who haven't spoken at a conference or haven't you know,
28
00:01:37.400 --> 00:01:42.480
given a talk in other settings. And you know, so
29
00:01:42.560 --> 00:01:45.120
for example, at church, a lot of times, you know,
30
00:01:45.120 --> 00:01:47.200
they'll have us give like a fifteen minute talk on
31
00:01:47.239 --> 00:01:47.760
a topic.
32
00:01:48.280 --> 00:01:51.319
But it's like, man, fifteen.
33
00:01:50.959 --> 00:01:53.640
Minute talks are hard, and they're like, what, you only
34
00:01:53.640 --> 00:01:55.400
have to come up with this much content, And I'm
35
00:01:55.400 --> 00:01:57.599
like I always come up with an hour's worth of
36
00:01:57.599 --> 00:01:58.920
content and have to cut it down.
37
00:01:59.400 --> 00:01:59.599
Yeah.
38
00:01:59.640 --> 00:02:01.879
Right, there's always more I could put in it.
39
00:02:01.920 --> 00:02:04.760
And so it's knowing what to take out more than
40
00:02:05.040 --> 00:02:08.120
knowing what to put in and then turning that into
41
00:02:08.199 --> 00:02:11.360
a I guess, a cohesive narrative.
42
00:02:11.439 --> 00:02:15.400
And yeah, anyway, having the flow is the hardest part. Yeah.
43
00:02:15.639 --> 00:02:17.840
Today it's like, oh my god, I need to have
44
00:02:17.919 --> 00:02:20.719
this and the original flow is so perfect that I
45
00:02:20.759 --> 00:02:25.599
have actually tweaked down at my company. Then to asking
46
00:02:25.759 --> 00:02:28.400
was like, yeah, I got this, And it wasn't until
47
00:02:28.639 --> 00:02:30.800
two months before the conference talk when I had to
48
00:02:30.800 --> 00:02:36.639
submit my papers. Oh thirty minutes. Oh oh no, let's
49
00:02:36.680 --> 00:02:40.800
get that done. I think it turned out fairly well
50
00:02:40.800 --> 00:02:43.400
though at the end of the day. I was the
51
00:02:43.520 --> 00:02:46.599
last talk on the last day, right before Aaron Patterson talked, though,
52
00:02:46.960 --> 00:02:49.039
and I will say that is the worst time slot
53
00:02:49.080 --> 00:02:52.319
to have, like you're worried about your talk the whole time,
54
00:02:52.360 --> 00:02:54.360
and first talk that I actually paid attention to I
55
00:02:54.360 --> 00:02:56.560
was still kind of little amped up, and that was
56
00:02:56.599 --> 00:03:02.319
Aaron's say goodbye speech. Basically, it's like right, dang.
57
00:03:03.199 --> 00:03:11.479
Yeah, so yeah, I've been there too. I want to
58
00:03:11.520 --> 00:03:15.159
just dive in. So you know what, what's kind of
59
00:03:15.159 --> 00:03:18.000
the low hanging fruit in the rails performance world.
60
00:03:18.280 --> 00:03:21.319
I think the big thing that people like, at least
61
00:03:21.360 --> 00:03:23.919
I don't hear people talking about. And it's like everybody
62
00:03:23.960 --> 00:03:26.960
focuses on. First off, a lot of people focus on
63
00:03:27.039 --> 00:03:29.759
really hard things, and it's like, hey, let's change it
64
00:03:29.800 --> 00:03:31.919
to a micro service. It's like, oh, yeah, that might
65
00:03:31.960 --> 00:03:34.039
make it faster, but probably is just going to hold
66
00:03:34.039 --> 00:03:37.400
a bunch of crust. But the big thing people don't
67
00:03:38.319 --> 00:03:43.599
advertise in the community is just observability and like trying
68
00:03:43.639 --> 00:03:47.400
to actually like find the things you need through. Let's
69
00:03:47.400 --> 00:03:51.039
say I use data Dog as endsk, but everybody can
70
00:03:51.199 --> 00:03:55.039
also complains about the cost of the observability and it's like,
71
00:03:55.360 --> 00:03:58.280
right now, you can actually make your costs lower by
72
00:03:58.319 --> 00:04:01.199
turning on software switches. You don't the observabilit one hundred
73
00:04:01.199 --> 00:04:03.400
percent of time, for example, and you can actually have
74
00:04:04.120 --> 00:04:08.120
like tricks around, like the observability layer just literally going
75
00:04:08.159 --> 00:04:12.159
out and like Okay, if we monitor something and something
76
00:04:12.199 --> 00:04:15.360
goes awry, turn on the observability layer. But don't turn
77
00:04:15.400 --> 00:04:17.680
it out all the time, because if you do, you're
78
00:04:17.759 --> 00:04:21.040
going to be paying half of your infrastructure talks or
79
00:04:21.120 --> 00:04:25.120
or infrastructure costs to Data Dog. So I started to
80
00:04:25.160 --> 00:04:28.199
talk with that and that was I hope a lot
81
00:04:28.240 --> 00:04:35.160
of people got valuable as an dollar figures stuff out
82
00:04:35.160 --> 00:04:35.360
of that.
83
00:04:35.959 --> 00:04:39.319
But then like, hang on, because I have a question
84
00:04:39.360 --> 00:04:43.160
about that. Yep, Because you know, I've used Century, I've
85
00:04:43.240 --> 00:04:49.680
used roll Bar, I've used a new relic. I'm trying
86
00:04:49.720 --> 00:04:52.439
to think of all the different ones that I've I've
87
00:04:52.560 --> 00:04:54.759
used over the years. I mean most of them they
88
00:04:54.839 --> 00:04:57.079
sponsor the show, and so I feel like I have to.
89
00:04:58.199 --> 00:04:59.959
I have to feel good about it being a good
90
00:05:00.040 --> 00:05:03.000
product before I go Okay, you can sponsor the show
91
00:05:03.040 --> 00:05:04.879
and I can go out and say you should try
92
00:05:04.959 --> 00:05:08.800
this one. And so I've tried a whole bunch of them,
93
00:05:08.839 --> 00:05:11.000
but most of them you just install the gem and
94
00:05:11.040 --> 00:05:14.360
then it just kind of, you know, behind the scenes,
95
00:05:14.399 --> 00:05:18.680
does the work. And so my question there is how
96
00:05:18.720 --> 00:05:20.279
do you put a switch around that? Do you just
97
00:05:20.319 --> 00:05:24.680
put it into your initializer? And then so, lawyer, how
98
00:05:24.720 --> 00:05:25.360
do you handle it?
99
00:05:25.920 --> 00:05:29.560
In the talk I gave the actual code, but there
100
00:05:29.680 --> 00:05:32.759
is a general. There is a general like, hey, it's
101
00:05:32.800 --> 00:05:36.439
on or off, and we always have that general thing on.
102
00:05:36.680 --> 00:05:39.040
So there's like the general. But then let's say in
103
00:05:39.120 --> 00:05:43.199
the traces that you get a stack trace and the
104
00:05:43.240 --> 00:05:45.279
default stat trace. I believe it is just one bar,
105
00:05:46.160 --> 00:05:50.279
nothing extraordinary, but you can actually turn a whole bunch
106
00:05:50.399 --> 00:05:52.759
of traces on within that trace.
107
00:05:52.839 --> 00:05:54.360
Oh okay, break.
108
00:05:54.120 --> 00:05:57.120
Down to see everything that's going on, and then you
109
00:05:57.160 --> 00:06:01.120
can actually identify, oh, this part of the code, here's slow,
110
00:06:01.959 --> 00:06:06.079
so bye by turning that on and off, like all
111
00:06:06.079 --> 00:06:07.439
of it on or all of it off. If you
112
00:06:07.480 --> 00:06:10.759
try it all on, all all of it off. I
113
00:06:10.759 --> 00:06:13.399
don't know what our costs that data dog would be,
114
00:06:13.519 --> 00:06:16.879
but I'd be willing that data dog would even say, hey, stop, uh,
115
00:06:17.439 --> 00:06:24.240
you're overloading us, right, But no, that's the big thing
116
00:06:24.319 --> 00:06:28.519
is like turning not the base layer on, it's all
117
00:06:28.519 --> 00:06:33.959
the other little things they're optional. And then what those
118
00:06:33.959 --> 00:06:37.199
optional traces are where the valuable data is though, Like
119
00:06:37.839 --> 00:06:39.920
it's the stuff that you can figure within your own
120
00:06:39.959 --> 00:06:43.399
application that gives you way more insight. It's like, hey,
121
00:06:43.399 --> 00:06:45.920
I want to put a trace around this certain method
122
00:06:46.240 --> 00:06:48.720
because I think it's slow. And then sometimes you do
123
00:06:48.800 --> 00:06:52.079
that and you're like, oh, that's fast. Where's the slum part?
124
00:06:52.480 --> 00:06:55.360
But if you put if you put that around enough thing,
125
00:06:55.680 --> 00:06:59.800
enough things, and we basically our main application, at least
126
00:06:59.839 --> 00:07:03.600
the ticketing inside of the application, we've we got the
127
00:07:03.639 --> 00:07:07.959
observability layer, like just it's covering almost everything. So if
128
00:07:08.040 --> 00:07:11.240
a certain customer starts to have slow response times, we
129
00:07:11.319 --> 00:07:13.639
just turn it on. Really, oh, we can focus on
130
00:07:13.759 --> 00:07:16.000
this part of the code and make the customer faster.
131
00:07:17.399 --> 00:07:18.839
I got you. That makes sense.
132
00:07:21.639 --> 00:07:24.319
But let's see what what am I doing now? Right now?
133
00:07:24.920 --> 00:07:27.000
I'm doing something that's not in my talk. It wasn't
134
00:07:27.079 --> 00:07:31.560
my talk, but it's also interesting. I think if you're
135
00:07:31.639 --> 00:07:33.959
a big company or you're a small company, you might go, well,
136
00:07:34.000 --> 00:07:38.560
why is that hard, And that would be we're changing
137
00:07:38.600 --> 00:07:42.399
the default scope for our main ticketing object. And the
138
00:07:42.480 --> 00:07:44.879
reason why we're doing that we're adding new columns to
139
00:07:46.000 --> 00:07:48.680
and it just seems like, okay, we just change the queries.
140
00:07:48.720 --> 00:07:51.199
Well you change every single query. You also have to
141
00:07:51.279 --> 00:07:53.480
change every index from out from under the hood, and
142
00:07:53.519 --> 00:07:58.439
you have to never have downtime and adding aex alone
143
00:07:58.920 --> 00:08:03.160
on our ticketing tables, they're just so huge. You can't
144
00:08:03.199 --> 00:08:08.040
just say, hey, DBAs add this. They'll say no to you.
145
00:08:08.879 --> 00:08:11.279
So you can lock that table for I don't know
146
00:08:11.319 --> 00:08:12.879
a few days exactly.
147
00:08:13.120 --> 00:08:17.000
You can't do. So it is a juggling act that
148
00:08:17.519 --> 00:08:19.560
luckily I don't have to deal with the DBA side
149
00:08:19.560 --> 00:08:22.839
of it. I don't know what the problems are. And essentially,
150
00:08:23.639 --> 00:08:26.680
when we move from a raw two to a RORA three,
151
00:08:27.160 --> 00:08:30.079
it did two things. First off, it made some problems bigger,
152
00:08:30.240 --> 00:08:33.519
so it made this a direction we needed to go.
153
00:08:34.000 --> 00:08:39.960
But also have you heard of invisible indices? No, So
154
00:08:40.000 --> 00:08:43.679
invisible indices is kind of what sounds like. Essentially, you
155
00:08:43.720 --> 00:08:46.120
have an index and a lot of times you're scared,
156
00:08:46.159 --> 00:08:49.759
too scared to delete any index because if you delete
157
00:08:49.759 --> 00:08:53.240
an index, it's gone and maybe you actually affected your application.
158
00:08:53.799 --> 00:08:57.039
So invisible basically says make it invisible. It's still there.
159
00:08:57.320 --> 00:09:00.799
The sequel is still populating that index to make it
160
00:09:00.840 --> 00:09:04.480
actually work, but you can see are there performance problems
161
00:09:04.480 --> 00:09:09.120
with it? So we have not deleted an index for
162
00:09:09.200 --> 00:09:11.600
fifteen years of our application, and now we're actually able
163
00:09:11.639 --> 00:09:13.919
to go in and say, hey, if we actually delete
164
00:09:13.960 --> 00:09:16.679
these induses, we can add new ones because we the
165
00:09:16.720 --> 00:09:21.759
memory profile won't blow up. So that is the the
166
00:09:23.000 --> 00:09:25.879
saving grace of allowing us to actually do this whole project.
167
00:09:26.120 --> 00:09:32.200
Without that, we'd be too scared because well, having things
168
00:09:32.320 --> 00:09:35.519
break is scary, a lout of money.
169
00:09:36.600 --> 00:09:37.799
So I'm curious.
170
00:09:39.200 --> 00:09:43.279
I mean, I've deleted indices off of databases that I've
171
00:09:43.279 --> 00:09:46.320
worked on, but i haven't done it on like very
172
00:09:46.360 --> 00:09:49.440
large tables. I've added into ses on very large tables
173
00:09:49.480 --> 00:09:56.080
and watched the thing go ah, But deleting them doesn't
174
00:09:56.120 --> 00:09:58.039
seem to have that same effect. So is there a
175
00:09:58.080 --> 00:10:01.639
downside to deleting them other than some queries that use
176
00:10:01.639 --> 00:10:03.120
those indicies might slow down.
177
00:10:03.480 --> 00:10:06.480
Right, and you don't know what, like like when your
178
00:10:06.559 --> 00:10:11.399
application is I think we have over I'm guessing to
179
00:10:11.440 --> 00:10:13.200
have over a thousand repos for example.
180
00:10:13.799 --> 00:10:14.120
Uh huh.
181
00:10:15.159 --> 00:10:21.120
You can't figure out whether you have beat down every
182
00:10:21.600 --> 00:10:24.639
location where every query that actually hits this. There's actually
183
00:10:25.240 --> 00:10:28.879
I had to go through every query in our main
184
00:10:29.480 --> 00:10:33.759
API and we separate our queries by the API queries,
185
00:10:33.799 --> 00:10:37.879
and we separate it by non API queries. Let's just
186
00:10:38.159 --> 00:10:41.799
that way. And the API queries is a manageable list
187
00:10:41.879 --> 00:10:44.519
of things that it's like a couple hundred queries to
188
00:10:44.679 --> 00:10:47.240
the ticketing table that actually happens. You can wrap your
189
00:10:47.240 --> 00:10:50.639
head around that. But the non to API queries, I
190
00:10:50.759 --> 00:10:54.720
think it was over forty thousand different unique queries. Oh wow,
191
00:10:55.039 --> 00:10:58.399
go through each query and say would this index work
192
00:10:58.440 --> 00:11:00.600
with this index work with no? No, no, no no.
193
00:11:01.600 --> 00:11:05.480
So so it is complex.
194
00:11:06.240 --> 00:11:07.679
So what's your approach to that then?
195
00:11:08.440 --> 00:11:13.120
Uh? So that luckily the things we care more about
196
00:11:13.159 --> 00:11:16.960
are the API queries, so we absolutely make sure that
197
00:11:16.960 --> 00:11:21.399
those actually are working, and the non API queries. We're
198
00:11:21.399 --> 00:11:24.399
actually moving a lot of that stuff to elastic search anyways.
199
00:11:25.200 --> 00:11:28.080
So our long term fix is actually all those things
200
00:11:28.080 --> 00:11:31.879
are never actually going to need a query. So, and
201
00:11:31.960 --> 00:11:34.519
I don't know how the magic of that works, Like,
202
00:11:35.039 --> 00:11:36.759
oh wow, you don't even need a query to get
203
00:11:36.759 --> 00:11:39.879
the data. That's awesome. Okay, I'm guessing somebody's looking at
204
00:11:39.960 --> 00:11:42.200
en logs or something like that and they're throwing that
205
00:11:42.360 --> 00:11:46.480
information rate from the bin logs into seql. But I
206
00:11:46.519 --> 00:11:49.159
have That's that's magic to me.
207
00:11:49.440 --> 00:11:52.919
So I used, do you have anything you want to
208
00:11:52.960 --> 00:11:53.519
jump in with?
209
00:11:54.840 --> 00:12:04.879
Uh, haven't seen your talk. Probably probably some stupid questions. Really, Uh,
210
00:12:05.960 --> 00:12:09.200
what kind of like where do you normally find performance
211
00:12:09.320 --> 00:12:13.000
bottlenecks in like apps? You see? Because I know you
212
00:12:13.200 --> 00:12:18.080
primarily are you're working for zenders, you've probably worked on
213
00:12:18.120 --> 00:12:20.320
that product for quite a while. But I'm a freelancer,
214
00:12:20.399 --> 00:12:21.679
So I look at I look at a lot of
215
00:12:21.679 --> 00:12:24.120
code bases, and what I see and it's all it's
216
00:12:24.159 --> 00:12:27.720
all rails. And what I see most of the time
217
00:12:27.840 --> 00:12:31.279
is people just haven't thought through the database design properly
218
00:12:31.960 --> 00:12:36.360
and they're doing all these funky joins or even worse,
219
00:12:36.519 --> 00:12:39.080
getting stuff out of the database and doing things in
220
00:12:39.159 --> 00:12:42.840
memory that you could quite easily do in the database.
221
00:12:43.000 --> 00:12:46.720
And it's like it's quite common mistakes like that is
222
00:12:46.759 --> 00:12:52.720
where I usually find performance bottlenecks. What's your experience in
223
00:12:52.759 --> 00:12:53.320
that regard.
224
00:12:53.759 --> 00:12:56.759
So the worst areas are where they add funky joints
225
00:12:56.840 --> 00:13:03.200
because sometimes you can't solve the is very easily. The
226
00:13:03.639 --> 00:13:06.960
talk was actually more focused on the coding aspect, like
227
00:13:07.080 --> 00:13:10.600
just simple things that people do that they should know
228
00:13:10.679 --> 00:13:14.919
about that they just don't do. So, for example, just
229
00:13:15.000 --> 00:13:19.840
memorization and a little different memorization techniques. And one of
230
00:13:19.919 --> 00:13:22.639
the cool things I brought up a zendes that we
231
00:13:22.679 --> 00:13:26.279
do is we have what I it's kind of like
232
00:13:26.279 --> 00:13:30.360
a singleton, but it's not. It's so our account object.
233
00:13:30.519 --> 00:13:32.519
If you get an account, it doesn't matter how you
234
00:13:32.559 --> 00:13:37.039
get that account. In the request cycle, you only need
235
00:13:37.080 --> 00:13:39.960
one account object. So if you call it tickets dot account,
236
00:13:40.080 --> 00:13:41.799
or if you call user dot account, or if you
237
00:13:41.840 --> 00:13:45.720
call just get me the account through this method called
238
00:13:45.799 --> 00:13:48.320
fetch account that we have, any way you get the account,
239
00:13:48.360 --> 00:13:51.360
it is the same exact object. So one of the
240
00:13:51.399 --> 00:13:53.360
cool things you can do based on that. So if
241
00:13:53.360 --> 00:13:57.759
you get the same object, if you memoize your whatever
242
00:13:57.759 --> 00:14:01.000
you're trying to memorize based on that one object, you
243
00:14:01.080 --> 00:14:07.679
can instead of actually have a request where hey listen,
244
00:14:07.720 --> 00:14:10.000
I'm going to memorize it on this object. But then
245
00:14:10.240 --> 00:14:12.960
someplace else in the application, your memoir. You want to
246
00:14:13.039 --> 00:14:15.039
use that, but you can't. You can't get to that
247
00:14:15.120 --> 00:14:18.840
original object. We can actually memorize it on this god object,
248
00:14:19.360 --> 00:14:22.919
and wherever we call that method again, it is memorized.
249
00:14:23.559 --> 00:14:27.120
So that was I thought, a really cool way of
250
00:14:27.360 --> 00:14:31.279
actually going about like memorizing something is having that god object,
251
00:14:31.519 --> 00:14:34.840
and then you don't have to worry about Okay, and
252
00:14:34.879 --> 00:14:37.720
the presenter we're calling it this way. In the controller
253
00:14:37.759 --> 00:14:39.360
we're calling it this way, and the models we're calling
254
00:14:39.440 --> 00:14:43.159
it this way. But we cannot tie those spaghetti pieces
255
00:14:43.159 --> 00:14:45.519
of code together. But because we have that god object,
256
00:14:45.639 --> 00:14:48.120
we can memorize it in one place and always access
257
00:14:48.200 --> 00:14:50.960
the same data throughout and then never have to worry
258
00:14:51.000 --> 00:14:53.720
about That was a cool thing that actually, well that
259
00:14:53.799 --> 00:14:54.519
was in the talk.
260
00:14:54.799 --> 00:14:57.279
But really, what are you use it for that or
261
00:14:57.360 --> 00:15:00.000
using current attributes or something else.
262
00:15:00.039 --> 00:15:03.039
Far as making it a god object. I wish I
263
00:15:03.120 --> 00:15:05.440
knew that was well before I came into But I
264
00:15:05.480 --> 00:15:09.639
think we're basically we created a method called fetch account
265
00:15:10.360 --> 00:15:15.080
and one we call fetch account outside there, and then
266
00:15:15.519 --> 00:15:22.120
in probably active record we override the account method an
267
00:15:22.159 --> 00:15:24.960
active record, not even every one of our models has
268
00:15:25.159 --> 00:15:28.120
an account method, so I'm guessing we override that and
269
00:15:28.200 --> 00:15:33.279
just memoize the account in the instant variable and it
270
00:15:33.279 --> 00:15:35.919
always goes back to that incident. That's just a guess.
271
00:15:36.759 --> 00:15:38.679
I've not actually looked at that code because I haven't
272
00:15:38.720 --> 00:15:41.320
needed to. And I was actually asked that at Rails World.
273
00:15:41.320 --> 00:15:44.559
I should actually really get into it, but the person
274
00:15:44.559 --> 00:15:47.840
who knows that best just left send us, so I'll
275
00:15:47.879 --> 00:15:51.320
have to dive into code instead of ask questions.
276
00:15:51.720 --> 00:15:54.799
Yeah, I thought current doctributes are probably a bit new.
277
00:15:55.720 --> 00:16:00.000
Came and five or something that we.
278
00:16:00.200 --> 00:16:03.559
Just upgraded to. Did we hit Rails eight yet seven?
279
00:16:04.360 --> 00:16:07.639
Either way? Like, it's so good to be closer to
280
00:16:07.759 --> 00:16:14.399
the edge. We're definitely on Rails seven for application. We're
281
00:16:14.399 --> 00:16:19.200
on Rails four for like six years or something like that.
282
00:16:19.279 --> 00:16:23.360
Who's so good to be closer to the edge.
283
00:16:25.039 --> 00:16:27.559
Yeah, I've experienced that too. For a long time, I
284
00:16:27.600 --> 00:16:31.960
was working on like Rails four five apps, and yeah,
285
00:16:32.080 --> 00:16:33.720
the last year or so, I've been able to work
286
00:16:33.759 --> 00:16:38.399
on Rail seven and Rails eight apps now. And what's
287
00:16:38.440 --> 00:16:40.320
fun is you get to go back now and figure
288
00:16:40.360 --> 00:16:42.480
out all the stuff that's been added in since. So,
289
00:16:43.159 --> 00:16:45.519
you know, I got into like stimulus and Turbo, and
290
00:16:45.559 --> 00:16:48.600
then figured out that oh look, Turbo actually will work
291
00:16:48.639 --> 00:16:54.440
through your what's it action cable channels and so you
292
00:16:54.480 --> 00:16:57.559
can you can push updates when you have sort of
293
00:16:57.600 --> 00:17:01.679
out of band anyway, just all this stuff that it's like, okay,
294
00:17:01.799 --> 00:17:04.759
I don't now need a full cycle to get this
295
00:17:05.319 --> 00:17:06.319
these features to work.
296
00:17:06.680 --> 00:17:08.599
So, being at a bigger company and we started on
297
00:17:08.759 --> 00:17:13.160
Rails one or something like that, upgrading through there's obviously
298
00:17:13.240 --> 00:17:17.440
monkey patches like throughout the years because well rails didn't
299
00:17:17.440 --> 00:17:19.759
have certain things and now they do, and now taking
300
00:17:19.759 --> 00:17:23.200
those monkey patches away is hard, which also means that
301
00:17:23.599 --> 00:17:27.119
really adding the newest features of Rails is hard, in
302
00:17:27.160 --> 00:17:30.359
fact almost impossible. But what we can do is like,
303
00:17:30.599 --> 00:17:33.880
for example, is like, yeah, this week we upgraded to
304
00:17:34.079 --> 00:17:35.799
Rails three to three, and all of a sudden, the
305
00:17:35.799 --> 00:17:38.519
performance got a lot better. But also, like let's say.
306
00:17:38.359 --> 00:17:42.039
In Ruby three yeah, or Ruby three three.
307
00:17:41.839 --> 00:17:43.960
Sorry, Rails three three yeah.
308
00:17:44.119 --> 00:17:46.680
I do remember upgrading to Rails three three back in
309
00:17:46.720 --> 00:17:47.440
the day, but.
310
00:17:47.839 --> 00:17:50.839
I remember upgrading the Rails three from two. That was hard.
311
00:17:50.960 --> 00:17:52.839
But that was brutal. That was brutal.
312
00:17:53.400 --> 00:17:54.519
That was the mob.
313
00:17:55.480 --> 00:18:02.720
Yeah, it was yeah, it is the herb Any long before.
314
00:18:03.279 --> 00:18:04.640
I don't have those, cause.
315
00:18:05.359 --> 00:18:06.799
Oh I haven't.
316
00:18:07.119 --> 00:18:09.480
Who'da did a ton of work on that? Yeah, it
317
00:18:09.519 --> 00:18:11.359
was it was brutal.
318
00:18:12.799 --> 00:18:15.119
But uh, where was I going with this? Oh? I
319
00:18:15.200 --> 00:18:17.880
forgot my train of thought.
320
00:18:18.400 --> 00:18:19.839
Upgraded to Ruby three.
321
00:18:20.599 --> 00:18:24.599
Upgraded Ruby three. I don't think I'm going to remember
322
00:18:24.599 --> 00:18:29.079
what I was thinking about. Oh, and like, for example,
323
00:18:29.119 --> 00:18:33.480
with Ruby three, Uh, we had in our application. We
324
00:18:33.480 --> 00:18:37.119
were very scared because we allowed, we had and still
325
00:18:37.279 --> 00:18:41.599
do allow customers to add their own rej axes. Well,
326
00:18:41.599 --> 00:18:43.880
if you had your own rejects, you can really slow
327
00:18:43.960 --> 00:18:48.079
down and stop you're you can just kill an application
328
00:18:48.160 --> 00:18:50.880
if you allowed the end users. So we had some
329
00:18:51.000 --> 00:18:53.720
weird way of actually making it so they couldn't just
330
00:18:53.839 --> 00:18:57.720
kill our system. But it spun up a process, and
331
00:18:57.720 --> 00:19:00.559
that's spinning up a process took about a half second second.
332
00:19:00.880 --> 00:19:04.200
Let's just say to actually spin up so it would run,
333
00:19:04.319 --> 00:19:08.000
and it make sure that rejects would never actually just
334
00:19:08.119 --> 00:19:11.079
be infinitely running. It would time it out at a
335
00:19:11.119 --> 00:19:16.039
certain point. But doing that was well added a half
336
00:19:16.119 --> 00:19:20.599
second every request. For example, Ruby three allows you to
337
00:19:20.640 --> 00:19:25.960
actually by default have a timeout in your rejexes. So
338
00:19:26.039 --> 00:19:28.880
now were in that extra process up. So now if
339
00:19:28.880 --> 00:19:33.440
you're all most cases you're just running in rejects, that
340
00:19:33.519 --> 00:19:38.079
takes a millisecond or two. Those other cases that actually
341
00:19:38.160 --> 00:19:42.799
do time out, those do time out just by default.
342
00:19:42.839 --> 00:19:44.759
With Ruby, we didn't have to actually do this weird
343
00:19:44.880 --> 00:19:48.680
fancy trick to actually make it happen. So that was
344
00:19:48.720 --> 00:19:53.039
actually a very very big upgrade for us because we've
345
00:19:53.079 --> 00:19:56.559
had those rejects, allowed people to put rejects's in forever,
346
00:19:56.599 --> 00:19:59.480
and we've had to protect against it forever, and that's
347
00:19:59.599 --> 00:20:05.000
just just bad. I think I would have if I
348
00:20:05.039 --> 00:20:07.160
was around way back then, it probably was like, no,
349
00:20:07.319 --> 00:20:09.880
don't let them put their own rejectses and give them
350
00:20:09.960 --> 00:20:11.920
an array of things that they can do. Don't give
351
00:20:11.960 --> 00:20:19.759
them an infinite array, right yeah, but but yeah, of
352
00:20:19.839 --> 00:20:25.240
our upgrades, it is just like looking at the code
353
00:20:25.279 --> 00:20:32.200
that's old, and people don't when it is an application
354
00:20:32.279 --> 00:20:35.960
is as big as it is. People cannot wrap their
355
00:20:36.000 --> 00:20:40.240
head around the whole ticket, save request of the cycles.
356
00:20:40.279 --> 00:20:44.680
Because we have everything gets into the ticket, there's triggers,
357
00:20:44.759 --> 00:20:50.359
there's not just every layer, and essentially people can't wrap
358
00:20:50.359 --> 00:20:52.400
their head around that. So once you put traces around this,
359
00:20:52.720 --> 00:20:58.039
you find blatant like obvious mistakes and you just tackle
360
00:20:58.079 --> 00:20:59.599
them one at a time, and most of the time
361
00:20:59.680 --> 00:21:04.400
it's coding mistakes. It's not and it's not even a mistake.
362
00:21:05.039 --> 00:21:07.079
It was I got to get this feature out fast.
363
00:21:07.240 --> 00:21:09.240
People don't think about performance when you have to get
364
00:21:09.240 --> 00:21:15.480
it out within a week. Right. But it's been good, actually,
365
00:21:15.640 --> 00:21:18.519
like the amount that we've saved and the ticket cycle
366
00:21:18.640 --> 00:21:22.000
and just not even ticket now we're actually since we
367
00:21:22.119 --> 00:21:24.319
did such a good job, we've been given more and
368
00:21:24.359 --> 00:21:27.200
more freedom to actually work in random areas of the code,
369
00:21:27.240 --> 00:21:31.240
and just the amount of improvements that we've made. You
370
00:21:31.279 --> 00:21:37.640
don't think of little coding things like, for example, scopes
371
00:21:37.759 --> 00:21:44.200
versus conditional associations, like a scope. Every time you call
372
00:21:44.240 --> 00:21:47.480
a scope, Rails makes the query. If you have a
373
00:21:47.480 --> 00:21:51.279
conditional association, it makes a query and Rails by default
374
00:21:51.680 --> 00:21:57.759
has that query cashed up. Just making that switch will
375
00:21:58.160 --> 00:22:01.720
reduce the number of queries, and sometimes queries aren't very free,
376
00:22:01.759 --> 00:22:04.160
so all of a sudden, you've just saved time. There
377
00:22:05.279 --> 00:22:10.079
so many N plus one queries where that so?
378
00:22:10.079 --> 00:22:13.279
So were you advocating for scopes or for.
379
00:22:15.279 --> 00:22:20.079
Both? Most of the time conditional queries when when when
380
00:22:20.119 --> 00:22:23.200
you're trying to like tweak the last bit of performance.
381
00:22:24.079 --> 00:22:29.720
I would be advocating for conditional association. Okay, scopes are
382
00:22:29.720 --> 00:22:33.160
not evil, it's just sometimes people don't realize. You know,
383
00:22:33.319 --> 00:22:37.119
I'm using this in the scope within a loop for example.
384
00:22:38.000 --> 00:22:39.359
Uh huh, And.
385
00:22:39.279 --> 00:22:42.599
All of a sudden, I'm getting like like just query
386
00:22:42.640 --> 00:22:44.480
after query after query, where if you don't put it
387
00:22:44.519 --> 00:22:46.759
in a loop, and you if you use a conditional association,
388
00:22:47.240 --> 00:22:49.680
that loop makes one query and you're you're.
389
00:22:49.559 --> 00:22:53.319
Done right, So it automatically eliminates the N plus one query.
390
00:22:53.359 --> 00:22:59.000
Is what you're saying, Yeah, well, yes, yes, but N
391
00:22:59.039 --> 00:23:01.400
plus one query. I always think of n plus one
392
00:23:01.480 --> 00:23:03.799
queriers is the things that you can add just includes
393
00:23:03.839 --> 00:23:06.799
in and it just goes away. Yeah generally, yeah, but
394
00:23:06.880 --> 00:23:09.119
this is an N plus one query that generates itself
395
00:23:09.200 --> 00:23:09.759
a different way.
396
00:23:10.640 --> 00:23:14.759
Yeah, if it was to do like some if I've
397
00:23:15.000 --> 00:23:16.799
just built like a new feature and I just want
398
00:23:16.839 --> 00:23:21.839
to reassure myself that I haven't made any stupid performance
399
00:23:21.880 --> 00:23:26.200
mistakes or or anything like that. Like because again, like
400
00:23:26.400 --> 00:23:29.240
with the work I do, it tends to perform, Like
401
00:23:29.400 --> 00:23:31.960
performance doesn't really come into it because I tend to
402
00:23:31.960 --> 00:23:36.720
work with startups and stuff, like what how do I
403
00:23:36.799 --> 00:23:41.200
just go about like even testing like certain things in
404
00:23:41.319 --> 00:23:44.279
my local dev environment in terms of like what do
405
00:23:44.319 --> 00:23:46.319
I put in my Ruby good to check how long
406
00:23:46.359 --> 00:23:48.079
stupp is taking? I don't even know that. That's how
407
00:23:48.119 --> 00:23:51.599
stupid this question is, because you know, back to the basics.
408
00:23:52.079 --> 00:23:55.160
You know, we have this debate all the time with
409
00:23:55.279 --> 00:23:58.640
internally because essentially the only way to find out is
410
00:23:58.759 --> 00:24:01.720
to have our huge customers. I don't name the customers,
411
00:24:01.759 --> 00:24:04.480
but we have a few huge, wile customers, and you
412
00:24:04.519 --> 00:24:06.640
put it on and you're going to find the problem
413
00:24:06.759 --> 00:24:10.759
very quickly. But then there's also the aspect of a
414
00:24:10.799 --> 00:24:14.920
new feature. Even when you deploy it looks great because
415
00:24:14.960 --> 00:24:18.720
nobody's using it right. Then two years later somebody uses
416
00:24:18.720 --> 00:24:23.160
it in a way that you don't anticipate. Reactive development
417
00:24:23.279 --> 00:24:25.720
isn't terrible. I would say, at the end of the day,
418
00:24:25.759 --> 00:24:28.960
your objective when you first get out is if you
419
00:24:28.960 --> 00:24:31.440
write the code clean, you can clean it up later.
420
00:24:32.359 --> 00:24:36.039
If you don't write the code clean, cleaning it up
421
00:24:36.119 --> 00:24:40.880
later is almost impossible. So I would say for feature developers,
422
00:24:41.480 --> 00:24:44.720
focus on keeping it clean, because once it's clean and
423
00:24:44.759 --> 00:24:49.079
it's very easy to read, somebody else can maintain it later.
424
00:24:49.200 --> 00:24:53.279
Then I would say that that's the case for like
425
00:24:53.400 --> 00:24:56.559
any small startup. Just focus on cleaning and a lot
426
00:24:56.559 --> 00:25:02.359
of different just review code and actually have an old job.
427
00:25:02.640 --> 00:25:06.599
I had. There's a guy he he hated me. He
428
00:25:06.680 --> 00:25:11.880
loved me, but I was just me because I would
429
00:25:11.880 --> 00:25:14.519
always review code and I would be like a stickler
430
00:25:14.559 --> 00:25:17.799
on making it really easy to read and maintainable and
431
00:25:17.799 --> 00:25:21.200
stuff like that. He was hated me, and then he
432
00:25:21.240 --> 00:25:23.759
eventually left that company, and I left that company, and
433
00:25:24.119 --> 00:25:27.839
I'm talking to old people and I've heard him say
434
00:25:28.359 --> 00:25:31.480
I miss Dave. Oh my god, I hated when he
435
00:25:31.559 --> 00:25:33.400
reviewed our code. But now I'm at a company that
436
00:25:33.440 --> 00:25:36.000
doesn't review code, and the crap that comes in here,
437
00:25:36.319 --> 00:25:41.160
we can't maintain it. Yeah, maintainability is ninety percent of
438
00:25:41.200 --> 00:25:43.200
getting your speed out of it, because if it's easy
439
00:25:43.200 --> 00:25:46.079
to maintain, it's easy. He don't want to add the
440
00:25:46.599 --> 00:25:51.000
the best trick for speed day one anyways, because if
441
00:25:51.000 --> 00:25:55.440
the code is never used, who cares if it runs
442
00:25:55.559 --> 00:25:58.880
a little, if it runs a two milliseconds slower, who
443
00:25:58.880 --> 00:26:01.480
cares care about the features that all of a sudden
444
00:26:01.559 --> 00:26:07.480
get like traction to make performance improvements? And then somebody,
445
00:26:08.200 --> 00:26:10.680
a team like mine is probably always required a big
446
00:26:10.720 --> 00:26:13.599
company is because eventually you get big enough where all
447
00:26:13.599 --> 00:26:16.000
of a sudden, hey ten years ago, people weren't paying
448
00:26:16.039 --> 00:26:23.920
attention to performance and now needs to and well, yeah, focus,
449
00:26:24.000 --> 00:26:25.880
done well.
450
00:26:25.680 --> 00:26:26.799
To your point on this.
451
00:26:28.400 --> 00:26:32.359
So we're actually running into performance issues on this application
452
00:26:32.400 --> 00:26:35.799
that I'm working on now for client. And what it
453
00:26:35.839 --> 00:26:39.640
does is it it does this gigantic calculation across a
454
00:26:39.640 --> 00:26:45.039
whole bunch of transactions on a hedge fund. And the
455
00:26:45.039 --> 00:26:48.279
people that wrote it, I mean, it's impossible to read,
456
00:26:50.279 --> 00:26:52.400
and so you know, you're trying to just parse through
457
00:26:52.400 --> 00:26:52.880
it and go.
458
00:26:52.839 --> 00:26:54.680
Okay, what what is it doing?
459
00:26:55.359 --> 00:26:57.799
And it's super hard, right, But the thing is is
460
00:26:57.839 --> 00:27:00.839
that it's it's in a psyche job. So it gets
461
00:27:00.920 --> 00:27:03.400
kicked off and you know, it runs, and you know,
462
00:27:03.480 --> 00:27:05.599
if it's a large fund, it can run forty five minutes,
463
00:27:05.640 --> 00:27:11.240
an hour, two hours, and you know, I'm looking at
464
00:27:11.240 --> 00:27:13.400
it and what we're you know, we had the conversation
465
00:27:13.519 --> 00:27:15.799
where we're saying, well, it'd be really nice to break
466
00:27:15.799 --> 00:27:18.519
this up, right so that you can parallelize some of
467
00:27:18.559 --> 00:27:20.799
the work because you have multiple workers, and so you
468
00:27:20.839 --> 00:27:24.440
know that would make it faster. And just getting to
469
00:27:24.480 --> 00:27:26.359
the point where we can actually figure out where to
470
00:27:26.400 --> 00:27:31.160
break it apart. Has been just I mean, it's been ugly,
471
00:27:31.640 --> 00:27:33.839
and you know, yeah, if it had been written in
472
00:27:33.920 --> 00:27:38.400
just a maintainable way, like you're talking about, where it's like, okay,
473
00:27:38.440 --> 00:27:41.680
I see where this kind of breaks down and you know,
474
00:27:41.759 --> 00:27:44.039
where it kind of goes into these methods and comes
475
00:27:44.079 --> 00:27:48.680
back out, it'd be way easier to do because it's like, Okay,
476
00:27:48.680 --> 00:27:51.000
we can turn these things into these things, and we
477
00:27:51.000 --> 00:27:52.200
can do these.
478
00:27:52.000 --> 00:27:52.720
Things over here.
479
00:27:52.839 --> 00:27:55.480
We can put these safeguards in place to make sure
480
00:27:55.480 --> 00:27:59.640
that it's not changing anything it shouldn't. But yeah, it's
481
00:27:59.640 --> 00:28:02.839
going to be a major overhaul, but it's like the
482
00:28:02.880 --> 00:28:06.119
core of the app, and so it's something that we're
483
00:28:06.160 --> 00:28:08.559
going to have to do. And so it's just been
484
00:28:08.599 --> 00:28:11.200
interesting to sit there and think about, Okay, yeah, if
485
00:28:11.200 --> 00:28:15.200
this had been written in a maintainable, readable, understandable manner, right,
486
00:28:15.319 --> 00:28:17.640
we're not even talking about how it executes or how
487
00:28:17.640 --> 00:28:20.240
fast it is in any other way, it would have
488
00:28:20.279 --> 00:28:22.400
made the fixes that we have to make to it
489
00:28:22.440 --> 00:28:28.119
now so much, so much easier. Yeah, And ninety percent
490
00:28:28.119 --> 00:28:30.079
of the problem is is that since it's all in
491
00:28:30.119 --> 00:28:36.279
one job, it's it does everything serially right. It does
492
00:28:36.279 --> 00:28:41.480
the whole process in one run without outsourcing any of
493
00:28:41.519 --> 00:28:41.839
the work.
494
00:28:42.720 --> 00:28:45.839
Yeah, everybody's ran into that application where they have a
495
00:28:45.880 --> 00:28:48.279
twenty six thousand line file and you're.
496
00:28:48.119 --> 00:28:52.920
Like what, Yeah, yeah, I don't think this one was
497
00:28:52.960 --> 00:28:55.400
twenty six thousand, but it's a few thousand at least.
498
00:28:56.119 --> 00:28:58.480
I'm thinking about a very specific contract they had a
499
00:28:58.480 --> 00:28:58.839
long time.
500
00:28:59.000 --> 00:29:02.880
Oh I'm sure. Yeah.
501
00:29:03.240 --> 00:29:05.400
Oh god, my one of my co workers worked at
502
00:29:05.400 --> 00:29:08.240
that job too. So if he listens to this, which
503
00:29:08.240 --> 00:29:10.079
I'm sure you will, he'll get a good laugh out
504
00:29:10.119 --> 00:29:13.039
of my comment right there. Yeah.
505
00:29:13.119 --> 00:29:15.880
But but it's interesting because, yeah, when we talk about performance,
506
00:29:15.920 --> 00:29:20.519
we don't often talk about clean code maintainability, you know,
507
00:29:20.720 --> 00:29:25.240
and and those kinds of things, because we're just talking about, yeah,
508
00:29:25.240 --> 00:29:27.319
what are the tweaks we can make?
509
00:29:27.359 --> 00:29:28.720
And then when we get into it.
510
00:29:28.759 --> 00:29:30.599
This is the other thing that I'm kind of pulling
511
00:29:30.640 --> 00:29:33.400
out of what you've been talking about, is that a
512
00:29:33.440 --> 00:29:35.359
lot of times the things that we're doing are not
513
00:29:35.599 --> 00:29:39.119
just simple fixes, right, because you know N plus one queries,
514
00:29:39.119 --> 00:29:40.920
it's like, okay, drop it includes.
515
00:29:40.480 --> 00:29:41.079
On it, right.
516
00:29:42.079 --> 00:29:44.039
You know, you want to make your query faster at
517
00:29:44.079 --> 00:29:47.279
an index, right, And most of the time. Those simple
518
00:29:47.319 --> 00:29:50.359
fixes will get you a long way, but you know,
519
00:29:50.440 --> 00:29:52.720
you get too far down the line, and yeah, all
520
00:29:52.720 --> 00:29:54.799
of a sudden, it's I have to restructure this to
521
00:29:54.880 --> 00:29:57.400
run a different way, or it's not gonna write in
522
00:29:57.480 --> 00:30:00.000
order to speed it up, or you know, there's gonna
523
00:30:00.160 --> 00:30:03.720
be some some massive infrastructure changes in order to make
524
00:30:03.720 --> 00:30:06.319
this faster, or you know, I have to change the
525
00:30:06.359 --> 00:30:08.920
way I'm doing caching or something like that, where it's
526
00:30:08.960 --> 00:30:12.200
not just this straightforward Oh okay, here's a shortcut. You
527
00:30:12.279 --> 00:30:15.400
got some speed out of it, and there are those
528
00:30:15.440 --> 00:30:18.359
I'm not saying they're not, but at a certain point,
529
00:30:18.440 --> 00:30:21.200
you get to that place where it's like, okay, all
530
00:30:21.240 --> 00:30:25.160
the all the quick fixes on this are done, and
531
00:30:25.240 --> 00:30:26.480
it's still not good enough.
532
00:30:26.519 --> 00:30:27.160
So now what?
533
00:30:28.599 --> 00:30:32.680
And if your code is maintainable, if you know, if
534
00:30:32.720 --> 00:30:34.759
you can approach it and understand it and know how
535
00:30:34.799 --> 00:30:38.440
to change it, it makes that job a lot easier.
536
00:30:39.279 --> 00:30:42.359
But it's it's also interesting because I've worked contracts where
537
00:30:42.359 --> 00:30:44.279
it's like I'm not I'm not going to pay you
538
00:30:44.319 --> 00:30:46.000
to write tests, and I'm not going to pay it
539
00:30:46.039 --> 00:30:48.160
a refactor, and I'm not going to pay it right
540
00:30:48.519 --> 00:30:52.319
and and I'm looking at them and going you realize
541
00:30:52.440 --> 00:30:55.359
that I'm going to be faster for the first like month,
542
00:30:56.200 --> 00:30:59.359
and then after that I'm going to have to refactor
543
00:30:59.480 --> 00:31:02.839
or write test in order to understand what the hell
544
00:31:02.839 --> 00:31:05.559
what this even does so that I can make it
545
00:31:05.599 --> 00:31:07.480
do what you want or change what it does.
546
00:31:08.160 --> 00:31:13.480
M Oh yeah, yeah. Without tests, I wouldn't be able
547
00:31:13.519 --> 00:31:16.559
to do any of my work right. That that is
548
00:31:16.599 --> 00:31:19.759
the key. And we don't have perfect test nobody probably does,
549
00:31:20.440 --> 00:31:22.599
but we have enough tests where all of a sudden,
550
00:31:22.640 --> 00:31:25.440
you change something and you can feel have a relative confidence.
551
00:31:25.480 --> 00:31:27.839
And I think that is another thing about performance work
552
00:31:27.839 --> 00:31:31.079
that you can't be afraid to change things and break it,
553
00:31:31.160 --> 00:31:35.359
which means you need to have software switches everywhere where
554
00:31:35.359 --> 00:31:38.440
you're turning it on and you're seeing if you broke.
555
00:31:38.799 --> 00:31:43.640
We've had extremely good luck within my UH group of
556
00:31:44.000 --> 00:31:47.920
turning these switches on and not breaking things. But if
557
00:31:48.000 --> 00:31:51.839
without those switches and while the monitors that you set up,
558
00:31:52.359 --> 00:31:55.599
you can't change anything because of fear, fear develop your
559
00:31:55.680 --> 00:31:58.279
driven development. It's like for it talking about before, it's
560
00:31:58.279 --> 00:32:00.920
like if you don't have like the indices that we
561
00:32:00.960 --> 00:32:02.920
took away, we didn't take it away because we're scared
562
00:32:03.680 --> 00:32:06.559
and was actually that was that before the show started.
563
00:32:06.599 --> 00:32:09.400
There's during the show that I talked about the indices
564
00:32:09.680 --> 00:32:11.359
forget anyways.
565
00:32:10.960 --> 00:32:13.079
I don't remember, yeah.
566
00:32:12.640 --> 00:32:17.359
Anyways, like yeah, so anyways, feared of a driven development
567
00:32:17.400 --> 00:32:20.680
will like slow down performance too because you don't, as
568
00:32:20.720 --> 00:32:23.440
you just said, you don't have tests. You're too scared
569
00:32:23.440 --> 00:32:28.200
to make any changes, like U will work And I
570
00:32:28.240 --> 00:32:30.480
don't know. My first couple jobs didn't have any tests.
571
00:32:30.480 --> 00:32:34.279
And then ever since then, I've had several jobs where
572
00:32:34.319 --> 00:32:36.799
I came in like nope, we're writing tests. No, I
573
00:32:36.839 --> 00:32:40.880
don't get No, we're not. No, yeah, we were writing
574
00:32:40.960 --> 00:32:45.079
tests and people are but how it's like, well, let's learn.
575
00:32:46.119 --> 00:32:46.559
Yeah.
576
00:32:46.640 --> 00:32:49.079
Well that's the other piece on the thing that I'm
577
00:32:49.119 --> 00:32:52.319
working on is there aren't tests and so it's like
578
00:32:52.440 --> 00:32:55.400
it's this mission critical thing that does all the valuations
579
00:32:55.400 --> 00:32:58.759
for all of the hedge funds and all of your customers.
580
00:32:59.440 --> 00:33:03.440
God and yeah, I mean I was just like you
581
00:33:03.640 --> 00:33:06.559
you want us to refactor this, but you know, but
582
00:33:06.640 --> 00:33:07.759
then I'm going putting a.
583
00:33:07.799 --> 00:33:13.200
Test on this is it's ugly, is so ugly.
584
00:33:13.960 --> 00:33:18.839
But the flip side is is that making it testable, right,
585
00:33:18.960 --> 00:33:21.160
writing the test will force us to refactor some of it.
586
00:33:21.960 --> 00:33:27.559
And when you wrote code without tests, typically methods all
587
00:33:27.559 --> 00:33:29.799
of a sudden go from I like to keep my
588
00:33:29.839 --> 00:33:33.079
methods within five lines of code and Ruby and Joba.
589
00:33:33.079 --> 00:33:35.359
I'm sure it would be different, but five lines of code,
590
00:33:35.440 --> 00:33:38.559
now that's not a rule, but you try to keep
591
00:33:38.599 --> 00:33:43.880
them small. Whereas if somebody wrote the original code without tests,
592
00:33:44.119 --> 00:33:48.039
usually they have one hundred let's just say, hundred line
593
00:33:48.079 --> 00:33:51.960
methods are not uncommon. Trying to test a hundred line
594
00:33:52.000 --> 00:33:57.440
method is like I felt, right, Uh, there's too many conditions.
595
00:33:57.440 --> 00:34:00.319
There's like seven ifs here I do.
596
00:34:02.119 --> 00:34:07.000
Yep, yeah, I I've heard that. I've heard that rule.
597
00:34:07.000 --> 00:34:08.280
I've heard that rule all the way up to like
598
00:34:08.320 --> 00:34:11.159
ten lines of code. Some people are a little bit
599
00:34:11.159 --> 00:34:14.440
more rigid on it than others. My rule of thumb
600
00:34:14.559 --> 00:34:17.480
is is if I'm talking to somebody and I'm explaining
601
00:34:17.519 --> 00:34:21.039
how something works, and I try and everything, that kind
602
00:34:21.039 --> 00:34:23.199
of happens at the same level, at the top level,
603
00:34:23.800 --> 00:34:28.800
right it it retrieves the you know, or maybe not
604
00:34:28.880 --> 00:34:31.000
even that right. That might be part of a lower step,
605
00:34:31.239 --> 00:34:35.119
but usually it's it makes sure that these conditions are
606
00:34:35.159 --> 00:34:38.159
met right, and then if the conditions are right, then
607
00:34:38.239 --> 00:34:42.000
it makes sure that you know it locks the table, right,
608
00:34:42.400 --> 00:34:44.119
does this other stuff in a transaction?
609
00:34:44.280 --> 00:34:44.400
Right?
610
00:34:44.559 --> 00:34:47.639
So there's this step right, Maybe the transaction is an
611
00:34:47.639 --> 00:34:50.880
implementation deal further down. But if I can say these
612
00:34:50.920 --> 00:34:54.079
are the five steps to do a thing right, and
613
00:34:54.119 --> 00:34:58.039
they're all mostly at the same conceptual level, then that's
614
00:34:58.159 --> 00:34:58.599
what my.
615
00:34:58.719 --> 00:34:59.719
Method should look like.
616
00:35:00.199 --> 00:35:02.159
And then underneath that it's like, okay, how do I
617
00:35:02.239 --> 00:35:05.880
do this stage of the theme right? And again at
618
00:35:05.880 --> 00:35:08.719
the conceptual level. And so once you start getting lower
619
00:35:08.760 --> 00:35:12.000
into the code or when I've written it, what you
620
00:35:12.039 --> 00:35:16.320
wind up seeing is is the bottom levels of the methods,
621
00:35:16.480 --> 00:35:19.119
they'll have some things that look like their implementation right
622
00:35:19.119 --> 00:35:21.719
where it's like I'm actually doing the query, and then
623
00:35:21.800 --> 00:35:24.760
maybe there's a and then call this to do the
624
00:35:24.760 --> 00:35:27.199
rest of the work because I feel like the retrieval
625
00:35:27.239 --> 00:35:30.079
and the work are at the same level. But you know,
626
00:35:30.239 --> 00:35:32.920
and then at the very bottom, yeah, it's just logic
627
00:35:33.760 --> 00:35:36.840
and just just being able to approach that and say, Okay,
628
00:35:37.039 --> 00:35:39.920
I see what the process is. Okay, I see what
629
00:35:39.960 --> 00:35:43.719
the process for this part of the process is. That's
630
00:35:43.800 --> 00:35:45.760
how I like to approach it. So yeah, so sometimes
631
00:35:45.760 --> 00:35:46.840
I wind up with a twenty or.
632
00:35:46.880 --> 00:35:48.519
Thirty line method.
633
00:35:49.880 --> 00:35:51.519
But at the end of the day, I'm looking at
634
00:35:51.559 --> 00:35:54.920
it and going, I understand, I can look at this
635
00:35:55.000 --> 00:35:55.840
and know what it does.
636
00:35:58.119 --> 00:36:00.400
I think if you can't look at the method and
637
00:36:00.480 --> 00:36:03.480
understand what a piece of it does, it's time to
638
00:36:03.480 --> 00:36:04.519
create another method name.
639
00:36:05.280 --> 00:36:06.679
Yeah, well that's another one.
640
00:36:06.880 --> 00:36:10.559
When I first got started, I kind of had this
641
00:36:10.719 --> 00:36:13.320
ethos from Rails where it was like, you know, they
642
00:36:13.320 --> 00:36:16.800
have convenient methods called like fine or you know, update
643
00:36:16.920 --> 00:36:18.519
or things like that, and I was like, okay, so
644
00:36:18.559 --> 00:36:20.960
I've got to come up with this short, you know,
645
00:36:21.119 --> 00:36:25.920
concise name nowadays is like updates the thing on the thing,
646
00:36:27.320 --> 00:36:29.679
because then you look at it and you're like, oh,
647
00:36:29.840 --> 00:36:30.800
I know what this does.
648
00:36:32.280 --> 00:36:34.960
I'll just make a guess on how many methods there
649
00:36:35.000 --> 00:36:38.360
are that we've created just on our ticket object, and
650
00:36:38.639 --> 00:36:41.039
it's got to be at least five hundred.
651
00:36:41.119 --> 00:36:42.159
I don't know whether that's time.
652
00:36:42.280 --> 00:36:48.679
Yeah, a thousand. You can't create little things, little update
653
00:36:49.679 --> 00:36:52.320
method and know what the hell it's doing. You need
654
00:36:52.360 --> 00:36:52.920
a bit Well.
655
00:36:54.440 --> 00:36:57.039
It's it's also interesting because you're working on an application
656
00:36:57.079 --> 00:37:02.039
that mostly focuses around the ticket so everything everything touches
657
00:37:02.119 --> 00:37:03.119
this one core.
658
00:37:02.960 --> 00:37:07.679
Piece absolutely, and we created several teams around it, right.
659
00:37:08.880 --> 00:37:11.199
You know, I've worked on other projects that didn't have that,
660
00:37:11.360 --> 00:37:13.400
but then they had like this core two or three
661
00:37:13.760 --> 00:37:17.239
objects that were the same thing. I've almost never seen
662
00:37:17.280 --> 00:37:23.760
an app where, you know, everything's spread across everything. The
663
00:37:24.079 --> 00:37:28.480
only exception I can really think of is the way
664
00:37:28.480 --> 00:37:30.679
that Top Endevs is put together. But that's because I
665
00:37:30.719 --> 00:37:35.920
deliver several different types of media and so those kind
666
00:37:35.920 --> 00:37:38.679
of get the between those and like the membership and
667
00:37:38.800 --> 00:37:42.440
role management, you know, it kind of gets spread across
668
00:37:42.440 --> 00:37:44.480
all of that because it's do you have access to it?
669
00:37:44.480 --> 00:37:45.440
And then how do you deliver it?
670
00:37:45.760 --> 00:37:49.039
And so you know, I get a wide swath of
671
00:37:49.159 --> 00:37:54.239
things that people are going to be generally touching. But yeah,
672
00:37:54.280 --> 00:37:57.159
I mean even within their little areas, right, it's podcast
673
00:37:57.199 --> 00:38:00.960
episodes have a ton of stuff on them, right, course,
674
00:38:01.039 --> 00:38:03.639
lessons have a ton of stuff on them. And and
675
00:38:03.679 --> 00:38:06.199
it's for that same reason, right, because within that little
676
00:38:06.239 --> 00:38:10.840
focused area, I've got that core piece and so understanding
677
00:38:10.880 --> 00:38:13.760
that and then recognizing, okay, so I've got to optimize
678
00:38:13.880 --> 00:38:15.960
and make it as easy to understand as possible.
679
00:38:16.000 --> 00:38:21.159
Around this thing, there's some some somebody else is going
680
00:38:21.239 --> 00:38:22.800
to maintain it and Chris, and you're.
681
00:38:23.519 --> 00:38:26.159
That's right, but I'm the boss, so that laughs Purson
682
00:38:26.159 --> 00:38:26.679
it quietly.
683
00:38:27.159 --> 00:38:31.119
Granted I worked at a company, it will go nameless
684
00:38:31.159 --> 00:38:36.480
that I before I got there. There's another topper that
685
00:38:36.599 --> 00:38:41.800
only named this also, and they didn't have everything was
686
00:38:42.280 --> 00:38:45.599
mixture between tabs and white space. There's always extra white
687
00:38:45.639 --> 00:38:48.280
space at the end. Nobody actually had any cleanup around that.
688
00:38:48.599 --> 00:38:50.679
So I wanted to want to created a script that
689
00:38:50.760 --> 00:38:54.199
basically made it so everything spaces and there's no extra
690
00:38:54.239 --> 00:38:56.199
white space at the Eddybody method. So you do it,
691
00:38:56.239 --> 00:38:59.119
get blame in that and everybody thought I wrote terrible code.
692
00:38:59.119 --> 00:39:01.840
I'm like, no, this is not my code right what
693
00:39:01.880 --> 00:39:04.559
it is, but get blame wise.
694
00:39:05.599 --> 00:39:09.159
Yeah, we've also, Yeah, I want to bring it back
695
00:39:09.159 --> 00:39:12.280
to performance a little bit. Kind of hit the maintainability
696
00:39:12.800 --> 00:39:15.480
idea pretty hard, and I think it's it's a critical
697
00:39:15.519 --> 00:39:18.440
piece of this, right because you're going to suffer trying
698
00:39:18.480 --> 00:39:22.519
to make performance happen with poorly maintained, poorly maintained or
699
00:39:22.559 --> 00:39:27.000
hard to maintain code. But when you're so you were
700
00:39:27.000 --> 00:39:30.039
talking about observability, I want to go back to that idea,
701
00:39:31.320 --> 00:39:33.559
like what are you actually looking for? Do you do
702
00:39:33.599 --> 00:39:36.239
you are you looking for kind of the like new
703
00:39:36.320 --> 00:39:38.360
relic for example, We'll break it down and say you
704
00:39:38.400 --> 00:39:40.280
spent this much time on your query, and this much
705
00:39:40.280 --> 00:39:44.280
time rendering the view, and this much time working in
706
00:39:44.280 --> 00:39:46.679
the controller, and this much time doing these other things.
707
00:39:47.440 --> 00:39:49.360
Is that what you're looking at when you when you
708
00:39:49.400 --> 00:39:52.519
see something slow or are you looking at some other
709
00:39:52.599 --> 00:39:55.800
breakdown or some other numbers, or how do you approach
710
00:39:55.840 --> 00:39:56.599
something like that?
711
00:39:57.800 --> 00:40:01.280
Before we started the team, it was basically, this is
712
00:40:01.320 --> 00:40:03.519
how long the presenter is taken, this is how long
713
00:40:03.599 --> 00:40:09.239
the controller is taken, and various little methods throughout saying
714
00:40:10.000 --> 00:40:14.599
they maybe validations. When we started this team, our first
715
00:40:14.639 --> 00:40:19.920
objective was, hey, listen, we need observability everywhere. So almost
716
00:40:20.199 --> 00:40:23.960
I'm not going to say every method, but every validator,
717
00:40:24.000 --> 00:40:28.400
for example, is wrapped in a data dog optional data
718
00:40:28.400 --> 00:40:33.360
dog tag where you can actually show really so literally
719
00:40:33.559 --> 00:40:37.199
every not every method, but a significant portion of the
720
00:40:37.239 --> 00:40:40.840
methods are actually showing. You can see and you can
721
00:40:40.920 --> 00:40:44.039
narrow down exactly in the code very fast, because all
722
00:40:44.079 --> 00:40:45.760
of a sudden, it's like you turn it down really
723
00:40:46.159 --> 00:40:49.920
there it is, it's right there, and you might have like, okay,
724
00:40:49.960 --> 00:40:52.920
it's within this section and there's three things going on
725
00:40:53.079 --> 00:40:56.960
here one of these three, and there's sometimes what happens
726
00:40:57.000 --> 00:40:59.119
is a lot of times it's one of the three.
727
00:40:59.280 --> 00:41:01.280
We have the option of trying to figure out where
728
00:41:01.320 --> 00:41:03.159
in the code. The slow part is where we have
729
00:41:03.239 --> 00:41:06.000
the option of just deploying more code that will tell
730
00:41:06.079 --> 00:41:09.000
us exactly where it is. And we've gotten to the
731
00:41:09.039 --> 00:41:13.280
point where there is some empty gaps, especially with the
732
00:41:13.320 --> 00:41:16.519
new features. When people add new features, they're not thinking
733
00:41:16.559 --> 00:41:19.239
about adding traces and stuff like that. But we can
734
00:41:19.320 --> 00:41:22.360
just really just go down and target exactly the method
735
00:41:22.360 --> 00:41:26.320
that we're looking for. And we've had things like you
736
00:41:26.400 --> 00:41:28.320
look at the code and you're like, oh, it looks fine,
737
00:41:28.360 --> 00:41:30.880
but you don't see a loop. And then way over
738
00:41:30.920 --> 00:41:33.159
here there's another loop, but that's in there. And then
739
00:41:33.199 --> 00:41:35.280
the way over here there's another loop and that's in
740
00:41:35.320 --> 00:41:37.400
there too. So you got I think they call that
741
00:41:37.519 --> 00:41:39.880
ncube or whatnottens, like all of a sudden, like, oh,
742
00:41:39.960 --> 00:41:42.159
obviously we need to do something with this, and then
743
00:41:42.239 --> 00:41:45.840
you add some for that specific one. I just added
744
00:41:45.880 --> 00:41:49.840
some memoization where all of a sudden, this last loop
745
00:41:49.960 --> 00:41:52.320
was just literally just it wasn't even a loop anymore,
746
00:41:52.519 --> 00:41:57.800
just calling it into a hash table look up and
747
00:41:57.800 --> 00:42:00.280
it's just a fan So all of a sudden turned
748
00:42:00.280 --> 00:42:02.400
it into an NQ but is still not good. But
749
00:42:02.880 --> 00:42:08.519
the performance of NQ versus and squared or whatever is huge.
750
00:42:10.519 --> 00:42:12.679
We got a big enough performance game there. All of
751
00:42:12.679 --> 00:42:21.519
a sudden, I could run away from that problem.
752
00:42:18.760 --> 00:42:20.039
Kick it down the road a little bit.
753
00:42:20.440 --> 00:42:22.320
Oh my god. Some of the times you see the
754
00:42:22.320 --> 00:42:25.400
code and you're like, in it's business decisions that people
755
00:42:25.440 --> 00:42:28.360
make too. Do they make business decisions like yeah, I
756
00:42:28.400 --> 00:42:30.960
can see why the developer wrote it like this, But
757
00:42:32.000 --> 00:42:37.039
why didn't the developer tell you, no, no, we can't
758
00:42:37.119 --> 00:42:39.639
do that. It's going to not perform in five years.
759
00:42:40.639 --> 00:42:45.960
Yeah. Sometimes you don't know though, at the end of
760
00:42:46.000 --> 00:42:46.400
the day.
761
00:42:46.559 --> 00:42:49.320
The one thing that I didn't talk about today or
762
00:42:49.440 --> 00:42:52.880
on might talk that I think is really important is
763
00:42:53.559 --> 00:42:57.119
when you first create an application and you deploy it,
764
00:42:58.039 --> 00:43:00.880
you can always set tight limits and the amount of
765
00:43:00.960 --> 00:43:05.000
data that you have, so product limit limits. Say, hey, listen,
766
00:43:05.039 --> 00:43:10.639
you can only have ten options in your drop down.
767
00:43:11.239 --> 00:43:15.239
That's obviously exaggeration, but you're allowed to put any ten,
768
00:43:15.280 --> 00:43:18.719
but you only get ten. You can always give more
769
00:43:19.599 --> 00:43:21.559
and eventually say I'll give you more. I'll give you more,
770
00:43:21.599 --> 00:43:25.239
I'll give you more. But going from hey, you get unlimited.
771
00:43:25.400 --> 00:43:28.519
I remember the first thing I worked at at Zendesk
772
00:43:28.679 --> 00:43:32.239
was you can have unlimited brands. Well, now the limit
773
00:43:32.360 --> 00:43:37.480
is three hundred because we realize that unlimited brands means
774
00:43:37.559 --> 00:43:42.719
almost well, unlimited complexity. And you can give me one
775
00:43:42.840 --> 00:43:46.280
hundred thousand brands because and that's one hundred thousand domains
776
00:43:46.320 --> 00:43:50.559
and that's the complexity around that is just too big.
777
00:43:50.679 --> 00:43:59.440
So yeah, adding limits to your product. And as a developer,
778
00:43:59.480 --> 00:44:02.280
I think that our responsibility to tell the product people
779
00:44:02.320 --> 00:44:05.639
that there's areas in the code. You go, if we
780
00:44:05.719 --> 00:44:09.360
have a hundred million of these, what does it? What's
781
00:44:09.400 --> 00:44:13.880
the performance? It's sometimes very obviously we wouldn't be able
782
00:44:13.880 --> 00:44:16.119
to have one hundred thousand of these right when we
783
00:44:16.639 --> 00:44:19.679
first developing a product. Go back to your product manager
784
00:44:19.719 --> 00:44:24.880
to say, hey, that feature, if somebody actually uses it
785
00:44:24.960 --> 00:44:27.880
and use it a lot, it's not gonna work. And
786
00:44:27.920 --> 00:44:29.760
they might come back and say, nobody would ever do that.
787
00:44:29.760 --> 00:44:32.159
It's like, so, what's the problem with actually having a
788
00:44:32.199 --> 00:44:36.320
limit if nobody's ever going to run into it? So
789
00:44:36.880 --> 00:44:39.519
I think that's also very key, and that's not programming
790
00:44:39.559 --> 00:44:42.800
per se. But I think ninety or a huge percentage
791
00:44:42.800 --> 00:44:45.679
of our job as a programmers to go back to
792
00:44:45.719 --> 00:44:49.280
the product managers and telling them, hey, listen, in three
793
00:44:49.360 --> 00:44:53.320
years from now, we wouldn't want a drop down. We
794
00:44:53.400 --> 00:44:56.679
had dropdowns for example that had over one hundred thousand
795
00:44:56.719 --> 00:44:57.440
options in them.
796
00:44:58.159 --> 00:44:58.760
Oh wow.
797
00:45:00.360 --> 00:45:03.679
First off, the UI isn't very good, but just loading
798
00:45:03.719 --> 00:45:06.800
them up and for example, for this one, this one
799
00:45:06.840 --> 00:45:09.360
was cool and it wasn't actual talk because one of
800
00:45:09.360 --> 00:45:12.280
the things that we did well that customer that had
801
00:45:12.280 --> 00:45:15.679
one hundred thousand options, they churned because well, we're too
802
00:45:15.679 --> 00:45:19.800
slow for them, right. We actually we probably would be
803
00:45:19.800 --> 00:45:23.760
able to support maybe even one hundred thousand in the
804
00:45:23.800 --> 00:45:27.280
options now because what we did is we changed our queries.
805
00:45:27.320 --> 00:45:30.840
And our original queries was grabbing one hundred thousand active
806
00:45:30.880 --> 00:45:34.440
record objects. And you can have one hundred thousand active
807
00:45:34.440 --> 00:45:38.960
rectcord objects without a serious time penalty, right. But what
808
00:45:39.000 --> 00:45:42.599
we do now is we pluck for the data, so
809
00:45:42.639 --> 00:45:44.440
we get the data fields that we need, and we
810
00:45:44.480 --> 00:45:47.559
only need like two or three fields out of records,
811
00:45:47.679 --> 00:45:50.760
so you're not initializing one hundred thousand active record objects,
812
00:45:51.119 --> 00:45:57.960
so you grab one hundred thousands options right in the array.
813
00:45:58.559 --> 00:46:01.239
And then you populate it via the the erase slash
814
00:46:01.280 --> 00:46:03.239
hash that you get back, and all of a sudden,
815
00:46:03.280 --> 00:46:05.480
this is very fast now. And all of a sudden,
816
00:46:05.639 --> 00:46:08.320
that customer that had one hundred thousand options that churned
817
00:46:08.400 --> 00:46:12.480
five six years ago, we might be able to maintain
818
00:46:12.519 --> 00:46:16.039
them now, but they're not coming back right. And that's
819
00:46:16.079 --> 00:46:18.840
another reason why you have a performance teams. All of
820
00:46:18.840 --> 00:46:21.760
a sudden, once you start have enough churn, people are like, oh,
821
00:46:21.880 --> 00:46:23.480
customers are leaving because of performance.
822
00:46:24.199 --> 00:46:24.400
Yeah.
823
00:46:24.960 --> 00:46:28.840
Do you have any opinions around using things like five
824
00:46:29.000 --> 00:46:32.039
ars of falcon in front of reels to improve performance?
825
00:46:33.000 --> 00:46:34.960
Do you have any experience with that?
826
00:46:35.719 --> 00:46:46.320
I wish I did. No, Yeah, that's good. Of the
827
00:46:46.320 --> 00:46:48.480
answer as I can give you is yeah, no, I
828
00:46:48.559 --> 00:46:49.960
have not used fibers at all.
829
00:46:50.440 --> 00:46:53.599
So yeah, I just started a new side project and
830
00:46:53.639 --> 00:46:57.400
I've put falcon and not because it's the performance intensive project.
831
00:46:57.400 --> 00:47:00.400
It's just a side project that lets me play around
832
00:47:00.400 --> 00:47:03.599
with new stuff with no risk. I was like, why not,
833
00:47:03.960 --> 00:47:04.639
it'll be fun.
834
00:47:05.480 --> 00:47:07.559
I did that for what I worked for the UFC
835
00:47:07.639 --> 00:47:09.519
one time in the UFC thought they were gonna get
836
00:47:09.599 --> 00:47:14.840
a lot of different but it just they thought day
837
00:47:14.880 --> 00:47:18.360
one is gonna be bam. It's just an e commerce
838
00:47:18.400 --> 00:47:20.800
store too, so it's not going to get that much traffic.
839
00:47:20.840 --> 00:47:23.760
But UFC is like, but we're UFC. It's like yeah,
840
00:47:23.800 --> 00:47:28.480
but like it's still like only very small part. Anyways. Yeah,
841
00:47:28.519 --> 00:47:31.639
I remember I was able to play in that and
842
00:47:31.639 --> 00:47:34.400
it's like, hey, I'm just going to tweak every part
843
00:47:34.440 --> 00:47:36.239
of this e commerce app so you can go as
844
00:47:36.239 --> 00:47:39.000
fast as possible. I think they launched and had almost
845
00:47:39.000 --> 00:47:42.760
no traffic, but it was fast for the no traffic.
846
00:47:46.639 --> 00:47:47.519
Yeah.
847
00:47:47.639 --> 00:47:50.199
One thing that I'm running into with top end devs
848
00:47:50.280 --> 00:47:54.320
is the search takes like five seconds to run.
849
00:47:54.960 --> 00:47:58.039
So search is a very completely different team for us.
850
00:47:59.360 --> 00:48:05.159
For us, it's the exact opposite. So our search team
851
00:48:05.280 --> 00:48:09.639
is better than my sequel. Like whatever they're doing, they've
852
00:48:09.639 --> 00:48:16.920
made it index things quite fast, so we've done. There's
853
00:48:18.000 --> 00:48:22.400
APIs that sometimes you need. They needed to be like
854
00:48:23.000 --> 00:48:26.280
no most current data, so you were going after SQEL,
855
00:48:26.840 --> 00:48:30.239
But there's APIs where it's like, hey, if it's delayed
856
00:48:30.239 --> 00:48:35.280
by two hundred milliseconds, is it that big of a
857
00:48:35.320 --> 00:48:38.440
deal that we don't return all the tickets. We minus
858
00:48:38.519 --> 00:48:40.519
all the tickets except for the one last one that
859
00:48:40.519 --> 00:48:46.360
they put in right, and in those cases we've found
860
00:48:46.440 --> 00:48:49.280
the performance of a LASS search is so much faster, like,
861
00:48:49.679 --> 00:48:53.000
well we'll get our response times response times, we're just
862
00:48:53.079 --> 00:48:54.159
dropping half for example.
863
00:48:55.320 --> 00:48:57.159
Yeah, that's the thing that I've been looking at lately.
864
00:48:57.320 --> 00:49:03.719
Is I put in PG search and yeah, it's just
865
00:49:03.960 --> 00:49:07.880
you know, doing a multi search across all the models.
866
00:49:07.920 --> 00:49:10.039
I mean, it will give you back a result, but
867
00:49:10.639 --> 00:49:12.880
I had to tell the proxy server that sits in
868
00:49:12.880 --> 00:49:16.519
front of it, come all proxy, not to time out
869
00:49:16.599 --> 00:49:19.480
so fast in order to get those results. And yeah,
870
00:49:19.480 --> 00:49:22.199
I've been looking at possibly moving to elastic search because
871
00:49:22.199 --> 00:49:26.360
I hear it's really just stinking fast. I was using
872
00:49:26.400 --> 00:49:30.000
another search engine, mealy Search, but the problem I had
873
00:49:30.000 --> 00:49:34.440
there was that they I couldn't I could only search
874
00:49:34.519 --> 00:49:38.840
one type of object at a time, and so I
875
00:49:38.880 --> 00:49:40.760
had to go and say, okay, give me all the episodes,
876
00:49:40.760 --> 00:49:43.679
give me all the podcast and it was fairly fast,
877
00:49:44.400 --> 00:49:47.760
but I hated making six queries to it to get
878
00:49:47.800 --> 00:49:50.119
all the different things because I kind of want just
879
00:49:50.159 --> 00:49:53.960
the most relevant thing to show up first. And so yeah,
880
00:49:53.960 --> 00:49:55.800
that's where I'm looking at elastic search, because I think
881
00:49:55.840 --> 00:49:57.880
elastic search doesn't make you do that.
882
00:49:58.119 --> 00:50:01.440
So yeah, we have a differ team that maintains that. So
883
00:50:01.559 --> 00:50:05.000
that's another place where I just use plastic search and
884
00:50:05.039 --> 00:50:08.719
I was fast in our system, but we have That's
885
00:50:08.760 --> 00:50:11.920
the thing about being at a big company. There's areas
886
00:50:11.960 --> 00:50:15.280
where you know how to use it within your company,
887
00:50:15.320 --> 00:50:17.239
but to set it up or anything to be an
888
00:50:17.239 --> 00:50:22.880
expert on it. No, Yeah, that's where I missed the
889
00:50:23.000 --> 00:50:26.360
being a startup get you get to be an expert,
890
00:50:26.440 --> 00:50:30.760
or at least you get to play with more tools.
891
00:50:31.320 --> 00:50:38.280
Right, So, are there any other big secrets.
892
00:50:37.719 --> 00:50:39.960
That you want to share with us or thoughts before
893
00:50:39.960 --> 00:50:43.719
we head into picks.
894
00:50:43.760 --> 00:50:47.239
Nothing that's coming in to mind. But I mean, as
895
00:50:47.280 --> 00:50:53.559
I said, we have. I mean I'm creating a whole
896
00:50:53.559 --> 00:50:55.519
new talk. For example, I think I told you before
897
00:50:55.519 --> 00:50:58.519
we started, it's like how graph ql is going to be,
898
00:50:58.880 --> 00:51:02.280
uh speed up a whole bunch of things for us,
899
00:51:02.440 --> 00:51:07.519
and then just there's so many different areas that I
900
00:51:07.559 --> 00:51:09.639
was not able to hit that now I'm going to
901
00:51:09.840 --> 00:51:14.840
I'm submitting cocks right now to actually talk about those.
902
00:51:14.880 --> 00:51:19.079
But those are not well thought out in my brain yet,
903
00:51:19.119 --> 00:51:22.159
So I don't think I should be a talking about
904
00:51:22.440 --> 00:51:22.920
right now.
905
00:51:24.000 --> 00:51:26.840
Yeah, you mentioned graph ql, and I have to say
906
00:51:26.920 --> 00:51:31.320
my experience implementing things in graph Ql has been not
907
00:51:31.440 --> 00:51:36.800
my favorite thing that I've ever done. But you're talking
908
00:51:36.840 --> 00:51:41.599
about a performance aspect of it is. Yeah, I'm a
909
00:51:41.639 --> 00:51:43.800
little curious what you're looking at there. I know that
910
00:51:44.480 --> 00:51:46.719
with graph ql, the thing that people tend to like
911
00:51:46.840 --> 00:51:48.440
is that you make one query and you get all
912
00:51:48.480 --> 00:51:49.840
the data you need one go.
913
00:51:50.960 --> 00:51:53.719
So is that where the speed up comes from or
914
00:51:53.760 --> 00:51:54.440
is it something else?
915
00:51:54.760 --> 00:51:59.480
No? No, So we don't use Ruby every place, and
916
00:51:59.559 --> 00:52:02.840
our graph Ql endpoints we use Java. Then we're actually
917
00:52:02.840 --> 00:52:05.559
only using them internally. We're not using them externally yet,
918
00:52:05.679 --> 00:52:09.639
but internally it hits our Java service. Java does an
919
00:52:09.679 --> 00:52:13.239
amazing job of paralyzing things. So then Java makes like
920
00:52:14.360 --> 00:52:20.480
fifty ten probably, but let's say fifty different rest requests
921
00:52:20.880 --> 00:52:24.920
to gain application gets them all back way faster than
922
00:52:24.960 --> 00:52:28.559
if they was compiling up, and then that comes back
923
00:52:28.599 --> 00:52:30.840
to the Java app. The Java app knows how to
924
00:52:30.880 --> 00:52:33.400
configure and put it all in the way it's supposed
925
00:52:33.440 --> 00:52:35.199
to put it back, and then serializes it and sent
926
00:52:35.400 --> 00:52:39.159
back to the requester of the actual appeatt And because
927
00:52:39.199 --> 00:52:42.920
of the paralyzation of that, it's so much faster because
928
00:52:43.000 --> 00:52:47.760
rest requests right now in our application, we have something
929
00:52:47.840 --> 00:52:51.440
what we call internally side loads, where you can basically
930
00:52:51.440 --> 00:52:53.840
say I want anything I want. It's almost like a
931
00:52:53.880 --> 00:52:56.360
poor man's graph QL. Well, if all of a sudden
932
00:52:56.360 --> 00:53:00.639
you're doing that serially, it's just the response times here,
933
00:53:01.360 --> 00:53:04.960
so graftl speeding us up because it's basically forcing us
934
00:53:05.000 --> 00:53:09.119
to come back to true RESTful responses that are really fast.
935
00:53:10.119 --> 00:53:14.880
All right, cool, Well, let's go ahead and do some
936
00:53:14.920 --> 00:53:17.599
picks before we get to those.
937
00:53:17.719 --> 00:53:21.559
If people want to follow you online, where they find you, I.
938
00:53:21.480 --> 00:53:24.599
Think get hub or LinkedIn, or you'd find me. Dr
939
00:53:24.719 --> 00:53:27.159
Henter is usually what you find me. If you look
940
00:53:27.159 --> 00:53:30.719
for Dr Henter, get Hubb or Dr Henter. I think
941
00:53:30.760 --> 00:53:35.239
get LinkedIn. Even Dr Henner in my Gmail would work
942
00:53:35.280 --> 00:53:37.079
too awesome.
943
00:53:38.599 --> 00:53:41.800
All right, well, let's go ahead and do some picks.
944
00:53:43.159 --> 00:53:45.079
Are you sure? Do you have some picks for us?
945
00:53:45.960 --> 00:53:46.159
Yeah?
946
00:53:46.239 --> 00:53:49.840
Hang on one second, I have broken broad for my client,
947
00:53:50.119 --> 00:53:51.159
which is all the fun.
948
00:53:53.880 --> 00:53:54.599
I'm flaxing.
949
00:53:54.960 --> 00:53:55.440
I'm on it.
950
00:53:55.480 --> 00:53:57.400
I'll give you five minutes. I'm on it.
951
00:54:00.599 --> 00:54:03.440
Perfect timing, isn't it shouldn't I shouldn't have imrged. I
952
00:54:03.519 --> 00:54:06.119
merged up on requests just before coming onto this collision
953
00:54:06.199 --> 00:54:06.679
to done that.
954
00:54:08.920 --> 00:54:11.079
Yeah, so I used when he got real quiet over
955
00:54:11.119 --> 00:54:11.880
there that that's.
956
00:54:11.760 --> 00:54:12.440
What was going on.
957
00:54:12.480 --> 00:54:16.760
It was like, yeah, yeah, sorry about that.
958
00:54:17.079 --> 00:54:17.800
Sorry picks.
959
00:54:18.559 --> 00:54:21.360
I'm gonna start with a very selfish pick, which is
960
00:54:21.760 --> 00:54:24.840
I just relaunched one of my side projects called Skatagun
961
00:54:24.880 --> 00:54:29.599
dot Email, which has been in hibernation for like two
962
00:54:29.599 --> 00:54:32.239
and a half years because of the joys of sales
963
00:54:32.360 --> 00:54:37.679
tax and EU V eight. I was using Stripe for
964
00:54:37.719 --> 00:54:40.079
payments on my accounters Like, yeah, you know, you can't
965
00:54:40.079 --> 00:54:43.400
do that because you'll have to collect V eight for
966
00:54:43.480 --> 00:54:46.440
everyone in the EU. And I'm like, okay, thanks for
967
00:54:46.480 --> 00:54:51.639
telling me that now. So I've moved payments over to paddle, uh,
968
00:54:51.800 --> 00:54:54.719
which took a lot longer because I got distracted by
969
00:54:54.960 --> 00:54:58.119
this stuff, but it's it's back now. So Skatagun dot
970
00:54:58.159 --> 00:55:03.559
Email has relaunched it Tuesday. So that's one pick.
971
00:55:05.320 --> 00:55:05.559
The I.
972
00:55:07.079 --> 00:55:09.360
Usually do like a music or a TV show pick,
973
00:55:09.599 --> 00:55:12.840
So I'll go to the TV show this time. Severance
974
00:55:12.920 --> 00:55:17.920
on Apple TV season two just started. It's uh weird,
975
00:55:18.039 --> 00:55:20.800
and I like it. I like it very much. It's
976
00:55:20.840 --> 00:55:23.280
been a very strong start. I think it was quite
977
00:55:23.280 --> 00:55:26.800
a cliffhanger ending in season one, and the show has
978
00:55:26.840 --> 00:55:29.320
started off really strong, so if you haven't watched it,
979
00:55:29.360 --> 00:55:30.159
i'd recommend that.
980
00:55:30.960 --> 00:55:32.159
Just getting the links here for that.
981
00:55:32.920 --> 00:55:38.800
I've got a couple of picks I'm gonna put out there, so,
982
00:55:39.639 --> 00:55:42.320
as most of you probably know, I tend to do
983
00:55:42.880 --> 00:55:46.119
the board game picks as part of my picks, So
984
00:55:49.159 --> 00:55:53.360
I'm going to put out The game is called Cascadero,
985
00:55:55.519 --> 00:55:57.239
and it's.
986
00:55:59.079 --> 00:56:00.039
It's got some.
987
00:56:00.079 --> 00:56:04.280
Elements that are similar to other board games that I've played.
988
00:56:04.280 --> 00:56:06.639
So there's kind of a there's a track that you
989
00:56:06.719 --> 00:56:10.159
advance up, and you get rewards for hitting certain milestones,
990
00:56:11.519 --> 00:56:15.639
and you also get points for hitting certain milestones. The
991
00:56:15.679 --> 00:56:18.400
way that you advance up the track is you so
992
00:56:18.559 --> 00:56:22.199
there's a kingdom and the king has dyed, and so
993
00:56:22.360 --> 00:56:27.679
you're basically you're out there connecting the cities and things
994
00:56:27.760 --> 00:56:31.599
like that and spreading the word on the new king
995
00:56:31.719 --> 00:56:36.000
or whatever. And so you put little horsemen down on
996
00:56:36.039 --> 00:56:41.119
the on the board around these towns and you're connecting
997
00:56:41.199 --> 00:56:44.360
up the towns, and you get bonus points for say,
998
00:56:44.360 --> 00:56:47.639
connecting two towns to the same color. So the first
999
00:56:47.679 --> 00:56:49.360
time you do that for any given color there are
1000
00:56:49.360 --> 00:56:52.719
five colors, then you.
1001
00:56:51.920 --> 00:56:54.559
You get points you advance up the board.
1002
00:56:55.760 --> 00:56:59.360
If you are the first person to that city and
1003
00:56:59.400 --> 00:57:02.280
it's not the first horseman that you've put down in
1004
00:57:02.400 --> 00:57:05.239
the group, then you get one point. And if you're
1005
00:57:05.239 --> 00:57:09.039
the second, third, fourth, I guess you can do fourth
1006
00:57:10.440 --> 00:57:13.920
because other people can connect onto it as well, right,
1007
00:57:15.159 --> 00:57:17.320
but it's it's per group. So when you connect a
1008
00:57:17.480 --> 00:57:20.400
group to a city and you're the second or third,
1009
00:57:20.440 --> 00:57:23.000
or fourth person, you move your thing up the advanced
1010
00:57:23.039 --> 00:57:25.480
track or advance it up the track of that color
1011
00:57:25.599 --> 00:57:28.360
two spaces instead of one. And then if there's a
1012
00:57:28.360 --> 00:57:30.960
herald on the city, then you add one to whatever
1013
00:57:31.000 --> 00:57:35.119
you get to advance it. And then there's a bonus
1014
00:57:35.159 --> 00:57:40.400
for having connected two cities of all five colors with
1015
00:57:40.519 --> 00:57:43.719
any you know across any of or all of your groups.
1016
00:57:43.960 --> 00:57:48.199
And then there are also point bonuses for getting all
1017
00:57:48.239 --> 00:57:51.400
five of your markers past the first it's kind of
1018
00:57:51.400 --> 00:57:55.880
a finish line three on the second finish line, or
1019
00:57:55.880 --> 00:57:58.000
getting being the first person to get one all the
1020
00:57:58.000 --> 00:58:01.000
way to the end of one of the lines. And
1021
00:58:01.039 --> 00:58:03.320
the way that you win is you have the most
1022
00:58:03.440 --> 00:58:09.400
points of the people that get there their piece all
1023
00:58:09.440 --> 00:58:11.400
the way to the end of whatever color they're playing.
1024
00:58:12.119 --> 00:58:14.599
So when I was playing, I was playing as Red,
1025
00:58:15.280 --> 00:58:17.719
and so I made sure I got my piece all
1026
00:58:17.760 --> 00:58:19.440
the way to the end of Red, and then I
1027
00:58:19.480 --> 00:58:20.760
tried to get it all the way to the end
1028
00:58:20.760 --> 00:58:22.920
of yellow as well, but I didn't have to do that.
1029
00:58:24.840 --> 00:58:26.760
And then one of the other guys that I was
1030
00:58:26.800 --> 00:58:28.360
playing with got his all the way to the end
1031
00:58:28.360 --> 00:58:30.440
of blue, which was the color he was playing, but
1032
00:58:30.519 --> 00:58:32.119
he did that on his last turn, and if he
1033
00:58:32.159 --> 00:58:34.239
hadn't gotten it there, even though he had more points
1034
00:58:34.280 --> 00:58:36.440
than I did, because I got mine to the end
1035
00:58:36.480 --> 00:58:37.360
of the track, I won.
1036
00:58:37.760 --> 00:58:39.000
And so what your.
1037
00:58:38.840 --> 00:58:42.000
Goal is is you want to be the person who
1038
00:58:42.000 --> 00:58:44.039
gets it all the way to the end and has
1039
00:58:44.079 --> 00:58:46.199
the most points. But the way you end the game
1040
00:58:46.440 --> 00:58:48.880
is by getting more than fifty points. As soon as
1041
00:58:48.880 --> 00:58:52.440
somebody crosses that fifty point threshold, all the other players
1042
00:58:52.440 --> 00:58:55.440
get one more turn and then it ends. Or when
1043
00:58:55.519 --> 00:58:59.039
somebody runs out of horsemen and can't place another horseman,
1044
00:58:59.119 --> 00:59:00.800
that's the other way it ends. And that's the way
1045
00:59:00.800 --> 00:59:02.320
I ended for us, because we had never played it
1046
00:59:02.360 --> 00:59:04.880
before and so we weren't racking up the points the
1047
00:59:04.880 --> 00:59:06.119
way that we should have been.
1048
00:59:06.639 --> 00:59:09.920
But anyway, it was pretty fun. And then they're like.
1049
00:59:09.800 --> 00:59:12.199
I said, there are different rewards up the track that
1050
00:59:12.920 --> 00:59:15.960
you know, so you can advance another marker up the track,
1051
00:59:16.039 --> 00:59:19.280
or you can place another horseman, or you can move
1052
00:59:19.320 --> 00:59:21.239
a horseman or just stuff like that.
1053
00:59:21.639 --> 00:59:24.360
So anyway, it was pretty fun Cascadero.
1054
00:59:25.480 --> 00:59:27.320
It came out in twenty twenty four, so it's a
1055
00:59:27.360 --> 00:59:30.360
relatively new game and board game Geek gives it a
1056
00:59:30.360 --> 00:59:34.079
weight of two point five to three, which means that
1057
00:59:34.159 --> 00:59:36.960
if you're kind of a casual player, this might be
1058
00:59:37.559 --> 00:59:41.599
a little bit complicated, but not so complicated that you're
1059
00:59:41.719 --> 00:59:43.920
not going to enjoy it. I have to say that
1060
00:59:46.679 --> 00:59:51.639
the complicated part is just keeping track of what you've
1061
00:59:51.679 --> 00:59:56.280
connected with your groups, and then you know, keeping track
1062
00:59:56.320 --> 00:59:58.760
of how to move stuff up the track, and you
1063
00:59:58.840 --> 01:00:00.639
get used to that in the first time minutes or so,
1064
01:00:01.199 --> 01:00:03.960
and then I would probably wait it once you understand
1065
01:00:03.960 --> 01:00:06.800
those two things at like one point nine. I mean,
1066
01:00:06.840 --> 01:00:09.960
it's it's just those couple of concepts you have to
1067
01:00:09.960 --> 01:00:13.639
get used to and then you're good to go. It
1068
01:00:13.679 --> 01:00:15.559
took us about there were three of us playing. It
1069
01:00:15.559 --> 01:00:18.559
took us what forty five minutes maybe an hour, and
1070
01:00:18.599 --> 01:00:20.519
that was with us learning the game. So I would,
1071
01:00:20.519 --> 01:00:22.719
I would assume that it probably takes you know, if
1072
01:00:22.719 --> 01:00:25.719
you have four or five people playing, you know, I
1073
01:00:25.840 --> 01:00:28.800
thank you forty five minutes. So anyway, it was fun.
1074
01:00:29.400 --> 01:00:32.800
I definitely enjoyed it. One of my buddies is teaching
1075
01:00:32.840 --> 01:00:36.679
the hot games at salt Con in March, which is
1076
01:00:36.760 --> 01:00:40.199
the big board game convention up in Layton, Utah.
1077
01:00:40.320 --> 01:00:45.039
And yeah, anyway, so that was one of the games
1078
01:00:45.039 --> 01:00:45.559
he had to learn.
1079
01:00:45.559 --> 01:00:48.920
We'll probably pick up another one later, but yeah, I
1080
01:00:49.000 --> 01:00:51.840
really enjoyed it, So I'm gonna pick that. My wife
1081
01:00:51.840 --> 01:00:55.800
and I for TV shows, we just started watching season
1082
01:00:55.800 --> 01:01:01.039
two of The Night Agent and we enjoyed the first
1083
01:01:01.079 --> 01:01:07.960
season a lot, so I'll pick that as well. Let
1084
01:01:07.960 --> 01:01:09.199
me see if I get a link for that.
1085
01:01:09.719 --> 01:01:13.440
And then I am starting to.
1086
01:01:15.360 --> 01:01:18.199
Put together meetups and stuff for ruby Geniuses, so if
1087
01:01:18.199 --> 01:01:21.559
you go to rubygeniuses dot com. I kind of so
1088
01:01:22.679 --> 01:01:24.480
it took me a little longer to get it launched
1089
01:01:24.480 --> 01:01:27.199
than I wanted to. And the reason essentially is that
1090
01:01:28.679 --> 01:01:30.840
the stuff that I'm doing for top end devs as
1091
01:01:30.840 --> 01:01:36.719
far as like delivering courses and podcasts and stuff like that,
1092
01:01:36.960 --> 01:01:38.800
I've been talking to other people who want to use
1093
01:01:38.840 --> 01:01:39.239
the system.
1094
01:01:39.280 --> 01:01:42.480
I'm using and so rather than do the smart thing.
1095
01:01:42.320 --> 01:01:45.199
And just deploy them a copy, I made it a
1096
01:01:45.280 --> 01:01:47.199
multi tenant app so I can charge them for it.
1097
01:01:47.639 --> 01:01:51.000
So that that took a bit of work to kind
1098
01:01:51.039 --> 01:01:53.519
of get everything figured out and learn how to do
1099
01:01:53.599 --> 01:01:59.719
multi tenancy with Stripe connect on you know, on my app,
1100
01:02:00.199 --> 01:02:02.639
make sure I'm getting all the right web hooks and
1101
01:02:02.679 --> 01:02:05.119
all that stuff. But it's basically done. So if you
1102
01:02:05.119 --> 01:02:07.719
want to go sign up, I'm going to change the
1103
01:02:07.760 --> 01:02:09.800
price today. I'm going to move it down to forty
1104
01:02:09.840 --> 01:02:15.400
seven dollars just because I'm still pretty happy about the inauguration.
1105
01:02:14.960 --> 01:02:17.039
Of Donald Trump and he's president at forty seven.
1106
01:02:17.960 --> 01:02:19.559
But yeah, so if you want to go and sign
1107
01:02:19.639 --> 01:02:21.599
up for forty seven dollars, it will go back up
1108
01:02:21.599 --> 01:02:24.880
to ninety seven dollars in a few weeks and that'll
1109
01:02:24.920 --> 01:02:28.880
give you access to I'm essentially I'm putting together videos kind.
1110
01:02:28.719 --> 01:02:32.920
Of like railscast was or go Rails or Drifting Ruby.
1111
01:02:34.480 --> 01:02:37.360
My focus is going to be essentially I'm going to
1112
01:02:37.400 --> 01:02:39.760
say here's my project, and then you're gonna get a
1113
01:02:39.840 --> 01:02:42.400
video of me working on the project every week, and
1114
01:02:42.440 --> 01:02:45.320
it might be interspersed with and this is something that
1115
01:02:45.360 --> 01:02:47.039
I fixed on top end devs. Right, So if I
1116
01:02:47.079 --> 01:02:50.119
get elastic search working for the search for example, I
1117
01:02:50.199 --> 01:02:53.599
might work that in the first app I'm building is
1118
01:02:53.639 --> 01:02:59.000
actually to help track bills through the Utah legislature, and
1119
01:02:59.079 --> 01:03:01.679
so it's going to be hitting their APIs and working
1120
01:03:01.719 --> 01:03:04.760
around the gaping holes in their APIs.
1121
01:03:04.320 --> 01:03:06.320
Because they have gaping holes in their APIs.
1122
01:03:07.400 --> 01:03:09.480
So there may be some screen scraping and things like
1123
01:03:09.519 --> 01:03:11.920
that to get all the data in and then yeah,
1124
01:03:12.000 --> 01:03:15.280
putting together the alerts and stuff like that, so you know,
1125
01:03:15.440 --> 01:03:19.119
just you know, you get a notice that says, hey,
1126
01:03:19.159 --> 01:03:22.559
your bill went to committee, or you know, your bill
1127
01:03:22.599 --> 01:03:25.199
had its second reading, and so if it has a
1128
01:03:25.239 --> 01:03:27.960
third reading and passes, then it passes, you know, and
1129
01:03:28.079 --> 01:03:29.920
just kind of working through all that stuff and then
1130
01:03:29.960 --> 01:03:33.079
helping people connect with their legislators because I feel like
1131
01:03:33.159 --> 01:03:35.559
if we have more people involved in the legislative process
1132
01:03:36.119 --> 01:03:39.079
and talking to their legislators, regardless of which side of
1133
01:03:39.079 --> 01:03:41.360
the aisle you're on, I think.
1134
01:03:41.159 --> 01:03:42.519
We generally get better.
1135
01:03:43.920 --> 01:03:46.360
Legislation because I think most of the things when we're
1136
01:03:46.400 --> 01:03:49.000
talking about roads and schools and things like that, we
1137
01:03:49.280 --> 01:03:52.599
generally agree on what we want, whether you're right or left,
1138
01:03:53.119 --> 01:03:55.800
and So what I want is I want moms and
1139
01:03:55.880 --> 01:04:00.840
dads talking to the legislators and saying you're passing, you're
1140
01:04:00.880 --> 01:04:02.960
pushing this education bill, but that's not what we want,
1141
01:04:04.039 --> 01:04:06.079
you know, or things like that. So so that's what
1142
01:04:06.119 --> 01:04:07.719
I'm going to be working through and just showing people
1143
01:04:07.760 --> 01:04:10.599
how to do that. It's probably going to have some
1144
01:04:10.639 --> 01:04:15.719
premium features too that involve AI and doing bill summaries
1145
01:04:15.760 --> 01:04:19.880
for AI. I'm already doing this for another project, and
1146
01:04:19.920 --> 01:04:21.480
so yeah, you're going to get kind of a wide
1147
01:04:21.480 --> 01:04:24.800
breadth of things out of this. Also creating groups so
1148
01:04:24.920 --> 01:04:30.440
people can discuss bills together. I want to give organizations
1149
01:04:30.480 --> 01:04:33.679
an option for putting together their slate of bills and
1150
01:04:33.719 --> 01:04:36.840
where they stand on it, and give them some way
1151
01:04:36.840 --> 01:04:39.840
of posting that on their websites. So those are kind
1152
01:04:39.880 --> 01:04:41.239
of the features that I'm going to be putting in
1153
01:04:41.320 --> 01:04:47.000
so you know, imbedible stuff. So anyway, if you're looking
1154
01:04:47.039 --> 01:04:48.840
to learn any of those things, then then you want
1155
01:04:48.880 --> 01:04:51.559
to sign up for that. We're also doing the meetups
1156
01:04:52.320 --> 01:04:54.760
and we'll be going through some of the technologies, maybe
1157
01:04:54.800 --> 01:04:57.199
a little more in depth, so where in the videos
1158
01:04:57.199 --> 01:05:00.280
I'll be showing you I'm building this feature using Turbo,
1159
01:05:01.360 --> 01:05:03.480
I may go through, Hey, here are all the features
1160
01:05:03.519 --> 01:05:08.719
that turbo offers in this way or comal or I've
1161
01:05:08.719 --> 01:05:11.000
had people ask me for all kinds of stuff. If
1162
01:05:11.000 --> 01:05:13.880
you connect with me on LinkedIn too, I'll actually get
1163
01:05:13.880 --> 01:05:15.639
on a call with you and ask you what you
1164
01:05:15.679 --> 01:05:19.000
want to learn. So anyway, I've been way more long
1165
01:05:19.000 --> 01:05:22.760
winded on that than I want. But yeah, so that's
1166
01:05:22.840 --> 01:05:26.159
all going to be coming out through Rubygeniuses dot com
1167
01:05:26.800 --> 01:05:29.599
and yeah, so hopefully that's in the wheelhouse of things
1168
01:05:29.639 --> 01:05:32.239
you want. But yeah, we're going to be doing meetups
1169
01:05:32.280 --> 01:05:36.840
and tutorials and screencasts and courses in the whole nine
1170
01:05:36.880 --> 01:05:38.880
yards and you get access to all of that through
1171
01:05:38.920 --> 01:05:39.480
the membership.
1172
01:05:39.559 --> 01:05:42.280
So anyway, David, what are your picks?
1173
01:05:42.559 --> 01:05:45.920
Yes, So, I have a coworker actually that I work
1174
01:05:46.039 --> 01:05:50.760
side by side with that's publishing a book soon and
1175
01:05:50.800 --> 01:05:54.280
it's called rail Scales. He actually gives more talks about
1176
01:05:55.159 --> 01:05:59.440
scaling rails than I do. But Christian Polantis is his
1177
01:06:00.199 --> 01:06:03.719
the author's name, book name, Ral Scales. I'm actually very
1178
01:06:03.760 --> 01:06:06.039
interested in to see what it looks like and I
1179
01:06:06.079 --> 01:06:07.760
can't wait to get myself a copy. I hope I
1180
01:06:07.800 --> 01:06:10.960
get myself a free copy.
1181
01:06:11.039 --> 01:06:15.519
Yeah, become a technical reviewer. They give those out for free.
1182
01:06:16.320 --> 01:06:18.639
Well, I mean he works with me and he's yeah,
1183
01:06:19.159 --> 01:06:21.280
I'll tell him. I gave him a shout out. There
1184
01:06:21.360 --> 01:06:26.599
you go, you go. What else? I actually have one
1185
01:06:26.639 --> 01:06:34.320
other coworker that he wrote an article on AWS about
1186
01:06:34.440 --> 01:06:38.719
scaling Zendesk And if you do a search for the
1187
01:06:38.760 --> 01:06:46.079
guy's name is Anatoly aws Zendesk Performance, So Anatoly Aws
1188
01:06:46.440 --> 01:06:51.840
Zendesk Performance, you will find his article in Google and
1189
01:06:52.159 --> 01:06:54.039
he talks about some of the things that we've been doing.
1190
01:06:54.400 --> 01:06:56.800
Much more on the infrastructure side. He's a much more
1191
01:06:56.800 --> 01:06:59.199
of an infrastructure than a Ruby guy, but I work
1192
01:06:59.320 --> 01:07:06.039
side by side of the He's absolutely brilliant. Also, if
1193
01:07:06.079 --> 01:07:09.719
anybody's hiring product manager or managers in general, I know
1194
01:07:09.800 --> 01:07:12.320
several that got laid off, So feel free to ping
1195
01:07:12.360 --> 01:07:15.760
me on LinkedIn because I feel like there's some good
1196
01:07:15.760 --> 01:07:18.079
people out there that I know that I'd love to
1197
01:07:18.199 --> 01:07:25.280
connect to other people. And lastly, you guys probably don't
1198
01:07:25.320 --> 01:07:30.199
know Swift, but Swift is essentially an interactive game that
1199
01:07:30.239 --> 01:07:34.360
you connect to a bicycle a bicycle trainer, and I
1200
01:07:34.519 --> 01:07:39.360
absolutely love it. I'm I mean, I every night like
1201
01:07:39.480 --> 01:07:42.280
I do races sometimes and the last few nights I've
1202
01:07:42.280 --> 01:07:44.679
been doing races. I am not a racer. I am
1203
01:07:44.679 --> 01:07:47.559
not that fast, But at the end of the day,
1204
01:07:47.559 --> 01:07:50.639
I'll still go in and do the races. And I
1205
01:07:50.679 --> 01:07:55.159
think the category ds I'm taught. I'm I'm the best
1206
01:07:55.159 --> 01:07:56.519
of the worst category.
1207
01:07:56.960 --> 01:07:57.599
Oh, there you go.
1208
01:07:58.440 --> 01:08:01.760
So as soon as I get the next category, I'll
1209
01:08:01.760 --> 01:08:03.719
get destroyed. Yeah.
1210
01:08:03.760 --> 01:08:05.719
I got a membership to Swift when I bought my
1211
01:08:05.760 --> 01:08:10.159
bike trainer because I have a Wahoo trainer and or.
1212
01:08:10.159 --> 01:08:14.000
The is it the bike? Okay, I got the Kicker bike.
1213
01:08:15.119 --> 01:08:19.279
Okay, Yeah, I've only used it once or twice. In fact,
1214
01:08:19.319 --> 01:08:20.199
I think it expired.
1215
01:08:20.840 --> 01:08:25.399
But yeah, it's cool because it's yeah, it's almost like,
1216
01:08:25.920 --> 01:08:29.119
well I guess it's not almost like, but it's it's
1217
01:08:29.199 --> 01:08:31.760
kind of fun to just ride your bike.
1218
01:08:31.920 --> 01:08:34.000
And yeah, if you're.
1219
01:08:34.279 --> 01:08:36.479
Harder up the hills and all that stuff.
1220
01:08:36.119 --> 01:08:39.319
And exactly, and then that you're in Utah, so you
1221
01:08:39.319 --> 01:08:41.319
you suffer from the coldness and you don't want to
1222
01:08:41.319 --> 01:08:41.760
be biking.
1223
01:08:42.520 --> 01:08:44.640
Oh yeah, I don't train outside. I'm training for a
1224
01:08:44.720 --> 01:08:46.720
triathlon now this year. I want to do either an
1225
01:08:46.760 --> 01:08:47.960
iron Man or half iron Man.
1226
01:08:48.000 --> 01:08:51.039
I haven't decided I'd do that with you, but I
1227
01:08:51.039 --> 01:08:55.680
think my knees would say no on the running. In fact,
1228
01:08:55.720 --> 01:08:58.680
I got an MRI scheduled for next week from my shoulders,
1229
01:08:58.720 --> 01:09:05.199
so man, I'm breaking down. Yeah, and last I.
1230
01:09:05.159 --> 01:09:07.760
Watched my dad fall apart, and I just I feel
1231
01:09:07.760 --> 01:09:09.319
like I need to keep moving, so I don't.
1232
01:09:09.479 --> 01:09:12.600
So the last day I was going to give this
1233
01:09:13.479 --> 01:09:16.239
my last thing to saying go Bills because I'm hoping
1234
01:09:16.359 --> 01:09:19.600
for the Super Bowl. But well I still say go
1235
01:09:19.680 --> 01:09:21.600
Bills because I love them.
1236
01:09:21.960 --> 01:09:25.399
Okay, so have you decided if you're rooting for the
1237
01:09:25.399 --> 01:09:26.359
Eagles or the Chiefs?
1238
01:09:27.920 --> 01:09:30.720
Have I decided whether I'm watching the Super Bowls?
1239
01:09:32.000 --> 01:09:32.600
Fair enough?
1240
01:09:35.640 --> 01:09:38.199
You know, I don't hate the Chiefs, but at the
1241
01:09:38.239 --> 01:09:40.760
same time, I got to root for the Eagles just
1242
01:09:40.800 --> 01:09:45.800
because they I don't want the Chiefs to win three
1243
01:09:45.800 --> 01:09:49.680
times in a row. They're not bad, They're not the
1244
01:09:50.359 --> 01:09:53.239
Patriots where I hated them, but still I don't want
1245
01:09:53.239 --> 01:09:54.800
to win three times in a row. And I think
1246
01:09:54.840 --> 01:09:56.640
that their fan base understands that too.
1247
01:09:57.920 --> 01:09:58.199
Yeah.
1248
01:09:58.239 --> 01:10:00.439
I like both teams, so I'm not sure or which
1249
01:10:00.479 --> 01:10:02.640
way I'm swinging yet, but.
1250
01:10:04.199 --> 01:10:04.920
A right good deal?
1251
01:10:05.399 --> 01:10:07.640
What was that was amazing? This year?
1252
01:10:08.239 --> 01:10:10.479
All right, well, I'm gonna go ahead and end the stream,
1253
01:10:10.520 --> 01:10:14.159
but thanks for coming, thank you, and until next time,
1254
01:10:14.239 --> 01:10:15.159
folks max out