WEBVTT

1
00:00:05.160 --> 00:00:09.679
Hey, folks, welcome back to
another episode of JavaScript Jabber. This week,

2
00:00:09.720 --> 00:00:13.480
on our panel, we have Aj
O'Neill yo, yo yo, coming

3
00:00:13.519 --> 00:00:19.760
at you live from death by common
cold. Oh my. We also have

4
00:00:19.839 --> 00:00:24.920
Dan Shapier. It's been like ninety
degrees here, aj Yeah, I had

5
00:00:25.039 --> 00:00:28.760
two sets of family come in to
town. I caught something somehow. It

6
00:00:29.039 --> 00:00:34.679
put me on bed rest for three
days. Well, it's definitely over and

7
00:00:34.960 --> 00:00:38.799
it's definitely over ninety degrees here in
Israel, in Tel Aviv, and it's

8
00:00:38.799 --> 00:00:47.200
also kind of humid. So yeah, me from here. Awesome. We

9
00:00:47.240 --> 00:00:53.000
also have Steve Edwards yo, coming
at you from as always cloudy Portland.

10
00:00:54.960 --> 00:00:57.439
Look, I'm wishing for some heat, dance and some heat my way.

11
00:00:57.560 --> 00:01:02.759
Please. We sent a basketball player
your way, oh, in the draft,

12
00:01:03.600 --> 00:01:08.359
well not exactly. He was traded
to Portland right before the draft.

13
00:01:08.400 --> 00:01:12.719
He was playing in Washington before.
And Danny amdeeyes, an Israeli basketball player.

14
00:01:14.200 --> 00:01:18.079
Oh cool, yeah, I mean
boy, the international players are rule

15
00:01:18.159 --> 00:01:23.640
in the draft anymore. Yeah,
France dominated, Oh yeah draft, yeah

16
00:01:23.680 --> 00:01:30.000
for sure. Yeah, I watched
sports ball. The Euros are still going

17
00:01:30.000 --> 00:01:34.640
on anyway. I'm Charles Maxwood from
Top End Devs and yeah, I've had

18
00:01:34.719 --> 00:01:38.840
family come into town. It's been
ninety degrees here. I'm not sick.

19
00:01:38.920 --> 00:01:42.319
I just have seasonal allergies. Different
story. Anyway. We have a special

20
00:01:42.359 --> 00:01:49.560
guest and that is Michael Arnaldi.
And yeah, do you want to introduce

21
00:01:49.560 --> 00:01:53.719
yourself. Let us know what effect
you're having on the JavaScript community. That

22
00:01:53.840 --> 00:02:00.680
was really Steve. Yes, we're
starting on dead jokes and yeah, very

23
00:02:00.680 --> 00:02:02.879
funny topic. Hold on, hold
on, here we go. Sorry,

24
00:02:02.959 --> 00:02:08.919
I was doing something else. That's
too late. I'm promitedly. I'm currently

25
00:02:08.960 --> 00:02:14.800
sitting in Siena. I have no
idea how much it is in Feirenheit,

26
00:02:14.879 --> 00:02:20.599
but it's definitely hot. And what
is it peaning? Well, Celsius,

27
00:02:20.599 --> 00:02:25.639
Celsius, Yes, you know,
we're European. We work on normal measurements.

28
00:02:28.599 --> 00:02:32.080
No, I have to I have
to say that. You know,

29
00:02:32.199 --> 00:02:38.000
we also use this in Israel.
But generally speaking, the metric system makes,

30
00:02:38.159 --> 00:02:43.000
you know, makes more sense in
my opinion. But for actually,

31
00:02:43.080 --> 00:02:47.240
in the case of temperature, I
think fahrenheit might be a more human scale.

32
00:02:49.039 --> 00:02:53.439
Yeah. Primagen was mentioning this because
you can say something like, oh,

33
00:02:53.719 --> 00:02:55.800
it's in the seventies today, and
that kind of gives you a you

34
00:02:55.840 --> 00:03:00.879
know that gives you a brain a
broad range, like how seventies, low

35
00:03:00.879 --> 00:03:04.960
seventies, where's celsius? It's like
it's twenty three, or it's twenty four,

36
00:03:05.400 --> 00:03:07.719
or it's twenty five or whatever it
is, But like the range is

37
00:03:07.759 --> 00:03:13.680
the number. Yeah, it's kind
of like you know the grades you get

38
00:03:13.719 --> 00:03:17.039
in school, where you know you're
graded from zero, and maybe you're graded

39
00:03:17.039 --> 00:03:23.319
from zero to one hundred, but
literally everything below fifty is basically essentially fail

40
00:03:23.400 --> 00:03:29.639
in the same so it's you're really
graded from something like sixty to ninety.

41
00:03:31.319 --> 00:03:36.439
Yeah. Well when I lived in
Italy, yeah, I mean there's a

42
00:03:36.520 --> 00:03:40.280
huge difference between thirty and forty.
There's much less difference between seventy and eighty.

43
00:03:42.319 --> 00:03:45.360
Yeah. Sure in fahrenheit. So
so it's sort of like the Richter

44
00:03:45.439 --> 00:03:47.639
scale where you go up it's a
magnitude of ten every time a number goes

45
00:03:47.719 --> 00:03:52.680
up. Oh, we should do
that. It works. No, Celsius

46
00:03:52.759 --> 00:03:57.080
is linear, it's just that it
goes from water freezing to water boiling.

47
00:03:58.439 --> 00:04:05.159
So yeah, so anything about fifty, about sixty as you're dead yeah yeah,

48
00:04:05.439 --> 00:04:11.759
and in very hot summer it goes
to like forty five sometimes. Oh

49
00:04:11.840 --> 00:04:15.839
yeah, you are basically a non
human at that point. Yeah, when

50
00:04:15.839 --> 00:04:19.319
I lived in on Kona for basically
the entire month of August, it was

51
00:04:19.360 --> 00:04:23.879
one hundred and three, it was
like one hundred and three. Here it

52
00:04:23.959 --> 00:04:28.040
was it was forty two, and
it was a hundred percent humidity. And

53
00:04:28.120 --> 00:04:31.519
so, you know, I was
a missionary for the church, and so

54
00:04:31.600 --> 00:04:36.160
I could only take off so many
of my clothing articles before, right,

55
00:04:36.560 --> 00:04:40.240
I could not take off enough to
get comfortable. Let's just put it that

56
00:04:40.279 --> 00:04:44.879
way. So, yeah, my
daughter's been in Thailand for the last year

57
00:04:44.879 --> 00:04:48.439
as a teacher, and before she
came home, we you know, I

58
00:04:48.560 --> 00:04:53.680
look at the weather and it was
like, you know, about one hundred

59
00:04:53.879 --> 00:04:57.439
with ninety percent humidity or something like
that. She sort of got used to

60
00:04:57.480 --> 00:05:00.959
it. So it's you know,
she comes back here like, oh man,

61
00:05:00.040 --> 00:05:02.079
this is nothing. I want my
heat back. I'm like, well,

62
00:05:02.120 --> 00:05:04.639
I don't know about that much,
but I look at I look at

63
00:05:04.639 --> 00:05:09.759
the temperature, so it's only seventy
five in Chang Mai. And then my

64
00:05:09.800 --> 00:05:13.399
wife would say, but that's at
night, right, Oh yeah, yeah.

65
00:05:13.480 --> 00:05:16.240
Well, before we get to into
typescript and whatnot, I'll just mention

66
00:05:16.399 --> 00:05:20.399
that my daughter is currently in Sri
Lanka, so yeah, yeah, oh

67
00:05:20.639 --> 00:05:28.879
fine, Yeah, so normalizing cold
places currently, no, go do it

68
00:05:28.879 --> 00:05:31.800
a shirt and tie. That's fun. Anyway, So we're we're talking about

69
00:05:31.879 --> 00:05:38.399
effect and just for our listeners if
you're wondering, because if you google it,

70
00:05:38.439 --> 00:05:42.560
effect is kind of a common word. It's effect. That website is

71
00:05:42.600 --> 00:05:46.240
the web page you're looking for,
so you can get into Okay, what

72
00:05:46.360 --> 00:05:49.040
is this and what does it do? But uh, we're on a podcast

73
00:05:49.040 --> 00:05:53.000
and we're going to assume that you
haven't done that. So Michael, what

74
00:05:53.079 --> 00:05:57.680
is it and what does it do? Well, that's a that's a broad

75
00:05:57.800 --> 00:06:01.560
question. I would I would have
to say that in general, it's a

76
00:06:01.839 --> 00:06:08.879
kind of a typescript framework to write
production great code. It really came to

77
00:06:08.959 --> 00:06:15.240
exist out of out of needs on
a company I was working with when we

78
00:06:15.360 --> 00:06:19.439
migrated a lot of system from the
JVM JavaScript in the back end. Because

79
00:06:19.439 --> 00:06:24.240
you know, we were crazy people
around about five or six years ago.

80
00:06:24.639 --> 00:06:29.680
Why would you why would you ever
use a typescript on a serious on a

81
00:06:29.720 --> 00:06:32.680
serious back end project. Well,
it ended up costing way less than the

82
00:06:32.800 --> 00:06:40.319
JVM, and productivity was kih rocketing. The only issue is there was nothing

83
00:06:40.360 --> 00:06:45.639
to write really production grade code.
I have to interrupt you here because the

84
00:06:45.720 --> 00:06:48.639
previous company that I worked at,
which is Next Insurance, I left them

85
00:06:48.680 --> 00:06:54.399
about one and a half ago.
Uh. The front end was obviously you

86
00:06:54.439 --> 00:06:59.680
know web so it's it's it's JavaScript, it's react or it's Angular or react

87
00:06:59.759 --> 00:07:02.800
eate if it's a mobile device.
But the back end was all JVM.

88
00:07:03.199 --> 00:07:09.639
It was implemented in Courtlin and it
was all JVM. And you know when

89
00:07:09.720 --> 00:07:16.240
I jokingly mentioned the possibility of implementing
that stuff that business project in uh in

90
00:07:16.399 --> 00:07:23.160
JavaScript, I was met with hysterical
laughter. Well you see I was CEO,

91
00:07:24.000 --> 00:07:30.839
so the hysterical laughter was less less
present in that case. But yes,

92
00:07:31.759 --> 00:07:38.560
it is a hysterical laugh. But
that's the point. It's it's a

93
00:07:38.680 --> 00:07:44.000
very nice language, but it's really
hard to use it when you care about

94
00:07:44.040 --> 00:07:51.040
the software you write, and I
mean writing testable software, writing software debt

95
00:07:53.120 --> 00:07:57.480
can be monitored well, stuff like
observability and so on and so forth.

96
00:07:57.480 --> 00:08:05.160
It's a recent brand, but even
six years ago when I started developing Effect

97
00:08:05.160 --> 00:08:09.399
as an internal project, my main
goal was clean up the mess that we

98
00:08:09.399 --> 00:08:16.519
were building and we had We had
been developing banking applications and everything needed to

99
00:08:16.560 --> 00:08:22.040
be monitored properly. We had at
the time what was called open tracing,

100
00:08:22.199 --> 00:08:30.519
which later got sort of merged into
open telemetry as a as a larger effort,

101
00:08:31.360 --> 00:08:37.440
and we had promite us for metrics
we had well we had to do

102
00:08:37.600 --> 00:08:43.519
that stuff. So our code was
basically a hell of fright catches. Try

103
00:08:43.840 --> 00:08:48.399
open span, catch closed span if
there is an error. Finally, you're

104
00:08:48.440 --> 00:08:52.600
talking about the typescript code, right, You're not. I'm talking about the

105
00:08:52.600 --> 00:08:58.720
typescript code. Can I Before we
dive into typescript and obviously affect, which

106
00:08:58.759 --> 00:09:03.480
is like the gist of this conversation, I do want to talk a little

107
00:09:03.519 --> 00:09:09.120
bit more, if I may,
about that decision to move off of the

108
00:09:09.240 --> 00:09:15.320
JVM and move over to typescript.
Now, I watched your the talk that

109
00:09:15.360 --> 00:09:20.320
you recently gave an excellent talk at
the Effect conference. I think it was

110
00:09:20.320 --> 00:09:24.919
a closing keynote something like that about
how Effect came to be high. You

111
00:09:24.960 --> 00:09:28.080
know, obviously we'll discuss it here
as well, but it's still a highly

112
00:09:28.120 --> 00:09:33.279
recommended talk in my opinion. But
I do have to ask like a general

113
00:09:33.360 --> 00:09:39.919
question about JVM versus node, because
if you're talking about back end in JavaScript

114
00:09:41.039 --> 00:09:45.360
or typescript, you're basically talking about
Note, maybe band maybe Dino, but

115
00:09:45.720 --> 00:09:50.080
you know, essentially it's more or
less more the same. You know,

116
00:09:50.240 --> 00:09:54.360
one of the reasons that I mentioned, like about the circa laugh is not

117
00:09:54.399 --> 00:09:58.440
necessarily about the programming language itself.
I guess that comes to play into it

118
00:09:58.480 --> 00:10:05.240
as well, But it's also about
like whether or you know, JVM being

119
00:10:05.240 --> 00:10:13.399
an enterprise grade platform and doubting JavaScript
or the JavaScript engines as enterprise grade platforms.

120
00:10:15.000 --> 00:10:18.480
What do you think about that?
Well, for so, I would

121
00:10:18.840 --> 00:10:26.159
challenge the fact that the JVM is
generally enterprise ready, and the second element

122
00:10:26.279 --> 00:10:33.000
is I would challenge what enterprise ready
means. Actually, I know a lot

123
00:10:33.000 --> 00:10:39.679
of back and developers who six seven
years ago they would never think of writing

124
00:10:39.840 --> 00:10:43.919
back in dye script with no JS. At that point in time, there

125
00:10:43.960 --> 00:10:48.200
was no other choice. There was
only no JS. Only more recently came

126
00:10:48.279 --> 00:10:52.960
to exist other run times such as
Bando and so on and so forth.

127
00:10:52.720 --> 00:10:58.080
So at that point in time,
it was really targeting purely no JS.

128
00:10:58.360 --> 00:11:03.399
And the usual complaints are like,
that's not multi Threddit, But on the

129
00:11:03.440 --> 00:11:09.879
other side, you actually need multi
threading. Uh, probably not. And

130
00:11:09.879 --> 00:11:16.519
and there has been a more recent
wave of I don't know how to explained,

131
00:11:16.519 --> 00:11:22.559
but people, that's saving us a
goal. Pull me I was crazy,

132
00:11:22.919 --> 00:11:28.039
Now tell me I'm right in hammurgers, I could make out of the

133
00:11:28.080 --> 00:11:35.000
sacred cows you guys have been slaughtering
to be To be fair, with regard

134
00:11:35.039 --> 00:11:37.559
to multi threading, I totally agree
with you, I think, especially in

135
00:11:37.559 --> 00:11:41.879
this day and age of containers and
the fact that in many cases you're you're

136
00:11:41.919 --> 00:11:48.519
intentionally limiting the number of cores per
container. Then, especially then, then

137
00:11:48.600 --> 00:11:52.480
the whole point of multi threading kind
of goes out the window in a lot

138
00:11:52.519 --> 00:11:58.440
of ways. So the event loop
mechanism that you know jobscript uses is very,

139
00:11:58.559 --> 00:12:03.200
very effect active for this type of
thing. And people forget that note

140
00:12:03.360 --> 00:12:09.879
was created with JavaScript initially because Ryan
Dahl was looking for something like an event

141
00:12:09.960 --> 00:12:15.919
loop and this whole mechanism, especially
now with the sink a weight, it

142
00:12:16.080 --> 00:12:20.919
becomes much easier. But my point
is actually something else. It's more about

143
00:12:20.960 --> 00:12:30.480
the robustness of the platform itself.
Like you know how the garbage collector for

144
00:12:30.519 --> 00:12:35.000
example, or the networking stack.
I mean, how far do you trust

145
00:12:35.000 --> 00:12:41.759
them compared to quote unquote enterprise grade
solutions. You know, whether they be

146
00:12:41.919 --> 00:12:46.679
the JVM or GO or something like
that. Well, I mean, if

147
00:12:46.720 --> 00:12:52.480
you speak about garbage collection, you
should also pick a specific algorithm to target

148
00:12:52.679 --> 00:12:56.519
against. In the JVM, there's
many different garbage collectors in the JVM,

149
00:12:56.679 --> 00:13:01.840
and there's many different implementations of the
A b M itself. There's more enterprise

150
00:13:01.919 --> 00:13:07.919
y implementations, there's more open source
implementations. The two things changed quite drastically,

151
00:13:09.799 --> 00:13:13.519
at least at least in my in
my experience when when working with the

152
00:13:13.639 --> 00:13:20.639
JBM, I think overall no JS
and specific can be trusted a lot.

153
00:13:22.639 --> 00:13:26.360
I'm not too familiar with the other
newer run times. I've tribe them,

154
00:13:26.799 --> 00:13:33.960
but I have never deployed services that
were serving millions and millions of customers based

155
00:13:33.960 --> 00:13:39.879
on one Ortino, so I wouldn't
be able to say with the same level

156
00:13:39.879 --> 00:13:43.519
of confidence that they can be trusted. I'm sure they can, given that

157
00:13:43.600 --> 00:13:50.039
they are. They are based on
very similar jawstript run times. But the

158
00:13:50.159 --> 00:13:56.279
advantage of JavaScript, and it might
sound ridiculous, but it is a highly

159
00:13:56.279 --> 00:14:05.039
specified language that almost from their one
had very different browsers implementing it, and

160
00:14:05.240 --> 00:14:11.600
it has survived in browsers for a
long time. And UI development is I

161
00:14:11.879 --> 00:14:18.480
disregarded UI development for years, but
I think to realize that it is actually

162
00:14:18.600 --> 00:14:24.000
very complex and very performance intensive,
because you know, in a javastript,

163
00:14:24.159 --> 00:14:28.279
eventually in the browser you've got only
one thread, so if you block that

164
00:14:28.360 --> 00:14:33.720
thread, the interface stopped. But
there are interfaces that have to do a

165
00:14:33.759 --> 00:14:39.960
lot of things. I was developing
trading dashboards in JavaScript. There's a lot

166
00:14:39.000 --> 00:14:46.759
going on in the UI of a
trading dostboard that requires careful management of memory

167
00:14:46.879 --> 00:14:50.960
and so on and so forth,
and Childscript was always very fine. And

168
00:14:52.559 --> 00:14:54.919
when developing back ends, to be
honest, they never had an issue with

169
00:14:54.960 --> 00:15:03.720
the garbage collector. You may have
some that's totally that's totally normal, but

170
00:15:03.759 --> 00:15:07.840
also it's it's always a trade of
on how much memory you are located to

171
00:15:07.919 --> 00:15:11.879
the jazz process and so on and
so forth. If you don't allocate much

172
00:15:11.960 --> 00:15:16.679
memory, there's not gonna be a
lot of stop the word. So it

173
00:15:16.759 --> 00:15:22.080
goes back to your argument of parallelism. If you parallyze at the schedular level

174
00:15:22.159 --> 00:15:26.320
with multiple containers and so on and
so forth, that's not really there's not

175
00:15:26.519 --> 00:15:33.720
really any any huge problem with with
JavaScript per se, at least from from

176
00:15:33.759 --> 00:15:41.960
what i've seen. I've been mostly
developing IO intensive applications, so I wouldn't

177
00:15:43.000 --> 00:15:46.679
make the same argument when when we
talk about see few intensiveness and and other

178
00:15:48.279 --> 00:15:54.480
you know, other places in the
in the scale between memory allocations and so

179
00:15:54.519 --> 00:16:00.279
on and so forth. But for
io bound applications, which are like ninety

180
00:16:00.320 --> 00:16:04.720
plus percent of what we are all
developing, take the data from one database,

181
00:16:04.759 --> 00:16:11.360
push it in another API, you
call calf to stream out the events,

182
00:16:11.440 --> 00:16:15.039
and you know whatnot. It's basically
taking data from place A to place

183
00:16:15.120 --> 00:16:22.679
B. JavaScript piece is always very
effective in doing that type the type of

184
00:16:22.799 --> 00:16:29.159
job. One thing that I want
to point out though, is JavaScript is

185
00:16:29.799 --> 00:16:33.519
multi threaded, or at least the
implementations that we have are multi threaded.

186
00:16:33.559 --> 00:16:37.759
So it's not like the old Python
or the old Ruby. I believe that

187
00:16:37.799 --> 00:16:41.279
there may be some implementations of Python
and Ruby that that do take advantage of

188
00:16:41.360 --> 00:16:45.519
multi threadedness, like what Ryan Dahl
was working on in Ruby. Before he

189
00:16:45.639 --> 00:16:48.000
was working a note, there was
a I forget what it was called.

190
00:16:48.519 --> 00:16:55.399
I think it's called a vet machine
especially, but you know, it actually

191
00:16:55.519 --> 00:17:00.480
is multi threaded, and there is
a performance difference whether you run on single

192
00:17:00.519 --> 00:17:04.160
core or you run on two cores. You will get better performance running on

193
00:17:04.200 --> 00:17:07.240
two cores, because when you're running
on a single core, that means that

194
00:17:07.279 --> 00:17:12.920
the background tasks can't actually run in
the background, that everything has to be

195
00:17:14.079 --> 00:17:19.440
on one single core, and there's
no there's no ability to use the optimizations

196
00:17:19.440 --> 00:17:22.759
that it has. And you know
this is something that GO suffers from this

197
00:17:22.839 --> 00:17:26.960
as well. In fact, that
the most famous clip that we got from

198
00:17:26.000 --> 00:17:33.359
the show was me saying something not
quite right in the right context about this

199
00:17:33.440 --> 00:17:40.200
exact scenario. So I'll try to
say and the primogen picking then best basically

200
00:17:40.240 --> 00:17:48.680
picking up on that, I would
slightly modify the statement as saying that JavaScript

201
00:17:48.079 --> 00:17:56.599
itself is single threaded. The JavaScript
engine that runs JavaScript is not a single

202
00:17:56.640 --> 00:18:00.200
threaded and is able to leverage multiple
cores for greater efficiency. For example,

203
00:18:00.640 --> 00:18:06.400
you know we talked about garbage collection. It can it actually for example V

204
00:18:06.519 --> 00:18:11.839
eight actually offloads some of the garbage
collection activity off of the main thread if

205
00:18:11.880 --> 00:18:17.480
it to to a separate thread.
And if you've got multiple cores then obviously

206
00:18:17.759 --> 00:18:23.000
you bet you the benefit is greater. I Before we move on back to

207
00:18:23.079 --> 00:18:27.279
effect, which is why we're all
here, I would like to say that

208
00:18:27.319 --> 00:18:30.519
I totally agree with what you said, Michael, and I would also slightly

209
00:18:30.559 --> 00:18:37.000
add that also everything that's been happening
with you know, on on you know

210
00:18:37.079 --> 00:18:42.839
in in cloud environments like k W
s LAMBDAS and edge computing has also greatly

211
00:18:42.920 --> 00:18:53.720
contributed to JavaScript as a middleware slash
server side programming language and platform. I

212
00:18:53.720 --> 00:19:00.680
mean, JOSKIP has been almost from
from D one content center in in what

213
00:19:00.720 --> 00:19:06.920
we call BFFs beaconds for front and
so basically the first back and aggregating multiple

214
00:19:06.960 --> 00:19:15.480
different APIs that thing was always jaskop
was always very natural for that thing,

215
00:19:15.559 --> 00:19:21.640
to the point where now with full
stop frameworks we sort of get that embedded

216
00:19:21.680 --> 00:19:27.039
in the normal architecture because if you
develop enop with I don't know XJS remix

217
00:19:27.240 --> 00:19:32.680
or so on and so forth,
And I'm not a front end developer,

218
00:19:32.799 --> 00:19:38.880
so apologies if I haven't named other
very well designed frameworks, I just luck

219
00:19:40.039 --> 00:19:45.920
knowledge in that specific area. But
I have investigated a lot both next ys

220
00:19:45.960 --> 00:19:52.200
and bmix and the fact that you
have these sort of server actions or server

221
00:19:52.359 --> 00:19:56.519
functions however you want to call them, call them, it is the classical

222
00:19:59.079 --> 00:20:04.240
middleware in between your databases. Your
other APIs and so on and so forth

223
00:20:04.279 --> 00:20:10.799
that plut that together exactly for the
purpose of serving serving the front end.

224
00:20:11.039 --> 00:20:15.680
This is an io bound job to
do, and JavaScript has always been perfect

225
00:20:15.799 --> 00:20:22.160
for that. I think now JavaScript
is also getting adopted in the layers,

226
00:20:22.200 --> 00:20:29.240
more closer and closer to the actual, the actual back and back, and

227
00:20:29.319 --> 00:20:38.920
so it's moving progressively taking slices and
slices of the stack. I would also

228
00:20:38.920 --> 00:20:45.960
slightly correct what was said before about
multi threading in JavaScript, just just for

229
00:20:47.079 --> 00:20:52.920
the point of obsessive correctness. It
is multi threaded as an interpretation of the

230
00:20:53.000 --> 00:20:57.920
language, but the language itself is
not multi threaded, so there's no observability

231
00:20:57.920 --> 00:21:03.319
of different threads in JavaScript. It's
the engine that may or may not the

232
00:21:03.400 --> 00:21:10.960
site to allocate stuff on thread pulls. Usually for example five system operations and

233
00:21:11.000 --> 00:21:15.880
so on and so forth. They
were backed by thread pulls up until recently,

234
00:21:15.920 --> 00:21:25.839
where the kernels support a synchronous processing
of files. So the access to

235
00:21:25.839 --> 00:21:29.640
the flight system is now no longer
using thread pulls. It's just using straight

236
00:21:29.720 --> 00:21:36.519
up a non blocking, a non
blocking interface, and that is completely right

237
00:21:37.160 --> 00:21:41.400
V eight. But also I think
also spider Monkey, but I might be

238
00:21:41.440 --> 00:21:48.359
wrong in the internal details. Sometimes
garbage collection is notoriously one thing that is

239
00:21:48.440 --> 00:21:52.680
uploaded a lot of other threats.
So by no means it's backed by a

240
00:21:52.720 --> 00:21:57.519
single thread, but you can only
observe a single threat from the language,

241
00:21:59.319 --> 00:22:04.200
which makes all sense. Yeah,
Also parsing the actual JavaScript into bytecode can

242
00:22:04.279 --> 00:22:10.279
happen off the main thread as well. But getting back to effect, per

243
00:22:10.359 --> 00:22:14.279
my understanding of what you were starting
to say, because before I so rudely

244
00:22:14.319 --> 00:22:18.960
diverted you to other topics, you
were kind of in the process. You

245
00:22:18.039 --> 00:22:26.039
decided to move your company off of
the JVM and onto NOTE based back end,

246
00:22:26.640 --> 00:22:33.200
and that resulted in you writing a
lot of code and that kind of

247
00:22:33.240 --> 00:22:42.880
evolved into effect eventually. So how
did that magic happening? Because first of

248
00:22:42.920 --> 00:22:49.359
all, another big part of the
reasons why we moved no js was not

249
00:22:49.559 --> 00:22:55.720
only the architecture of note that actually
made sense for the services that we were

250
00:22:55.799 --> 00:23:00.759
running, but also it made sense
as an organization decision in the company.

251
00:23:00.759 --> 00:23:07.720
Because most of our developers were front
and developers trained in Typescript, we didn't

252
00:23:07.759 --> 00:23:11.920
have a lot of JVM developers.
We had been using both Skala and cootling,

253
00:23:12.839 --> 00:23:18.039
Coughtlin's a bit easier to get for
example, for Java people, Scala

254
00:23:18.079 --> 00:23:22.799
might be a bit more tedious,
but still for a small team, having

255
00:23:22.880 --> 00:23:30.519
to hire into two completely different landscapes
is hard, not only for the language

256
00:23:30.559 --> 00:23:34.960
but also for the runtime, you
know, optimized writing code in a way

257
00:23:34.960 --> 00:23:38.960
that is optimized in the JVM.
It's hard. It's a hard topic.

258
00:23:40.440 --> 00:23:44.440
It's a very valuable topic that many
do very well. But if you have

259
00:23:45.000 --> 00:23:48.680
five developers in totally, it's going
to be very hard that you have all

260
00:23:48.759 --> 00:23:56.559
the skills across the word required to
write very productive software from back to front

261
00:23:56.599 --> 00:24:00.960
and the so on and so forth. So the decision was on two different

262
00:24:00.640 --> 00:24:06.759
two different main reasons. One reason
was the JAM was a bit heavy for

263
00:24:06.839 --> 00:24:11.519
us, and the second reason was
we really had typescript developers and I wanted

264
00:24:11.519 --> 00:24:18.839
to use those developers across the style
and not have them in silos. So

265
00:24:18.920 --> 00:24:23.839
both of those reasons where were present
in the decision of moving over. We

266
00:24:23.920 --> 00:24:29.799
moved over progressively and we started to
write plain and normal type script. But

267
00:24:29.920 --> 00:24:33.680
as I was describing, we were
reaching a point where the code was no

268
00:24:33.759 --> 00:24:41.720
longer maintainable and we didn't have any
tools such as for example, in Java,

269
00:24:41.799 --> 00:24:49.519
you have runtime reflection. In Rust
and similar languages. You have macros.

270
00:24:51.440 --> 00:24:53.279
You can, for example, say
I want all my functions to be

271
00:24:53.359 --> 00:25:00.880
unnotated with spans. There's nothing similar
that you can do in JavaScript or pipescript.

272
00:25:00.960 --> 00:25:06.079
I used the two interchangeably. At
this point in time, doing all

273
00:25:06.519 --> 00:25:12.599
that work manually meant that our code
was really not maintainable and let alone testability.

274
00:25:12.640 --> 00:25:22.079
Testability was a horror story. So
that motivated what then became effect And

275
00:25:22.279 --> 00:25:26.920
it really started with me having a
look at different languages and solutions available in

276
00:25:26.960 --> 00:25:33.599
different languages. That's when when I
found out about Skull and Zeo and and

277
00:25:33.799 --> 00:25:40.920
and started taking some of the ideas
into typescript land. So looking again,

278
00:25:41.119 --> 00:25:44.000
I watched your talk, which,
like I said, is excellent, and

279
00:25:44.039 --> 00:25:52.240
you kind of emphasized several times there
that testing and testability was a significant motivator

280
00:25:52.000 --> 00:25:56.240
for the things that you did.
Weren't things that I kind of know v

281
00:25:56.480 --> 00:26:03.359
test or even then you know that
testing library, Well that maybe didn't exist

282
00:26:03.400 --> 00:26:08.079
at the time, but you certainly
had things like like mocau or Jasmine or

283
00:26:08.160 --> 00:26:12.359
jest or stuff like that. Weren't
they enough in terms of testability? Well,

284
00:26:12.440 --> 00:26:19.680
the issue is when you want to
test using Monkey patching, you're already

285
00:26:21.680 --> 00:26:26.000
in a in a place that that
is exposed to a lot of problem.

286
00:26:27.359 --> 00:26:33.599
Mainly you have to hook up into
into the loading time of modules, and

287
00:26:33.680 --> 00:26:38.039
you might have side effects all over
the place. So there's there's actually no

288
00:26:38.119 --> 00:26:42.799
guarantee that that you mock up the
module at the right point in time for

289
00:26:42.880 --> 00:26:48.559
your application to load the module,
and so on and so forth and point

290
00:26:48.680 --> 00:26:55.759
Q. There's no explicitness in the
dependency rap. You have no idea if

291
00:26:55.759 --> 00:27:00.599
a piece of code depends on the
database, depends on something else. You

292
00:27:00.640 --> 00:27:04.880
actually have to read the code to
understand that the thing. So to write

293
00:27:04.880 --> 00:27:08.119
the test, you have to read
the implementation. You have to know the

294
00:27:08.119 --> 00:27:11.960
implementation very well, and you have
to patch yourself at the right point in

295
00:27:12.000 --> 00:27:17.440
time to be able to test.
It is possible. I haven't said that

296
00:27:17.519 --> 00:27:21.279
it's impossible. I said that it
was a lot of pain, a lot

297
00:27:21.279 --> 00:27:26.319
of pain in making sure that all
of those problems that I've described don't end

298
00:27:26.400 --> 00:27:32.279
up happening. We were doing testing. We were not doing as much testing

299
00:27:32.319 --> 00:27:37.599
as we were doing later, but
we were. We were testing a little

300
00:27:37.640 --> 00:27:45.079
bit using I think at that point
in time exactly much and chin if I

301
00:27:45.079 --> 00:27:52.480
if I recall correctly that we still
ended up using later, it's just the

302
00:27:52.480 --> 00:27:57.799
the monkey patching element that that isn't
that isn't great. And if you have

303
00:27:59.640 --> 00:28:07.119
explain dependencies an explicit dependence injection,
you can say in a very simple way,

304
00:28:07.599 --> 00:28:11.559
well, I have this piece of
code, just provide to it a

305
00:28:11.640 --> 00:28:18.240
test dependence instead of a real dependency. Later on, I even got to

306
00:28:18.279 --> 00:28:22.759
the point of doing more of end
to end testing through the same tooling.

307
00:28:23.480 --> 00:28:32.079
I was creating database through test containers, taking the configuration from the created container,

308
00:28:32.599 --> 00:28:36.759
embedding the configuration into my application,
and everything was running just fine.

309
00:28:37.240 --> 00:28:42.920
So the ability of doing higher order
dependence injection and so on and so forth

310
00:28:44.200 --> 00:28:48.200
are really key to have an architecture
that can be well tested. And it

311
00:28:48.279 --> 00:28:53.079
really means an architecture that is modular
enough. You could do everything without effect

312
00:28:55.079 --> 00:29:03.039
in a very diligent and precise way, but it's it's very hard and you're

313
00:29:03.119 --> 00:29:11.279
naturally screw up over over time.
Effect sort of forces you into into that

314
00:29:11.400 --> 00:29:15.799
golden path of writing software that can
be tested, even if you then decide

315
00:29:15.839 --> 00:29:22.839
not to test it. The properties
of good testable software are properties of good

316
00:29:22.920 --> 00:29:26.720
software. Good, good, maintainable, and good software in general. So

317
00:29:26.799 --> 00:29:32.200
the point, per se is not
it's not really about testing, it's it's

318
00:29:32.359 --> 00:29:37.519
rather about having it testable, which
is which is more of an architectural point

319
00:29:37.519 --> 00:29:42.640
of view instead of the the practice
of writing the tests. Per see.

320
00:29:44.359 --> 00:29:48.039
So I'll go for a chuck.
I was just gonna say, it feels

321
00:29:48.119 --> 00:29:52.559
like we're kind of talking about these
theoretical properties of effect. Right, it's

322
00:29:52.640 --> 00:29:56.000
testable, it's easy to follow along
with. You know, it works in

323
00:29:56.039 --> 00:30:02.079
these specific ways. Can can you
give us like a concrete example of how

324
00:30:02.200 --> 00:30:07.559
effect actually leads us to right testable
or maintainable software. Well, it does

325
00:30:07.720 --> 00:30:12.400
explicit dependence injection. So you see
when you have a function or when you

326
00:30:12.400 --> 00:30:18.519
have an effect, which we should
say it's a key to a smarket promise

327
00:30:18.319 --> 00:30:23.200
to some extent, a promise that
when you create it doesn't just start right

328
00:30:23.240 --> 00:30:27.279
away, but you have to invoke
it to make it execute the code.

329
00:30:27.759 --> 00:30:33.680
And that smart promise also attracts other
two things, the errors that the program

330
00:30:33.720 --> 00:30:41.440
may arise and the dependencies that the
program consumes. So if I have a

331
00:30:41.480 --> 00:30:44.720
piece of code that uses a database, I see that the piece of code

332
00:30:44.799 --> 00:30:48.559
uses a database. But it gets
more specific. If I have a piece

333
00:30:48.559 --> 00:30:53.319
of code that uses the user repository
or the to do repository, or any

334
00:30:53.359 --> 00:30:59.720
other service that you might want.
I see that explicitly in the code itself,

335
00:31:00.480 --> 00:31:03.480
in the type of that of that
effect, and I cannot run that

336
00:31:03.559 --> 00:31:10.640
effect unless I provide all the requirements. And that means when you get to

337
00:31:10.720 --> 00:31:14.480
test a piece of god, you
have your piece of code to invoke it,

338
00:31:14.519 --> 00:31:18.680
you have to provide everything. If
you don't provide everything, it complains

339
00:31:18.720 --> 00:31:22.640
that it doesn't compile. It's not
complaining in the sense that it fails at

340
00:31:22.720 --> 00:31:30.319
run time. It doesn't even compile. So the LSP gives you instantaneous feedback

341
00:31:30.599 --> 00:31:34.160
and saying, hey, this piece
of code needs a user repository. But

342
00:31:34.359 --> 00:31:37.599
for this test, you're not giving
me a user repository. What should I

343
00:31:37.680 --> 00:31:42.720
do? So you have to specify
user repository, which is the case where

344
00:31:42.799 --> 00:31:49.759
you are in testing forcing you to
do this. It really has complete control

345
00:31:51.880 --> 00:31:57.279
over the execution environment of that specific
of that specific piece of code. But

346
00:31:57.599 --> 00:32:02.480
beyond that you can do observability,
you can do it or handling and so

347
00:32:02.519 --> 00:32:06.519
on. And so for you might
say I want this piece of code with

348
00:32:06.640 --> 00:32:12.920
a spam that is called pool,
and that span will be automatically added.

349
00:32:13.000 --> 00:32:16.279
If you have open telemetry configured,
it's going to be exported to open telemetry

350
00:32:16.839 --> 00:32:23.680
and you can see your code from
open telemetry dashboards such as A's many open

351
00:32:23.720 --> 00:32:31.119
sources many products. I don't want
to give user hints on what to be,

352
00:32:31.400 --> 00:32:40.240
but I've loved many of different open
telemetry based dashboards I personally like to

353
00:32:40.359 --> 00:32:44.960
use sometimes Honeycomb, sometimes Data Dog, and so on and so forth.

354
00:32:45.920 --> 00:32:51.960
But the point is this is this
is not only testable, it's also observable,

355
00:32:52.519 --> 00:32:58.359
and so on and so forth.
It's kind of taking all the necessary

356
00:32:58.480 --> 00:33:04.400
requirements of writing the production great piece
of software and putting you on track of

357
00:33:04.480 --> 00:33:07.680
saying, okay, you can do
all of this. This is prefect.

358
00:33:07.759 --> 00:33:15.799
And in my experience, if if
users or if developers can do something good

359
00:33:16.559 --> 00:33:22.880
and it's easy, they do it. If it's hard, they really need

360
00:33:22.920 --> 00:33:28.160
a huge justification to end up doing
it. Like I don't know any developer

361
00:33:28.160 --> 00:33:34.400
who does open telemetry in development pre
production stage that does not use EFFECT.

362
00:33:35.240 --> 00:33:37.920
Most of the people who use Effect
end up doing open telemetry from day want.

363
00:33:42.480 --> 00:33:46.079
In the company that I'm actually working
at right now called size Sense,

364
00:33:46.279 --> 00:33:54.880
we're in the process of integrating open
telemetry both into our Java JVM based stuff

365
00:33:55.039 --> 00:34:00.160
and into our node based stuff.
And currently we're not using effect. But

366
00:34:00.319 --> 00:34:06.839
I think it's currently mostly like an
external type of integration, meaning that it's

367
00:34:07.119 --> 00:34:12.840
mostly looking at the environment itself rather
than business logic parts within the code.

368
00:34:12.920 --> 00:34:17.840
So you know, you're monitoring things
like CPU usage and memory consumption and stuff

369
00:34:17.880 --> 00:34:25.119
like that, and not necessarily execution
of let's say particular business processes. Well,

370
00:34:25.239 --> 00:34:30.719
monitoring stuff like CPU usage and memory
consumption has nothing to do with geometry.

371
00:34:30.760 --> 00:34:38.360
That's metrics. Telety is metering how
long the specific invocation takes. Yeah,

372
00:34:39.519 --> 00:34:45.039
with that environment level, which means
for example, tracing the lumbus.

373
00:34:45.480 --> 00:34:50.760
But you're not instrumenting your code,
which means if you have a button neck,

374
00:34:50.760 --> 00:34:53.800
you have no idea where the bottleneck
is. Still I totally I totally

375
00:34:53.840 --> 00:35:00.440
agree with that. And by the
way, I did instrument stuff using in

376
00:35:00.559 --> 00:35:08.480
the past, using just the Prometheus
client for node that with you know its

377
00:35:08.719 --> 00:35:15.800
direct APIs. But I think the
key thing that you said, and we

378
00:35:16.679 --> 00:35:22.480
I hopefully you know our listeners noticed
it is that it's not being enforced by

379
00:35:22.760 --> 00:35:29.199
runtime errors. It's being enforced by
the actual type system. And I think

380
00:35:29.400 --> 00:35:35.719
that's a key point. That it's
not that if you, you know,

381
00:35:36.960 --> 00:35:42.639
don't properly invoke your code, then
you will get a runtime exception. It's

382
00:35:42.760 --> 00:35:47.559
that if you don't properly invoke your
code, the code will not compile,

383
00:35:47.800 --> 00:35:52.280
you will not be able to deploy
it to begin with. And I think

384
00:35:52.360 --> 00:36:00.119
this is an extremely important point because
I this school of thought, when when

385
00:36:00.199 --> 00:36:06.239
talking about compilers and in general,
in no specific terms, type checkers,

386
00:36:07.440 --> 00:36:12.800
you could use the type checker as
a way to check that everything is right,

387
00:36:13.679 --> 00:36:20.519
or as a friend that tells you
what's going on. Different those different

388
00:36:20.679 --> 00:36:25.559
school of thoughts end up in different
extremes. The second school of thought,

389
00:36:25.639 --> 00:36:30.559
which is more more mindful of thought, which is like use the compiler as

390
00:36:30.599 --> 00:36:37.360
a friend, ends up developing stuff
like dependent type, dependent type type checkers

391
00:36:37.480 --> 00:36:40.719
and so on and so forth,
which our audience can can check out if

392
00:36:40.800 --> 00:36:49.679
they are curious. But in reality, what it means is not even confiding

393
00:36:51.159 --> 00:36:55.280
prevents you from running the code.
But when you edit in vs code or

394
00:36:55.480 --> 00:37:00.039
in the editor that you prefer,
you're going to see real time back of

395
00:37:00.159 --> 00:37:06.079
what you do, the same way
that you can if you type a function

396
00:37:06.239 --> 00:37:08.079
to take an argument, of a
number. You can't pass it a string,

397
00:37:08.960 --> 00:37:14.360
and it's very helpful not to pass
it a string because you know it's

398
00:37:14.360 --> 00:37:17.760
straight away from es code directly.
Oh I'm calling it with the wrong pharmeter.

399
00:37:19.039 --> 00:37:23.480
I'm supposed to use this other thing. Well, imagine that for errors

400
00:37:24.239 --> 00:37:35.320
and dependencies, and it really brings
type level safety to the contract flow of

401
00:37:35.440 --> 00:37:43.320
managing dependencies and errors, which are
notoriously very hard things to do. And

402
00:37:43.840 --> 00:37:49.960
if we, for example, isolate
on errors, there are other languages that

403
00:37:50.119 --> 00:37:54.719
have type errors. Java, for
example, they have typed exceptions. They

404
00:37:54.760 --> 00:37:59.920
haven't been really nice though, a
lot of people complain about type exceptance.

405
00:38:00.760 --> 00:38:05.599
I would say right to be so
why because when you think about errors,

406
00:38:05.639 --> 00:38:10.960
you're actually thinking about two different things, stuff that can happen but really shouldn't.

407
00:38:12.920 --> 00:38:15.599
Like I'm running out of DISC,
there's nothing to do. If I'm

408
00:38:15.639 --> 00:38:19.920
running out of DISC, the program
should crash. There's no way to recover

409
00:38:20.079 --> 00:38:25.159
from death. This is more a
kin to an acceptance or get stuff like

410
00:38:25.320 --> 00:38:31.519
I'm making an HTTP cale and the
services down. Is that surprising? No,

411
00:38:31.760 --> 00:38:37.840
that's a normal. It is completely
expected that services from time to time

412
00:38:37.000 --> 00:38:43.920
may be offline for one or two
seconds, just retry or you know,

413
00:38:44.119 --> 00:38:49.840
you have these two different types of
errors that can occur, errors that you

414
00:38:49.880 --> 00:38:53.079
should deal with those and errors that
you really don't care about and that should

415
00:38:53.119 --> 00:38:58.880
explode. If you have a single
error model and you're pushing that you at

416
00:38:58.920 --> 00:39:04.320
the same level, which is what
JavaScript exceptions and Java checked exceptions and so

417
00:39:04.400 --> 00:39:07.440
on and so forth do, you're
going to have a nightmare because then you're

418
00:39:07.480 --> 00:39:15.599
going to have You're handling logic has
to differentiate between between the two with effect,

419
00:39:15.679 --> 00:39:20.079
we have those as independent things.
If if your program explodes, you

420
00:39:20.159 --> 00:39:23.639
have a defect. If your program
raises an error, you can handle the

421
00:39:23.800 --> 00:39:30.280
error very in a type manner.
Yeah. I think it's a really important

422
00:39:30.320 --> 00:39:34.880
distinction that you're making. And again, just maybe to clarify to users or

423
00:39:34.960 --> 00:39:39.119
listeners users, it's kind of the
Yeah, it's kind of the difference the

424
00:39:39.199 --> 00:39:45.000
show users. Yeah, it's kind
of the difference exactly. It's kind of

425
00:39:45.039 --> 00:39:50.239
the difference, like you said,
between running out of disk space or network

426
00:39:50.320 --> 00:39:53.119
problem, which are things that,
like you said, can happen and can

427
00:39:53.239 --> 00:40:00.480
reasonably happen within the lifetime of an
application, versus undefined is not the function,

428
00:40:00.199 --> 00:40:07.840
which is something that should not happen. Uh and And basically Typescript was

429
00:40:07.000 --> 00:40:15.000
kind of created in order to prevent
from happening at run time. Uh and

430
00:40:15.400 --> 00:40:19.440
And I guess that effect basically takes
it to the next level, which is

431
00:40:19.519 --> 00:40:22.800
something that you expect from certain programming
languages like, I don't know, like

432
00:40:22.960 --> 00:40:30.519
ELM maybe, or like a Haskell, or not necessarily from a language like

433
00:40:30.639 --> 00:40:35.800
typescript. So the fact that you
were able to achieve that sort of safety

434
00:40:35.840 --> 00:40:40.760
on type of typescript is quite an
achievement, honestly, was surprising to me.

435
00:40:43.679 --> 00:40:49.719
Again, they started by developing in
Scala by myself, so I was

436
00:40:49.840 --> 00:40:57.159
considering Typescript as a you know,
as a lesser of a type system.

437
00:40:59.199 --> 00:41:04.239
But to be honest, since I've
started developing of effects, I've realized that

438
00:41:04.440 --> 00:41:09.320
typescript is an extremely powerful language,
and it's extremely well designed. And the

439
00:41:09.440 --> 00:41:15.639
hopes that they had to go through
to type the dynamic part of JavaScript made

440
00:41:15.679 --> 00:41:23.800
it such that the type system has
some incredible fichues, Like we even got

441
00:41:23.840 --> 00:41:30.920
to the point where the amount of
things we could do in Typescript was greater

442
00:41:30.119 --> 00:41:36.159
than the amount of things that were
possible in Scala. For example, in

443
00:41:36.280 --> 00:41:40.440
Scala, you didn't have union types
up until version three, which did not

444
00:41:40.599 --> 00:41:45.880
exist at that point in time,
And that means the error channels had to

445
00:41:45.960 --> 00:41:52.920
be an enom with a single name. But you can't say, for example,

446
00:41:52.960 --> 00:41:59.519
I have an enom which is composed
of three potential branches or a er

447
00:41:59.639 --> 00:42:06.280
or BO or see if I'm handling
it or see, that should be removed

448
00:42:06.360 --> 00:42:10.119
from the type and that wasn't possible
in scalap In types. We were able

449
00:42:10.199 --> 00:42:15.880
to do that from day one.
So actually I realized that no, it

450
00:42:16.039 --> 00:42:21.920
is a very powerful type system,
and I was completely wrong in thinking that

451
00:42:22.239 --> 00:42:28.280
it was in any way less powerful
than other type systems. If anything,

452
00:42:28.360 --> 00:42:32.239
I still have to find another type
system that gives me the same level of

453
00:42:32.639 --> 00:42:38.320
confidence. Even if we go to
languages such as hospital and so on and

454
00:42:38.440 --> 00:42:45.079
so forth, those things have to
be implemented on top of the type system,

455
00:42:45.800 --> 00:42:51.719
and open unions and open intersection and
partial erasure of members of open unions

456
00:42:51.760 --> 00:42:58.280
and open intersections are not are not
present in those in those type systems.

457
00:42:59.320 --> 00:43:04.880
So even though the languages are more
restrictive, they are not powerful enough to

458
00:43:05.039 --> 00:43:10.760
represent those concepts the way that they
are represented in effecting typescript. I know

459
00:43:10.880 --> 00:43:15.679
this is more theoretical and gential.
Yeah, and it'll take us to a

460
00:43:15.800 --> 00:43:21.280
practical place in a second. I
just want to mention again that I totally

461
00:43:21.280 --> 00:43:25.079
agree with you, and in fact, I recently tweeted that it's pretty amazing

462
00:43:25.679 --> 00:43:32.199
how Typescript has been able to effectively
implement a static type system on top of

463
00:43:32.320 --> 00:43:38.559
the poster child for dynamic typing and
dynamic types. It's like herding cats and

464
00:43:38.800 --> 00:43:45.079
they've literally been successful at it.
So it's pretty amazing. But taking us

465
00:43:45.159 --> 00:43:52.039
to indeed a more practical level,
you kind of described Effects as a framework.

466
00:43:52.639 --> 00:43:57.880
Now, most JavaScript or Typescript developers, and again, like you,

467
00:43:58.000 --> 00:44:04.760
I won't make the difference use the
terms interchangeably. Most such developers these days

468
00:44:04.760 --> 00:44:09.039
are using some framework. They might
be using like you mentioned Remix and xt

469
00:44:09.119 --> 00:44:15.119
JS, or they might be using
something lower level like a s JS,

470
00:44:16.159 --> 00:44:24.800
or they might be using a client
site framework like Angular. Where does affect

471
00:44:24.920 --> 00:44:30.159
fit into this ecosystem? Is it
like an alternative to one of these?

472
00:44:30.719 --> 00:44:36.440
Is it something that you would use
in conjunction with one of these? How

473
00:44:36.559 --> 00:44:43.159
does it play into the JavaScript framework
ecosystem? It sort of depends. I've

474
00:44:43.280 --> 00:44:50.599
used the term framework, I should
it probably use the term composer framework because

475
00:44:50.639 --> 00:44:54.960
it's rather a huge tool box where
you can you can choose what you use.

476
00:44:55.880 --> 00:45:00.480
You don't have to use it all. I don't know of any application

477
00:45:00.639 --> 00:45:07.039
that needs the the entirety of effect. I know a lot of people that

478
00:45:07.239 --> 00:45:15.280
use it in conjunction with those full
stack frameworks that you referenced. I know

479
00:45:15.440 --> 00:45:22.079
some other people, especially in the
back end, who ended up with almost

480
00:45:22.079 --> 00:45:29.679
an effect only solution. That means
effect to the very main, your main

481
00:45:29.800 --> 00:45:35.639
function is an effect. To reach
that point at the moment, I believe

482
00:45:35.679 --> 00:45:40.639
it's only possible in a back end
scenario. I wouldn't. I would never

483
00:45:40.880 --> 00:45:46.920
attempt to do it on a front
end. I'll buy there are people developing

484
00:45:47.159 --> 00:45:54.000
rendering stacks on top of Effect.
There's a guy called Tyler Stemberger that's developing

485
00:45:54.079 --> 00:46:02.719
a project called type which uses techt
andlay leader roles, and it's basically a

486
00:46:02.800 --> 00:46:09.199
full rendering staff based on Effect,
which is type safe with that context proparation

487
00:46:09.320 --> 00:46:13.679
in a type safe way. It's
a really interesting project, but it's very

488
00:46:13.760 --> 00:46:16.400
often and very experimental. I would
not I would not use any anything like

489
00:46:16.480 --> 00:46:22.239
that for any production use case at
the moment, at least, so I

490
00:46:22.760 --> 00:46:24.920
would say it depends what you do. If you are in the back end,

491
00:46:25.840 --> 00:46:30.840
it is very possible that you might
be able to just use effect because

492
00:46:30.880 --> 00:46:37.159
we have HTTP servers. We have
huh, so it's a replacement too for

493
00:46:37.400 --> 00:46:40.199
Express. So the next time we
have HTTP servers, so you could use

494
00:46:40.239 --> 00:46:47.400
it as a replacement to Express,
but a replacement that does even even more.

495
00:46:49.079 --> 00:46:51.480
For example, if you're developing an
h T t P a p I,

496
00:46:52.159 --> 00:46:57.639
you might want to generate an open
AI open ah I specification. We

497
00:46:57.800 --> 00:47:02.840
do that by default. So if
you write a web server in using effected

498
00:47:02.960 --> 00:47:07.400
CDP, you're gonna get for free
a test client, you're gonna get for

499
00:47:07.519 --> 00:47:12.079
free, arbitraries for your testing,
you're gonna get for free, and open

500
00:47:12.280 --> 00:47:17.199
API specification from which you can generate
clients in every language. You get a

501
00:47:17.320 --> 00:47:23.360
real type safe client that you can
use to call your server from type script.

502
00:47:24.320 --> 00:47:32.440
So you get more and the performance
of it. It's it was an

503
00:47:32.519 --> 00:47:42.039
interesting journey because everybody expected the native
HTTP server of Effect to be slower than

504
00:47:42.119 --> 00:47:49.360
the alternatives. We are actually beating
Express by a lot, and we are

505
00:47:49.760 --> 00:47:55.719
closer to fastify a little bit slower
than falstified, but not not too far

506
00:47:55.840 --> 00:48:02.519
off with a with the fish set
of an effect first of an effect native

507
00:48:02.599 --> 00:48:08.960
solution. So again everything is open
teometry compliant. You have type errors across

508
00:48:09.000 --> 00:48:15.079
the board, even across the network, because we can serialize both responses and

509
00:48:16.239 --> 00:48:21.679
and errors just they're just objects,
so you can serialize them in the same

510
00:48:21.760 --> 00:48:28.480
way. We have our own internal
replacement of ZOD which is called effect Schema,

511
00:48:29.039 --> 00:48:32.800
which is bidirectional, can do both
encoding and decoding. It is really

512
00:48:35.239 --> 00:48:39.079
a solution that, as you said
at the very beginning, it's very broad

513
00:48:39.239 --> 00:48:44.199
in scope, and I would almost
think of it as an MPM two point

514
00:48:44.280 --> 00:48:47.079
zero. You don't know, you
don't have to know everything to use it.

515
00:48:47.400 --> 00:48:51.320
You can just start with a few
modules, but then you have HTTP

516
00:48:51.519 --> 00:48:55.119
servers and so on and so forth. The next level thing that we are

517
00:48:55.239 --> 00:49:00.360
developing now is clustering. You're gonna
be able what you are, what you're

518
00:49:00.400 --> 00:49:06.000
able to do with for example,
ACTA in ACORPECO in the JDM, or

519
00:49:07.039 --> 00:49:10.480
erline elis here, and so on
and so forth. Clusterize a number of

520
00:49:10.559 --> 00:49:17.719
instances in JavaScript and do message passing
style between them, which is pretty amazing

521
00:49:17.760 --> 00:49:23.679
that you can even get to that
point in JavaScript and that's already in Alphine.

522
00:49:24.360 --> 00:49:29.639
In effect, it's called effect cluster, so it is very broad.

523
00:49:30.199 --> 00:49:36.119
It can replace some of the pre
existing solutions, and it can compound some

524
00:49:36.800 --> 00:49:43.239
other solutions, for example very I
have seen very pleasant code bases that use

525
00:49:43.679 --> 00:49:49.960
remix and Effect. I've seen some
prototypes of Effect together with React server components,

526
00:49:49.960 --> 00:49:55.960
and it also plays fairly well.
So both what you said, both

527
00:49:57.000 --> 00:50:02.840
compounds and replace. So a question
about that. As you said, one

528
00:50:02.920 --> 00:50:14.519
of the primary motivations for ditching the
JVM in favor of Node was the fact

529
00:50:14.639 --> 00:50:21.760
that you could leverage the knowledge and
capabilities of your existing front and developers that

530
00:50:22.119 --> 00:50:28.119
they could transition easily from being front
end to being full stack and do the

531
00:50:28.199 --> 00:50:37.639
BFF stuff. Then my question is
if I take a typescript developer that's familiar

532
00:50:37.760 --> 00:50:40.119
let's say, you know, with
Typescript obviously, but also let's say would

533
00:50:40.159 --> 00:50:47.239
React or something like that or maybe
SVELT, and I bring them on board

534
00:50:47.639 --> 00:50:55.719
to a project that uses Effect,
what's the onboarding uh challenge? Like,

535
00:50:55.880 --> 00:51:00.039
I mean, will it when they
look at the code, will they recognize

536
00:51:00.079 --> 00:51:06.079
that code as being typescript or will
it be you know, two different so

537
00:51:06.320 --> 00:51:08.840
that in effect, it's like I
might as well have been using the JVM

538
00:51:09.000 --> 00:51:17.559
because it's going to be Greek to
them. That's a great question. Surprisingly,

539
00:51:20.079 --> 00:51:24.159
just bick. People have a brain
which is already wired in thinking in

540
00:51:24.280 --> 00:51:31.199
terms of components. I believe that
thanks to the developments in react, where

541
00:51:31.880 --> 00:51:39.840
reacty is really widely used. Why, because it's simplified UI development and allowed

542
00:51:39.920 --> 00:51:45.360
you to think in terms of composable
UI components. When you think about the

543
00:51:45.360 --> 00:51:51.119
effect, you think in terms of
composable back end components or composable business logic

544
00:51:51.199 --> 00:51:55.119
components. So the brain doesn't have
to do a huge suite, a huge

545
00:51:55.159 --> 00:52:05.800
switch. And the second element that
makes the adoption path easier is that job

546
00:52:05.880 --> 00:52:10.840
stript has a syncle wave. Like
you mentioned that that before we were living

547
00:52:10.920 --> 00:52:15.679
in an era where a sincle wave
did not exist. Promises did not exist.

548
00:52:15.840 --> 00:52:22.719
For I mean, I was,
I was writing callbacks and they're not

549
00:52:22.920 --> 00:52:28.519
really they're not really nice, and
you get this this meme of callback hell

550
00:52:28.760 --> 00:52:32.000
or or promise hell and so on
and so forth. A sinca way makes

551
00:52:32.079 --> 00:52:40.519
that easy. Why it brings back
imperativeness to an otherwise declarative model, which

552
00:52:40.599 --> 00:52:49.400
is promised dot them or CPS continuation
passing style, which is got renamed to

553
00:52:49.519 --> 00:52:55.360
callbacks in in in JavaScript Land,
but the original name is really continuation passing

554
00:52:55.400 --> 00:53:01.320
style because you passed down a way
of continuing your program. A sinkle weight

555
00:53:01.400 --> 00:53:07.559
makes that easy. Now you might
ask is a syncle weight available for effect?

556
00:53:07.440 --> 00:53:12.440
I would say no, So why
have you even set a synca weight

557
00:53:12.480 --> 00:53:15.519
in the first place If you can't
use a synca weight. Well, there's

558
00:53:15.519 --> 00:53:19.639
another feature in jawstrip which is lesser
known than a synca weight, which are

559
00:53:19.719 --> 00:53:25.920
generators. So you can mentally swalk
a sink with function star and a weight

560
00:53:27.079 --> 00:53:30.800
with guild star, and your whole
mental model works. You can use effect

561
00:53:30.880 --> 00:53:36.519
in the same way as you use
a synca weight, just by using generators.

562
00:53:36.599 --> 00:53:40.000
So if a newcomer reads the pod, they're going to be able to

563
00:53:40.079 --> 00:53:45.920
understand it. They might not be
able to jump in and write it.

564
00:53:45.079 --> 00:53:50.440
But just as if they are experiencing
REALT, they'll probably not be able to

565
00:53:51.199 --> 00:53:54.519
adopt view in half an hour.
Might take them slightly more than half an

566
00:53:54.559 --> 00:53:59.159
hour to say, oh, okay, this library works in this specific way,

567
00:53:59.280 --> 00:54:02.039
and so on and so. But
they cross the concept. They can

568
00:54:02.199 --> 00:54:07.199
read the library code from the very
beginning again. I'm not a front end

569
00:54:07.239 --> 00:54:12.079
developer, but I've seen code basis
that use the realcity code basis that use

570
00:54:12.159 --> 00:54:15.679
view code basis that use Angular.
I can read the code, I can

571
00:54:15.800 --> 00:54:20.400
reason about the code without knowing the
details of it. Pretty much the same

572
00:54:20.480 --> 00:54:25.719
experience you get with Effect and then
takes i would say, a few hours

573
00:54:25.840 --> 00:54:34.039
to be able to use Effect productively
and probably a few decades to learn the

574
00:54:34.119 --> 00:54:38.800
whole thing. And you don't have
to again. It's like wanting to learn

575
00:54:38.880 --> 00:54:45.320
javastrip by having to learn every single
module on NPM might be a bit too

576
00:54:45.400 --> 00:54:52.400
much, but the learning curve is
very, very progressive, and it is

577
00:54:52.159 --> 00:54:58.239
very linear. The only non linear
part is the first few hours. The

578
00:54:58.320 --> 00:55:02.599
first few hours you're going to be
in a shot and you're gonna tape yourself

579
00:55:02.679 --> 00:55:07.920
for the decisions you've taken. But
then that that stops. That stops very

580
00:55:08.039 --> 00:55:16.480
quickly. And the what what I've
seen is is a trend where people that

581
00:55:17.079 --> 00:55:24.079
start us effect that was a fun
and react here know that drugs. People

582
00:55:24.199 --> 00:55:35.039
that started doing the effecting there usually
don't come back. I've never seen anyone

583
00:55:35.199 --> 00:55:44.920
removing Effect from the code base.
That's a very interesting element because there's a

584
00:55:45.039 --> 00:55:51.679
lot of I mean, I've never
seen a stable code in general. People

585
00:55:51.800 --> 00:55:55.840
swap libraries constantly, they rewrite and
so on and so forth. If they

586
00:55:55.880 --> 00:56:01.960
started integrating effect, effect is there
and most likely took over their whole application.

587
00:56:02.559 --> 00:56:07.079
And that person or that team will
tell you that they can no longer

588
00:56:07.199 --> 00:56:13.719
write playing JavaScript or playing typescript without
that. It's the same thing when you

589
00:56:13.840 --> 00:56:20.760
learn typescript, you can't anymore write
JavaScript. I wrote jawastript forageous. I

590
00:56:21.119 --> 00:56:28.519
would prefer to change jobs then write
JavaScript without typescript. Again, like if

591
00:56:28.559 --> 00:56:31.199
you want to tell me you have
to beat mine, if you want to

592
00:56:31.239 --> 00:56:37.000
stay employee, you have to write
JavaScript. I would probably become I don't

593
00:56:37.039 --> 00:56:44.840
know, it's something or or a
different I would not. I would Funnily

594
00:56:45.039 --> 00:56:52.880
enough, where I at size sense
there's this piece of core legacy code that's

595
00:56:52.000 --> 00:57:00.639
unfortunately very much still in JavaScript,
and people are very touching it. Ah,

596
00:57:02.519 --> 00:57:07.440
it scares you to touch it,
isn't it. Yeah, you found

597
00:57:07.519 --> 00:57:13.679
no if you're changing something you don't
know if you're bringing anything else. Is

598
00:57:13.760 --> 00:57:20.519
a very good step forward in the
direction of giving you confidence in maintaining the

599
00:57:20.679 --> 00:57:30.039
code base. It was effect you
could quite literally refactor thousands and thousands of

600
00:57:30.159 --> 00:57:36.559
lines of code and be sure that
if it comprises words. Yeah. One

601
00:57:36.599 --> 00:57:43.039
of the challenges though with typescript uh, and I think both THEO and the

602
00:57:43.159 --> 00:57:46.239
Primagenes have spoken about it, is
that there are like two levels of using

603
00:57:46.920 --> 00:57:54.079
typescript. There's like the app developer
level and there's the library level. Like

604
00:57:54.559 --> 00:58:00.400
you can, you don't need to
dive too deep in to typescript and generic

605
00:58:00.480 --> 00:58:05.360
types and stuff like that in most
cases if you're just working at the application

606
00:58:05.519 --> 00:58:13.079
level. But if you really want
to make library code as type safe as

607
00:58:13.440 --> 00:58:17.039
possible, then it can become a
challenge. And I'm sure that you have

608
00:58:17.199 --> 00:58:22.000
spent a lot of hours with the
fact thinking about what would be the best

609
00:58:22.280 --> 00:58:31.480
type signature for particular APIs. And
so my question in this context is where

610
00:58:31.559 --> 00:58:38.679
where does effect fall in that spectrum? Like is it is? How challenging

611
00:58:39.159 --> 00:58:45.280
is the typing when I'm writing code
in effect, especially given that it's kind

612
00:58:45.320 --> 00:58:50.559
of like type safety insure correctness,
so kind of like you like, as

613
00:58:50.639 --> 00:58:54.199
you said, kind of like you
would get in languages like ELM. Well,

614
00:58:54.480 --> 00:59:01.119
that is again a great question and
a a great point which is arguable.

615
00:59:04.639 --> 00:59:12.199
I think I agree more with the
sentiment that Matt Pocock has brought out,

616
00:59:13.000 --> 00:59:19.039
which is, yes, both the
two different types strips exists library level

617
00:59:19.079 --> 00:59:24.480
and up level, but in up
level you have that lead directory where you

618
00:59:24.639 --> 00:59:29.960
have the mix and match, where
you do have to write a little bit

619
00:59:30.039 --> 00:59:38.440
of library level code in the app
Effect. The usage of Effect surprisingly requires

620
00:59:38.519 --> 00:59:44.519
almost no manual type. Like when
you write a function using a Synca weight,

621
00:59:44.960 --> 00:59:51.159
you don't have to annotate the promise
return type manually. The same thing

622
00:59:51.280 --> 00:59:54.639
is with Effect, with the difference
that you're going to get inference for the

623
00:59:54.800 --> 01:00:01.519
errors and inference for the dependencies.
Oh very cool. So basically you've done

624
01:00:02.079 --> 01:00:06.440
most of the heavy lifting, and
when I use the FACT, I just

625
01:00:06.599 --> 01:00:10.599
get most of the benefits out.
Just buy out straightforward. In fraence,

626
01:00:12.199 --> 01:00:19.960
I think I wrote thousands of lines
of effect code in examples and and so

627
01:00:20.119 --> 01:00:25.639
forth without ever specifying a type manually. Of course, sometimes you might want

628
01:00:25.840 --> 01:00:30.679
to specify a type manually, but
the point is you don't have to,

629
01:00:30.800 --> 01:00:36.800
which is the which is me how
it should be. Even with promises,

630
01:00:36.880 --> 01:00:39.920
you can annotate a return type if
you want to be sure that this is

631
01:00:40.199 --> 01:00:45.960
the actual return type, and sometimes
you have to do that for performance reasons,

632
01:00:47.159 --> 01:00:52.000
like especially if you have functions that
are reused in a lot of places

633
01:00:52.119 --> 01:00:58.960
in your code, if you use
inference on those functions, then the LSP

634
01:00:59.239 --> 01:01:01.239
is going to have perform one's issues. But this has nothing to do with

635
01:01:01.320 --> 01:01:07.280
effect. This is very very general
type strip points. The same applies with

636
01:01:07.360 --> 01:01:14.880
the fact So sometimes you have to
write or work. Sometimes you want to

637
01:01:14.920 --> 01:01:19.119
write types, but usually you don't. Usually you don't have to. And

638
01:01:20.559 --> 01:01:24.639
to me, this sort of goes
back to the point of having the compiler

639
01:01:24.719 --> 01:01:30.280
as a friend that tells you what's
going on, versus the compiler as a

640
01:01:31.639 --> 01:01:37.639
you know, as a math teacher
that grades your your correctness. I feel

641
01:01:37.760 --> 01:01:43.039
more in the in the space of
the compiler as a friend that helps you

642
01:01:43.119 --> 01:01:46.840
discover what your program is doing.
When I write a fact code, I

643
01:01:46.960 --> 01:01:52.920
then look at the type signature,
which is completely infir and I realize from

644
01:01:52.000 --> 01:01:58.360
that, oh, i've this is
what I've done. This is the error

645
01:01:58.519 --> 01:02:06.079
cases that my program may m may
issue when when main counter, when when

646
01:02:06.119 --> 01:02:09.760
it's executed. And then if I
handle one of those, the type system

647
01:02:09.800 --> 01:02:15.559
will tell me that that error is
no longer present all by inference, not

648
01:02:15.920 --> 01:02:22.960
not by specifying the types, so
by no meaning it's a type heavy element.

649
01:02:23.400 --> 01:02:29.119
We have also, I mentioned briefly
before, schema effects schema, which

650
01:02:29.239 --> 01:02:35.400
is a similar approach to zo I, U, O, T S and

651
01:02:35.559 --> 01:02:42.360
so on and so forth. That's
really where where a user starts with defining

652
01:02:42.440 --> 01:02:49.079
the types in their system. Those
are more domain level types. You're you're

653
01:02:49.239 --> 01:02:53.840
modeling your user base. If you
are doing a two do NBC, you're

654
01:02:53.880 --> 01:02:58.880
going to have a two doo type. Those are the types, the concrete

655
01:02:58.960 --> 01:03:02.280
types that that you use. There's
there's almost never a generic in those,

656
01:03:02.360 --> 01:03:08.559
as you pointed out rightfully. So
and a very effect based code base would

657
01:03:08.880 --> 01:03:15.639
use schema to define the data model
of their application and would infer the hell

658
01:03:15.760 --> 01:03:22.960
out of everything else in my the
Way Highway would use it. Of course,

659
01:03:23.000 --> 01:03:28.639
there are users who write explicit types
for everything. I don't. I

660
01:03:28.719 --> 01:03:32.599
don't agree with that with that way. It's like it. I've seen the

661
01:03:32.920 --> 01:03:38.039
Clint configured tss slint configured to require
that, and I, like you,

662
01:03:38.159 --> 01:03:45.400
I dislike it. I prefer as
much type in for ince as possible whenever

663
01:03:45.519 --> 01:03:50.519
I need to explicitly specify the type
of a return type of a function,

664
01:03:51.320 --> 01:03:57.480
so it almost feels like a failure. Yes, and we've done a lot

665
01:03:57.559 --> 01:04:01.800
of works so that you don't have
all Right. Well, I'm wondering if

666
01:04:01.920 --> 01:04:05.599
there's more to get into before we
do picks, because we're kind of getting

667
01:04:05.760 --> 01:04:12.320
to that amount of time. I
guess my question is, Michael, because

668
01:04:12.320 --> 01:04:21.360
you've talked about moving off the JVM
to something like like Effect or The other

669
01:04:21.920 --> 01:04:28.320
one is just if I started a
new project today, what are the best

670
01:04:28.360 --> 01:04:30.760
ways to kind of roll into this
and make it work how I want.

671
01:04:32.039 --> 01:04:39.280
Well, we have our website,
which is incredibly easy to remember because the

672
01:04:39.360 --> 01:04:44.079
website of Effect is called the fat
Top website. And we have an amazing

673
01:04:44.199 --> 01:04:51.000
discord community which is by now more
than three thousand people and those are not

674
01:04:51.159 --> 01:04:57.760
just numbers. They constantly write and
help each other, and the teammates also

675
01:04:58.599 --> 01:05:06.000
help. So definitely join the sport
and definitely try out tryout Effect. If

676
01:05:06.079 --> 01:05:14.360
there is another question that I would
like to address, it came from twits

677
01:05:14.440 --> 01:05:18.719
and other podcasts, and I think
we had a small exchange we've done at

678
01:05:18.760 --> 01:05:27.760
some point in time, and it
is about the company behind Effect. There

679
01:05:27.840 --> 01:05:32.679
is a company now which is called
Effectful Technologies, and we've raised the c

680
01:05:32.880 --> 01:05:40.599
money last year, and some people
were surprised, and they even said that,

681
01:05:41.199 --> 01:05:45.559
you know, monetizing something like Effect
is crazy. I agree, monetizing

682
01:05:45.639 --> 01:05:50.039
something like Effect is absolutely crazy.
That's not the plan. The plan is

683
01:05:50.079 --> 01:05:59.239
to develop services and bring composibility to
higher levels of infrastructure where it's not going

684
01:05:59.320 --> 01:06:04.199
to be at anymore. They're really
gonna be plain and simple commercial services.

685
01:06:05.679 --> 01:06:10.880
Effect these open source. We always
remain open source. The Effect organization is

686
01:06:11.000 --> 01:06:16.280
not even owned by by the company. It's owned by the contributors. It

687
01:06:16.360 --> 01:06:24.480
hasn't shifted in in ownership when we
when we founded company, this was a

688
01:06:25.320 --> 01:06:30.239
was a question I intended to answer
on a on a podcast, but I

689
01:06:30.400 --> 01:06:38.480
was like other people got that question
asked and like, maybe I should answered

690
01:06:38.599 --> 01:06:43.960
that specific question here. And I'm
probably the only one who knows the the

691
01:06:44.079 --> 01:06:47.320
plan. But really be sure,
if you use Effect, it's an open

692
01:06:47.400 --> 01:06:56.119
source library, it's community first,
and it has survived five years without a

693
01:06:56.280 --> 01:07:00.760
company behind and without VC money behind. So even if the company burns,

694
01:07:00.559 --> 01:07:06.519
which is highly probable given that BC
backed companies are high risk, high reward,

695
01:07:08.559 --> 01:07:12.719
most of them fails, so realistically
we will also fail. I hope

696
01:07:12.760 --> 01:07:17.199
not, of course, but that's
the that's the default outcome effect. We'll

697
01:07:17.519 --> 01:07:24.159
stay alive, will be preserved the
way it was preserved before, without without

698
01:07:24.199 --> 01:07:30.840
any any trouble or change of license
or or or any any of the you

699
01:07:30.920 --> 01:07:35.320
know, weirdness of mixing open source
with commercial activities. There was one one

700
01:07:35.400 --> 01:07:40.639
other point I wanted to cover.
That's that's good to hear. It reminds

701
01:07:40.719 --> 01:07:45.280
me a little bit of like next
Jas and Versail, right, you know,

702
01:07:45.440 --> 01:07:48.960
it's it's next Jas completely open source, you know, community run blah

703
01:07:49.000 --> 01:07:51.760
blah blah. Yeah, a lot
of the people work for Versail that work

704
01:07:51.840 --> 01:07:56.119
on it, but at the end
of the day, when you want to

705
01:07:56.199 --> 01:07:59.920
deploy your next JS app, versaill
is your happy place kind of thing,

706
01:08:00.440 --> 01:08:03.760
right, They specifically go after the
things that you're going to want. It

707
01:08:03.840 --> 01:08:10.000
seems to have become a fairly popular
model of having an open source project and

708
01:08:10.079 --> 01:08:14.599
alongside it a commercial company. So
obviously Versaill is kind of like the poster

709
01:08:14.800 --> 01:08:19.840
child, but also the Astro project
is doing something similar, and even a

710
01:08:20.279 --> 01:08:27.279
million JS is a new upstart project
are I think are hy Combinator funded,

711
01:08:27.439 --> 01:08:30.319
and there are others as well,
So it will be interesting to see if

712
01:08:30.399 --> 01:08:35.760
this model how successful this model of
an open source project which is by definition

713
01:08:35.880 --> 01:08:41.760
open source and will remain open source
regardless of anything else, but that alongside

714
01:08:41.840 --> 01:08:47.000
to it, there's a company that's
kind of supporting that project and looking to

715
01:08:47.199 --> 01:08:55.840
make revenue in some sort of a
way in adjacent to that project. So

716
01:08:56.039 --> 01:09:00.279
it will be interesting to see how
successful this model is over time. I

717
01:09:00.359 --> 01:09:09.039
think that discussing that would definitely require
probably a different episode or or rock very

718
01:09:09.159 --> 01:09:14.119
long conversation. I'm not sure the
model is gonna be successful at all.

719
01:09:15.399 --> 01:09:19.720
If anything, I don't believe in
that in that model in general, you

720
01:09:19.800 --> 01:09:26.159
might say, but if you've done
the same, yes, I believe Versaill

721
01:09:26.239 --> 01:09:31.560
with next Years is a very peculiar
example of a model that can work because

722
01:09:31.680 --> 01:09:35.640
Versaill is the best best place to
deploy any front them, not only if

723
01:09:35.640 --> 01:09:42.479
you use next right. That's the
that's the key differentiation. And I'm gonna

724
01:09:42.720 --> 01:09:46.119
stop here otherwise than revealing too much
of the road where we are pointing,

725
01:09:46.800 --> 01:09:51.199
but it's gonna I appreciate Versaill a
lot as a as a company, and

726
01:09:51.520 --> 01:09:57.000
I take a lot of inspiration from
it. So I just have one more

727
01:09:57.119 --> 01:10:02.000
quick question. You mentioned that you
have a website that affects dot website.

728
01:10:02.640 --> 01:10:08.000
And we mentioned that there was a
conference and you can find the talks I

729
01:10:08.079 --> 01:10:12.960
think on YouTube. Yes. Do
you also have a discord channel where people

730
01:10:13.079 --> 01:10:17.279
can ask questions stuff like that?
We absolutely have a discord community. It's

731
01:10:17.479 --> 01:10:24.239
an amazing place where people help each
other. There's there's almost three thousand there's

732
01:10:24.279 --> 01:10:31.680
actually more than three thousand users on
it that are constantly writing themselves, helping

733
01:10:31.760 --> 01:10:36.079
themselves and so on and so forth. All of our development happens on this

734
01:10:36.199 --> 01:10:42.119
word, so that that is the
central That the central place where I spend

735
01:10:42.199 --> 01:10:45.960
most of my day. So also
if you want to chat with me either

736
01:10:46.760 --> 01:10:55.479
Twitter or the new name X,
always feel strange only X hope even it's

737
01:10:55.520 --> 01:11:02.359
not listening to us the chance if
I ask again, I actually hope.

738
01:11:02.399 --> 01:11:05.680
Well, we should all hope that
he does, because if he tweets it

739
01:11:05.840 --> 01:11:10.960
then or exit it or whatever it's
called these days, posts it, then

740
01:11:12.880 --> 01:11:20.359
the podcast and effect will explode.
He I'm totally fine with Elon asked actually

741
01:11:20.439 --> 01:11:24.800
coming out and going these guys are
idiots, right, because we would still

742
01:11:24.840 --> 01:11:31.119
get that same effect. So PU
non intended. I wasn't thinking about it

743
01:11:31.159 --> 01:11:34.960
anyway. Let's go ahead and do
our picks and then start wrapping up.

744
01:11:36.399 --> 01:11:42.319
Let's start with aj Aj, what
are your picks? Well, I became

745
01:11:43.079 --> 01:11:54.239
a motorcyclist. I have a motorcycle
now, and uh I would recommend to

746
01:11:54.319 --> 01:12:00.279
anybody the the MSF Basic Rider Course, if anybody's in the United States least,

747
01:12:00.319 --> 01:12:06.680
if you're interested in becoming one of
the organ donors, then then the

748
01:12:06.760 --> 01:12:13.319
best way to prevent actually having to
to uh donate your organs would be to

749
01:12:13.439 --> 01:12:18.079
take that course. It already save
my bacon when a semi cut in front

750
01:12:18.119 --> 01:12:23.800
of me, and since I'd already
low sided the bike during the practice course

751
01:12:23.880 --> 01:12:27.760
and was already familiar with why not
to panic by grabbing the front brake,

752
01:12:29.079 --> 01:12:32.640
I panicked instead by swerving, straightening
the bike and then applying the brake and

753
01:12:32.760 --> 01:12:38.079
that got me safely onto the shoulder
of the road rather than under the semi.

754
01:12:38.319 --> 01:12:42.399
So it's good. Ay, J. Do you know what the other

755
01:12:42.600 --> 01:12:46.640
word for motorcycles is that traffic cops
use along the lines of what you were

756
01:12:46.720 --> 01:12:51.520
just saying, no donor cycle,
donorcycle? Yeah, yeah, yeah,

757
01:12:51.640 --> 01:12:58.359
So anyway, it what was it? What was the other thing? I

758
01:12:58.399 --> 01:13:01.000
was going to mention, there's gonna
be there something else I think related to

759
01:13:01.079 --> 01:13:03.560
that. Give me just a second. My brain's a little slower today because

760
01:13:03.600 --> 01:13:09.800
of the cold. Oh. One
of the pieces of protection that people often

761
01:13:11.239 --> 01:13:14.560
don't think about, or at least
it wasn't one of the things I first

762
01:13:14.560 --> 01:13:15.920
thought about. I knew to get
the helmet and the pants and the jacket

763
01:13:15.960 --> 01:13:23.840
and the gloves, but the hearing
protection. There's a brand of hearing protection

764
01:13:24.039 --> 01:13:30.520
called Alpine Moto Safe. And the
biggest problem is not the muffler or the

765
01:13:30.640 --> 01:13:34.600
engine noise. The biggest problem is
the wind noise. And these ear plugs

766
01:13:34.720 --> 01:13:39.199
are designed in such a way that's
kind of interesting. They have a little

767
01:13:40.279 --> 01:13:44.079
stem that comes out of them,
and much like you've got the little hair

768
01:13:44.159 --> 01:13:48.600
in your ear that transmits the sound, the stem actually helps transmit sound that

769
01:13:48.800 --> 01:13:53.520
is in the vocal range and I
guess other ranges that you need to hear.

770
01:13:54.199 --> 01:13:57.359
So when you put the ear plugs
in and someone speaking to you,

771
01:13:57.560 --> 01:14:00.119
it still sounds weird when you're speaking
to someone else, but when someone's speaking

772
01:14:00.159 --> 01:14:06.680
to you, you can actually hear
pretty darn well. And they're very effective

773
01:14:06.720 --> 01:14:12.039
at blocking out the wind noise.
So although they have a lower dB rating

774
01:14:12.239 --> 01:14:15.560
like a lot of the cheap o
foam ones are rated at something like thirty

775
01:14:15.680 --> 01:14:20.960
three dB and these are only rated
at twenty. But part of that,

776
01:14:21.039 --> 01:14:27.600
I think is because of they're not
they're very effective at reducing wind noise,

777
01:14:27.640 --> 01:14:30.600
but they're not effective at reducing all
noise because they're designed to actually let some

778
01:14:31.279 --> 01:14:35.439
sound pass through. So I think
that they are adequate protection. They're very

779
01:14:35.560 --> 01:14:44.199
and they're very comfortable to wear.
So anyway, Yeah, if you want

780
01:14:44.239 --> 01:14:47.720
to have really really long discussions with
your wife over a period of weeks or

781
01:14:47.760 --> 01:14:54.680
months or possibly even years, get
in a motorcycling. It's a sense of

782
01:14:54.720 --> 01:15:00.800
freedom that is amazing, absolutely amazing. That's that's my picks for the day.

783
01:15:02.399 --> 01:15:09.920
Awesome, Dan, what are your
picks? I don't have a whole

784
01:15:09.960 --> 01:15:13.479
lot in terms of picks for today. I you know, I do have

785
01:15:13.680 --> 01:15:20.319
one. So obviously, there's the
ongoing conflict in the Middle East, both

786
01:15:20.439 --> 01:15:27.239
in Gaza and between Israel and Lebanon, and I know that it has made

787
01:15:27.279 --> 01:15:32.760
a lot of people like interested in
or have opinions on like the origins of

788
01:15:32.840 --> 01:15:38.600
this conflict and you know who's at
fault and how things came to be and

789
01:15:38.680 --> 01:15:46.439
stuff like that. I want to
highlight a documentary that came out a long

790
01:15:46.520 --> 01:15:50.000
time ago, like in the eighties. As I recall, it's called a

791
01:15:50.199 --> 01:15:56.880
Pillar of Fire. It's an is
it's an Israeli documentary, so obviously it

792
01:15:57.079 --> 01:16:02.279
represents the the Israeli view on things, but they did try very hard to

793
01:16:02.439 --> 01:16:06.600
also to be first of all fact
base and also present a lot of the

794
01:16:08.279 --> 01:16:15.159
Palestinian side or the Arab side as
well. It's it's talks about the origins

795
01:16:15.199 --> 01:16:20.399
of Zionism going back to the eighteen
fifties and all the way to the founding

796
01:16:20.479 --> 01:16:26.199
of the State of Israel, and
covering all that period in between. We're

797
01:16:26.279 --> 01:16:31.600
talking about over one hundred period of
over one hundred years, and it,

798
01:16:32.279 --> 01:16:34.760
like I said, it's from the
eighties. So on the one hand,

799
01:16:34.840 --> 01:16:39.600
it's you might say that it's a
bit dated, but it also means that

800
01:16:39.720 --> 01:16:44.920
a lot of people that were involved
in that process were still alive back then

801
01:16:45.079 --> 01:16:49.560
to be interviewed, and and that
documentary includes a lot of such interviews and

802
01:16:49.720 --> 01:16:58.239
a lot of the of amazing original
footage that was shot like more or less

803
01:16:58.279 --> 01:17:04.800
when they invented the cameras. Uh. And it's it's it's a great documentary.

804
01:17:04.920 --> 01:17:11.319
Series. You can find episodes of
it with in English on YouTube.

805
01:17:11.479 --> 01:17:15.880
I'll i'll link to some of the
episodes that are actually available on YouTube.

806
01:17:15.279 --> 01:17:20.279
So if this topic is interesting to
you, I highly recommend this, uh

807
01:17:20.520 --> 01:17:28.319
this series, And that's my pick
for today. By the way, uh,

808
01:17:28.720 --> 01:17:31.760
Ken, do you know where the
where the phrase pillar fire comes from?

809
01:17:32.520 --> 01:17:36.560
Oh? Heck, yeah, I
know it, So you can also

810
01:17:38.159 --> 01:17:42.319
so you can also understand why it's
been used in this context, like,

811
01:17:42.960 --> 01:17:46.960
uh, uh yeah, yep,
that's something that I'm interested in. So

812
01:17:47.199 --> 01:17:50.399
i'll i'll have to go check those
out, Steve, what are your picks?

813
01:17:51.560 --> 01:17:55.640
Uh? Before my pre planned one, I have a couple of picks

814
01:17:55.680 --> 01:18:02.640
that came up inspired by our initial
conversations here. One comes from one of

815
01:18:02.720 --> 01:18:10.199
my favorite sources of puns and jokes
is called the pun Bible. It's pretty

816
01:18:10.239 --> 01:18:13.399
short. It says it's a conversation
between a student and teacher, and it

817
01:18:13.479 --> 01:18:17.079
says, student, thirty two degrees
fahrenheit is equal to zero degrees celsius.

818
01:18:17.199 --> 01:18:19.319
Right, future says yes. In
other words, so I said so.

819
01:18:19.399 --> 01:18:24.680
In other words, zero degrees celsius
post zero degree celsius equal sixty four degrees

820
01:18:24.720 --> 01:18:34.560
fahrenheit. Thank you now, in
honor of aj and the absolute torture that

821
01:18:34.680 --> 01:18:40.520
he's been going through with his cold
over the past week. One of my

822
01:18:40.600 --> 01:18:45.439
favorite sources of humor is the Babylon
b They're so good, so good,

823
01:18:45.760 --> 01:18:48.239
Oh I love to be And anyway, one series of posts that they are

824
01:18:48.279 --> 01:18:54.560
always doing over the years about how
men will suffer from a cold and as

825
01:18:54.640 --> 01:19:00.600
compared to the women. And this
particular post that I looked up was from

826
01:19:00.760 --> 01:19:04.840
last year and it says it's titled
this is the worst pain any human has

827
01:19:04.880 --> 01:19:09.119
ever felt? Man with Flutell's wife
who has pushed three children out of body.

828
01:19:10.840 --> 01:19:14.000
And so it starts out, I'll
give you the first couple of paragraphs.

829
01:19:14.159 --> 01:19:18.479
Local man Aj O'Neill became better ridden
Tuesday after a flu virus brutally assaulted

830
01:19:18.520 --> 01:19:21.159
his body with a sore throat,
coughing, some body aches, and even

831
01:19:21.199 --> 01:19:25.760
a mild fever. This is the
worst pain any human has ever felt,

832
01:19:25.800 --> 01:19:28.640
he told his wife, Sally,
who previously pushed three whole children out of

833
01:19:28.680 --> 01:19:30.960
her body. The content reportedly led
to a brief spat in which is the

834
01:19:31.000 --> 01:19:35.159
suffering man edge precariously towards death door. Anyway, it goes on from there

835
01:19:35.319 --> 01:19:42.359
so I'll put the link in the
notes hopefully, but it's it's classic Babylon

836
01:19:42.479 --> 01:19:45.239
d It kind of is not Sally
by the way. By the way,

837
01:19:45.319 --> 01:19:48.840
it kind of reminds me of this
thing that said that if you are a

838
01:19:48.920 --> 01:19:54.199
man and you want to experience,
you know, like how childbirth feels like,

839
01:19:54.359 --> 01:19:57.680
then what you should do is,
first of all, grab your lower

840
01:19:57.760 --> 01:20:00.720
lip, yes, then and then
pull it over your head. Yes.

841
01:20:03.439 --> 01:20:08.399
Back before Bill Cosby went nuts,
he has a classic routine called Himself that

842
01:20:08.520 --> 01:20:12.079
was an HBO special for eighty five
and there's a section in there where he's

843
01:20:12.119 --> 01:20:16.520
talking about his wife's giving birth to
the childbirth hysterical and he in that sketch

844
01:20:16.560 --> 01:20:20.560
he brings up that quote and then
when he's talking about his wife giving birth,

845
01:20:20.760 --> 01:20:24.880
he talks about how she stood up
in the stirrups and grabbed his lower

846
01:20:24.920 --> 01:20:30.039
lip and started to pull it up
over his head. So that's a great

847
01:20:30.079 --> 01:20:35.800
one. And finally the dad jokes
of the week. So one day I

848
01:20:35.960 --> 01:20:40.840
went I changed the light bulb across
the road and I walked into a bar,

849
01:20:41.000 --> 01:20:45.439
and that's when I realized my whole
life was a joke. Yeah,

850
01:20:47.279 --> 01:20:57.600
question, what dating app do cannibals
use it's called tender. Right. So

851
01:20:57.680 --> 01:21:00.960
the other day, speaking of a
biblical reference, I found thirty dollars in

852
01:21:01.039 --> 01:21:03.840
the parking lot, and I thought
to myself, what would Jesus do?

853
01:21:04.640 --> 01:21:11.079
So I turned it into wine.
That's a good one. Those are my

854
01:21:11.239 --> 01:21:15.079
picks for the week, all right. I'll jump in with a few picks.

855
01:21:15.159 --> 01:21:19.319
I usually do a board game or
a card game. To be honest,

856
01:21:19.359 --> 01:21:23.800
I've kind of been heads down on
a bunch of other stuff. So

857
01:21:24.159 --> 01:21:27.119
let me just think for a second
on which one I want to pick.

858
01:21:28.920 --> 01:21:33.039
I'm going to go a little bit
different direction. So my eighteen year old

859
01:21:34.079 --> 01:21:41.279
really likes retro games video games,
especially video game consoles. So he actually

860
01:21:41.520 --> 01:21:46.520
walked like six or seven miles down
to the retro game store in American Fork

861
01:21:47.399 --> 01:21:53.560
and bought himself a Wii. And
so we've been playing we Sports around here

862
01:21:54.000 --> 01:21:57.520
lately. And yeah, we Sports
Resort, well we Sports are sort of

863
01:21:57.560 --> 01:22:00.159
boring. We Sports Resort is a
little better. I don't think I've done

864
01:22:00.199 --> 01:22:03.039
the Wee Sports Resort, but I
will tell you that it's been fun,

865
01:22:03.359 --> 01:22:08.640
you know, doing the bowling and
astball anyway, So I'm gonna pick that.

866
01:22:08.680 --> 01:22:12.119
I'm gonna pick a video game instead
of a board game today. A

867
01:22:12.199 --> 01:22:15.000
few other things that I'm gonna throw
out, so one of them is and

868
01:22:15.159 --> 01:22:21.800
this is going way off the tech
train or toys train. But about a

869
01:22:21.920 --> 01:22:25.680
year or so ago, I started, no, it's been more than that.

870
01:22:25.720 --> 01:22:29.239
It's been a few years. I
started having issues where if I would

871
01:22:29.279 --> 01:22:35.640
eat wheat products of any kind,
I'd get sick. And so I was

872
01:22:35.680 --> 01:22:41.159
talking to my new stepdad my mom
got remarried a couple months ago, and

873
01:22:41.279 --> 01:22:44.079
he was like, well, if
you tried. He told me to try

874
01:22:44.119 --> 01:22:45.279
two different things. I haven't tried
one of them. I haven't tried ancient

875
01:22:45.359 --> 01:22:49.720
grains, but I He's like,
if you tried sourdough. And I was

876
01:22:49.800 --> 01:22:55.520
like no, And so I kept
meaning to try it, but I didn't

877
01:22:55.520 --> 01:22:58.560
know anything about it. And then
I was chatting with a friend of mine

878
01:22:58.600 --> 01:23:02.079
and she brought up that she bakes
a loaf of bread every few days and

879
01:23:02.359 --> 01:23:05.000
it's sourdough. She has a sour
dough starter that lives in her fridge,

880
01:23:05.880 --> 01:23:10.439
and so she gave me some of
that and I've been doing sourdough ever since,

881
01:23:10.760 --> 01:23:15.760
and I'll tell you what, It's
made a huge difference because I used

882
01:23:15.800 --> 01:23:20.720
to have just kind of lingering stomach
pain over days just because I would get

883
01:23:21.479 --> 01:23:27.960
whatever wheat product, you know.
And anyway, since I started eating the

884
01:23:28.039 --> 01:23:31.920
sour dough about a month ago,
that pain's gone away and I haven't had

885
01:23:31.920 --> 01:23:35.399
any issues. And it's also nice
because I have real bread to make like

886
01:23:35.479 --> 01:23:40.640
sandwiches and stuff with. So I'm
going to pick sourdough now. A couple

887
01:23:40.720 --> 01:23:44.880
of things I'm going to put out
there. So we already had a KitchenAid

888
01:23:44.920 --> 01:23:51.880
mixer, and there's a there's a
website this lady does. She talks all

889
01:23:51.920 --> 01:23:57.159
about sourdough. So I'll put links
to her Instagram because she's got a series

890
01:23:57.239 --> 01:23:59.720
of Instagram stories that you can watch
to kind of walk you through the whole

891
01:23:59.720 --> 01:24:04.680
process. She's also got a website
where she makes that work. And I've

892
01:24:04.720 --> 01:24:12.399
got Apple Assistant on my computer trying
to pick up on what I'm saying,

893
01:24:12.399 --> 01:24:20.000
which anyway, so so yeah,
so I'm gonna shout that out. One

894
01:24:20.039 --> 01:24:26.079
of the things that you need is
also a it's a Dutch oven, and

895
01:24:26.319 --> 01:24:32.159
I don't know outside the US really
have. It's a cast iron pot and

896
01:24:32.800 --> 01:24:39.600
the ones that you want stup in
your oven are they're enameled, right,

897
01:24:39.760 --> 01:24:42.319
so they've they've got the polish on
them, right. They don't look like

898
01:24:42.399 --> 01:24:45.720
cast iron pots you pick them up, they feel like cast iron pots.

899
01:24:45.079 --> 01:24:48.439
But anyway, so I've been,
like I said, I've been baking my

900
01:24:48.479 --> 01:24:56.119
own bread for the last month and
it's amazing. So I'm trying to find

901
01:24:56.359 --> 01:25:02.279
the website where all this stuff is
at. Oh, here we go.

902
01:25:02.960 --> 01:25:09.000
And she's been super helpful too as
far as like just figuring out, Okay,

903
01:25:09.159 --> 01:25:14.800
this didn't turn out the way I
wanted, so anyway, I'll put

904
01:25:14.840 --> 01:25:18.560
these links in here. But it's
such good bread, and even when it

905
01:25:18.680 --> 01:25:25.399
doesn't come out looking just like this
lady's bread, it was still oh so

906
01:25:25.600 --> 01:25:34.319
good anyway, so I'm dropping it
in the comments. It's kind of a

907
01:25:34.479 --> 01:25:44.520
long Instagram deal, but that's her
stories on on how to make the sourdough.

908
01:25:44.720 --> 01:25:50.720
And then I'll put this at simplesourdough
bread dot com and that's where I

909
01:25:50.800 --> 01:25:55.399
get the other stuff. So yeah, so I'm I'm picking bread and stuff

910
01:25:55.479 --> 01:25:58.960
like that and then one last thing
that I'm gonna pick, and this is

911
01:25:59.159 --> 01:26:02.880
just I'm just getting into this now. Most of this is focused on ruby

912
01:26:02.960 --> 01:26:05.439
on rails which is what I spend
most of my time writing code in.

913
01:26:06.600 --> 01:26:13.319
There's a book called The Rails and
Stimulus Codecs, and it basically walks you

914
01:26:13.399 --> 01:26:17.520
through writing an application in Ruby on
Rails with the Stimulus front end and with

915
01:26:17.680 --> 01:26:26.600
Turbonative so that you can get quasi
hybrid native apps out of your Ruby on

916
01:26:26.680 --> 01:26:30.159
Rails applications, and you can do
it for other applications too, write because

917
01:26:30.159 --> 01:26:34.479
it basically just wraps around a web
application and then it uses Strata to give

918
01:26:34.520 --> 01:26:43.279
you which is the Italian word for
road, but it gives you that pathway

919
01:26:43.359 --> 01:26:48.359
to get native elements into your Turbonative
app. And then Turbative just gives you

920
01:26:48.479 --> 01:26:55.960
the wrapper around your web application so
you can have the mobile app. And

921
01:26:56.079 --> 01:27:00.680
yeah, so so far I've got
the Turbinative stuff. I'm just getting into

922
01:27:00.760 --> 01:27:03.960
Strata now and then we'll be getting
into the rest of the stuff with Stimulus

923
01:27:04.000 --> 01:27:10.199
and Turbo. Turbo's kind of like
HTMX, but anyway, I'm really really

924
01:27:10.239 --> 01:27:15.399
digging it. So I'm gonna pick
the Rails and Stimulus, Rails and hot

925
01:27:15.439 --> 01:27:24.600
Wire code X by Ayush Nuatia and
Terminative. You should probably come on this

926
01:27:25.079 --> 01:27:28.840
podcast called JavaScript Jabber to talk about
this stuff. Yeah, I should,

927
01:27:29.159 --> 01:27:30.920
I should, maybe I'll get I
used to come on. He's one of

928
01:27:30.960 --> 01:27:38.800
our new panelists on Ruby Rogues.
But yeah, and he's a former Native

929
01:27:38.880 --> 01:27:44.880
developer in Swift and Colin. So
anyway, that's what I've been playing with

930
01:27:44.960 --> 01:27:51.239
lately. Michael, what are your
picks? Oh? So I have a

931
01:27:51.399 --> 01:27:58.439
mixed but I have to double down
what AJ said at the beginning. I

932
01:27:58.560 --> 01:28:06.439
am a biker and definitely do safety
driving courses because your instincts playing in a

933
01:28:08.000 --> 01:28:11.960
in a weird way when you when
you get scared, and you got to

934
01:28:12.039 --> 01:28:15.600
train them very well. I was
lucky enough to get my first bike when

935
01:28:15.640 --> 01:28:21.640
I was six years old, so
I kind of have sec second nature instincts

936
01:28:21.680 --> 01:28:29.680
by now. But it's definitely not
not normal, and especially if you if

937
01:28:29.720 --> 01:28:35.319
you get into biking at a leader
age, do a safety course, actions

938
01:28:35.319 --> 01:28:39.560
and everything else. What AJ said, it's it's good. I didn't know

939
01:28:39.640 --> 01:28:43.880
about the year. I think I'll
try it out. Please send me a

940
01:28:44.039 --> 01:28:49.600
link, maybe offline. I'm curious, And so I have doubled down what

941
01:28:49.720 --> 01:28:56.640
Aj said and in a in a
relatively similar fashion, but a different,

942
01:28:56.800 --> 01:29:01.840
completely different thing. I recently got
into go karting. Mm fun do do

943
01:29:02.159 --> 01:29:09.479
do? Start to go karting?
I purchased a Hazy card, which is

944
01:29:09.560 --> 01:29:14.880
a shifter card with six gears,
and it's killing me. I go there

945
01:29:14.960 --> 01:29:17.399
on the weekend, I feel like
I'm the best driver in the war.

946
01:29:17.560 --> 01:29:21.840
And of course the low west on
the track and Monday, Monday, like

947
01:29:21.920 --> 01:29:28.800
today, I'm in pain my whole
body due to the physical exercise. But

948
01:29:28.920 --> 01:29:33.399
it's a very good way to get
out of your concert zone, out out

949
01:29:33.439 --> 01:29:39.439
in the open and have fun.
So my teak is go karting. How

950
01:29:40.119 --> 01:29:44.880
how fast do these go cards go? Well, that depends do you want

951
01:29:44.920 --> 01:29:51.920
to know? In American terms or
European terms terms? Last time I clocked

952
01:29:53.359 --> 01:29:57.520
like one hundred and thirty seven kilometers
per hour on the track. Yeah.

953
01:29:57.640 --> 01:30:05.199
See, in America, go cart
means children's toy or perhaps family recreational or

954
01:30:05.479 --> 01:30:11.199
not. That's true. I was
gonna say, I go carting at a

955
01:30:11.239 --> 01:30:15.840
place hide here on the west side
of Portland. And you know the cars

956
01:30:15.880 --> 01:30:18.800
that you can just go rent and
drive around their track or you don't get

957
01:30:18.800 --> 01:30:23.520
it, like sixty miles an hour. And there's some there's some serious cart

958
01:30:23.560 --> 01:30:26.199
there's races. Are people with their
own cares, you know, and they

959
01:30:27.079 --> 01:30:29.880
go really fast. I have never
heard of a go cart that goes more

960
01:30:29.920 --> 01:30:31.800
than like twenty miles an hour.
Oh no, the carting, Oh I've

961
01:30:32.920 --> 01:30:36.359
I have some neighbors that have some
that. Oh yeah, they whip around

962
01:30:36.359 --> 01:30:40.720
the neighborhood faster than the cars go. Right awayrat, this isn't just around

963
01:30:40.760 --> 01:30:44.640
the neighborhood. One hundred and thirty
seven miles or kilometers per hours, about

964
01:30:44.640 --> 01:30:47.680
eighty five five hours, so that
that sucker is moving that a pretty good

965
01:30:47.680 --> 01:30:55.279
speed. It has six geas,
so like it's it's serious force follower.

966
01:30:55.800 --> 01:30:59.439
Yeah, that's fast enough to take
on the freeway here in the US and

967
01:31:00.039 --> 01:31:02.000
get a speeding ticket. Yes,
you can get speeding people, not in

968
01:31:02.199 --> 01:31:06.399
Utah, but in other places and
everywhere. Here's seventy miles an hour,

969
01:31:06.560 --> 01:31:11.680
seventy five miles an hour. That
sweet. You get out of town and

970
01:31:11.760 --> 01:31:16.720
sadie. Because the trock is is
not long. If you write long long

971
01:31:16.840 --> 01:31:21.800
shifts, it goes up to two
hinds. But easily it's the closest thing

972
01:31:21.880 --> 01:31:26.680
to a Formula one. You can
ride. Wow, if you serve on.

973
01:31:29.119 --> 01:31:31.359
I can't wait to tell my wife
she's going to be so excited to

974
01:31:31.479 --> 01:31:39.760
hear about this. Yeah, typically
because it costs a lot of money overall,

975
01:31:40.159 --> 01:31:45.199
but it's very fun. Yeah.
The the go karts that I've seen

976
01:31:45.319 --> 01:31:47.720
here, they're typically not road legal. I mean, if you're if you're

977
01:31:47.760 --> 01:31:51.399
in your neighborhood or you know,
you're not on the main road, right,

978
01:31:51.760 --> 01:31:56.279
I don't go out to the highway
or whatever. Nobody cares. But

979
01:31:56.840 --> 01:32:00.359
yeah, I've seen some pretty serious
of stuff. And then you get,

980
01:32:00.439 --> 01:32:03.399
Yeah, you get the off road
vehicles net that you know, you go

981
01:32:03.520 --> 01:32:09.000
down to there's a there's some sand
dune south of the lake here that people

982
01:32:09.119 --> 01:32:13.199
go out and do that. Or
we also don't live terribly far from the

983
01:32:13.560 --> 01:32:17.159
uh Boto the salt salt flats where
you could probably go do something really fast

984
01:32:17.199 --> 01:32:21.840
there. Just don't forget, just
don't forget to wear a helmet. Don't

985
01:32:21.840 --> 01:32:25.399
forget to wear a helmet. That's
the only thing you wear on a gogle

986
01:32:25.479 --> 01:32:29.800
cart. You don't have safety anything
else. You just have a helmet and

987
01:32:29.960 --> 01:32:32.000
that's pretty much it. Yeah,
and then it's that roll bars, right,

988
01:32:32.600 --> 01:32:36.439
so you like you just strap in
and the roll bars are your safety

989
01:32:36.520 --> 01:32:44.039
net. Well, you don't have
roll bars. Yeah, if you just

990
01:32:44.119 --> 01:32:45.439
don't wreck it. You just don't
wreck it. That's your SA. Just

991
01:32:45.479 --> 01:32:51.199
don't cry. Yeah. When I
when I first asked about how to drive

992
01:32:53.039 --> 01:32:56.680
a Google cart proficiently on a on
a track, the truck manager, who

993
01:32:56.800 --> 01:33:01.279
used to be number four in the
World Championship in the maximum category of carting

994
01:33:01.880 --> 01:33:05.920
look at me, and I was
like, Mike, the green, just

995
01:33:05.960 --> 01:33:15.119
don't go there the weed. Yeah, there was there was his advice.

996
01:33:15.600 --> 01:33:17.159
Don't go in the grass. That
don't go in the grass. Yes,

997
01:33:18.279 --> 01:33:24.560
that's the that's the advice on how
to drive a go card. I really

998
01:33:24.640 --> 01:33:32.840
want to go now, yeah,
go karting and CNA that I'm so in.

999
01:33:34.079 --> 01:33:36.399
All right, Well, let's go
ahead and wrap this up. Thanks

1000
01:33:36.439 --> 01:33:40.800
for coming, Michael. If people
want to connect with you online, We've

1001
01:33:40.800 --> 01:33:44.800
already said effect that website, But
I'm guessing you're on Twitter and things like

1002
01:33:44.880 --> 01:33:48.720
that. Where where do people find
you? Tweeter or Discord? Discord is

1003
01:33:48.880 --> 01:33:54.520
better. I usually spend more time
on Discord than Tweeter because then I start

1004
01:33:54.600 --> 01:33:58.039
reading tweets, I get angry,
close down on my laptop and so on

1005
01:33:58.119 --> 01:34:01.039
and so forth, and the whole
cycle rest. But I'm more on on

1006
01:34:02.279 --> 01:34:08.239
on Discord, but also tweeter is
very fine. The only trouble I guess

1007
01:34:08.319 --> 01:34:14.960
with contacting me on Twitter is recently
I've got like people seems like they can't

1008
01:34:15.079 --> 01:34:17.840
send me or when they send me
a DM, it gets hidden, so

1009
01:34:17.960 --> 01:34:21.800
I might not I might not reply. I have no idea why. Again,

1010
01:34:21.920 --> 01:34:27.079
Elon Musk, if he's listening to
this, should probably fix that.

1011
01:34:28.039 --> 01:34:30.800
But discord doesn't have that problem.
Yeah, I have opened dms, and

1012
01:34:31.199 --> 01:34:35.760
if I haven't approved you or I'm
not following you, then they won't show

1013
01:34:35.840 --> 01:34:40.600
up. And so then yeah,
periodically it's like, oh you message me,

1014
01:34:40.800 --> 01:34:45.439
I'm up there. Two Yeah,
anyway, sorry, Yeah, what

1015
01:34:45.600 --> 01:34:50.560
what's your Twitter handle? That might
another? Oh? Easy, easy to

1016
01:34:50.640 --> 01:34:55.399
remember. All right, Well,
we'll go ahead and wrap it up until

1017
01:34:55.479 --> 01:34:57.000
next time. Folks max out

