1
00:00:01,080 --> 00:00:03,000
Speaker 1: How'd you like to listen to dot net rocks with

2
00:00:03,080 --> 00:00:07,879
no ads? Easy? Become a patron for just five dollars

3
00:00:07,919 --> 00:00:10,800
a month. You get access to a private RSS feed

4
00:00:10,839 --> 00:00:14,240
where all the shows have no ads. Twenty dollars a month,

5
00:00:14,279 --> 00:00:16,879
we'll get you that and a special dot net Rocks

6
00:00:16,960 --> 00:00:21,000
patron mug. Sign up now at Patreon dot dot NetRocks

7
00:00:21,120 --> 00:00:37,280
dot com. Hey guess what, it's dot net rocks. I'm

8
00:00:37,320 --> 00:00:41,840
Carl Franklin, an amateur camp and we haven't it's been

9
00:00:41,880 --> 00:00:45,119
a while since we just recorded one. Last week's show

10
00:00:45,159 --> 00:00:47,520
we recorded about an hour ago. But before that, it's

11
00:00:47,560 --> 00:00:49,880
been been a month because I went on the road

12
00:00:49,880 --> 00:00:51,479
for a month, all right. I did a couple of

13
00:00:51,479 --> 00:00:54,240
weeks in Mexico just to get out of the gray

14
00:00:54,320 --> 00:00:56,359
because it's the challenge of looking up up here.

15
00:00:56,799 --> 00:00:59,039
Speaker 2: And then NBC London.

16
00:00:59,359 --> 00:01:02,560
Speaker 1: I saw the posts you did from Mexico with our

17
00:01:02,600 --> 00:01:03,840
friends Paul and Stephanie.

18
00:01:04,120 --> 00:01:06,120
Speaker 2: Yep, they came. They came down for a week with us,

19
00:01:06,120 --> 00:01:09,840
and then I was at NBC London and then Sweet

20
00:01:09,879 --> 00:01:11,079
Dug in Stockholm.

21
00:01:11,280 --> 00:01:11,760
Speaker 1: Very cool.

22
00:01:12,359 --> 00:01:15,000
Speaker 2: So you saw Fritz there, I believe I did. The

23
00:01:15,000 --> 00:01:17,040
Fritzy was there, The Hunter was there, the Handsoman.

24
00:01:17,480 --> 00:01:19,040
Speaker 1: Wow, that's cool.

25
00:01:19,200 --> 00:01:21,879
Speaker 2: Yeah, I know the excess of Scots. To be honest,

26
00:01:22,000 --> 00:01:25,359
I will be at the other Stockholm conference dev some Yeah,

27
00:01:25,439 --> 00:01:28,040
I'm looking at being there as well, so maybe we

28
00:01:28,040 --> 00:01:29,120
can record some stuff.

29
00:01:29,239 --> 00:01:31,359
Speaker 1: Yeah maybe I think the weather be a little nicer

30
00:01:31,400 --> 00:01:36,560
when I'm there. Yeah, it'll be probably, I think just timing. Okay,

31
00:01:36,840 --> 00:01:47,120
let's get into better now a framework. All right, man,

32
00:01:47,120 --> 00:01:50,400
what do you got long last? Yeah, Music to Code

33
00:01:50,400 --> 00:01:53,519
Buy track twenty two is available.

34
00:01:53,640 --> 00:01:54,959
Speaker 2: Oh my goodness, it has been a while.

35
00:01:55,159 --> 00:01:59,680
Speaker 1: Is available for download and it's been added into the

36
00:02:00,040 --> 00:02:04,599
Election and the Wave collection and the Flat collection and

37
00:02:04,760 --> 00:02:07,519
you can go get it at music toocode buy dot net. Awesome,

38
00:02:07,599 --> 00:02:11,680
but that's not the only thing. Maybe should we play

39
00:02:11,800 --> 00:02:12,520
just a little bit of it?

40
00:02:12,639 --> 00:02:12,840
Speaker 2: Yeah?

41
00:02:12,879 --> 00:02:33,719
Speaker 1: You should, all right, I should go ahead, So there

42
00:02:33,759 --> 00:02:35,039
you go. It's just a little bit of it.

43
00:02:35,560 --> 00:02:36,000
Speaker 2: Awesome.

44
00:02:36,120 --> 00:02:39,439
Speaker 1: Yeah. So I do have an announcement around this whole

45
00:02:39,520 --> 00:02:42,199
music to Code by, music to Flow by whatever thing.

46
00:02:42,719 --> 00:02:46,280
So music to Code by, you know, it started long

47
00:02:46,319 --> 00:02:51,879
ago as a project that was on Kickstarter, did an

48
00:02:51,919 --> 00:02:55,879
album with three tracks and sent out a CD, and

49
00:02:55,919 --> 00:02:58,680
then I started making more tracks and selling them digitally

50
00:02:59,560 --> 00:03:01,159
and it all was going pretty well, and it kind

51
00:03:01,159 --> 00:03:04,479
of slowed down quite a lot, and then every once

52
00:03:04,479 --> 00:03:07,319
in a while, I'd throw out another track every year,

53
00:03:07,479 --> 00:03:10,280
every couple of years. And I really wanted to market

54
00:03:10,319 --> 00:03:13,560
it outside of developers, because the developers are the only

55
00:03:13,599 --> 00:03:16,080
ones who know what music to code, buy is, and

56
00:03:16,599 --> 00:03:19,360
anybody else looks at that and says, I don't code,

57
00:03:19,520 --> 00:03:21,680
what do I need this for? And so I really

58
00:03:21,719 --> 00:03:25,599
wanted to market it as a you know, a relaxation,

59
00:03:25,800 --> 00:03:29,000
a focused tool to the broader audience. So I tried

60
00:03:29,080 --> 00:03:32,439
music to flow by. Well that didn't really work either,

61
00:03:32,759 --> 00:03:37,560
and so I'm rebranding it yet again, and it's going

62
00:03:37,599 --> 00:03:41,000
to be called Magic Focus Music. Interesting, Yeah, because I

63
00:03:41,039 --> 00:03:44,759
think that kind of describes what it is. And I

64
00:03:44,800 --> 00:03:47,560
don't want to do this as an app. And here's why.

65
00:03:48,000 --> 00:03:53,159
I'm basically charging for access to this music, right And

66
00:03:53,479 --> 00:03:55,439
if you do an app, then you have to go

67
00:03:55,520 --> 00:04:00,599
through the app store in a purchases give thirty percent.

68
00:04:00,800 --> 00:04:03,759
What a what a racket that is? So I'm building

69
00:04:03,800 --> 00:04:08,560
a website. It'll be mobile friendly, you'll sign up, you'll

70
00:04:08,599 --> 00:04:11,599
buy your stuff. It's going to be subscription, it's going

71
00:04:11,680 --> 00:04:17,360
to be affordable. And because I also figure that people

72
00:04:17,399 --> 00:04:20,480
are going to mostly use this like in their laptops,

73
00:04:21,079 --> 00:04:23,199
on their when they're working on their laptops, when they're

74
00:04:23,240 --> 00:04:27,519
on their desktop. So don't really foresee anybody putting it

75
00:04:27,560 --> 00:04:31,240
on on their phone while they're using their phone, because

76
00:04:31,279 --> 00:04:33,639
if he's in their phone, they're not really focusing on anything,

77
00:04:33,680 --> 00:04:36,920
are they true? Yeah, yeah, so that's the story. Look

78
00:04:36,959 --> 00:04:41,439
for music tooflow by dot com. I will mention it

79
00:04:41,519 --> 00:04:43,519
on the show when it is available, but I'm working

80
00:04:43,600 --> 00:04:46,480
on it right now, and in the meantime, if you

81
00:04:46,480 --> 00:04:48,879
want to just download the tracks and manage them yourself,

82
00:04:48,920 --> 00:04:51,800
like most developers like to do, go to music toocoba

83
00:04:51,920 --> 00:04:55,399
dot net. It's the same stuff, all right, It's exactly

84
00:04:55,439 --> 00:04:57,079
the same music. So that's it.

85
00:04:57,160 --> 00:04:59,160
Speaker 2: Cool man, That's what I got. Who's talking to us today,

86
00:04:59,199 --> 00:05:01,959
Richard Grady Calm on Top of Show eighteen sixty one.

87
00:05:02,000 --> 00:05:04,160
We did it with Jeremy back in August of twenty

88
00:05:04,240 --> 00:05:08,399
twenty three. You know that I thought talking about minimal architecture. Hey,

89
00:05:08,399 --> 00:05:10,560
we're going to talk about vertical architecture, but first we

90
00:05:10,560 --> 00:05:13,720
talked about minimal architecture eighteen months ago. So Damien had

91
00:05:13,720 --> 00:05:16,000
this great comedy, said a great episode. I always enjoy

92
00:05:16,040 --> 00:05:19,160
hearing from Jeremy, and it's great to see. Finally a

93
00:05:19,279 --> 00:05:23,560
tapering off of the micro services hype. I found much

94
00:05:23,600 --> 00:05:29,519
greater developer efficiency aggressively building natural quote seams that's seams

95
00:05:30,439 --> 00:05:34,480
seems into projects. Version one or the test edition might

96
00:05:34,519 --> 00:05:37,199
ship is a single process, but built from multiple projects,

97
00:05:37,199 --> 00:05:40,160
which can then be easily broken into deployal microservice if

98
00:05:40,639 --> 00:05:44,199
and when required. Another approach is to have multiple build

99
00:05:44,279 --> 00:05:46,519
versions of a product. One is a single process and

100
00:05:46,560 --> 00:05:49,560
others might be split into multiple micro services. And if

101
00:05:49,560 --> 00:05:51,360
you get your seams right, the amount of additional work

102
00:05:51,399 --> 00:05:54,439
is trivial. It can be a good exercise which forces

103
00:05:54,480 --> 00:05:57,839
clean separations as a project grows and allows simple deployments

104
00:05:57,879 --> 00:06:01,279
and a fast develop when the mega load volumes are required.

105
00:06:02,079 --> 00:06:04,439
I find it useful to actively try and separate development

106
00:06:04,519 --> 00:06:08,160
from ultimate deployment. The vast majority of our business code

107
00:06:08,199 --> 00:06:10,560
can run just as well on a watch as in

108
00:06:10,560 --> 00:06:14,759
the cloud. Although obstensibly ridiculous, I don't know watch based

109
00:06:14,800 --> 00:06:21,160
development approaching AI. Yeah, well, of course you'll have.

110
00:06:21,120 --> 00:06:24,720
Speaker 1: To have a cy my coffee cup as AI in it.

111
00:06:24,839 --> 00:06:30,279
Speaker 2: Yes, my fork. Although obstensibly ridiculous, as all AI projects

112
00:06:30,279 --> 00:06:32,920
are approaching designs with the goal of running it on

113
00:06:33,000 --> 00:06:35,720
a watch can push towards some good, clean design decisions.

114
00:06:35,800 --> 00:06:37,920
I think you got a good insight here, Damien, which

115
00:06:37,959 --> 00:06:42,000
is you're pushing on Conway's law that if we organize

116
00:06:42,040 --> 00:06:46,600
the project into logical units, those are the those become

117
00:06:46,639 --> 00:06:49,720
the natural seams. So you start thinking about what are

118
00:06:49,759 --> 00:06:52,720
the areas of resonance, like what's likely to change, keep

119
00:06:52,759 --> 00:06:55,839
that separate, and whether you compile it all into one

120
00:06:55,839 --> 00:06:58,839
big assembly or not doesn't matter. Right, The deployment is

121
00:06:58,879 --> 00:07:01,439
separate from the construction. So Damian, thank you so much

122
00:07:01,480 --> 00:07:03,199
for your comment, and a copy of musico By. It's

123
00:07:03,240 --> 00:07:04,399
on its way to you. And if you'd like a

124
00:07:04,399 --> 00:07:06,079
copy of musico By, I write a comment on the

125
00:07:06,079 --> 00:07:08,240
website at dot at Rocks, dot Commra on the Facebook,

126
00:07:08,240 --> 00:07:10,120
so we publish every show there, and if you comment

127
00:07:10,120 --> 00:07:11,319
there at everyady on the show, we'll send you a

128
00:07:11,399 --> 00:07:12,160
copy of music Oe.

129
00:07:12,240 --> 00:07:15,560
Speaker 1: And you can follow us on the other social media's.

130
00:07:15,639 --> 00:07:18,759
We've been on ex Twitter forever. We're also on mastadon

131
00:07:19,079 --> 00:07:24,240
and at Blue Sky, which is really coming along, and

132
00:07:23,480 --> 00:07:29,600
some aberration of at Carl Franklin and at Rich Campbell absolutely. Yeah.

133
00:07:29,680 --> 00:07:33,079
All right, So before we introduced Jeremy Miller, let's talk

134
00:07:33,079 --> 00:07:37,000
about nineteen thirty nine. Some significant events included the start

135
00:07:37,040 --> 00:07:37,800
of World War two.

136
00:07:38,199 --> 00:07:39,600
Speaker 2: Yeah, that's kind of a significant event.

137
00:07:39,720 --> 00:07:43,600
Speaker 1: Yeah. Germany invaded Poland on September first, leading Britain and

138
00:07:43,639 --> 00:07:46,920
France declare war on Germany. Additionally, this year saw the

139
00:07:47,000 --> 00:07:51,000
debut of iconic cultural works like The Wizard of Oz

140
00:07:51,600 --> 00:07:55,120
and the first NCAA basketball tournament. What do you got

141
00:07:55,120 --> 00:07:56,000
on near lest Richard?

142
00:07:56,160 --> 00:07:58,240
Speaker 2: You know, I've been doing I've been doing the future

143
00:07:58,240 --> 00:08:00,959
of energy since the Worldwide Energy Geek out what ten

144
00:08:01,040 --> 00:08:05,680
years ago, and that finally spun into folks asking me

145
00:08:05,879 --> 00:08:08,920
to do talks just on nuclear power, which and now

146
00:08:08,959 --> 00:08:11,879
I've done for the past year or so. And interesting, curiously,

147
00:08:11,879 --> 00:08:14,079
I started doing them before it got really exciting, because

148
00:08:14,079 --> 00:08:16,399
it really has been around on to nuclear power. But

149
00:08:16,560 --> 00:08:19,480
one of the cornerstones of that entire story is starts

150
00:08:19,480 --> 00:08:25,240
in nineteen thirty nine when Autahon and lease Meitner published

151
00:08:25,240 --> 00:08:28,959
the paper on splitting a uranium atom for the first time. Wow,

152
00:08:30,279 --> 00:08:34,519
And interestingly, they calculated the yield of the energy of

153
00:08:34,559 --> 00:08:39,679
splitting that atom from Einstein's nineteen oh five paper equals

154
00:08:39,799 --> 00:08:43,440
mc squared and he was absolutely completely right, Like the

155
00:08:43,519 --> 00:08:47,720
numbers worked perfectly. So thirty something years before this guy

156
00:08:47,759 --> 00:08:51,000
had figured out, well, if you really could convert matter

157
00:08:51,039 --> 00:08:53,720
into energy, this is how much you'd get. And that

158
00:08:54,000 --> 00:08:56,759
paper is sorted to the foundational piece like first time

159
00:08:56,840 --> 00:08:59,519
the intentionally split the ADAM was nineteen thirty nine and

160
00:09:00,000 --> 00:09:03,279
eighteen forty five they will deploy the first automic bomb.

161
00:09:03,639 --> 00:09:07,120
Speaker 1: I don't know if it was this paper or which

162
00:09:07,200 --> 00:09:11,440
one that after it was proven, they came to Einstein

163
00:09:11,480 --> 00:09:13,879
and said, professor, you were right, you were right. Isn't

164
00:09:13,879 --> 00:09:15,720
that a victory for you. He says, no, it's a

165
00:09:15,759 --> 00:09:16,720
victory for God.

166
00:09:18,879 --> 00:09:24,960
Speaker 2: Very that's very Einsteinian. Yeah, yeah, but yeah, he's it's

167
00:09:25,000 --> 00:09:27,840
amazing how quickly all of that happened. Yeah, you know.

168
00:09:27,879 --> 00:09:31,320
The good news is from that came this paper from

169
00:09:31,399 --> 00:09:34,799
the English, the mod Report, that said both we can

170
00:09:34,879 --> 00:09:36,679
use this to make energy and we can use this

171
00:09:36,759 --> 00:09:41,120
to make weapons, and whereupon they probably did both.

172
00:09:41,360 --> 00:09:41,919
Speaker 1: Yeah.

173
00:09:42,000 --> 00:09:44,480
Speaker 2: Yeah, nineteen thirty nine pivotal year and.

174
00:09:44,639 --> 00:09:47,559
Speaker 1: A pivotal episode of dot net rocks. Because our old

175
00:09:47,600 --> 00:09:51,799
friend Jeremy Miller is here. And you know, if if

176
00:09:51,840 --> 00:09:54,799
you're younger than us. You probably you might know who

177
00:09:54,840 --> 00:09:57,559
he is, but if you've been around for a few

178
00:09:57,639 --> 00:10:00,320
years like we have, you'll definitely know. So I'm going

179
00:10:00,360 --> 00:10:03,440
to read your bio anyway. Jeremy Jeremy Miller started his

180
00:10:03,519 --> 00:10:07,080
career as a real engineer that's in quotes, but wandered

181
00:10:07,080 --> 00:10:10,639
into software because that looked like more fun. Since then,

182
00:10:10,759 --> 00:10:14,840
Jeremy has worked in and led software development teams in

183
00:10:14,879 --> 00:10:21,120
the computer manufacturing industry, finance, insurance, healthcare, and banking industries. Lately,

184
00:10:21,200 --> 00:10:24,519
Jeremy has been focused on leading software architecture and teams

185
00:10:24,960 --> 00:10:28,720
and helping mentor other software architects, and by lately I

186
00:10:28,720 --> 00:10:33,759
mean the last ten years right. Having had roles both

187
00:10:33,919 --> 00:10:37,480
as an in house software architect and software consultant, Jeremy

188
00:10:37,559 --> 00:10:40,240
has a great deal of insight into the challenges that

189
00:10:40,279 --> 00:10:45,000
confront companies developing and maintaining enterprise systems over time. Jeremy

190
00:10:45,039 --> 00:10:47,679
is well known for his open source software tools, starting

191
00:10:47,679 --> 00:10:52,759
with structure Map and continuing to Martin and Wolverine and others.

192
00:10:52,840 --> 00:10:55,519
Jeremy is also a frequent author and technical speaker at

193
00:10:55,519 --> 00:11:00,000
software conferences and can be found at JEREMYD. Miller dot com.

194
00:11:00,440 --> 00:11:03,759
Welcome back, sir, thank you very much and very sorry.

195
00:11:03,879 --> 00:11:07,000
Speaker 3: Let me apologize for writing such a ridiculously long I

196
00:11:07,120 --> 00:11:08,039
hope for you.

197
00:11:08,120 --> 00:11:11,279
Speaker 1: Well, people need to know who you are, and uh, yeah,

198
00:11:11,759 --> 00:11:17,399
you're the guy. And Hibernate Mafia member is not in there, however, heard.

199
00:11:17,600 --> 00:11:20,840
Speaker 3: Oh if we could just kindly kindly let that one,

200
00:11:22,000 --> 00:11:23,000
that one go by.

201
00:11:23,039 --> 00:11:24,080
Speaker 2: A long time ago.

202
00:11:24,279 --> 00:11:26,159
Speaker 1: Man, that's right, nobody remembers.

203
00:11:26,279 --> 00:11:29,639
Speaker 3: Yeah, most of your audience, most of your audience is wondering,

204
00:11:29,679 --> 00:11:30,879
what is it Hybernate.

205
00:11:31,320 --> 00:11:32,960
Speaker 1: That's all right, we don't need to tell him.

206
00:11:35,440 --> 00:11:37,360
Speaker 2: How is the critter stack these days?

207
00:11:37,639 --> 00:11:40,759
Speaker 3: Yeah, so the critive sack. Somebody was making fun of

208
00:11:40,759 --> 00:11:44,679
that today. Martin and Wolverine moving along very well. So

209
00:11:44,759 --> 00:11:47,799
at this point, you know, the shameless plug park. At

210
00:11:47,799 --> 00:11:50,559
this point, I would say Martin is the most widely

211
00:11:50,679 --> 00:11:54,480
used to ben sourcing tool dotnet. I think it's by

212
00:11:54,519 --> 00:11:57,519
far and away the most robust. I think we're this.

213
00:11:57,919 --> 00:12:00,480
We had such a huge year last year in terms

214
00:12:00,519 --> 00:12:04,120
of future development. I think I'm ready at the point

215
00:12:04,120 --> 00:12:06,320
to say I think we stand up against any events

216
00:12:06,360 --> 00:12:12,759
sourcing infrastructure across any ecosystem. Nice good Wolverine completes Wolverine

217
00:12:12,759 --> 00:12:15,879
and some other littler things complete the the the whole

218
00:12:15,919 --> 00:12:20,720
critter stack, and that is that's a purposeful theme. Moving

219
00:12:20,759 --> 00:12:23,080
really fast on that, and like one of the specifics

220
00:12:23,120 --> 00:12:26,320
we'll talk about is how Wolverine has some special sauce

221
00:12:26,360 --> 00:12:31,080
for doing vertical slice architecture and almost to take the well,

222
00:12:31,080 --> 00:12:33,559
eventually you're gonna let you, you're gonna make me, let

223
00:12:33,559 --> 00:12:36,720
me take a tangent on your comment from Damian earlier.

224
00:12:37,759 --> 00:12:40,440
It's also developing a lot of special sauce for doing

225
00:12:40,519 --> 00:12:44,480
modular monoliths, and we might wanna, might want to talk

226
00:12:44,559 --> 00:12:47,639
about why the modular monolith idea is absolutely not a

227
00:12:47,679 --> 00:12:50,639
silver bullet and there's a lot more challenges than I

228
00:12:50,639 --> 00:12:52,480
think people are recognizing right now.

229
00:12:52,600 --> 00:12:54,519
Speaker 2: Yeah, dude, if there was an easy way to do it,

230
00:12:54,519 --> 00:12:56,159
we'd be doing it. Everything is hard.

231
00:12:57,519 --> 00:12:58,440
Speaker 3: Yeah, it was easy.

232
00:12:58,440 --> 00:13:00,679
Speaker 2: You could buy it at seven to eleven. Everything is

233
00:13:00,720 --> 00:13:05,799
definitely hard. You know, we've kept circling back on this idea.

234
00:13:05,799 --> 00:13:08,360
I mean, of course twenty something years have done at Rocks.

235
00:13:09,000 --> 00:13:12,200
We've gone through it all. Man, Like, remember when SOA

236
00:13:12,399 --> 00:13:16,240
was a good idea and yeah, then we talked about

237
00:13:16,279 --> 00:13:18,960
the various globs of goo and now you call them

238
00:13:19,000 --> 00:13:22,840
monoliths and then you know this modularization or peeling pieces

239
00:13:22,840 --> 00:13:25,960
off like it's it's a cycle, right, you know, we're

240
00:13:26,000 --> 00:13:27,279
all trying to build better software.

241
00:13:27,440 --> 00:13:30,440
Speaker 1: SOA was an eye opener for me, not in the

242
00:13:30,720 --> 00:13:33,879
implementation that was suggested at the time, because I thought

243
00:13:33,879 --> 00:13:36,080
that was way over architected, but just the idea of

244
00:13:36,120 --> 00:13:40,200
having islands. I thought that was a good idea, and

245
00:13:40,279 --> 00:13:42,279
it was one that hadn't occurred to me up to then.

246
00:13:42,480 --> 00:13:44,559
Speaker 3: I think you read it to it more so. I

247
00:13:44,679 --> 00:13:47,679
was a Dell Computers at the time when when Dell

248
00:13:47,799 --> 00:13:51,720
still manufactured their own stuff. So I'm trying to apply

249
00:13:51,799 --> 00:13:55,360
that to at the time manufacturing it when you have

250
00:13:55,440 --> 00:13:59,200
shipping systems and inventory systems and a million and one

251
00:13:59,399 --> 00:14:02,440
little one off things where they may need to want

252
00:14:02,480 --> 00:14:03,960
to talk to each other, where you don't want to

253
00:14:04,039 --> 00:14:08,600
duplicate as much data, you know, SOA was it was

254
00:14:08,639 --> 00:14:12,000
attractive at least in theory, right I don't I don't

255
00:14:12,000 --> 00:14:14,360
think anybody wants to reuse any of the mechanisms we

256
00:14:14,559 --> 00:14:15,279
use back then though.

257
00:14:15,360 --> 00:14:17,240
Speaker 1: Now, yeah, that's exactly what I'm saying.

258
00:14:17,360 --> 00:14:20,320
Speaker 2: Tooling is always a problem with this idea that SO

259
00:14:20,679 --> 00:14:23,159
was catching. It was basically at the forefront of the

260
00:14:23,200 --> 00:14:25,720
fact that we were about to blow the client up, right,

261
00:14:25,759 --> 00:14:27,639
that that you were going to have phones, were going

262
00:14:27,679 --> 00:14:29,360
to be real clients. There was going to be multiple

263
00:14:29,360 --> 00:14:32,240
devices and multiple platforms, you know, coming out of the

264
00:14:32,279 --> 00:14:35,000
wind Tell hegemony where you were building on the same

265
00:14:35,039 --> 00:14:37,279
machine that everybody was working from. Or we didn't ever

266
00:14:37,360 --> 00:14:39,720
think about it all that, which was a weird time.

267
00:14:40,519 --> 00:14:43,120
It is always said, hey, this back end code you'll

268
00:14:43,159 --> 00:14:45,600
work for everything. You'll only have to write that once

269
00:14:45,679 --> 00:14:47,240
and now you'll be You just got to set a

270
00:14:47,279 --> 00:14:50,080
services that you can decide what client you want to use.

271
00:14:50,960 --> 00:14:54,559
Speaker 3: Yes, that also went also went a lot easier when

272
00:14:54,559 --> 00:14:57,320
we gave up on the full XML soap.

273
00:14:57,120 --> 00:15:00,000
Speaker 2: Thing and oh lord save from eximum.

274
00:15:00,399 --> 00:15:03,000
Speaker 3: Yeah, we're old enough. We lived through.

275
00:15:02,919 --> 00:15:04,919
Speaker 2: The wisdole, the wisdole nightmare.

276
00:15:05,039 --> 00:15:05,240
Speaker 1: Yeah.

277
00:15:05,279 --> 00:15:08,879
Speaker 3: Hell uh are systems that did three or four levels

278
00:15:08,919 --> 00:15:12,200
of XML transformation to the point where you had no

279
00:15:12,240 --> 00:15:15,240
traceability between up to downstream.

280
00:15:14,799 --> 00:15:16,799
Speaker 1: Right, we should never have needed biz talk.

281
00:15:18,600 --> 00:15:21,000
Speaker 2: Yeah, I mean the origins of bis talk before the

282
00:15:21,080 --> 00:15:26,600
soap layer were you know, pre Internet intercommunications, Like they

283
00:15:26,600 --> 00:15:32,120
were doing serious transformation of data for connecting between companies. Right,

284
00:15:32,519 --> 00:15:35,399
the fact that we standardize the network and then it

285
00:15:35,440 --> 00:15:37,799
starts standardizing protocols. You're right, we should have been able

286
00:15:37,840 --> 00:15:39,720
to move away from it biz talk. I think just

287
00:15:39,759 --> 00:15:42,480
tried to stay relevant. Yeah, Plus we kept screwing up.

288
00:15:43,559 --> 00:15:47,720
These interplay protocols were bad, right, and they were always

289
00:15:47,799 --> 00:15:49,399
bad like CORBA was bad.

290
00:15:50,279 --> 00:15:52,559
Speaker 3: Is the last we will go down this rabbit hole.

291
00:15:52,600 --> 00:15:55,600
The last video I recorded, we talked about DCOM, a

292
00:15:55,720 --> 00:15:56,840
DCOM war story.

293
00:15:56,919 --> 00:15:59,759
Speaker 2: So oh boy, and you know the D stands for dumb.

294
00:16:00,879 --> 00:16:05,279
Speaker 1: Welcome to three old guys talking about technology that doesn't

295
00:16:05,279 --> 00:16:06,039
exist anymore.

296
00:16:06,440 --> 00:16:09,679
Speaker 2: But to the to your point, it's better now, right,

297
00:16:09,799 --> 00:16:14,039
Like we have learned, we have better platforms, we have

298
00:16:14,120 --> 00:16:17,519
more standardization. We we understand what a cloud proxy is

299
00:16:17,559 --> 00:16:19,720
for and why it makes our lives so much better.

300
00:16:19,840 --> 00:16:20,960
Like things are better.

301
00:16:22,120 --> 00:16:24,840
Speaker 3: I'll go farther the done it, I mean, we're all

302
00:16:24,840 --> 00:16:28,759
done at guys. Here the donet ecosystem, I think it's

303
00:16:28,840 --> 00:16:33,919
just generation vastly better after the dynat core wave of things.

304
00:16:34,120 --> 00:16:38,679
Some of the low level abstractions that they put in

305
00:16:38,799 --> 00:16:44,000
place I host, the I configuration, eyewagger, those standard interfaces,

306
00:16:44,039 --> 00:16:47,960
the I host builder, so much of that has.

307
00:16:48,279 --> 00:16:51,320
Speaker 2: I'm coupling it from Windows entirely. That process, that rething

308
00:16:51,519 --> 00:16:53,399
just made it a better profit platform.

309
00:16:53,519 --> 00:16:56,759
Speaker 3: Yes, I'm I'm doing this on a Mac. I haven't

310
00:16:56,799 --> 00:17:02,000
coded on Windows in years except for Pararelel. Yeah. Love

311
00:17:02,039 --> 00:17:02,799
the new World Order.

312
00:17:02,879 --> 00:17:04,119
Speaker 1: Now with dot net nine.

313
00:17:04,319 --> 00:17:06,799
Speaker 2: Yeah, well, and in the cloud, you're crazy not to

314
00:17:06,920 --> 00:17:09,359
run it on Linux. Run dot nen olynux. It's a

315
00:17:09,400 --> 00:17:11,000
twenty five percent discount if you do.

316
00:17:10,960 --> 00:17:12,839
Speaker 1: It and add dot Net nine into the mix and

317
00:17:13,039 --> 00:17:16,359
using what eighty percent less memory or something crazy like that.

318
00:17:17,440 --> 00:17:20,279
Dot Net nine uses so much less memory.

319
00:17:20,279 --> 00:17:22,880
Speaker 3: So I'm not I'm not really running apps in production

320
00:17:23,039 --> 00:17:25,039
to know that, but I can say every time we

321
00:17:25,079 --> 00:17:28,640
get a new dot net version, my build times go down. Yeah, yeah,

322
00:17:28,799 --> 00:17:30,119
cannot complain.

323
00:17:30,200 --> 00:17:32,680
Speaker 2: And you and run times are faster like they really,

324
00:17:32,960 --> 00:17:36,119
I don't know how they can keep this up. Is

325
00:17:36,160 --> 00:17:39,480
there a law? Is there a law of this? At

326
00:17:39,480 --> 00:17:41,799
some point it's only one bit being flipped, and that's

327
00:17:41,839 --> 00:17:42,440
just not enough.

328
00:17:42,519 --> 00:17:45,000
Speaker 1: There it is Campbell's law right there. Yeah, you heard

329
00:17:45,000 --> 00:17:50,880
it here. First, we will continue optimizing until there's only

330
00:17:50,920 --> 00:17:51,519
one bit.

331
00:17:51,839 --> 00:17:55,079
Speaker 2: Yeah, down to a bit. Wait, we were going to

332
00:17:55,079 --> 00:17:57,039
talk about something today, I'm sure what we were.

333
00:17:57,160 --> 00:18:01,000
Speaker 1: We were vertical architecture with some thing you expressed an

334
00:18:01,000 --> 00:18:01,480
interest in.

335
00:18:01,680 --> 00:18:06,359
Speaker 3: Well, it's taking out the vertical slice architecture. But so

336
00:18:06,559 --> 00:18:09,640
this might be a sequel to a sequel or continuation

337
00:18:09,720 --> 00:18:11,559
in the last time time I got together with you

338
00:18:11,559 --> 00:18:16,400
got it? M h. So the phrase vertical slice architecture,

339
00:18:16,400 --> 00:18:20,839
it's popularized by by Jimmy Boguard in the dot net space.

340
00:18:20,880 --> 00:18:25,200
It's you know, it's very very tightly associated with mediator.

341
00:18:26,519 --> 00:18:30,920
Of course, Wolverine supports it, supports it quite differently potentially,

342
00:18:32,039 --> 00:18:34,839
but I guess maybe stop and you know, to explain

343
00:18:34,920 --> 00:18:37,400
what it is. I always got to stop and contrast

344
00:18:37,440 --> 00:18:41,839
it to what's coming before or what's really the state

345
00:18:41,880 --> 00:18:45,039
of the art, at least a few years ago. I'm

346
00:18:45,039 --> 00:18:47,799
sure you guys have plenty of shows with folks coming

347
00:18:47,839 --> 00:18:52,880
on to talk about clean architecture, onion architecture, extagonal ports

348
00:18:52,880 --> 00:18:55,759
and adapters, done it right. I've been there, done now.

349
00:18:56,200 --> 00:19:02,279
So they're very well meaning attempts to try to, you know,

350
00:19:02,359 --> 00:19:05,839
establish a kind of a standard for a team get

351
00:19:05,880 --> 00:19:12,200
better results of we want to disentangle business logic from infrastructure.

352
00:19:12,559 --> 00:19:16,799
We'd like to make things testable. And then folks started

353
00:19:16,839 --> 00:19:22,160
to throughout all of these enterprise architecture templates, these prescriptive

354
00:19:22,440 --> 00:19:24,559
you know, look at my repository and I'll tell you

355
00:19:24,920 --> 00:19:27,799
the emptying projects. You have to divide things into the

356
00:19:27,880 --> 00:19:31,200
rules of what things are called, how they're divided. You

357
00:19:31,240 --> 00:19:34,519
know where this goes. So I think we took a

358
00:19:34,559 --> 00:19:38,559
couple of wrong terms. We you know, first thing we

359
00:19:38,599 --> 00:19:42,359
did is these these temples tend to focus too much on,

360
00:19:43,279 --> 00:19:45,680
you know, the nouns of the system. I have an

361
00:19:45,680 --> 00:19:48,400
invoice controller that talks to an invoice service that must

362
00:19:48,440 --> 00:19:51,440
talk to an invoice repository, and they've all got to

363
00:19:51,440 --> 00:19:52,640
be an emptying different.

364
00:19:52,319 --> 00:19:53,839
Speaker 1: Projects, right, an email sender.

365
00:19:54,880 --> 00:19:59,200
Speaker 3: Yeah, and you know every system, every enterprise system, grows

366
00:19:59,279 --> 00:20:03,680
until there's messaging service right right. Yeah, I've done lots

367
00:20:03,680 --> 00:20:10,519
of those. But you know, it's made us kind of overemphasized,

368
00:20:10,519 --> 00:20:14,319
maybe throwing in a lot of abstractions. You know, we

369
00:20:14,319 --> 00:20:16,599
we maybe took a little too seriously the idea that

370
00:20:16,720 --> 00:20:19,640
it has to be possible to swap out your infrastructure

371
00:20:19,640 --> 00:20:23,240
at a moment's notice, which you know nobody really does

372
00:20:24,240 --> 00:20:29,640
are very rarely right. So what happens in bigger enterprise

373
00:20:29,680 --> 00:20:35,440
systems is you get these huge horizontal layers where every

374
00:20:35,680 --> 00:20:38,519
use case has to bounce through all of these separate layers,

375
00:20:39,160 --> 00:20:41,680
and it becomes very difficult to reason about a single

376
00:20:41,759 --> 00:20:45,160
use case. It's all scattered around, right. You can't really

377
00:20:45,240 --> 00:20:49,039
update anything anyway, even though you have these abstractions, because

378
00:20:49,079 --> 00:20:53,400
it's a full project to replace the database or upgrade

379
00:20:53,400 --> 00:20:57,599
a technology. It's just too bit So. The kind of

380
00:20:57,599 --> 00:21:00,119
Reacto logical reaction to that is the idea of a

381
00:21:00,200 --> 00:21:03,680
vertical slice architecture we are going to take. We're going

382
00:21:03,759 --> 00:21:07,400
to primarily organize code, and here I'm just talking about

383
00:21:07,400 --> 00:21:10,119
how we situate code. I'm not even really talking about

384
00:21:10,240 --> 00:21:13,880
changing the basic constructions or anything like that, but we're

385
00:21:13,920 --> 00:21:17,680
going to try to lean towards organizing code around use

386
00:21:17,720 --> 00:21:21,960
cases or especially works well with cqurs. I'm going to

387
00:21:22,039 --> 00:21:25,359
organize code around the command and everything it takes to

388
00:21:25,400 --> 00:21:29,240
handle that command or ACQUERI and everything that they square it.

389
00:21:29,839 --> 00:21:31,599
The general idea is I'm going to take things that

390
00:21:31,640 --> 00:21:33,640
are closely related and I'm going to put them together,

391
00:21:34,039 --> 00:21:36,119
and things that are not related, I'm going to spread

392
00:21:36,119 --> 00:21:36,559
them out.

393
00:21:36,880 --> 00:21:40,680
Speaker 1: Right, So the vertical slice is starts when somebody clicks

394
00:21:40,680 --> 00:21:44,079
a button, let's say on the website and ends when

395
00:21:44,160 --> 00:21:48,240
there's a result, an end result, whether that goes through

396
00:21:48,279 --> 00:21:52,559
a queue or through databases and all these other services,

397
00:21:53,119 --> 00:21:57,680
all those things happen in one place that isn't shared

398
00:21:57,839 --> 00:21:58,839
with the other slices.

399
00:21:59,319 --> 00:22:01,279
Speaker 3: So I won't go so I will go all the

400
00:22:01,279 --> 00:22:04,279
way to that extreme. I mean, I would say it's

401
00:22:04,319 --> 00:22:09,000
perfectly valid to share some helper code. But yeah, so

402
00:22:09,200 --> 00:22:11,640
I really think of it as like a single web request.

403
00:22:11,720 --> 00:22:16,079
You're issuing a create invoice or approve invoice command to

404
00:22:16,400 --> 00:22:20,680
an HP endpoint. So everything that it takes to fully

405
00:22:21,279 --> 00:22:24,839
apply that, you know, whatever data you need to fetch,

406
00:22:25,200 --> 00:22:28,960
reading the HP validation business rules, it might have to

407
00:22:29,039 --> 00:22:33,599
happen in finally, persistence, if you were using you know,

408
00:22:33,640 --> 00:22:37,000
Woolring for example. Our idiom is to try to push

409
00:22:37,039 --> 00:22:39,400
you to really do that in one code file.

410
00:22:40,640 --> 00:22:43,680
Speaker 2: So, I mean, are you talking about everything through all

411
00:22:43,720 --> 00:22:46,799
of those layers just being a single apply.

412
00:22:46,839 --> 00:22:49,119
Speaker 1: Well, you're you're separating the UI though, right.

413
00:22:49,400 --> 00:22:51,960
Speaker 3: Yeah, yeah, if it's small enough.

414
00:22:52,079 --> 00:22:52,279
Speaker 1: Yeah.

415
00:22:52,319 --> 00:22:55,079
Speaker 3: Yeah. I'm a I'm a back end guy. Oka, yeah, Okay,

416
00:22:55,160 --> 00:22:57,680
nobody would let me do front end work unless you

417
00:22:57,680 --> 00:22:58,279
you're desperate.

418
00:22:58,480 --> 00:23:00,440
Speaker 1: Yeah, I don't think you'd want to put that in

419
00:23:00,519 --> 00:23:01,599
your UI. Yeah.

420
00:23:01,680 --> 00:23:04,319
Speaker 3: No, no, no, no no, I mean that there's a

421
00:23:04,519 --> 00:23:07,839
there's a fallow up conversation. Get somebody on to talk

422
00:23:07,880 --> 00:23:14,920
about composite UI someday. But that's okay. So if it's

423
00:23:14,920 --> 00:23:16,920
if the use case is small enough, I mean, if

424
00:23:16,960 --> 00:23:18,960
it gets big, and you know it's probably with all

425
00:23:18,960 --> 00:23:22,319
those prescriptive templates, they blow up. Is sometimes a particular

426
00:23:22,400 --> 00:23:24,200
use case may be too big, and then you start

427
00:23:24,240 --> 00:23:28,000
splitting things up helpers, maybe you draw out split off

428
00:23:28,039 --> 00:23:31,680
message handlers. But what we're doing with vertical slice is

429
00:23:31,720 --> 00:23:36,400
we're saying, you know, we're not so worried about necessarily

430
00:23:36,440 --> 00:23:40,039
swapping out infrastructure. But I'll come back to that. What

431
00:23:40,119 --> 00:23:41,720
you want, though, is you want to make it as

432
00:23:41,720 --> 00:23:44,599
easy as possible to reason about what is happening in

433
00:23:44,599 --> 00:23:48,000
my system from this input to the outputs it makes

434
00:23:48,279 --> 00:23:51,599
because the business logic changes all the time. Yeah, and

435
00:23:52,519 --> 00:23:54,200
that's where your bug fixes are going to go.

436
00:23:55,640 --> 00:23:57,759
Speaker 1: So you're saying, if you have everything in one file,

437
00:23:57,880 --> 00:24:00,400
you don't have to step through the debugger and find

438
00:24:00,400 --> 00:24:04,480
out which modules are being touched in which where they're coming.

439
00:24:04,559 --> 00:24:06,640
And then now you've got this mental list of all

440
00:24:06,640 --> 00:24:09,119
these places where you have to make changes. It's all

441
00:24:09,160 --> 00:24:10,200
in one file.

442
00:24:10,640 --> 00:24:13,480
Speaker 3: In the ideal and the ideal you know some things

443
00:24:13,519 --> 00:24:15,839
are going to be too big for that yet out.

444
00:24:15,960 --> 00:24:20,240
But yeah, now to your point, I mean to go

445
00:24:20,400 --> 00:24:24,480
into apostasy here. You know, if you're doing it to

446
00:24:24,519 --> 00:24:30,359
Wolverine style, we're going to push you to ditch repository layers. Well,

447
00:24:30,559 --> 00:24:32,920
at least as a go to default move. There's always

448
00:24:33,039 --> 00:24:38,599
exceptions to directly utilize. If you're using a core use

449
00:24:38,640 --> 00:24:41,920
the dB context. If you're using Martin Martin, you're going

450
00:24:42,000 --> 00:24:45,720
to use I Document Store, Die document session directly with

451
00:24:46,039 --> 00:24:50,319
a huge caveat here. You know, in our case, we

452
00:24:50,359 --> 00:24:53,359
want it still to be in one file, but we'll

453
00:24:53,359 --> 00:24:56,559
take other steps to isolate the business logic code away

454
00:24:56,599 --> 00:25:00,119
from infrastructure so you can and kind of I'll come

455
00:25:00,200 --> 00:25:02,720
back to that, but to be able to go right

456
00:25:02,799 --> 00:25:05,240
down to the metal so you can use every last

457
00:25:05,279 --> 00:25:07,960
bit of power in your data persistence tooling. You know

458
00:25:08,160 --> 00:25:12,519
you need to fiddle with lazy versus eager fetching to

459
00:25:12,559 --> 00:25:15,400
be faster. You need to batch up quaring to be faster.

460
00:25:16,079 --> 00:25:19,799
Speaker 1: Would you still want to use a CRUD interface. I mean,

461
00:25:19,799 --> 00:25:22,160
that's the essence of what a repository is. Isn't it

462
00:25:22,160 --> 00:25:25,799
so that you could swap out whatever you know, database

463
00:25:25,960 --> 00:25:29,279
back end for testing memory repository for example.

464
00:25:29,640 --> 00:25:32,680
Speaker 3: Okay, so this is the part where people are going

465
00:25:32,720 --> 00:25:35,359
to give you angry comments later, right, No, please bring

466
00:25:35,359 --> 00:25:37,359
it on a little bit controversy. So we've got two

467
00:25:37,359 --> 00:25:40,079
issues here. You know, on one hand, what are we going

468
00:25:40,160 --> 00:25:43,279
to do to be able to swap out infrastructure? Right?

469
00:25:43,440 --> 00:25:43,880
Speaker 1: Mm hmm.

470
00:25:43,920 --> 00:25:45,359
Speaker 3: We're going to put a pin in that and come

471
00:25:45,400 --> 00:25:45,839
back to it.

472
00:25:45,920 --> 00:25:46,160
Speaker 1: Okay.

473
00:25:46,240 --> 00:25:48,920
Speaker 3: Second point is how do I make code testable? Yeah, so,

474
00:25:49,279 --> 00:25:52,839
especially with the wolverine style, we're leaning really heavily into

475
00:25:52,880 --> 00:25:56,680
an idea from Jim Shore called the A frame architecture.

476
00:25:57,359 --> 00:25:59,960
So in the show notes all I'll sen Joe Link

477
00:26:00,400 --> 00:26:05,279
there's a paper called Testability without Mocks. I recommend to

478
00:26:05,400 --> 00:26:07,839
everybody who works with me sooner or later the A

479
00:26:08,160 --> 00:26:11,559
frame idea like that. Now, if you're talking about, say

480
00:26:11,599 --> 00:26:14,319
we're building a wolf wearine handler, either an h should

481
00:26:14,319 --> 00:26:17,279
be handler or a message handler. That is mean. Let's

482
00:26:17,279 --> 00:26:21,200
say it's a proven invoice, right, so you probably need

483
00:26:21,200 --> 00:26:24,680
to go get the current state of the invoice because

484
00:26:24,680 --> 00:26:26,759
you may need to look at it. Is it already approved,

485
00:26:26,880 --> 00:26:30,960
is everything done? Has you know everybody signed off? Whatever

486
00:26:31,000 --> 00:26:34,559
it takes, and then decide, decide your business logic, decide

487
00:26:34,559 --> 00:26:37,640
what do I knew? Next do I decide to approve

488
00:26:37,680 --> 00:26:39,920
it and go on and maybe send out other fall

489
00:26:40,039 --> 00:26:44,000
up messages or not, and then finally persist it. So

490
00:26:44,039 --> 00:26:47,960
coming to this idea of an A frame, I'm not

491
00:26:48,000 --> 00:26:51,680
gonna worry about interfaces and mock objects or stubs or

492
00:26:51,680 --> 00:26:54,039
fakes or anything like that. We're going to divide things

493
00:26:54,119 --> 00:26:58,079
up into like kind of a controller on top, the

494
00:26:58,920 --> 00:27:01,039
a guy at top. He is going to reach into

495
00:27:01,160 --> 00:27:04,960
data persistence. He's going to grab the invoice data for you,

496
00:27:05,039 --> 00:27:09,079
push it into the business logic. Business logic. In the

497
00:27:09,119 --> 00:27:11,559
case of Wolverine, we're pushing really hard. We want it

498
00:27:11,559 --> 00:27:12,559
to be a pure function.

499
00:27:12,720 --> 00:27:15,720
Speaker 1: Now you keep mentioning Wolverine, but what if people don't

500
00:27:15,799 --> 00:27:18,920
use Wolverine and aren't really familiar with it. How can

501
00:27:18,960 --> 00:27:21,640
you give us an example that doesn't use Wolverine.

502
00:27:22,079 --> 00:27:25,680
Speaker 3: Actually, it's just extracting methods. So whether this was mediator

503
00:27:25,839 --> 00:27:29,319
or whatever, it's going to be, just say say you

504
00:27:29,319 --> 00:27:31,599
have a mediator handler and in service bus handler, mass

505
00:27:31,640 --> 00:27:36,319
transit handler, or just just an MVC controller endpoint. What

506
00:27:36,359 --> 00:27:37,960
you're really going to do is just build off some

507
00:27:38,000 --> 00:27:42,680
some helper methods and that's it. So one method is

508
00:27:42,720 --> 00:27:46,559
the controller, NVC controller is going to talk to E

509
00:27:46,680 --> 00:27:50,359
of Core maybe and pull out the invoice information for you, ok. Right,

510
00:27:50,519 --> 00:27:53,839
and then it's going to call into a method that

511
00:27:53,920 --> 00:27:57,319
is your actual business logic. Who say, here's the command

512
00:27:57,519 --> 00:28:00,759
somebody wants to prove this invoice, and here is the

513
00:28:00,799 --> 00:28:04,039
current state of the invoice. And out of that pure function,

514
00:28:04,960 --> 00:28:06,839
you tell me what to do next. You're going to

515
00:28:06,920 --> 00:28:10,359
return some kind of result that is, here's an event

516
00:28:10,400 --> 00:28:12,319
sourcing It could be here's an event I want you

517
00:28:12,359 --> 00:28:17,240
to append invoice approved or approval rejected, whatever it's going

518
00:28:17,319 --> 00:28:20,920
to be, or maybe something that reflects what to do next.

519
00:28:21,799 --> 00:28:26,799
Now our business business function here I keep saying pure function.

520
00:28:27,359 --> 00:28:30,680
You know we're gonna we're gonna dive into functional programming

521
00:28:30,680 --> 00:28:33,599
world a little bit. People are gonna make fun of

522
00:28:33,599 --> 00:28:33,960
me for this.

523
00:28:34,960 --> 00:28:37,759
Speaker 1: Now, nobody's making fun of you, dude, nobody.

524
00:28:37,920 --> 00:28:39,559
Speaker 3: No, people will on Blue Sky later.

525
00:28:40,079 --> 00:28:41,079
Speaker 1: So nobody.

526
00:28:41,200 --> 00:28:43,319
Speaker 3: We want to isolate that business logic or it's not

527
00:28:43,359 --> 00:28:46,319
depending on services, there's no interfaces to mock it's just

528
00:28:46,799 --> 00:28:49,480
if you have this state in this command, what do

529
00:28:49,559 --> 00:28:52,720
you do next? You get you get business logic in

530
00:28:52,799 --> 00:28:55,480
place where it's really easy to unit test, no mock

531
00:28:55,559 --> 00:28:58,160
set up, no crazy stuff, no in memory database, I

532
00:28:58,200 --> 00:29:01,160
don't care. And in the last step, you know, the

533
00:29:01,240 --> 00:29:04,680
A frame the controller is like I'm getting stuff for you.

534
00:29:04,880 --> 00:29:07,400
I'm pushing into business logic and I'm taking what you

535
00:29:07,480 --> 00:29:10,640
decide to do next, and then I'm persisting it back

536
00:29:10,640 --> 00:29:13,200
to ef core maybe or Martin or whatever it is,

537
00:29:13,759 --> 00:29:18,440
and I'm sending out extra messages. So the A frame architecture,

538
00:29:18,960 --> 00:29:21,920
it is really a coding approach, but it's a way

539
00:29:22,000 --> 00:29:25,039
to isolate your business logic without having to throw in

540
00:29:25,079 --> 00:29:29,880
a lot of abstractions, a lot of indirections and throwing out,

541
00:29:30,000 --> 00:29:33,160
you know, five different projects like you would in onion architecture.

542
00:29:33,319 --> 00:29:36,920
Speaker 1: Right, it simplifies because that that is the fundamental problem

543
00:29:36,920 --> 00:29:41,279
of all these architectures is that they complicate things and

544
00:29:41,319 --> 00:29:44,799
they add all these layers of abstraction for the purpose

545
00:29:44,880 --> 00:29:49,160
of what for you know, for for making it flexible.

546
00:29:49,240 --> 00:29:54,480
But then something is ultimately flexible, it's ultimately difficult to.

547
00:29:54,519 --> 00:29:57,559
Speaker 3: Use it is now back to rewind to the point

548
00:29:57,559 --> 00:30:00,519
and you're you. I think you were correctly challenged. Well,

549
00:30:00,519 --> 00:30:03,000
what if I want to swap out my database? Yeah, yeah,

550
00:30:03,119 --> 00:30:05,880
which you're unlikely to do, but you could, so.

551
00:30:07,200 --> 00:30:09,799
Speaker 2: I always finally, swap out the database defense a weak defense.

552
00:30:09,839 --> 00:30:11,799
It's like, you're probably not going to do that.

553
00:30:12,160 --> 00:30:16,759
Speaker 3: You can't. You can't because if you have a big

554
00:30:16,880 --> 00:30:19,839
enough project and it's a flat layer, you can't because

555
00:30:19,880 --> 00:30:22,440
that's going to be an entire project to do a

556
00:30:22,440 --> 00:30:25,640
full regression testing cycle, and most people can't do it.

557
00:30:25,839 --> 00:30:27,920
Your business partners will never let you do.

558
00:30:27,920 --> 00:30:29,680
Speaker 1: That, all right, But here's a I can give you

559
00:30:29,759 --> 00:30:34,759
an example where you would use a repository pattern basically

560
00:30:34,839 --> 00:30:38,119
a cred interface, right is use you could use the

561
00:30:38,119 --> 00:30:41,680
same interface on a client to create a repository that

562
00:30:41,759 --> 00:30:45,079
calls makes all your API calls, and you could use

563
00:30:45,079 --> 00:30:48,039
the same interface on that same client to do something

564
00:30:48,160 --> 00:30:55,200
against the client side database that I can't even remember

565
00:30:55,200 --> 00:30:58,559
the name of it now because I'm stupid, But I

566
00:30:58,680 --> 00:31:02,519
dB something dB all right.

567
00:31:02,400 --> 00:31:03,599
Speaker 3: Well just local storage?

568
00:31:03,839 --> 00:31:07,279
Speaker 1: Sure, yeah, look not local storage, but there's another there's

569
00:31:07,279 --> 00:31:10,480
another database that's built in a new browser. You can

570
00:31:10,559 --> 00:31:12,960
do that, right and on the back end, if you

571
00:31:13,039 --> 00:31:17,920
wanted to run things against repository that just uses memory

572
00:31:17,920 --> 00:31:21,440
collections to test all your stuff. But I think that

573
00:31:21,839 --> 00:31:25,200
is where you brought up another another thing that you

574
00:31:25,240 --> 00:31:30,160
can test without mocking and test without memory databases and things.

575
00:31:30,240 --> 00:31:32,319
Speaker 3: Yes, so I want to test, be able to test.

576
00:31:32,759 --> 00:31:34,039
I would really want to be able to test the

577
00:31:34,039 --> 00:31:37,720
business logic without without having to do a bunch of

578
00:31:37,720 --> 00:31:41,279
mock setups. You know, if you are as old as us,

579
00:31:41,759 --> 00:31:43,240
and I don't think you have to be anywhere near

580
00:31:43,240 --> 00:31:46,160
as old as US, You've dealt with code bases where

581
00:31:46,559 --> 00:31:51,000
the unit tests were unusually hard to work with because

582
00:31:51,039 --> 00:31:54,640
there was too much reliance on mocking libraries or fakes,

583
00:31:55,000 --> 00:31:58,319
and those tests become very hard to reason about. They

584
00:31:58,400 --> 00:32:01,960
become very brittle because you'reation is too tightly coupled to

585
00:32:02,880 --> 00:32:05,880
the luck the system so indexed dB.

586
00:32:06,160 --> 00:32:07,400
Speaker 1: That's what I was trying to remember.

587
00:32:07,519 --> 00:32:10,240
Speaker 3: Sorry, gotcha, gotcha. I've read about it, never used it.

588
00:32:10,799 --> 00:32:13,559
So a couple of things. The I think your example

589
00:32:13,559 --> 00:32:18,440
of using a repository, I think that's perfectly valid as

590
00:32:18,519 --> 00:32:21,599
far as swapping out the technology. So the single I

591
00:32:21,640 --> 00:32:24,759
think the single best thing you can do to make

592
00:32:24,799 --> 00:32:29,039
your technology swappable is to invest very heavily in having

593
00:32:29,160 --> 00:32:34,480
a very effective test automation infrastructure. That's the one thing

594
00:32:34,480 --> 00:32:37,279
that's going to give you enough feedback to do this,

595
00:32:37,400 --> 00:32:40,160
because you can't just swap out interfaces if you can't

596
00:32:40,200 --> 00:32:43,720
test your app very fast. Right, that's one thing we

597
00:32:43,799 --> 00:32:47,200
keep touching on modular monolith a little bit. And I

598
00:32:47,240 --> 00:32:50,960
think all this is related. I don't think if you

599
00:32:50,960 --> 00:32:55,000
have a big system, it's impossible. It's effectively impossible to

600
00:32:55,000 --> 00:32:58,759
swap out infrastructure in most project planning. But if you

601
00:32:58,839 --> 00:33:01,200
have a way where you could do it bit by

602
00:33:01,559 --> 00:33:04,640
module by module, maybe you could pull that off. Or

603
00:33:04,640 --> 00:33:10,759
if you keep upgrade from whatever SQL server to sql

604
00:33:10,759 --> 00:33:13,880
server to postgraphs for the cheap or hosting, or move

605
00:33:13,960 --> 00:33:16,400
to a different no SQL database or get off Mango

606
00:33:16,480 --> 00:33:18,680
dB or whatever it is, maybe you can do it

607
00:33:18,720 --> 00:33:23,440
one module at a time. Right, a couple other things,

608
00:33:24,799 --> 00:33:29,200
you know, diving into things like performance and whatnot. These

609
00:33:29,279 --> 00:33:32,680
database engines, they do not work the same way at all.

610
00:33:34,200 --> 00:33:38,359
Ef core might be a perfectly good abstraction over relational databases,

611
00:33:38,400 --> 00:33:41,519
which are much more similar than not. I mean, maybe

612
00:33:41,519 --> 00:33:44,359
you can go from SQL server to postcraph, but going

613
00:33:44,480 --> 00:33:49,559
from a relational database to a no SQL database. That's

614
00:33:49,599 --> 00:33:52,680
a very different ballgame. The same abstractions are not going

615
00:33:52,759 --> 00:33:56,759
to work, even the link the link providers, there are

616
00:33:56,920 --> 00:34:01,279
a lot of extensions. You know, people use these repository

617
00:34:01,279 --> 00:34:05,119
abstractions where they let iqueriable link leak out that that's

618
00:34:05,160 --> 00:34:06,559
probably a terrible idea.

619
00:34:07,000 --> 00:34:10,559
Speaker 1: Yeah, they no good, that's a terrible idea. And and

620
00:34:10,639 --> 00:34:11,880
by the way, it doesn't work.

621
00:34:13,039 --> 00:34:13,760
Speaker 3: It doesn't work.

622
00:34:14,039 --> 00:34:18,800
Speaker 1: Inquible requires code, doesn't it. So it does, but it's

623
00:34:18,840 --> 00:34:19,360
not data.

624
00:34:19,519 --> 00:34:23,320
Speaker 3: To make it fast, your equeriable is going to need

625
00:34:23,360 --> 00:34:26,280
a lot of tool specific usage in a lot of cases.

626
00:34:26,639 --> 00:34:30,000
Speaker 1: Yeah, you can't just pass that from a to a

627
00:34:30,039 --> 00:34:33,079
client from an API controller. Yeah, so ask me how

628
00:34:33,119 --> 00:34:33,400
I know.

629
00:34:35,400 --> 00:34:39,199
Speaker 3: Everybody's done that. One I try to the testability point

630
00:34:39,320 --> 00:34:42,159
you brought up. He's like, of course people get excited

631
00:34:42,199 --> 00:34:45,480
about the in memory provider. It's going to behave very

632
00:34:45,480 --> 00:34:48,440
differently than your real database. It will give you false positive.

633
00:34:50,039 --> 00:34:51,920
So another thing I'm going to say is when you're

634
00:34:51,920 --> 00:34:57,119
picking technologies, you very purposely try to pick technologies that

635
00:34:57,239 --> 00:35:00,880
have a very good testability story, right, that play very

636
00:35:01,000 --> 00:35:05,159
nicely inside of automated testing, which is to put my

637
00:35:05,239 --> 00:35:08,239
money where my mouth is on that one, taking Martin

638
00:35:08,480 --> 00:35:12,199
as either document store or it store. Martin has built

639
00:35:12,199 --> 00:35:15,320
in functionality to set up databases on the fly if

640
00:35:15,360 --> 00:35:17,719
you're in development or testing time, and it has the

641
00:35:17,760 --> 00:35:20,880
ability to wipe your database out in one command line.

642
00:35:22,239 --> 00:35:24,480
The point being here is it's just it's actually much

643
00:35:24,519 --> 00:35:29,360
friendlier inside of an integrated test harness then we would

644
00:35:29,360 --> 00:35:31,159
have been used to twenty years ago, where that was

645
00:35:31,199 --> 00:35:32,159
almost impossible.

646
00:35:32,280 --> 00:35:38,079
Speaker 1: Yeah. Hey, getting back to my love for repositories. One

647
00:35:38,119 --> 00:35:39,920
of the things that I do is I have a

648
00:35:41,000 --> 00:35:43,760
an EF repository that's generic, and then I have a

649
00:35:43,800 --> 00:35:48,840
generic Dapper repository. I have a GENERICADO dot net by

650
00:35:48,880 --> 00:35:52,480
itself repository. And that's good because you know, if you

651
00:35:52,559 --> 00:35:56,320
start out with a customer and they like EF and

652
00:35:56,360 --> 00:36:00,559
then there's something, something happens, something whatever, and they're like, no,

653
00:36:00,639 --> 00:36:02,400
we don't like this anymore, we want to move to

654
00:36:02,440 --> 00:36:05,639
ado dot net. Well, then I'll try Dapper. Right. So

655
00:36:05,760 --> 00:36:09,400
I'm not really changing the database per se, I'm changing

656
00:36:09,480 --> 00:36:14,159
the code that accesses the database, and so that's one

657
00:36:14,159 --> 00:36:16,519
of the reasons why. But I want to get your

658
00:36:16,519 --> 00:36:18,920
reaction to this after the break, which we're doing right now.

659
00:36:18,960 --> 00:36:21,599
We'll be right back dot net rocks. Hold on, We'll

660
00:36:21,639 --> 00:36:25,280
be right back. Did you know there's a dot net

661
00:36:25,320 --> 00:36:30,639
on aws community. Follow the social media blogs, YouTube influencers

662
00:36:30,679 --> 00:36:34,440
and open source projects and add your own voice. Get

663
00:36:34,480 --> 00:36:38,280
plugged into the dot net on aws community at aws

664
00:36:38,320 --> 00:36:45,920
dot Amazon dot com, slash dot net. It's dot net rocks.

665
00:36:46,079 --> 00:36:48,599
I'm Carl Franklin. That's my friend Richard Campbell hey, and

666
00:36:48,599 --> 00:36:53,400
our friend Jeremy Miller. And want your reaction to uh

667
00:36:53,639 --> 00:36:56,760
to my love of repositories again and then we'll get

668
00:36:56,760 --> 00:36:58,360
off this. I swear to God.

669
00:37:01,079 --> 00:37:03,679
Speaker 3: No to today's point, what if you want to switch

670
00:37:03,760 --> 00:37:08,000
quickly between dapper rideo, dot net or Core, or you

671
00:37:08,039 --> 00:37:10,079
would to go to old school and bring in hibernade

672
00:37:10,119 --> 00:37:11,360
back because that does still work.

673
00:37:11,559 --> 00:37:13,280
Speaker 1: I have no idea what you're talking about.

674
00:37:16,400 --> 00:37:19,719
Speaker 3: So if you're doing that, I think you're in a

675
00:37:19,800 --> 00:37:24,639
world of I think that might apply well to more

676
00:37:24,719 --> 00:37:28,239
of a creud centric world where I'm editing in order

677
00:37:28,280 --> 00:37:30,800
at a time I'm adding a you know, an invoice

678
00:37:30,800 --> 00:37:35,159
at the time. You know, I hate the phrase pick

679
00:37:35,199 --> 00:37:37,519
the right tool for the job, but pick the right

680
00:37:37,559 --> 00:37:40,039
tool for the job. Most of what I'm talking about

681
00:37:40,119 --> 00:37:43,280
I do deal with larger systems with a lot more workflow,

682
00:37:43,440 --> 00:37:47,719
a lot more complexity than a CREUD system. So what

683
00:37:47,840 --> 00:37:51,199
you're talking about, I think that's fine for something that's

684
00:37:51,199 --> 00:37:54,679
mostly about editing data. But right off the bat, so

685
00:37:55,280 --> 00:37:57,639
you know Richard's an old database guy.

686
00:37:57,960 --> 00:37:58,920
Speaker 1: You mean old.

687
00:38:00,679 --> 00:38:00,880
Speaker 3: Is not.

688
00:38:04,599 --> 00:38:06,000
Speaker 2: So no older than you?

689
00:38:07,119 --> 00:38:09,920
Speaker 3: There are these by two weeks you can write really

690
00:38:09,960 --> 00:38:14,400
bad database you know, database sequel queries. My experience can't

691
00:38:14,400 --> 00:38:17,039
speak for everybody else. My experience, by far away, the

692
00:38:17,079 --> 00:38:21,400
worst cause of very poor performance with the database is

693
00:38:21,480 --> 00:38:25,119
being chatty, making way too many calls back and forth

694
00:38:25,239 --> 00:38:28,679
to the database, even to the point where you know,

695
00:38:28,719 --> 00:38:31,800
in these layering things where you might be calling for

696
00:38:31,880 --> 00:38:33,880
the same data over and over and over again and

697
00:38:33,960 --> 00:38:36,199
you don't even know it because you can't see it. So,

698
00:38:36,239 --> 00:38:39,920
taking that as an example, say you have this is

699
00:38:39,920 --> 00:38:42,079
pretty common. You have a web request and then the

700
00:38:42,119 --> 00:38:45,119
course of handling it, you need to look up three

701
00:38:45,239 --> 00:38:49,199
or four different entities at a time. Sure, right, and

702
00:38:49,800 --> 00:38:53,360
if you take some kind of repository abstraction approach, you're

703
00:38:54,280 --> 00:38:56,440
you don't have to do this, but you probably fall

704
00:38:56,559 --> 00:38:59,320
down that path of having a totally separate repository for

705
00:38:59,360 --> 00:39:04,800
each and right common. That's almost forcing you to do

706
00:39:04,920 --> 00:39:08,559
a very naive, least common common denominator approach of I'm

707
00:39:08,559 --> 00:39:10,840
going to go roll a one and load the second

708
00:39:11,000 --> 00:39:13,079
and load the third. You may be doing it in

709
00:39:13,079 --> 00:39:13,519
plus one.

710
00:39:13,559 --> 00:39:16,880
Speaker 1: Yeah, absolutely, Yeah, there's there's a lot of there's a

711
00:39:16,880 --> 00:39:21,000
lot of queries that just don't that doesn't fit. Yeah.

712
00:39:21,079 --> 00:39:23,440
I mean that that's why we have STAR procedures, isn't it.

713
00:39:23,719 --> 00:39:26,519
You know, we have a procedure that gets Okay, he's

714
00:39:26,559 --> 00:39:30,039
just wincing. Now, he's wincing. He's he's got his fingers

715
00:39:30,079 --> 00:39:30,840
over his eyes.

716
00:39:30,880 --> 00:39:33,159
Speaker 2: It's a polighter way to say that, which is there

717
00:39:33,239 --> 00:39:36,559
is an opportunity for DBAs to provide optimizations to you.

718
00:39:36,719 --> 00:39:39,239
Speaker 1: Yes, yes, yes, of course, I mean that this is

719
00:39:39,280 --> 00:39:42,960
one of the reasons why STAR procedures exist, right besides

720
00:39:43,000 --> 00:39:46,920
the exist you know, came into being, shall I say,

721
00:39:47,239 --> 00:39:50,840
because of the abstraction one, but also because we could

722
00:39:50,880 --> 00:39:55,199
do complex queries in return complex result sets.

723
00:39:55,679 --> 00:39:59,960
Speaker 3: So technically yes, but to our point about trying to

724
00:40:00,079 --> 00:40:03,679
prefer tools that give you easier and easier time in

725
00:40:03,719 --> 00:40:07,199
integration testing. Sure, if you're depending on stored procedures and

726
00:40:07,360 --> 00:40:10,679
for procedures with logic, you have made your code as

727
00:40:10,719 --> 00:40:12,119
hard to test as I possibly can.

728
00:40:12,320 --> 00:40:15,719
Speaker 1: I totally agree, and I have since sworn them off. Jeremy,

729
00:40:17,280 --> 00:40:18,760
I have I swear to God.

730
00:40:19,639 --> 00:40:22,320
Speaker 2: Now and start procedure should be the exception, like, we

731
00:40:22,360 --> 00:40:25,480
can't seem to make this go any faster. What do

732
00:40:25,519 --> 00:40:27,800
we got to do? And the DBA can help.

733
00:40:28,960 --> 00:40:31,599
Speaker 3: Yes, But the point, the point I was getting at

734
00:40:31,800 --> 00:40:34,840
is but I also say, you're using a no SQL

735
00:40:34,880 --> 00:40:39,119
database yep. Or you know, for me, Mark, most of

736
00:40:39,159 --> 00:40:41,920
my clients are using events store. One where using an

737
00:40:41,920 --> 00:40:45,199
event store tool, so you're dealing with projections and all

738
00:40:45,280 --> 00:40:45,920
kinds of things.

739
00:40:46,280 --> 00:40:46,480
Speaker 1: Yeah.

740
00:40:46,519 --> 00:40:51,519
Speaker 3: The point is your underlying tool has probably has some

741
00:40:51,599 --> 00:40:55,800
kind of special sauce power to do batch Quarry Martin,

742
00:40:55,840 --> 00:40:57,599
for example, will let you line up I want to

743
00:40:57,639 --> 00:41:00,800
run this link, quarry this link, query, load this entity,

744
00:41:00,880 --> 00:41:04,559
load that entity, or and go do it in one batch.

745
00:41:04,880 --> 00:41:07,760
But I'll also say I want to load this entity,

746
00:41:07,800 --> 00:41:10,400
but I want you to find its related thing here

747
00:41:10,519 --> 00:41:13,159
and it's third related thing and do it in one

748
00:41:13,280 --> 00:41:17,519
network round trip. That is a massive cost savings in

749
00:41:17,599 --> 00:41:23,159
terms of performance. Sure, so being able to go right

750
00:41:23,199 --> 00:41:26,280
to the metal, you're not really going that close but

751
00:41:26,800 --> 00:41:30,679
using all the power that you're underlying infrastructure has and

752
00:41:30,719 --> 00:41:32,760
then putting it in one vertical slice where you can

753
00:41:32,760 --> 00:41:37,280
actually reason about what are the database queries I'm actually

754
00:41:37,360 --> 00:41:40,719
making from this system input to get my data out.

755
00:41:41,199 --> 00:41:43,679
That's going to be the best possible chance of getting

756
00:41:43,719 --> 00:41:46,159
something that's very performant.

757
00:41:47,119 --> 00:41:49,320
Speaker 2: Can we talk about the second vertical slice you're going

758
00:41:49,400 --> 00:41:53,199
to take like you talk about the vertical slice approach

759
00:41:53,239 --> 00:41:56,840
to get started. Essentially, let's get something running a particular

760
00:41:56,880 --> 00:42:00,960
feature set and and you know, one time, even an

761
00:42:00,960 --> 00:42:02,679
agile we want to call that a spike, like we're

762
00:42:02,679 --> 00:42:06,719
gonna test this thing. My concern with this approach is

763
00:42:06,760 --> 00:42:10,159
always then more teams start working on their slices and

764
00:42:10,199 --> 00:42:13,559
we're duplicating work, or we're coming with different styles, or

765
00:42:14,159 --> 00:42:16,719
you know, they don't ever play with each other very well.

766
00:42:16,960 --> 00:42:19,360
Speaker 3: So a lot that's going to boil down to communication.

767
00:42:21,199 --> 00:42:23,400
But that also gets into a conversation I did want

768
00:42:23,400 --> 00:42:25,480
to I did want to have with you guys. You know,

769
00:42:25,719 --> 00:42:29,960
the folks that really like to have those prescriptive architectures.

770
00:42:31,480 --> 00:42:36,119
Some of it is about standardization and take away. People

771
00:42:36,320 --> 00:42:39,239
need to be creative or think kind of kind of

772
00:42:39,239 --> 00:42:42,239
straight jacket in into doing a one one wayfect.

773
00:42:42,400 --> 00:42:45,199
Speaker 2: Right that there is one right way for this app.

774
00:42:45,119 --> 00:42:47,159
Speaker 3: Yeah, so I'm gonna give you a sports fan, right,

775
00:42:47,480 --> 00:42:50,239
and if you follow your team long enough, you're gonna

776
00:42:50,239 --> 00:42:52,800
hear the phrase a lot of this player is a

777
00:42:52,920 --> 00:42:57,239
high I four player or this other player could raise

778
00:42:57,280 --> 00:43:01,159
the ceiling of the team. And all is when we

779
00:43:01,320 --> 00:43:04,760
talk about a player's floor ceiling, you kind of say

780
00:43:04,920 --> 00:43:07,639
we expect to be at least this good. That's the floor.

781
00:43:08,039 --> 00:43:10,679
When you say raising the ceiling, we could potentially be

782
00:43:10,760 --> 00:43:15,119
even this much better. Folks that really care about standardization

783
00:43:15,280 --> 00:43:19,159
across teams, they're trying to raise the floor. They're trying

784
00:43:19,159 --> 00:43:22,400
to say I want a minimum quality by saying everybody

785
00:43:22,440 --> 00:43:25,159
just do it the exact same way. Theoretically you can

786
00:43:25,199 --> 00:43:28,519
move around. People don't have to think so much. They

787
00:43:28,519 --> 00:43:32,880
can just go. There's obvious value, there's obvious attraction. The

788
00:43:32,920 --> 00:43:36,519
only problem is that it doesn't work very well. Righthew,

789
00:43:36,960 --> 00:43:41,000
you get these these one size fits all templates, what

790
00:43:41,159 --> 00:43:44,199
happens is you get use cases that are vastly more

791
00:43:44,280 --> 00:43:49,480
complicated than your clean architecture approach. Shows if you make

792
00:43:49,519 --> 00:43:53,280
people stop thinking like I'm straight jacket into this approach,

793
00:43:53,360 --> 00:43:57,519
they stop thinking and they start writing just those massive,

794
00:43:57,599 --> 00:44:02,280
bloated NBC controllers which to mediator pulling it out, and

795
00:44:02,320 --> 00:44:06,440
now you have bloaded mediator handlers. People forget to do

796
00:44:06,559 --> 00:44:09,039
things like I'm just going to extract a helper method

797
00:44:09,039 --> 00:44:14,519
out and compose my method. Or you on the other

798
00:44:14,599 --> 00:44:19,400
side of things, your prescriptive template may be more complicated

799
00:44:19,440 --> 00:44:21,840
than it should be, and you get a lot of

800
00:44:21,880 --> 00:44:25,000
straight pastors. I've seen that as well.

801
00:44:25,519 --> 00:44:27,599
Speaker 2: So now this is always a challenge. If it's simple

802
00:44:27,679 --> 00:44:29,480
enough to use, it's not sophisticated enough to do what

803
00:44:29,480 --> 00:44:31,320
you need to do. And if it's sophisticated enough to use,

804
00:44:31,320 --> 00:44:32,719
it's too complicated to understand.

805
00:44:33,280 --> 00:44:35,639
Speaker 3: So you know, the duplication, I mean, that's a real problem.

806
00:44:35,760 --> 00:44:39,719
That's absolutely a legitimate, legimate concern. What I would say

807
00:44:39,880 --> 00:44:44,960
is communication between teams. Hopefully your team is still working

808
00:44:44,960 --> 00:44:47,400
in a you know, it's kind of a DIT style

809
00:44:47,480 --> 00:44:52,000
bounded context where they have an isolated PURBUW to some degree,

810
00:44:52,079 --> 00:44:55,880
and then there's not much natural duplication except in infrastructure,

811
00:44:56,480 --> 00:44:58,840
you know, being able to rotate around teams. You know,

812
00:44:58,920 --> 00:45:03,920
this is this is orthogonal to architectural style in places

813
00:45:03,960 --> 00:45:08,719
where you do see duplication in code, you start to

814
00:45:08,760 --> 00:45:12,599
do some refactorings to gather up the duplication, just like

815
00:45:12,639 --> 00:45:13,519
we've always done.

816
00:45:13,719 --> 00:45:15,320
Speaker 2: In some ways, I can almost see you describing this

817
00:45:15,400 --> 00:45:17,239
as a good problem. You've gotten to a place where

818
00:45:17,280 --> 00:45:19,719
you've built enough that they can see the duplication, and

819
00:45:19,800 --> 00:45:21,960
now you can put an initiative to try and consolidate

820
00:45:21,960 --> 00:45:25,159
that and make things a bit more Yes, I would

821
00:45:25,159 --> 00:45:27,639
also think the first slice you pick in a green

822
00:45:27,719 --> 00:45:31,800
field app is going to set the tone, so pick carefully.

823
00:45:31,840 --> 00:45:35,960
Speaker 3: Maybe maybe yeah, But taking this, you know, down the

824
00:45:36,000 --> 00:45:39,559
people side of things, you know, rather than saying, here's

825
00:45:39,639 --> 00:45:42,280
this very limited straight jacket rule of you know, we

826
00:45:42,400 --> 00:45:47,119
downloaded somebody's GitHub repository that lays out a clean architecture

827
00:45:47,199 --> 00:45:50,639
or something or other. Right, having a constant learning environment

828
00:45:50,719 --> 00:45:54,039
where your people are empowered to learn an experiment a

829
00:45:54,079 --> 00:45:56,039
little bit, as long as you can trust that they'll

830
00:45:56,079 --> 00:45:58,760
communicate with each other, so that that's what I would

831
00:45:58,760 --> 00:46:03,079
describe as raising the ceiling of your your shop. You know,

832
00:46:03,159 --> 00:46:04,920
you have a chance to do things much better.

833
00:46:05,440 --> 00:46:08,000
Speaker 2: I mean, I think it's reasonable set minimums, but don't

834
00:46:08,400 --> 00:46:10,719
don't require where people stay at the minimums like I

835
00:46:10,719 --> 00:46:12,760
think I have to enough smart enough to go when

836
00:46:12,920 --> 00:46:15,079
to know when they're going below it, but not be

837
00:46:15,159 --> 00:46:17,320
concerned when they go above it, because that's ultimately a.

838
00:46:17,280 --> 00:46:20,679
Speaker 3: Good thing, definitely that. And then all of us learn.

839
00:46:20,840 --> 00:46:23,400
If you're ever a technical lead, so here later you're

840
00:46:23,400 --> 00:46:25,880
going to learn a hard rough lesson that. The more

841
00:46:25,920 --> 00:46:30,000
specific direction you give to somebody working with you, the

842
00:46:30,000 --> 00:46:32,679
worse the results are coming back. Sure, because if you

843
00:46:32,719 --> 00:46:35,559
turn off the brain, you make them just.

844
00:46:35,719 --> 00:46:37,960
Speaker 2: You know, I've seen Carl do this with music, where

845
00:46:37,960 --> 00:46:40,159
he pointed the bass player and said, just be awesome.

846
00:46:40,320 --> 00:46:44,400
Speaker 1: Just be awesome. That's a true story, the true story.

847
00:46:44,760 --> 00:46:46,360
He says, what do you want me to play here?

848
00:46:46,519 --> 00:46:47,199
Speaker 2: He was awesome?

849
00:46:47,320 --> 00:46:49,719
Speaker 1: Said I said, just be awesome, and he.

850
00:46:49,920 --> 00:46:51,239
Speaker 3: Was, yeah, that's awesome.

851
00:46:51,960 --> 00:46:54,039
Speaker 2: But you know, I can think of some devs where

852
00:46:54,079 --> 00:46:56,000
he's that's all you need to tell him is, hey,

853
00:46:56,400 --> 00:46:57,360
just be awesome.

854
00:46:57,239 --> 00:46:59,239
Speaker 1: Just be awesome. Don't write bugs.

855
00:46:59,280 --> 00:47:02,719
Speaker 3: Well, yeah, and then then let me let me rain

856
00:47:02,840 --> 00:47:05,639
some of that in of you know. Also, folks, don't

857
00:47:05,639 --> 00:47:08,599
don't get too creative, don't get too crazy. No matter

858
00:47:08,639 --> 00:47:12,079
what tool you use, use it in the idiomatic way.

859
00:47:12,280 --> 00:47:14,400
Don't write your own special frameworks, that kind of thing.

860
00:47:14,440 --> 00:47:17,800
Speaker 1: I remember the Onion article Apple employee fired for thinking

861
00:47:17,920 --> 00:47:18,559
too different.

862
00:47:20,320 --> 00:47:22,400
Speaker 2: The way I always pitched it to my devs was,

863
00:47:22,480 --> 00:47:24,400
I want you to be able to take a vacation,

864
00:47:24,599 --> 00:47:26,920
so somebody else needs to be able to read this code. Yeah,

865
00:47:27,039 --> 00:47:30,280
that's right. Motivation just you know, give yourself, be able

866
00:47:30,320 --> 00:47:31,239
to give yourself a break.

867
00:47:31,599 --> 00:47:35,800
Speaker 3: So running right back to our vertical slice architecture idea,

868
00:47:36,320 --> 00:47:39,880
we are trying very hard, you know, and again I'm

869
00:47:39,920 --> 00:47:43,880
so plugging it. The approach we're taking with Wolverine, especially,

870
00:47:44,360 --> 00:47:47,679
shrink your code down, take out so much code ceremony

871
00:47:47,760 --> 00:47:51,519
that you can hopefully very easily reason about your system

872
00:47:51,960 --> 00:47:55,599
follow one place. There's less code period, there's less hoops

873
00:47:55,599 --> 00:47:58,840
to jump through, and even a strange person could come

874
00:47:58,840 --> 00:48:01,960
in as as they are a developer, they can see, yeah, right,

875
00:48:02,199 --> 00:48:03,800
understand how it's working top to bottom.

876
00:48:03,880 --> 00:48:05,960
Speaker 2: I get this. Yeah, and so maybe you can actually

877
00:48:06,000 --> 00:48:08,199
take two weeks off and the world doesn't hold still

878
00:48:08,320 --> 00:48:09,320
or burn to the ground.

879
00:48:09,559 --> 00:48:10,719
Speaker 3: I'll let you know if I ever do.

880
00:48:14,719 --> 00:48:16,960
Speaker 2: I always thought it was a good milestone, right, was like,

881
00:48:17,119 --> 00:48:19,159
are we functioning enough of the team that somebody can

882
00:48:19,199 --> 00:48:21,559
go away for a while, and not that we don't

883
00:48:21,599 --> 00:48:23,079
burn to the ground, or even that we can hold

884
00:48:23,079 --> 00:48:25,679
everything still, but that we still made progress without them. Yeah,

885
00:48:25,760 --> 00:48:28,320
they came back to not an inbox that killed them,

886
00:48:28,320 --> 00:48:30,000
that punished them for taking their time off.

887
00:48:30,199 --> 00:48:33,199
Speaker 3: I I think I've told this story before. The first

888
00:48:33,199 --> 00:48:36,719
project where I was a technical lead on a project

889
00:48:36,719 --> 00:48:40,760
that was actually important, all of my managers, two or

890
00:48:40,760 --> 00:48:42,800
three times a day would ask me, well, what are

891
00:48:42,840 --> 00:48:44,400
we going to do if you get hit by a bus?

892
00:48:44,760 --> 00:48:44,960
Speaker 2: Right?

893
00:48:45,320 --> 00:48:46,320
Speaker 1: That's the very real thing.

894
00:48:46,440 --> 00:48:50,239
Speaker 3: And I heard that so often that I started seriously

895
00:48:50,280 --> 00:48:51,679
pondering my own mortality.

896
00:48:51,840 --> 00:48:54,159
Speaker 2: Yeah, and it got it. You want to hit the

897
00:48:54,199 --> 00:48:54,960
bus so bad?

898
00:48:56,679 --> 00:49:00,800
Speaker 1: Isn't that one of Steve Smith's anti padd or whenever?

899
00:49:01,079 --> 00:49:03,599
Speaker 2: The bus being hit by bus is definitely an anti pattern.

900
00:49:03,760 --> 00:49:06,320
Speaker 3: No, no, no, but you know the one bus, the

901
00:49:06,320 --> 00:49:07,880
one bus, low bus factor.

902
00:49:08,280 --> 00:49:10,880
Speaker 2: Yeah, that's it, Yeah, low bus factor. But that's why

903
00:49:10,880 --> 00:49:13,559
I went with the vacation scenario, because it seems less

904
00:49:13,760 --> 00:49:15,599
you know, mortally threatened.

905
00:49:15,280 --> 00:49:20,400
Speaker 1: It's less morbid. It's a very Canadian approach to that metaphor.

906
00:49:20,760 --> 00:49:22,480
Speaker 3: I was just gonna say, I'm an American. I don't

907
00:49:22,519 --> 00:49:24,480
know what a two week vacation would be. Yeah, I

908
00:49:24,519 --> 00:49:25,679
mean I've had one once.

909
00:49:25,760 --> 00:49:34,239
Speaker 1: Maybe right, better software through politeness, just.

910
00:49:34,159 --> 00:49:37,960
Speaker 2: Trying to keep people healthy and happy. You know, the

911
00:49:38,840 --> 00:49:41,199
death We took over a team that had been death

912
00:49:41,239 --> 00:49:44,280
marching for like six months and they and the boss

913
00:49:44,360 --> 00:49:46,199
is like, what do you suggest this is? I'm thinking

914
00:49:46,239 --> 00:49:49,760
a three week I think a three day weekend first, like,

915
00:49:49,960 --> 00:49:53,440
just send everybody home for three days, take a breath,

916
00:49:53,920 --> 00:49:59,960
will We'll reorganize next week. Absolutely, you know, you can't

917
00:50:00,239 --> 00:50:04,719
just keep beating people. We're not making progress anymore and

918
00:50:04,760 --> 00:50:07,639
everyone's miserable. Got to get up and take a walk

919
00:50:07,679 --> 00:50:08,280
once in a while.

920
00:50:08,480 --> 00:50:10,639
Speaker 3: I really say, I haven't been on a death march

921
00:50:10,679 --> 00:50:13,960
in a few years, but I certainly did my share

922
00:50:13,960 --> 00:50:15,519
of them back in the Waterfall doos.

923
00:50:16,480 --> 00:50:21,840
Speaker 2: Yeah. Well, and it's one of those things where everybody's

924
00:50:21,840 --> 00:50:24,760
built their parts and you've tested in various bits and

925
00:50:24,800 --> 00:50:26,719
now you're trying to really get to a deployment and

926
00:50:26,800 --> 00:50:29,119
does it actually scale away it's supposed to behave and

927
00:50:29,280 --> 00:50:31,559
are the people happy with it? And then it's patch

928
00:50:31,639 --> 00:50:34,360
patge patch, like what are we missing trying to get

929
00:50:34,360 --> 00:50:36,719
to that magic V one that somebody promised on an

930
00:50:36,760 --> 00:50:38,239
arbitrary date. They didn't understand.

931
00:50:38,480 --> 00:50:41,559
Speaker 3: Yeah, yeah, or the day as a tech lead, the

932
00:50:41,760 --> 00:50:45,559
tester asked me, what about the reports from the requirements?

933
00:50:45,599 --> 00:50:48,800
And I don't know what you're talking about. And there

934
00:50:48,880 --> 00:50:51,480
was a second requirements document I had never been shown

935
00:50:51,599 --> 00:50:54,239
until then. Yeah, and we were already in the official

936
00:50:54,360 --> 00:50:55,119
testing phase.

937
00:50:56,239 --> 00:50:59,199
Speaker 2: Yeah, surprise. Yeah, I should have known about this a

938
00:50:59,280 --> 00:50:59,639
year ago.

939
00:51:00,159 --> 00:51:01,280
Speaker 3: Waterfall for the win.

940
00:51:04,039 --> 00:51:13,880
Speaker 1: Abbreviated WTF waterfall? What's in your inbox? Jeremy, what are

941
00:51:13,880 --> 00:51:14,719
you going to do next?

942
00:51:15,480 --> 00:51:19,400
Speaker 3: So probably won't show up in a conference until till

943
00:51:19,480 --> 00:51:22,079
later next year. I did so many late last year

944
00:51:22,079 --> 00:51:25,760
that I'm didn't get get submissions off. But the big

945
00:51:25,800 --> 00:51:28,239
thing I'm working on right now in my company, jazzper

946
00:51:28,239 --> 00:51:32,239
Effects Software, working on a tool called critter Watch that

947
00:51:32,400 --> 00:51:40,000
is a commercial management console monitoring tools specifically for the

948
00:51:40,119 --> 00:51:43,320
entire Critter stack, So everything you would need to not

949
00:51:43,519 --> 00:51:45,840
just watch what's going on your system, but also be

950
00:51:45,840 --> 00:51:48,360
able to help heal the system, deal with did letter

951
00:51:48,440 --> 00:51:54,199
Q messages. Eventsourcing creates all kinds of extra stuff, problems

952
00:51:54,239 --> 00:51:59,679
of being able to kick off projection, rebuilds, rewind subscriptions,

953
00:52:00,280 --> 00:52:05,199
turn things on, change how change what servers things are

954
00:52:05,280 --> 00:52:09,360
running on? Maybe to deal with privacy concerns, be able

955
00:52:09,360 --> 00:52:14,159
to retroactively say we're going to do something called crypto shredding.

956
00:52:14,440 --> 00:52:16,239
We're just going to throw away the key so we

957
00:52:16,280 --> 00:52:19,480
can't read this client data anyway. You know, all kinds

958
00:52:19,480 --> 00:52:22,000
of good stuff like that. So trying to make the

959
00:52:22,079 --> 00:52:25,920
jump from you know, we're a services company around open

960
00:52:25,920 --> 00:52:27,800
source tooling right now, but we want to make the

961
00:52:27,920 --> 00:52:31,559
jump to also having that paid commercial add on that.

962
00:52:31,840 --> 00:52:34,280
Speaker 1: That's very cool, cool. Well, hope you come back and

963
00:52:34,320 --> 00:52:37,320
talk to us when that's in play, you know, or

964
00:52:37,360 --> 00:52:39,480
if you have any other things that are new, just

965
00:52:39,599 --> 00:52:42,119
feel free to reach out and come back on the show.

966
00:52:42,320 --> 00:52:43,880
Speaker 3: All right, we'll certainly do that, guys.

967
00:52:43,880 --> 00:52:44,800
Speaker 1: It's always a pleasure.

968
00:52:44,880 --> 00:52:45,880
Speaker 3: Thanks thanks for having me.

969
00:52:46,199 --> 00:52:48,679
Speaker 1: That's been a pleasure for us too, And we'll talk

970
00:52:48,719 --> 00:53:12,679
to you next time on dot net rocks. Dot net

971
00:53:12,800 --> 00:53:15,719
Rocks is brought to you by Franklin's Net and produced

972
00:53:15,719 --> 00:53:19,559
by Pop Studios, a full service audio, video and post

973
00:53:19,559 --> 00:53:23,719
production facility located physically in New London, Connecticut, and of

974
00:53:23,760 --> 00:53:28,679
course in the cloud online at pwop dot com. Visit

975
00:53:28,719 --> 00:53:30,840
our website at d O T N E t R

976
00:53:30,920 --> 00:53:34,840
O c K S dot com for RSS feeds, downloads,

977
00:53:35,000 --> 00:53:38,679
mobile apps, comments, and access to the full archives going

978
00:53:38,719 --> 00:53:42,119
back to show number one, recorded in September two thousand

979
00:53:42,119 --> 00:53:44,760
and two. And make sure you check out our sponsors.

980
00:53:44,920 --> 00:53:47,920
They keep us in business. Now go write some code.

981
00:53:48,280 --> 00:53:49,079
See you next time.

982
00:53:49,960 --> 00:53:51,800
Speaker 3: You got javans

983
00:53:53,880 --> 00:54:01,039
Speaker 2: And no

