WEBVTT

1
00:00:06.000 --> 00:00:10.039
Hey everybody, and welcome to another
episode of React Roundup. I am your

2
00:00:10.039 --> 00:00:14.000
host today TJ Van Tol and with
me today on our panel I have Jack

3
00:00:14.080 --> 00:00:19.519
Herrington, Hello, and Paige neding
House. Hey everyone, and our special

4
00:00:19.519 --> 00:00:23.079
guest today is Chris Bruin. Chris, how's it going? Welcome to React

5
00:00:23.160 --> 00:00:28.120
Round Up? Hi, Thanks for
having me. Yeah. So Chris,

6
00:00:28.160 --> 00:00:31.160
why don't you start by telling us
a little bit about who you are,

7
00:00:31.280 --> 00:00:34.520
what you do, why you're famous, all that good sort of stuff.

8
00:00:35.119 --> 00:00:41.439
Okay, yeah, famous might be
questionable. Yeah. So I'm currently a

9
00:00:41.479 --> 00:00:47.640
full fac software engineer at a startup
called in Club and it's based around Zurich,

10
00:00:47.799 --> 00:00:52.880
Switzerland, and we're I guess we're
trying to be if you could imagine

11
00:00:53.079 --> 00:00:58.640
kind of Airbnb but for experiences.
So I'm going hiking this weekend. Who

12
00:00:58.640 --> 00:01:00.920
wants to come with me? Or
I mean going on a pub crawl?

13
00:01:02.119 --> 00:01:03.959
Who wants to come with me?
And so, yeah, I've been there

14
00:01:04.000 --> 00:01:10.640
now just over a year. Yeah, from everything from back end, mobile

15
00:01:10.680 --> 00:01:15.040
app CMS, everything in between.
So I've seen a little bit of everything.

16
00:01:15.239 --> 00:01:18.519
Awesome. So I know we reached
out because you've written a couple of

17
00:01:18.799 --> 00:01:23.239
really interesting articles about your thoughts,
like I think all sorts of things from

18
00:01:23.280 --> 00:01:30.920
like code structure to testing, how
BDD like behavior behavior driven development. So

19
00:01:30.239 --> 00:01:34.400
maybe do you want to start by
just giving like an overview of some of

20
00:01:34.640 --> 00:01:38.400
like maybe we could start with like
BDD and like how you came to like

21
00:01:38.439 --> 00:01:42.000
how you structure code and how you
approach problems at the startup, because I

22
00:01:42.159 --> 00:01:45.239
not a whole lot of us get
the chance to really, like green Field

23
00:01:45.319 --> 00:01:48.840
build something like that at scales.
I'm curious, like some of your thoughts

24
00:01:48.920 --> 00:01:52.480
and opinions you have to share around
that sort of thing. Sure. Yeah,

25
00:01:52.519 --> 00:01:57.280
So the challenge for us was that
we we were a very small team,

26
00:01:57.400 --> 00:02:01.680
so up until a few weeks ago, I was kind of the only

27
00:02:01.840 --> 00:02:06.359
developer, So it was me and
the two co founders. So as you

28
00:02:06.400 --> 00:02:09.919
said, yeah, super Greenfield,
and we actually we were guided. One

29
00:02:09.960 --> 00:02:15.759
of our technical advisors told us about
this kind of behavior driven development thing.

30
00:02:15.879 --> 00:02:19.919
So we're like, okay, what
is this and so he he pointed us,

31
00:02:20.039 --> 00:02:23.159
I guess at the very top of
this whole like behavior driven development and

32
00:02:23.199 --> 00:02:30.479
test driven development stuff is this language
called Girkin. And so Gurkin is simply

33
00:02:30.919 --> 00:02:37.000
you could consider it like a programming
language but it's also kind of yeah behavior

34
00:02:37.120 --> 00:02:43.599
and kind of product design language.
So basically the only the three important keywords

35
00:02:43.680 --> 00:02:50.199
are given when and then, and
for us developers, that kind of corresponds

36
00:02:50.280 --> 00:02:54.759
one to one to the whole the
act arrange, assert Trio. So the

37
00:02:54.840 --> 00:02:59.800
reason he the reason he pointed us
in this direction is that the two co

38
00:03:00.039 --> 00:03:05.120
founders, they're kind of the minds
behind the product and driving a lot of

39
00:03:05.120 --> 00:03:08.039
the ideas behind the product. They
can describe in playing in English or with

40
00:03:08.120 --> 00:03:12.800
these three sentences right, given let's
say, given I open the app,

41
00:03:13.120 --> 00:03:17.120
when I press the log in button, then I see the login screen,

42
00:03:17.199 --> 00:03:21.680
right something like that. They can
explain steps in very plain English. And

43
00:03:21.680 --> 00:03:24.199
then we or I I guess it's
we. Now there's there's two of us.

44
00:03:24.240 --> 00:03:30.280
Now that's awesome. We can write
the tests against these kind of Yeah,

45
00:03:30.319 --> 00:03:34.840
these we call them Girkin special specifications. It's pretty cool. And it's

46
00:03:34.840 --> 00:03:39.039
spelled just for anybody else curious g
H E R K I N just for

47
00:03:39.080 --> 00:03:43.479
anybody just casually googling this as we
go across, because I would not have

48
00:03:43.560 --> 00:03:47.120
guessed that's spelling at all. Yeah, I believe integrate with jest or how

49
00:03:47.120 --> 00:03:50.560
do I if I'm if I just
want to start with this or where do

50
00:03:50.599 --> 00:03:54.599
I start with this? Yeah,
so there's there's two kind of two ways.

51
00:03:54.919 --> 00:03:59.879
The one way is you can use
a library called the Cucumber, with

52
00:04:00.039 --> 00:04:03.400
which they have actually drivers for a
lot of languages, I think also Plain,

53
00:04:03.520 --> 00:04:06.879
Java, JavaScript, Cotlan, other
languages, So you can use that

54
00:04:06.960 --> 00:04:12.599
and they you basically directly import like
a function called given and then you pass

55
00:04:12.680 --> 00:04:16.720
the string of whatever the given line
of that description file is. But yeah,

56
00:04:16.720 --> 00:04:21.519
we've we have since integrated with jest. There's also there's an integration you

57
00:04:21.600 --> 00:04:28.199
basically so when you write these these
specification files. We we're using the dot

58
00:04:28.240 --> 00:04:31.279
feature file extension that seems to be
like kind of a standard, and this

59
00:04:31.600 --> 00:04:35.160
just integration works that you you import, they have like it's called like a

60
00:04:35.160 --> 00:04:41.319
load feature function and then just knows
oh okay, I'm reading from this feature

61
00:04:41.360 --> 00:04:46.519
file and then you have defined feature
with more more in I guess a standard

62
00:04:46.680 --> 00:04:49.720
just way. But still with these
you get these little given when then functions

63
00:04:49.720 --> 00:04:53.600
that you can you can call from
just in the order of the steps.

64
00:04:53.800 --> 00:04:59.279
Oh nice, Yeah, I found
that it's just dash cucumber on GitHub and

65
00:04:59.319 --> 00:05:03.120
you're right, it like it looks
to me like any other just all these

66
00:05:03.600 --> 00:05:06.800
nouns. It's kind of sometimes you
take a step back and go, like,

67
00:05:08.079 --> 00:05:11.560
these sentences I'm saying are a little
crazy, but it looks like any

68
00:05:11.560 --> 00:05:15.639
other just test that I've seen before. But you're right, it clearly has

69
00:05:15.759 --> 00:05:21.600
the given when then type of structure
just sort of embedded within it. And

70
00:05:21.639 --> 00:05:27.560
that's really interesting that you've been able
to incorporate that into a testing framework because

71
00:05:27.680 --> 00:05:30.639
at the last company that I worked
with, our product managers were responsible for

72
00:05:30.720 --> 00:05:34.600
writing a lot of our feature stories, and they would use that sort of

73
00:05:34.639 --> 00:05:40.319
syntax to write out the story,
so exactly like you would say, given

74
00:05:40.319 --> 00:05:44.040
a user clicks on a button,
when they are given a users on our

75
00:05:44.079 --> 00:05:46.759
application, when they click on the
input button, then I should open up

76
00:05:47.000 --> 00:05:51.480
the input or the login screen.
But we would then translate that into our

77
00:05:51.519 --> 00:05:57.399
own tests, where it would be
like tests or it should xyz. So

78
00:05:57.480 --> 00:06:01.279
that's really cool that you can just
take it directly from the user's story or

79
00:06:01.279 --> 00:06:05.040
the user input and make that part
of the test, because it's like,

80
00:06:05.079 --> 00:06:09.839
if you don't meet that criteria exactly, you know there's something wrong with the

81
00:06:09.839 --> 00:06:14.240
code, not the or how it
was defined. Maybe but that's really cool

82
00:06:14.279 --> 00:06:17.120
that you could have that one to
one comparison. Yeah, I mean I

83
00:06:17.120 --> 00:06:20.879
think there's there's huge advantages. I
mean, what what you just described is

84
00:06:21.319 --> 00:06:27.240
is amazing, right, Like the
basically the product development team or the product

85
00:06:27.240 --> 00:06:30.879
management team can kind of have a
one to one bridge right to the engineers.

86
00:06:31.199 --> 00:06:35.000
And what what we also found now
that we have we have this new

87
00:06:35.000 --> 00:06:40.920
developer on, you basically have your
whole infrastructure more or less, you can

88
00:06:40.959 --> 00:06:43.879
say hey, like or if you
know, if they they're asking about what

89
00:06:43.920 --> 00:06:45.920
does this feature do or how does
it work, you say, hey,

90
00:06:46.360 --> 00:06:48.600
don't read the test. Read the
test second, but first read these read

91
00:06:48.639 --> 00:06:51.959
these feature files. It's and then
you can understand, Okay, I see

92
00:06:51.959 --> 00:06:57.399
exactly these user stories in plain English. So that's that's super valuable. So

93
00:06:57.480 --> 00:07:01.199
you keep around the like plain english, verys of these requirements then, so

94
00:07:01.279 --> 00:07:04.600
it's not just the tests that that
live on Yeah, yeah, these are

95
00:07:04.720 --> 00:07:10.079
these are checked right intoto the code
base. So with that said, like

96
00:07:10.519 --> 00:07:15.040
what what page was mentioning, Sometimes
we can write the test directly as they're

97
00:07:15.040 --> 00:07:17.800
written. But but sometimes, I
mean it's it's been a constant learning process

98
00:07:17.800 --> 00:07:21.000
for both of us. I mean
for example, we had features where it

99
00:07:21.040 --> 00:07:24.439
was like, you know, you
have a form, and it's like if

100
00:07:24.480 --> 00:07:28.240
the email is wrong, I see
an email error. If the first names

101
00:07:28.439 --> 00:07:30.680
wrong, I see a first name
air. But I've learned, like,

102
00:07:30.839 --> 00:07:33.279
okay, that should probably just be
like in a unit test for like the

103
00:07:33.600 --> 00:07:39.879
form validation function, right, that
doesn't probably need to be always like you

104
00:07:39.920 --> 00:07:44.079
probably don't need to write every test
in this in this given one men syntax.

105
00:07:44.160 --> 00:07:46.959
It's it's it's kind of like a
pick and choose and it's a constant

106
00:07:46.120 --> 00:07:50.279
like yeah, it's it's a discussion
between between us and the product team.

107
00:07:50.399 --> 00:07:54.240
So it would this be more of
a replacement for like EEDE tests then,

108
00:07:54.399 --> 00:07:58.639
I mean I wouldn't necessarily writing unit
tests this way. I guess you could

109
00:07:58.879 --> 00:08:01.360
like more, Yeah, you're you're
right. That's that's where we've found it's

110
00:08:01.399 --> 00:08:05.639
the easiest, right because end to
end tests are much higher level anyway,

111
00:08:05.759 --> 00:08:09.680
which we're much better with. Like
I press the spot and I go to

112
00:08:09.759 --> 00:08:16.480
the homepage, I find that my
name says Yeah. I've never used this

113
00:08:16.519 --> 00:08:20.600
structure for actually implementing tests before,
but I have used this when working with

114
00:08:20.839 --> 00:08:26.000
like product people before, and the
other kind of nice thing I think about

115
00:08:26.040 --> 00:08:33.159
this format is is it forces product
people to give more specific requirements for things

116
00:08:33.159 --> 00:08:37.320
as well, because I'm sure a
lot of you can resonate with. Sometimes

117
00:08:37.320 --> 00:08:45.600
you'll get these requirements that are like
vague or they have or they're complicated like

118
00:08:46.960 --> 00:08:50.080
yeah, or are they don't yeah
exactly, they don't consider things beyond and

119
00:08:50.120 --> 00:08:52.559
like this sort of forces you to
say, like, Okay, well,

120
00:08:52.600 --> 00:08:56.840
when this happens or this scenario,
when this happens, what should happen?

121
00:08:58.039 --> 00:09:01.759
Right, what happens with these account
types? What happens if they try to

122
00:09:01.759 --> 00:09:05.080
log in and they already have an
account or it's an in veiled email or

123
00:09:05.120 --> 00:09:09.039
the servers down or whatever. Right, So it gives you like a clear

124
00:09:09.720 --> 00:09:13.200
just means of specifying requirements. Yeah, and then and then even better like

125
00:09:13.320 --> 00:09:18.440
when when you do get that feedback, then you still have this these descriptions

126
00:09:18.480 --> 00:09:24.200
and these scenarios for those the unhappy
path or when the service down, given

127
00:09:24.200 --> 00:09:28.120
the surface down, what happens?
So yeah, I think I used this

128
00:09:28.159 --> 00:09:33.000
at a previous job, and I
remember there being like part of was on

129
00:09:33.159 --> 00:09:39.399
us to actually go and build out
like the regular expressions like enable the terminology

130
00:09:39.679 --> 00:09:43.960
like when I do X I see
law and like you kind of like we're

131
00:09:43.000 --> 00:09:48.000
writing regular expressions to match some of
the English terminology of the test. Yeah,

132
00:09:48.039 --> 00:09:52.240
is that you find yourself doing that
a lot already? Is that not

133
00:09:52.240 --> 00:09:54.879
not so much? What do you
mean exactly? Or well, like there

134
00:09:54.879 --> 00:10:00.720
were expression matchers for the terminology in
the test because the terms knowledge is written

135
00:10:00.720 --> 00:10:03.919
in kind of an plain English speaking
style, right when I go to the

136
00:10:03.919 --> 00:10:07.879
page, I ended up actually having
to write like pattern matchers for some of

137
00:10:07.879 --> 00:10:13.679
that stuff. Yeah, it depends, I guess, I'm not sure what

138
00:10:13.799 --> 00:10:18.600
you mean exactly. So do you
mean like the because the given or you

139
00:10:18.639 --> 00:10:20.240
mean the body of the test itself? Like what? Yeah? Yeah,

140
00:10:20.320 --> 00:10:26.480
yeah, yeah, so yeah,
that's we we typically have done. What

141
00:10:26.519 --> 00:10:28.720
we've been using a lot, especially
in these end to end tests, is

142
00:10:28.799 --> 00:10:33.799
just like a test ID if you're
if you're aware with those of those.

143
00:10:35.200 --> 00:10:39.039
So yeah, this the the whole
thing behind test IDs is a bit it's

144
00:10:39.120 --> 00:10:45.320
considered sometimes anti pattern, I guess, but what we realized is because it's

145
00:10:45.360 --> 00:10:50.879
also because the whole kind of startup
environment features could change like two weeks from

146
00:10:50.879 --> 00:10:54.480
now with different even you know,
different UI elements, different texts and and

147
00:10:54.559 --> 00:11:00.480
everything like that. So some of
the other matchers like get get by store.

148
00:11:00.519 --> 00:11:05.240
Yeah, get by elements don't make
so much sense, at least from

149
00:11:05.519 --> 00:11:09.559
from our opinion. So when you
have this test id, Yeah, it's

150
00:11:09.559 --> 00:11:13.480
difficult. I mean sometimes the test
id itself kind of gives way to what

151
00:11:13.519 --> 00:11:18.480
it is, like a button or
at least like a touchable. We're working

152
00:11:18.480 --> 00:11:22.000
and reacting to a touchable opacity.
So one question I have you said,

153
00:11:22.000 --> 00:11:28.519
you do you store a lot of
these requirements in actually in the code base,

154
00:11:28.840 --> 00:11:31.840
So how do you handle like the
location of those especially for things because

155
00:11:31.840 --> 00:11:35.919
occasionally you'll have requirements that aren't specific
to say, like a page, right,

156
00:11:37.120 --> 00:11:39.360
Like they'll have to be like I
do something on one page and then

157
00:11:39.399 --> 00:11:43.440
I go back to another and something
should happen sort of things. I do

158
00:11:43.480 --> 00:11:48.320
you have like app level requirements or
like how like how sort of pedantic do

159
00:11:48.399 --> 00:11:50.679
you get about that? And how
do you sort of handle that sort of

160
00:11:50.720 --> 00:11:54.480
thing? Yeah, that's that's something
we're still working on. So far.

161
00:11:54.600 --> 00:11:58.600
We've we've had like a set usually
you have like five or six of these

162
00:11:58.639 --> 00:12:03.399
feature files per feature. But then
we've also like the engineering team as also

163
00:12:03.799 --> 00:12:09.600
we've kind of designed our own feature
files. Still still to this, which

164
00:12:09.759 --> 00:12:11.480
I could hear, I could hear
a lot of people out there would be

165
00:12:11.480 --> 00:12:15.080
like, well, that's a waste
of time. But it's still going back

166
00:12:15.120 --> 00:12:18.200
to this idea that you have.
You have a catalog of of everything that

167
00:12:18.200 --> 00:12:22.000
that you you're testing in the catalog
of these features. So typically, for

168
00:12:22.039 --> 00:12:26.159
example, like these end to end
tests, we've written ourselves in the Girkin

169
00:12:26.240 --> 00:12:31.919
syntax with which has these kind of
cross you know, multi page stories and

170
00:12:31.240 --> 00:12:35.840
things like that. Yeah, it's
it's difficult to it's difficult to balance that

171
00:12:37.399 --> 00:12:41.360
like some should I explain, because
you can't ask like the product team,

172
00:12:41.720 --> 00:12:46.679
they can't write a feature file probably
for a specific function in your code base,

173
00:12:46.799 --> 00:12:48.399
right, they don't know about it. So it's really uh, it

174
00:12:48.519 --> 00:12:52.840
just comes down to reading, reading
the features and saying, okay, where's

175
00:12:52.879 --> 00:12:56.200
this going to go? More than
more often than not, it's probably going

176
00:12:56.240 --> 00:13:00.919
to go into an integration test or
end to end test. But even then

177
00:13:01.519 --> 00:13:05.039
you may even want to break down
or talk with them say yeah, okay,

178
00:13:05.080 --> 00:13:07.840
let's let's take these scenarios and put
them in a different test or that

179
00:13:07.879 --> 00:13:15.039
actually belongs with a different feature or
grouped with other features. It's quite it's

180
00:13:15.080 --> 00:13:20.279
quite challenging. Actually, I'm not
sure that that's probably a horrible or or

181
00:13:20.600 --> 00:13:24.200
no good answer there, but you
know, because I think everybody struggled.

182
00:13:24.320 --> 00:13:28.879
Yeah, well everybody struggles with this, right, Like I think this is

183
00:13:28.080 --> 00:13:33.279
the just a common thread of software
development no matter what system you use,

184
00:13:33.519 --> 00:13:37.440
like where you put tests and where
how you organize require ements and how you

185
00:13:37.480 --> 00:13:41.200
maintain them over time is a constant
struggle. So if anybody had the magic

186
00:13:41.200 --> 00:13:48.159
bullet answer, we'd all be just
doing that. Yeah, one thing I

187
00:13:48.200 --> 00:13:52.320
can say to that at least is
that we so we have like for our

188
00:13:52.399 --> 00:13:56.159
end to end tests, which are
supposed to be like the least you know,

189
00:13:56.200 --> 00:14:00.039
the top of the pyramid, least
used and whatnot. What we do

190
00:14:00.080 --> 00:14:03.720
you have there is like only the
we call them like business critical stories,

191
00:14:03.799 --> 00:14:07.279
right, so like can a user
check out? Can they do this?

192
00:14:07.399 --> 00:14:11.519
Other? Like typically like so we
have at in club, we have you

193
00:14:11.600 --> 00:14:13.879
can create your own experience of course, like you can put in the title

194
00:14:13.919 --> 00:14:18.519
description these things we have as end
to end tests, because yeah, they're

195
00:14:20.000 --> 00:14:24.679
they're the most important. But in
terms of yeah, in terms of unit

196
00:14:24.720 --> 00:14:28.240
tests and integration tests, well,
currently we're a bit more lax with those,

197
00:14:28.679 --> 00:14:31.360
of course you should, you should
have all your test passing before you

198
00:14:31.399 --> 00:14:35.720
go to to production. But just
in terms of way they're designed, a

199
00:14:35.720 --> 00:14:39.120
lot of a lot more of them
are just written by us, the software

200
00:14:39.120 --> 00:14:45.799
team, and there's not maybe not
a feature file yet for those. So

201
00:14:45.799 --> 00:14:48.320
so that actually leads into my next
question. And you touched on this a

202
00:14:48.360 --> 00:14:54.759
little bit with the testing pyramid,
but how much how many integration and unit

203
00:14:54.799 --> 00:14:58.519
tests would you say you have compared
to your end to end tests. What's

204
00:14:58.559 --> 00:15:03.559
your percentage? Yeah, we we
have. We're kind of weird. The

205
00:15:03.559 --> 00:15:07.039
middle middle of our pyramid is very
fat, so the integration level, and

206
00:15:07.080 --> 00:15:11.919
I think that comes a lot from
like React itself. You can argue maybe

207
00:15:11.960 --> 00:15:16.960
a small component is like a unit
test, but probably in reality you're you're

208
00:15:18.159 --> 00:15:22.960
gonna need something, some component from
somewhere else to test your components. And

209
00:15:22.000 --> 00:15:26.840
and that's the biggest part of our
our code base. I mean, we

210
00:15:26.960 --> 00:15:31.759
have the unit tests we do have
are only for we have only I don't

211
00:15:31.799 --> 00:15:33.879
know a dozen or so, and
those are for our big, like,

212
00:15:33.879 --> 00:15:37.519
our most critical functions. Ideally,
I mean, everybody wants the ideal world

213
00:15:37.519 --> 00:15:41.600
where you have one hundred percent test
coverage. Every function, every component.

214
00:15:41.919 --> 00:15:46.919
Well, okay, maybe we don't
as a software developers, maybe we don't

215
00:15:46.919 --> 00:15:50.480
because we'll go crazy. But yeah, it's so we have. I would

216
00:15:50.480 --> 00:15:54.080
say, how to maybe like fifteen
fifteen percent unit and end to end,

217
00:15:54.120 --> 00:15:58.200
so on the on the two ends, and then the rest is all is

218
00:15:58.240 --> 00:16:02.039
all integration. Yeah, that's just
what we have currently. No, I

219
00:16:02.039 --> 00:16:04.519
think that makes sense. I'm also, like we've had conversations before. We're

220
00:16:04.879 --> 00:16:10.240
we're not on team hundred percent unit
testing coverage here at this on this show,

221
00:16:10.720 --> 00:16:14.960
we're very much pragmatic. And I
think it's even beyond pragmatic because if

222
00:16:15.000 --> 00:16:18.480
you have a goal of one hundred
percent test coverage, that puts in sort

223
00:16:18.519 --> 00:16:22.559
of like weird incentives as well,
like you end up just writing tests just

224
00:16:22.600 --> 00:16:27.600
to do it versus whether it's actually
providing value to you as well. Yeah.

225
00:16:27.679 --> 00:16:30.399
Yeah, and then they get these
meaningless tests and if they break,

226
00:16:30.480 --> 00:16:36.360
you're not quite sure why what are
you testing? What was the intent here?

227
00:16:36.720 --> 00:16:38.240
And all that? Yeah, I
mean well, no, no,

228
00:16:38.320 --> 00:16:41.519
I'm happy to riff on this.
I was going to ask a the IDCD

229
00:16:41.679 --> 00:16:44.120
question, but we'll get there.
No, I was just going to add

230
00:16:44.120 --> 00:16:47.519
one final thought that I mean Your
unit tests are code too. You have

231
00:16:47.559 --> 00:16:49.879
to maintain it. Your requirements are
going to change, they're going to break,

232
00:16:51.200 --> 00:16:53.919
So your test should be doing something
versus just being there. So you

233
00:16:55.000 --> 00:16:59.679
hit the hit the lines of code
to make your your whatever code coverage tool

234
00:16:59.720 --> 00:17:02.480
happen. I think you should always
have some rules, like if we do

235
00:17:02.519 --> 00:17:04.640
a certain type of change, we
don't want a unit test to break.

236
00:17:04.720 --> 00:17:08.640
Like if we if we make a
text change to a button, you don't

237
00:17:08.680 --> 00:17:12.960
want a unit test or any contest
to pass. That sounds like chaos tests

238
00:17:14.160 --> 00:17:18.599
jack, well, you know,
but like if you if you like make

239
00:17:18.839 --> 00:17:22.400
a spelling fix, like that's you
know, come on, yeah, you

240
00:17:22.440 --> 00:17:25.799
know a little I'm talking about like
the little blurbe texts, like you know

241
00:17:26.000 --> 00:17:30.920
the things that snapshot test car here, yes exactly, Yeah, basically just

242
00:17:30.920 --> 00:17:34.000
trying to ward people off of snapshot
testing, like please don't do that.

243
00:17:34.319 --> 00:17:37.160
Well, okay, so Chris c
i CD, So when do you just

244
00:17:37.160 --> 00:17:41.160
to kind of dig into the whole
DevOps thing here? So when do you

245
00:17:41.240 --> 00:17:44.480
run these tests? And how do
you like a headless thing? Do you

246
00:17:44.559 --> 00:17:48.960
run in c CD? All that
very soon we will run them in c

247
00:17:48.160 --> 00:17:52.640
i CD. Okay, but that
that has a lot more to do with

248
00:17:52.640 --> 00:17:57.240
with me being the solo guy,
and I didn't the whole trouble with with

249
00:17:57.359 --> 00:18:04.200
Apple. Building has to be on
a Mac and the only although native Yeah,

250
00:18:04.400 --> 00:18:07.880
yeah, and the tooling is the
tooling is tough, and although Apple

251
00:18:07.960 --> 00:18:12.119
is releasing a cloud. But yeah, I run the test locally before before

252
00:18:12.200 --> 00:18:15.839
release or when we're getting quite close. But that's very soon to be added

253
00:18:17.319 --> 00:18:22.680
now that I have some help from
from our new new developer. But doubled

254
00:18:22.720 --> 00:18:27.319
the engineering team size for us.
But yeah, I think the typical the

255
00:18:27.359 --> 00:18:32.799
path is simply I like to throw
in the the type check that type check's

256
00:18:32.839 --> 00:18:36.599
empty. That's actually my first test, even before unit and then the unit

257
00:18:36.640 --> 00:18:38.759
tests, then integration and then end
to end. When you say type check,

258
00:18:38.799 --> 00:18:45.119
you mean like typescript checking, yes, the ts Yeah, actually we

259
00:18:45.519 --> 00:18:48.759
can. It might be overkill.
That might have been a bit of overkill

260
00:18:48.799 --> 00:18:52.279
from me, but we wrote we
converted ours into a unit check, like

261
00:18:52.519 --> 00:18:56.480
we get the output from TSC and
if it's zero lines, the unit test

262
00:18:56.519 --> 00:19:02.000
passes. So although I I did
that, and then I realized later I

263
00:19:02.000 --> 00:19:03.759
was like, yeah, I could
just run the bash command as part of

264
00:19:03.759 --> 00:19:07.599
the pipeline, Like yeah, I
think it could turn that like into a

265
00:19:07.680 --> 00:19:11.440
husky step too. Yeah. Yeah, so Chris, another article you have

266
00:19:11.680 --> 00:19:18.000
that I think it's kind of interesting
you make the case for one function per

267
00:19:18.119 --> 00:19:22.440
file, which could be potentially controversial. I don't know how the other hosts

268
00:19:22.440 --> 00:19:26.079
feel, but why don't you start
by making the case for this? Why

269
00:19:26.119 --> 00:19:30.160
one function per file? Yeah?
So yeah, I've worked with a lot

270
00:19:30.200 --> 00:19:33.119
of code basis. Typically I think
it's a React pattern. It might be

271
00:19:33.160 --> 00:19:37.200
almost like a legacy React pattern,
is that you'd have, you know,

272
00:19:37.240 --> 00:19:41.359
you'd have a bunch of exports in
one giant file called like I think in

273
00:19:41.440 --> 00:19:44.279
my blog post, I use like
a math as an example, right,

274
00:19:44.319 --> 00:19:48.519
so you could imagine ad subtract divide. Okay, great, but then if

275
00:19:48.559 --> 00:19:52.480
you if you use them first,
you import them and then you've got this

276
00:19:52.640 --> 00:19:56.559
big import from one file. But
the hardest or the most confusing thing for

277
00:19:56.680 --> 00:20:00.079
me from that pattern is that when
you're in this function file, you're looking

278
00:20:00.119 --> 00:20:04.400
all over the place and jumping around
and I don't know. I like,

279
00:20:04.720 --> 00:20:08.559
if I open a file, it's
just I can see hopefully if the function

280
00:20:08.680 --> 00:20:14.200
is well organized, should all fit
right on the screen, right, And

281
00:20:14.200 --> 00:20:17.759
then I have it and The idea
there and how it relates to testing,

282
00:20:17.839 --> 00:20:22.039
is that when you do a unit
test, you import this file and that's

283
00:20:22.039 --> 00:20:26.359
basically other than all your test tooling, that should be the only file from

284
00:20:26.400 --> 00:20:29.920
your codebase that you're importing. And
then you're sure that at least in a

285
00:20:30.000 --> 00:20:33.759
unit sense, this is like what's
under test, like this single thing in

286
00:20:33.799 --> 00:20:37.480
my code base. Yeah, I'm
trying to decide if I like it or

287
00:20:37.559 --> 00:20:40.839
not. In my head, I'm
going to go with dislike. I mean,

288
00:20:40.839 --> 00:20:47.039
I can imagine at least maybe as
a compromise, like one exposed function,

289
00:20:47.319 --> 00:20:52.680
like because I definitely do things where
I hide like internal stuff as if

290
00:20:52.720 --> 00:20:56.920
somehow add in the math context we're
a complex thing to do or something.

291
00:20:56.240 --> 00:21:00.119
Well, but you could argue you
could make a function within a function a

292
00:21:00.200 --> 00:21:04.079
JavaScript, you can throw functions anywhere. Okay, sure, don't do that

293
00:21:04.119 --> 00:21:08.279
in a React component. I've seen
that before, people making like subcomponents inside

294
00:21:08.319 --> 00:21:11.400
inside of the declaration of a function
component. That is bad, Like,

295
00:21:11.480 --> 00:21:15.359
do not don't do that. Sure, I'll actually mess up React if you

296
00:21:15.400 --> 00:21:18.759
do that. But in math,
if your math, if your function needed

297
00:21:18.799 --> 00:21:22.400
to do some like repetitive thing over
and over again, you could do that.

298
00:21:23.119 --> 00:21:27.759
In my My argument was, if
you had this sort of math function,

299
00:21:27.920 --> 00:21:32.519
you can organize them by the file
name and the subfolder, so like

300
00:21:32.680 --> 00:21:37.759
math slash ad math slash subtract.
Yep, Okay, I maybe I'm like

301
00:21:37.920 --> 00:21:41.160
I suspect I'm in a small minority. Yeah, it just feels like a

302
00:21:41.200 --> 00:21:47.079
lot of files to keep track up
instead of just one that has all of

303
00:21:47.119 --> 00:21:52.240
your related functions together. Yeah.
I feel like now I'm just bringing up

304
00:21:52.319 --> 00:21:57.440
like a bringing up like a code
base and looking around because I don't know,

305
00:21:57.519 --> 00:22:02.599
like dread my good base at the
same time, Like I can see

306
00:22:02.640 --> 00:22:06.960
though, like I do, even
if I don't totally agree with one function

307
00:22:07.079 --> 00:22:11.440
per file, like definitely, like
it's definitely an anti pattern to be building

308
00:22:11.440 --> 00:22:17.480
like these monstrosity files that I think
most of us have worked on, right,

309
00:22:17.640 --> 00:22:22.079
Like even if like we maybe can't
get on board fully with swimming things

310
00:22:22.079 --> 00:22:25.839
down to one function like once your
file, like I've had I've worked at

311
00:22:25.839 --> 00:22:29.960
places where we had rules that like
once you reached a file reached a certain

312
00:22:30.000 --> 00:22:32.880
number of lines, it would spit
out some sort of warning, right like

313
00:22:33.640 --> 00:22:37.000
you're you're over like three hundred lines
in this file, Like are you are

314
00:22:37.039 --> 00:22:41.240
you sure you want to keep Are
you sure you want to keep going the

315
00:22:41.359 --> 00:22:45.880
RB dragons. I just refactored a
graph you OL server file that I had.

316
00:22:47.279 --> 00:22:55.799
There's twenty four hundred lines. Oh
my god. I remember you might

317
00:22:55.799 --> 00:23:00.440
want to consider this one function per
file, right, But now I understand

318
00:23:00.440 --> 00:23:06.319
like why he says his unit his
integration tests are so large because if an

319
00:23:06.319 --> 00:23:10.559
integration test is defined by a test, because integration tests are a weird definition

320
00:23:10.599 --> 00:23:14.000
anyway, but if it's defined by
a test that includes more than one file,

321
00:23:14.319 --> 00:23:17.359
then yeah, no, man,
if you have one function for file,

322
00:23:17.440 --> 00:23:21.200
like ninety percent of your tests are
going to span across multiple files.

323
00:23:21.200 --> 00:23:26.720
Somehow, It's true, very controversial. I would say, yeah, yeah,

324
00:23:26.839 --> 00:23:30.839
it may have been just my reaction
to seeing I've also worked with some

325
00:23:30.880 --> 00:23:34.359
of these giant files and I just
said, nope, nope, just keep

326
00:23:34.400 --> 00:23:37.880
it simple. One per file.
That's my rule. Yeah, we'll see.

327
00:23:37.880 --> 00:23:42.160
Maybe we also have to refactor some
of our functions. I look at

328
00:23:42.160 --> 00:23:47.240
me that if you hit command P
and so you're now searching around on files

329
00:23:47.279 --> 00:23:51.000
in VS code, different IDs have
never ones. But if you're doing command

330
00:23:51.000 --> 00:23:53.680
P, then an you type an
AD, right, you'd get if you

331
00:23:53.720 --> 00:23:57.720
have one one function of or file. You get it, that's that's kind

332
00:23:57.720 --> 00:24:02.279
of cool, as long as okay, don't do the thing you have like

333
00:24:02.319 --> 00:24:07.160
an ad directory like slash mask slash
ads slash index Oh no, no,

334
00:24:07.240 --> 00:24:12.279
index imglentation and then index that'sc or
test dot Oh god no, then you

335
00:24:12.400 --> 00:24:18.279
a billion indexes. So, Chris, when you joined the company that you're

336
00:24:18.319 --> 00:24:22.039
working for, now, was it
completely greenfield where you just got to build

337
00:24:22.039 --> 00:24:26.640
this app from scratch and make all
the design decisions, the architecture decisions,

338
00:24:26.839 --> 00:24:32.279
what libraries were using, what stack
or was there something that you inherited that

339
00:24:32.319 --> 00:24:36.359
you kind of had to take and
build off of. It was it was

340
00:24:36.400 --> 00:24:41.640
definitely inherited, and it actually was
a lot of what Jack just mentioned infinite

341
00:24:41.720 --> 00:24:47.319
index JS files. Uh, that's
yeah, that's also that's part of why

342
00:24:47.319 --> 00:24:51.839
I went to that this one file
one function for file pattern. But in

343
00:24:51.880 --> 00:24:56.400
the other the other struggle, at
least from a from a JavaScript or now

344
00:24:56.519 --> 00:25:00.960
typescript perspective, is that they had
it was a weird mix of there was

345
00:25:00.039 --> 00:25:07.200
I was seeing typescript syntax with with
JS file extensions and everything in between.

346
00:25:07.359 --> 00:25:11.079
And actually, that's that's something nice
we've we've achieved very recently is there's no

347
00:25:11.160 --> 00:25:15.599
more typescript theres in the entire code
base. It took a long time,

348
00:25:15.119 --> 00:25:19.039
but we've finally gotten there. And
now it's great because you can, for

349
00:25:19.079 --> 00:25:23.880
example, like we just upgraded a
package. Then you just run TSC and

350
00:25:23.880 --> 00:25:26.920
you say, okay, they changed. You know, of course you read

351
00:25:26.960 --> 00:25:32.359
the documentation, but you find immediately
where in the codebase that that the changes

352
00:25:32.400 --> 00:25:34.920
are. And so these types don't
work here. Before when when we had

353
00:25:34.960 --> 00:25:38.960
five hundred typescript theres anyway, they
were just lost in a sea of like

354
00:25:40.279 --> 00:25:45.559
confused and you don't know, you
don't know where there's like errors hiding.

355
00:25:45.839 --> 00:25:48.759
See I was. It was a
big takeover. And of course there were

356
00:25:48.759 --> 00:25:52.799
also no tests written. And I
still think tests in general are kind of

357
00:25:53.119 --> 00:25:56.680
I might be biased from my own
experience. It was one of the last

358
00:25:56.720 --> 00:26:00.200
things that I kind of learned and
I'm still learning as a software engineer,

359
00:26:00.200 --> 00:26:04.039
but I think it's a lot of
because we all like to when we test,

360
00:26:04.119 --> 00:26:07.599
we'd like to run just run the
app or click around and use it

361
00:26:07.599 --> 00:26:11.759
ourselves. Right, That's like it's
kind of the natural, your natural way

362
00:26:11.799 --> 00:26:15.519
to go. But but I really
see now the value of having automated tests

363
00:26:15.519 --> 00:26:21.000
and it gives you security and we're
not not security, but a better feeling

364
00:26:21.039 --> 00:26:23.880
about what you're shipping to. Just
another layer layer of uh yeah, of

365
00:26:26.039 --> 00:26:30.240
keep in mind. Yeah, yeah, definitely. Yeah, you can always

366
00:26:30.240 --> 00:26:33.920
get down to zero warnings and zero
well zero error is for sure, but

367
00:26:34.079 --> 00:26:38.440
zero warnings because otherwise, yeah,
it's just it's white noise and people have

368
00:26:38.440 --> 00:26:44.880
taken ord after a while, you
know, you know, and then yeah,

369
00:26:45.319 --> 00:26:49.160
yeah, oh no, nobody touched
that function because if we touch it

370
00:26:49.279 --> 00:26:57.119
or change it, you know,
nobody knows what happens. Yeah. So,

371
00:26:57.200 --> 00:27:02.359
Chris, do you have any other
tips there from being like a solo

372
00:27:02.680 --> 00:27:07.119
developer starting on like a big project
like this, do you have like any

373
00:27:07.359 --> 00:27:11.319
any other thoughts or people things people
might find interesting from going just going through

374
00:27:11.319 --> 00:27:15.519
that experience. I think I think
the best thing you can do is just

375
00:27:15.759 --> 00:27:19.359
to I want to say, write
one function pro file, but no really

376
00:27:21.160 --> 00:27:25.680
it's uh, the best thing you
can do is try and be organized or

377
00:27:25.759 --> 00:27:29.400
right right code. That's you know, thinking about this, like this file

378
00:27:29.599 --> 00:27:32.920
length limit. That's almost true,
especially when you work alone, you can't

379
00:27:32.920 --> 00:27:40.359
really afford to have these big complex
functions and components and even on a bigger

380
00:27:40.400 --> 00:27:42.079
team, you probably shouldn't. So
I think my number one advice would be

381
00:27:42.319 --> 00:27:48.519
to try and write code that's like
small and manage in small, manageable parts

382
00:27:48.640 --> 00:27:52.880
that work together. Yeah. I
think I can definitely see that because if

383
00:27:52.880 --> 00:27:56.799
I'm left to myself, if I'm
coding by myself, I definitely have a

384
00:27:56.799 --> 00:28:00.839
different mode right where I'm far more
willing to just go this. This is

385
00:28:00.920 --> 00:28:03.799
the wild West, right. I
have my giant function. I know what

386
00:28:03.880 --> 00:28:07.839
it does, does what it needs
to do right, and I don't think

387
00:28:07.839 --> 00:28:11.119
about it too much. Whereas if
I'm working on a team, I'll approach

388
00:28:11.160 --> 00:28:15.000
it like, well, okay,
page is going to see this and have

389
00:28:15.039 --> 00:28:18.920
to figure out what it's going to
do and how that's going to work,

390
00:28:18.039 --> 00:28:22.799
So I might think about it a
little bit more. So I think I

391
00:28:22.880 --> 00:28:26.920
would struggle in that role just because
I don't know my my apps would fall

392
00:28:26.960 --> 00:28:30.519
apart at scale because I would just
be lazy about it. Yeah, I

393
00:28:30.519 --> 00:28:33.359
mean I had to fight the same
thing too, right, But but the

394
00:28:33.400 --> 00:28:37.240
hope I kept in mind, I
was like, yeah, soon soon there

395
00:28:37.240 --> 00:28:40.480
will be someone on the team,
you know, you know, with the

396
00:28:40.559 --> 00:28:42.200
vision that that we're growing. I
mean, we are. We are growing

397
00:28:42.240 --> 00:28:47.960
slowly too, but the division that
more people, more engineers will be writing

398
00:28:48.000 --> 00:28:51.319
on this codebase. So yeah,
yeah. Every time i'm ass to value

399
00:28:51.319 --> 00:28:53.319
about a codebased and it's a single
coder on it and it's been there for

400
00:28:53.480 --> 00:28:57.960
a year or so over a year, I'm like, oh, that's going

401
00:28:59.000 --> 00:29:02.400
to be, that's gonna be somewhere's
weird stuff going on there. Yeah,

402
00:29:02.720 --> 00:29:07.240
single engineer or also like contractor written. That's That's been the other red flag

403
00:29:07.279 --> 00:29:11.880
for me too. Oh yeah,
just because when someone's not accountable to the

404
00:29:11.880 --> 00:29:15.519
team, right, they just just
somebody just has to see something working to

405
00:29:15.599 --> 00:29:22.079
sign off on it. Then things
can often get hairy. I would be

406
00:29:22.119 --> 00:29:26.839
a strong fan of the single function
profile if I was a contractor in getting

407
00:29:26.839 --> 00:29:33.519
paid per file. There you go, I'll do it, yeah, exactly

408
00:29:33.160 --> 00:29:38.960
at one constant profile. Awesome,
Well, Chris, have we We've covered

409
00:29:38.960 --> 00:29:44.240
a lot of ground? Is there
anything we've missed, Like any articles you've

410
00:29:44.240 --> 00:29:47.880
covered, any topics that that we
haven't got into that you you wanted to

411
00:29:47.880 --> 00:29:51.640
discuss it all. I think one
thing I was going to mention before we

412
00:29:51.680 --> 00:29:56.480
got into the whole ci CD and
the function pro file discussion, a huge

413
00:29:56.519 --> 00:30:00.920
thing that we've learned or it's quite
simple really is like, because you know

414
00:30:00.960 --> 00:30:03.599
we're talking about all these tests.
You have all your tests, they pass

415
00:30:03.720 --> 00:30:07.240
great, but most often, of
course, bugs are either like super weird

416
00:30:07.480 --> 00:30:11.880
or user reported that nobody expect or
saw. And one of the best kind

417
00:30:11.920 --> 00:30:15.240
of patterns that we've done is like, Okay, we get a critical bug

418
00:30:15.319 --> 00:30:21.359
or either a very weird bug or
something. Then you write a test specifically

419
00:30:21.359 --> 00:30:23.920
against that bug. It maybe it
wasn't in your feature files, wasn't in

420
00:30:23.960 --> 00:30:27.839
your specifications, but write a test
against that bug or fix the bug,

421
00:30:27.880 --> 00:30:32.000
of course, and then write a
test against it to kind of make sure

422
00:30:32.000 --> 00:30:34.519
that it doesn't come back right that
it doesn't. There's no limits. Agree

423
00:30:34.519 --> 00:30:37.279
on that one. Sure, So
yeah, that's one thing I forgot to

424
00:30:37.319 --> 00:30:41.920
mention. But that's I mean,
even that might even be if you want

425
00:30:41.960 --> 00:30:45.319
to if your work somewhere and maybe
your organization has no test yet, that

426
00:30:45.400 --> 00:30:48.680
may be one of the first places
to go or the easiest way to start

427
00:30:48.680 --> 00:30:51.599
writing tests. Yeah, it's also
very satisfying if you can get it,

428
00:30:51.680 --> 00:30:53.920
like get it to show up as
red and then you implement a fix and

429
00:30:53.960 --> 00:30:57.240
then feel confident to like get to
see it switch over. It's very it's

430
00:30:57.240 --> 00:31:04.079
a very satisfying feeling too exactly.
Yeah, cool, what's been awesome chatting

431
00:31:04.079 --> 00:31:07.319
with you. I think we can
move on to our picks. So it's

432
00:31:07.400 --> 00:31:12.200
where we just pick something movies,
TV show music. We're still waiting for

433
00:31:12.240 --> 00:31:17.119
somebody to have a strong musical take. The do a lot of TV shows.

434
00:31:17.400 --> 00:31:19.160
But Jack, do you want to
kick us off today? Yeah?

435
00:31:19.200 --> 00:31:22.960
Sure, we're not. My daughter
and I just finished up the UCS Millennium

436
00:31:22.960 --> 00:31:26.960
Falcon build, which is I like, it's a Lego build. It's just

437
00:31:29.079 --> 00:31:33.039
enormously huge, you know, it's
like, I think seven thousand parts and

438
00:31:34.920 --> 00:31:40.200
epic. Yeah. How long did
that take? We're kind of old hands

439
00:31:40.200 --> 00:31:42.720
at the Lego thing, so it
took us three and a half four days.

440
00:31:45.079 --> 00:31:48.559
Wow, But it was you know, it was we basically traded off

441
00:31:48.680 --> 00:31:52.559
on it and it was fun.
You know. So if you're into that

442
00:31:52.599 --> 00:31:55.519
sort of thing, it's a it's
a fun build. I will say that

443
00:31:55.799 --> 00:31:59.160
if you are into movie speak.
It has a lot of us called greebles,

444
00:31:59.599 --> 00:32:01.519
which are just basically little things that
you put on something to make it

445
00:32:01.599 --> 00:32:05.960
visually interesting. So there's just a
lot of stuff on there, just like

446
00:32:06.000 --> 00:32:08.559
it doesn't. I'm actually not functional. It's just kind of stuck on and

447
00:32:08.599 --> 00:32:12.279
it's just a lot of that,
like you build a structural piece and then

448
00:32:12.279 --> 00:32:15.799
it's like a bunch of like just
add a lot of little bits of Yeah,

449
00:32:15.839 --> 00:32:19.279
it's fun, awesome, cool page. What picks do you have?

450
00:32:19.759 --> 00:32:22.759
My pick for this week is going
to continue on the kitchen tools train.

451
00:32:23.160 --> 00:32:30.240
So this is a plastic wrap dispenser. So normally when you get plastic wrap,

452
00:32:30.240 --> 00:32:34.799
it comes in those those cardboard boxes. The little cutters not very good

453
00:32:34.920 --> 00:32:37.039
if there is a cutter at all, or just rips and terrors and stuff.

454
00:32:37.319 --> 00:32:44.200
So we bought a bamboo wooden food
dispenser. It comes with a really

455
00:32:44.319 --> 00:32:49.200
nice little top cutter and it works
like a charm. It's really heavy so

456
00:32:49.279 --> 00:32:52.640
you can just pull the wrap.
It doesn't slide across the table after you.

457
00:32:52.720 --> 00:32:55.640
The cutter works really well. So
I would definitely recommend that if you

458
00:32:55.720 --> 00:33:00.920
have twenty dollars to spend, get
one of these things and you'll probably never

459
00:33:00.279 --> 00:33:05.519
need another one. I've probably seen
one of these bike behind a sushi bar

460
00:33:05.640 --> 00:33:09.160
or something when they're like making the
rolls. Yeah kind of thing. Yeah,

461
00:33:09.200 --> 00:33:12.799
awesome. My pick this week is
going to be a weird one,

462
00:33:13.160 --> 00:33:15.279
kind of a very specific one.
But I'm going to pick Amazon Go,

463
00:33:15.799 --> 00:33:19.720
which I don't know if any of
you have went to one of these stores

464
00:33:19.759 --> 00:33:22.680
before, but you'd have to be
in either Seattle, Chicago, or New

465
00:33:22.799 --> 00:33:27.039
York. So that's why it's a
very specific pick. But there are these

466
00:33:27.079 --> 00:33:31.920
stores by Amazon where their core tech
is there's no checkout, you just grab

467
00:33:32.440 --> 00:33:36.799
you at the door. You go
in, there's these turnstiles and you scan

468
00:33:36.920 --> 00:33:40.039
your phone in the Amazon app,
so it knows who you are, You

469
00:33:40.079 --> 00:33:44.599
grab whatever you're going to buy,
and then you just leave. And the

470
00:33:44.880 --> 00:33:47.359
system there is smart enough. There's
cameras. The entire ceiling is covered with

471
00:33:47.400 --> 00:33:52.880
these cameras and you just get a
notification on your phone a few minutes after

472
00:33:52.000 --> 00:33:57.119
you walk out with just a receipt
of what you bought. And I'm picking

473
00:33:57.119 --> 00:34:00.000
you just because if you're in the
area. It's just fascinating to do because

474
00:34:00.000 --> 00:34:04.000
because it's it's just such a weird
experience, right, like you feel very

475
00:34:04.319 --> 00:34:07.079
very strange, like you feel like
you're actually committing a crime when you walk

476
00:34:07.119 --> 00:34:10.280
out of the place. And for
me too, we went with the whole

477
00:34:10.280 --> 00:34:14.039
family. So you go in as
a group, and I was just amazed

478
00:34:14.079 --> 00:34:16.639
at the technology because we said,
we had two eleven year old kids,

479
00:34:16.679 --> 00:34:20.760
right, so of course they're just
grabbing things off the shelves, putting it

480
00:34:20.920 --> 00:34:23.239
on and off, you know,
walking around whatever. And sure enough,

481
00:34:23.280 --> 00:34:27.039
we bought like five or six things
between the four of us, and it

482
00:34:27.239 --> 00:34:30.000
perfectly knew exactly what we bought,
charged us perfectly, and I was just

483
00:34:30.199 --> 00:34:32.639
kind of amazed by it. So
if you're ever in the area, for

484
00:34:32.679 --> 00:34:36.559
if you're a listener in one of
those those three areas, it's it's worth

485
00:34:36.639 --> 00:34:39.199
doing ones just to experience it.
Is there any security there? Can you

486
00:34:39.280 --> 00:34:43.800
just like just walk out? You
literally walk out there? There was not

487
00:34:43.880 --> 00:34:46.440
another There was not a human employee
in the store. There might be somebody

488
00:34:46.519 --> 00:34:49.719
like in the back or something for
all I know, but we did not

489
00:34:49.760 --> 00:34:55.159
see in a single employee. It's
kind of crazy awesome. So, Chris,

490
00:34:55.199 --> 00:34:59.719
what picks do you have? I
guess I'll do the two books.

491
00:35:00.159 --> 00:35:02.760
The first, I guess this is
quite relevant. It's uh, we've we've

492
00:35:02.760 --> 00:35:07.400
all read it on the team.
It's The Lean Startup by Eric I think

493
00:35:07.519 --> 00:35:10.719
Rice you pronounced it his last name. It's quite interesting and yeah, there's

494
00:35:10.760 --> 00:35:15.599
a lot of good stuff packed in
there. So yeah, that that's my

495
00:35:15.679 --> 00:35:17.639
first and then I guess, well, the second is a series of books,

496
00:35:17.840 --> 00:35:22.599
the Foundation Series by Isaiah I guess
it's it's made a kind of a

497
00:35:22.639 --> 00:35:28.519
resurgence recently because I think Apple did
a series on it or something. But

498
00:35:28.599 --> 00:35:31.840
yeah, Apple, the books are
awesome. I recommend to read the books

499
00:35:32.039 --> 00:35:37.039
first because it seems like an unfilmable
show and it kind of was. Actually

500
00:35:39.199 --> 00:35:43.920
is. It's a science fiction Oh
yeah, okay, I'll have to check

501
00:35:43.960 --> 00:35:46.920
this out. Cool. Well,
Chris, last question for you. If

502
00:35:46.920 --> 00:35:51.920
people want to follow you, what
so, what's the best place to to

503
00:35:51.920 --> 00:35:54.719
do that sort of thing? I
guess the easiest is just my blog.

504
00:35:54.960 --> 00:36:00.039
It's uh, it's Chris Frew dot
I N And I think from there you

505
00:36:00.079 --> 00:36:04.880
can find find me anywhere. I
am trying to get back to making YouTube

506
00:36:04.920 --> 00:36:08.559
videos, but I've been extremely busy
with the startup. But I hope this

507
00:36:09.239 --> 00:36:13.719
Yeah so cool. Well, thanks
so much for joining us. It's a

508
00:36:13.800 --> 00:36:15.440
lot of fun to chat. Yeah, thanks a lot. It's really fun.

509
00:36:15.559 --> 00:36:20.800
Cool And then until next week,
everybody, alright, see them Bye.

