WEBVTT

1
00:00:06.120 --> 00:00:10.039
<v Speaker 1>Welcome to Ruby Roags today. On our panel this week

2
00:00:10.080 --> 00:00:14.599
<v Speaker 1>we have Dave Kimura everyone, and we have Luke stutters

3
00:00:14.839 --> 00:00:18.559
<v Speaker 1>Hi and I'm John Epperson. And for a guest this week,

4
00:00:18.879 --> 00:00:23.519
<v Speaker 1>we have case Leo. Luke Yes, Hi, welcome. Would you

5
00:00:23.559 --> 00:00:26.839
<v Speaker 1>tell us what you're famous for, what you do, just

6
00:00:26.839 --> 00:00:28.399
<v Speaker 1>a little bit about you so we can get kind

7
00:00:28.399 --> 00:00:28.879
<v Speaker 1>of going here.

8
00:00:29.079 --> 00:00:29.359
<v Speaker 2>Sure.

9
00:00:29.719 --> 00:00:33.679
<v Speaker 3>I'm currently working at Shopify on the Ruby and Rail's

10
00:00:33.719 --> 00:00:37.159
<v Speaker 3>infrastructure team. I've been at Shopify for about a year

11
00:00:37.240 --> 00:00:40.880
<v Speaker 3>and a half and since I've joined, I've been first

12
00:00:40.920 --> 00:00:45.240
<v Speaker 3>on the Rails upgrade project, and then I quickly switched

13
00:00:45.280 --> 00:00:49.439
<v Speaker 3>over to the Sorbey adoption team and so we spearheaded

14
00:00:49.520 --> 00:00:53.920
<v Speaker 3>the adoption of Sorbey across our monolith and across our

15
00:00:53.960 --> 00:00:54.880
<v Speaker 3>other code.

16
00:00:54.600 --> 00:00:58.600
<v Speaker 2>Basis as well. And now I'm slowly transitioning to being

17
00:00:58.759 --> 00:01:02.600
<v Speaker 2>the team lead or the Ruby part of the team.

18
00:01:02.880 --> 00:01:04.519
<v Speaker 2>So the team will.

19
00:01:04.439 --> 00:01:09.959
<v Speaker 3>Be responsible for contributing to MRI and contributing to Sourbet,

20
00:01:10.319 --> 00:01:14.920
<v Speaker 3>basically solving and maintaining and building on the.

21
00:01:14.799 --> 00:01:16.519
<v Speaker 2>Open source Ruby foundations.

22
00:01:16.680 --> 00:01:20.840
<v Speaker 3>I've been in the software development industry for over twenty years.

23
00:01:20.879 --> 00:01:23.799
<v Speaker 2>I've worked with very statically type dynamic.

24
00:01:23.400 --> 00:01:27.840
<v Speaker 3>P time languages across that time. Initially I was working

25
00:01:28.120 --> 00:01:31.159
<v Speaker 3>in a startup. I was one of the family employees

26
00:01:31.560 --> 00:01:35.840
<v Speaker 3>where we were developing voice XML based applications, and we

27
00:01:35.959 --> 00:01:39.359
<v Speaker 3>built a voice XML platform, and then we did like

28
00:01:39.480 --> 00:01:44.040
<v Speaker 3>various networking things voice so variety, text to speech, speech recognition,

29
00:01:44.120 --> 00:01:47.000
<v Speaker 3>et cetera, et cetera. I had a short stint in

30
00:01:47.040 --> 00:01:50.599
<v Speaker 3>between for a couple of years doing startup acceleoration, and

31
00:01:50.560 --> 00:01:54.319
<v Speaker 3>then went back to developing software and so apped me

32
00:01:54.439 --> 00:01:55.040
<v Speaker 3>in a nutshell.

33
00:01:55.680 --> 00:01:58.680
<v Speaker 1>Wow, So there were there have been a couple of

34
00:01:58.719 --> 00:02:01.319
<v Speaker 1>talks that you've given it that I know about. I

35
00:02:01.359 --> 00:02:02.879
<v Speaker 1>don't know if you've given more than that, but.

36
00:02:03.159 --> 00:02:06.200
<v Speaker 3>Yeah, I have one talk at Ruby COMF twenty nineteen

37
00:02:06.400 --> 00:02:11.439
<v Speaker 3>last year, and I also submitted a Rails comp twenty

38
00:02:11.439 --> 00:02:14.240
<v Speaker 3>twenty the couch edition, the remote one.

39
00:02:14.439 --> 00:02:15.840
<v Speaker 2>I also had a talk there.

40
00:02:15.960 --> 00:02:18.120
<v Speaker 1>Yeah, sorry about the confusion. One was on sorbet and

41
00:02:18.159 --> 00:02:21.120
<v Speaker 1>one was on the network. I know that I, particularly,

42
00:02:21.439 --> 00:02:26.039
<v Speaker 1>for one, am interested in hearing about your adoption at Surbey.

43
00:02:26.199 --> 00:02:28.719
<v Speaker 1>I think that's super interesting to me. Anything that you

44
00:02:28.840 --> 00:02:31.680
<v Speaker 1>particularly want to note about either of those things that

45
00:02:31.759 --> 00:02:33.360
<v Speaker 1>you're super interested in yourself.

46
00:02:33.560 --> 00:02:36.319
<v Speaker 3>I think we can maybe talk about the network stack

47
00:02:36.439 --> 00:02:39.360
<v Speaker 3>video and the talk from Rails comp near the end

48
00:02:39.400 --> 00:02:41.479
<v Speaker 3>of the show if we have time, because I think

49
00:02:41.479 --> 00:02:44.759
<v Speaker 3>most people would be interested in the sorbe adoption and

50
00:02:45.199 --> 00:02:47.639
<v Speaker 3>how a company with a code based as large as

51
00:02:47.680 --> 00:02:52.280
<v Speaker 3>Shopify has been successfully adopting it. I'm presuming that's what

52
00:02:52.520 --> 00:02:54.919
<v Speaker 3>most of the listeners would be interested in, so we

53
00:02:54.960 --> 00:02:56.439
<v Speaker 3>can get startled with that if you want.

54
00:02:56.719 --> 00:03:02.199
<v Speaker 4>How large is the Shopify code? Because Shopify moved forty

55
00:03:02.280 --> 00:03:08.400
<v Speaker 4>one billion dollars of merchandise in twenty eighteen, forty one

56
00:03:08.719 --> 00:03:12.520
<v Speaker 4>billion would have been how many dollars per line of

57
00:03:12.599 --> 00:03:14.439
<v Speaker 4>code does that work out to?

58
00:03:15.479 --> 00:03:17.000
<v Speaker 2>I haven't calculated that.

59
00:03:17.759 --> 00:03:20.840
<v Speaker 3>I don't know, But like in case some of the

60
00:03:21.080 --> 00:03:25.039
<v Speaker 3>listeners aren't familiar with the company, and maybe I should

61
00:03:25.120 --> 00:03:26.120
<v Speaker 3>just give a quick intro.

62
00:03:26.599 --> 00:03:28.240
<v Speaker 2>So what Shopify does? So.

63
00:03:28.439 --> 00:03:33.000
<v Speaker 3>Shopify is a leading global commerce company that provides tools

64
00:03:33.039 --> 00:03:37.439
<v Speaker 3>to start, grow, market and manage a retail business of

65
00:03:37.520 --> 00:03:40.960
<v Speaker 3>any site. So it started off in two thousand and

66
00:03:41.039 --> 00:03:46.080
<v Speaker 3>six codebased that was built on Rail's pre one point zero,

67
00:03:46.560 --> 00:03:48.439
<v Speaker 3>so it was the time of Rails when it was

68
00:03:48.479 --> 00:03:53.800
<v Speaker 3>still being shared as zippiles and it's been growing ever since.

69
00:03:53.879 --> 00:03:56.960
<v Speaker 3>It started as an e commerce platform and has grown

70
00:03:57.000 --> 00:04:00.800
<v Speaker 3>into being a multi touch general commerce platform, so it

71
00:04:00.919 --> 00:04:04.719
<v Speaker 3>provides solutions both for e commerce and also in store commerce,

72
00:04:05.159 --> 00:04:08.199
<v Speaker 3>in person commerce, so it has many solutions.

73
00:04:08.240 --> 00:04:08.439
<v Speaker 2>Now.

74
00:04:08.520 --> 00:04:13.240
<v Speaker 3>It supports more than one million merchants now and throughout

75
00:04:13.240 --> 00:04:17.519
<v Speaker 3>its lifetime it supported one hundred and seventy two billion

76
00:04:17.680 --> 00:04:21.800
<v Speaker 3>USB in total sales for all the merchants. Of course,

77
00:04:21.839 --> 00:04:25.920
<v Speaker 3>that's lopsided to the recent here, So the figure that

78
00:04:25.920 --> 00:04:30.120
<v Speaker 3>that you quoted is probably correct. Look like, I don't know,

79
00:04:30.279 --> 00:04:31.319
<v Speaker 3>off the top of mind.

80
00:04:31.040 --> 00:04:34.600
<v Speaker 4>Calls it from Wikipedia, so it's almost certainly wrong.

81
00:04:36.800 --> 00:04:38.279
<v Speaker 2>It sounds believable.

82
00:04:38.279 --> 00:04:41.439
<v Speaker 3>Then, As for the code base, it's most probably the

83
00:04:41.600 --> 00:04:43.759
<v Speaker 3>largest Ruby on Rails code base in.

84
00:04:43.720 --> 00:04:44.519
<v Speaker 2>The world right now.

85
00:04:45.000 --> 00:04:50.160
<v Speaker 3>It has about thirty thousand Ruby files in our core monolith.

86
00:04:50.480 --> 00:04:53.759
<v Speaker 3>So I'll keep referring to Core. So when I say Core,

87
00:04:54.240 --> 00:04:58.160
<v Speaker 3>that's our main monolith that provides almost all of the

88
00:04:58.199 --> 00:05:00.079
<v Speaker 3>shop off solutions.

89
00:05:00.120 --> 00:05:02.000
<v Speaker 2>Even though we now.

90
00:05:01.800 --> 00:05:06.040
<v Speaker 3>Have some other services that operate outside of Core, most

91
00:05:06.040 --> 00:05:08.839
<v Speaker 3>of our code base and most of our operation is

92
00:05:08.879 --> 00:05:13.600
<v Speaker 3>actually still being handled by Core, which is our hour monolith.

93
00:05:13.680 --> 00:05:18.680
<v Speaker 3>And that's about thirty thousand Ruby files. And on each push,

94
00:05:18.920 --> 00:05:22.079
<v Speaker 3>on each deploy there are about one hundred and fifty

95
00:05:22.279 --> 00:05:27.319
<v Speaker 3>thousand tests that run to ensure that everything is still same.

96
00:05:27.839 --> 00:05:30.000
<v Speaker 3>So that's the size of the code base, that's the

97
00:05:30.040 --> 00:05:31.639
<v Speaker 3>size of the platform.

98
00:05:31.160 --> 00:05:33.199
<v Speaker 5>And that's crazy. I think, you know, a lot of

99
00:05:33.279 --> 00:05:37.439
<v Speaker 5>us would dream to get to that kind of scale. Honestly,

100
00:05:37.480 --> 00:05:39.759
<v Speaker 5>I think it would be a nightmare. Not only do

101
00:05:39.800 --> 00:05:42.439
<v Speaker 5>you have the super huge codebase to maintain, but then

102
00:05:42.920 --> 00:05:46.759
<v Speaker 5>just the infrastructure alone, and what that would look like

103
00:05:47.480 --> 00:05:50.360
<v Speaker 5>would is probably be really crazy. Can you speak into

104
00:05:50.360 --> 00:05:53.560
<v Speaker 5>the infrastructure, you know, are you guys using a very

105
00:05:53.600 --> 00:05:56.920
<v Speaker 5>simple infrastructure or has it kind of gone from simple

106
00:05:57.000 --> 00:05:58.360
<v Speaker 5>to like very elaborate.

107
00:05:58.639 --> 00:06:01.120
<v Speaker 3>So I've only been at the for about a year

108
00:06:01.160 --> 00:06:05.279
<v Speaker 3>and a half and most of the infrastructure has been

109
00:06:05.360 --> 00:06:09.879
<v Speaker 3>in place before I joined, and I'm also still learning

110
00:06:09.879 --> 00:06:13.000
<v Speaker 3>about some of the infrastructure that we use. But like

111
00:06:13.079 --> 00:06:17.000
<v Speaker 3>I can tell you, it's a kubernkkis deploy so everything's

112
00:06:17.079 --> 00:06:21.680
<v Speaker 3>virtualized in Docker containers and deployed to Kubernets pods, and

113
00:06:21.800 --> 00:06:24.879
<v Speaker 3>there are like some load balancing solutions, and we also

114
00:06:24.920 --> 00:06:28.839
<v Speaker 3>have this concept of pods. Pods are these logical units

115
00:06:28.839 --> 00:06:33.519
<v Speaker 3>that host a group of certain merchants in one location

116
00:06:34.199 --> 00:06:37.800
<v Speaker 3>with their own basic infrastructure. So that's like one way

117
00:06:37.839 --> 00:06:42.839
<v Speaker 3>of sharding the customer database and the customer load across

118
00:06:42.920 --> 00:06:46.720
<v Speaker 3>different machines. I'm pretty sure that, like others from the company,

119
00:06:46.759 --> 00:06:51.839
<v Speaker 3>have presented at various conferences talking about that infrastructure part,

120
00:06:52.319 --> 00:06:56.240
<v Speaker 3>but that's not necessarily my strongest point, so I don't

121
00:06:56.240 --> 00:06:59.079
<v Speaker 3>want to really go much more in depth about that,

122
00:06:59.680 --> 00:07:02.839
<v Speaker 3>even though the team that I'm working on, the Rails,

123
00:07:02.920 --> 00:07:05.959
<v Speaker 3>the Ruby and Rail's Infrastructure team, is a part of

124
00:07:06.160 --> 00:07:09.879
<v Speaker 3>the product line in the company called Kernel. Kernel is

125
00:07:09.920 --> 00:07:15.480
<v Speaker 3>basically responsible for ensuring that the platform is off and running,

126
00:07:15.720 --> 00:07:19.759
<v Speaker 3>so it's responsible for all the infrastructure problems, but also

127
00:07:19.839 --> 00:07:23.399
<v Speaker 3>it includes Developer Acceleration, which my team is a part

128
00:07:23.439 --> 00:07:26.680
<v Speaker 3>of as well, which provides solutions for the developers within

129
00:07:26.720 --> 00:07:29.399
<v Speaker 3>the company so that they can do their work better,

130
00:07:29.639 --> 00:07:34.040
<v Speaker 3>they can produce solutions faster, and also we provide solutions

131
00:07:34.040 --> 00:07:35.879
<v Speaker 3>for the infrastructure part of the team as well.

132
00:07:36.000 --> 00:07:38.800
<v Speaker 1>Yeah, I definitely remember more than one talk at Rails

133
00:07:38.800 --> 00:07:41.839
<v Speaker 1>comp throughout the years on how you guys infrastructure changed.

134
00:07:41.920 --> 00:07:44.079
<v Speaker 1>And I remember sitting at the table with some Shopify

135
00:07:44.160 --> 00:07:46.959
<v Speaker 1>people one year who were talking me through how they

136
00:07:47.079 --> 00:07:50.560
<v Speaker 1>were moving from Vagrant to Docker. So yeah, I do

137
00:07:50.600 --> 00:07:53.399
<v Speaker 1>remember the story changing. I'm not expert enough to talk

138
00:07:53.399 --> 00:07:56.319
<v Speaker 1>about it by any means. But that's been crazy to

139
00:07:56.360 --> 00:07:59.800
<v Speaker 1>watch from the outside. Yes, so all right to get

140
00:08:00.360 --> 00:08:04.040
<v Speaker 1>down into sorbet. What maybe from a high level talk

141
00:08:04.040 --> 00:08:06.920
<v Speaker 1>about what you guys did to make survey happen at shopify.

142
00:08:07.120 --> 00:08:10.040
<v Speaker 3>Sure again, maybe I should give a little bit more

143
00:08:10.040 --> 00:08:13.120
<v Speaker 3>context as to what sorbet is, who developed it. What's

144
00:08:13.399 --> 00:08:18.279
<v Speaker 3>used for sorbet is gradual type checker for Ruby that

145
00:08:18.439 --> 00:08:22.399
<v Speaker 3>was developed by the fine folks at Strip. So sorbet

146
00:08:22.800 --> 00:08:27.360
<v Speaker 3>provides you the tools to add type checking information to

147
00:08:27.439 --> 00:08:31.000
<v Speaker 3>your Ruby code base, and it gives you both static

148
00:08:31.120 --> 00:08:34.840
<v Speaker 3>typechecker and a runtime type checker to ensure that your

149
00:08:34.960 --> 00:08:38.240
<v Speaker 3>type assumptions are makes sense and are valid. The static

150
00:08:38.279 --> 00:08:41.759
<v Speaker 3>type checker is the most important part of sorbe. The

151
00:08:41.799 --> 00:08:45.679
<v Speaker 3>static type checker is a tool. It's an executable built

152
00:08:45.919 --> 00:08:49.679
<v Speaker 3>using C plus plus. It has its own Ruby parser,

153
00:08:49.960 --> 00:08:53.440
<v Speaker 3>so it's able to parse and understand Ruby and in

154
00:08:53.480 --> 00:08:57.320
<v Speaker 3>some ways simplify the Ruby language, so it can do

155
00:08:57.559 --> 00:09:01.519
<v Speaker 3>those kinds of static analysis without necessarily running your code.

156
00:09:01.799 --> 00:09:03.080
<v Speaker 3>Well I shouldn't say necessarily.

157
00:09:03.159 --> 00:09:05.960
<v Speaker 2>It doesn't run your code at all, So in that way,

158
00:09:06.000 --> 00:09:07.240
<v Speaker 2>it's a static type.

159
00:09:07.039 --> 00:09:12.039
<v Speaker 3>Checker and it's built to be blazingly fast, so it

160
00:09:12.120 --> 00:09:17.159
<v Speaker 3>can parse, understand, and type check our whole code based

161
00:09:17.200 --> 00:09:20.399
<v Speaker 3>the code based core code base that I've been talking

162
00:09:20.440 --> 00:09:24.519
<v Speaker 3>about of about thirty thousand files in a matter of

163
00:09:24.639 --> 00:09:30.039
<v Speaker 3>like ten fifteen seconds. And it was built with intentionally

164
00:09:30.120 --> 00:09:33.759
<v Speaker 3>to be fast and to be as safe as possible.

165
00:09:33.840 --> 00:09:39.120
<v Speaker 3>And when you're developing, sorbet was open sourced about a

166
00:09:39.240 --> 00:09:42.159
<v Speaker 3>year ago, so it was June twenty nineteen when it

167
00:09:42.200 --> 00:09:46.559
<v Speaker 3>was open sourced, but it was being developed by Stripe

168
00:09:46.600 --> 00:09:49.799
<v Speaker 3>for about I think two years before that, And by

169
00:09:49.840 --> 00:09:54.360
<v Speaker 3>the time I joined Shopify, we'd already gotten on the

170
00:09:54.919 --> 00:09:59.519
<v Speaker 3>early release beta program where they were doing like code

171
00:09:59.519 --> 00:10:03.279
<v Speaker 3>sharing with Shopify, so we were able to start our

172
00:10:03.360 --> 00:10:08.240
<v Speaker 3>adoption earlier than when it was initially open source. Then

173
00:10:08.480 --> 00:10:11.279
<v Speaker 3>afterwards Stripe also got like a few other companies that

174
00:10:11.320 --> 00:10:14.240
<v Speaker 3>were interested into the public data program as well. But

175
00:10:14.600 --> 00:10:17.519
<v Speaker 3>so that's why our story is a little bit different,

176
00:10:17.679 --> 00:10:21.320
<v Speaker 3>because we ended up solving some of the problems that

177
00:10:21.519 --> 00:10:24.600
<v Speaker 3>people who might want to adopt sorbe don't have to

178
00:10:24.639 --> 00:10:28.639
<v Speaker 3>solve right now because it's a much more mature product.

179
00:10:29.000 --> 00:10:31.440
<v Speaker 3>But back when we were trying to adopt it on

180
00:10:31.440 --> 00:10:35.399
<v Speaker 3>our code base, it was mostly a tool that was

181
00:10:35.879 --> 00:10:39.399
<v Speaker 3>built with the Stripe code based in mind. And I

182
00:10:39.440 --> 00:10:43.320
<v Speaker 3>can't talk too much about what Stripe codebase is like

183
00:10:43.399 --> 00:10:46.240
<v Speaker 3>because I don't know, but from our understanding is it

184
00:10:46.799 --> 00:10:50.879
<v Speaker 3>doesn't use RAILS. It tries to use as little meta

185
00:10:50.879 --> 00:10:55.000
<v Speaker 3>programming as possible. So they're like really big on intention

186
00:10:55.240 --> 00:10:59.759
<v Speaker 3>revealing code and not so much meta programming. So Sorbet

187
00:10:59.919 --> 00:11:02.919
<v Speaker 3>was the right tool for them, and they were developing

188
00:11:02.960 --> 00:11:06.279
<v Speaker 3>to solve their own solutions obviously initially, but because ar

189
00:11:06.360 --> 00:11:10.200
<v Speaker 3>codebas is RAILS, which already has a lot of meta programming.

190
00:11:10.960 --> 00:11:15.080
<v Speaker 3>So meta programming brings in a lot of dynamic methods

191
00:11:15.080 --> 00:11:19.120
<v Speaker 3>that can only be seen when you're running the code right,

192
00:11:19.159 --> 00:11:23.279
<v Speaker 3>So there are lots of methods that you don't see.

193
00:11:23.399 --> 00:11:27.000
<v Speaker 3>For example, on active record models, you don't see all

194
00:11:27.039 --> 00:11:30.039
<v Speaker 3>the attributes right because the attributes are created at runtime.

195
00:11:30.360 --> 00:11:33.080
<v Speaker 3>All the methods that relate that are related to attributes

196
00:11:33.080 --> 00:11:36.519
<v Speaker 3>are created that runtime, after RAILS has had a chance

197
00:11:36.639 --> 00:11:40.679
<v Speaker 3>to introspect your database levels. Obviously, that's a big problem

198
00:11:40.759 --> 00:11:43.759
<v Speaker 3>for Surbey because it looks like the code tries to

199
00:11:43.840 --> 00:11:46.960
<v Speaker 3>understand and sthatically and it says, oh, this.

200
00:11:46.720 --> 00:11:51.039
<v Speaker 2>Model has no methods. So in another part of the codebase.

201
00:11:51.200 --> 00:11:55.559
<v Speaker 3>When you're trying to do shop dot something Serb says, oh,

202
00:11:55.759 --> 00:11:58.919
<v Speaker 3>like shop doesn't have this method, so that ends up

203
00:11:58.919 --> 00:11:59.720
<v Speaker 3>being a problem.

204
00:12:00.200 --> 00:12:04.159
<v Speaker 2>So one of the first things we contributed.

205
00:12:03.720 --> 00:12:07.879
<v Speaker 3>To the Sorbeko disk was a way to have the

206
00:12:08.240 --> 00:12:12.399
<v Speaker 3>static type checker understand some of the NATA programming concepts.

207
00:12:12.600 --> 00:12:16.399
<v Speaker 3>So our initial idea was that we could write scripts

208
00:12:16.440 --> 00:12:21.679
<v Speaker 3>in Ruby and so they could basically execute them so

209
00:12:21.720 --> 00:12:26.200
<v Speaker 3>that the scripts could generate what methods would exist if

210
00:12:26.240 --> 00:12:28.200
<v Speaker 3>the code had ran, but it would still be a

211
00:12:28.200 --> 00:12:31.519
<v Speaker 3>static type checker. It kind of tided us over that

212
00:12:31.600 --> 00:12:35.279
<v Speaker 3>solution for a while, but it ended up slowing down

213
00:12:35.320 --> 00:12:37.879
<v Speaker 3>the type checking process a lot, but at least it

214
00:12:37.960 --> 00:12:42.240
<v Speaker 3>allowed us to do our own initial adoption at the time.

215
00:12:42.639 --> 00:12:46.159
<v Speaker 3>Another problem as we were adopting was that all the

216
00:12:46.200 --> 00:12:50.480
<v Speaker 3>types that are coming from our GEM dependencies, So our

217
00:12:50.559 --> 00:12:55.919
<v Speaker 3>core monolith has about four hundred GEM dependencies, which is

218
00:12:56.080 --> 00:12:59.960
<v Speaker 3>already like a huge maintenance problem, right, like we need

219
00:13:00.080 --> 00:13:03.399
<v Speaker 3>to maintain them to be on the latest versions and everything.

220
00:13:03.960 --> 00:13:05.480
<v Speaker 2>But it also means there are.

221
00:13:05.320 --> 00:13:10.519
<v Speaker 3>Lots of classes, modules, constant definitions coming from those gems.

222
00:13:11.200 --> 00:13:16.039
<v Speaker 3>But Survey doesn't go and look for class definitions inside

223
00:13:16.080 --> 00:13:19.120
<v Speaker 3>of gem source of it just looks at your code base,

224
00:13:19.600 --> 00:13:23.279
<v Speaker 3>so it says, oh, you're using this foo class here,

225
00:13:23.480 --> 00:13:26.000
<v Speaker 3>or like this food constant here, but I have no

226
00:13:26.080 --> 00:13:29.559
<v Speaker 3>idea what foods. So it needs to be told what

227
00:13:29.759 --> 00:13:32.639
<v Speaker 3>foo is, what kind of methods it has, what kind

228
00:13:32.639 --> 00:13:36.480
<v Speaker 3>of subconstances it has, what type of a constant it is?

229
00:13:36.480 --> 00:13:39.960
<v Speaker 2>Is it a class, is it a module, what's superclass?

230
00:13:40.000 --> 00:13:42.840
<v Speaker 2>What are the mixings, et cetera, et cetera. So we

231
00:13:42.919 --> 00:13:45.279
<v Speaker 2>needed a tool that would just take.

232
00:13:45.159 --> 00:13:51.039
<v Speaker 3>A GEM somehow, introspect it, and then generate an RBI file.

233
00:13:51.519 --> 00:13:54.720
<v Speaker 3>So it's called an RBI file that's a Ruby interface file.

234
00:13:54.840 --> 00:13:58.000
<v Speaker 3>It's almost the same thing as a c header file.

235
00:13:58.279 --> 00:14:00.840
<v Speaker 3>So it's just the definitions of these things that I

236
00:14:00.960 --> 00:14:03.240
<v Speaker 3>just said, is it a class, is it a module?

237
00:14:03.519 --> 00:14:07.440
<v Speaker 3>What's the superclass? Mixing the methods and its arguments. So

238
00:14:07.480 --> 00:14:10.440
<v Speaker 3>it just generates those without any of the implementation. So

239
00:14:10.919 --> 00:14:13.799
<v Speaker 3>we had to build a tool and we open sourced

240
00:14:13.799 --> 00:14:15.559
<v Speaker 3>it afterwards as tapioca.

241
00:14:16.039 --> 00:14:20.200
<v Speaker 2>That does that. It takes your GEM file, it discovers

242
00:14:20.240 --> 00:14:22.399
<v Speaker 2>all the gems, it loads them into memory.

243
00:14:22.879 --> 00:14:26.519
<v Speaker 3>Then it does runtime reflection on all the types that

244
00:14:26.639 --> 00:14:30.600
<v Speaker 3>can find from all those gems, and then it tries

245
00:14:30.639 --> 00:14:33.720
<v Speaker 3>to understand what the shape of all those types are

246
00:14:33.879 --> 00:14:38.519
<v Speaker 3>and it generates that into a set of rbiphads, which

247
00:14:38.679 --> 00:14:42.080
<v Speaker 3>then so they can read, and then it then it

248
00:14:42.159 --> 00:14:45.279
<v Speaker 3>knows about food coming from the gem flo or something.

249
00:14:45.480 --> 00:14:48.159
<v Speaker 1>So just a quick follow up there, So sure you

250
00:14:48.200 --> 00:14:50.759
<v Speaker 1>guys have that or you have this problem in shopify

251
00:14:50.799 --> 00:14:53.039
<v Speaker 1>because you have a bunch of gems. Did the people

252
00:14:53.080 --> 00:14:54.320
<v Speaker 1>they created this gems right?

253
00:14:54.480 --> 00:14:54.679
<v Speaker 4>Yeah?

254
00:14:54.759 --> 00:14:56.519
<v Speaker 1>Stright? Yes, I don't know why I couldn't think of

255
00:14:56.519 --> 00:15:00.519
<v Speaker 1>it for a second. Did stric not have any gems? Depends? Then?

256
00:15:00.720 --> 00:15:05.000
<v Speaker 2>No, they did. So basically they had a script that would.

257
00:15:04.799 --> 00:15:07.559
<v Speaker 3>Kind of do the same thing that they were using internally,

258
00:15:07.600 --> 00:15:09.480
<v Speaker 3>but it wasn't part of the Sorbet.

259
00:15:09.200 --> 00:15:10.080
<v Speaker 2>Tooling at the time.

260
00:15:10.639 --> 00:15:14.159
<v Speaker 3>Okay, So they shared the initial skeleton of that script

261
00:15:14.559 --> 00:15:17.840
<v Speaker 3>with us, and then we ended up turning that into

262
00:15:18.240 --> 00:15:22.519
<v Speaker 3>the tool that's now Tabioka, and then the Storbe team

263
00:15:22.559 --> 00:15:26.000
<v Speaker 3>at Stripe they actually also took that script and then

264
00:15:26.279 --> 00:15:30.559
<v Speaker 3>built it into the sorbet in It script, which does

265
00:15:30.639 --> 00:15:34.159
<v Speaker 3>something very similar. It also can look into gems and

266
00:15:34.279 --> 00:15:38.559
<v Speaker 3>load types and generate ruby interfestiles for you. So that

267
00:15:38.759 --> 00:15:41.480
<v Speaker 3>ended up being a part of the tool, the Sorbet tool,

268
00:15:41.879 --> 00:15:46.840
<v Speaker 3>but we took a slightly different route than that tool,

269
00:15:46.919 --> 00:15:50.759
<v Speaker 3>and so that's why we're actually using Tapyoka internally rather

270
00:15:50.840 --> 00:15:53.159
<v Speaker 3>than the Sorbet in it tooling.

271
00:15:53.919 --> 00:15:55.440
<v Speaker 1>Okay, what else did you encounter?

272
00:15:55.840 --> 00:15:57.159
<v Speaker 2>Yeah, so the other thing.

273
00:15:57.519 --> 00:16:01.080
<v Speaker 3>So going back to the DSL problem, it turned out that,

274
00:16:01.879 --> 00:16:06.279
<v Speaker 3>you know, making Sorbet run Ruby scripts as it's trying

275
00:16:06.320 --> 00:16:08.480
<v Speaker 3>to make sense of your code.

276
00:16:08.279 --> 00:16:11.279
<v Speaker 2>Based statically was a huge slowdown.

277
00:16:12.360 --> 00:16:16.519
<v Speaker 3>So we basically stopped doing it, and then also realized

278
00:16:16.559 --> 00:16:20.679
<v Speaker 3>that the same approach, even though it has some disadvantages,

279
00:16:20.679 --> 00:16:24.759
<v Speaker 3>but the same approach of generating Ruby interface files for

280
00:16:24.919 --> 00:16:28.919
<v Speaker 3>all the meta programming, would be a much better fit

281
00:16:29.200 --> 00:16:33.200
<v Speaker 3>for our problem. So recently we've been working on that problem.

282
00:16:33.320 --> 00:16:36.440
<v Speaker 3>There are other solutions in the same area as well.

283
00:16:36.919 --> 00:16:40.159
<v Speaker 3>One of them is, for example, the gem called sorbet

284
00:16:40.279 --> 00:16:44.360
<v Speaker 3>Rails that's built by people at the Chans Zuckerberg Initiative.

285
00:16:44.559 --> 00:16:48.279
<v Speaker 3>So they had the same problems of Sorbey not understanding

286
00:16:48.320 --> 00:16:51.679
<v Speaker 3>some of the meta programming that's coming from rails again,

287
00:16:51.759 --> 00:16:56.120
<v Speaker 3>like all the column related methods on models, all the

288
00:16:56.200 --> 00:17:03.159
<v Speaker 3>association related methods on models, all the the class methods, sorry,

289
00:17:03.200 --> 00:17:06.680
<v Speaker 3>all the instance methods in mailers that are turned into

290
00:17:06.759 --> 00:17:11.359
<v Speaker 3>class methods, all the helpers on your controllers, they're all

291
00:17:11.400 --> 00:17:14.960
<v Speaker 3>happening at run time in rails. So Sarbe rails was

292
00:17:15.000 --> 00:17:18.519
<v Speaker 3>the first attempt to actually build a gem that could

293
00:17:18.640 --> 00:17:22.519
<v Speaker 3>generate Ruby interface files for all those things, so that

294
00:17:22.640 --> 00:17:25.839
<v Speaker 3>Sarbe can look at the Ruby interface file. So you

295
00:17:25.880 --> 00:17:29.000
<v Speaker 3>have your shop model or like shop dot irb file

296
00:17:29.319 --> 00:17:32.720
<v Speaker 3>which hosts your shop model, but you also have this

297
00:17:32.880 --> 00:17:36.759
<v Speaker 3>shop dot rbi file that's generated for you, which contains

298
00:17:37.200 --> 00:17:39.839
<v Speaker 3>all the method definitions that would be on the shop

299
00:17:39.880 --> 00:17:44.880
<v Speaker 3>model dynamically. So having that, Sarbe can say, oh, yeah, okay,

300
00:17:44.920 --> 00:17:48.880
<v Speaker 3>I know a shop as this name method, So if

301
00:17:48.920 --> 00:17:51.920
<v Speaker 3>you call shop dot name, then yes, I know what

302
00:17:51.960 --> 00:17:55.039
<v Speaker 3>that is. And even better if you can also create

303
00:17:55.079 --> 00:17:57.519
<v Speaker 3>signatures for it, so if you can tell it what

304
00:17:57.799 --> 00:18:01.079
<v Speaker 3>parameters it takes and what the return type is, then

305
00:18:01.119 --> 00:18:04.079
<v Speaker 3>you can also keep typing those things as well, so

306
00:18:04.119 --> 00:18:05.200
<v Speaker 3>you can build on.

307
00:18:05.200 --> 00:18:06.160
<v Speaker 2>Those types as well.

308
00:18:06.440 --> 00:18:09.720
<v Speaker 3>So survey rails was the initial solution to this, but

309
00:18:09.759 --> 00:18:13.519
<v Speaker 3>we also realized that we had other meta programming DSL

310
00:18:13.720 --> 00:18:17.640
<v Speaker 3>concerns within our code base that obviously wasn't addressed by

311
00:18:17.680 --> 00:18:21.640
<v Speaker 3>Sarbe rails so we wanted a broader framework, so we

312
00:18:21.799 --> 00:18:24.599
<v Speaker 3>built one in house, and we actually are in the

313
00:18:24.640 --> 00:18:28.720
<v Speaker 3>process of folding that also into Tapioca, so that Tapioca

314
00:18:28.799 --> 00:18:32.920
<v Speaker 3>becomes this once with army tool of generating RBIs either

315
00:18:33.000 --> 00:18:37.440
<v Speaker 3>from gems or from all the DSL meta programming that's

316
00:18:37.480 --> 00:18:40.920
<v Speaker 3>going on across your code based and initially we've again

317
00:18:40.960 --> 00:18:47.000
<v Speaker 3>targeted the same RAILS meta programming concepts, so we borrowed

318
00:18:47.039 --> 00:18:51.000
<v Speaker 3>and built on some of the solutions from Sarbe Rails,

319
00:18:51.160 --> 00:18:56.079
<v Speaker 3>but we've also built DSL generators for other common gems

320
00:18:56.119 --> 00:18:59.400
<v Speaker 3>across our code base, and we intend to grow that

321
00:18:59.519 --> 00:19:02.920
<v Speaker 3>set based on contributions from the community. So we have

322
00:19:03.359 --> 00:19:07.079
<v Speaker 3>a generator for an active record type store frozen record

323
00:19:07.519 --> 00:19:11.680
<v Speaker 3>identity cash that's also a Shopify gem, So like Rails

324
00:19:11.799 --> 00:19:16.039
<v Speaker 3>plus a few gems will already be addressed with Tapioca,

325
00:19:16.079 --> 00:19:19.000
<v Speaker 3>and that was the biggest pain point stopping us from

326
00:19:19.440 --> 00:19:22.640
<v Speaker 3>increasing our typing even further across our code based.

327
00:19:22.839 --> 00:19:25.880
<v Speaker 1>Okay, so you guys went through all of this working

328
00:19:25.960 --> 00:19:30.119
<v Speaker 1>effort to get survey working at Shopify. So what did

329
00:19:30.160 --> 00:19:33.160
<v Speaker 1>you get from that? Like, what was your value? What

330
00:19:33.319 --> 00:19:35.799
<v Speaker 1>was you guys's value proposition? As best you understand it.

331
00:19:35.920 --> 00:19:36.759
<v Speaker 2>Yes, great question.

332
00:19:37.559 --> 00:19:42.839
<v Speaker 3>So the obvious headline thing for SORBET is to obviously

333
00:19:42.920 --> 00:19:46.599
<v Speaker 3>to ensure that your code is type safe, right, so

334
00:19:46.680 --> 00:19:50.759
<v Speaker 3>that you're not making silly mistakes, that you don't have

335
00:19:51.359 --> 00:19:55.119
<v Speaker 3>a reference to references to classes or modules across your

336
00:19:55.160 --> 00:19:58.400
<v Speaker 3>code based that are no longer there. We've found many

337
00:19:58.440 --> 00:20:01.240
<v Speaker 3>instances of that across our co based through the use

338
00:20:01.240 --> 00:20:05.200
<v Speaker 3>of survey for example, or that you're not calling methods

339
00:20:05.279 --> 00:20:09.920
<v Speaker 3>on constants that don't actually have those methods, or that

340
00:20:10.000 --> 00:20:13.640
<v Speaker 3>you're not providing arguments to those methods that they don't

341
00:20:13.640 --> 00:20:14.440
<v Speaker 3>actually accept.

342
00:20:14.920 --> 00:20:16.480
<v Speaker 2>So all of those things.

343
00:20:16.839 --> 00:20:19.559
<v Speaker 3>If you're working on a normal RUT code based all

344
00:20:19.599 --> 00:20:22.200
<v Speaker 3>of those concerns, you can only discover them at.

345
00:20:22.119 --> 00:20:24.839
<v Speaker 2>One time, so you either need to.

346
00:20:24.799 --> 00:20:28.319
<v Speaker 3>Have extensive testing to ensure that all those edge cases

347
00:20:28.839 --> 00:20:33.720
<v Speaker 3>are executed on your CI or you discover them in production.

348
00:20:34.160 --> 00:20:38.519
<v Speaker 3>So the initial goal is obviously was to reduce those

349
00:20:38.559 --> 00:20:42.680
<v Speaker 3>types of trivial errors as much as possible. Unfortunately, in

350
00:20:42.720 --> 00:20:48.960
<v Speaker 3>our initial adoption phase we couldn't validate or invalidate that hypothesis,

351
00:20:49.240 --> 00:20:51.160
<v Speaker 3>but we did other things to.

352
00:20:51.200 --> 00:20:52.079
<v Speaker 2>Compensate for that.

353
00:20:52.400 --> 00:20:56.720
<v Speaker 3>So there's a very understandable reason for why we couldn't

354
00:20:56.759 --> 00:21:00.640
<v Speaker 3>conclude on that hypothesis if we were able to reduce

355
00:21:00.720 --> 00:21:05.720
<v Speaker 3>trivial errors. Is because our core monolith does more dynamic

356
00:21:05.799 --> 00:21:08.960
<v Speaker 3>things then the stuff that we have in our code base.

357
00:21:09.279 --> 00:21:12.279
<v Speaker 3>So it kind of like serializes objects to the database

358
00:21:12.319 --> 00:21:15.240
<v Speaker 3>and then read serialized objects from the database, et cetera,

359
00:21:15.240 --> 00:21:18.039
<v Speaker 3>et cetera, And there's no way aesthetic type checker can

360
00:21:18.200 --> 00:21:22.759
<v Speaker 3>like prevent you from, you know, de serializing an object

361
00:21:22.880 --> 00:21:27.039
<v Speaker 3>that definition for which has mistakenly even remote from the

362
00:21:27.079 --> 00:21:30.759
<v Speaker 3>codebas Right, So suppose you had like a user class

363
00:21:30.920 --> 00:21:34.160
<v Speaker 3>and there was a user object serialized somewhere, and then

364
00:21:34.200 --> 00:21:37.000
<v Speaker 3>someone removes the user class, and now someone tries to

365
00:21:37.079 --> 00:21:41.079
<v Speaker 3>de serialize the user object, and then boom, your application fails,

366
00:21:41.160 --> 00:21:44.240
<v Speaker 3>right because the user class doesn't exist anymore, so you

367
00:21:44.319 --> 00:21:48.279
<v Speaker 3>can't deserialize it. So we obviously can't prevent those kinds

368
00:21:48.279 --> 00:21:51.039
<v Speaker 3>of errors. So there are like other dynamic things going on,

369
00:21:51.279 --> 00:21:56.200
<v Speaker 3>And like I said, Core is such a large code base,

370
00:21:56.960 --> 00:22:01.119
<v Speaker 3>and there's like so much variance across like its failure

371
00:22:01.160 --> 00:22:05.079
<v Speaker 3>modes that it's hard to get the signal that we

372
00:22:05.119 --> 00:22:08.960
<v Speaker 3>were looking for among all that background. So then we

373
00:22:09.039 --> 00:22:12.640
<v Speaker 3>said we actually need a smaller code base to test

374
00:22:12.640 --> 00:22:16.359
<v Speaker 3>our hypothesison to see if we're able to move the

375
00:22:16.440 --> 00:22:21.200
<v Speaker 3>needle in that type safety in any direction. So after

376
00:22:21.240 --> 00:22:25.279
<v Speaker 3>we did the initial adoption on Core, we turned our

377
00:22:25.319 --> 00:22:29.279
<v Speaker 3>attention to a much smaller and more opinionated code.

378
00:22:29.039 --> 00:22:32.079
<v Speaker 2>Base within the company, and that's a tool that we

379
00:22:32.119 --> 00:22:32.720
<v Speaker 2>call DEV.

380
00:22:33.319 --> 00:22:36.880
<v Speaker 3>So DEV is a tool that every developer at Shopify

381
00:22:37.079 --> 00:22:40.839
<v Speaker 3>has on their computer and it's the tool that every

382
00:22:40.880 --> 00:22:46.119
<v Speaker 3>developer uses during their daily work workflows. So DEV is

383
00:22:46.119 --> 00:22:51.119
<v Speaker 3>a command line tool. You use it to clone Shopify

384
00:22:51.119 --> 00:22:56.680
<v Speaker 3>imposteres then to you only invoke dev up and it

385
00:22:56.880 --> 00:23:00.559
<v Speaker 3>knows based on a configuration file with an repo. It

386
00:23:00.599 --> 00:23:05.039
<v Speaker 3>knows which dependencies to install, which commands to execute to

387
00:23:05.079 --> 00:23:07.359
<v Speaker 3>bring the application up.

388
00:23:07.960 --> 00:23:10.119
<v Speaker 2>And it also gives you different.

389
00:23:09.799 --> 00:23:13.559
<v Speaker 3>Shortcuts like DEV tests or DEV type check, which was

390
00:23:13.559 --> 00:23:17.440
<v Speaker 3>something we added to run like various various things. So

391
00:23:17.559 --> 00:23:21.039
<v Speaker 3>DEV is a very opinionated code base because it's a

392
00:23:21.079 --> 00:23:24.079
<v Speaker 3>developer tool. It's a command line tool. Everyone uses it

393
00:23:24.359 --> 00:23:27.079
<v Speaker 3>throughout the day, so it needs to be fast. It

394
00:23:27.119 --> 00:23:31.799
<v Speaker 3>has for that reason. It has no external dependencies, so

395
00:23:31.839 --> 00:23:35.000
<v Speaker 3>it doesn't use any any gems or anything. If it

396
00:23:35.160 --> 00:23:38.160
<v Speaker 3>needs some other code, it vendors them in. So it

397
00:23:38.279 --> 00:23:41.599
<v Speaker 3>was like the ideal code base, and the team that's

398
00:23:41.640 --> 00:23:44.519
<v Speaker 3>working on that codebase is a small team that's been

399
00:23:44.519 --> 00:23:46.680
<v Speaker 3>working on the same codebase for a long time. So

400
00:23:46.720 --> 00:23:50.400
<v Speaker 3>we talked to that team and we told them that

401
00:23:50.440 --> 00:23:54.799
<v Speaker 3>we were interested in adding type annotations to the majority

402
00:23:54.839 --> 00:23:57.799
<v Speaker 3>of the dev code base and to see, you know,

403
00:23:58.440 --> 00:24:01.359
<v Speaker 3>what kind of an impact we could get on type safety.

404
00:24:01.440 --> 00:24:03.680
<v Speaker 2>That was a project that took like a couple.

405
00:24:03.400 --> 00:24:08.400
<v Speaker 3>Of months because it's especially hard to add typing to

406
00:24:08.720 --> 00:24:12.759
<v Speaker 3>code that you already have because it means you need

407
00:24:12.839 --> 00:24:18.160
<v Speaker 3>to understand how data is flowing throughout the code because

408
00:24:18.400 --> 00:24:21.599
<v Speaker 3>you have some method that ends up calling some other

409
00:24:21.680 --> 00:24:25.359
<v Speaker 3>method and then combining the results from that other method

410
00:24:25.400 --> 00:24:28.279
<v Speaker 3>by the result of another method call or something. So

411
00:24:28.319 --> 00:24:30.440
<v Speaker 3>you have these chains of method calls that you need

412
00:24:30.480 --> 00:24:34.400
<v Speaker 3>to understand what types they return to understand what types

413
00:24:34.519 --> 00:24:36.839
<v Speaker 3>your method in question is returning.

414
00:24:37.279 --> 00:24:38.759
<v Speaker 2>So it becomes like an.

415
00:24:39.119 --> 00:24:43.359
<v Speaker 3>Arduous process to fully type and existing code based. So

416
00:24:43.680 --> 00:24:47.039
<v Speaker 3>that took a couple of months, but we approached that

417
00:24:47.160 --> 00:24:50.359
<v Speaker 3>very methodically. So we took a look at the ways

418
00:24:50.640 --> 00:24:53.480
<v Speaker 3>dev fail, and we took a look at all the

419
00:24:53.559 --> 00:24:58.319
<v Speaker 3>ways that dev fails that's related to type related problems.

420
00:24:58.359 --> 00:25:02.759
<v Speaker 3>So any exception that dev was raising. There were always

421
00:25:02.799 --> 00:25:06.359
<v Speaker 3>like all being captured anyway, So any exceptions that was

422
00:25:06.440 --> 00:25:12.480
<v Speaker 3>raising that were type errors, no method errors or argument errors.

423
00:25:12.319 --> 00:25:15.720
<v Speaker 2>We collated that. So we drew graphs and everything.

424
00:25:15.759 --> 00:25:18.920
<v Speaker 3>So that was before we started this experiment, and we

425
00:25:19.039 --> 00:25:23.039
<v Speaker 3>drew the same graphs for after we finished this experiment,

426
00:25:23.240 --> 00:25:27.440
<v Speaker 3>and our findings are interesting. So we were actually able

427
00:25:27.480 --> 00:25:33.119
<v Speaker 3>to completely eradicate namers because that's the lowest hanging fruit.

428
00:25:33.240 --> 00:25:37.599
<v Speaker 3>So the basic premise that Sorbe gives you is to

429
00:25:37.720 --> 00:25:41.920
<v Speaker 3>ensure that all the constants are resolved somehow so that

430
00:25:42.000 --> 00:25:44.839
<v Speaker 3>you don't have any constants that Sorbe.

431
00:25:44.559 --> 00:25:46.319
<v Speaker 2>Doesn't understand in your codebase.

432
00:25:46.559 --> 00:25:49.480
<v Speaker 3>So and that's what a namer is, right, Like you

433
00:25:49.559 --> 00:25:52.240
<v Speaker 3>refer to food, but food doesn't exist, so you.

434
00:25:52.279 --> 00:25:52.920
<v Speaker 2>Get a namer.

435
00:25:53.519 --> 00:25:55.839
<v Speaker 3>And if you're not doing like const get or something,

436
00:25:56.000 --> 00:25:59.680
<v Speaker 3>it's something dynamic in your code base. Just static analysis

437
00:25:59.680 --> 00:26:02.839
<v Speaker 3>is in to eradicate all the name error problems.

438
00:26:03.039 --> 00:26:06.160
<v Speaker 2>And then we also looked at, like I said, type errors.

439
00:26:06.440 --> 00:26:09.920
<v Speaker 3>There were a few type airs left still in the

440
00:26:10.000 --> 00:26:12.720
<v Speaker 3>depth code base, but we did trace them back to

441
00:26:13.279 --> 00:26:16.640
<v Speaker 3>files that weren't marked type true. And maybe I should

442
00:26:16.680 --> 00:26:19.960
<v Speaker 3>just explain what type true, type foles all those levels

443
00:26:20.000 --> 00:26:23.559
<v Speaker 3>are so sorbe is a gradual type checker, so you

444
00:26:23.599 --> 00:26:26.559
<v Speaker 3>don't have to convert your HOLD code base to be

445
00:26:26.680 --> 00:26:29.839
<v Speaker 3>typed overnight, but you can opt into as much of

446
00:26:30.000 --> 00:26:32.839
<v Speaker 3>sorbe as you want. So when I said, you know,

447
00:26:32.920 --> 00:26:37.000
<v Speaker 3>we adopted sorbe in our core code base, of course

448
00:26:37.079 --> 00:26:40.279
<v Speaker 3>I'm not saying like we, you know, added types across

449
00:26:40.319 --> 00:26:43.039
<v Speaker 3>the HOLD code based, but we.

450
00:26:42.559 --> 00:26:46.279
<v Speaker 2>Enabled all the developers to add those type signatures and

451
00:26:46.319 --> 00:26:49.279
<v Speaker 2>to have their code checked against those type of signatures.

452
00:26:49.480 --> 00:26:50.720
<v Speaker 2>So the same thing in depth.

453
00:26:51.039 --> 00:26:53.960
<v Speaker 3>So we did add types to the majority of the

454
00:26:53.960 --> 00:26:56.200
<v Speaker 3>DEPV code base, but not to all of it, and

455
00:26:56.359 --> 00:26:59.319
<v Speaker 3>we were able to track the type errors to the

456
00:26:59.400 --> 00:27:00.920
<v Speaker 3>parts of the based that.

457
00:27:00.960 --> 00:27:02.599
<v Speaker 2>Were where the files were marked.

458
00:27:02.720 --> 00:27:06.440
<v Speaker 3>Type false and type fole says, do not type check

459
00:27:06.480 --> 00:27:09.200
<v Speaker 3>any of the method calls in this file. Only check

460
00:27:09.279 --> 00:27:12.839
<v Speaker 3>that like the constants resolved to constants that you know,

461
00:27:13.039 --> 00:27:16.039
<v Speaker 3>it does the basic type checking, whereas in type true

462
00:27:16.480 --> 00:27:19.839
<v Speaker 3>the file is type checked for all the method cads

463
00:27:19.880 --> 00:27:23.000
<v Speaker 3>and for all the parameters that are being passed correctly,

464
00:27:23.400 --> 00:27:27.039
<v Speaker 3>and if the methods have signatures, that all the methods

465
00:27:27.319 --> 00:27:28.319
<v Speaker 3>have the correct types.

466
00:27:28.519 --> 00:27:29.839
<v Speaker 1>Yeah, it's just going to say, it sounds like you

467
00:27:29.839 --> 00:27:33.160
<v Speaker 1>were able to test more or less your your premise, right,

468
00:27:33.200 --> 00:27:35.119
<v Speaker 1>which is that exactly we're going to be able to

469
00:27:35.160 --> 00:27:36.839
<v Speaker 1>eliminate all of these name errors.

470
00:27:36.960 --> 00:27:39.960
<v Speaker 3>Yes, so the name errors is the lowest hanging front

471
00:27:40.000 --> 00:27:42.519
<v Speaker 3>because you take a type false on top of your

472
00:27:42.559 --> 00:27:46.240
<v Speaker 3>file and run sorbey over it, and it will tell you, oh,

473
00:27:46.319 --> 00:27:48.799
<v Speaker 3>you have this constant that you're referring to here in

474
00:27:48.839 --> 00:27:50.640
<v Speaker 3>this file, but I have no idea what it is.

475
00:27:51.079 --> 00:27:54.240
<v Speaker 2>So it's either coming from somewhere else in your codebase

476
00:27:54.319 --> 00:27:58.599
<v Speaker 2>that Sorbe isn't processing, or it really doesn't exist, so

477
00:27:58.759 --> 00:28:02.039
<v Speaker 2>you just, you know, remove your users. So nay or

478
00:28:02.200 --> 00:28:03.000
<v Speaker 2>was simple one.

479
00:28:03.079 --> 00:28:05.400
<v Speaker 3>But we were able to reduce type errors as well,

480
00:28:05.599 --> 00:28:08.160
<v Speaker 3>and we also realized that we were able to reduce

481
00:28:08.680 --> 00:28:12.240
<v Speaker 3>argument errors and no method errors as well, though not

482
00:28:12.519 --> 00:28:16.960
<v Speaker 3>to the same extent, because even though you're opting into types,

483
00:28:17.440 --> 00:28:20.319
<v Speaker 3>you can there are still situations where when you call

484
00:28:20.359 --> 00:28:24.160
<v Speaker 3>a method, the method doesn't have a signature. Sarbe's best

485
00:28:24.200 --> 00:28:27.359
<v Speaker 3>guess is it could return anything that's represented as a

486
00:28:27.480 --> 00:28:31.319
<v Speaker 3>key on typed in sarbe. That's the equivalent of any

487
00:28:31.440 --> 00:28:34.640
<v Speaker 3>in type script. If you know you've worked with typescript

488
00:28:34.680 --> 00:28:37.000
<v Speaker 3>so far, so it's a type that can be anything,

489
00:28:37.319 --> 00:28:40.559
<v Speaker 3>so you can call any methods on it with any parameters.

490
00:28:40.839 --> 00:28:44.720
<v Speaker 2>So basically SARBA stops doing type checking past that point.

491
00:28:44.920 --> 00:28:48.200
<v Speaker 3>So a ton typed always returns a theon type when

492
00:28:48.240 --> 00:28:50.359
<v Speaker 3>you call a method on it and everything, so that

493
00:28:50.440 --> 00:28:54.519
<v Speaker 3>kind of lessens the amount of strict typing that you're doing.

494
00:28:54.880 --> 00:28:58.599
<v Speaker 3>You can often to hire types strictness levels in your

495
00:28:58.640 --> 00:29:02.279
<v Speaker 3>files to prevent so you can often to type strict

496
00:29:02.599 --> 00:29:06.680
<v Speaker 3>which will tell you if you're doing this unsafe calls

497
00:29:06.839 --> 00:29:09.200
<v Speaker 3>and it will say, oh, you're actually calling into a

498
00:29:09.279 --> 00:29:12.720
<v Speaker 3>method that doesn't have a type signature, so you know

499
00:29:12.880 --> 00:29:14.880
<v Speaker 3>there's something wrong here, so go and add a type

500
00:29:14.920 --> 00:29:17.680
<v Speaker 3>signature to this other method that you're calling to make

501
00:29:17.720 --> 00:29:21.000
<v Speaker 3>sure that this file has a stricter type checking. So

502
00:29:21.240 --> 00:29:23.839
<v Speaker 3>we didn't go that far in the depcode BIS. We

503
00:29:23.920 --> 00:29:27.319
<v Speaker 3>wanted to see how much we could get with simple typing.

504
00:29:27.839 --> 00:29:30.880
<v Speaker 3>So there were still a few argument errors or no

505
00:29:31.000 --> 00:29:34.920
<v Speaker 3>method errors that leaked in, but we're able to reduce

506
00:29:35.240 --> 00:29:37.359
<v Speaker 3>those kinds of errors as well. But that's not the

507
00:29:37.359 --> 00:29:40.759
<v Speaker 3>only thing we did. We also looked at if running

508
00:29:40.759 --> 00:29:44.359
<v Speaker 3>type checks on CI had any effect on the CI's

509
00:29:44.359 --> 00:29:48.640
<v Speaker 3>success right, So were there, like any false positives that

510
00:29:48.759 --> 00:29:53.240
<v Speaker 3>Sorbey was failing on that were breaking CI built or

511
00:29:53.440 --> 00:29:57.119
<v Speaker 3>vice versa. Were there any test failures that Sorbey wasn't

512
00:29:57.160 --> 00:30:00.680
<v Speaker 3>catching and we realized that they or they didn't have

513
00:30:00.720 --> 00:30:05.119
<v Speaker 3>an effect either way, So it wasn't causing superious superiors

514
00:30:05.240 --> 00:30:09.359
<v Speaker 3>failures on CI, nor was it really missing anything. So

515
00:30:09.440 --> 00:30:12.119
<v Speaker 3>there weren't really that many test failures that Sorbe also

516
00:30:12.160 --> 00:30:12.759
<v Speaker 3>didn't catch.

517
00:30:13.279 --> 00:30:15.519
<v Speaker 2>But we also talked to the team, so I think

518
00:30:15.559 --> 00:30:18.279
<v Speaker 2>that's one of the most interesting things we've done.

519
00:30:18.440 --> 00:30:21.599
<v Speaker 3>We talked to the team both before we started this

520
00:30:21.839 --> 00:30:25.440
<v Speaker 3>experiment individually and talked to them after we finished this

521
00:30:25.559 --> 00:30:29.400
<v Speaker 3>experiment to see so before we wanted to see how

522
00:30:29.480 --> 00:30:32.079
<v Speaker 3>much they knew about Sorbe, how they felt about Sorbey.

523
00:30:32.319 --> 00:30:36.359
<v Speaker 3>Were they enthusiastic or did they have questions about its

524
00:30:36.480 --> 00:30:40.000
<v Speaker 3>utility or not, So we compiled those and then after

525
00:30:40.039 --> 00:30:42.559
<v Speaker 3>we finished this experiment, we also asked them if they

526
00:30:42.559 --> 00:30:46.960
<v Speaker 3>were using survey time checking on their machines, if you know,

527
00:30:47.000 --> 00:30:50.319
<v Speaker 3>they were happy adding signatures to the code based or

528
00:30:50.400 --> 00:30:53.960
<v Speaker 3>if they had problems having to deal with fixing signatures

529
00:30:53.960 --> 00:30:57.240
<v Speaker 3>when they were factorings. So we were able to also

530
00:30:57.279 --> 00:31:01.119
<v Speaker 3>get a qualitative feedback on how the team and how

531
00:31:01.160 --> 00:31:05.240
<v Speaker 3>the developer happiness was impacted or not, and we actually

532
00:31:05.319 --> 00:31:08.039
<v Speaker 3>heard good things about that. So there was one person

533
00:31:08.079 --> 00:31:11.559
<v Speaker 3>on the team who really didn't like signatures. They found

534
00:31:11.559 --> 00:31:15.519
<v Speaker 3>it like really distracting. One of the things about Sorbet's

535
00:31:15.519 --> 00:31:20.200
<v Speaker 3>signatures is because Sorbet is not integrated with the language. Obviously,

536
00:31:20.480 --> 00:31:24.400
<v Speaker 3>Ruby as a language doesn't support types, so you need

537
00:31:24.440 --> 00:31:29.920
<v Speaker 3>to add a signature annotation on top of your method definitions,

538
00:31:30.200 --> 00:31:33.759
<v Speaker 3>and that signature annotation is also Ruby goat. So you

539
00:31:33.839 --> 00:31:36.839
<v Speaker 3>do like a sig block, So you say sig and

540
00:31:36.839 --> 00:31:39.240
<v Speaker 3>then you start a block, and then you say params,

541
00:31:39.279 --> 00:31:42.680
<v Speaker 3>and then you declare your parameters and their types, and

542
00:31:42.720 --> 00:31:45.079
<v Speaker 3>then you do a dot returns and then you declare

543
00:31:45.119 --> 00:31:47.119
<v Speaker 3>the type of your return and then you can do

544
00:31:47.200 --> 00:31:50.559
<v Speaker 3>more things in there as well. But obviously sometimes for

545
00:31:50.599 --> 00:31:54.160
<v Speaker 3>a two or three line method, your signature can end

546
00:31:54.240 --> 00:31:57.039
<v Speaker 3>up being five or six lines if it's doing something

547
00:31:57.079 --> 00:31:59.519
<v Speaker 3>like non trivial, or if your types have like some

548
00:31:59.680 --> 00:32:03.759
<v Speaker 3>gender sort something. So some people actually find that two

549
00:32:03.799 --> 00:32:08.160
<v Speaker 3>of their posts and sometimes distracting, so they say that

550
00:32:08.240 --> 00:32:11.119
<v Speaker 3>it makes it hard to actually see the code. They

551
00:32:11.160 --> 00:32:14.240
<v Speaker 3>end up seeing like all these signatures, but that person

552
00:32:14.319 --> 00:32:18.400
<v Speaker 3>on the team actually developed like a few villim configs

553
00:32:18.799 --> 00:32:22.440
<v Speaker 3>to de emphasize the signatures. So they basically turn the

554
00:32:22.480 --> 00:32:26.119
<v Speaker 3>opacity on the signatures so that they look like comments,

555
00:32:26.319 --> 00:32:29.119
<v Speaker 3>which they kind of are right like, because that's the

556
00:32:29.119 --> 00:32:32.920
<v Speaker 3>same thing with yard definitions. So when you add you know,

557
00:32:33.039 --> 00:32:35.680
<v Speaker 3>type annotations in yard comments, that's.

558
00:32:35.519 --> 00:32:38.599
<v Speaker 2>The same thing. And then someone at the company also

559
00:32:38.640 --> 00:32:42.759
<v Speaker 2>built a visual studio code extension to do the same thing.

560
00:32:43.119 --> 00:32:46.640
<v Speaker 3>I think it's called bisig, So it turns the opacity,

561
00:32:46.640 --> 00:32:50.039
<v Speaker 3>it parises the signature blocks, and then turns the opacity on.

562
00:32:50.359 --> 00:32:53.960
<v Speaker 3>And I've actually been using it and I'm also enjoying

563
00:32:54.000 --> 00:32:56.119
<v Speaker 3>it because I don't necessarily need the.

564
00:32:56.079 --> 00:32:58.160
<v Speaker 2>Signatures to be in front of me all the time.

565
00:32:58.920 --> 00:33:02.960
<v Speaker 3>But apart from that, we heard that developers actually liked

566
00:33:03.079 --> 00:33:07.359
<v Speaker 3>the safety guarantees that static typing gives them as they're

567
00:33:07.400 --> 00:33:11.000
<v Speaker 3>doing refactoring. For example, So for example, if they're removing

568
00:33:11.559 --> 00:33:14.200
<v Speaker 3>a class or a module from the CLUD based they're

569
00:33:14.359 --> 00:33:17.799
<v Speaker 3>almost guaranteed to know that when they run the standard

570
00:33:17.839 --> 00:33:20.200
<v Speaker 3>type checker that it will complain if there's like any

571
00:33:20.279 --> 00:33:25.359
<v Speaker 3>dangling usages of that class or module. So they really

572
00:33:25.559 --> 00:33:28.279
<v Speaker 3>liked those guarantees and they didn't really mind writing the

573
00:33:28.319 --> 00:33:31.880
<v Speaker 3>signatures in the first place. And it's a really easy

574
00:33:32.039 --> 00:33:35.839
<v Speaker 3>ramp on as well on the signature syntax. So we

575
00:33:36.039 --> 00:33:39.640
<v Speaker 3>actually heard good things from developers on working on the cloud.

576
00:33:39.480 --> 00:33:42.920
<v Speaker 5>Based so has used in sorbe made you guys write

577
00:33:43.200 --> 00:33:43.960
<v Speaker 5>better code?

578
00:33:44.200 --> 00:33:47.559
<v Speaker 3>Yes, that's also another one of our findings. We also

579
00:33:47.640 --> 00:33:51.400
<v Speaker 3>talked to three different teams that who were working in

580
00:33:51.599 --> 00:33:55.920
<v Speaker 3>core and they were one of the early adopters of

581
00:33:56.039 --> 00:33:58.599
<v Speaker 3>sorbet in the better parts of the Colde base. So

582
00:33:58.599 --> 00:34:01.720
<v Speaker 3>we have this componentization thing going on in our core,

583
00:34:02.000 --> 00:34:03.200
<v Speaker 3>in our monolith.

584
00:34:02.920 --> 00:34:06.759
<v Speaker 2>Because it's a huge cod base, otherwise it becomes mayhem.

585
00:34:06.799 --> 00:34:10.800
<v Speaker 3>So there's the components and some components worth your early

586
00:34:10.840 --> 00:34:15.400
<v Speaker 3>adopters of typing. So we did interviews with team members

587
00:34:15.400 --> 00:34:18.840
<v Speaker 3>from those teams as well to understand how they felt

588
00:34:18.920 --> 00:34:22.559
<v Speaker 3>about those early initiatives, and one of the things that

589
00:34:22.599 --> 00:34:26.559
<v Speaker 3>we ended up hearing over and over was that adopting

590
00:34:26.639 --> 00:34:31.239
<v Speaker 3>types led to better code design, which initially was interesting

591
00:34:31.280 --> 00:34:34.760
<v Speaker 3>for me, but that seems to be the biggest benefit

592
00:34:35.280 --> 00:34:39.880
<v Speaker 3>from adopting static or gradual typing rather than you know,

593
00:34:40.000 --> 00:34:41.119
<v Speaker 3>runtime type safety.

594
00:34:41.480 --> 00:34:42.519
<v Speaker 2>And so like my.

595
00:34:42.559 --> 00:34:46.360
<v Speaker 3>Opinion is a little bit swayed now because too often

596
00:34:46.480 --> 00:34:50.119
<v Speaker 3>when we're working on simple solutions, we reach out for

597
00:34:50.599 --> 00:34:54.519
<v Speaker 3>like these bags of values like arrays or or even

598
00:34:54.639 --> 00:34:56.960
<v Speaker 3>like most of the time hashes, right, So we just

599
00:34:57.079 --> 00:34:59.760
<v Speaker 3>like reach for a hash, and then we keep passing

600
00:34:59.840 --> 00:35:03.519
<v Speaker 3>those hashes around, But then it's never documented what the

601
00:35:03.599 --> 00:35:06.599
<v Speaker 3>keys are, like if let alone, if the keys are

602
00:35:06.639 --> 00:35:09.880
<v Speaker 3>symbols for strengths, Like, how many times did we assume

603
00:35:09.920 --> 00:35:13.239
<v Speaker 3>that we could access some hash using symbols?

604
00:35:13.360 --> 00:35:16.360
<v Speaker 2>It turns out to be that it was indexed by strengths.

605
00:35:16.440 --> 00:35:19.360
<v Speaker 3>Right, So as you're like, when your codebase is small,

606
00:35:19.400 --> 00:35:22.079
<v Speaker 3>that's fine, I'm not judging anyone who's doing that. But

607
00:35:22.159 --> 00:35:28.079
<v Speaker 3>as your codebase is growing, you need people two more easily.

608
00:35:27.639 --> 00:35:31.760
<v Speaker 2>Onboard onto your team. And if they're fixing something, and

609
00:35:31.800 --> 00:35:34.960
<v Speaker 2>if their focus is on let's say one method or

610
00:35:35.119 --> 00:35:39.480
<v Speaker 2>one file, you don't want them to go hunting around seeing, oh,

611
00:35:39.519 --> 00:35:40.719
<v Speaker 2>where's this hash.

612
00:35:40.480 --> 00:35:43.840
<v Speaker 3>Actually being coming from? Where was it created initially? What

613
00:35:43.960 --> 00:35:46.800
<v Speaker 3>are all the parameters that are in this hash? So

614
00:35:47.400 --> 00:35:51.599
<v Speaker 3>that's not like a very efficient way of working at

615
00:35:51.599 --> 00:35:55.000
<v Speaker 3>that scale. So at that scale, it's better to give

616
00:35:55.039 --> 00:35:58.159
<v Speaker 3>a name to that, to turn that into something like

617
00:35:58.199 --> 00:36:01.280
<v Speaker 3>a structure or like create class for it or something

618
00:36:01.800 --> 00:36:05.639
<v Speaker 3>to basically start using types. Right, once you turn something

619
00:36:05.679 --> 00:36:08.199
<v Speaker 3>that was a hash into a strup or a class

620
00:36:08.280 --> 00:36:10.480
<v Speaker 3>or a module, you give a name to it.

621
00:36:10.760 --> 00:36:13.199
<v Speaker 2>You give a type to it, so you start.

622
00:36:13.039 --> 00:36:17.599
<v Speaker 3>Using types, and those types actually convey more information than

623
00:36:18.039 --> 00:36:21.800
<v Speaker 3>passing around hashes would, so it leads to actually better

624
00:36:21.840 --> 00:36:25.159
<v Speaker 3>code design, and we've heard that over and over again from.

625
00:36:25.519 --> 00:36:27.000
<v Speaker 2>Various people within the company.

626
00:36:27.559 --> 00:36:31.800
<v Speaker 3>But it also leads to evergreen documentation as well. So

627
00:36:31.880 --> 00:36:33.960
<v Speaker 3>if you're looking at a method and it has a

628
00:36:33.960 --> 00:36:36.440
<v Speaker 3>signature on top of it, and it says these are

629
00:36:36.480 --> 00:36:39.119
<v Speaker 3>the parameters that it takes off these types, and it

630
00:36:39.119 --> 00:36:41.800
<v Speaker 3>returns this type, then you don't need to go and

631
00:36:41.840 --> 00:36:44.559
<v Speaker 3>look anywhere else. Basically, if you know what those other

632
00:36:44.599 --> 00:36:47.519
<v Speaker 3>types are as well, you don't need to go look

633
00:36:47.519 --> 00:36:51.119
<v Speaker 3>anywhere else to all the colors of this method or whatever.

634
00:36:51.599 --> 00:36:54.360
<v Speaker 3>It's just evergreen documentation. And the reason why it's ever

635
00:36:54.400 --> 00:36:58.119
<v Speaker 3>green is because if somebody changes the method signature, they

636
00:36:58.559 --> 00:37:00.679
<v Speaker 3>have to change the signals you're on top of the

637
00:37:00.719 --> 00:37:04.320
<v Speaker 3>method as well, otherwise you will have like the static

638
00:37:04.320 --> 00:37:07.000
<v Speaker 3>type checker breaking in CI, right, So it has to

639
00:37:07.039 --> 00:37:09.800
<v Speaker 3>be evergreen people need to keep it up to date,

640
00:37:10.079 --> 00:37:13.079
<v Speaker 3>and that makes it very easy to onboard new people

641
00:37:13.320 --> 00:37:15.519
<v Speaker 3>to your code base, or to your team, or to

642
00:37:15.559 --> 00:37:18.159
<v Speaker 3>your company as well. So we we heard from the

643
00:37:18.239 --> 00:37:22.280
<v Speaker 3>blopers that those were all great benefits of adopting types,

644
00:37:22.760 --> 00:37:26.039
<v Speaker 3>and like I said, we didn't adopt types across the

645
00:37:26.119 --> 00:37:30.119
<v Speaker 3>whole code base, but we're allowing people to adopt those

646
00:37:30.119 --> 00:37:34.000
<v Speaker 3>types gradually as much as they want. And our team

647
00:37:34.199 --> 00:37:38.760
<v Speaker 3>is also helping people within the company in their adoption process.

648
00:37:38.800 --> 00:37:42.239
<v Speaker 3>So sometimes we help them, we review their prs, sometimes

649
00:37:42.239 --> 00:37:45.599
<v Speaker 3>we actually pair with them to make that adoption easier,

650
00:37:46.039 --> 00:37:48.079
<v Speaker 3>or we just answer questions in a.

651
00:37:48.000 --> 00:37:53.079
<v Speaker 4>Slack channel when there's that I hate types, sure, spent

652
00:37:53.199 --> 00:37:55.679
<v Speaker 4>years try to get away from them. The only reason

653
00:37:55.760 --> 00:37:57.960
<v Speaker 4>I still program in ruviews because it just doesn't have

654
00:37:58.400 --> 00:38:01.079
<v Speaker 4>That's the kind of is why I like it. It's

655
00:38:01.119 --> 00:38:06.679
<v Speaker 4>there's freedom from types. So my question is, what's what's

656
00:38:06.800 --> 00:38:11.800
<v Speaker 4>wrong with Ruby? What's going with Ruby? Because this is

657
00:38:11.880 --> 00:38:16.360
<v Speaker 4>obviously not just a Shopify project. This is something that

658
00:38:16.440 --> 00:38:19.559
<v Speaker 4>Stripe also looking at. So there must be some kind

659
00:38:19.599 --> 00:38:23.519
<v Speaker 4>of common problem that led you both to say, we

660
00:38:23.559 --> 00:38:27.119
<v Speaker 4>can improve our product, we can improve our developer experience,

661
00:38:27.239 --> 00:38:30.119
<v Speaker 4>we can find problems, sooner we can have this kind

662
00:38:30.199 --> 00:38:34.119
<v Speaker 4>of really kind of pick up on productivity by introducing

663
00:38:34.159 --> 00:38:38.519
<v Speaker 4>this system on top of Ruby. And it's a pretty

664
00:38:38.519 --> 00:38:41.320
<v Speaker 4>clean system. There's there's a link to a little what

665
00:38:41.360 --> 00:38:44.119
<v Speaker 4>do you call it, a sandbox, a playground where you

666
00:38:44.159 --> 00:38:46.079
<v Speaker 4>can try it out. And what I really like about

667
00:38:46.119 --> 00:38:48.719
<v Speaker 4>it is you said, is that you don't have to

668
00:38:48.760 --> 00:38:52.119
<v Speaker 4>go through your whole code base and start typing in

669
00:38:52.159 --> 00:38:56.119
<v Speaker 4>types for everything. If you've got something of mistake that

670
00:38:56.159 --> 00:38:59.000
<v Speaker 4>you keep making in a project, then you can just

671
00:38:59.119 --> 00:39:02.760
<v Speaker 4>kind of drop the seeing on that problem, class that

672
00:39:02.880 --> 00:39:05.800
<v Speaker 4>problem method, and then no one will ever have an

673
00:39:05.880 --> 00:39:09.760
<v Speaker 4>excuse for breaking it again. So it's a real it's

674
00:39:09.760 --> 00:39:12.920
<v Speaker 4>a real hammer to kind of drop on that. But

675
00:39:13.320 --> 00:39:16.280
<v Speaker 4>what's your what's your opinion? I know you talked a

676
00:39:16.280 --> 00:39:20.360
<v Speaker 4>lot about the developers and how they feel about introducing

677
00:39:20.440 --> 00:39:23.079
<v Speaker 4>typing and what they got from it. This is something

678
00:39:23.159 --> 00:39:27.159
<v Speaker 4>you must feel very passionately about. Where do you stand

679
00:39:27.199 --> 00:39:28.239
<v Speaker 4>on Ruvian types?

680
00:39:28.400 --> 00:39:32.480
<v Speaker 3>Okay, so personally, just before I joined Shopify, I was

681
00:39:32.519 --> 00:39:36.760
<v Speaker 3>working on code basis that were built by Typescript, and

682
00:39:36.840 --> 00:39:40.519
<v Speaker 3>actually Typescript was I think there is something wrong with me,

683
00:39:40.760 --> 00:39:43.400
<v Speaker 3>and I'll come to that. So Typescript was I was

684
00:39:43.480 --> 00:39:46.840
<v Speaker 3>at the time working at a web agency, but I

685
00:39:46.920 --> 00:39:49.360
<v Speaker 3>was on the team that were doing like cutting edge

686
00:39:49.639 --> 00:39:52.199
<v Speaker 3>two weeks prints that were like trying to see if

687
00:39:53.199 --> 00:39:56.199
<v Speaker 3>we could make certain things work, and I was we

688
00:39:56.199 --> 00:39:59.920
<v Speaker 3>were mostly working on JavaScript, and I consciously chose to

689
00:40:00.079 --> 00:40:02.119
<v Speaker 3>tried Typescript to see.

690
00:40:01.920 --> 00:40:02.679
<v Speaker 2>How it would work.

691
00:40:02.800 --> 00:40:06.599
<v Speaker 3>And I Typescript coupled with visual Studio code was a

692
00:40:06.719 --> 00:40:09.679
<v Speaker 3>joy to use, and I started loving it for all

693
00:40:09.760 --> 00:40:13.400
<v Speaker 3>the code completion and all the type things and you

694
00:40:13.599 --> 00:40:16.360
<v Speaker 3>don't look at the documentation and a lot anyway, Like

695
00:40:16.400 --> 00:40:19.800
<v Speaker 3>I was really enjoying Typescript before I joined Shopify, and

696
00:40:19.920 --> 00:40:23.480
<v Speaker 3>I had already heard about Sorbet, and like Sorbe got

697
00:40:23.480 --> 00:40:27.360
<v Speaker 3>me similarly excited because it has it still has the

698
00:40:27.440 --> 00:40:31.360
<v Speaker 3>promise of doing the same thing that Typescript did for JavaScript,

699
00:40:32.440 --> 00:40:36.719
<v Speaker 3>which was not to destroy the language as a language,

700
00:40:37.039 --> 00:40:40.079
<v Speaker 3>but to add features on top of it that people

701
00:40:40.199 --> 00:40:45.840
<v Speaker 3>could opt into if they wanted or needed more strict typing.

702
00:40:46.000 --> 00:40:47.480
<v Speaker 2>And it's again this.

703
00:40:47.519 --> 00:40:51.639
<v Speaker 3>Whole thing because typescript is one hundred percent JavaScript plus

704
00:40:51.800 --> 00:40:55.079
<v Speaker 3>some other things. The difference with typescript is it compiles

705
00:40:55.119 --> 00:40:58.280
<v Speaker 3>into JavaScript, so it does not type checking at run time.

706
00:40:58.599 --> 00:41:03.920
<v Speaker 3>Whereas with sorbe, it's built inside of Ruby, so all

707
00:41:03.920 --> 00:41:08.320
<v Speaker 3>the sorbet annotations and everything are also Ruby constructs, so

708
00:41:08.480 --> 00:41:12.800
<v Speaker 3>those Ruby constructs can also do type checking for type assertions.

709
00:41:12.280 --> 00:41:12.920
<v Speaker 2>At run time.

710
00:41:13.360 --> 00:41:17.159
<v Speaker 3>So that's the kind of difference. But looking back, I

711
00:41:17.320 --> 00:41:21.840
<v Speaker 3>kind of see myself having almost exclusively worked in code

712
00:41:21.840 --> 00:41:27.039
<v Speaker 3>bases that had some types somewhere. So I'd worked with

713
00:41:27.480 --> 00:41:30.800
<v Speaker 3>DELFI for a while, and then C plus plus D sharp,

714
00:41:31.280 --> 00:41:34.679
<v Speaker 3>and then, like I said, typescript. But before Typescript, we

715
00:41:34.679 --> 00:41:37.880
<v Speaker 3>were working on a PHP code base that was using

716
00:41:38.440 --> 00:41:41.960
<v Speaker 3>type pins. So that was a five point three code

717
00:41:42.000 --> 00:41:44.840
<v Speaker 3>base if I remember correctly, which had type ins, and

718
00:41:44.920 --> 00:41:48.559
<v Speaker 3>we were really relying on type ins. So the project

719
00:41:48.559 --> 00:41:50.920
<v Speaker 3>that started before I joined and it was built like that,

720
00:41:51.559 --> 00:41:55.559
<v Speaker 3>and I ended up feeling like that was a good

721
00:41:55.599 --> 00:41:58.599
<v Speaker 3>way to work because it was preventing us from shooting

722
00:41:58.679 --> 00:42:01.639
<v Speaker 3>ourselves in the foot. Even though that was still doing

723
00:42:01.760 --> 00:42:05.559
<v Speaker 3>type checking at runtime, it was still failing fast, right,

724
00:42:05.639 --> 00:42:09.559
<v Speaker 3>So that's like one of the principles that we software

725
00:42:09.559 --> 00:42:13.000
<v Speaker 3>developers use a lot, this ability to fail fast.

726
00:42:13.400 --> 00:42:17.079
<v Speaker 2>So static typechecking really gives you that. So it allows you.

727
00:42:17.079 --> 00:42:20.360
<v Speaker 3>To fail fast either in so base case, you just

728
00:42:20.440 --> 00:42:22.519
<v Speaker 3>run the static type checker and within a couple of

729
00:42:22.559 --> 00:42:25.599
<v Speaker 3>seconds it shows you if there's like some assumptions in

730
00:42:25.639 --> 00:42:29.360
<v Speaker 3>your code based but don't check out. And that's way

731
00:42:29.400 --> 00:42:32.679
<v Speaker 3>better than waiting on the CI for.

732
00:42:32.599 --> 00:42:35.239
<v Speaker 2>A couple of minutes. You can just run this tool

733
00:42:35.480 --> 00:42:37.360
<v Speaker 2>constantly on your machine right right.

734
00:42:37.400 --> 00:42:40.519
<v Speaker 4>So this is where it kind of seems to differ

735
00:42:41.280 --> 00:42:44.920
<v Speaker 4>in terms of develop a tool to running a test suite.

736
00:42:44.960 --> 00:42:49.239
<v Speaker 4>This is this is not really the same as running

737
00:42:49.280 --> 00:42:52.679
<v Speaker 4>a series of tests. This is something which you can

738
00:42:52.840 --> 00:42:55.679
<v Speaker 4>use kind of almost kind of running continuing the black

739
00:42:55.760 --> 00:42:57.960
<v Speaker 4>in the background in official studio code.

740
00:42:58.000 --> 00:42:58.840
<v Speaker 1>Is that how you use it?

741
00:42:58.920 --> 00:43:03.159
<v Speaker 3>Yes? So, so ARBA actually has an LSP mode. So

742
00:43:03.239 --> 00:43:06.519
<v Speaker 3>the Sorbe binary, that's the C plus plus static checker binary.

743
00:43:06.840 --> 00:43:10.440
<v Speaker 3>If you download the Sorbe static gem or the Sorbae

744
00:43:10.480 --> 00:43:14.440
<v Speaker 3>JAM which pulls it in, you can actually do SIBTC

745
00:43:15.280 --> 00:43:18.760
<v Speaker 3>DASH dash LSB which turns on the LSP mode. So

746
00:43:18.960 --> 00:43:23.039
<v Speaker 3>LSP stands for the Language Server Protocol. I think I'm

747
00:43:23.079 --> 00:43:27.000
<v Speaker 3>not so sure about the acronym, but it's developed by

748
00:43:27.440 --> 00:43:31.239
<v Speaker 3>people at Microsoft. As they were developing visual studio code,

749
00:43:31.400 --> 00:43:35.280
<v Speaker 3>they developed that specification. So it allows different languages to

750
00:43:35.360 --> 00:43:38.960
<v Speaker 3>integrate with different editors, and LSP is the language that

751
00:43:39.000 --> 00:43:42.599
<v Speaker 3>sits in between, so Sorbe has this LSB server mode,

752
00:43:42.960 --> 00:43:47.480
<v Speaker 3>and they're also working on an official Visual Studio Code

753
00:43:47.679 --> 00:43:50.840
<v Speaker 3>extension that you can install that would bring all that

754
00:43:50.960 --> 00:43:54.239
<v Speaker 3>richness into Visual Studio Code. And I'm one of the

755
00:43:54.280 --> 00:43:58.440
<v Speaker 3>early testers of that inside of Shopify, and I've been

756
00:43:58.519 --> 00:44:03.320
<v Speaker 3>using it for a while now, and it's actually integrated into.

757
00:44:03.159 --> 00:44:04.840
<v Speaker 2>Your editors, so it gives you.

758
00:44:05.400 --> 00:44:09.000
<v Speaker 3>The best auto complete that you can ever find, way

759
00:44:09.039 --> 00:44:12.519
<v Speaker 3>better than all the other editors can do. But it

760
00:44:12.639 --> 00:44:17.280
<v Speaker 3>also shows you all the errors within your editor. That's

761
00:44:17.280 --> 00:44:19.880
<v Speaker 3>a great way to work because you get instant feedback

762
00:44:19.880 --> 00:44:22.480
<v Speaker 3>on your code changes. I don't want to give too

763
00:44:22.519 --> 00:44:25.480
<v Speaker 3>long an answer, but just to address the second part

764
00:44:25.519 --> 00:44:27.599
<v Speaker 3>of your question is like when would.

765
00:44:27.440 --> 00:44:30.079
<v Speaker 2>You reach for a tool like this? So scale is

766
00:44:30.199 --> 00:44:30.800
<v Speaker 2>very important.

767
00:44:30.800 --> 00:44:34.440
<v Speaker 3>So when you have, like in our code base, tens

768
00:44:34.440 --> 00:44:38.719
<v Speaker 3>of different components and thirty thousand different files, then it

769
00:44:38.840 --> 00:44:43.480
<v Speaker 3>becomes really important to have better contracts between all those

770
00:44:43.519 --> 00:44:47.639
<v Speaker 3>different moving parts, and what better contract than types?

771
00:44:48.000 --> 00:44:51.039
<v Speaker 2>And we've actually realized that types really work.

772
00:44:50.920 --> 00:44:53.719
<v Speaker 3>Well for that, and I think that was the initial

773
00:44:54.079 --> 00:44:57.119
<v Speaker 3>impathus for why Stripe started working on this as well,

774
00:44:57.519 --> 00:45:00.400
<v Speaker 3>and I'm not saying that all Ruby codes should be

775
00:45:00.480 --> 00:45:03.480
<v Speaker 3>typed or that everyone should reach for typing as soon

776
00:45:03.480 --> 00:45:07.320
<v Speaker 3>as possible. Obviously it's a matter of needs and scale,

777
00:45:07.679 --> 00:45:10.519
<v Speaker 3>but I also feel like that it's the right tools

778
00:45:10.559 --> 00:45:13.280
<v Speaker 3>for the scale that Shopify is in right now, and

779
00:45:13.400 --> 00:45:17.159
<v Speaker 3>the teams that are really relying on types are getting

780
00:45:17.480 --> 00:45:19.599
<v Speaker 3>a really good return for their investment.

781
00:45:19.920 --> 00:45:25.239
<v Speaker 4>So obviously we're just coming out of the COVID nineteen time,

782
00:45:25.599 --> 00:45:31.280
<v Speaker 4>and I understand that Shopify has changed their working practices.

783
00:45:31.360 --> 00:45:35.039
<v Speaker 4>What's it been like at Shopify over the last few months.

784
00:45:35.199 --> 00:45:39.559
<v Speaker 3>Actually, Shopify's response to this whole pandemic has been really

785
00:45:39.599 --> 00:45:46.960
<v Speaker 3>impressive because senior executives at Shopify were aware of where.

786
00:45:46.760 --> 00:45:50.000
<v Speaker 2>The whole pandemic situation was going really early.

787
00:45:49.800 --> 00:45:54.199
<v Speaker 3>On, and they were really quick in taking measures to

788
00:45:54.320 --> 00:45:59.119
<v Speaker 3>ensure that people working for Shopify are sick. So that

789
00:45:59.239 --> 00:46:03.599
<v Speaker 3>was like a very early on so they basically closed

790
00:46:03.639 --> 00:46:09.000
<v Speaker 3>all the offices before like most countries were aware of

791
00:46:09.039 --> 00:46:12.280
<v Speaker 3>what even was going on. So for me personally, I

792
00:46:12.320 --> 00:46:17.360
<v Speaker 3>can't quite talk for those office closures because I've always

793
00:46:17.400 --> 00:46:20.480
<v Speaker 3>been working remotely for Shopify, so I live in Cyprus.

794
00:46:20.559 --> 00:46:24.440
<v Speaker 3>I worked for Shopifi remotely from here, and our whole

795
00:46:24.599 --> 00:46:29.000
<v Speaker 3>Ruby and Rail's infrastructure team has been distributed has been

796
00:46:29.000 --> 00:46:31.599
<v Speaker 3>a distributed team as well, So we had a couple

797
00:46:31.679 --> 00:46:35.760
<v Speaker 3>of people working in the offices in Ottawa, someone in Montreal,

798
00:46:36.360 --> 00:46:40.400
<v Speaker 3>one person in Poland, one person in France, UK, Cyprus.

799
00:46:39.880 --> 00:46:40.719
<v Speaker 2>So all over the world.

800
00:46:41.239 --> 00:46:44.960
<v Speaker 3>So our whole team, dynamics and everything didn't obviously change

801
00:46:45.000 --> 00:46:48.880
<v Speaker 3>that much. But obviously, as everyone's feeling it, starting to

802
00:46:49.119 --> 00:46:53.320
<v Speaker 3>work remotely during the pandemic was a huge burden to

803
00:46:53.440 --> 00:46:56.719
<v Speaker 3>a lot of people because they weren't ready to work

804
00:46:56.840 --> 00:46:57.159
<v Speaker 3>like that.

805
00:46:57.599 --> 00:47:00.280
<v Speaker 2>Also, it wasn't a normal.

806
00:47:00.239 --> 00:47:04.679
<v Speaker 3>Working remotely set up either, right because schools are also closed,

807
00:47:04.840 --> 00:47:07.519
<v Speaker 3>everything else is closed. You're trapped in this house and

808
00:47:07.559 --> 00:47:10.199
<v Speaker 3>you can't go out, and or you're also trying to

809
00:47:10.239 --> 00:47:13.199
<v Speaker 3>do work, so it's not necessarily the normal working from

810
00:47:13.639 --> 00:47:18.800
<v Speaker 3>home situation. But like you said, our senior executives looked

811
00:47:18.800 --> 00:47:22.880
<v Speaker 3>at the situation going forward. So first of all, Shopify

812
00:47:23.159 --> 00:47:27.320
<v Speaker 3>isn't reopening any of their offices before the end of

813
00:47:27.360 --> 00:47:31.599
<v Speaker 3>this year, whatever happens, because the outlook isn't that great.

814
00:47:31.880 --> 00:47:35.199
<v Speaker 3>It doesn't look like this pandemic is over anytime soon,

815
00:47:35.559 --> 00:47:38.400
<v Speaker 3>so there's no point in like opening offices and making

816
00:47:38.679 --> 00:47:41.679
<v Speaker 3>people feel safe and going there just to then like

817
00:47:41.719 --> 00:47:45.119
<v Speaker 3>close them again. But also the company has, based on

818
00:47:45.199 --> 00:47:48.000
<v Speaker 3>this experience that we've had for the last couple of months,

819
00:47:48.079 --> 00:47:49.119
<v Speaker 3>the company has also.

820
00:47:48.960 --> 00:47:51.920
<v Speaker 2>Decided to be digital by default.

821
00:47:51.719 --> 00:47:56.760
<v Speaker 3>Which doesn't it is digital already, but it wasn't digital

822
00:47:56.960 --> 00:48:00.159
<v Speaker 3>by default, right, So that's that's the extension. So what

823
00:48:00.280 --> 00:48:03.000
<v Speaker 3>used to be the case is, for example, if there

824
00:48:03.039 --> 00:48:05.559
<v Speaker 3>were people in the office and if there was a meeting,

825
00:48:05.920 --> 00:48:07.719
<v Speaker 3>so if there were like ten people in the office

826
00:48:07.760 --> 00:48:10.719
<v Speaker 3>and three people joining remotely, then the ten people in

827
00:48:10.760 --> 00:48:12.920
<v Speaker 3>the office would be huddled up in a meeting room

828
00:48:13.280 --> 00:48:15.639
<v Speaker 3>and then the three people would you know, join in

829
00:48:15.800 --> 00:48:19.679
<v Speaker 3>on a call remotely. But that isn't necessarily the best

830
00:48:19.719 --> 00:48:22.559
<v Speaker 3>way of working because the people who are joining that

831
00:48:22.599 --> 00:48:26.599
<v Speaker 3>call remotely don't get the same experience that those ten

832
00:48:26.639 --> 00:48:30.119
<v Speaker 3>people in the room get. So the digital by default

833
00:48:30.519 --> 00:48:33.320
<v Speaker 3>kind of changes that. And they say, we're not closing

834
00:48:33.320 --> 00:48:36.400
<v Speaker 3>our offices, but they're saying the offices won't be the

835
00:48:36.440 --> 00:48:40.800
<v Speaker 3>same offices, so they'll be revamped to accommodate this new

836
00:48:40.840 --> 00:48:45.679
<v Speaker 3>digital by default future. But basically then in that future

837
00:48:46.239 --> 00:48:49.199
<v Speaker 3>we'll get to experience it, obviously, but in that future,

838
00:48:49.840 --> 00:48:53.360
<v Speaker 3>those ten people will also individually join that same meeting

839
00:48:53.400 --> 00:48:57.239
<v Speaker 3>as well, so everyone will be digital in the meeting

840
00:48:57.320 --> 00:49:00.760
<v Speaker 3>by default, rather than having, you know, ten people collocated

841
00:49:00.800 --> 00:49:04.800
<v Speaker 3>somewhere and then three people remote. So that's the biggest difference,

842
00:49:04.880 --> 00:49:09.559
<v Speaker 3>because the decision there was very simple, because you either

843
00:49:10.000 --> 00:49:14.119
<v Speaker 3>either do fully collocated or you do fully remote. In

844
00:49:14.199 --> 00:49:18.719
<v Speaker 3>between is this hybrid thing that doesn't work that well.

845
00:49:18.519 --> 00:49:19.360
<v Speaker 2>For either party.

846
00:49:19.440 --> 00:49:21.280
<v Speaker 3>Right, Like, you have a few people that are co

847
00:49:21.400 --> 00:49:25.440
<v Speaker 3>located in an office people that are remote, but then

848
00:49:26.000 --> 00:49:30.119
<v Speaker 3>you need to have all your communication digital to ensure

849
00:49:30.159 --> 00:49:32.480
<v Speaker 3>that the remote people have the same context as the

850
00:49:32.519 --> 00:49:35.920
<v Speaker 3>people who are co located. But people who are collocated,

851
00:49:36.000 --> 00:49:38.360
<v Speaker 3>they if they have like chats that they have in

852
00:49:38.440 --> 00:49:41.159
<v Speaker 3>between and they don't report them back, then you have

853
00:49:41.239 --> 00:49:43.760
<v Speaker 3>information and symmetry, et cetera, et cetera. That's the worst

854
00:49:43.760 --> 00:49:47.840
<v Speaker 3>way to work. I've also worked remotely, being the only

855
00:49:47.920 --> 00:49:50.440
<v Speaker 3>remote person on a team that was co located before

856
00:49:51.320 --> 00:49:55.039
<v Speaker 3>not at Shopify, and that wasn't a horrible experience because

857
00:49:55.320 --> 00:49:58.559
<v Speaker 3>my team was very understanding of my situation. But it's

858
00:49:58.559 --> 00:50:00.760
<v Speaker 3>still not the best way to work when all your

859
00:50:00.800 --> 00:50:03.840
<v Speaker 3>teammates are all in the same office and you're the

860
00:50:03.840 --> 00:50:07.639
<v Speaker 3>only one remote. So the future for Shopify is digital

861
00:50:07.840 --> 00:50:11.440
<v Speaker 3>by default for everyone. So even if you're in the office,

862
00:50:11.639 --> 00:50:15.239
<v Speaker 3>you're still communicating with everyone digitally. That will be the

863
00:50:15.280 --> 00:50:18.880
<v Speaker 3>primary mode of communication and most of our work will

864
00:50:18.960 --> 00:50:21.039
<v Speaker 3>not be done from offices anyway.

865
00:50:21.159 --> 00:50:25.960
<v Speaker 1>Sweet, then let's roll on into picks then, Dave, would

866
00:50:25.960 --> 00:50:27.599
<v Speaker 1>you start us off with picks this week?

867
00:50:27.719 --> 00:50:28.000
<v Speaker 2>Yeah?

868
00:50:28.039 --> 00:50:28.440
<v Speaker 1>Real quick.

869
00:50:28.519 --> 00:50:30.719
<v Speaker 5>If people want to follow some of the things that

870
00:50:30.760 --> 00:50:33.280
<v Speaker 5>you're doing online, where should they go and look all.

871
00:50:33.159 --> 00:50:35.199
<v Speaker 2>The engineering work that we're doing.

872
00:50:35.639 --> 00:50:39.519
<v Speaker 3>We have a Shopify engineering blog that mostly gets a

873
00:50:39.559 --> 00:50:42.280
<v Speaker 3>new blog post once a week, I think, or the

874
00:50:42.280 --> 00:50:45.519
<v Speaker 3>Shopify Engineering Twitter account they can follow.

875
00:50:46.159 --> 00:50:47.880
<v Speaker 2>And I should also.

876
00:50:47.679 --> 00:50:51.920
<v Speaker 3>Say that like, Shopify is still hiring and we've been hiring.

877
00:50:52.079 --> 00:50:55.920
<v Speaker 3>Actually we ramped up are hiring across the pandemic as well.

878
00:50:56.159 --> 00:50:59.800
<v Speaker 3>So if anyone's interested in a position at Shopify. Also,

879
00:51:00.079 --> 00:51:03.320
<v Speaker 3>now that we're digital by default, we're more open to

880
00:51:03.400 --> 00:51:06.280
<v Speaker 3>remote people. They can go to selfify dot COM's last

881
00:51:06.280 --> 00:51:09.320
<v Speaker 3>Careers or our career stage on our website and they

882
00:51:09.360 --> 00:51:10.960
<v Speaker 3>can be a part of the team so that they

883
00:51:10.960 --> 00:51:12.800
<v Speaker 3>can follow the developments from the inside.

884
00:51:12.880 --> 00:51:13.239
<v Speaker 1>Awesome.

885
00:51:13.559 --> 00:51:15.280
<v Speaker 5>Yeah, and I'll go ahead and kick us off with

886
00:51:15.360 --> 00:51:20.800
<v Speaker 5>some picks. So my first pick is the whyse then clients.

887
00:51:21.119 --> 00:51:23.840
<v Speaker 5>So I've been getting my kids ready for the digital

888
00:51:23.960 --> 00:51:27.239
<v Speaker 5>learning and the upcoming school year, and instead of giving

889
00:51:27.280 --> 00:51:31.320
<v Speaker 5>them each a six hundred dollars computer or something, I

890
00:51:31.480 --> 00:51:34.559
<v Speaker 5>have deployed a thin client set up at home, which

891
00:51:34.599 --> 00:51:38.960
<v Speaker 5>is probably way overkill for most home networks and stuff,

892
00:51:38.960 --> 00:51:42.159
<v Speaker 5>but I would much rather replace a one hundred dollars

893
00:51:42.199 --> 00:51:45.880
<v Speaker 5>all in one thin client than a six hundred dollars

894
00:51:45.880 --> 00:51:49.920
<v Speaker 5>computer and modern. So that's my first pick, and second

895
00:51:49.960 --> 00:51:53.760
<v Speaker 5>pick is I on this call. Actually, I got the

896
00:51:53.800 --> 00:51:59.039
<v Speaker 5>announcement that I got the Apple TDK, so the Developer

897
00:51:59.159 --> 00:52:02.960
<v Speaker 5>Transition Kit with the ARM based processor. So I will

898
00:52:03.000 --> 00:52:07.480
<v Speaker 5>be releasing some drinking Ruby videos on developing on ARM

899
00:52:07.519 --> 00:52:08.760
<v Speaker 5>based processors soon.

900
00:52:09.119 --> 00:52:09.960
<v Speaker 4>That's pretty cool.

901
00:52:10.159 --> 00:52:12.559
<v Speaker 1>Nice. I'll be pointing some people that I know are

902
00:52:12.599 --> 00:52:13.880
<v Speaker 1>super interested in that to you.

903
00:52:14.000 --> 00:52:17.480
<v Speaker 3>Actually, yeah, we're really interested in that on my team

904
00:52:17.480 --> 00:52:20.840
<v Speaker 3>as well, because the people are doing for Ruby and

905
00:52:21.000 --> 00:52:23.440
<v Speaker 3>MRI work, I want to make sure that both of

906
00:52:23.480 --> 00:52:25.840
<v Speaker 3>those platforms run really well on on your arm jet.

907
00:52:26.519 --> 00:52:28.679
<v Speaker 1>Look, what do you have for us this week? Well?

908
00:52:28.719 --> 00:52:33.679
<v Speaker 4>To tie in with bu Hook's talk at Rail's twenty

909
00:52:33.719 --> 00:52:37.159
<v Speaker 4>twenty Couch Edition which talk is called peeling away the

910
00:52:37.280 --> 00:52:40.840
<v Speaker 4>layers of a network stack. It's a good talk. My

911
00:52:41.079 --> 00:52:48.760
<v Speaker 4>pick is the evergreen tcp ip Illustrated, a big book

912
00:52:49.039 --> 00:52:54.199
<v Speaker 4>of how networking works. If you want to learn how

913
00:52:54.239 --> 00:52:59.239
<v Speaker 4>to perform hilarious office pranks like art poisoning, if you

914
00:52:59.280 --> 00:53:01.880
<v Speaker 4>want to get kind of get to get to grits

915
00:53:01.920 --> 00:53:04.639
<v Speaker 4>with networking, this is a great book to really trid

916
00:53:04.639 --> 00:53:08.199
<v Speaker 4>into detail. So there we go. Tcpip Illustrated recommended to

917
00:53:08.239 --> 00:53:12.360
<v Speaker 4>me many years ago by a man from Florida, and

918
00:53:12.559 --> 00:53:13.480
<v Speaker 4>boy was he right.

919
00:53:13.519 --> 00:53:15.840
<v Speaker 1>It is a great read. Awesome. So I have a

920
00:53:15.840 --> 00:53:18.119
<v Speaker 1>couple of picks for this week. One is actually something

921
00:53:18.159 --> 00:53:20.760
<v Speaker 1>that's been out for quite some time now, but I

922
00:53:20.840 --> 00:53:25.000
<v Speaker 1>really wasn't introduced to it until very recently. It's called ASDF.

923
00:53:25.679 --> 00:53:30.119
<v Speaker 1>It's just if you're familiar with RBM or RVM or

924
00:53:30.519 --> 00:53:34.760
<v Speaker 1>any other version manager or any language. ASDF is more

925
00:53:34.840 --> 00:53:38.079
<v Speaker 1>or less a similar thing, except that it's across It's

926
00:53:38.119 --> 00:53:40.599
<v Speaker 1>really just cross language, cross tool kind of thing, right,

927
00:53:40.639 --> 00:53:45.000
<v Speaker 1>like they have plugins for things like postgrass and my sequel.

928
00:53:45.679 --> 00:53:48.599
<v Speaker 1>I don't really see a lot of value with postgrass personally,

929
00:53:48.719 --> 00:53:51.360
<v Speaker 1>but I did see I was trying this out on

930
00:53:51.400 --> 00:53:54.559
<v Speaker 1>a project that have my sqel and switching between versions

931
00:53:54.679 --> 00:53:58.360
<v Speaker 1>is legit. So yeah, I mean basically with this. The

932
00:53:58.440 --> 00:54:01.719
<v Speaker 1>thing about this tool is it's really for making it

933
00:54:01.760 --> 00:54:04.119
<v Speaker 1>so that you can set up your development machine to

934
00:54:04.400 --> 00:54:09.320
<v Speaker 1>switch between versions of Python and Ruby and Node and

935
00:54:09.599 --> 00:54:12.519
<v Speaker 1>your database that you have, and you know, like a

936
00:54:12.519 --> 00:54:16.480
<v Speaker 1>whole bunch of different tools. And I mostly use Docker

937
00:54:16.599 --> 00:54:19.400
<v Speaker 1>these days, so this really isn't like a thing that

938
00:54:19.400 --> 00:54:21.079
<v Speaker 1>I'm going to use all the time. But I do

939
00:54:21.159 --> 00:54:24.119
<v Speaker 1>have a couple like outlying projects that are just fun

940
00:54:24.679 --> 00:54:26.920
<v Speaker 1>and so I explicitly I was introduced to this, I

941
00:54:26.960 --> 00:54:28.920
<v Speaker 1>was like, all right, I'm gonna try this out. It's legit.

942
00:54:29.079 --> 00:54:33.280
<v Speaker 1>So I don't know that I'm ready to completely give

943
00:54:33.360 --> 00:54:36.440
<v Speaker 1>up our VM for this yet, mostly because I do

944
00:54:36.519 --> 00:54:39.639
<v Speaker 1>almost all Ruby work, but it's definitely taken some mind

945
00:54:39.639 --> 00:54:41.599
<v Speaker 1>share up in my brain at this point, so it's

946
00:54:41.639 --> 00:54:43.920
<v Speaker 1>pretty cool. Definitely recommend checking that out.
