1
00:00:00,480 --> 00:00:05,340
Well, we actually have recorded an episode already this week, so we don't have any news,

2
00:00:05,700 --> 00:00:09,400
but we've got just another guest on to talk about.

3
00:00:10,060 --> 00:00:16,960
I forget when it came out, but the second edition of his Spring Boot book, Learning Spring Boot,

4
00:00:17,120 --> 00:00:17,820
I think it's called.

5
00:00:18,260 --> 00:00:19,800
But why don't you introduce yourself, guest?

6
00:00:20,900 --> 00:00:22,780
Ah, hello, everybody.

7
00:00:22,920 --> 00:00:25,700
My name's Greg Turnquist, and I'll throw it out there.

8
00:00:25,700 --> 00:00:30,720
It's Greg L. Turnquist, because there's actually another Greg Turnquist, amazingly, that writes software,

9
00:00:30,940 --> 00:00:32,260
and so I have to put that on all my books.

10
00:00:33,140 --> 00:00:34,180
What's the L for?

11
00:00:35,100 --> 00:00:36,220
L is for Lee.

12
00:00:36,640 --> 00:00:38,040
Lee. Very nice.

13
00:00:38,500 --> 00:00:41,080
Is Lee short for anything, or is that just its own thing?

14
00:00:41,600 --> 00:00:42,660
Not to my awareness.

15
00:00:43,360 --> 00:00:45,020
I'll have to look up the origin of that name.

16
00:00:45,060 --> 00:00:49,420
I never thought about it until now, but that's kind of a weird name, Lee.

17
00:00:50,040 --> 00:00:53,380
I mean, we all take it for granted, but I wonder where it comes from.

18
00:00:53,880 --> 00:00:58,920
I mean, you know, not that it reflects weirdness on you, just words, right?

19
00:00:59,000 --> 00:00:59,640
They're crazy.

20
00:00:59,860 --> 00:01:00,400
Am I right?

21
00:01:01,900 --> 00:01:03,080
What's your middle name, Coté?

22
00:01:03,340 --> 00:01:03,820
Richard.

23
00:01:05,020 --> 00:01:06,020
No, it's not.

24
00:01:06,200 --> 00:01:06,680
It is.

25
00:01:07,040 --> 00:01:07,300
Yeah.

26
00:01:07,460 --> 00:01:08,420
Get out of here.

27
00:01:08,480 --> 00:01:09,600
I never thought about that either.

28
00:01:09,840 --> 00:01:12,240
Obviously, I don't think about middle names very much.

29
00:01:12,380 --> 00:01:13,160
No, it is Richard.

30
00:01:13,600 --> 00:01:15,480
Michael Richard Coté Jr.

31
00:01:15,760 --> 00:01:18,240
The name that was so good, it was used again.

32
00:01:19,580 --> 00:01:22,820
Wow, our merger continues to succeed here.

33
00:01:22,820 --> 00:01:23,500
This is amazing.

34
00:01:23,740 --> 00:01:23,980
Yeah.

35
00:01:24,080 --> 00:01:30,000
I have a little belt buckle I got from my dad that says MRC on it, but sadly, it's from

36
00:01:30,000 --> 00:01:34,820
the era where belts were like, you know, two centimeters wide, so it doesn't really fit

37
00:01:34,820 --> 00:01:36,400
on anything that I have.

38
00:01:37,920 --> 00:01:40,520
It's also gold, which I've been told is not my color.

39
00:01:41,060 --> 00:01:41,940
I should not wear gold.

40
00:01:42,200 --> 00:01:43,240
Are you a silver man?

41
00:01:43,400 --> 00:01:43,960
I guess so.

42
00:01:44,180 --> 00:01:44,460
Yes.

43
00:01:44,660 --> 00:01:45,060
Silver.

44
00:01:45,760 --> 00:01:46,240
Got it.

45
00:01:46,560 --> 00:01:48,620
Maybe when I retire, I'll ease into that.

46
00:01:48,680 --> 00:01:51,740
You know that look that people have where suddenly they're just like, I'm going to wear a lot

47
00:01:51,740 --> 00:01:52,400
of turquoise?

48
00:01:53,240 --> 00:01:54,840
I wonder if that would pan out.

49
00:01:55,620 --> 00:01:56,440
I could see that.

50
00:01:56,560 --> 00:01:57,440
I could see that.

51
00:01:57,620 --> 00:01:57,820
Yeah.

52
00:01:58,200 --> 00:02:04,060
I mean, yesterday's podcast, it's the member's only jacket and the pressed pants and the gold

53
00:02:04,060 --> 00:02:04,300
buckle.

54
00:02:04,540 --> 00:02:04,820
Yeah.

55
00:02:05,240 --> 00:02:05,640
Yeah.

56
00:02:06,000 --> 00:02:08,080
Gold buckle, some turquoise, maybe get a bolo.

57
00:02:08,740 --> 00:02:11,040
Next thing you know, I'm like that Langmuir guy.

58
00:02:11,360 --> 00:02:12,260
How do you say it anyways?

59
00:02:12,860 --> 00:02:16,520
It's solving crimes in Montana or Tucson or something.

60
00:02:17,160 --> 00:02:20,780
Well, so back to the topic at hand.

61
00:02:21,480 --> 00:02:24,300
So the second edition, when did this book come out?

62
00:02:24,580 --> 00:02:26,640
Probably about 12 days ago.

63
00:02:26,760 --> 00:02:27,560
12 days ago.

64
00:02:27,760 --> 00:02:29,920
And you have a video companion with it?

65
00:02:30,240 --> 00:02:31,100
Like, is that right?

66
00:02:31,120 --> 00:02:31,920
Well, I have a video.

67
00:02:32,200 --> 00:02:33,280
Companion's kind of loose.

68
00:02:33,280 --> 00:02:38,980
I contracted to do this book and the video at about the same time, but the video came out

69
00:02:38,980 --> 00:02:42,620
about a year ago and it's against, the video is against boot 1.5.

70
00:02:42,920 --> 00:02:48,980
The book is against spring boot 2.0 with the extra wrinkle that the whole thing is written

71
00:02:48,980 --> 00:02:50,960
with the project reactor paradigm.

72
00:02:50,960 --> 00:02:54,020
And there's just nothing else on the market like that today.

73
00:02:55,300 --> 00:02:55,740
Cool.

74
00:02:55,980 --> 00:02:56,120
Yeah.

75
00:02:56,140 --> 00:03:00,220
I mean, that's gotta be wild to be writing a book about technology that's not yet shipped,

76
00:03:00,620 --> 00:03:00,780
right?

77
00:03:00,840 --> 00:03:02,760
Because boot 2.0 is not released yet.

78
00:03:02,760 --> 00:03:06,860
So how do you, how do you go about doing that besides the fact that you have lots of insider

79
00:03:06,860 --> 00:03:07,400
access?

80
00:03:08,040 --> 00:03:12,140
Well, now you're looking at the reason it took me to write over a, over a year spent writing

81
00:03:12,140 --> 00:03:16,140
a book that for my publisher, they typically turn around stuff in six months.

82
00:03:16,700 --> 00:03:22,120
So, um, it's actually released against spring boot 2.0 M5.

83
00:03:25,900 --> 00:03:26,660
Cloud in it.

84
00:03:26,700 --> 00:03:30,880
It has spring clouds, eventually M3 milestone release on it.

85
00:03:31,020 --> 00:03:35,180
And all that stuff, all the different, uh, tools that stuff you probably talked about in

86
00:03:35,180 --> 00:03:37,260
past episodes, it all works together pretty nicely.

87
00:03:37,260 --> 00:03:42,780
Like spring security, spring framework, spring data, spring session, reactor.

88
00:03:44,100 --> 00:03:44,680
That's cool.

89
00:03:44,820 --> 00:03:46,780
Who is, who'd you write this for?

90
00:03:47,280 --> 00:03:48,360
I mean, who is the target audience?

91
00:03:48,440 --> 00:03:55,240
Uh, um, um, well, oh, uh, I wrote it for, um, basically, you know, are you, you know, if

92
00:03:55,240 --> 00:03:58,740
you're already familiar with Java to some degree, uh, you know, this book is for you.

93
00:03:58,840 --> 00:04:02,060
If you've used spring in the past, I think you'll find it really handy as well.

94
00:04:02,620 --> 00:04:06,540
Well, there's, I've gone to conferences and ran into people that were absolutely familiar

95
00:04:06,540 --> 00:04:09,900
with spring framework, but still had not dipped their toes into spring boot yet.

96
00:04:09,900 --> 00:04:11,920
And they're kind of like, you can do all that with boot.

97
00:04:12,000 --> 00:04:12,320
Wow.

98
00:04:13,200 --> 00:04:15,340
So it's like, here you go, grab this book.

99
00:04:15,420 --> 00:04:17,300
It's very practically oriented.

100
00:04:17,300 --> 00:04:21,860
So we don't, you know, dive into real deep esoteric stuff, but instead let's put together

101
00:04:21,860 --> 00:04:24,820
a practical application and run with it.

102
00:04:25,560 --> 00:04:25,920
Yeah.

103
00:04:26,020 --> 00:04:27,100
I mean, give me your boot pitch.

104
00:04:27,420 --> 00:04:31,220
So for that person that you bump into at a conference who says, yeah, yeah, I like spring

105
00:04:31,220 --> 00:04:31,620
framework.

106
00:04:31,620 --> 00:04:32,960
I love dependency injection.

107
00:04:33,240 --> 00:04:37,040
You know, I don't need your, your highfalutin opinionated framework stuff.

108
00:04:37,200 --> 00:04:38,800
I mean, give me the boot pitch.

109
00:04:38,800 --> 00:04:42,200
What does that add to a developer who's maybe even new to spring, but let alone someone who

110
00:04:42,200 --> 00:04:44,140
maybe uses spring framework, but hasn't tried it yet?

111
00:04:45,220 --> 00:04:47,440
Well, I think Phil Webb has said it best.

112
00:04:47,520 --> 00:04:51,960
You can think of spring framework is like a handful of ingredients and spring boot is like

113
00:04:51,960 --> 00:04:53,180
a pre-baked cake.

114
00:04:53,420 --> 00:04:57,940
So here's a cake and in, in 30 seconds, you can have a cake and right in front of you.

115
00:04:58,000 --> 00:04:59,180
And then what do you want to do?

116
00:04:59,200 --> 00:05:00,260
You want to tweak the frosting.

117
00:05:00,380 --> 00:05:02,040
You want to alter how many layers it has.

118
00:05:02,100 --> 00:05:06,060
Do you want to swap in an alternative recipe for the cake itself?

119
00:05:06,060 --> 00:05:10,740
You know, start putting in your own stuff and the, the defaults back away automatically.

120
00:05:10,740 --> 00:05:14,580
And it just, you know, boom, you're, you're working with operational stuff, right, right

121
00:05:14,580 --> 00:05:17,020
off the, right off the assembly line.

122
00:05:17,600 --> 00:05:18,640
So give me an example.

123
00:05:18,860 --> 00:05:19,520
Yeah, yeah, exactly.

124
00:05:19,540 --> 00:05:20,720
I was going to say for like a web app.

125
00:05:20,960 --> 00:05:21,260
So, right.

126
00:05:21,300 --> 00:05:23,200
We're building, I'm building a restful web service.

127
00:05:23,320 --> 00:05:27,040
What does boot give me that I wouldn't just have out of the box when I start using spring

128
00:05:27,040 --> 00:05:27,440
framework?

129
00:05:28,840 --> 00:05:29,200
Okay.

130
00:05:29,380 --> 00:05:33,900
Well, you start off with the, if you go to the website, start.spring.io, it's basically

131
00:05:33,900 --> 00:05:34,440
a checklist.

132
00:05:34,440 --> 00:05:38,140
And you say, I want, I want rest on the backend.

133
00:05:38,280 --> 00:05:41,940
I'm going to use MongoDB and I'm going to pick out spring data.

134
00:05:42,120 --> 00:05:45,220
And what it's going to do, it's going to hand me a running app and I can go in and start

135
00:05:45,220 --> 00:05:51,540
defining the domain objects and the controllers to connect it all together.

136
00:05:51,960 --> 00:05:57,380
And I don't need to think about like, uh, you know, do I need to wire a servlet container

137
00:05:57,380 --> 00:06:04,640
or do I need to connect it to Netty or do I need to define view resolvers and all the

138
00:06:04,640 --> 00:06:06,780
stuff that you use to connect all these components together?

139
00:06:06,780 --> 00:06:11,660
Instead, you start writing the operational stuff and boot is auto wiring the rest of it

140
00:06:11,660 --> 00:06:12,980
for you out of the box.

141
00:06:13,960 --> 00:06:19,280
And, and so, so, uh, go, going on the other end of the, uh, the abstract scale, where, where

142
00:06:19,280 --> 00:06:20,540
do these opinions come from?

143
00:06:21,160 --> 00:06:25,640
I mean, if it's like an opinionated way of, of packaging things up, how do they, uh, how

144
00:06:25,640 --> 00:06:28,980
do they evolve and how do they get decided on and put in there?

145
00:06:29,300 --> 00:06:33,340
Uh, well, there's actually a, you know, there's a dedicated team within the spring, within the

146
00:06:33,340 --> 00:06:35,460
entire spring team called the spring boot team.

147
00:06:35,460 --> 00:06:41,740
And, um, they've, they formulated a lot of opinions, but the, the boot team and the whole

148
00:06:41,740 --> 00:06:44,320
spring team is actually very open to user feedback.

149
00:06:44,320 --> 00:06:50,360
And so we get a lot of, uh, opinions suggested by the user community, people that are deep,

150
00:06:50,360 --> 00:06:55,440
deepened involved with working with MongoDB or there's other third party toolkits.

151
00:06:55,440 --> 00:07:01,460
Um, in fact, we've recently added support for like Microsoft Azure to do some, uh, some

152
00:07:01,460 --> 00:07:06,480
of these, you know, you say opinions, we call these auto configurations or, you know, a boot

153
00:07:06,480 --> 00:07:11,400
looks at your class path and says, oh, I see that you have spring MVC on the class path.

154
00:07:11,400 --> 00:07:14,560
I'm going to assume you want to use that and pre-configure some components.

155
00:07:14,560 --> 00:07:20,340
But if it sees these particular, like Azure based components on the class path, um, it

156
00:07:20,340 --> 00:07:22,920
can sit there and start to auto configure things on your behalf.

157
00:07:23,640 --> 00:07:26,580
So there's a lot of internal and external contribution to that.

158
00:07:26,580 --> 00:07:31,120
Yeah, I guess, I guess there's some, uh, there's some fine needling to be done between the,

159
00:07:31,120 --> 00:07:34,960
the, uh, the semantics of the word opinion versus convention.

160
00:07:35,500 --> 00:07:35,980
Right.

161
00:07:36,040 --> 00:07:40,880
And, and like the sort of, and, and then further on default of how, how you would do things.

162
00:07:40,880 --> 00:07:46,780
But, um, I mean, that definitely seems like one of the primary advantages is, uh, uh, having,

163
00:07:46,780 --> 00:07:51,280
not having had to think about convention if you want and, and getting things, uh, getting

164
00:07:51,280 --> 00:07:57,660
things wired up, but so, so anyway, as, as, as another question, like, well, I presume when

165
00:07:57,660 --> 00:08:01,900
you're writing a book like this, you have to sort of think about, um, what are the difficult

166
00:08:01,900 --> 00:08:05,600
parts about this technology that I need to educate people about?

167
00:08:05,600 --> 00:08:09,820
Like what, what are ways I need to change their thinking so that they understand how they're

168
00:08:09,820 --> 00:08:10,500
doing things?

169
00:08:10,620 --> 00:08:14,860
You know, unless it's just like a straight up manual, which probably is not, but like, are,

170
00:08:14,860 --> 00:08:19,020
are there some of those things where like ways you have to think differently, uh, or, or

171
00:08:19,020 --> 00:08:23,720
in, in a good way or bad way, if you're, you're doing sort of like a, uh, boot led application?

172
00:08:23,940 --> 00:08:27,360
Well, I think more often than not, which you kind of run into, and this is what I try to

173
00:08:27,360 --> 00:08:31,920
put into my books, uh, is that, uh, you, you come upon a decision.

174
00:08:31,920 --> 00:08:34,280
Well, boot's got boot in this situation.

175
00:08:34,760 --> 00:08:38,860
Um, you know, you may have a certain boot may have a pre-configured opinion, but the

176
00:08:38,860 --> 00:08:41,940
idea is you can step in and say, well, I want to do it a different way.

177
00:08:42,240 --> 00:08:43,200
What's the trade-off?

178
00:08:43,260 --> 00:08:45,840
Cause everything, you know, software is built on trade-offs.

179
00:08:46,000 --> 00:08:49,000
So I try to write into the book and say, here's the default opinion.

180
00:08:49,020 --> 00:08:51,660
But maybe you, you need to do this other situation.

181
00:08:51,940 --> 00:08:56,340
Here's how you can get in here and just tweak this one part of the configuration.

182
00:08:56,920 --> 00:09:00,160
And here's one, here's a reason why you may want to entertain doing that.

183
00:09:00,220 --> 00:09:03,640
Why maybe the default's not the best answer, uh, for that situation.

184
00:09:04,380 --> 00:09:08,780
And so, you know, I try to give them, I try to give them trade-offs so they can evaluate

185
00:09:08,780 --> 00:09:09,180
that.

186
00:09:09,180 --> 00:09:12,380
Cause not every, you know, example that I'm going to put in my book is going to fit the

187
00:09:12,380 --> 00:09:13,600
reader's needs directly.

188
00:09:14,980 --> 00:09:15,840
That makes sense.

189
00:09:16,000 --> 00:09:20,200
So, so it's sort of like walking through the, uh, the trade-offs.

190
00:09:20,340 --> 00:09:22,700
I'm just repeating what you said, but no, no, that makes sense.

191
00:09:22,800 --> 00:09:27,140
And, and, and I suppose, I suppose, uh, you know, in the book you give examples of like,

192
00:09:27,180 --> 00:09:31,620
if you were to do things this way, it would imply this, uh, this, this path of nastiness

193
00:09:31,620 --> 00:09:34,160
to go down versus this other path of nastiness.

194
00:09:34,520 --> 00:09:35,560
Choose which path you want.

195
00:09:35,800 --> 00:09:42,080
Well, I, I try to minimize usage of nastiness when I write spring apps, but, uh, yeah, now

196
00:09:42,080 --> 00:09:46,520
I can throw you, since we've been talking abstract, I can move to a little bit more concrete, the

197
00:09:46,520 --> 00:09:48,160
examples that are in the book.

198
00:09:48,280 --> 00:09:48,540
Yeah.

199
00:09:48,620 --> 00:09:48,760
Yeah.

200
00:09:48,820 --> 00:09:54,280
Um, and, and I can do that by, uh, citing a, a, a familiar person that we all are, must

201
00:09:54,280 --> 00:09:55,280
know, Josh Long.

202
00:09:55,500 --> 00:10:00,380
So, you know how Josh Long travels around to conferences and when he gets up and does a

203
00:10:00,380 --> 00:10:03,500
presentation, what's the first thing that he does at any of these presentations?

204
00:10:03,500 --> 00:10:04,900
What does he do with the audience?

205
00:10:05,640 --> 00:10:08,060
I think he takes a selfie picture, right?

206
00:10:08,700 --> 00:10:09,600
Figure out who's on the Twitter.

207
00:10:09,600 --> 00:10:16,520
So, so I had this idea two years ago for a SpringOne demo of, I wanted to get up and

208
00:10:16,520 --> 00:10:18,380
demo the software stack of spring.

209
00:10:18,600 --> 00:10:23,020
And the paradigm was, let me take a picture of, let me take a selfie and upload it to the

210
00:10:23,020 --> 00:10:24,740
app that I'm demoing to the audience.

211
00:10:24,920 --> 00:10:31,640
So basically in the book, we build, build a social media app where you get to upload

212
00:10:31,640 --> 00:10:35,300
pictures, um, and made comments on them.

213
00:10:35,340 --> 00:10:36,940
And I call it spring-a-gram.

214
00:10:40,460 --> 00:10:41,180
No trademark.

215
00:10:41,320 --> 00:10:48,300
So throughout, it's also partly inspired because there's this hilarious movie called The Interns

216
00:10:48,300 --> 00:10:50,840
where they're trying to come up with an app and the guy like says, I've got this great

217
00:10:50,840 --> 00:10:51,560
idea for an app.

218
00:10:51,660 --> 00:10:54,940
You upload a picture on your phone and then somebody, the other guy tries to tell them

219
00:10:54,940 --> 00:10:55,460
that's Instagram.

220
00:10:55,640 --> 00:10:56,840
And he goes, no, my idea is different.

221
00:10:57,200 --> 00:11:01,960
When it's absolutely not different, but, um, so in this one, you know, I, I go through

222
00:11:01,960 --> 00:11:06,440
the book and actually chapter by chapter, we build up this, uh, spring-a-gram app because

223
00:11:06,440 --> 00:11:09,040
you need things like you need a front end web page.

224
00:11:09,040 --> 00:11:14,040
You need to write stuff into the database and the MongoDB in this example.

225
00:11:14,800 --> 00:11:17,340
And we need things like web sockets and we need messaging.

226
00:11:17,340 --> 00:11:21,220
And I even expanded it into a microservice-based solution in one of the chapters.

227
00:11:22,660 --> 00:11:29,340
But it's all real realistic type application versus, um, uh, something you kind of.

228
00:11:30,300 --> 00:11:30,660
Yeah.

229
00:11:30,660 --> 00:11:35,060
I noticed in all of that, I mean, it wasn't just building the app, but you looked at testing

230
00:11:35,060 --> 00:11:35,760
strategies.

231
00:11:35,760 --> 00:11:38,500
You talked about deployment, things like that too.

232
00:11:38,540 --> 00:11:41,160
So do you feel like you covered a good life cycle?

233
00:11:41,240 --> 00:11:44,940
If I'm a Spring Boot developer, I'm trying to learn Spring Boot, you're trying to show

234
00:11:44,940 --> 00:11:49,700
me some of the right ways to do some test-driven procedures and how do I package this thing

235
00:11:49,700 --> 00:11:51,960
up and run it on different types of runtimes?

236
00:11:52,080 --> 00:11:55,400
Was that something you wanted to do is make sure you got that end-to-end story figured out?

237
00:11:56,600 --> 00:11:57,380
Uh, exactly.

238
00:11:57,660 --> 00:12:02,420
You know, that's, I really wanted to show here's how to start from the beginning from our start.spring.io

239
00:12:02,420 --> 00:12:07,940
and, um, carried all the way to the end to deploying it to, uh, of course, Pivotal Cloud Foundry.

240
00:12:09,580 --> 00:12:09,900
Naturally.

241
00:12:10,400 --> 00:12:14,480
So one of the other things I noticed, obviously you mentioned, you did a lot with reactive

242
00:12:14,480 --> 00:12:19,620
here, and we've talked a little bit about reactive on the podcast so far, but as you look

243
00:12:19,620 --> 00:12:25,100
at Spring 2, you know, what are the things that step out for you in, in Spring Boot 2?

244
00:12:25,460 --> 00:12:27,320
Like, is it the reactive, are there other pieces?

245
00:12:27,480 --> 00:12:30,880
I mean, it's first, our audience here, who's going to start hearing more and more about

246
00:12:30,880 --> 00:12:35,260
Spring Boot 2, especially at SpringOne platform coming up, you know, give the sneak peek.

247
00:12:35,380 --> 00:12:39,000
What do you think are the real headlines for, for Boot 2.0 and which ones did you cover in

248
00:12:39,000 --> 00:12:39,300
the book?

249
00:12:40,380 --> 00:12:44,380
Well, the, you know, part of the biggest stuff in Boot 2.0 is that it jumps up.

250
00:12:44,380 --> 00:12:49,120
It's, it's based off Spring Framework 5, which is our latest major release of the Spring

251
00:12:49,120 --> 00:12:49,840
Framework.

252
00:12:50,100 --> 00:12:54,500
And with that comes everything being re-based on Java 8.

253
00:12:55,180 --> 00:13:01,100
The previous version of Spring 4 was based on Java 6, which is now Java 6 and 7 are both

254
00:13:01,100 --> 00:13:03,580
end of life, and people are now talking about Java 9.

255
00:13:04,660 --> 00:13:09,920
So the big thing is we get to jump up to Java 8, and there's a lot of new programming paradigms

256
00:13:09,920 --> 00:13:16,520
right there to take advantage of, like stream APIs and, you know, method handles and a lot

257
00:13:16,520 --> 00:13:21,900
of stuff that feeds towards functional style programming, which then if you jump into Project

258
00:13:21,900 --> 00:13:24,560
Reactor, Project Reactor is based on Java 8.

259
00:13:24,660 --> 00:13:30,840
And that's where we get really deep into this, you know, functional programming style, you

260
00:13:30,840 --> 00:13:32,800
know, a reactive functional style.

261
00:13:33,060 --> 00:13:38,720
And to be specific, it's really the reactive streams spec that we're talking about here.

262
00:13:39,820 --> 00:13:43,680
There's a lot of different reactive programming paradigms out there that's been around for

263
00:13:43,680 --> 00:13:47,960
decades, but the one we're really diving into is the reactive streams spec that comes with

264
00:13:47,960 --> 00:13:48,540
back pressure.

265
00:13:51,300 --> 00:13:55,280
So there's been, you know, there's a whole bunch of new APIs that the Spring team has

266
00:13:55,280 --> 00:13:59,400
probably spent over a year on, maybe two years.

267
00:13:59,440 --> 00:14:05,400
Because I remember Nexus in 2015 talking with Rawson, who works primarily on Spring MVC stuff,

268
00:14:05,400 --> 00:14:11,780
and he was, we were talking in the car driving to a jug meeting about reactive stuff back then.

269
00:14:11,780 --> 00:14:14,640
And they were like, you know, we need to do a lot of analysis on this and make sure we come

270
00:14:14,640 --> 00:14:17,760
out with a good, a good approach to it instead of just throwing something out there to the

271
00:14:17,760 --> 00:14:18,120
community.

272
00:14:19,360 --> 00:14:21,860
And I think they've done a fantastic job at that.

273
00:14:22,680 --> 00:14:23,000
Yeah.

274
00:14:23,040 --> 00:14:25,900
And you feel like with the Spring Boot and Spring in general, again, that you're putting

275
00:14:25,900 --> 00:14:30,540
some opinions on that, on how the right way to do, or at least a good way to do reactive

276
00:14:30,540 --> 00:14:33,160
programming outside of what you could override later on?

277
00:14:34,740 --> 00:14:35,180
Absolutely.

278
00:14:36,060 --> 00:14:40,800
You know, one thing that's definitely gone into Spring Boot, too, is that, for instance,

279
00:14:40,880 --> 00:14:42,940
you're like, well, I want to use MongoDB.

280
00:14:43,140 --> 00:14:48,180
And I keep going to MongoDB because it's one of the data stores that we support that actually

281
00:14:48,180 --> 00:14:51,380
also supports the reactive streams spec.

282
00:14:51,820 --> 00:14:52,200
I see.

283
00:14:52,200 --> 00:14:58,660
So you get to pick a dependency of, I want Spring Data MongoDB or I want Spring Data MongoDB

284
00:14:58,660 --> 00:14:59,420
reactive.

285
00:14:59,880 --> 00:15:03,080
I get to pick one of those two options with boot 2.0.

286
00:15:03,400 --> 00:15:08,720
And from there, you know, the boot's going to automatically configure up and hand me the

287
00:15:08,720 --> 00:15:11,120
components to talk reactively to MongoDB.

288
00:15:11,380 --> 00:15:12,940
And I, you know, then I can run with it from there.

289
00:15:14,080 --> 00:15:20,240
So maybe using your, um, your, um, your Instagram killer app, which, you know, good, good luck.

290
00:15:20,460 --> 00:15:25,080
That's, that's a good market to get into, uh, maybe narrowed down to conferences.

291
00:15:25,080 --> 00:15:28,980
I have a feeling that conference software has really big margins based on how little they

292
00:15:28,980 --> 00:15:29,720
update it.

293
00:15:29,720 --> 00:15:37,660
But anyhow, like, you know, just like explain why I'm trying to avoid saying what, but explain

294
00:15:37,660 --> 00:15:40,980
why you would choose to like do, do a reactive thing.

295
00:15:40,980 --> 00:15:45,760
Like what, what would the reactive style be like in reference hopefully to your application?

296
00:15:45,880 --> 00:15:50,940
What would make you choose to do things that way versus, I don't know, unreactive things?

297
00:15:51,040 --> 00:15:51,820
What would that be?

298
00:15:52,200 --> 00:15:52,560
Passive?

299
00:15:53,740 --> 00:15:55,480
Uh, well, I guess they'd call it a blocking.

300
00:15:55,700 --> 00:15:58,240
So the big thing is, well, you know, what is, what is reactive?

301
00:15:58,400 --> 00:16:01,760
And reactive means non-blocking asynchronous APIs.

302
00:16:02,080 --> 00:16:06,840
And, you know, the real thing is, is while, while the file is being uploaded, you know,

303
00:16:06,860 --> 00:16:10,800
in this case, let me, well, the use case is, um, somebody is going to go to the webpage.

304
00:16:10,880 --> 00:16:12,880
They want to upload an image.

305
00:16:13,500 --> 00:16:17,560
After the image is uploaded, we need to store some of the information in MongoDB.

306
00:16:17,700 --> 00:16:20,220
And some of it's just going to be a stored file.

307
00:16:20,480 --> 00:16:25,720
And then we're going to send the hand, the user back a redirect to go back and look at the image.

308
00:16:26,360 --> 00:16:27,840
So retrieve it and display it.

309
00:16:27,920 --> 00:16:32,800
And then also then later on, they can add, you know, comment on it just like any social media platform.

310
00:16:33,700 --> 00:16:41,860
So to do that reactively means that, um, everything is being like, you know, uploading the file is done in an asynchronous way.

311
00:16:41,860 --> 00:16:53,080
And that is there's, while, you know, I, you can start the upload process, but if the system's going to interrupt it, don't, don't hold up threads or other resources waiting for the operation to complete.

312
00:16:53,360 --> 00:16:57,900
While you're writing data to MongoDB, uh, you don't need to hold up the resources.

313
00:16:57,900 --> 00:17:01,040
Instead, you can say, Hey, Mongo, I've got the data here.

314
00:17:01,160 --> 00:17:02,060
Let me know when you're ready.

315
00:17:02,100 --> 00:17:08,720
In the meantime, I'm going to go over and do this other stuff and not waste resources, hang in here, wait, come back to me.

316
00:17:09,580 --> 00:17:10,140
Right, right.

317
00:17:10,140 --> 00:17:17,600
It's sort of like internally, metaphorically, the little, uh, the little Tron people who are running the computer, they can go get a cup of coffee while they're waiting.

318
00:17:17,760 --> 00:17:20,180
They don't have to like, uh, block and stand there.

319
00:17:21,800 --> 00:17:22,380
I don't know.

320
00:17:22,480 --> 00:17:24,000
That's how I think of things, I guess.

321
00:17:24,220 --> 00:17:38,560
And, and so, um, so, so am I right to think that like, if you are doing all your reactive stuff and then whatever, whatever this serverless business is that comes along, there seems to be a pretty, uh, structural overlap between these two things.

322
00:17:38,560 --> 00:17:46,860
Cause you know, I was, uh, I was talking with some, there were ISV people, if you will, not an enterprise who is figuring out stuff to do with serverless.

323
00:17:46,860 --> 00:17:55,160
And we were talking through various scenarios and it seemed like, uh, it's pretty much very similar to, to, to what you're just describing, except without any orchestration on top of it.

324
00:17:55,160 --> 00:17:58,520
It's basically just the holes you shoot your asynchronous things down.

325
00:17:58,960 --> 00:18:08,260
Uh, I don't know what would be on top of that, but I mean, I mean, is there like, what kind of overlap is there between these, uh, these two, uh, exciting areas of, of development?

326
00:18:08,820 --> 00:18:18,620
Well, you know, you know, you have a overlap there's, there's, you know, this is not the only toolkit that's out there that does reactive streams or that does asynchronous non-blocking operations.

327
00:18:18,620 --> 00:18:19,660
There's a lot of things.

328
00:18:19,660 --> 00:18:32,780
And so, um, one thing that Rosson had explained to me and that has become evident with what they, with what the spring team has released is that we don't want everybody to say, hmm, am I going to write this app in a classic spring sense?

329
00:18:32,780 --> 00:18:35,540
Or do I have to go write this in a completely new paradigm?

330
00:18:35,660 --> 00:18:38,680
Do I have to throw everything that I learned away and start over again?

331
00:18:39,160 --> 00:18:41,160
And I would find that frankly off-putting.

332
00:18:41,160 --> 00:18:51,780
And so they spent a lot of effort to where, you know, you can define your web controllers and your data repositories and stuff the same in either, in either paradigm.

333
00:18:51,900 --> 00:18:58,460
And it's really when you get down to the nuts and bolts that you need to, you know, alter the way you're going to actually do some of these operations.

334
00:18:58,460 --> 00:19:09,720
But the way you declare your spring, you know, whether you write a spring MVC blocking controller or you create a spring web flux non-blocking controller, they can look virtually identical.

335
00:19:11,460 --> 00:19:19,960
But still, you know, one's going to leverage the classic servlet runtime container and the other one can leverage NETI's asynchronous reactive container.

336
00:19:20,720 --> 00:19:26,440
So when you think about that, I was going through your chapter on testing and thinking about that.

337
00:19:26,780 --> 00:19:37,360
I mean, do you think with reactive or even dependency injection where there can be at least a sense of a little more unpredictability, does it change how you approach testing and writing tests when I've got auto configuration happening?

338
00:19:37,480 --> 00:19:43,200
Things that can feel like black box or reactive apps where things are calling back later than I expected.

339
00:19:43,200 --> 00:19:52,540
How do you think about testing when you don't just have this kind of procedural blocking sort of application with hard-coded references, you know exactly what you're referencing to?

340
00:19:53,180 --> 00:19:57,760
Do you find that that changes or it's just kind of a different, you know, a couple of different things?

341
00:19:58,380 --> 00:20:06,640
Well, you know, as somebody whose first job assignment in this industry was testing other people's code, there's a lot of different ways to slice testing.

342
00:20:06,640 --> 00:20:17,940
And I tried to go into a lot of detail, granted that whole books have been written on testings, so I wanted to try to go, hey, you know, some things you need to test are very small, like unit tests.

343
00:20:18,060 --> 00:20:23,220
Unit tests should not run aground of any kind of react, either blocking or non-blocking.

344
00:20:23,300 --> 00:20:31,200
It should be below that level because when you talk about blocking, now you're talking at a higher level and involving a container of some sorts.

345
00:20:31,980 --> 00:20:40,000
So some things you need to write unit testing, but you can easily overlook, hmm, I tested all these units, but I forgot to test what happens when you put them all together.

346
00:20:42,580 --> 00:20:45,280
So that's why we also need integration testing.

347
00:20:45,280 --> 00:20:48,440
I need some sense of end-to-end testing or test-to-thread of testing.

348
00:20:48,440 --> 00:20:57,480
So in boot 1.5 and earlier, they had the ability to spin up an entire embedded instance of Tomcat for one test case and test stuff like that.

349
00:20:58,760 --> 00:21:05,760
But then they added a third option called a slice, saying, you know, in this case, I want everything to be mocked out except the data layer.

350
00:21:05,880 --> 00:21:07,720
I want to talk to a real database in this case.

351
00:21:07,800 --> 00:21:10,040
Well, let's let everything else be mocked out.

352
00:21:10,620 --> 00:21:19,700
So you can really – I think it's very well managed, and even the reactor team has a test library to assist with saying, well, in this case, we need to actually test a reactive flow,

353
00:21:19,700 --> 00:21:27,020
and I need to simulate that at this point, it's going to wait a whole hour virtually before it does the next test step.

354
00:21:28,500 --> 00:21:29,040
Got it.

355
00:21:29,340 --> 00:21:29,540
Okay.

356
00:21:29,780 --> 00:21:32,340
Yeah, I'm just curious as to how we think about that with our developers.

357
00:21:32,640 --> 00:21:37,980
And I guess kind of related to that, you talked a little bit about tooling in the book as well.

358
00:21:38,040 --> 00:21:38,940
You look at dev tooling.

359
00:21:38,940 --> 00:21:45,660
I mean, do you have kind of a must-have for Spring developers, whether they're getting started or more advanced when it comes to IDEs,

360
00:21:45,740 --> 00:21:50,960
when it comes to sort of dev tooling or other sort of framework components that you like to latch on?

361
00:21:51,080 --> 00:21:53,560
I mean, what makes a good Spring dev experience in your mind?

362
00:21:55,600 --> 00:22:04,460
Well, I – you know, one of the modules that I thought was the coolest addition was when Spring Boot added the DevTools module, which, you know, that was a few releases ago.

363
00:22:04,560 --> 00:22:10,700
And that's something that sits there and watch it while you – it's – you just add this one dependency, and it sits there and watches your app.

364
00:22:10,700 --> 00:22:17,800
And if it detects a save or a refresh of the project, it just automatically relaunches the application context.

365
00:22:18,800 --> 00:22:26,160
Instead of restarting the entire app, it just restarts essentially the user code that you wrote, and so it does it very quickly.

366
00:22:26,460 --> 00:22:35,580
And also they hooked in integration to Live Reload, which is an independent library that it's all built around the premise of I've got a web page in the browser,

367
00:22:35,580 --> 00:22:40,840
and I need it to automatically click the refresh button for me as soon as it detects there was an update.

368
00:22:42,140 --> 00:22:47,180
And that kind of stuff to me, that just speeds up the clock cycles of I'm going to go update this template.

369
00:22:47,500 --> 00:22:49,100
Let me see a refresh on the web page.

370
00:22:49,160 --> 00:22:51,320
I'm going to update this service.

371
00:22:51,500 --> 00:22:57,920
I want to see it refresh on the web page without having to jump back and forth and click a bunch of buttons and stuff like that.

372
00:22:58,400 --> 00:23:06,240
Now, in addition to your soon-to-be industry-leading conference selfie-sharing app, like, do you know off the top of your head?

373
00:23:06,240 --> 00:23:16,760
And maybe you know too, Richard, like, do you know some good examples of, like, applications people would know that, like, are basically boot-led that do a lot of the things we've just been talking about?

374
00:23:17,380 --> 00:23:21,580
The most stuff I hear about is people like Matt Stein that are in the field all the time, and they keep coming back.

375
00:23:21,580 --> 00:23:36,280
And I couldn't put my finger on it until I think he stated one time in an email, and it's like – he's like, I can't believe the amount of acceptance out there in the community that's been received based on make everything a boot app, a self-contained boot app.

376
00:23:36,280 --> 00:23:48,280
I don't think we could have predicted the success that has happened in microservices with the fact of make every single microservice a boot app because then you have this common paradigm of here's a JAR file.

377
00:23:48,420 --> 00:23:55,520
It does one thing, and it does it well, and with the Spring framework, you can then link to the – in Spring Cloud, we can link to the other microservices.

378
00:23:55,520 --> 00:23:58,660
We can run 50 copies of this, two copies of that.

379
00:23:58,720 --> 00:24:08,900
Everything is connected and talking and integrated, and it just seems like the boot paradigm to me is almost bigger, in my opinion, than certain other things like Docker.

380
00:24:09,760 --> 00:24:10,480
Shots fired.

381
00:24:10,880 --> 00:24:11,440
There you go.

382
00:24:11,800 --> 00:24:20,660
So, I mean, in your mind, when you do – a couple questions left, but when you look at something like boot for everything, I mean, boot's not lightweight per se, right?

383
00:24:20,660 --> 00:24:27,380
It's not like running a 32-meg Node.js app somewhere, and now you're going to get a lot of power in exchange.

384
00:24:27,380 --> 00:24:38,520
But what do you think or what do you say that's sometimes the concern that, like, you know, a Java app – and maybe it's a Java app, it's not a boot app – but that Java isn't always the best fit for microservices because it has a larger footprint.

385
00:24:38,640 --> 00:24:40,320
What do you kind of say to that challenge?

386
00:24:40,840 --> 00:24:44,800
Well, I don't know because I've been hearing that for I don't know how many years.

387
00:24:44,920 --> 00:24:51,600
I remember – I think when I met Rod Johnson in 2008 at the – what was then called the Spring Experience Conference, and I chatted with him.

388
00:24:51,700 --> 00:24:58,460
He said back then, you know, it seems popular to criticize Java, and it seems like that popularity has not faltered yet.

389
00:24:59,560 --> 00:25:02,420
It seems like – what's this most recent survey?

390
00:25:02,560 --> 00:25:08,660
Was it from the people behind JRebel had commented that, like, one out of two Java developers are using Spring.

391
00:25:09,760 --> 00:25:13,900
And it's like Java is, like, one of the most – like, the industry standard language.

392
00:25:14,200 --> 00:25:25,000
So to sit there and say, but your JAR files aren't small enough or something sounds kind of, like, kind of petty or, you know, not a very well-rooted thing.

393
00:25:25,100 --> 00:25:31,300
It's – I think a lot of people demonstrate their support for boot by downloading it.

394
00:25:31,440 --> 00:25:34,540
How many millions of downloads a month of boot are happening?

395
00:25:35,320 --> 00:25:36,260
Yeah, it's crazy stuff.

396
00:25:37,720 --> 00:25:39,160
So it seems like –

397
00:25:39,160 --> 00:25:40,340
This, you know, this works.

398
00:25:40,460 --> 00:25:42,420
This works for people solving problems.

399
00:25:42,520 --> 00:25:43,400
So what else do you need?

400
00:25:44,020 --> 00:25:44,380
Absolutely.

401
00:25:44,640 --> 00:25:54,640
Yeah, I mean, sometimes it's nice to have crazy high density, but at the same time, computing has gotten cheaper, and sometimes fighting over a gig of memory or 500 megs, sometimes that's not worth the productivity benefits.

402
00:25:55,180 --> 00:26:01,060
So then I got another abstract question, especially given your background, Richard.

403
00:26:01,060 --> 00:26:07,160
So I've been – you know, I was never a big Microsoft.net developer back when I did real work.

404
00:26:07,880 --> 00:26:08,880
But my perception –

405
00:26:08,880 --> 00:26:09,980
Sorry to hear that.

406
00:26:10,760 --> 00:26:30,720
But my perception of that community was that there was a lot of things built in, that you had sort of like a unified stack with a – I don't know, opinionated ways of doing things by virtue of it being not – at the time when I was doing it an open community and things like that.

407
00:26:30,720 --> 00:26:41,300
And then, you know, as I've been paying more attention to the way that, like, spring-based Java stuff has evolved, it seems like kind of similar to, right or wrong, that perception I had of the .NET world.

408
00:26:41,400 --> 00:26:48,160
So first, like in the .NET world, do they have a lot more of these – historically, are there a lot more, like, opinions and defaults baked into it?

409
00:26:48,160 --> 00:26:54,900
And too, like, I don't know, to you who knows these things, like, does it feel similar between these two or is it still vastly different?

410
00:26:55,320 --> 00:26:57,120
That's an interesting observation.

411
00:26:57,920 --> 00:27:04,460
I mean, I think there was more baked in because there was a smaller community outside, if you will, because it was an open source, right?

412
00:27:04,480 --> 00:27:08,540
So more had to be in the product because you weren't going to bolt on as many things potentially.

413
00:27:08,540 --> 00:27:17,740
So, yeah, as a .NET developer, you had a lot of crazy great things just baked in to help you build web apps and background apps and all these sort of fun things.

414
00:27:18,160 --> 00:27:24,300
Now, as it's become a little more open, you have a lot more of a package ecosystem, too, of bringing things in to leverage.

415
00:27:24,500 --> 00:27:26,960
But I wouldn't really call it super opinionated.

416
00:27:27,340 --> 00:27:29,360
There were still lots of ways to do the same things.

417
00:27:29,400 --> 00:27:31,280
You didn't get shoved down one route or another.

418
00:27:31,700 --> 00:27:33,360
So I think Boot is still unique in that.

419
00:27:33,420 --> 00:27:36,880
But, Greg, interested in your thoughts on – do you see a similarity there?

420
00:27:36,880 --> 00:27:39,520
Are they still kind of on different strategic paths?

421
00:27:40,860 --> 00:27:45,920
I actually had somebody that used to work for me that knew both Java and .NET,

422
00:27:46,120 --> 00:27:52,820
and he would – his joke was to sneak into my cubicle and try to install a .NET app without me seeing it,

423
00:27:52,820 --> 00:27:58,960
where from his machine over the network, he could command the CD-ROM drive to open up on my machine while –

424
00:27:58,960 --> 00:28:00,580
and I'd be like, what is that?

425
00:28:00,580 --> 00:28:06,320
And he would also change the screen wallpaper and stuff.

426
00:28:06,400 --> 00:28:10,180
And it took him, like, five lines of code with .NET because of all the pre-baked APIs.

427
00:28:10,860 --> 00:28:11,420
That's true.

428
00:28:11,800 --> 00:28:14,360
It was very opinionated for Windows, very easy to talk to Windows.

429
00:28:14,840 --> 00:28:17,140
So at least that was something that was definitely made very simple.

430
00:28:17,500 --> 00:28:18,220
Yeah, yeah.

431
00:28:18,400 --> 00:28:22,240
I mean, that's kind of when I start hearing about pre-baked APIs, I kind of think of that paradigm.

432
00:28:22,240 --> 00:28:26,160
And I'm like, I think of, well, is that all that you can do?

433
00:28:26,400 --> 00:28:32,120
And when I see people look at boot and say, oh, I don't know, is that a little too much black magic in there and stuff?

434
00:28:32,200 --> 00:28:37,540
And that's why I try to, in the book, make a point of showing, you know, well, here's what's happening.

435
00:28:37,640 --> 00:28:42,200
In fact, there's excerpts of code about here's the auto configuration, and this is all that it is.

436
00:28:42,220 --> 00:28:43,280
It's not that complicated.

437
00:28:43,920 --> 00:28:49,800
And, in fact, let's go write our own auto configuration and register it, and you can make it, you know, its own first-class citizen.

438
00:28:49,800 --> 00:28:58,440
And there's actually companies out there or OSS communities that are publishing their own third-party boot auto configuration options.

439
00:28:59,040 --> 00:29:06,200
So I think it's much more extensible and, you know, write, you know, do what you like options when you're talking about boot.

440
00:29:06,480 --> 00:29:12,740
Now, I can't comment on .NET for current sake, but so that had to be about 10 years ago, but that's my take on it.

441
00:29:12,740 --> 00:29:20,620
If I can just offer a suggestion for the third edition of your book, you might want to incorporate opening CD-ROM drives somehow into there.

442
00:29:21,080 --> 00:29:22,820
I think that would be great.

443
00:29:24,440 --> 00:29:25,980
Maybe integrate with the local operating.

444
00:29:26,040 --> 00:29:30,340
It reminds me of a joke way back when we played on one of our coworkers.

445
00:29:30,560 --> 00:29:36,960
We were, like, you know, at a startup, so we were in some big, ugly room of some cheap space we had rented, all of us.

446
00:29:37,300 --> 00:29:44,020
And every day for about a month, we would, like, move our friend, let's say our – it was our friend.

447
00:29:44,080 --> 00:29:47,160
Our friend's desk, like, an inch closer to another desk.

448
00:29:47,820 --> 00:29:49,820
And, you know, so it's kind of imperceptible.

449
00:29:49,820 --> 00:29:53,720
And I remember one day he came in and finally noticed it, and I think he just, like, lost it.

450
00:29:54,020 --> 00:29:56,160
He just got very upset at that prank.

451
00:29:56,500 --> 00:30:01,400
So it sounds like maybe you were much better at receiving pranks of having your CD-ROM drive open.

452
00:30:02,480 --> 00:30:03,060
Big fan.

453
00:30:03,440 --> 00:30:03,700
Yeah.

454
00:30:05,180 --> 00:30:06,280
Moving the desk by an inch.

455
00:30:06,360 --> 00:30:10,740
Well, so, I mean, I think that's a pretty good overview there of the book.

456
00:30:10,840 --> 00:30:15,440
I mean, I assume the book's available everywhere, right, where fine books are sold.

457
00:30:15,460 --> 00:30:15,800
Oh, yeah.

458
00:30:16,120 --> 00:30:16,320
Yeah.

459
00:30:16,820 --> 00:30:20,680
Yes, go to Amazon right now and get your copy.

460
00:30:20,780 --> 00:30:22,260
Learning Spring Boots, second edition.

461
00:30:22,820 --> 00:30:24,740
So how long do you think it takes to go through the book?

462
00:30:24,740 --> 00:30:29,580
Well, it took me a year to go through it, but I don't want to say that that's the story for anybody.

463
00:30:31,480 --> 00:30:31,800
Yeah.

464
00:30:31,860 --> 00:30:35,060
Well, I think writing it's another story.

465
00:30:36,460 --> 00:30:40,360
But I guess you – how many times did you say in writing the book you ended up reading the book?

466
00:30:40,660 --> 00:30:41,120
Oh, my goodness.

467
00:30:41,220 --> 00:30:44,140
I've probably read each chapter three or four times.

468
00:30:44,260 --> 00:30:47,840
I think I would go – at a certain point – now, this is a tip for any author.

469
00:30:48,020 --> 00:30:51,720
At a certain point, you've got to stop reading it because every time you read it, you're going to find a mistake.

470
00:30:52,040 --> 00:30:52,820
Now, that's true.

471
00:30:52,820 --> 00:30:57,280
You have to realize when it goes to press, there are mistakes in there, and you have to let it go.

472
00:30:57,900 --> 00:30:58,700
Yeah, yeah, yeah.

473
00:30:59,180 --> 00:31:02,420
Yeah, that's a nice moment of calm when you just decide that, like, screw it.

474
00:31:02,580 --> 00:31:03,740
I'm done with this thing.

475
00:31:04,440 --> 00:31:05,780
That's enjoyable.

476
00:31:06,280 --> 00:31:07,360
A little nerve-wracking maybe.

477
00:31:07,720 --> 00:31:09,400
Well, then you also write some other books, right?

478
00:31:10,240 --> 00:31:12,120
Yeah, this is actually the fourth book that I've written.

479
00:31:12,360 --> 00:31:22,120
I wrote its predecessor, Learning Spring Boot, and just that's the first edition, and that was based on Boot 1.1.6, which is now an antique, I guess.

480
00:31:23,420 --> 00:31:24,720
That one was really popular.

481
00:31:25,260 --> 00:31:30,620
That was the first book that hit the market that was on Spring Boot, I'll say in English.

482
00:31:30,820 --> 00:31:36,660
I think somebody beat me in Japanese, putting out a book, but I'll say in English.

483
00:31:37,500 --> 00:31:46,360
And that was real popular because that came out – I think I signed the contract, like, only weeks after Boot came out back in 2013.

484
00:31:48,060 --> 00:31:55,940
So – and then before that, I wrote a book called Python Testing Cookbook that actually people are still buying today, amazingly, back in 2011.

485
00:31:57,340 --> 00:31:59,300
And then you write some fiction books too, right?

486
00:32:00,520 --> 00:32:02,660
Yes, that is correct.

487
00:32:02,900 --> 00:32:05,340
I've actually written a – I've written a novel.

488
00:32:05,920 --> 00:32:11,360
It's sort of a YA speculative fiction thing, and it's slated to be published next March.

489
00:32:11,800 --> 00:32:22,100
Oh, you know, I was looking through your books and thinking, like, I guess – I've come across a lot of people at Pivotal, well, which is to say two, who, like, write fiction books.

490
00:32:22,180 --> 00:32:24,880
But two is a lot more than the zero that I've ever come across.

491
00:32:25,280 --> 00:32:29,940
I wonder if there's other people inside Pivotal who write fiction on the side.

492
00:32:29,980 --> 00:32:34,240
Or maybe their job is the side and the fiction is the main table or whatever.

493
00:32:34,240 --> 00:32:37,000
But it's an interesting phenomena to see.

494
00:32:38,400 --> 00:32:45,060
Yeah, well, I can tell you my first cube mate that I had at my first job ever was – he was actually a graduate with a degree in English.

495
00:32:45,520 --> 00:32:49,400
And so working on software was just his day job.

496
00:32:49,480 --> 00:32:52,000
He was actually a wannabe author.

497
00:32:52,280 --> 00:32:57,420
And so back then, self-pubbing was a whole different thing 20 years ago than it is today.

498
00:32:58,040 --> 00:32:58,380
Yeah, yeah.

499
00:32:58,500 --> 00:33:00,480
Seems like it's a lot easier nowadays to do.

500
00:33:00,780 --> 00:33:01,600
So it is.

501
00:33:01,600 --> 00:33:06,980
And I actually provide assistance to – my wife's actually an author and has published seven novels.

502
00:33:07,300 --> 00:33:09,780
And so half of them are published with small presses.

503
00:33:09,880 --> 00:33:11,060
The other half are self-pubbed.

504
00:33:12,120 --> 00:33:14,020
Well, that's interesting.

505
00:33:14,220 --> 00:33:21,920
So when you're writing – when you're writing any type of your books, do you, like, hole yourself up in a little hobbit hole somewhere?

506
00:33:22,160 --> 00:33:24,300
Like, how do you, like, pay attention to it?

507
00:33:24,300 --> 00:33:26,020
Or do you have – do you not have that problem?

508
00:33:26,100 --> 00:33:29,260
Can you just, like, write and be interrupted all the time and everything's fine?

509
00:33:29,260 --> 00:33:32,080
How do you set up the environment to get stuff done?

510
00:33:33,040 --> 00:33:38,820
Well, I would typically – my best writing would be I would write at night when everybody was asleep and no one was disturbing me.

511
00:33:40,140 --> 00:33:44,620
And when I found out that that paradigm is absolutely required when you're recording video.

512
00:33:45,700 --> 00:33:46,480
Oh, yeah, yeah, yeah.

513
00:33:46,480 --> 00:33:48,760
Because I've – we got – I have three kids.

514
00:33:48,880 --> 00:33:50,340
They're eight, six, and three.

515
00:33:50,540 --> 00:33:56,540
And so there's just no way I can sit there and write a tech chapter with five – you know, an interruption every five minutes.

516
00:33:56,860 --> 00:33:57,740
Yeah, yeah.

517
00:33:57,820 --> 00:34:02,940
I've noticed that the kids are not very good at trusting that this concept of could you just wait?

518
00:34:03,420 --> 00:34:05,660
They're like – and basically their answer is always no.

519
00:34:06,980 --> 00:34:07,880
I can't.

520
00:34:07,880 --> 00:34:11,480
They'll wait about 30 seconds, and that's what they – that's what waiting is.

521
00:34:11,560 --> 00:34:12,260
Yeah, yeah.

522
00:34:12,260 --> 00:34:15,160
They don't practice the asynchronous sort of thing.

523
00:34:15,360 --> 00:34:17,080
Very highly synchronous, these kids.

524
00:34:17,400 --> 00:34:18,800
Lots of blocking required.

525
00:34:19,220 --> 00:34:20,260
Well, that's great.

526
00:34:20,340 --> 00:34:21,520
That's a good overview of it.

527
00:34:21,520 --> 00:34:32,860
And, you know, I'm always – I'll have to go get a copy myself to read through it, and then maybe I'll – you know, I always try – as I try to do here, I try to get people to explain to me what reactive and backflow is.

528
00:34:32,940 --> 00:34:36,820
And I think so far you've given me the most simple explanation.

529
00:34:37,120 --> 00:34:40,920
You just basically expanded it out into a bunch of words that I already know, which is great.

530
00:34:41,300 --> 00:34:43,680
But it would be even better to see an example application.

531
00:34:43,680 --> 00:34:48,860
And, you know, just as a side note, I've been looking at several example applications recently.

532
00:34:49,680 --> 00:35:03,000
And, yeah, you know, it's really easy to have a simple application be as complex as you want it to be, which sounds a little weird, but it also means that, like, if you think your application is overly complex, it's probably pretty normal, right?

533
00:35:03,060 --> 00:35:06,120
Like, everyone gets upset about how complicated their apps are.

534
00:35:06,220 --> 00:35:10,380
But you look at all these applications, and they have a lot of things running around as well.

535
00:35:10,380 --> 00:35:17,060
So the sort of, like, mean, if you will, of complexity seems pretty ordinary across projects.

536
00:35:17,440 --> 00:35:18,740
I don't know if that's true or not.

537
00:35:18,840 --> 00:35:19,800
But anyways...

538
00:35:19,800 --> 00:35:22,660
Well, I think it's a good microcosm of real software development.

539
00:35:22,840 --> 00:35:30,640
It's like you just start with something simple, and it keeps expanding and getting more complex to solve this and that and the other for sure.

540
00:35:30,980 --> 00:35:31,160
Yeah.

541
00:35:31,420 --> 00:35:31,920
All right.

542
00:35:31,980 --> 00:35:32,360
Well, great.

543
00:35:32,460 --> 00:35:33,200
Well, thanks for being on.

544
00:35:33,260 --> 00:35:35,580
Well, as always, this has been Pivotal Conversations.

545
00:35:35,580 --> 00:35:44,700
If you want to get the most recent episodes or peruse the back catalog, you know, maybe it's late at night, and you've got time on your own, and you don't need to write or make a video.

546
00:35:44,960 --> 00:35:47,980
You can just sit there and listen to old episodes.

547
00:35:48,740 --> 00:35:52,800
You can go to SoundCloud.com slash Pivotal Conversations.

548
00:35:53,280 --> 00:35:57,920
And every Thursday or so, we post formal show notes at Pivotal.io slash podcast.

549
00:35:58,860 --> 00:36:01,420
And with that, we'll see everyone next time.

550
00:36:01,640 --> 00:36:02,000
Bye-bye.
