WEBVTT

1
00:00:06.679 --> 00:00:09.039
<v Speaker 1>Welcome to another episode of React Round Up. My name

2
00:00:09.080 --> 00:00:11.839
<v Speaker 1>is TJ. Bentol, and I'm flying solo here on the

3
00:00:11.839 --> 00:00:14.119
<v Speaker 1>panel today, but that is all right because I have

4
00:00:14.279 --> 00:00:16.640
<v Speaker 1>James Smith with me today. James, why don't you go

5
00:00:16.679 --> 00:00:19.480
<v Speaker 1>ahead and introduce yourself? Tell everybody a bit of why

6
00:00:19.480 --> 00:00:20.120
<v Speaker 1>you're famous.

7
00:00:20.960 --> 00:00:21.480
<v Speaker 2>Thanks DJ.

8
00:00:21.800 --> 00:00:25.079
<v Speaker 3>Yeah, I'm James Smith. I the CEO and co founder

9
00:00:25.120 --> 00:00:29.800
<v Speaker 3>of a company called Bugsnack and Bugsnack detect when software breaks.

10
00:00:30.120 --> 00:00:32.759
<v Speaker 3>But prior to running a company and being a founder,

11
00:00:33.240 --> 00:00:37.679
<v Speaker 3>I built software in the web or mobile applications in

12
00:00:37.759 --> 00:00:40.079
<v Speaker 3>various industries for quite a while. I like to think

13
00:00:40.119 --> 00:00:43.359
<v Speaker 3>of myself these days as a retired software engineer and just.

14
00:00:43.399 --> 00:00:46.840
<v Speaker 1>Enough to be dangerous awesome. So bug managing software. So

15
00:00:46.880 --> 00:00:48.840
<v Speaker 1>I'm going to start with like the like a softball,

16
00:00:48.840 --> 00:00:51.359
<v Speaker 1>an easy question, but like why do you why do

17
00:00:51.439 --> 00:00:54.079
<v Speaker 1>developers need bug managing software? Like why isn't it enough

18
00:00:54.119 --> 00:00:55.880
<v Speaker 1>to just throw it out there and rely on like

19
00:00:56.159 --> 00:00:58.479
<v Speaker 1>you know, user reports and QA and that sort of

20
00:00:58.520 --> 00:00:59.600
<v Speaker 1>stuff to find these bugs.

21
00:01:00.079 --> 00:01:02.960
<v Speaker 3>Were a surprising number of companies that we work with

22
00:01:03.399 --> 00:01:06.519
<v Speaker 3>still do that, and they're coming to us to rehabilitate.

23
00:01:06.920 --> 00:01:10.640
<v Speaker 3>But I think that modern software development has changed hugely.

24
00:01:10.719 --> 00:01:13.680
<v Speaker 3>I joke a lot about how you know, twenty five

25
00:01:13.840 --> 00:01:17.040
<v Speaker 3>thirty years ago, when you develop delivered software, you printed

26
00:01:17.079 --> 00:01:19.159
<v Speaker 3>it onto a CD or floppy discs and that software

27
00:01:19.280 --> 00:01:23.480
<v Speaker 3>was done. And these days most software is running in

28
00:01:23.519 --> 00:01:26.280
<v Speaker 3>an environment where it can be updated and fixed and patched.

29
00:01:26.719 --> 00:01:29.840
<v Speaker 3>And also I think that people adopted more principles like

30
00:01:29.879 --> 00:01:32.879
<v Speaker 3>agile and lean, where sometimes you're going to build something

31
00:01:32.879 --> 00:01:35.680
<v Speaker 3>that's not ready intentionally and you're going to say, look,

32
00:01:35.719 --> 00:01:37.920
<v Speaker 3>we're going to release this to customers early because we

33
00:01:37.959 --> 00:01:40.040
<v Speaker 3>don't even know if customers are going to like this yet.

34
00:01:40.560 --> 00:01:44.000
<v Speaker 3>And so the concept of keeping and working on something

35
00:01:44.120 --> 00:01:46.719
<v Speaker 3>after its shipped to the customers is now the default

36
00:01:46.760 --> 00:01:50.480
<v Speaker 3>in most companies. In most cases, so you can't have

37
00:01:50.599 --> 00:01:53.840
<v Speaker 3>this like perfect five month QA process, print it to

38
00:01:53.879 --> 00:01:56.799
<v Speaker 3>gold Master and CD and shipping out to Best Buy.

39
00:01:57.079 --> 00:01:57.879
<v Speaker 2>When it's done.

40
00:01:58.120 --> 00:02:01.000
<v Speaker 3>You now have this living, breathing piece of so I

41
00:02:01.040 --> 00:02:04.239
<v Speaker 3>think that's the main thing that's caused this evolution. I

42
00:02:04.280 --> 00:02:07.480
<v Speaker 3>think that most people have now taken to squishing down

43
00:02:07.519 --> 00:02:10.439
<v Speaker 3>that QA period and replacing it from both the left

44
00:02:10.439 --> 00:02:13.439
<v Speaker 3>hand side and the right hand side. Probably almost everyone

45
00:02:13.479 --> 00:02:16.280
<v Speaker 3>from the left hand side is adding in really nice

46
00:02:16.439 --> 00:02:21.319
<v Speaker 3>automated testing, unit testing, integration testing, linting, and things like that.

47
00:02:21.360 --> 00:02:23.719
<v Speaker 3>And from the right hand side, QA is getting pushed

48
00:02:23.719 --> 00:02:27.159
<v Speaker 3>down by production awareness and production monitoring, where things like

49
00:02:27.199 --> 00:02:29.400
<v Speaker 3>folks like error monitoring products are are key there.

50
00:02:29.639 --> 00:02:32.719
<v Speaker 1>Yeah, it's interesting stuff, and I think maybe the next

51
00:02:32.719 --> 00:02:34.879
<v Speaker 1>thing could you just paint me a picture of Like

52
00:02:34.960 --> 00:02:38.080
<v Speaker 1>when you talk about like bug managoring or being reporting software, like,

53
00:02:38.120 --> 00:02:39.159
<v Speaker 1>what does that actually look like?

54
00:02:39.159 --> 00:02:39.280
<v Speaker 2>Like?

55
00:02:39.400 --> 00:02:41.759
<v Speaker 1>So suppose I'm working at a big company, I've got

56
00:02:41.800 --> 00:02:44.360
<v Speaker 1>a giant React app. Maybe I've also got to React

57
00:02:44.439 --> 00:02:46.919
<v Speaker 1>like mobile app. What is my steps? Like, what is

58
00:02:46.919 --> 00:02:49.240
<v Speaker 1>my experience actually like? Like how do I install this?

59
00:02:49.479 --> 00:02:51.479
<v Speaker 1>And then what sort of thing am I looking at

60
00:02:51.560 --> 00:02:53.319
<v Speaker 1>like once the deployer sab out to production.

61
00:02:53.680 --> 00:02:55.520
<v Speaker 2>Yes, it depends on the type of software you're running.

62
00:02:55.560 --> 00:02:58.439
<v Speaker 3>But yeah, in a React application or a web app stack,

63
00:02:58.520 --> 00:03:02.280
<v Speaker 3>for example, you want to be able to monitor run

64
00:03:02.319 --> 00:03:06.120
<v Speaker 3>time errors and bugs that are affecting your your end users,

65
00:03:06.159 --> 00:03:09.039
<v Speaker 3>your customers out in the wild. And in order to

66
00:03:09.080 --> 00:03:11.319
<v Speaker 3>do that, the way that our product works is we

67
00:03:11.360 --> 00:03:14.919
<v Speaker 3>have SDKs or libraries that you install your package manager,

68
00:03:15.000 --> 00:03:17.879
<v Speaker 3>so actually our software runs as part of your code,

69
00:03:18.000 --> 00:03:20.520
<v Speaker 3>is linked in as part of your code, rather than

70
00:03:20.520 --> 00:03:22.599
<v Speaker 3>being something that ingestslog.

71
00:03:21.960 --> 00:03:23.120
<v Speaker 2>Files or anything like that.

72
00:03:23.280 --> 00:03:25.680
<v Speaker 3>And so yeah, you're writing and React at you can

73
00:03:25.759 --> 00:03:28.599
<v Speaker 3>just NPN or yarn install bugsnack. If you've got a

74
00:03:28.879 --> 00:03:31.960
<v Speaker 3>Rails API powering your back end, you added to your

75
00:03:32.080 --> 00:03:33.520
<v Speaker 3>gem file and do buddle install.

76
00:03:33.800 --> 00:03:35.520
<v Speaker 2>And the same is true of pretty much every single

77
00:03:35.560 --> 00:03:36.520
<v Speaker 2>platform that we run in.

78
00:03:36.759 --> 00:03:39.840
<v Speaker 3>So once you've installed that SDK, you set an apike

79
00:03:40.240 --> 00:03:43.639
<v Speaker 3>in code or configuration spending on the platform, and then

80
00:03:43.879 --> 00:03:47.039
<v Speaker 3>bugs basically sits in the background, taking up almost zero

81
00:03:47.199 --> 00:03:50.199
<v Speaker 3>resources until we detect a problem. As a curtain a

82
00:03:50.280 --> 00:03:53.759
<v Speaker 3>problem differs on each platform, and then React app for example,

83
00:03:54.280 --> 00:03:57.240
<v Speaker 3>we will detect any exception that bundles up to the

84
00:03:57.280 --> 00:04:00.840
<v Speaker 3>window error handler on the browser, we will detect any

85
00:04:01.000 --> 00:04:05.199
<v Speaker 3>on handled promise rejections, and then React specifically. We'll look

86
00:04:05.199 --> 00:04:08.520
<v Speaker 3>into React error boundaries as well. So you could use

87
00:04:08.520 --> 00:04:11.639
<v Speaker 3>any bugstag provided error boundary and wrap your parts of

88
00:04:11.719 --> 00:04:14.360
<v Speaker 3>your code base in a bugsnag wrapper and will then

89
00:04:14.400 --> 00:04:18.240
<v Speaker 3>automatically report them off to bugsnags dot com and send

90
00:04:18.240 --> 00:04:21.120
<v Speaker 3>diagnostics alongside with it. But the process is pretty similar

91
00:04:21.120 --> 00:04:24.240
<v Speaker 3>on every platform mobile, desktop, web browser, just with slight

92
00:04:24.279 --> 00:04:26.040
<v Speaker 3>differences of the types of the era that we catch.

93
00:04:26.160 --> 00:04:28.600
<v Speaker 1>Yeah, it's interesting. I know we were talking before that.

94
00:04:28.800 --> 00:04:31.360
<v Speaker 1>The last time I use some sort of air reporting

95
00:04:31.519 --> 00:04:34.600
<v Speaker 1>software was quite a few years ago, and I remember

96
00:04:34.639 --> 00:04:37.399
<v Speaker 1>the first time I did it, I was absolutely astonished

97
00:04:37.439 --> 00:04:40.480
<v Speaker 1>at what it was spitting out. Because you have this

98
00:04:40.639 --> 00:04:42.560
<v Speaker 1>like I think when you work on a big piece

99
00:04:42.600 --> 00:04:45.079
<v Speaker 1>of software, like you know there are some bugs out there, right,

100
00:04:45.120 --> 00:04:46.959
<v Speaker 1>like you've got some gear tickets that have been opened

101
00:04:47.000 --> 00:04:48.879
<v Speaker 1>for a while. You're like, yeah, yeah, yeah, we'll get

102
00:04:48.920 --> 00:04:50.439
<v Speaker 1>to that. That's sort of a hard problem to solve.

103
00:04:50.600 --> 00:04:52.879
<v Speaker 1>But I remember actually putting this stuff in and like

104
00:04:53.120 --> 00:04:56.839
<v Speaker 1>you get stuff that like you had absolutely no clue

105
00:04:57.399 --> 00:05:00.000
<v Speaker 1>what it meant. And I guess one thing. I'm curious

106
00:05:00.120 --> 00:05:02.399
<v Speaker 1>because actually my one problem with using is and this

107
00:05:02.519 --> 00:05:04.839
<v Speaker 1>was years ago when these things were probably a lot

108
00:05:04.920 --> 00:05:07.319
<v Speaker 1>less refined, but it got hard to like make sense

109
00:05:07.360 --> 00:05:10.120
<v Speaker 1>of all the ears because it almost became like there

110
00:05:10.240 --> 00:05:13.759
<v Speaker 1>was just this like a huge mess of airs. So

111
00:05:13.759 --> 00:05:15.560
<v Speaker 1>I'm curious like the sort of things you do. I

112
00:05:15.560 --> 00:05:19.399
<v Speaker 1>imagine you have like some sort of like aggregation algorithms

113
00:05:19.399 --> 00:05:21.040
<v Speaker 1>that tries to make sense of like well, okay, well

114
00:05:21.079 --> 00:05:23.000
<v Speaker 1>these bugs are all the same, or like do you

115
00:05:23.240 --> 00:05:25.519
<v Speaker 1>help try to help developers like get at like the

116
00:05:25.600 --> 00:05:27.920
<v Speaker 1>root cause like maybe this is like browser specific or

117
00:05:27.920 --> 00:05:28.600
<v Speaker 1>that sort of thing.

118
00:05:28.920 --> 00:05:32.519
<v Speaker 3>Yeah, it's funny when I remember as been chucking out

119
00:05:32.519 --> 00:05:35.560
<v Speaker 3>log files for ages, and a lot of the time

120
00:05:35.600 --> 00:05:37.680
<v Speaker 3>you don't think actively to look at log files and

121
00:05:37.720 --> 00:05:39.480
<v Speaker 3>you just go in there when you absolutely have to,

122
00:05:40.120 --> 00:05:42.959
<v Speaker 3>and they're generating gigabytes and gigabytes of data that maybe

123
00:05:42.959 --> 00:05:43.759
<v Speaker 3>you never look at.

124
00:05:44.079 --> 00:05:47.279
<v Speaker 2>And then there was this leap from reactive.

125
00:05:46.920 --> 00:05:49.560
<v Speaker 3>Error monitoring to productive aeroor monitoring, and there was really

126
00:05:49.560 --> 00:05:51.639
<v Speaker 3>early players in the space. There was a product called

127
00:05:51.639 --> 00:05:55.040
<v Speaker 3>hop toad, which rebranded to something else, which was super

128
00:05:55.079 --> 00:05:57.120
<v Speaker 3>early in the rail space, and people were like, wow,

129
00:05:57.160 --> 00:05:58.959
<v Speaker 3>this is really cool, but holy moly, do I have

130
00:05:59.000 --> 00:06:00.879
<v Speaker 3>a lot of stuff coming in. And I think the

131
00:06:01.000 --> 00:06:04.439
<v Speaker 3>leap that products like hotted initially made and then we've

132
00:06:04.639 --> 00:06:08.120
<v Speaker 3>kind of refined over the years is aggregation number one.

133
00:06:08.160 --> 00:06:11.160
<v Speaker 3>As you say, first off, can we say that, Look,

134
00:06:11.240 --> 00:06:14.680
<v Speaker 3>we've had ten thousand bugs, ten thousand exceptions or crashes,

135
00:06:15.000 --> 00:06:17.480
<v Speaker 3>but actually all of these ten thousand exceptions or crashes

136
00:06:17.480 --> 00:06:19.600
<v Speaker 3>came from the exact same bug, the underlying the same

137
00:06:19.639 --> 00:06:23.680
<v Speaker 3>line of code, and so at the most basic level.

138
00:06:23.680 --> 00:06:24.920
<v Speaker 2>We have these grouping algorithms.

139
00:06:24.959 --> 00:06:27.839
<v Speaker 3>We've born on grouping agorithms that look at the line

140
00:06:27.879 --> 00:06:31.120
<v Speaker 3>of code where the bug originated, and it differs depending

141
00:06:31.120 --> 00:06:34.399
<v Speaker 3>on the platform. We can be a lot more sophisticated

142
00:06:34.399 --> 00:06:36.639
<v Speaker 3>in some areas where we'll look at how similar the

143
00:06:36.680 --> 00:06:38.639
<v Speaker 3>code is, will take a snapshot of like seven lines

144
00:06:38.680 --> 00:06:40.519
<v Speaker 3>before and after where the crash happened and look at

145
00:06:40.720 --> 00:06:43.759
<v Speaker 3>code similarity heuristics, and in other platforms we keep it

146
00:06:43.839 --> 00:06:45.600
<v Speaker 3>very simple. We don't have to do that level of

147
00:06:45.600 --> 00:06:48.839
<v Speaker 3>complexity where we'll say this was this type of exception,

148
00:06:48.959 --> 00:06:53.920
<v Speaker 3>so runtime error on line fifty nine of user dot Java,

149
00:06:54.120 --> 00:06:55.959
<v Speaker 3>and that's enough for us to say with pretty high

150
00:06:56.000 --> 00:06:59.079
<v Speaker 3>confidence that this is a unique bug to this version

151
00:06:59.079 --> 00:07:01.879
<v Speaker 3>for example. Yeah, that getting that aggregation and grouping in

152
00:07:01.920 --> 00:07:06.079
<v Speaker 3>place is the step one. But even then, you said earlier,

153
00:07:06.120 --> 00:07:09.000
<v Speaker 3>how do people move from customer reports and customer feedback

154
00:07:09.040 --> 00:07:12.000
<v Speaker 3>to having a proactive system like this? Well, not all

155
00:07:12.040 --> 00:07:13.720
<v Speaker 3>bugs that we have a T shirt with this, and

156
00:07:13.800 --> 00:07:16.079
<v Speaker 3>not all bugs are created equal. And if you just

157
00:07:16.120 --> 00:07:19.000
<v Speaker 3>went through this list and said I'm going to fix

158
00:07:19.040 --> 00:07:21.920
<v Speaker 3>every single bug that my bugsnog tool is reporting to me,

159
00:07:22.519 --> 00:07:25.040
<v Speaker 3>then you're going to waste your life away. You're going

160
00:07:25.040 --> 00:07:26.959
<v Speaker 3>to be spending time on stuff that really doesn't matter,

161
00:07:27.360 --> 00:07:29.360
<v Speaker 3>especially in the clients side, especially when it comes to

162
00:07:29.439 --> 00:07:32.240
<v Speaker 3>JavaScript and React applications, because it's the wild West. You've

163
00:07:32.279 --> 00:07:35.639
<v Speaker 3>got browsers all over the different places, You've got Chrome

164
00:07:35.720 --> 00:07:39.120
<v Speaker 3>extensions that causing problems and injecting content into the dom.

165
00:07:39.639 --> 00:07:42.480
<v Speaker 3>And so the next layer on top of that aggregation

166
00:07:43.079 --> 00:07:47.240
<v Speaker 3>is then sophisticated prioritization tool, so figuring out things like, well,

167
00:07:47.279 --> 00:07:50.360
<v Speaker 3>which one affected the most customers, which one affected customers

168
00:07:50.399 --> 00:07:52.319
<v Speaker 3>that are paying us the most money if you're going

169
00:07:52.399 --> 00:07:54.600
<v Speaker 3>to keep it straightforward, or which one affected customers that

170
00:07:54.600 --> 00:07:56.680
<v Speaker 3>are in key states or key flows like a log

171
00:07:56.720 --> 00:07:59.199
<v Speaker 3>in or sign up flow for example. And so we

172
00:07:59.319 --> 00:08:01.800
<v Speaker 3>try to capture as much information as we can at

173
00:08:01.839 --> 00:08:04.839
<v Speaker 3>run time and then allow you to create filters, bookmarks

174
00:08:05.000 --> 00:08:07.360
<v Speaker 3>and prioritization rules inside of bugsname.

175
00:08:07.759 --> 00:08:09.959
<v Speaker 1>It's funny, I didn't even really think about that, but

176
00:08:10.360 --> 00:08:13.720
<v Speaker 1>you're right, because someone could be just using some garbage

177
00:08:13.800 --> 00:08:16.519
<v Speaker 1>Chrome extension, or like maybe they're even like developing their

178
00:08:16.519 --> 00:08:19.399
<v Speaker 1>own Chrome extension. That's just like, you know, totally screwing

179
00:08:19.519 --> 00:08:21.800
<v Speaker 1>things up. And if you try to debug that, my god,

180
00:08:21.879 --> 00:08:25.360
<v Speaker 1>like you s going to be spending days and weeks.

181
00:08:25.600 --> 00:08:29.199
<v Speaker 1>Can you even know, like, for example, anyway you can

182
00:08:29.240 --> 00:08:31.600
<v Speaker 1>tell how bad it affected the user? Right? Like is

183
00:08:31.639 --> 00:08:33.919
<v Speaker 1>this like is there a way of knowing like this

184
00:08:34.000 --> 00:08:35.879
<v Speaker 1>is just an error, but it didn't actually affect the

185
00:08:35.960 --> 00:08:39.039
<v Speaker 1>user experience versus like this is actually I don't know,

186
00:08:39.120 --> 00:08:41.240
<v Speaker 1>like forcing the UI to be unresponsive or maybe even

187
00:08:41.279 --> 00:08:43.360
<v Speaker 1>like crashing the tab or something. Is there are ways

188
00:08:43.360 --> 00:08:46.200
<v Speaker 1>that you can even tell on that level of detail, Yeah.

189
00:08:46.240 --> 00:08:49.120
<v Speaker 3>It's the most The simplest way to do that is

190
00:08:49.159 --> 00:08:51.440
<v Speaker 3>to look at what we call the error handler, And

191
00:08:51.480 --> 00:08:53.200
<v Speaker 3>so I kind of mentioned this. We use jobscripts as

192
00:08:53.240 --> 00:08:56.360
<v Speaker 3>an example, or React as an example here. There's various

193
00:08:56.360 --> 00:08:58.600
<v Speaker 3>ways that we automatically detect that a bug has happen,

194
00:08:59.240 --> 00:09:02.720
<v Speaker 3>and some of them, for example, we wrap event handlers,

195
00:09:02.759 --> 00:09:04.679
<v Speaker 3>so we wrap the callbacks to the event handlers. So

196
00:09:05.080 --> 00:09:07.200
<v Speaker 3>if an exception happens in an event handler, and that

197
00:09:07.240 --> 00:09:10.120
<v Speaker 3>doesn't necessarily always bubble up to your window dot on error,

198
00:09:10.360 --> 00:09:12.840
<v Speaker 3>it might just mean that your click failed to do

199
00:09:12.919 --> 00:09:15.240
<v Speaker 3>what you expected your click to do because the callback

200
00:09:15.320 --> 00:09:19.679
<v Speaker 3>crashed halfway through. That is almost always less bad than

201
00:09:19.960 --> 00:09:22.320
<v Speaker 3>a bug that bubbles up. Still bad, it's less bad

202
00:09:22.360 --> 00:09:23.919
<v Speaker 3>than a bugue that bubbles all the way up to

203
00:09:24.000 --> 00:09:27.039
<v Speaker 3>window on error, which basically means no JavaScript is executing

204
00:09:27.080 --> 00:09:29.919
<v Speaker 3>in their scriptag anymore, and especially because most people are

205
00:09:30.000 --> 00:09:32.440
<v Speaker 3>using bundlers these days and bundling all their jobs script

206
00:09:32.519 --> 00:09:36.399
<v Speaker 3>up into applications on to JS. If your JavaScript stops

207
00:09:36.399 --> 00:09:38.320
<v Speaker 3>executing in that scriptag, you're boned.

208
00:09:38.399 --> 00:09:38.759
<v Speaker 2>That's it.

209
00:09:39.240 --> 00:09:42.000
<v Speaker 3>The whole page stops responding. There's other things as well,

210
00:09:42.039 --> 00:09:45.600
<v Speaker 3>like a promise rejection handler. Again, if it's in a

211
00:09:45.639 --> 00:09:48.200
<v Speaker 3>promise it happened a synchronously, it's probably not the.

212
00:09:48.240 --> 00:09:48.919
<v Speaker 2>End of the world.

213
00:09:49.279 --> 00:09:51.360
<v Speaker 3>So that's the most straightforward way to look at it,

214
00:09:51.399 --> 00:09:52.919
<v Speaker 3>and to say, look, if it was a click event,

215
00:09:53.279 --> 00:09:55.080
<v Speaker 3>that's bad, but not as bad as if the entire

216
00:09:55.120 --> 00:09:57.879
<v Speaker 3>page locked up. In terms of the performance aspects, though

217
00:09:58.000 --> 00:10:00.879
<v Speaker 3>they're a lot more subtle. We have a all code

218
00:10:00.879 --> 00:10:04.759
<v Speaker 3>snippets to detect certain things like freezes, and my favorite

219
00:10:04.759 --> 00:10:10.080
<v Speaker 3>one is our frustration detection snippet, so it detects rage clicks.

220
00:10:10.360 --> 00:10:13.360
<v Speaker 2>So if you, i said earlier, if you've got code that.

221
00:10:13.320 --> 00:10:17.200
<v Speaker 3>Made a non click handler fail, fine, but how can

222
00:10:17.240 --> 00:10:20.120
<v Speaker 3>you detect if your developers forgot to hook up on

223
00:10:20.200 --> 00:10:22.519
<v Speaker 3>click at all to a button? So you've just got

224
00:10:22.559 --> 00:10:24.919
<v Speaker 3>a button that looks like it's clickable, but there's literally nothing.

225
00:10:25.360 --> 00:10:27.200
<v Speaker 3>And so we've got some snippets so you can drop

226
00:10:27.279 --> 00:10:29.480
<v Speaker 3>in that will detect things like when you click on

227
00:10:29.519 --> 00:10:32.720
<v Speaker 3>the same domb element multiple times within a particular time window,

228
00:10:33.000 --> 00:10:35.320
<v Speaker 3>and then it will send a message to bugsnack saying

229
00:10:35.360 --> 00:10:36.799
<v Speaker 3>someone's rage clicking this button.

230
00:10:37.039 --> 00:10:37.840
<v Speaker 2>And so things like.

231
00:10:37.799 --> 00:10:41.759
<v Speaker 3>That are still as frustrating, maybe more frustrating than a

232
00:10:41.879 --> 00:10:44.279
<v Speaker 3>full page freeze, but it's kind of up to the

233
00:10:44.320 --> 00:10:46.799
<v Speaker 3>developer to decide, Yeah, this is the one that's that's

234
00:10:46.840 --> 00:10:48.039
<v Speaker 3>causing customers the most pain.

235
00:10:48.559 --> 00:10:51.039
<v Speaker 1>Yeah, because you said snippet, so is your model. They're

236
00:10:51.080 --> 00:10:54.120
<v Speaker 1>basically there's some default handling and then there's extra things

237
00:10:54.120 --> 00:10:55.840
<v Speaker 1>you can add on that you may not want to

238
00:10:55.840 --> 00:10:58.679
<v Speaker 1>give everybody because they were I'm assuming it works attended

239
00:10:58.759 --> 00:11:01.679
<v Speaker 1>to the vent handler, so there's like some small performance here,

240
00:11:01.720 --> 00:11:03.399
<v Speaker 1>so you might now want to go nuts with it

241
00:11:03.480 --> 00:11:03.960
<v Speaker 1>sort of thing.

242
00:11:04.360 --> 00:11:05.440
<v Speaker 2>Yeah, it's more.

243
00:11:05.720 --> 00:11:09.039
<v Speaker 3>It's more that we have an opinion that our product

244
00:11:09.159 --> 00:11:13.039
<v Speaker 3>is opinionated yet extensible, and so pretty much all of

245
00:11:13.080 --> 00:11:16.440
<v Speaker 3>our SDKs are plug in based, I mean our JavaScript one.

246
00:11:16.600 --> 00:11:19.080
<v Speaker 3>We just released a new version of this two days ago.

247
00:11:19.639 --> 00:11:22.799
<v Speaker 3>The whole thing's built around plugins, even internally, so things

248
00:11:22.840 --> 00:11:26.600
<v Speaker 3>start off as snippets sometimes and then graduate into official

249
00:11:26.600 --> 00:11:29.240
<v Speaker 3>plugins that we put as default inside of the application.

250
00:11:29.559 --> 00:11:30.960
<v Speaker 2>Some of them, like the rage click.

251
00:11:30.759 --> 00:11:35.440
<v Speaker 3>One, they're more interesting than actionable in a lot of cases,

252
00:11:35.519 --> 00:11:37.559
<v Speaker 3>and so if we ever evolve that to be one

253
00:11:37.600 --> 00:11:39.879
<v Speaker 3>of these ones where it's like we are confident that

254
00:11:39.960 --> 00:11:42.000
<v Speaker 3>something is going wrong based on these rage clicks, then

255
00:11:42.000 --> 00:11:43.840
<v Speaker 3>we'll put it as a default plug in inside of

256
00:11:43.879 --> 00:11:47.039
<v Speaker 3>our JavaScript SDK. But actually it's one of those things

257
00:11:47.039 --> 00:11:49.200
<v Speaker 3>that people want to tune. How many clicks is a

258
00:11:49.320 --> 00:11:51.519
<v Speaker 3>rage click? What time period should I measure? And all

259
00:11:51.519 --> 00:11:54.080
<v Speaker 3>that kind of stuff. So the stuff that's on by default,

260
00:11:54.120 --> 00:11:56.600
<v Speaker 3>the opinion of this stuff is what we think are

261
00:11:56.679 --> 00:12:00.919
<v Speaker 3>the most important negative signals inside of your Apple cation typically.

262
00:12:01.159 --> 00:12:03.440
<v Speaker 3>But yeah, it's all plug in base, and we try

263
00:12:03.480 --> 00:12:07.159
<v Speaker 3>to expose as much as possible in terms of API

264
00:12:07.279 --> 00:12:08.960
<v Speaker 3>so that you can hook in your own plugins and

265
00:12:09.000 --> 00:12:11.080
<v Speaker 3>do your own stuff. Like even I said earlier about

266
00:12:11.279 --> 00:12:15.720
<v Speaker 3>reporting handled versus unhandled exceptions, sometimes you've got your try

267
00:12:15.759 --> 00:12:18.279
<v Speaker 3>catch and my favorite piece of code to read ever

268
00:12:18.559 --> 00:12:21.919
<v Speaker 3>is when it says try catch, and all there is

269
00:12:21.919 --> 00:12:23.759
<v Speaker 3>in the catch is a comment that so should never

270
00:12:23.799 --> 00:12:27.120
<v Speaker 3>get here, and inevitably it's going to get there.

271
00:12:27.480 --> 00:12:29.320
<v Speaker 2>So a lot of our customers do.

272
00:12:29.399 --> 00:12:31.519
<v Speaker 3>Most of our customers do is they'll put a bugsnag, dot,

273
00:12:31.519 --> 00:12:35.279
<v Speaker 3>notified brackets, E error, whatever it is, and so that

274
00:12:35.399 --> 00:12:37.240
<v Speaker 3>way you know if it's got there, and then you

275
00:12:37.240 --> 00:12:39.480
<v Speaker 3>can decide if that's a problem or not. But yeah,

276
00:12:39.519 --> 00:12:42.519
<v Speaker 3>we try to be opinionated the accentsible as our produp philosophy.

277
00:12:42.639 --> 00:12:44.720
<v Speaker 1>I kind of like that for the catch black because

278
00:12:44.879 --> 00:12:47.080
<v Speaker 1>I've totally been that person that you go into the

279
00:12:47.120 --> 00:12:48.919
<v Speaker 1>catch and you think to yourself, like, I don't even

280
00:12:49.000 --> 00:12:51.039
<v Speaker 1>know how in the world this would happen, but like

281
00:12:51.120 --> 00:12:52.919
<v Speaker 1>I feel like I can't just leave this empty, right,

282
00:12:52.960 --> 00:12:54.440
<v Speaker 1>so I have to put something and it.

283
00:12:54.440 --> 00:12:55.679
<v Speaker 2>Will it will happen.

284
00:12:57.720 --> 00:12:59.759
<v Speaker 3>The ones that crack me up all the time, I

285
00:12:59.759 --> 00:13:01.960
<v Speaker 3>think this is because I'm getting across the old program

286
00:13:01.960 --> 00:13:04.559
<v Speaker 3>and now, but try catch blocks where the catch block

287
00:13:04.799 --> 00:13:07.039
<v Speaker 3>has just a comment and nothing else in it, and

288
00:13:07.080 --> 00:13:11.000
<v Speaker 3>then switch case statements where the default case says should

289
00:13:11.000 --> 00:13:11.600
<v Speaker 3>never get here.

290
00:13:12.360 --> 00:13:15.039
<v Speaker 2>It's just like cool, let's make sure it doesn't.

291
00:13:15.399 --> 00:13:17.759
<v Speaker 1>What's funny too, because the part of my life I

292
00:13:17.799 --> 00:13:20.879
<v Speaker 1>did Java code and Java like had I think it

293
00:13:20.919 --> 00:13:22.720
<v Speaker 1>was like a cert false or something like that. There's

294
00:13:22.759 --> 00:13:24.120
<v Speaker 1>some way that you could put in your code that

295
00:13:24.240 --> 00:13:26.559
<v Speaker 1>like if almost like at the compiler level, that if

296
00:13:26.559 --> 00:13:29.320
<v Speaker 1>this code ever executed, it would have a way of

297
00:13:29.360 --> 00:13:32.720
<v Speaker 1>like informing you, right whereas in JavaScript, outside of some tool,

298
00:13:32.799 --> 00:13:34.919
<v Speaker 1>like you're saying that, there's no built in way of

299
00:13:35.000 --> 00:13:38.159
<v Speaker 1>doing that, right, Like, there's no way of saying, hey,

300
00:13:38.279 --> 00:13:40.080
<v Speaker 1>just let me know if this code ever runs, Javas

301
00:13:40.200 --> 00:13:43.120
<v Speaker 1>will just merely go ahead, ignore that comment and go

302
00:13:43.240 --> 00:13:45.519
<v Speaker 1>right on its way, and who knows what's going to happen.

303
00:13:45.600 --> 00:13:48.919
<v Speaker 3>Well, people, I've seen people put to throw their own

304
00:13:48.919 --> 00:13:52.480
<v Speaker 3>custom exceptions in those cases. But would you rather kill

305
00:13:52.679 --> 00:13:56.000
<v Speaker 3>JavaScript execution completely and completely screw your up if it

306
00:13:56.039 --> 00:13:58.879
<v Speaker 3>ends up in that case or have it run and

307
00:13:58.879 --> 00:14:01.039
<v Speaker 3>then know about it because maybe it was okay that

308
00:14:01.080 --> 00:14:03.919
<v Speaker 3>it hit that case. And I think that in jabscript

309
00:14:03.960 --> 00:14:06.399
<v Speaker 3>land and client Sideline in particular, you don't have the

310
00:14:06.519 --> 00:14:09.480
<v Speaker 3>luxury of being in a controlled environment. You can't just

311
00:14:09.600 --> 00:14:12.679
<v Speaker 3>open the log file. The logs are on someone else's machine,

312
00:14:12.919 --> 00:14:15.000
<v Speaker 3>and that machine is that environment is completely out of

313
00:14:15.080 --> 00:14:17.879
<v Speaker 3>your control. So yeah, there's so many like you said,

314
00:14:18.080 --> 00:14:20.639
<v Speaker 3>when you add these solutions in sometimes you're surprised at

315
00:14:20.639 --> 00:14:23.679
<v Speaker 3>how many bugs appear. I mean, maybe that's because a

316
00:14:23.720 --> 00:14:25.679
<v Speaker 3>lot of people don't think about it during development, and

317
00:14:25.679 --> 00:14:28.000
<v Speaker 3>then when they do turn something on eventually they're like, oh, oh,

318
00:14:28.080 --> 00:14:31.360
<v Speaker 3>look at all these educases that happened to loads of customers.

319
00:14:31.720 --> 00:14:34.279
<v Speaker 1>Yeah, it's actually in a way of testament to JavaScript

320
00:14:34.440 --> 00:14:36.799
<v Speaker 1>because they like in a way when I think back

321
00:14:36.799 --> 00:14:38.759
<v Speaker 1>to job and saying, well, the code would completely stap

322
00:14:38.799 --> 00:14:40.679
<v Speaker 1>if this happened. But no way, that's kind of a

323
00:14:40.679 --> 00:14:42.840
<v Speaker 1>bad thing too, right, because if a customer hits it

324
00:14:43.159 --> 00:14:45.440
<v Speaker 1>and then the app just totally says like oh compiler

325
00:14:45.679 --> 00:14:48.879
<v Speaker 1>you know, or runtime air and just totally just dies.

326
00:14:49.000 --> 00:14:51.159
<v Speaker 1>It's kind of nice in JavaScript that some of these

327
00:14:51.200 --> 00:14:54.279
<v Speaker 1>areas can exist and things are mostly okay, right, like

328
00:14:54.320 --> 00:14:56.279
<v Speaker 1>it like you still want to know about it, but

329
00:14:56.320 --> 00:14:58.679
<v Speaker 1>maybe some they're still able to do. The user might

330
00:14:58.679 --> 00:15:00.799
<v Speaker 1>still be able to do the task they they are

331
00:15:00.840 --> 00:15:03.039
<v Speaker 1>able to do, so you don't necessarily want to just

332
00:15:03.120 --> 00:15:05.799
<v Speaker 1>completely crash in these situations. So I kind of like

333
00:15:05.879 --> 00:15:07.600
<v Speaker 1>the notification approach.

334
00:15:07.759 --> 00:15:10.080
<v Speaker 3>It's good, it's good and bad you end up with

335
00:15:10.279 --> 00:15:12.559
<v Speaker 3>a world that you know is almost a dirty word

336
00:15:12.600 --> 00:15:13.000
<v Speaker 3>these days.

337
00:15:13.000 --> 00:15:14.399
<v Speaker 2>Actually, it's having a bit of a renaissance.

338
00:15:14.399 --> 00:15:18.200
<v Speaker 3>But in PHP, in original PHP, not cool new PHP,

339
00:15:18.879 --> 00:15:20.679
<v Speaker 3>you could have an error and then the code would

340
00:15:20.720 --> 00:15:23.120
<v Speaker 3>keep executing. It would say, oh, we had an error, Okay,

341
00:15:23.159 --> 00:15:24.960
<v Speaker 3>let's just keep keep going. Let's keep going. So you

342
00:15:25.000 --> 00:15:28.240
<v Speaker 3>end up sometimes having you know, twenty compounding errors on

343
00:15:28.279 --> 00:15:30.600
<v Speaker 3>a page because this one variable wasn't initialized, and then

344
00:15:30.639 --> 00:15:32.960
<v Speaker 3>it just kept on trying all the way down the page.

345
00:15:33.159 --> 00:15:36.639
<v Speaker 3>And I think that we found pretty quickly that resilience

346
00:15:36.759 --> 00:15:39.320
<v Speaker 3>was not helpful in that case. You ended up with

347
00:15:39.320 --> 00:15:42.759
<v Speaker 3>with this getting into worse and worse situations as the

348
00:15:42.759 --> 00:15:45.200
<v Speaker 3>code kept on trying to execute down the page. I

349
00:15:45.240 --> 00:15:47.879
<v Speaker 3>think that the trade off is, you know, I think

350
00:15:47.879 --> 00:15:49.840
<v Speaker 3>it's okay to have like click handle a fail in

351
00:15:49.879 --> 00:15:52.279
<v Speaker 3>some particular case, but the rest of the app continues

352
00:15:52.320 --> 00:15:55.320
<v Speaker 3>to work. But I think that it's much harder to

353
00:15:55.360 --> 00:15:58.720
<v Speaker 3>diagnose and debug and reproduce problems, and so you end

354
00:15:58.799 --> 00:16:00.759
<v Speaker 3>up with, you know, you're getting a from a customer

355
00:16:00.799 --> 00:16:03.080
<v Speaker 3>saying I got into this state. Then how the heck

356
00:16:03.159 --> 00:16:05.840
<v Speaker 3>is the developer or the support person going to reproduce

357
00:16:05.919 --> 00:16:07.799
<v Speaker 3>that to get back into that state. That's the hard

358
00:16:07.799 --> 00:16:10.120
<v Speaker 3>part with allowing code to continue to execute.

359
00:16:10.200 --> 00:16:12.399
<v Speaker 1>For sure, I want to turn the conversation here in

360
00:16:12.399 --> 00:16:14.440
<v Speaker 1>a second over to mobile because I know that's that

361
00:16:14.600 --> 00:16:16.720
<v Speaker 1>opens a whole another can of worms. But do you

362
00:16:16.759 --> 00:16:19.240
<v Speaker 1>have I think one last question on the website, are there,

363
00:16:19.279 --> 00:16:22.159
<v Speaker 1>since you're sort of the aggregator of the aggregator of

364
00:16:22.200 --> 00:16:25.440
<v Speaker 1>bugs in a sense, are there any like really common

365
00:16:25.440 --> 00:16:28.120
<v Speaker 1>things that you find people do, or like things that

366
00:16:28.120 --> 00:16:31.559
<v Speaker 1>your average developer should be aware of, like common mistakes

367
00:16:31.799 --> 00:16:34.799
<v Speaker 1>that people overlook that to just look out for and

368
00:16:34.840 --> 00:16:35.879
<v Speaker 1>sort of be cognizant of.

369
00:16:36.279 --> 00:16:39.720
<v Speaker 3>Yeah, and it's it sounds so obvious, but it's just

370
00:16:39.759 --> 00:16:42.159
<v Speaker 3>by far and away the highest order of magnitude type

371
00:16:42.159 --> 00:16:42.799
<v Speaker 3>of bug.

372
00:16:42.600 --> 00:16:45.600
<v Speaker 2>That we see, and that is uninitialized variables.

373
00:16:45.639 --> 00:16:49.840
<v Speaker 3>Still in twenty twenty, null pointer exceptions, uninitialized variables are

374
00:16:49.879 --> 00:16:52.120
<v Speaker 3>the number one cause of bugs. And there's no surprise

375
00:16:52.200 --> 00:16:56.039
<v Speaker 3>that languages like like Swift try to come in and say, right,

376
00:16:56.120 --> 00:16:59.080
<v Speaker 3>let's let's force things not to be null or uninitialized

377
00:16:59.120 --> 00:17:01.919
<v Speaker 3>when the pile level. The other thing I think we

378
00:17:01.960 --> 00:17:04.440
<v Speaker 3>see all the time in jovscript especially, and again no

379
00:17:04.559 --> 00:17:09.200
<v Speaker 3>surprises here is type errors and problems caused by unclear

380
00:17:09.279 --> 00:17:12.880
<v Speaker 3>typing or coercion of typing. And so a lot of

381
00:17:12.920 --> 00:17:15.640
<v Speaker 3>these things I think can be solved by having really

382
00:17:15.720 --> 00:17:20.160
<v Speaker 3>nice linting in place or using a typed variant of JavaScript.

383
00:17:20.599 --> 00:17:23.000
<v Speaker 3>We use all of our new code box nexts React

384
00:17:23.079 --> 00:17:25.519
<v Speaker 3>app is now in typescript and we have a ton

385
00:17:25.559 --> 00:17:28.480
<v Speaker 3>of linting in place. I think we use Airbnb's e

386
00:17:28.680 --> 00:17:31.480
<v Speaker 3>clint rules off the bat, But it's we're trying to

387
00:17:31.519 --> 00:17:33.519
<v Speaker 3>keep things very tight before they even.

388
00:17:33.319 --> 00:17:36.559
<v Speaker 2>Get merged in a PR. But because we see all

389
00:17:36.640 --> 00:17:37.480
<v Speaker 2>these problems that come up.

390
00:17:37.480 --> 00:17:40.480
<v Speaker 3>But yeah, no points are exceptions unlessitized variables type errors

391
00:17:40.519 --> 00:17:42.640
<v Speaker 3>still in twenty twenty, the biggest problems.

392
00:17:43.119 --> 00:17:45.920
<v Speaker 1>Yeah, it's funny. It's amazing how like simple linting tools

393
00:17:45.920 --> 00:17:49.279
<v Speaker 1>can catch so much of these things. I'm curious when

394
00:17:49.319 --> 00:17:52.799
<v Speaker 1>you say uninitialized variable, like like what the specific scenario

395
00:17:52.880 --> 00:17:54.920
<v Speaker 1>is like, so I get to clear variable I don't

396
00:17:54.960 --> 00:17:57.400
<v Speaker 1>know X right that I'm going to use. How is

397
00:17:57.400 --> 00:17:59.440
<v Speaker 1>this an area that's not like cut by the developer

398
00:17:59.559 --> 00:18:02.440
<v Speaker 1>during test. Is it that it's like like a different

399
00:18:02.440 --> 00:18:05.359
<v Speaker 1>scenario like some if check or something that like there's

400
00:18:05.400 --> 00:18:08.079
<v Speaker 1>some case that they're not accounting for or yeah.

401
00:18:08.200 --> 00:18:11.119
<v Speaker 3>It's almost it's almost always when one of the things

402
00:18:11.160 --> 00:18:13.440
<v Speaker 3>is when we see all these bugs coming in and

403
00:18:13.640 --> 00:18:15.759
<v Speaker 3>but we can't see the full source code of our customers.

404
00:18:15.759 --> 00:18:18.200
<v Speaker 3>We don't, you know, it's a sensitive error. We don't

405
00:18:18.240 --> 00:18:21.680
<v Speaker 3>want them to have give us access to that, so

406
00:18:21.680 --> 00:18:23.960
<v Speaker 3>we keep it isolated. But what we see in our code,

407
00:18:23.960 --> 00:18:26.359
<v Speaker 3>and what I've seen in my career at least, is yeah,

408
00:18:26.440 --> 00:18:29.839
<v Speaker 3>when the developer has over confidence in the order or

409
00:18:30.200 --> 00:18:33.039
<v Speaker 3>structure of code execution, and so you're like, well, it's

410
00:18:33.079 --> 00:18:35.200
<v Speaker 3>going to go off into this function over here, it's

411
00:18:35.240 --> 00:18:37.319
<v Speaker 3>going to fill in all these this data and then

412
00:18:37.359 --> 00:18:37.920
<v Speaker 3>we'll run.

413
00:18:37.799 --> 00:18:38.359
<v Speaker 2>The next thing.

414
00:18:38.880 --> 00:18:41.839
<v Speaker 3>But there are about fifty ways that that function that's

415
00:18:41.880 --> 00:18:44.680
<v Speaker 3>meant to fill in all these variables could fail. And

416
00:18:44.839 --> 00:18:47.000
<v Speaker 3>I mean this is a really I think are really

417
00:18:47.039 --> 00:18:49.720
<v Speaker 3>straightforward one. All right, blog posts about years ago. But

418
00:18:50.160 --> 00:18:51.640
<v Speaker 3>one of the most common bugs that we've seen in

419
00:18:51.680 --> 00:18:56.240
<v Speaker 3>JavaScript land is for legacy applications is jQuery is not defined,

420
00:18:56.440 --> 00:18:59.279
<v Speaker 3>and jQuery is not defined as a bug because most

421
00:18:59.319 --> 00:19:02.400
<v Speaker 3>people history would put in jQuery from a CDM and

422
00:19:02.440 --> 00:19:04.519
<v Speaker 3>then they would run their code afterwards, so they would

423
00:19:04.559 --> 00:19:08.400
<v Speaker 3>expect jQuery or the dollar symbol to be defined. But

424
00:19:08.440 --> 00:19:11.039
<v Speaker 3>because of the way that the job script engines run,

425
00:19:11.279 --> 00:19:14.400
<v Speaker 3>if one script tag fails, the next script tag will

426
00:19:14.440 --> 00:19:17.400
<v Speaker 3>continue to run and try to run. So if your

427
00:19:17.440 --> 00:19:20.039
<v Speaker 3>next script tag, the whole thing relies on there being

428
00:19:20.039 --> 00:19:23.359
<v Speaker 3>a dollar symbol jQuery defined, but it's not, you're kind

429
00:19:23.400 --> 00:19:24.839
<v Speaker 3>of bunned. And so if you're using some kind of

430
00:19:25.039 --> 00:19:28.839
<v Speaker 3>module system or buddle system that has interdependencies, that can

431
00:19:28.960 --> 00:19:31.319
<v Speaker 3>be the case as well. But it's true of any

432
00:19:31.319 --> 00:19:33.799
<v Speaker 3>code that expects something else to be available and to

433
00:19:33.799 --> 00:19:36.400
<v Speaker 3>set up. If that fails, you're out of luck. So yeah,

434
00:19:36.400 --> 00:19:39.880
<v Speaker 3>it's really just being overconfident about code paths running and

435
00:19:39.960 --> 00:19:40.480
<v Speaker 3>not failing.

436
00:19:40.799 --> 00:19:45.599
<v Speaker 1>Who would do that though, Luckily I'm that guilty of that,

437
00:19:45.839 --> 00:19:48.400
<v Speaker 1>So we're good to go. So I do want to

438
00:19:48.400 --> 00:19:51.319
<v Speaker 1>get into mobile because this seems like even more of

439
00:19:51.359 --> 00:19:54.799
<v Speaker 1>a hairy territory. So I imagine, like from the web perspective,

440
00:19:54.839 --> 00:19:56.279
<v Speaker 1>your code is still going to run for like the

441
00:19:56.319 --> 00:19:59.200
<v Speaker 1>mobile web, and so the very similar sort of workflow

442
00:19:59.240 --> 00:20:02.000
<v Speaker 1>and sich but you were with reacting native as well

443
00:20:02.079 --> 00:20:03.160
<v Speaker 1>as they're correct.

444
00:20:03.039 --> 00:20:04.799
<v Speaker 2>That's right. Yeah, it's mobile.

445
00:20:04.880 --> 00:20:07.319
<v Speaker 3>Is I talk about clients like being the wide Wild West,

446
00:20:07.359 --> 00:20:10.400
<v Speaker 3>and people who are jobs developers for the browser know

447
00:20:10.519 --> 00:20:14.839
<v Speaker 3>that the browser environment differences are contentpated the But now

448
00:20:15.279 --> 00:20:17.440
<v Speaker 3>I think if you think it's a paint in the

449
00:20:17.480 --> 00:20:21.799
<v Speaker 3>bum developing for three four different major browsers. There are

450
00:20:22.720 --> 00:20:26.000
<v Speaker 3>twenty to forty thousand different Android devices out there in

451
00:20:26.039 --> 00:20:29.720
<v Speaker 3>the wild, and every single manufacturer of Android device is

452
00:20:29.839 --> 00:20:32.960
<v Speaker 3>LG Samsung whoever puts their own lot of flavor and

453
00:20:33.000 --> 00:20:35.920
<v Speaker 3>spice on Android. And what I mean by that is

454
00:20:36.000 --> 00:20:39.160
<v Speaker 3>they can do things such as actually edit the core

455
00:20:39.559 --> 00:20:43.039
<v Speaker 3>operating system of Android. There was really crazy bugs back

456
00:20:43.079 --> 00:20:45.000
<v Speaker 3>in the day on Android when it was a bit

457
00:20:45.039 --> 00:20:47.559
<v Speaker 3>more uncontrolled, before Google stepped in and said, hey, stop

458
00:20:47.559 --> 00:20:50.240
<v Speaker 3>messing with this. I forget who it was now, so

459
00:20:50.319 --> 00:20:52.680
<v Speaker 3>I didn't want to shame the wrong vendor, but a

460
00:20:52.720 --> 00:20:57.799
<v Speaker 3>manufacturer of Android devices edited Jason Parsing code in core

461
00:20:57.880 --> 00:21:00.720
<v Speaker 3>Android to do something different. So if you're an Android

462
00:21:00.720 --> 00:21:03.480
<v Speaker 3>developer expecting Jason to be passed and handled in a

463
00:21:03.480 --> 00:21:06.839
<v Speaker 3>particular way, it would work absolutely fine on every vendor

464
00:21:06.880 --> 00:21:09.400
<v Speaker 3>apart from this one, and then your code wouldn't work.

465
00:21:09.839 --> 00:21:12.279
<v Speaker 3>And if you didn't have some if you didn't have

466
00:21:12.319 --> 00:21:15.640
<v Speaker 3>that in your test farm of devices, or you didn't

467
00:21:15.640 --> 00:21:18.359
<v Speaker 3>have something like a bug stagg in production, you wouldn't

468
00:21:18.359 --> 00:21:20.200
<v Speaker 3>know about it apart from someone saying, hey, I've got

469
00:21:20.359 --> 00:21:22.319
<v Speaker 3>LG phone or whatever. It is and it's not working.

470
00:21:22.400 --> 00:21:25.319
<v Speaker 3>Your app isn't working. And so yeah, it's not as

471
00:21:25.359 --> 00:21:27.599
<v Speaker 3>easy as spinning up a couple of VMS. You can't

472
00:21:27.640 --> 00:21:30.119
<v Speaker 3>have all twenty to forty thousand Android devices out at

473
00:21:30.119 --> 00:21:33.559
<v Speaker 3>your desk from all these different vendors. So mobile is hairy,

474
00:21:33.960 --> 00:21:36.400
<v Speaker 3>and the more hairy the environment is, the harder it

475
00:21:36.480 --> 00:21:40.720
<v Speaker 3>is to build really good, high quality SDKs to these platforms.

476
00:21:40.759 --> 00:21:42.480
<v Speaker 3>But yeah, we do support React native and we have

477
00:21:42.480 --> 00:21:45.480
<v Speaker 3>to do with that, plus all the other layers of reacnative.

478
00:21:45.480 --> 00:21:48.920
<v Speaker 1>And what's the actual like like high level implementation look like,

479
00:21:48.960 --> 00:21:51.279
<v Speaker 1>because then the way I imagine like like this is

480
00:21:51.319 --> 00:21:53.640
<v Speaker 1>over trivializing, but it's like a window at an ear

481
00:21:53.680 --> 00:21:55.759
<v Speaker 1>handler and then a load of logic around that. And

482
00:21:56.119 --> 00:21:59.119
<v Speaker 1>native does react native provide like hooks into this or

483
00:21:59.279 --> 00:22:01.559
<v Speaker 1>is do you have of like native code that gets

484
00:22:01.559 --> 00:22:03.920
<v Speaker 1>into this and finds all the years or how does

485
00:22:03.920 --> 00:22:04.359
<v Speaker 1>that work?

486
00:22:04.720 --> 00:22:08.720
<v Speaker 3>The latter there's a React native is one of these

487
00:22:08.799 --> 00:22:11.759
<v Speaker 3>environments where I actually think that when when reat native

488
00:22:11.759 --> 00:22:13.759
<v Speaker 3>first came out, people were like, oh great, this is right.

489
00:22:13.799 --> 00:22:16.359
<v Speaker 3>Once deploy modible places, this is going to be awesome.

490
00:22:16.440 --> 00:22:19.799
<v Speaker 3>But in reality, I mean that's what kind of expos

491
00:22:19.839 --> 00:22:22.160
<v Speaker 3>for these days. But I think in reality a lot

492
00:22:22.160 --> 00:22:25.400
<v Speaker 3>of people are using React native to do retrofit work.

493
00:22:25.440 --> 00:22:29.160
<v Speaker 3>They're taking existing Native applications and they're putting in replacing

494
00:22:29.240 --> 00:22:31.279
<v Speaker 3>some chumps in it or some components of it with

495
00:22:31.880 --> 00:22:36.400
<v Speaker 3>React native. Now, because there is jobscript code and there

496
00:22:36.480 --> 00:22:39.759
<v Speaker 3>is iOS and Android code running inside of most of

497
00:22:39.759 --> 00:22:42.400
<v Speaker 3>these applications, we need to make sure that we catch

498
00:22:42.440 --> 00:22:45.400
<v Speaker 3>bugs in every single layer. So a layer cake at

499
00:22:45.440 --> 00:22:48.599
<v Speaker 3>the top, you've got the JavaScript runtime, even that you've

500
00:22:48.599 --> 00:22:51.440
<v Speaker 3>got different types of JavaScript runtime running because you've got

501
00:22:51.519 --> 00:22:53.400
<v Speaker 3>JS core versus whatever else is.

502
00:22:53.960 --> 00:22:57.160
<v Speaker 2>Being distributed, So you've got that JS runtime difference.

503
00:22:57.200 --> 00:22:59.839
<v Speaker 3>I then you've got the operating system iOS or androids

504
00:23:00.119 --> 00:23:03.839
<v Speaker 3>layer differences, and we have to capture objective C errors

505
00:23:03.920 --> 00:23:06.640
<v Speaker 3>and Swift errors and all sorts of stuff with iOS,

506
00:23:06.920 --> 00:23:07.359
<v Speaker 3>and then.

507
00:23:07.359 --> 00:23:10.480
<v Speaker 2>JVM errors on the Android side.

508
00:23:10.559 --> 00:23:13.599
<v Speaker 3>And then one layer down you've got things like ndk

509
00:23:13.839 --> 00:23:16.559
<v Speaker 3>R C and C plus plus errors happening in Android

510
00:23:16.759 --> 00:23:18.880
<v Speaker 3>and then the same equivalent happening on iOS.

511
00:23:18.960 --> 00:23:21.319
<v Speaker 2>So tons of layers they will have to communicate.

512
00:23:21.599 --> 00:23:23.920
<v Speaker 3>Recently, React Native actually don't know how recently it was,

513
00:23:23.920 --> 00:23:27.480
<v Speaker 3>but reacnative now supports React error handlers, which is great

514
00:23:27.559 --> 00:23:30.240
<v Speaker 3>air boundaries. Sorry, And so that's something that bugs nice

515
00:23:30.440 --> 00:23:32.960
<v Speaker 3>always supported and now you can use those in React Native.

516
00:23:33.240 --> 00:23:35.200
<v Speaker 2>But effectively, what we have to do is we have to.

517
00:23:35.160 --> 00:23:37.720
<v Speaker 3>Be able to capture bugs at every single layer and

518
00:23:37.880 --> 00:23:40.519
<v Speaker 3>reliably report them. And sometimes we have to be able

519
00:23:40.519 --> 00:23:44.599
<v Speaker 3>to report bugs before the React native engine has even initialized,

520
00:23:44.799 --> 00:23:47.920
<v Speaker 3>because there might be some Android code that ran before

521
00:23:48.000 --> 00:23:49.440
<v Speaker 3>the React native code initialized.

522
00:23:49.519 --> 00:23:51.839
<v Speaker 2>So yeah, we just recently.

523
00:23:51.480 --> 00:23:53.799
<v Speaker 3>Released a new major version of our React native notifier

524
00:23:54.160 --> 00:23:57.640
<v Speaker 3>and put it all under one mono refone bugs JS

525
00:23:57.799 --> 00:24:00.960
<v Speaker 3>to make sure that this initialization logic is buttoned up.

526
00:24:01.440 --> 00:24:05.160
<v Speaker 1>Yeah, yeah, that's crazy. I have some background in native script,

527
00:24:05.240 --> 00:24:09.359
<v Speaker 1>so like similar technology to React Native, like JavaScript running

528
00:24:09.400 --> 00:24:12.359
<v Speaker 1>on mobile, And I remember one thing we struggled with

529
00:24:12.759 --> 00:24:16.799
<v Speaker 1>is getting really good JavaScript stack traces. Are you able

530
00:24:16.920 --> 00:24:19.640
<v Speaker 1>to when you catch the air on like native land,

531
00:24:20.000 --> 00:24:22.160
<v Speaker 1>like give people the like this is the line of

532
00:24:22.240 --> 00:24:25.119
<v Speaker 1>code where there was a problem. I just really And

533
00:24:25.440 --> 00:24:27.759
<v Speaker 1>that's something like React Native exposes for you, or do

534
00:24:27.759 --> 00:24:30.079
<v Speaker 1>you have to do some like magic to try to

535
00:24:30.119 --> 00:24:30.799
<v Speaker 1>access that.

536
00:24:31.279 --> 00:24:34.359
<v Speaker 3>As a lot of magic in every layer, the stack

537
00:24:34.440 --> 00:24:38.240
<v Speaker 3>traces are almost certainly obfuscated in some way, either intentionally

538
00:24:38.319 --> 00:24:42.480
<v Speaker 3>or unintentionally. In the JavaScript layer, we rely on the

539
00:24:42.559 --> 00:24:45.960
<v Speaker 3>source maps standard, which isn't as standard as you think.

540
00:24:46.039 --> 00:24:50.480
<v Speaker 3>It's very wildly differently implemented on each platform. But what

541
00:24:50.519 --> 00:24:53.759
<v Speaker 3>we do is if we have an obfiscated JavaScript stack trace,

542
00:24:54.119 --> 00:24:55.880
<v Speaker 3>we're not going to get that to the development instid

543
00:24:55.880 --> 00:24:56.920
<v Speaker 3>of going to be like, what the heck.

544
00:24:56.799 --> 00:25:00.759
<v Speaker 2>Is you know function x Y two not what I wrote.

545
00:25:01.000 --> 00:25:02.960
<v Speaker 3>We want to show people the line of code that

546
00:25:03.000 --> 00:25:05.680
<v Speaker 3>they wrote rather than what it ended up being obfscated into.

547
00:25:05.759 --> 00:25:09.359
<v Speaker 3>So we automatically ingest and apply source maps to the

548
00:25:09.440 --> 00:25:12.160
<v Speaker 3>JavaScript layer so that we can present the original stack

549
00:25:12.240 --> 00:25:13.160
<v Speaker 3>trace to the developer.

550
00:25:13.519 --> 00:25:14.240
<v Speaker 2>But like as I.

551
00:25:14.200 --> 00:25:17.400
<v Speaker 3>Said, because it's a multi layer system, we also have

552
00:25:17.519 --> 00:25:19.559
<v Speaker 3>to do that in iOS and Android. And Android a

553
00:25:19.599 --> 00:25:22.400
<v Speaker 3>lot of people use something called pro guard, and progard

554
00:25:22.440 --> 00:25:25.799
<v Speaker 3>obfiscates the Java stack traces. We have to then reapply

555
00:25:26.200 --> 00:25:28.039
<v Speaker 3>to get the original stack traces back, and then the

556
00:25:28.119 --> 00:25:28.640
<v Speaker 3>same is true.

557
00:25:28.759 --> 00:25:29.279
<v Speaker 2>iOS.

558
00:25:29.599 --> 00:25:33.559
<v Speaker 3>iOS is almost even worse because it's effectively just not

559
00:25:33.599 --> 00:25:37.319
<v Speaker 3>offending iOS developers here, but it's like it's c it's

560
00:25:37.400 --> 00:25:41.039
<v Speaker 3>low level, and so if a crash happens, what we

561
00:25:41.119 --> 00:25:43.079
<v Speaker 3>get is a memory address. It looks more like a

562
00:25:43.119 --> 00:25:45.480
<v Speaker 3>classic core dump and so we have to take that

563
00:25:45.559 --> 00:25:48.920
<v Speaker 3>memory address and then reapply something called a decent file

564
00:25:49.000 --> 00:25:51.319
<v Speaker 3>to it to produce an original stack trace.

565
00:25:51.400 --> 00:25:53.599
<v Speaker 2>So yeah, magic all layers of the stack.

566
00:25:53.920 --> 00:25:57.559
<v Speaker 1>Yeah, I didn't even think about the programmed thing I had. Actually,

567
00:25:57.640 --> 00:26:00.000
<v Speaker 1>I've run across this with Magnaita script experience as well,

568
00:26:00.039 --> 00:26:02.240
<v Speaker 1>because a lot of people don't think about the fact

569
00:26:02.279 --> 00:26:04.200
<v Speaker 1>that when you think of iOS and Android apps, you

570
00:26:04.200 --> 00:26:06.920
<v Speaker 1>think the source code is like compiled and obfuscated and

571
00:26:07.039 --> 00:26:09.039
<v Speaker 1>you can't just download and use it. But since with

572
00:26:09.200 --> 00:26:11.920
<v Speaker 1>React Native you're running with JavaScript code, if you don't

573
00:26:11.920 --> 00:26:14.920
<v Speaker 1>take any additional steps, your JavaScript code is just hanging

574
00:26:14.960 --> 00:26:17.880
<v Speaker 1>out there right in your bundle, and to a lot

575
00:26:17.880 --> 00:26:21.000
<v Speaker 1>of people, especially like I don't know, people dealing with

576
00:26:21.039 --> 00:26:23.960
<v Speaker 1>sensitive work or company data, they don't want to expose that,

577
00:26:24.039 --> 00:26:27.319
<v Speaker 1>so they do some basically additional obfuscation on top of

578
00:26:27.359 --> 00:26:29.759
<v Speaker 1>what you'd normally do on the webs. You end up

579
00:26:29.759 --> 00:26:34.079
<v Speaker 1>with some absolutely garbled nonsense. I'm actually pretty impressed that

580
00:26:34.079 --> 00:26:36.960
<v Speaker 1>you're able to like sort of undo, because that's like

581
00:26:37.640 --> 00:26:40.279
<v Speaker 1>unreversed reverse engineering in a sense, to get at the

582
00:26:40.640 --> 00:26:41.680
<v Speaker 1>parts you're interested in.

583
00:26:42.240 --> 00:26:45.200
<v Speaker 3>I'm glad that there are somewhat standards here, and we've

584
00:26:45.240 --> 00:26:48.000
<v Speaker 3>been of evolving the source map standard as well a

585
00:26:48.000 --> 00:26:48.440
<v Speaker 3>little bit.

586
00:26:48.799 --> 00:26:50.640
<v Speaker 2>But I'm glad there's somewhat standards here.

587
00:26:50.519 --> 00:26:53.279
<v Speaker 3>Because there's a bit of a first engineering required, but

588
00:26:53.400 --> 00:26:56.720
<v Speaker 3>mostly we're just trying to follow the rules almost and say, right,

589
00:26:57.000 --> 00:27:00.839
<v Speaker 3>let's pick this back apart. But yeah, without the aggregation

590
00:27:00.880 --> 00:27:04.000
<v Speaker 3>and grouping and without the dealfiscation work with you to

591
00:27:04.079 --> 00:27:06.599
<v Speaker 3>provide original source maps, I think that a product like

592
00:27:06.680 --> 00:27:08.480
<v Speaker 3>bugsnack would be a lot less.

593
00:27:08.359 --> 00:27:10.559
<v Speaker 1>Valuable for sure. The other thing I want to get

594
00:27:10.599 --> 00:27:13.200
<v Speaker 1>into is, I know one of the key things you

595
00:27:13.240 --> 00:27:15.319
<v Speaker 1>do is help protect against like I think you say,

596
00:27:15.359 --> 00:27:19.119
<v Speaker 1>I Reddick GUESDKS writer or other SDKs you use, And

597
00:27:19.519 --> 00:27:22.240
<v Speaker 1>I know you were telling me a story of Facebook

598
00:27:22.599 --> 00:27:25.559
<v Speaker 1>their SDK sort of going down, So why don't you

599
00:27:25.599 --> 00:27:28.240
<v Speaker 1>share like what I guess what I'm talking about right

600
00:27:28.240 --> 00:27:30.960
<v Speaker 1>in terms of third party SDKs and a React native

601
00:27:31.000 --> 00:27:33.160
<v Speaker 1>world and sort of what you can do about that.

602
00:27:33.759 --> 00:27:36.480
<v Speaker 3>Well, I was joking about jquer is not defined earlier

603
00:27:37.079 --> 00:27:39.160
<v Speaker 3>and things like that, but you know, modern software, you

604
00:27:39.200 --> 00:27:42.079
<v Speaker 3>don't write the whole thing yourself from scratch. You're relying

605
00:27:42.119 --> 00:27:46.240
<v Speaker 3>on other people's open source packages and SDKs and for

606
00:27:46.319 --> 00:27:50.559
<v Speaker 3>anyone who is a React native or iOS developer recently

607
00:27:50.920 --> 00:27:53.680
<v Speaker 3>that uses the Facebook SDK, you'll be very familiar with

608
00:27:53.680 --> 00:27:56.440
<v Speaker 3>the fact that there were two outages within two and

609
00:27:56.480 --> 00:27:59.960
<v Speaker 3>a half months on the Facebook SDK that caused eye

610
00:28:00.000 --> 00:28:04.279
<v Speaker 3>applications to crash at boots if they were using Facebook's

611
00:28:04.319 --> 00:28:08.599
<v Speaker 3>authentication platform. And this is super frustrating because so first off,

612
00:28:09.079 --> 00:28:10.519
<v Speaker 3>I like to say, I don't want to anger the

613
00:28:10.519 --> 00:28:14.400
<v Speaker 3>ops gods, and so you know, Facebook had this issue.

614
00:28:14.759 --> 00:28:17.960
<v Speaker 2>You know, it sucks, but like you know, I give

615
00:28:18.000 --> 00:28:18.839
<v Speaker 2>them a break a little bit.

616
00:28:18.839 --> 00:28:21.400
<v Speaker 3>It's a tricky one to deal with, but in reality

617
00:28:21.400 --> 00:28:23.599
<v Speaker 3>it's a really difficult one for developers to deal with

618
00:28:23.599 --> 00:28:26.960
<v Speaker 3>as well. If you ask Spotify, you use the Facebook

619
00:28:27.039 --> 00:28:30.960
<v Speaker 3>SDK to allow people to authenticate one day without any

620
00:28:31.000 --> 00:28:34.039
<v Speaker 3>code changes happening at all on your side, suddenly your

621
00:28:34.079 --> 00:28:35.839
<v Speaker 3>app stops working and you get a ton of bug

622
00:28:35.880 --> 00:28:38.279
<v Speaker 3>snaggs or whatever you're using for air monitoring coming in.

623
00:28:38.519 --> 00:28:42.599
<v Speaker 3>And what happened was, in this particular case, Facebook's SDK

624
00:28:43.119 --> 00:28:45.839
<v Speaker 3>reaches out to Facebook's API to say, hey, tell me

625
00:28:45.880 --> 00:28:51.119
<v Speaker 3>information about how I should initialize. Facebook's API responded differently

626
00:28:51.200 --> 00:28:54.480
<v Speaker 3>to how the SDK was expecting, so it came back

627
00:28:54.519 --> 00:28:57.039
<v Speaker 3>and said instead of giving a structure a dictionary, it

628
00:28:57.079 --> 00:28:59.799
<v Speaker 3>came back with a boollion. And so the code that

629
00:28:59.880 --> 00:29:03.559
<v Speaker 3>was reading that Jason Payload basically just wet.

630
00:29:03.319 --> 00:29:05.680
<v Speaker 2>The bend, just like what do I do here?

631
00:29:06.440 --> 00:29:10.720
<v Speaker 3>So it kind of sucks because normally developers think about

632
00:29:10.759 --> 00:29:13.000
<v Speaker 3>bugs that are introduced as part of a code change,

633
00:29:13.039 --> 00:29:15.640
<v Speaker 3>but in this case, it wasn't a code change. The

634
00:29:15.759 --> 00:29:18.640
<v Speaker 3>data changed, and it was data that wasn't even part

635
00:29:18.680 --> 00:29:19.559
<v Speaker 3>of my application.

636
00:29:19.599 --> 00:29:22.160
<v Speaker 2>It was data was part of a third party SDK.

637
00:29:22.480 --> 00:29:25.599
<v Speaker 3>And so yeah, holy moly, we had all of these

638
00:29:25.720 --> 00:29:29.720
<v Speaker 3>apps that use the Facebook SDKA, which is almost every

639
00:29:29.759 --> 00:29:34.599
<v Speaker 3>consumer mobile application completely die on boot. Some of them didn't,

640
00:29:34.680 --> 00:29:38.599
<v Speaker 3>and we found that quite interesting. And so because we're

641
00:29:38.599 --> 00:29:41.799
<v Speaker 3>a crash monitoring solution and error monitoring solution, we saw

642
00:29:41.920 --> 00:29:43.920
<v Speaker 3>all of the crashes coming in from all of these

643
00:29:43.960 --> 00:29:45.079
<v Speaker 3>major consumer mobile.

644
00:29:44.880 --> 00:29:46.599
<v Speaker 2>Applications that use our products. So we had a bit

645
00:29:46.599 --> 00:29:47.920
<v Speaker 2>of a deluge.

646
00:29:47.720 --> 00:29:51.799
<v Speaker 3>And luckily my infrastructure teams built an architecture that was

647
00:29:51.839 --> 00:29:54.680
<v Speaker 3>almost scaling and we barely noticed the blip, which is fantastic,

648
00:29:54.759 --> 00:29:57.160
<v Speaker 3>but yeah, we were like, well, why does this app

649
00:29:57.480 --> 00:30:00.440
<v Speaker 3>have this volume of crashes? With this app's fine in reality,

650
00:30:00.480 --> 00:30:05.319
<v Speaker 3>it's really sensible defensive programming that some developers had taken

651
00:30:05.720 --> 00:30:10.039
<v Speaker 3>and others hadn't. So one of them was wrapping the

652
00:30:10.079 --> 00:30:14.160
<v Speaker 3>SDK in their own error hooks, so if this crash happened,

653
00:30:14.160 --> 00:30:16.680
<v Speaker 3>it could bubble up to the top and crash the application.

654
00:30:16.759 --> 00:30:19.480
<v Speaker 3>That one's pretty straightforward, easier said than done, though, because

655
00:30:19.519 --> 00:30:21.640
<v Speaker 3>a lot of asynchronous work was happening in that SDK.

656
00:30:22.200 --> 00:30:24.039
<v Speaker 3>The other one, which is a bit more aggresive, which

657
00:30:24.039 --> 00:30:26.119
<v Speaker 3>actually think is a really good best practice in general

658
00:30:26.160 --> 00:30:30.559
<v Speaker 3>for anyone using SDKs, is wrapping the SDK initialization in

659
00:30:30.680 --> 00:30:34.920
<v Speaker 3>a feature flag. So we saw some shapes of error

660
00:30:35.039 --> 00:30:37.519
<v Speaker 3>chart coming in that were like, well, there's tons of crashes,

661
00:30:37.519 --> 00:30:41.079
<v Speaker 3>and then immediately went down to zero because these customers

662
00:30:41.119 --> 00:30:44.480
<v Speaker 3>of ours were able to turn off Facebook's SDK by

663
00:30:44.680 --> 00:30:46.319
<v Speaker 3>updating a feature flag remotely.

664
00:30:46.599 --> 00:30:48.920
<v Speaker 2>That was then did not initialize that code for their

665
00:30:48.960 --> 00:30:49.759
<v Speaker 2>for their customer base.

666
00:30:49.799 --> 00:30:51.599
<v Speaker 3>I wish I could tell you which customers, because there's

667
00:30:51.599 --> 00:30:53.559
<v Speaker 3>I give them shout out, but obviously.

668
00:30:53.359 --> 00:30:54.440
<v Speaker 2>Obviously private stuff.

669
00:30:54.720 --> 00:30:56.839
<v Speaker 3>But you know, there's all these ways that now, if

670
00:30:56.880 --> 00:30:58.960
<v Speaker 3>you're relying on third party code, you have to be

671
00:30:59.000 --> 00:31:01.400
<v Speaker 3>super aware of all the is that that code could

672
00:31:01.519 --> 00:31:05.079
<v Speaker 3>change based on external dependencies and protect against that.

673
00:31:05.279 --> 00:31:08.480
<v Speaker 1>Yeah, I'm actually quite amazed that some people actually were

674
00:31:08.519 --> 00:31:11.519
<v Speaker 1>that proactive to account for this, because I think in

675
00:31:11.640 --> 00:31:14.200
<v Speaker 1>the NATA script apps I wrote, I never once made

676
00:31:14.200 --> 00:31:16.480
<v Speaker 1>an assumption. I mean, okay, so it's one thing if

677
00:31:16.519 --> 00:31:18.599
<v Speaker 1>like you call it to a third party like API

678
00:31:18.799 --> 00:31:21.279
<v Speaker 1>or something, right like, those are the situations. Usually you

679
00:31:21.319 --> 00:31:23.519
<v Speaker 1>would have some are handling. Like I'm building a mapping

680
00:31:23.559 --> 00:31:25.880
<v Speaker 1>app and I need to get like locations to show

681
00:31:25.880 --> 00:31:28.200
<v Speaker 1>on markers, and I call some service. Well, I'm gonna

682
00:31:28.200 --> 00:31:30.200
<v Speaker 1>have some are handling for that because this is a call.

683
00:31:30.680 --> 00:31:33.920
<v Speaker 1>But I never I had never accounted the service itself, right,

684
00:31:33.960 --> 00:31:36.279
<v Speaker 1>because almost all of these things a native have like

685
00:31:36.319 --> 00:31:38.079
<v Speaker 1>some sort of a NIT call, right, you pass it

686
00:31:38.079 --> 00:31:41.400
<v Speaker 1>in API key so you initialize it, and usually those

687
00:31:41.440 --> 00:31:44.799
<v Speaker 1>things don't even have air handling hooks, right, like, at

688
00:31:44.880 --> 00:31:48.880
<v Speaker 1>least in an experience, is always right like it It's

689
00:31:48.880 --> 00:31:51.839
<v Speaker 1>not like you call like Facebook, Dot, SDK dot and

690
00:31:51.920 --> 00:31:54.279
<v Speaker 1>knit and you have to pass it and on air handler.

691
00:31:54.319 --> 00:31:57.680
<v Speaker 1>It's just assumed you do it right, and like normally,

692
00:31:57.759 --> 00:31:59.640
<v Speaker 1>then later on in your code you just have to

693
00:31:59.680 --> 00:32:02.359
<v Speaker 1>like make sure it's their sort of thing. But you know,

694
00:32:02.559 --> 00:32:04.319
<v Speaker 1>you never account for BacT that, like what if it

695
00:32:04.440 --> 00:32:08.240
<v Speaker 1>did like something erroneous or something that I totally didn't expect.

696
00:32:08.279 --> 00:32:10.920
<v Speaker 1>So I'm absolutely amazed because I would definitely find the

697
00:32:10.920 --> 00:32:13.759
<v Speaker 1>camp of people that like hard crash for sure and

698
00:32:13.799 --> 00:32:16.640
<v Speaker 1>this sort of situation because I sort of assume these

699
00:32:16.640 --> 00:32:17.960
<v Speaker 1>things are always going to be there.

700
00:32:18.440 --> 00:32:21.319
<v Speaker 3>I've got to believe that the people who did that

701
00:32:21.799 --> 00:32:24.440
<v Speaker 3>either have been bitten by this problem in the past

702
00:32:24.599 --> 00:32:27.319
<v Speaker 3>and in their post mortem retrospective they were like, let's

703
00:32:27.359 --> 00:32:29.960
<v Speaker 3>do this, or they were used to working.

704
00:32:29.720 --> 00:32:32.119
<v Speaker 2>In an environment where SDKs are less reliable.

705
00:32:32.559 --> 00:32:34.839
<v Speaker 3>One of those is in my former life, I used

706
00:32:34.839 --> 00:32:38.079
<v Speaker 3>to work for a company that they gaming SDKs, mobile

707
00:32:38.079 --> 00:32:44.559
<v Speaker 3>gaming SDKs, and notoriously add provider SDKs were the crashiest SDKs.

708
00:32:44.559 --> 00:32:47.799
<v Speaker 3>Because you've got these companies where they're experts in monetization,

709
00:32:47.839 --> 00:32:51.839
<v Speaker 3>they're experts at building relationships with developers and publishers, but

710
00:32:51.880 --> 00:32:55.359
<v Speaker 3>maybe their SDKs on't the hottest SDKs around and people

711
00:32:55.400 --> 00:32:57.559
<v Speaker 3>are swapping them in and out all the time to

712
00:32:57.599 --> 00:32:59.319
<v Speaker 3>get the best deal. The business team is saying, right,

713
00:32:59.359 --> 00:33:01.119
<v Speaker 3>we need to swap out to use this ad provider

714
00:33:01.119 --> 00:33:03.880
<v Speaker 3>because they're giving us a better deal. But no one's saying,

715
00:33:04.200 --> 00:33:06.680
<v Speaker 3>are they well known developers and they have a good,

716
00:33:06.720 --> 00:33:07.519
<v Speaker 3>high quality SDK.

717
00:33:07.759 --> 00:33:10.119
<v Speaker 2>So I know, at least in the gaming space mobile

718
00:33:10.160 --> 00:33:11.559
<v Speaker 2>gaming space, people.

719
00:33:11.400 --> 00:33:14.160
<v Speaker 3>Were very wary about adding in you ad SDKs and

720
00:33:14.200 --> 00:33:16.640
<v Speaker 3>therefore probably more likely to protect against problems.

721
00:33:17.160 --> 00:33:19.599
<v Speaker 1>Yeah. And the other thing too, is that in native

722
00:33:19.680 --> 00:33:23.519
<v Speaker 1>land it's really hard, if not in some cases impossible,

723
00:33:23.599 --> 00:33:26.519
<v Speaker 1>to actually fix these problems on the fly like there.

724
00:33:26.559 --> 00:33:28.720
<v Speaker 1>I mean, there are some things you can do, like

725
00:33:28.759 --> 00:33:31.799
<v Speaker 1>in a React native world to like hot swap production code,

726
00:33:31.880 --> 00:33:35.440
<v Speaker 1>but it gets wonky at times. So I'd imagine too

727
00:33:35.480 --> 00:33:37.799
<v Speaker 1>like a lot of these would require full like app

728
00:33:37.880 --> 00:33:40.400
<v Speaker 1>updates through the app Store, Google Play and such they

729
00:33:40.400 --> 00:33:43.519
<v Speaker 1>actually fixed too, So like, yeah, like a fairly significant

730
00:33:43.559 --> 00:33:45.920
<v Speaker 1>business last I imagined for some of these people.

731
00:33:46.279 --> 00:33:46.519
<v Speaker 2>Yeah.

732
00:33:46.559 --> 00:33:49.119
<v Speaker 3>I wouldn't even want to think about the actual dollar

733
00:33:49.160 --> 00:33:50.920
<v Speaker 3>amount of that because it woul stressed me out too much.

734
00:33:50.960 --> 00:33:52.880
<v Speaker 3>But I know that it was very rare that people

735
00:33:53.000 --> 00:33:55.000
<v Speaker 3>use feature flags and turn these things off. It's very

736
00:33:55.039 --> 00:33:57.079
<v Speaker 3>rare that people using code push or something like that

737
00:33:57.160 --> 00:34:00.599
<v Speaker 3>to hot patch these things. I know from looking at

738
00:34:00.640 --> 00:34:03.039
<v Speaker 3>the data that a lot of our customers that solve

739
00:34:03.119 --> 00:34:06.519
<v Speaker 3>these problems effectively just rode the wave and waited for

740
00:34:06.559 --> 00:34:08.519
<v Speaker 3>Facebook because they couldn't do anything else. They had to

741
00:34:08.519 --> 00:34:10.480
<v Speaker 3>wait for Facebook to fix it because this is a

742
00:34:10.559 --> 00:34:11.679
<v Speaker 3>multiple ow issue.

743
00:34:11.800 --> 00:34:13.880
<v Speaker 1>But yeah, Facebook's going to fix it faster than they're

744
00:34:13.960 --> 00:34:15.000
<v Speaker 1>going to be exactly.

745
00:34:15.280 --> 00:34:17.360
<v Speaker 3>Yeah, And in the end, that's just think that Facebook

746
00:34:17.440 --> 00:34:20.159
<v Speaker 3>rolled back the co changes on their side that made

747
00:34:20.159 --> 00:34:21.199
<v Speaker 3>the data structure change.

748
00:34:21.400 --> 00:34:23.480
<v Speaker 1>Gotcha. So one of the things I want to get

749
00:34:23.519 --> 00:34:26.519
<v Speaker 1>into is like workflow from a company perspective and like

750
00:34:26.639 --> 00:34:29.360
<v Speaker 1>sort of any recommendations you might have, So like, if

751
00:34:29.360 --> 00:34:32.079
<v Speaker 1>we take this example, what is like what would you

752
00:34:32.840 --> 00:34:35.440
<v Speaker 1>I guess, what's the ideal like developer experience because obviously,

753
00:34:35.559 --> 00:34:37.679
<v Speaker 1>like you don't want to be notified every time like

754
00:34:37.760 --> 00:34:40.639
<v Speaker 1>somebody gets jQuery is not defined on your page, but

755
00:34:40.960 --> 00:34:44.320
<v Speaker 1>you might want to know if your entire iOS and

756
00:34:44.320 --> 00:34:48.559
<v Speaker 1>Android user base is suddenly hard crashing instantly. So what

757
00:34:48.639 --> 00:34:51.280
<v Speaker 1>are like, I guess what sort of systems you support

758
00:34:51.280 --> 00:34:54.079
<v Speaker 1>and what do you maybe recommend for notifications? Like are

759
00:34:54.559 --> 00:34:57.960
<v Speaker 1>are like people getting emails for this? Or like how

760
00:34:58.119 --> 00:34:59.960
<v Speaker 1>how quickly are people getting notified and able to resc

761
00:35:00.000 --> 00:35:01.519
<v Speaker 1>span when something like this happens.

762
00:35:01.840 --> 00:35:05.119
<v Speaker 3>So the way we've built bugsnag at least is that

763
00:35:05.199 --> 00:35:08.559
<v Speaker 3>we fit. We try to fit into existing workflows. So

764
00:35:08.559 --> 00:35:13.320
<v Speaker 3>if you are using Jira or any other project management

765
00:35:13.360 --> 00:35:16.079
<v Speaker 3>or issue tracking tool, we support that, and we don't

766
00:35:16.079 --> 00:35:18.519
<v Speaker 3>just support it as a creative issue in that tool.

767
00:35:18.639 --> 00:35:21.119
<v Speaker 3>We typically have what we call a two way synchronization.

768
00:35:21.559 --> 00:35:24.360
<v Speaker 3>So if you send a link of bugsnag, bugget a

769
00:35:24.400 --> 00:35:26.559
<v Speaker 3>Dura and someone marks it as fixed in Dura or

770
00:35:26.559 --> 00:35:29.519
<v Speaker 3>whatever we're using, that will market is fixed inside of bugsnag.

771
00:35:29.639 --> 00:35:31.679
<v Speaker 3>And so we support pretty much every major issue tracker

772
00:35:31.719 --> 00:35:34.039
<v Speaker 3>and project management tool, and we try to have a two.

773
00:35:33.920 --> 00:35:35.400
<v Speaker 2>Way sync on all of those platforms.

774
00:35:35.559 --> 00:35:37.480
<v Speaker 3>We even do things like if you've marked its fixed

775
00:35:37.519 --> 00:35:39.639
<v Speaker 3>in your dur at, AOL or whatever it is, and

776
00:35:39.679 --> 00:35:42.320
<v Speaker 3>then bugsnag detext it's still happening in a later release,

777
00:35:42.559 --> 00:35:44.079
<v Speaker 3>will automatically reopen.

778
00:35:43.719 --> 00:35:44.920
<v Speaker 2>It and market as a regression.

779
00:35:45.320 --> 00:35:47.320
<v Speaker 3>So we don't want to be a product that comes

780
00:35:47.360 --> 00:35:49.239
<v Speaker 3>in and says you have to completely change the way

781
00:35:49.280 --> 00:35:50.960
<v Speaker 3>you're doing things. We want to be a little nudge

782
00:35:51.000 --> 00:35:53.880
<v Speaker 3>in the right direction. So integrations with the project management

783
00:35:53.880 --> 00:35:55.599
<v Speaker 3>tools is a key way that we do that. We

784
00:35:55.719 --> 00:35:58.480
<v Speaker 3>also integrate with a learning in chat tools, and so

785
00:35:58.559 --> 00:36:01.440
<v Speaker 3>most people use in slack. These days or vers teams

786
00:36:01.519 --> 00:36:04.039
<v Speaker 3>or something like that you can configure on an application

787
00:36:04.039 --> 00:36:05.039
<v Speaker 3>by application basis.

788
00:36:05.480 --> 00:36:07.480
<v Speaker 2>I want these types of errors to go into these

789
00:36:07.519 --> 00:36:08.400
<v Speaker 2>types of chatterings.

790
00:36:08.440 --> 00:36:11.480
<v Speaker 3>So if you are a govership developer, you might want

791
00:36:11.519 --> 00:36:14.280
<v Speaker 3>to see all new errors that we haven't seen before

792
00:36:14.320 --> 00:36:17.719
<v Speaker 3>pop up as a message. We recently launched something about

793
00:36:17.719 --> 00:36:19.159
<v Speaker 3>a month ago, month and a half ago that we

794
00:36:19.239 --> 00:36:21.440
<v Speaker 3>call the alerting and a worklow engine, and this is

795
00:36:21.480 --> 00:36:23.840
<v Speaker 3>basically a more sophisticated way of routing those things. So

796
00:36:23.920 --> 00:36:27.480
<v Speaker 3>you can say, look, I work on the payments platform

797
00:36:27.559 --> 00:36:30.920
<v Speaker 3>in the React application, and that is defined as living

798
00:36:31.000 --> 00:36:34.639
<v Speaker 3>under these URLs or having this package name in the copath.

799
00:36:35.000 --> 00:36:37.840
<v Speaker 3>So you can now set up alerts to that match

800
00:36:37.920 --> 00:36:41.159
<v Speaker 3>those patterns, to go into a particular Slack channel, or

801
00:36:41.320 --> 00:36:44.360
<v Speaker 3>to alert to a higher frequency because Zechy copaths. So

802
00:36:45.559 --> 00:36:47.159
<v Speaker 3>I've said this a couple times now, But the client

803
00:36:47.239 --> 00:36:50.280
<v Speaker 3>side is the wild West. It's a little bit insane

804
00:36:50.480 --> 00:36:54.559
<v Speaker 3>to turn on error alerts for every new error. Some

805
00:36:54.800 --> 00:36:56.400
<v Speaker 3>we have the option to bug sit to turn on

806
00:36:56.480 --> 00:37:00.719
<v Speaker 3>alerts for every occurrence of each error. That makes sense

807
00:37:00.760 --> 00:37:02.440
<v Speaker 3>again if you've honed it down to say I want

808
00:37:02.440 --> 00:37:05.679
<v Speaker 3>to see on my rails application every time a credit

809
00:37:05.719 --> 00:37:08.039
<v Speaker 3>card fails to pass through because.

810
00:37:07.840 --> 00:37:09.679
<v Speaker 2>Of a problem on our side.

811
00:37:09.800 --> 00:37:12.840
<v Speaker 3>But the web, your code is running on so many

812
00:37:12.880 --> 00:37:17.000
<v Speaker 3>different devices in so many different environments that it's a bit.

813
00:37:16.960 --> 00:37:18.239
<v Speaker 2>Much to have all of those coming in.

814
00:37:18.360 --> 00:37:21.199
<v Speaker 3>So really the default that we have is alertly on

815
00:37:21.239 --> 00:37:23.760
<v Speaker 3>any new type of bug that hasn't happened before. And

816
00:37:23.800 --> 00:37:26.719
<v Speaker 3>then you can go in and again opinionated yet extensive.

817
00:37:26.719 --> 00:37:28.719
<v Speaker 3>We can go in and then fine tune exactly what

818
00:37:28.760 --> 00:37:31.239
<v Speaker 3>you want to see. We also integrate with everything else,

819
00:37:31.239 --> 00:37:34.440
<v Speaker 3>and like page duty, we integrate with web hops.

820
00:37:34.440 --> 00:37:36.800
<v Speaker 2>When to go splunk, you name it, we've got a

821
00:37:36.800 --> 00:37:37.559
<v Speaker 2>connection to it.

822
00:37:37.679 --> 00:37:39.639
<v Speaker 1>Actually, yeah, that makes sense. I didn't even think about

823
00:37:39.639 --> 00:37:41.920
<v Speaker 1>that angle, But I could totally see when I'm setting

824
00:37:41.960 --> 00:37:44.400
<v Speaker 1>this up saying like, well, if something goes on here,

825
00:37:44.559 --> 00:37:46.360
<v Speaker 1>like I want to like, I want it lug, but

826
00:37:46.360 --> 00:37:48.000
<v Speaker 1>I don't necessarily want to know about it. But if

827
00:37:48.039 --> 00:37:52.400
<v Speaker 1>a payment fails or if like a user registration something

828
00:37:52.519 --> 00:37:55.280
<v Speaker 1>like highly valuable knows, I might mind to ping someone

829
00:37:55.599 --> 00:37:58.280
<v Speaker 1>like immediately and cool. Yeah, I could see like the

830
00:37:58.320 --> 00:37:59.800
<v Speaker 1>Slack bit of it being pretty nice.

831
00:38:00.079 --> 00:38:03.480
<v Speaker 3>So you want to build trust in in Slack. You

832
00:38:03.480 --> 00:38:05.320
<v Speaker 3>don't want to be one of those tools, those products.

833
00:38:05.360 --> 00:38:08.800
<v Speaker 3>It's a noisy bot, and so what we technically do

834
00:38:08.880 --> 00:38:10.800
<v Speaker 3>is we tune it down by default. And the other

835
00:38:10.840 --> 00:38:13.159
<v Speaker 3>thing we do is spike detection. So if we detect

836
00:38:13.159 --> 00:38:16.320
<v Speaker 3>it there's an unusual increase in in errors on a project,

837
00:38:16.360 --> 00:38:18.960
<v Speaker 3>that will ping into Slack by default. But also that's

838
00:38:19.000 --> 00:38:20.400
<v Speaker 3>the sort of thing that people hook up to page,

839
00:38:20.400 --> 00:38:21.960
<v Speaker 3>you do to your ops geny or whatever you're on

840
00:38:22.039 --> 00:38:25.199
<v Speaker 3>call system. It's so we're seeing more and more development

841
00:38:25.239 --> 00:38:28.159
<v Speaker 3>teams rather than just operations, and for teams having on

842
00:38:28.320 --> 00:38:30.679
<v Speaker 3>call rotors so you get worken up at four in

843
00:38:30.719 --> 00:38:33.239
<v Speaker 3>the morning if there's an unusual spiking activity, if that

844
00:38:33.239 --> 00:38:35.400
<v Speaker 3>Facebook bug happened, for example, in the middle of the night.

845
00:38:35.599 --> 00:38:37.800
<v Speaker 1>Yeah, yeah, because that's like the one situation where you

846
00:38:37.840 --> 00:38:40.199
<v Speaker 1>actually probably would want to be woke up at four

847
00:38:40.199 --> 00:38:42.599
<v Speaker 1>in the morning. That's something it's worth looking into for sure.

848
00:38:43.199 --> 00:38:45.280
<v Speaker 1>This this has been sort of fascinating to me. Is

849
00:38:45.320 --> 00:38:47.880
<v Speaker 1>there any topics that we have yet to cover that

850
00:38:47.920 --> 00:38:49.639
<v Speaker 1>you'd like to get into or do you have any

851
00:38:49.639 --> 00:38:53.559
<v Speaker 1>other advice you'd like to give out There two people

852
00:38:53.760 --> 00:38:56.480
<v Speaker 1>who have decent size react audience that they should know

853
00:38:56.639 --> 00:38:58.119
<v Speaker 1>just about bug reporting in general.

854
00:38:58.559 --> 00:39:01.239
<v Speaker 3>I feel like the the obvious one is like, if

855
00:39:01.280 --> 00:39:05.639
<v Speaker 3>you're not using some kind of production awareness production error monitoring.

856
00:39:05.960 --> 00:39:07.800
<v Speaker 2>You absolutely have to these days.

857
00:39:07.840 --> 00:39:09.880
<v Speaker 3>Just it feels like people who aren't doing it these

858
00:39:09.960 --> 00:39:11.480
<v Speaker 3>days are just sticking their fingers.

859
00:39:11.159 --> 00:39:12.480
<v Speaker 2>And there isn't hoping for the best.

860
00:39:13.000 --> 00:39:15.960
<v Speaker 3>And so I think most of the audience is already

861
00:39:16.000 --> 00:39:18.840
<v Speaker 3>using something, even if they've homegrown their own thing that's

862
00:39:18.840 --> 00:39:20.559
<v Speaker 3>a window not on error and send an email or

863
00:39:20.599 --> 00:39:22.880
<v Speaker 3>something like that. So that's the kind of first thing.

864
00:39:22.920 --> 00:39:25.320
<v Speaker 3>But I also think that, like you said before, that

865
00:39:25.599 --> 00:39:28.159
<v Speaker 3>error monitoring, instability management's come a really long way in

866
00:39:28.199 --> 00:39:32.000
<v Speaker 3>the past five ten years, and you don't need to

867
00:39:32.039 --> 00:39:33.719
<v Speaker 3>declare bug bankruptcy anymore.

868
00:39:33.760 --> 00:39:35.159
<v Speaker 2>You don't need to just turn on as all we

869
00:39:35.239 --> 00:39:35.960
<v Speaker 2>are it's too much.

870
00:39:36.039 --> 00:39:38.679
<v Speaker 3>We just give up if you and your One thing

871
00:39:38.679 --> 00:39:40.280
<v Speaker 3>I talk about all the time is that engineering and

872
00:39:40.320 --> 00:39:43.239
<v Speaker 3>product teams actually should be really really aligned on what

873
00:39:43.280 --> 00:39:45.599
<v Speaker 3>a bad bug is and the definition of when is

874
00:39:45.599 --> 00:39:48.280
<v Speaker 3>the right time to work on bug fixes versus.

875
00:39:47.960 --> 00:39:49.079
<v Speaker 2>Getting that new feature live.

876
00:39:49.559 --> 00:39:53.039
<v Speaker 3>So have a tool that monitors is in production, and

877
00:39:53.079 --> 00:39:57.519
<v Speaker 3>then have alignment inside your development team that says we

878
00:39:57.599 --> 00:40:00.440
<v Speaker 3>are going to fix bugs that pass this threshold and

879
00:40:00.480 --> 00:40:02.639
<v Speaker 3>we're going to stop on new product development if our

880
00:40:02.679 --> 00:40:07.360
<v Speaker 3>stability drops below a particular percentage. So I genuinely think

881
00:40:07.440 --> 00:40:09.960
<v Speaker 3>if you align between products and engineering, or some people

882
00:40:09.960 --> 00:40:12.559
<v Speaker 3>call it business and engineering, but those two teams need

883
00:40:12.599 --> 00:40:14.719
<v Speaker 3>to have alignment in order for you guys to know

884
00:40:14.760 --> 00:40:17.079
<v Speaker 3>when the right time is to fix barks and clean

885
00:40:17.119 --> 00:40:20.559
<v Speaker 3>up technical debts. And there are two things that I've evangelize.

886
00:40:20.559 --> 00:40:22.639
<v Speaker 1>Well, yeah, and I definitely agree with that with my

887
00:40:22.679 --> 00:40:25.079
<v Speaker 1>experiences as well. Like it's I think, like you said,

888
00:40:25.119 --> 00:40:27.639
<v Speaker 1>it's still far too common for i mean, really huge

889
00:40:27.719 --> 00:40:30.440
<v Speaker 1>organizations in some sense, they're really important apps to just

890
00:40:30.559 --> 00:40:34.280
<v Speaker 1>be totally flying by right, this is just not doing anything.

891
00:40:34.360 --> 00:40:36.239
<v Speaker 1>So it's a good note. I think it's a good

892
00:40:36.239 --> 00:40:38.159
<v Speaker 1>note to end on. So why don't we go ahead

893
00:40:38.159 --> 00:40:41.239
<v Speaker 1>and move into the picks? So I have just one

894
00:40:41.280 --> 00:40:44.159
<v Speaker 1>pick today. I've gotten into I don't even remember, like

895
00:40:44.199 --> 00:40:46.119
<v Speaker 1>the weird way the internet works what gots me into this?

896
00:40:46.239 --> 00:40:48.119
<v Speaker 1>But there's this guy. Have you ever heard of the

897
00:40:48.280 --> 00:40:50.960
<v Speaker 1>guy named wim Hoff. He's oh, yeah, like this. I

898
00:40:51.000 --> 00:40:54.800
<v Speaker 1>think he's this Dutch guy that's like famous for going outside,

899
00:40:54.920 --> 00:40:58.400
<v Speaker 1>like shirtless and like climbing mountains in the snow sort

900
00:40:58.480 --> 00:41:01.360
<v Speaker 1>of thing. And for some reason this just fascinated me.

901
00:41:01.559 --> 00:41:04.400
<v Speaker 1>So I've got a book on him called What Doesn't

902
00:41:04.480 --> 00:41:07.159
<v Speaker 1>Kill Us, and I'm a few few chapters into it.

903
00:41:07.199 --> 00:41:09.159
<v Speaker 1>I've been just listening to the audio book and it's

904
00:41:09.280 --> 00:41:11.960
<v Speaker 1>it's sort of fascinating. It talks through the science of

905
00:41:12.039 --> 00:41:15.159
<v Speaker 1>like is it just this dude's genetic makeup that's that

906
00:41:15.239 --> 00:41:18.280
<v Speaker 1>allows him to do it? Or is it just training, right,

907
00:41:18.360 --> 00:41:20.440
<v Speaker 1>like getting getting more accustomed to this? And the answer

908
00:41:20.480 --> 00:41:21.880
<v Speaker 1>seems to be a little bit of both. But it's

909
00:41:21.960 --> 00:41:23.800
<v Speaker 1>it's interesting because it definitely takes more of like a

910
00:41:23.840 --> 00:41:26.840
<v Speaker 1>scientific perspective on like how in the heck is this possible?

911
00:41:26.960 --> 00:41:29.800
<v Speaker 1>So I'd recommend it if you're at all curious about that.

912
00:41:30.239 --> 00:41:31.000
<v Speaker 1>I check that out.

913
00:41:31.199 --> 00:41:34.800
<v Speaker 2>So Pick is not the guy who can mentally control

914
00:41:34.840 --> 00:41:35.800
<v Speaker 2>his body temperature?

915
00:41:36.079 --> 00:41:38.719
<v Speaker 1>Well, yeah, that's that's where it gets. Yeah, that's where

916
00:41:38.760 --> 00:41:40.840
<v Speaker 1>it gets into like a little bit of craziness because

917
00:41:40.880 --> 00:41:43.280
<v Speaker 1>like you find yourself as you read through this going

918
00:41:43.559 --> 00:41:45.920
<v Speaker 1>back and forth between like this guy is just looney

919
00:41:45.920 --> 00:41:48.199
<v Speaker 1>Tunes crazy a little bit, But at the same time,

920
00:41:48.280 --> 00:41:52.119
<v Speaker 1>he subjects to himself to like scientific studies a lot, right, Like,

921
00:41:52.320 --> 00:41:54.159
<v Speaker 1>unlike a lot of these people that are like your

922
00:41:54.199 --> 00:41:59.480
<v Speaker 1>clerics and crazy like sort of nutcases. He actually submits

923
00:41:59.559 --> 00:42:02.639
<v Speaker 1>himself to scientific studies a lot, Like he's been put

924
00:42:02.760 --> 00:42:05.239
<v Speaker 1>through all sorts of rigorous tests and such as well,

925
00:42:05.360 --> 00:42:07.599
<v Speaker 1>so like some of what he claims has actually been proven.

926
00:42:07.719 --> 00:42:09.599
<v Speaker 1>But then they're part of like he's controlling this with

927
00:42:09.679 --> 00:42:12.719
<v Speaker 1>his mind. That's the stuff that's sort of like. But

928
00:42:12.840 --> 00:42:16.280
<v Speaker 1>it's interesting. It's interesting nevertheless, I guess.

929
00:42:16.119 --> 00:42:17.599
<v Speaker 2>Yeah, on my picks.

930
00:42:17.679 --> 00:42:20.039
<v Speaker 3>The thing that I've been playing with a lot recently

931
00:42:20.760 --> 00:42:23.159
<v Speaker 3>is this new game that just came out just a

932
00:42:23.159 --> 00:42:24.800
<v Speaker 3>few days ago called Fall Guys.

933
00:42:24.800 --> 00:42:25.800
<v Speaker 2>I don't know if you've heard of this.

934
00:42:28.159 --> 00:42:30.559
<v Speaker 3>The it's on Steam and it's the PlayStation game of

935
00:42:30.599 --> 00:42:33.039
<v Speaker 3>the Month pre game of the Month, and it is ridiculous.

936
00:42:33.039 --> 00:42:36.079
<v Speaker 3>It's like a Battle Royale game but cross with like

937
00:42:36.519 --> 00:42:40.599
<v Speaker 3>Mario Party mini games, and it brings out the best

938
00:42:40.599 --> 00:42:41.280
<v Speaker 3>and worst in people.

939
00:42:41.280 --> 00:42:42.079
<v Speaker 2>But it's insane.

940
00:42:43.159 --> 00:42:47.159
<v Speaker 3>It's so much fun, and it's a relatively small developer

941
00:42:47.400 --> 00:42:50.119
<v Speaker 3>that's built it, and I imagine that their servers are

942
00:42:50.119 --> 00:42:52.880
<v Speaker 3>getting hammered right now. But it's an insanely fun game.

943
00:42:53.280 --> 00:42:55.679
<v Speaker 3>But yeah, apart from that, I don't get much time

944
00:42:55.719 --> 00:42:57.480
<v Speaker 3>to do hobbies and side things at the moment. But

945
00:42:57.559 --> 00:43:00.840
<v Speaker 3>my fun pick at the moment is this weird scene

946
00:43:00.880 --> 00:43:05.639
<v Speaker 3>called the console portabilizing scene. And if you're I come

947
00:43:05.639 --> 00:43:07.760
<v Speaker 3>from a gaming background, I'm a big gamer. But there's

948
00:43:07.800 --> 00:43:10.800
<v Speaker 3>this huge scene of people who take games consoles and

949
00:43:10.840 --> 00:43:14.039
<v Speaker 3>then chop them up and make them portable. And so

950
00:43:14.880 --> 00:43:18.840
<v Speaker 3>my little side hobby has been taking Nintendo Wheeze, chopping

951
00:43:18.880 --> 00:43:20.800
<v Speaker 3>them up and making them into like game Boy form

952
00:43:20.840 --> 00:43:21.920
<v Speaker 3>factor and things like that.

953
00:43:21.960 --> 00:43:25.119
<v Speaker 2>So that's my other little pig little side hobby.

954
00:43:24.960 --> 00:43:27.039
<v Speaker 1>That could be a lot of fun I've wanted before,

955
00:43:27.079 --> 00:43:30.679
<v Speaker 1>because like the virtual console type stuff is, it's it's fun,

956
00:43:30.679 --> 00:43:32.760
<v Speaker 1>but it's not quite the same as like holding the

957
00:43:32.800 --> 00:43:35.400
<v Speaker 1>actual thing in your hand. Like there you get a

958
00:43:35.400 --> 00:43:37.639
<v Speaker 1>nostalgia over time of like, man, I really like there's

959
00:43:37.679 --> 00:43:39.639
<v Speaker 1>something that kicks in when you just hold like an

960
00:43:39.639 --> 00:43:43.159
<v Speaker 1>old Sega Genesis or Super Nintendo or any s controller.

961
00:43:43.440 --> 00:43:45.320
<v Speaker 1>It's just like I don't know if it's just nostalgia

962
00:43:45.719 --> 00:43:47.599
<v Speaker 1>or what it is, but it's it's different than just

963
00:43:47.639 --> 00:43:49.800
<v Speaker 1>playing it virtually. So it's pretty cool.

964
00:43:49.960 --> 00:43:52.000
<v Speaker 3>Yeah, you want to sit down and actually complete the

965
00:43:52.039 --> 00:43:54.760
<v Speaker 3>games rather than just like I found with emulators and things,

966
00:43:54.760 --> 00:43:56.679
<v Speaker 3>you'd pull them up and just go through ten games

967
00:43:56.719 --> 00:43:58.960
<v Speaker 3>and say, oh, that was interesting, next game, rather than

968
00:43:59.000 --> 00:44:00.760
<v Speaker 3>sitting down and having that arch experience.

969
00:44:00.800 --> 00:44:03.119
<v Speaker 1>Yeah yeah, Well James, this has been a great chat.

970
00:44:03.400 --> 00:44:05.519
<v Speaker 1>I think my last question for you is where can

971
00:44:05.519 --> 00:44:07.599
<v Speaker 1>people find you if they want to, you know, ask

972
00:44:07.639 --> 00:44:09.719
<v Speaker 1>any further questions follow all of what you do.

973
00:44:10.079 --> 00:44:13.159
<v Speaker 3>I'm on Twitter at loop j l OOPJ. I'm not

974
00:44:13.239 --> 00:44:15.400
<v Speaker 3>super active on there. I'm trying to get back into it,

975
00:44:15.800 --> 00:44:18.800
<v Speaker 3>and then I'm kind of relatively active on the conference

976
00:44:18.840 --> 00:44:22.159
<v Speaker 3>and speaking scene as well, So catch check out my

977
00:44:22.280 --> 00:44:24.360
<v Speaker 3>Twitter or bugs next Twitter to see which conference I'm

978
00:44:24.360 --> 00:44:26.360
<v Speaker 3>that next. But I do talk a lot about technical

979
00:44:26.400 --> 00:44:28.559
<v Speaker 3>debt on the conference scene, So if you're around and

980
00:44:28.559 --> 00:44:29.760
<v Speaker 3>you see me, drop in and I'll say.

981
00:44:29.719 --> 00:44:32.400
<v Speaker 1>Hi, awesome. Well, thanks again for joining us. It's been

982
00:44:32.480 --> 00:44:34.760
<v Speaker 1>another episode of React round It, so have a good

983
00:44:34.800 --> 00:44:35.239
<v Speaker 1>run everyone.

984
00:44:35.360 --> 00:44:35.760
<v Speaker 2>THANKSDJ.
