1
00:00:01,080 --> 00:00:04,799
How'd you like to listen to dot
net rocks with no ads? Easy?

2
00:00:05,360 --> 00:00:09,480
Become a patron for just five dollars
a month. You get access to a

3
00:00:09,480 --> 00:00:14,279
private RSS feed where all the shows
have no ads. Twenty dollars a month.

4
00:00:14,279 --> 00:00:18,440
We'll get you that and a special
dot net Rocks patron mug. Sign

5
00:00:18,519 --> 00:00:35,960
up now at Patreon dot dot NetRocks
dot com. Hey, welcome back to

6
00:00:36,000 --> 00:00:39,719
dot net rocks. This is Carl
Franklin and it's Richard Campbell. Steve Smith

7
00:00:39,759 --> 00:00:42,280
is with us. We'll be talking
to him in a minute. But hey

8
00:00:42,320 --> 00:00:44,200
man, how are you doing.
I haven't talked to you in a while.

9
00:00:44,320 --> 00:00:46,640
Uh, you know, we had
a burst of shows and now we've

10
00:00:46,719 --> 00:00:49,000
you know, caught back up,
so it's time to get back to work

11
00:00:49,039 --> 00:00:53,119
again. And I happen to be
in Mexico. So okay, coming coming

12
00:00:53,159 --> 00:00:59,079
to you from the Grand look at
the Vedanta Resort. How's your bandwidth good

13
00:00:59,159 --> 00:01:00,520
enough? You know, everybodybody else
is at the pool, you know,

14
00:01:00,560 --> 00:01:06,200
because they're on vacation, right,
so hopefully it holds together. But I'm

15
00:01:06,239 --> 00:01:08,439
recording locally. We'll be okay.
All right, good, Well, let's

16
00:01:08,519 --> 00:01:19,640
start things off the right way with
better no framework all right, all right,

17
00:01:19,640 --> 00:01:23,760
well Google is at it again,
Yes they are. They now have

18
00:01:23,959 --> 00:01:27,239
this deep you know, Google Deep
Mind, their AI thing, Yeah,

19
00:01:27,280 --> 00:01:32,480
the original, the original AI guys, the reason that Open AI was made.

20
00:01:32,799 --> 00:01:36,359
Yeah. So they have this Genie
team, and they came out with

21
00:01:36,439 --> 00:01:42,920
Genie, which is a generative interactive
environment creator. It's so no wishes,

22
00:01:42,519 --> 00:01:49,879
yeah yeah, and you can't wish
for more wishes. So we introduced Genie,

23
00:01:49,920 --> 00:01:56,840
a foundation world model trained from Internet
videos that can generate an endless variety

24
00:01:56,920 --> 00:02:02,840
of playable action controllable worlds from synthetic
images, photographs, and even sketches.

25
00:02:04,560 --> 00:02:07,960
So the idea is that you can
sketch some things, or find some things,

26
00:02:08,080 --> 00:02:12,680
or just say, give me something
that looks like this, and you

27
00:02:12,719 --> 00:02:17,319
can make side scrolling games, you
know, like Mario Brothers kind of thing

28
00:02:17,599 --> 00:02:23,879
awesome from them automatically. At least
that's what I think it is. I

29
00:02:23,879 --> 00:02:29,039
haven't done it, and it looks
like the Really the only application is sort

30
00:02:29,039 --> 00:02:34,039
of controlling and animating sprites and a
background in a two D scrolling world.

31
00:02:34,400 --> 00:02:37,439
Perhaps, yeah, but to do
it with regular text just means a whole

32
00:02:37,439 --> 00:02:38,879
lot of other people think they can
be video games. Now. Yeah,

33
00:02:38,960 --> 00:02:44,479
well I'm not really sure if it's
well, it's a text image generation model,

34
00:02:44,520 --> 00:02:47,479
so you're right there. Yeah,
but I don't know. I'm not

35
00:02:47,560 --> 00:02:53,360
really that much of a video game
guy to think that this is something I

36
00:02:53,360 --> 00:02:55,080
want to look at now. But
I also like the idea of just generating

37
00:02:55,080 --> 00:02:59,960
animations. Of course, we just
recently had the announcement of Open AI Sorrow,

38
00:03:00,719 --> 00:03:05,479
which was more like thirty second generated
video. Clearly we're on a path

39
00:03:06,280 --> 00:03:10,240
of exploring more capabilities with generative AI. Yes, we are fun fun So

40
00:03:10,280 --> 00:03:13,599
anyway, that's what I got know
and learned it loves He was talking to

41
00:03:13,639 --> 00:03:15,599
us Richard Campbell. Hey, I
grabbed a comment off a show eighteen thirty

42
00:03:15,599 --> 00:03:19,800
one, the one we did with
Steve back in February of last year twenty

43
00:03:19,800 --> 00:03:22,960
three, when we talked about clean
architecture, because he's a clean kind of

44
00:03:23,000 --> 00:03:24,439
eye, and Ken had this comment
by a year ago. He said,

45
00:03:24,439 --> 00:03:29,759
this is a great episode, but
what about new Get Hell, I love

46
00:03:29,800 --> 00:03:32,120
they of putting things into new Get
packages, but I can see it will

47
00:03:32,120 --> 00:03:35,599
get out of hand as well.
You know, only if you update them,

48
00:03:35,680 --> 00:03:38,159
Ken, Right, as long as
you just leave it with the original

49
00:03:38,159 --> 00:03:44,240
bugs, everything will be fine.
An example is asp asp dot version ing.

50
00:03:44,520 --> 00:03:46,319
It's a great asp dot net versioning
package. But the new get libraries

51
00:03:46,360 --> 00:03:49,759
have changed, so now the developers
could be making a bunch of changes to

52
00:03:49,800 --> 00:03:52,800
the new new get packages, but
they did two months ago, and then

53
00:03:52,840 --> 00:03:55,319
other developers would never get the new
changes. Nothing against new Get. But

54
00:03:55,360 --> 00:03:59,080
it seems like anything you do in
this monster programming world is not perfect.

55
00:03:59,240 --> 00:04:02,240
Yeah. True, it's just a
question how difficult, right, And in

56
00:04:02,280 --> 00:04:05,280
the area of testing, because we
talked about testing on that show too,

57
00:04:05,319 --> 00:04:09,319
the world changes and developers still need
to learn on the fly. Who is

58
00:04:09,360 --> 00:04:13,960
testing my Cobald world that I was
running back in ninety four or inherited DELFI

59
00:04:14,080 --> 00:04:18,920
from in nineteen ninety or that four
point six dot two And he says in

60
00:04:18,959 --> 00:04:21,519
two thousand, which you know was
in two thousand, It was like twenty

61
00:04:21,600 --> 00:04:26,199
fourteen, twenty fifteen. What about
the C plus plus code the nineties?

62
00:04:26,360 --> 00:04:30,439
What testing framework should I use?
X unit? What about Java? You

63
00:04:30,480 --> 00:04:33,519
know? Testing frameworks for everything?
Ken case in point in the enterprise world.

64
00:04:33,800 --> 00:04:36,959
None of the programming world is perfect. I would include programming training as

65
00:04:38,000 --> 00:04:41,000
that as well, But without you
guys doing this show, I'd be way

66
00:04:41,000 --> 00:04:44,360
more lost so thanks. Wow.
Cool, that's very kind. Yeah,

67
00:04:44,360 --> 00:04:46,160
it's very kind, Thanks, Ken, miel No. I think it's an

68
00:04:46,160 --> 00:04:50,600
interesting problem. And you know,
often these tools become an issue primarily because

69
00:04:50,639 --> 00:04:54,240
they've been successful. You know,
if nobody was using new Get, it

70
00:04:54,240 --> 00:04:57,360
were great. I remember in the
early days of NEWGAT there was such a

71
00:04:57,399 --> 00:05:02,040
thing as new Get hell quite literally, and it was very hard to manage,

72
00:05:02,199 --> 00:05:06,879
just as it was to manage without
Newgat. But then they quickly fixed

73
00:05:08,040 --> 00:05:11,240
things up and ever since it's been
really great. I think. Yeah,

74
00:05:11,279 --> 00:05:14,759
I think Newgat's amazing. Packet managers
always have their challenges, like that's not

75
00:05:14,800 --> 00:05:16,839
going to go away, especially with
visual studio tooling. You know, you

76
00:05:16,879 --> 00:05:21,839
can just update everything, which can
be a problem also, you know,

77
00:05:21,920 --> 00:05:26,319
but at least you'll know which ones
are the problem. Well, inevitably you'll

78
00:05:26,360 --> 00:05:28,720
know the most important thing, which
is it is your fault. Yeah,

79
00:05:28,759 --> 00:05:30,560
of course, yeah, yeah,
I blame you all right. Ken,

80
00:05:30,680 --> 00:05:33,600
Thanks for thanks for your comment,
and a copy of music Coba is on

81
00:05:33,639 --> 00:05:35,639
its way to you, and if
you'd like a copy of music co buy,

82
00:05:35,639 --> 00:05:39,160
I write a comment on the website
at don at Ross dot comma on

83
00:05:39,160 --> 00:05:41,920
the facebooks you publish every show there
and if you comment there and a reading

84
00:05:41,920 --> 00:05:44,319
on the show, we'll send your
copy of music Coba and you can follow

85
00:05:44,399 --> 00:05:46,319
us on the twitters or the exes
or whatever the hell is today. But

86
00:05:46,759 --> 00:05:49,560
that's all cool. But we've been
there for a long time. The cool

87
00:05:49,639 --> 00:05:54,959
kids are hanging out on Macedon.
I'm at Carl Franklin at tech Hubsocial and

88
00:05:55,040 --> 00:05:59,199
I'm Rich Campbell at macedon dot social
and send us a two and for all

89
00:05:59,240 --> 00:06:01,839
the ways you can attact me anyway, you can find that at Carlfranklin dot

90
00:06:01,879 --> 00:06:08,560
com. All right, let's get
into this conversation with Steve Smith. Will

91
00:06:08,560 --> 00:06:11,920
bring him back. I probably don't
need to introduce him, but I will

92
00:06:11,920 --> 00:06:16,240
anyway. Steve, otherwise known as
our Dallas on all the social networks,

93
00:06:16,800 --> 00:06:21,839
is an entrepreneur and software developer where
they passion for building quality software as effectively

94
00:06:21,879 --> 00:06:28,319
as possible. He provides mentoring and
training workshops for teams with the desire to

95
00:06:28,439 --> 00:06:32,839
improve. Steve has been recognized as
a Microsoft MVP for over ten consecutive years

96
00:06:32,879 --> 00:06:38,839
and as a frequent speaker at software
developer conferences and events. He enjoys helping

97
00:06:38,839 --> 00:06:45,759
others write maintainable, testable applications using
Microsoft's developer tools. Steve has just published

98
00:06:45,800 --> 00:06:51,560
a zero to hero course on modular
monoliths at dometrain dot com, and you

99
00:06:51,600 --> 00:06:56,839
can connect him with him at Steve
at our Dallas dot com. Welcome back,

100
00:06:56,879 --> 00:06:59,560
See hey Carl, he Richard.
How's it going all as well?

101
00:06:59,600 --> 00:07:01,720
Friend? Well, I'm not in
Mexico, so I don't know where you

102
00:07:01,759 --> 00:07:05,480
are, Steve. But Richard and
I were just talking that it's the same

103
00:07:05,480 --> 00:07:11,560
temperature in Mexico and Ohio. It's
twenty eight degrees right, Ah, okay,

104
00:07:11,639 --> 00:07:16,519
you know one celsius and one is
appearan something like that. I like

105
00:07:16,680 --> 00:07:26,800
mine better. Yeah, just saying
right. So we did recently did a

106
00:07:26,839 --> 00:07:30,439
show on the you know, the
monolith, the modular monolith. Yeah,

107
00:07:30,560 --> 00:07:35,160
Leila Porter but yeah, that's right
with Leila. But it was not really

108
00:07:35,160 --> 00:07:39,800
dot net centric, and we thought
we'd bring you back to, you know,

109
00:07:40,040 --> 00:07:45,199
give us the dot net developers perspective
on modular monoliths. So what you

110
00:07:45,240 --> 00:07:48,199
been thinking about, Buddy, Well, the focus of the industry for the

111
00:07:48,279 --> 00:07:53,600
last five or maybe ten years even
has been on micro services and how micro

112
00:07:53,639 --> 00:07:58,519
services are the end all be all. And what I've found is that a

113
00:07:58,519 --> 00:08:03,360
lot of teams take their existing monolithic
code that's that usually doesn't have a lot

114
00:08:03,399 --> 00:08:07,519
of modularity to it. You know, generally everything is is kind of in

115
00:08:07,560 --> 00:08:09,759
a big ball of mud, and
they don't know what to do to fix

116
00:08:09,800 --> 00:08:13,920
that, and it keeps getting worse
over time, and so you know,

117
00:08:13,040 --> 00:08:16,279
micro services is right, there is
this shiny new toy that if nothing else,

118
00:08:16,319 --> 00:08:20,360
will improve their resume. And they're
like, you know, if we

119
00:08:20,439 --> 00:08:24,560
had these separate micro services, they
couldn't possibly be tightly coupled with one another

120
00:08:24,600 --> 00:08:30,160
because they're supposed to be independent.
So they convince their their their boss,

121
00:08:30,199 --> 00:08:33,360
their their job, whatever, that
that's the way to go as a means

122
00:08:33,399 --> 00:08:37,200
of you know, following the buzz
and getting the other benefits of micro services,

123
00:08:37,200 --> 00:08:41,240
like you know, independence and you
know, separate scalability of individual services.

124
00:08:41,440 --> 00:08:45,279
So I got a question, how
does giant ball of mud one talk

125
00:08:45,320 --> 00:08:48,440
to giant ball of mud two that
because that seems to be the fundamental problem,

126
00:08:48,480 --> 00:08:52,120
doesn't it that that can be an
issue between micro services? Yes,

127
00:08:52,799 --> 00:09:00,080
but it's like this this fundamental thing
where the teams I've seen, not MYI

128
00:09:00,080 --> 00:09:03,159
it's necessarily but just like social media
and folks I talk to a conference is

129
00:09:03,200 --> 00:09:07,519
like almost two of every one of
them. They are, you know,

130
00:09:07,639 --> 00:09:13,200
thinking that moving to the micro service
approach solves the problem of lack of modularity

131
00:09:13,200 --> 00:09:15,639
in their monolith, right, And
if you do it right, it certainly

132
00:09:15,720 --> 00:09:18,919
does. But it introduces a whole
lot of additional problems because now you're dealing

133
00:09:18,919 --> 00:09:22,399
with a distributed application, and you
know, rather than trying to figure out

134
00:09:22,440 --> 00:09:28,440
how to introduce modularity into your code
and become experts at you know, building

135
00:09:28,519 --> 00:09:31,679
and operating a distributed application, like, maybe you could just do those one

136
00:09:31,720 --> 00:09:35,919
step at a time, Yeah,
and avoid the possibility of building a distributed

137
00:09:35,960 --> 00:09:39,639
monolith, which is what you get, Carl, if you have, you

138
00:09:39,639 --> 00:09:41,639
know, these these two different things
that are actually talking to each other as

139
00:09:41,679 --> 00:09:45,840
if they were still in process,
right, but now they're distributed. Yeah,

140
00:09:45,879 --> 00:09:50,120
exactly. And it seems a little
sarcastic. I'm just saying I had

141
00:09:50,159 --> 00:09:54,080
a problem. I used microservices,
and now I have multiple problems that talk

142
00:09:54,159 --> 00:09:58,240
to each that can't talk to each
other. Yeah. Yeah, there's there's

143
00:09:58,240 --> 00:10:01,200
an image out there, a meme
that, you know, the Pooh emoji.

144
00:10:01,440 --> 00:10:05,279
As like before I had my big
monolith at a giant Pooh emogi and

145
00:10:05,320 --> 00:10:11,080
now I've got micro services a dozen
pooh emojis. It just multiplied. Yeah,

146
00:10:11,159 --> 00:10:15,559
but this seems like, you know, once upon a time it was

147
00:10:15,600 --> 00:10:20,120
service oriented architectures, right, I
think that microservices was going to fix Like,

148
00:10:20,200 --> 00:10:22,360
are we just going through an oscillation
here? Yeah? Yeah, microservices

149
00:10:22,360 --> 00:10:26,080
grew grew out of that. The
thing is is it's not a bad pattern,

150
00:10:26,279 --> 00:10:33,720
right, I mean too big basically
a single responsibility idea among different silos.

151
00:10:35,279 --> 00:10:37,440
But then you know, you can
take that, you can do that

152
00:10:37,519 --> 00:10:43,240
all within a single project and still
have separation and still only update one DLL

153
00:10:43,279 --> 00:10:46,519
at a time, if you know, just if you're using DLLs, but

154
00:10:48,080 --> 00:10:52,879
one little bit of it at a
time, and still get all the benefits

155
00:10:52,879 --> 00:10:58,399
of that, but without the complexity
of this huge distributed mess. That's right,

156
00:10:58,480 --> 00:11:01,080
that a lot of people don't understand. There's a bunch of reasons why

157
00:11:01,120 --> 00:11:05,080
folks move toward micro services, and
some of it's because they want that independent

158
00:11:05,159 --> 00:11:09,039
scalability. Some of it's because they
see that, you know, the Amazons

159
00:11:09,039 --> 00:11:13,960
and Netflixes and whatever are using it, and and folks say, hey,

160
00:11:13,960 --> 00:11:16,600
if that big successful company is using
this pattern, I have to use that

161
00:11:16,639 --> 00:11:20,639
pattern so I can become big and
successful It's like, that's not really how

162
00:11:20,639 --> 00:11:22,960
it works. And you ask him, how many customers do you have,

163
00:11:22,120 --> 00:11:24,679
oh, one hundred two hundred yeah, ok, yeah, do you need

164
00:11:24,720 --> 00:11:28,159
infinite scale on your you know,
one feature of your of your application?

165
00:11:28,960 --> 00:11:35,000
Maybe not? Yeah, So you
know there's there's that issue. And distributed

166
00:11:35,000 --> 00:11:39,639
applications are much harder, right,
Like Martin Fowler's got an article from like

167
00:11:39,679 --> 00:11:43,080
twenty fourteen that basically says, if
you're trying to build a micro services application,

168
00:11:43,159 --> 00:11:46,840
instead of building micro services, first, build a monolith. First,

169
00:11:46,919 --> 00:11:52,200
figure out how the design works,
and then you know, split off individual

170
00:11:52,240 --> 00:11:56,080
micro services as and when and if
it makes sense to do so. Right,

171
00:11:56,159 --> 00:11:58,320
that's much less risky. There's fewer
dragons. He's got an image with

172
00:11:58,399 --> 00:12:03,039
dragons. Sounds exactly like the usual
scaling issues, right, It's like,

173
00:12:03,080 --> 00:12:05,440
we've got to build the site scalable. It's like, well, what parts

174
00:12:05,559 --> 00:12:09,639
need to be scaled? Right?
Yeah? And sometimes for you know,

175
00:12:09,679 --> 00:12:13,519
medium sized to large organizations, part
of what they need to scale is their

176
00:12:13,559 --> 00:12:16,200
teams. Right. They've got an
application that's so big that they're trying to

177
00:12:16,200 --> 00:12:20,720
put multiple teams working on it,
and they're running into a Conway's Law problem

178
00:12:20,759 --> 00:12:24,679
and they're hoping to fix that with
micro services. But you can build modular

179
00:12:24,840 --> 00:12:28,879
monoliths and have multiple teams collaborating just
fine. Also, it's just a matter

180
00:12:28,919 --> 00:12:33,360
of how you structure your solution and
break those things up when I think that's

181
00:12:33,360 --> 00:12:37,960
something that Lailah brought up as well, which is like Conway's loss certainly applies

182
00:12:37,000 --> 00:12:43,159
to micro services and the idea being
that all software reflects the team that's built

183
00:12:43,159 --> 00:12:46,440
it. So it's like, if
you're building an app with three different teams,

184
00:12:46,679 --> 00:12:50,799
you're gonna have three feature sets,
right, So you know, whatever

185
00:12:50,879 --> 00:12:54,120
points was. Unless you've got a
team that large, why would you bother

186
00:12:54,200 --> 00:12:58,279
with micro services because they really come
down to granular elements that can be worked

187
00:12:58,279 --> 00:13:01,360
on simultaneously hopefully. So if it's
only if it's only six people work on

188
00:13:01,360 --> 00:13:03,759
the thing in the first place,
you're really creating a lot of plumbing for

189
00:13:03,840 --> 00:13:07,600
no good reason. Yeah, it
does. If you're building this modular monolith

190
00:13:07,799 --> 00:13:11,799
and you do determine that you know
there is a bottleneck in one of your

191
00:13:11,840 --> 00:13:18,919
projects or you know one of your
silos, you should probably know how to

192
00:13:18,919 --> 00:13:24,000
be ready to carve that off into
its own service and communicate with it,

193
00:13:24,120 --> 00:13:26,639
not in process, but you know, through some other mechanism, whether it's

194
00:13:26,679 --> 00:13:35,200
APIs or gRPC or however. So
it's it's beneficial to you to figure that

195
00:13:35,360 --> 00:13:41,559
out and be at the ready to
either generate the code around that or be

196
00:13:41,720 --> 00:13:45,919
able to do that and have experience
with it before it becomes a problem,

197
00:13:46,440 --> 00:13:48,159
you think for sure. Yeah,
and and like so in my course that

198
00:13:48,200 --> 00:13:54,240
I just finished, the starting point
for most monoliths is a single project.

199
00:13:54,559 --> 00:13:58,720
If I'll do whatever console, ESPNT
core, and that you almost always have

200
00:13:58,720 --> 00:14:05,399
to start with a monolith in anything
you're building. And in a typical you

201
00:14:05,480 --> 00:14:07,320
know, just monolithic application, it
just never splits from there, right,

202
00:14:07,320 --> 00:14:09,639
it just grows and grows and grows. And you know, whether you're using

203
00:14:09,799 --> 00:14:13,200
MVC or raisor pages or whatever it
might be in the dot net world,

204
00:14:13,559 --> 00:14:16,399
like you just keep adding them to
that same project, and it just keeps

205
00:14:16,440 --> 00:14:20,799
getting bigger. And if you have
separation, like if you're following clean architecture

206
00:14:20,799 --> 00:14:24,840
and you have multiple projects, they
aren't split vertically, they're not split per

207
00:14:24,879 --> 00:14:28,600
feature, they're split per technical concern. Right. I love clean architecture.

208
00:14:28,600 --> 00:14:31,480
We've talked about it here before.
It's a great way to keep your domain

209
00:14:31,480 --> 00:14:35,320
model from becoming tightly coupled to your
database. But when you only have you

210
00:14:35,360 --> 00:14:39,799
know, primary projects of user interface, all your infrastructure concerns, and your

211
00:14:39,879 --> 00:14:46,360
domain model, you don't have any
type of separation vertically between, like here's

212
00:14:46,399 --> 00:14:50,360
the the product's feature and here's the
order's feature, and here's the customer's feature,

213
00:14:50,480 --> 00:14:52,240
right, and then all those things
can talk to each other, and

214
00:14:52,279 --> 00:14:56,720
so they do. And that's what
makes it a tangled mess. At the

215
00:14:56,759 --> 00:14:58,480
domain model level, at the UI
level, and all the way into the

216
00:14:58,559 --> 00:15:03,600
data model. It becomes very difficult
to carve those out into a separate service

217
00:15:03,600 --> 00:15:07,080
that you'd want to split out for
for whatever reason, because of performance or

218
00:15:07,120 --> 00:15:11,799
maybe security or data isolation, all
kinds of reasons why you might want to

219
00:15:11,799 --> 00:15:15,039
split part of that out, And
it's hard to do that if you don't

220
00:15:15,039 --> 00:15:18,799
have a plan for that going in. Ree've all Lowe talking about areas of

221
00:15:18,960 --> 00:15:24,159
resonance. You know, basically the
idea is that if I make a change

222
00:15:24,159 --> 00:15:26,919
here, does the whole app resonate
with the change, like you have to

223
00:15:26,919 --> 00:15:31,600
go check for impacts everywhere, or
if I make a change in this particular

224
00:15:31,639 --> 00:15:33,879
spot, there is everything directly related
that the only thing that resonates. You

225
00:15:33,919 --> 00:15:37,639
know, if you're messing with payment
systems, only payment system stuff is affected.

226
00:15:39,200 --> 00:15:41,519
Right. Yeah. I was in
the military, so I use the

227
00:15:41,600 --> 00:15:46,960
term blast radius, And you know
when I break this, what all is

228
00:15:46,000 --> 00:15:50,519
into blast radius that I'm gonna have
to say blast I usually measure the quality

229
00:15:50,600 --> 00:15:58,240
by meals that way. But I
think that was here joke originally Richard deference

230
00:15:58,279 --> 00:16:00,399
to you. No, No,
I think I think the ex military guy

231
00:16:00,480 --> 00:16:07,559
using blast radius has a whole other
impact than I do. But yeah,

232
00:16:07,600 --> 00:16:11,879
the idea obviously is to limit the
blast radius of certain types of changes.

233
00:16:12,000 --> 00:16:17,360
Right. If it's something that should
only affect, like how orders are processed,

234
00:16:17,399 --> 00:16:21,679
then you would hope that making that
change doesn't require you to redeploy everything

235
00:16:21,679 --> 00:16:23,840
that has to do with you know, customers or you know, the search

236
00:16:23,919 --> 00:16:26,960
engine of the site or whatever it
might be. Well, I'm just thinking

237
00:16:27,000 --> 00:16:30,200
in terms of merge conflicts, man, Like, yeah, okay, he

238
00:16:30,240 --> 00:16:33,159
was busy working over on payments here, and then somebody went and made some

239
00:16:33,240 --> 00:16:37,639
changes to product, and now I
have a merged conflict. Really like that

240
00:16:37,639 --> 00:16:41,480
that shouldn't happen, right, But
you also have the problem of inner activity

241
00:16:41,519 --> 00:16:47,919
between all your projects, right,
so one project might have references to two

242
00:16:48,000 --> 00:16:52,720
or three or four other projects.
So now if that one project needs to

243
00:16:52,759 --> 00:16:55,600
go into a micro service, what
do you do with the other ones?

244
00:16:56,279 --> 00:17:02,480
Are you? Are you now committed
to splitting everything up and that just increases

245
00:17:02,519 --> 00:17:07,039
complexity? Right? Yeah, well, even adding the modularity increases complexity of

246
00:17:07,079 --> 00:17:10,759
the whole solution. But the point
of it, or one of the points

247
00:17:10,799 --> 00:17:12,119
of it, especially if you have
a large team you're hoping that you can

248
00:17:12,160 --> 00:17:17,599
have different teams take on different modules, is that things become simpler in that

249
00:17:17,759 --> 00:17:21,119
module. So if you look at
the whole solution, yeah, like your

250
00:17:21,240 --> 00:17:25,400
four project solution now has fifteen projects
because you've broken it up into four modules.

251
00:17:25,839 --> 00:17:29,319
But when you're working on just the
order processing module, you still only

252
00:17:29,359 --> 00:17:33,319
care about two projects and you don't
care about all the other modules. So

253
00:17:33,359 --> 00:17:37,000
your actual area of concern on a
day to day basis is simpler. True,

254
00:17:37,319 --> 00:17:42,240
everybody has that shared project, right
where all the things go, like

255
00:17:42,359 --> 00:17:48,960
models and all of those things.
Yeah, oftentimes yes, and it might

256
00:17:48,960 --> 00:17:51,599
be shared or it might be a
per module. You'll probably have both.

257
00:17:51,640 --> 00:17:53,880
You'll have some that are global and
some that are per module. But like,

258
00:17:55,319 --> 00:17:57,079
this is just a pattern like the
modular monolith is a pattern. It's

259
00:17:57,119 --> 00:18:02,240
not a totally prescriptive thing. But
the way I have built it and the

260
00:18:02,240 --> 00:18:06,240
way I show it to do in
my course, is to have a single

261
00:18:06,440 --> 00:18:11,440
entry point, host, process or
project. And so that's my ASPNT core

262
00:18:11,039 --> 00:18:15,079
project that enters in and it literally
has nothing in it except program dot c

263
00:18:15,279 --> 00:18:21,559
s and appsettings dot Jason, and
its job is to load the modules from

264
00:18:21,559 --> 00:18:26,720
the other projects. And then a
given module in the solution is basically just

265
00:18:26,759 --> 00:18:30,160
a solution folder, because we don't
have better artifacts for that in dot NetWorld,

266
00:18:30,440 --> 00:18:34,119
at least at the moment. And
inside of that solution folder, there's

267
00:18:34,240 --> 00:18:38,200
there's two or three additional projects.
Right, there's the actual code for the

268
00:18:38,240 --> 00:18:42,799
module, which includes all of its
UI and all of the domain model logic

269
00:18:42,839 --> 00:18:45,319
and however talks to a database,
and then all the logic for it is

270
00:18:45,319 --> 00:18:49,400
in there, and they're separated just
in folders. Right, there's not you

271
00:18:49,400 --> 00:18:53,440
know, it's not a clean architecture
thing with with separate projects in there.

272
00:18:53,519 --> 00:18:56,960
You know, all those different pieces
are there, but they're just separated by

273
00:18:56,000 --> 00:19:00,799
folders. And the reason is that
I want them all to be internal.

274
00:19:00,200 --> 00:19:04,119
I don't want other modules to be
able to access those of compile times.

275
00:19:04,160 --> 00:19:08,799
I'm using the internal keyword heavily anywhere
I can to keep that module locked down

276
00:19:08,839 --> 00:19:14,279
and encapsulated. And then another project
it'll have as tests because I like tests.

277
00:19:14,480 --> 00:19:15,920
Now, how the tests work against
that project, Well, we can

278
00:19:17,039 --> 00:19:21,079
use the internals visible to attribute on
the assembly to make it so the tests

279
00:19:21,119 --> 00:19:25,000
at least can get to those files. We encourage everybody listening to pause and

280
00:19:25,079 --> 00:19:30,359
rewind and listen at half speed because
you just unloaded a whole bunch of pile

281
00:19:30,400 --> 00:19:33,359
of wisdom there, Steve. Yeah, yeah, sorry, you might want

282
00:19:33,359 --> 00:19:36,279
to you might want to listen to
a little slower, but but by all

283
00:19:36,279 --> 00:19:40,599
means continue at this pace because I
think it's great. That's a consequence of

284
00:19:40,640 --> 00:19:42,519
listening to YouTube and podcasts at one
and a half speed, as I think,

285
00:19:42,599 --> 00:19:45,960
like this is how people are supposed
to talk, is like this fast.

286
00:19:45,079 --> 00:19:49,559
Yeah, yeah, yeah, but
I mean just a whole bunch of

287
00:19:49,599 --> 00:19:53,200
stuff. You just you just gave
us advice to do, you know,

288
00:19:53,319 --> 00:19:59,319
using internal and the way that projects
are scoped and solutions are scoped. So

289
00:19:59,559 --> 00:20:03,279
yeah, there's a lot to it, and it's a lot as we're obviously

290
00:20:03,359 --> 00:20:07,039
figuring out right now. It's a
lot more complex than people think, even

291
00:20:07,079 --> 00:20:11,160
in a monolith, to be prepared, to be prepared to go, yeah,

292
00:20:11,240 --> 00:20:15,359
I mean to give it the initial
structure. There is a little bit

293
00:20:15,359 --> 00:20:18,680
more complex, a little bit more
work. It's really not that bad.

294
00:20:18,759 --> 00:20:22,559
And probably like I've done with clean
Architecture, I've published a template that you

295
00:20:22,559 --> 00:20:25,920
can install off of new get that's
on getthub and you can just do a

296
00:20:26,079 --> 00:20:29,279
you know, dot that new clean
arc and it gives you the solution all

297
00:20:29,319 --> 00:20:32,440
set up. I'll probably do something
similar for modular monoliths. I just haven't

298
00:20:32,440 --> 00:20:34,759
gotten there yet. But once you
have it set up, like adding another

299
00:20:36,160 --> 00:20:40,400
module is pretty straightforward. It's like
add a solution folder, add these two

300
00:20:40,519 --> 00:20:45,640
or three projects, and you know
you're off and running. The third project

301
00:20:45,640 --> 00:20:49,079
that's typically in that module that I
haven't mentioned is a contracts project, and

302
00:20:49,119 --> 00:20:53,200
the whole idea of the contracts project
is that's where the shared stuff goes.

303
00:20:53,279 --> 00:20:57,880
That's where the DTOs or the messages
or things that you need in order to

304
00:20:57,920 --> 00:21:03,640
communicate with that model from another module
where those would live. That's great,

305
00:21:03,960 --> 00:21:07,920
Yeah, very important. It just
really quick. I don't mean to change

306
00:21:07,920 --> 00:21:11,039
the subject because we've got to get
back to this. But what's dome Train

307
00:21:11,240 --> 00:21:15,200
and why haven't I heard about it? Dome Train is Nick Chapsis's training company,

308
00:21:15,359 --> 00:21:18,839
and so Nick Chapsis is a real
popular YouTuber talks about dot net a

309
00:21:18,839 --> 00:21:22,799
couple of times a week, and
so he has initially published his own courses,

310
00:21:22,839 --> 00:21:26,039
but in the last year or so, he's brought in a bunch of

311
00:21:26,039 --> 00:21:30,160
additional authors on there, and so
you'll find my modular Monolith course there as

312
00:21:30,200 --> 00:21:34,200
well as a bunch of other courses. And I still have a relationship with

313
00:21:34,240 --> 00:21:37,400
plural Site, and I have a
bunch of courses on plural site as well.

314
00:21:37,440 --> 00:21:42,039
But I'm trying dome Train out for
the modular Monolith topic. Cool because

315
00:21:42,039 --> 00:21:45,680
I think that, you know,
people are like, Okay, you've convinced

316
00:21:45,720 --> 00:21:49,279
me, I want to go check
out this this workshop here, great stuff.

317
00:21:49,359 --> 00:21:52,640
Yeah. I don't know if it'll
still be good when people listen to

318
00:21:52,640 --> 00:21:53,680
this show, because I know that
could be in the far future, but

319
00:21:53,680 --> 00:21:56,920
at least for now, if they
use our Dallas when they check out one

320
00:21:56,920 --> 00:22:02,079
of those courses, they get twenty
percent off. Very good. Uh So

321
00:22:02,279 --> 00:22:04,279
you're when you were talking about contracts, you're not talking about contracts as in

322
00:22:04,680 --> 00:22:08,039
something that's a part of the domain
for this business, but contracts, as

323
00:22:08,079 --> 00:22:12,119
in the contracts between elements of the
application interfaces, et cetera. Exactly.

324
00:22:12,200 --> 00:22:18,400
Yes, not not contracts like legal
contracts, but the the public messages,

325
00:22:18,440 --> 00:22:22,680
they're they're classes, their records,
they're they're dt os. They could be

326
00:22:22,759 --> 00:22:26,640
queries, they could be events,
they could be commands. Those are typically

327
00:22:26,920 --> 00:22:30,480
the three types of messages that your
application will use, and then you will

328
00:22:30,519 --> 00:22:33,519
have dt os that represent the actual
things in your domain, right, Yeah,

329
00:22:33,599 --> 00:22:37,880
And so that and that's just basically
a way to maintain that reliability from

330
00:22:37,960 --> 00:22:42,640
update to update. The old DTOs
are still supported, so that I mean,

331
00:22:42,640 --> 00:22:47,039
we did a lot of this with
the old in service bus approaches just

332
00:22:47,039 --> 00:22:51,359
because I had so many different teams
working and in different languages. So you

333
00:22:51,440 --> 00:22:52,480
know, there's no way you're going
to get everybody to move to V two.

334
00:22:52,799 --> 00:22:56,559
Like it just wasn't a thing,
right you, backward compatibility. Yeah,

335
00:22:56,599 --> 00:23:00,480
the bigger celebration was when did you
get to retire account if ever?

336
00:23:02,400 --> 00:23:06,720
Yeah, And the other key reason
why that separate project exists is to touch

337
00:23:06,759 --> 00:23:07,880
on what Carl was mentioning, which
is, you know, what if these

338
00:23:07,920 --> 00:23:11,880
two things need to talk to each
other, right, not just one not

339
00:23:11,000 --> 00:23:14,319
just in one direction. Right.
So in dot net, if you as

340
00:23:14,319 --> 00:23:17,440
soon as you split out two things
into two different projects. Let's say we've

341
00:23:17,480 --> 00:23:19,599
got customers and orders, right,
and so I want to go and get

342
00:23:19,599 --> 00:23:22,880
a customer with all their orders for
this page I need to show. Okay,

343
00:23:22,880 --> 00:23:26,759
Well, then I guess customer needs
to have a reference to orders so

344
00:23:26,799 --> 00:23:29,279
it can get all the order stuff. All right. Well now I'm like,

345
00:23:29,319 --> 00:23:30,759
I'm on an order, but I
want to show all the customer details

346
00:23:32,599 --> 00:23:33,960
with it, right. Well,
okay, well, now that order endpoint

347
00:23:34,039 --> 00:23:37,559
needs to have some way to go
call customer. Well, as soon as

348
00:23:37,599 --> 00:23:40,799
you try and add a project reference
in both directions and visual studio, it's

349
00:23:40,880 --> 00:23:44,079
it's not going to let you.
Circular references aren't allowed. But you could

350
00:23:44,119 --> 00:23:48,319
certainly have the customer's module depend on
order dot contracts, and you can have

351
00:23:48,359 --> 00:23:52,640
the orders module depend on customer dot
contracts, and that's perfectly fine, and

352
00:23:52,640 --> 00:23:56,920
then you can use those messages to
communicate with one another. So you know,

353
00:23:56,160 --> 00:24:03,319
one of the byproducts of splitting up
all these silos into individual things when

354
00:24:03,359 --> 00:24:10,599
when they're distributed is it's almost like
the sequel join problem right right, when

355
00:24:10,640 --> 00:24:15,599
you have when you follow doctor cod
and everything's in like all these fully normalized

356
00:24:15,599 --> 00:24:19,400
tables, and then just to pull
one set of data out of the database

357
00:24:19,480 --> 00:24:23,279
requires fourteen points. I mean,
you have the same kind of thing here,

358
00:24:23,359 --> 00:24:30,680
right with microservices if they're too complex
and so walking that line between you

359
00:24:30,720 --> 00:24:33,839
know where how what's the granularity that
we need? Right? And that is

360
00:24:33,880 --> 00:24:38,000
tough and if you get it wrong
with micro services, it is fairly expensive,

361
00:24:38,079 --> 00:24:42,039
but mostly in terms of time and
effort. Sometimes there's money to refactor

362
00:24:42,079 --> 00:24:47,359
a distributed application in order to fix
something like that, where like these two

363
00:24:47,359 --> 00:24:49,759
concepts really should have been together,
but we split them and now everything is

364
00:24:49,759 --> 00:24:52,279
harder. Yeah. Yeah, now
now we're being punished for it. I

365
00:24:52,319 --> 00:24:56,000
mean, we've got to have a
whole conversation just about debugging micro services in

366
00:24:56,039 --> 00:25:02,000
the first place, because that's hard
to Yeah. The beauty of the modular

367
00:25:02,039 --> 00:25:07,000
monolith approach is that you're not distributed. All these communications that we're talking about,

368
00:25:07,000 --> 00:25:10,599
they're all in process right right.
You can use a tool like mediator

369
00:25:10,680 --> 00:25:14,880
and the mediator pattern to make it
so that one module can talk to another.

370
00:25:15,559 --> 00:25:18,119
Just by using those contracts, you
can new up a command and say,

371
00:25:18,160 --> 00:25:22,640
you know, mediator dot send this
command, and some other module that

372
00:25:22,799 --> 00:25:25,960
knows about that command is the one
that's going to process the work. And

373
00:25:26,000 --> 00:25:27,680
if you're stepping through in a debugger, you just step right from module to

374
00:25:27,720 --> 00:25:32,359
module. Everything just works in process. It's fast. Right, there's not

375
00:25:32,640 --> 00:25:36,480
a distributed message bust or anything involved
unless you need one. But just you

376
00:25:36,480 --> 00:25:40,440
know, by default, your monolith, which is now a modulith if you

377
00:25:40,480 --> 00:25:44,920
will, a modular modelith module,
is still what it was before. Right,

378
00:25:44,960 --> 00:25:48,440
It's still simple to deploy, simple
to debug, all runs in one

379
00:25:48,519 --> 00:25:53,640
process. Just all we've done is
logically separate things into these different modules.

380
00:25:55,599 --> 00:26:00,400
But Steve, what about Kubernetes.
You never have to worry about it with

381
00:26:00,400 --> 00:26:04,160
this approach. That's the beauty of
it. I think. I think Kubernetes

382
00:26:04,240 --> 00:26:07,599
is a way for cloud vendors to
make more money. Well, it's working,

383
00:26:10,319 --> 00:26:14,279
but I mean, it's just an
interesting point about this that the deployment

384
00:26:14,400 --> 00:26:18,799
or the implementation and the architecture are
separate things. You certainly can can push

385
00:26:18,839 --> 00:26:23,039
out a model if in a contater, just as well as you can push

386
00:26:23,039 --> 00:26:26,119
it a push out as out of
microservice. As a good table we have

387
00:26:26,160 --> 00:26:29,160
a friend who listens to the show, and he knows who he is if

388
00:26:29,160 --> 00:26:33,319
he's listening, who I'm friends with, and I've been friends with him for

389
00:26:33,359 --> 00:26:38,400
a long time. And his boss, you know, at his company,

390
00:26:40,359 --> 00:26:44,680
is sold on you know, Kubernetes
and micro services and all these things and

391
00:26:44,839 --> 00:26:48,599
the you know, domain driven design
and all the things that go with it.

392
00:26:49,200 --> 00:26:52,920
And you know, when you talk
to them, it's like they only

393
00:26:53,000 --> 00:26:57,880
have a handful of customers. But
so it doesn't make sense and he can't

394
00:26:59,000 --> 00:27:03,720
talk and any sense into his boss
in terms of you know, trying to

395
00:27:03,759 --> 00:27:10,880
simplify this and going monolithically modular,
and it's just painful. It's very painful.

396
00:27:10,960 --> 00:27:12,160
And you know, I guess,
as you said, I think it

397
00:27:12,240 --> 00:27:15,160
might be a little bit hubrious,
like, oh, well, we need

398
00:27:15,160 --> 00:27:21,319
to anticipate the day, right,
when are you know, when we suddenly

399
00:27:21,400 --> 00:27:25,839
have millions of customers and blah blah
blah. But you really need to ask

400
00:27:25,880 --> 00:27:29,839
yourself, is is that going to
happen? And can we prepare for it

401
00:27:29,920 --> 00:27:36,680
now and serve those five hundred thousand, ten thousand customers, serve them well

402
00:27:36,880 --> 00:27:41,839
and be ready for the next for
one hundred thousand customers? Right And it's

403
00:27:41,119 --> 00:27:45,319
there are challenges even with this architecture. Right. What is one of the

404
00:27:45,440 --> 00:27:49,920
nicest, easiest things you get out
of a monolithic architecture is that typically you

405
00:27:49,960 --> 00:27:55,559
have a single database and anybody can
querry that database for anything they want at

406
00:27:55,559 --> 00:27:59,440
any time, from anywhere, right, And that's a blessing and a curse.

407
00:27:59,519 --> 00:28:02,200
Right later on, if you do
decide to try and split this up

408
00:28:02,240 --> 00:28:06,240
into different modules or micro services like
that is usually one of the hardest things

409
00:28:06,279 --> 00:28:07,960
to do because you look at your
database and you're like, hey, let's

410
00:28:08,000 --> 00:28:11,200
let's create an enerity relationship diagram and
see all the foreign keys, and it's

411
00:28:11,240 --> 00:28:15,279
just tangled web. It's like,
well, everything is related to everything,

412
00:28:15,279 --> 00:28:19,440
how do I start? And it's
easier to just write a query with a

413
00:28:19,440 --> 00:28:23,359
bunch of joints in that scenario.
If you move to micro services, every

414
00:28:23,359 --> 00:28:27,799
micro service should have its own database. If you've moved to a modular monolith,

415
00:28:27,839 --> 00:28:32,799
the same is true, although typically
you can just use schema, not

416
00:28:32,839 --> 00:28:36,480
the whole sequel schema, but the
schema type in SQL server or database,

417
00:28:36,880 --> 00:28:38,960
so that every table is prefixed by
the schema, so you'll have you know,

418
00:28:40,119 --> 00:28:44,759
orders dot order and orders dot order, item for example, and then

419
00:28:44,799 --> 00:28:47,839
you just make it a rule that
you follow as a team that when I'm

420
00:28:47,880 --> 00:28:49,640
in the orders module, I only
work with things that are in the orders

421
00:28:49,680 --> 00:28:52,480
schema. I don't go reach out
and find other, you know, things

422
00:28:52,480 --> 00:28:56,359
that are in the database. Right, But you know you can if you

423
00:28:56,359 --> 00:29:00,200
want to. And that's that's one
nice thing is you've got that escape out

424
00:29:00,200 --> 00:29:03,599
if you need it. But there
are other patterns that you can use when

425
00:29:03,640 --> 00:29:07,880
you need data aggregation, Like I
really want to run this report and I'd

426
00:29:07,880 --> 00:29:11,319
like to be able to join across
the orders and the customers and the addresses

427
00:29:11,319 --> 00:29:15,039
and the products. And you know
that is difficult to do in a micro

428
00:29:15,119 --> 00:29:18,279
services scenario where you've got four different
separate databases that might even be running on

429
00:29:18,319 --> 00:29:22,960
different database technologies. But there are
patterns that you can use to make that

430
00:29:23,000 --> 00:29:26,920
happen, and I show how to
do that in my course. Also,

431
00:29:27,079 --> 00:29:30,720
guys, let's take a break.
We'll be right back after these very important

432
00:29:30,720 --> 00:29:37,680
messages, and we're back. You're
listening to dot net rox. I'm Carl

433
00:29:37,720 --> 00:29:41,680
Franklin. That's my friend Richard Campbell
in Mexico, somewhere where it's nice and

434
00:29:41,720 --> 00:29:45,480
warm and sunny, goddamn it,
nice and warm and full of palm trees.

435
00:29:45,559 --> 00:29:49,400
Yes, And that's Steve Smith.
And we're talking about modular monoliths.

436
00:29:49,920 --> 00:29:55,799
And Richard made a joke, but
what about Kubernetes. And you know,

437
00:29:55,920 --> 00:29:59,079
it's kind of bittersweet because a lot
of people use it, and a lot

438
00:29:59,079 --> 00:30:03,160
of people are very good at it. But eventually, you know, if

439
00:30:03,200 --> 00:30:08,599
your monolith, your modular monolith does
become a set of microservices. It's not

440
00:30:08,640 --> 00:30:12,240
that Kubernetes is going away, right, It's just that, you know,

441
00:30:12,279 --> 00:30:15,599
we don't want to start with it, right, And I mean the main

442
00:30:15,640 --> 00:30:19,680
thing you get with Kubernetes is managing
all these different services in a way that

443
00:30:19,759 --> 00:30:26,519
allows for independence and independent scale.
And in your monolith initially you can still

444
00:30:26,559 --> 00:30:30,680
scale that, right if you're just
using a simple app service or you're hosting

445
00:30:30,720 --> 00:30:34,319
your own VMS or whatever. Right, you can always have more instances of

446
00:30:34,359 --> 00:30:40,079
that and scale, you know,
horizontally that way, not to mention vertically.

447
00:30:40,160 --> 00:30:44,039
I mean, you can add more
horsepower to that instance for quite a

448
00:30:44,039 --> 00:30:45,960
while, especially if you're playing in
cloud Land. Yeah, you know,

449
00:30:47,039 --> 00:30:49,720
the cloud Land machines are just getting
more and more powerful, so you don't

450
00:30:49,759 --> 00:30:52,960
have to distribute across multiple instances.
Yeah, you just spin up the dial

451
00:30:53,000 --> 00:30:56,559
and say, well I need ten
of these if need be for horizontal,

452
00:30:56,680 --> 00:30:59,960
or you spin up the dial and
say well I need an E or an

453
00:31:00,200 --> 00:31:03,640
F or whatever labels they have for
the higher. Uh, there'll be a

454
00:31:03,759 --> 00:31:07,039
Q one of these days. Yeah, that'll be the quantum computers. There

455
00:31:07,039 --> 00:31:11,839
you go. The stack Overflow is
not using micro services, right, I

456
00:31:11,880 --> 00:31:15,039
mean, if you ever read anything
about their architecture, they just have some

457
00:31:15,160 --> 00:31:19,039
really powerful servers that run the entire
site, and most of our apps were

458
00:31:19,039 --> 00:31:22,720
building don't have anywhere near the traffic
of stack overflow, or the response time

459
00:31:22,759 --> 00:31:26,680
for that matter. Right. Yeah, So, I mean there is some

460
00:31:26,759 --> 00:31:30,000
software side of this. They What
I appreciate about your hater is not just

461
00:31:30,359 --> 00:31:33,119
that mechanism scaling and they're relatively small, but it's also a unit of update

462
00:31:33,799 --> 00:31:40,519
like you get. The containers give
you a habit of treating software like cattle,

463
00:31:40,599 --> 00:31:44,960
not pets, where you don't modify
anything, you just make a new

464
00:31:45,000 --> 00:31:51,279
one. Tendency listeners just shuddered in
horror when you call them cattle, because

465
00:31:51,319 --> 00:31:56,519
those are sacred. What do you
mean cattle? I didn't say what kind

466
00:31:56,519 --> 00:32:01,119
of animal yeah, yeah, that's
a good metaphor for the point being that

467
00:32:01,519 --> 00:32:07,759
you tend not to update and create
unique states that you you design. The

468
00:32:07,839 --> 00:32:13,079
update is a new manifest. The
manifest creates new instances of containers if you

469
00:32:13,079 --> 00:32:15,039
want to management Kubernetes, to knock
yourself out, whatever makes you happy.

470
00:32:15,640 --> 00:32:20,200
And then you shift workloads over to
the new implementation and the old ones can

471
00:32:20,240 --> 00:32:23,319
be shut down. That that's that's
the magic of cloud right that that you

472
00:32:23,359 --> 00:32:28,559
don't have to update servers anymore.
You just make new ones and kill the

473
00:32:28,559 --> 00:32:31,759
old ones. Right and and the
beautia ASP do a core. It works

474
00:32:31,799 --> 00:32:37,319
with Linux, it works across platforms. So you could certainly take this modular

475
00:32:37,400 --> 00:32:42,119
monolith deployable you know the DLLs that
you're going to deploy, uh and and

476
00:32:42,240 --> 00:32:46,119
send that into a doctor image and
then host that container and then as part

477
00:32:46,160 --> 00:32:50,680
of your c I c D pipeline, publish a new container, push that

478
00:32:50,799 --> 00:32:52,880
up there, have a blue green
deployment or you know, whatever you want

479
00:32:52,920 --> 00:32:55,839
to do, uh and and you
know when it when you vetted it and

480
00:32:57,000 --> 00:33:00,160
verify that's good to go. You
know, replace the existing one with that

481
00:33:00,200 --> 00:33:01,680
one or with ten of that one. If if that's how you want to

482
00:33:01,680 --> 00:33:06,279
scale, yeah, uh, and
you don't necessarily need to have micro services.

483
00:33:06,440 --> 00:33:08,039
But let's say you do. Right, Let's say that you've got this

484
00:33:08,240 --> 00:33:13,559
modular monolith that you've built, and
it's you know, been easier to build

485
00:33:13,599 --> 00:33:15,720
along the way because you didn't have
to deal with Kubernetes yet, you didn't

486
00:33:15,720 --> 00:33:21,079
have all the you know, distributed
application effort yet. And now you realize

487
00:33:21,119 --> 00:33:24,839
this piece, this one module,
really needs to be separate for reasons because,

488
00:33:25,240 --> 00:33:29,160
yeah, it's it's a bottleneck in
some way. It's a performance bottle

489
00:33:29,200 --> 00:33:30,519
neck or a feature bottle neck,
like what is it that? Yeah,

490
00:33:30,559 --> 00:33:32,960
it could be any of those things, right, it could be a bottleneck,

491
00:33:34,000 --> 00:33:36,039
could be there's a different team that's
in a different time zone that you

492
00:33:36,039 --> 00:33:38,160
want to work on it. It
could be h you know, there's GDPR

493
00:33:38,240 --> 00:33:42,480
requirements that the data can't leave the
you know, Germany, so you need

494
00:33:42,480 --> 00:33:45,039
to host it somewhere else, any
any number of reasons. Right, Well,

495
00:33:45,079 --> 00:33:49,799
if it's been built as a module, it's fairly easy for you to

496
00:33:49,799 --> 00:33:52,880
pull that out and put it in
a separate process. Right, And now

497
00:33:52,000 --> 00:33:54,319
you know that can be you know, you know, you're not necessarily on

498
00:33:54,359 --> 00:33:58,720
a micro services architecture, but you
do have you know, now one module

499
00:33:58,759 --> 00:34:02,039
that's separate from the rest of your
modules that are all bundled together. And

500
00:34:02,079 --> 00:34:06,599
so you take the logical separation that
you already have and you turn it into

501
00:34:06,599 --> 00:34:09,000
physical separation on a case by case
basis. You don't have to, you

502
00:34:09,000 --> 00:34:12,880
know, do all of it at
once. But this isn't free either.

503
00:34:12,960 --> 00:34:17,840
You're adding an authentication layer there,
then in a transport layer because you're not

504
00:34:19,079 --> 00:34:22,000
part of the same thing for sure. Yeah, there's a host of things

505
00:34:22,039 --> 00:34:23,480
that you'll have to figure out,
at least for that first one, like

506
00:34:23,559 --> 00:34:27,280
how are you going to communicate it
with it now that it's out of process.

507
00:34:28,239 --> 00:34:32,199
And the nice thing about the modular
monolith approach is if you're using you

508
00:34:32,199 --> 00:34:37,079
know, messages like I've described as
contracts approach, is those messages all have

509
00:34:37,239 --> 00:34:42,199
handlers that in a monolith can just
do the work right in the handler,

510
00:34:42,239 --> 00:34:44,800
it goes and makes a database call
and gets the stuff it needs and returns

511
00:34:44,840 --> 00:34:46,599
back your dto and that's that.
Right Now, you suddenly say, well,

512
00:34:46,679 --> 00:34:51,079
actually you're you're across the wire from
me, You're somewhere else, and

513
00:34:51,400 --> 00:34:54,440
so you can't just do that anymore, right now you've got to transport it

514
00:34:54,519 --> 00:34:58,639
over a message queu or a message
bus. You've got in service bus in

515
00:34:58,679 --> 00:35:00,800
between, or there's an a layer
between, and we have to have you

516
00:35:00,840 --> 00:35:04,960
know, token based security flow all
the way through. Like all of those

517
00:35:05,000 --> 00:35:08,400
things can still be done just in
that handler. Now you're going to add

518
00:35:08,400 --> 00:35:12,400
that additional work, probably as a
decorator, as another handler that sits in

519
00:35:12,400 --> 00:35:15,079
front of that one, so that
the original one doesn't even necessarily have to

520
00:35:15,199 --> 00:35:19,559
change, but you'll add that new
responsibility in its own class that sits in

521
00:35:19,559 --> 00:35:22,239
front of the existing one. Okay, yeah, that makes sense. But

522
00:35:22,320 --> 00:35:24,639
I also appreciate the idea of like, you only do this because you need

523
00:35:24,679 --> 00:35:30,519
to. You're adding complexity and overhead
and impacting performance, I would think to

524
00:35:30,639 --> 00:35:32,960
a little to some degree. Yes, but you know, as a guy

525
00:35:32,960 --> 00:35:36,400
who's done a lot of scaling over
the years, is like, I'm going

526
00:35:36,400 --> 00:35:42,840
to reduce the single use performance so
the multi use performance stays consistent. That's

527
00:35:42,960 --> 00:35:45,599
not necessarily fast per se, but
at least is as the number of instances

528
00:35:45,760 --> 00:35:49,960
go up, it doesn't change.
Because that's the only thing that makes people

529
00:35:50,000 --> 00:35:53,800
sad is that this one took five
minutes where the other one took four seconds.

530
00:35:54,000 --> 00:35:59,199
Yeah, right, right, Yeah, just trading for scalability will almost

531
00:35:59,239 --> 00:36:02,639
always make individual performance worse, right, because if you just have your entire

532
00:36:02,679 --> 00:36:07,440
application on one box and either it
doesn't have a database, or that database

533
00:36:07,519 --> 00:36:10,119
is also on that box, right, then all of your calls are on

534
00:36:10,159 --> 00:36:13,400
the same box, right, there
is no network hop, and so you're

535
00:36:13,440 --> 00:36:15,159
going to come back in you know, milliseconds, you know, very very

536
00:36:15,159 --> 00:36:20,239
small milliseconds on every request. But
how do you scale that? Well,

537
00:36:20,400 --> 00:36:22,000
that's the trick, right, And
so as soon as you start scaling it

538
00:36:22,039 --> 00:36:27,280
and you have multiple servers involved in
network hops, everything is orders of magnitude

539
00:36:27,320 --> 00:36:30,559
slower, but still generally fast enough. And now it scales you know,

540
00:36:30,880 --> 00:36:35,320
linearly at least up to some point. Yeah, yeah, there's always there's

541
00:36:35,519 --> 00:36:38,679
nothing's for forever, but it should
be enough at least, right, And

542
00:36:38,920 --> 00:36:42,559
an architecture, everything is a trade
off. So it's just a question of

543
00:36:42,599 --> 00:36:46,400
what is the right architecture for your
application for today and for the next you

544
00:36:46,440 --> 00:36:50,880
know, whatever period of time you
anticipate in media, Yeah, for fishent

545
00:36:50,920 --> 00:36:52,400
amount of time. All right,
Steve, here's this scenario for you.

546
00:36:52,480 --> 00:36:55,960
So people are listening to this and
they're about to embark on a new project

547
00:36:57,000 --> 00:37:00,239
and realizing that they're going to get
in over their heads the upfront architecture if

548
00:37:00,239 --> 00:37:06,000
they're going to make this right.
Maybe they've watched your your your workshop,

549
00:37:06,039 --> 00:37:10,760
here your course and they want to
hire a consultant, right, So they

550
00:37:10,760 --> 00:37:15,400
bring in these consultants. And as
we know consultants, uh, many of

551
00:37:15,400 --> 00:37:22,000
them can talk a great talk and
you want to they're on the lookout for

552
00:37:22,119 --> 00:37:27,639
smells, right, So what smells
should we be looking out for when we're

553
00:37:27,679 --> 00:37:30,360
hiring consultant. Then they sit down
and they say, all right, here's

554
00:37:30,360 --> 00:37:32,239
what we think I think you should
do. Blah blah blah. What are

555
00:37:32,280 --> 00:37:37,719
the smells that say Nope, this
guy is not does not understand. Well,

556
00:37:37,719 --> 00:37:43,199
first you should just call nimble Pros
because that's us, uh and we

557
00:37:43,239 --> 00:37:46,000
can help you. So go to
nimblepros dot com. You know plug that

558
00:37:46,039 --> 00:37:50,119
you set me up for. Sorry, but no. If you're looking for

559
00:37:50,639 --> 00:37:52,719
things to watch out for in your
modular model, well in your monolith or

560
00:37:52,760 --> 00:37:58,280
in your architecture, the biggest thing
if you're if you're hoping to have modularity,

561
00:37:58,639 --> 00:38:01,519
right, whether it's micro services or
modules within a monolith, the thing

562
00:38:01,519 --> 00:38:06,440
that will kill modularity is things that
will kill independence, right, things that

563
00:38:06,480 --> 00:38:09,760
add tight coupling between modules. So, if it's micro services or modules,

564
00:38:09,760 --> 00:38:14,320
if they're sharing the same database,
that's a red flag. That's a code

565
00:38:14,320 --> 00:38:16,320
spill. If and I mean the
actual tables in that data so they have

566
00:38:16,320 --> 00:38:20,920
separate schema then and they're on the
same database server, that's that's fine.

567
00:38:21,480 --> 00:38:23,159
You know, you can always break
that apart later. But if they're literally

568
00:38:23,199 --> 00:38:28,880
just sharing one data model between multiple
modules or micro services, then that's going

569
00:38:28,960 --> 00:38:30,960
to make them tightly coupled and you're
going to lose that. So if the

570
00:38:31,039 --> 00:38:36,039
consultant says, so here's module one, it's going to talk to our central

571
00:38:36,079 --> 00:38:37,880
database, and module two and three
are also going to talk to our central

572
00:38:37,960 --> 00:38:44,079
database, you say, there's the
door. You ask them a question of

573
00:38:44,159 --> 00:38:45,880
you know, hey, doesn't that
make them less independent from one another?

574
00:38:45,960 --> 00:38:49,119
And then you hope they have a
good answer. Maybe there's a good reason

575
00:38:49,159 --> 00:38:52,639
why they don't want to split the
data model. That is complicated, or

576
00:38:53,000 --> 00:38:55,599
it does add complexity to split the
data mode. And there is such a

577
00:38:55,639 --> 00:39:00,840
thing as we know as too much
separation. Sure, yeah, so I

578
00:39:00,840 --> 00:39:07,079
guess yeah, right, Like Michelle, my wife and partner at Nimblepros is

579
00:39:07,280 --> 00:39:12,239
a veterinarian by by education, and
and they kind of have a thing where

580
00:39:12,239 --> 00:39:15,360
they don't talk badly about how another
veterinarian diagnose something. Right if somebody comes

581
00:39:15,400 --> 00:39:17,320
in and they took it to another
clinic and then they bring it to you,

582
00:39:17,719 --> 00:39:21,159
like, you don't know what that
that saw. You don't know what

583
00:39:21,239 --> 00:39:22,559
the animal was doing at that time. So I'm not going to talk badly

584
00:39:22,599 --> 00:39:28,079
about some consultant or or architect or
whatever that makes certain decisions because I don't

585
00:39:28,119 --> 00:39:30,960
know what they were thinking, what
what what what they were seeing at that

586
00:39:30,039 --> 00:39:34,760
moment and how the you know,
requirements were given to them. I will

587
00:39:34,760 --> 00:39:37,679
only assess it based on the information
I get at the point in time where

588
00:39:37,679 --> 00:39:39,920
I am introduced to the problem.
So maybe if I could throw in an

589
00:39:39,960 --> 00:39:45,719
answer here. If you hear them
say always or never, you know only

590
00:39:45,719 --> 00:39:51,800
as Seth speaks an ye, try
and be practical and remember that everything is

591
00:39:52,480 --> 00:39:58,679
is a trade off. Is always
saying it depends gets old too. It's

592
00:39:58,760 --> 00:40:01,599
true. It only is helpful to
say it depends if you immediately follow that

593
00:40:01,639 --> 00:40:06,920
with what it depends on and how
your decision will be different based on that

594
00:40:07,800 --> 00:40:09,960
again in a healthcare field, if
you're diagnosing something and you say, you

595
00:40:09,960 --> 00:40:12,760
know what's the treatment going to be, and you say, well, it

596
00:40:12,800 --> 00:40:17,000
depends. Everybody is waiting on what
on your test results. It depends on

597
00:40:17,079 --> 00:40:20,960
the test results, and then you
know, based on that we'll do X

598
00:40:21,119 --> 00:40:30,599
or y like that depends should sure, all right? So anything else that

599
00:40:30,639 --> 00:40:34,000
I mean that the type of other
flags. Other red flags for sure would

600
00:40:34,039 --> 00:40:38,360
be direct calls between modules, right, and direct I mean that they are.

601
00:40:38,679 --> 00:40:42,039
You know, on a modular monolith, you can get away with synchronous

602
00:40:42,039 --> 00:40:45,159
communication using the mediator pattern and I
show that in my course and it works

603
00:40:45,239 --> 00:40:47,960
fantastic. And the reason why that
is allowed in my opinion, why that

604
00:40:49,039 --> 00:40:52,280
works in a modular monoth and it
doesn't work in micro services. And what

605
00:40:52,320 --> 00:40:57,679
I'm what I'm describing is in micro
services, if you have a direct synchronous

606
00:40:57,679 --> 00:41:02,000
call from micro service A to microservice
be using RPC or web APIs or whatever

607
00:41:02,000 --> 00:41:06,079
you want, that means that they
both have to be up at the same

608
00:41:06,159 --> 00:41:09,039
time. And so now they have
a dependency that you know, they are

609
00:41:09,079 --> 00:41:12,519
not independent. You know, if
one goes down, the other goes down.

610
00:41:13,199 --> 00:41:15,840
And so if you want to have
availability of these services even when one

611
00:41:15,880 --> 00:41:19,039
of them is down, one of
them is being updated, or one of

612
00:41:19,039 --> 00:41:22,880
them crashed or whatever. Right,
then you can't have those direct synchronous dependencies

613
00:41:22,880 --> 00:41:24,800
between them, so you want to
use some kind of message queue or service

614
00:41:24,840 --> 00:41:29,400
bus or something like that. Yeah, exactly, exactly right. So for

615
00:41:29,800 --> 00:41:32,760
commands you can usually get away with
just throwing a command on a queue and

616
00:41:32,800 --> 00:41:36,519
then when that other service gets around
to it, it does the work.

617
00:41:36,719 --> 00:41:40,079
But for queries you usually have a
conundrum, a different problem, like I

618
00:41:40,159 --> 00:41:44,480
need this data from that other service, how do I get it? And

619
00:41:44,559 --> 00:41:49,239
so for that the easiest approach is
data duplication. Right, you have a

620
00:41:49,320 --> 00:41:52,960
cash and that's called the materialized view
pattern, and I cover that in my

621
00:41:52,000 --> 00:41:57,400
course also, But the general idea
is that instead of you asking service B

622
00:41:57,679 --> 00:42:00,280
for its data with a query over
the network, you just get the data

623
00:42:00,360 --> 00:42:05,679
out of your own local copy of
service b's data, and Service B is

624
00:42:05,760 --> 00:42:08,719
updating that copy constantly with events.
Right, so every time there's a new

625
00:42:08,760 --> 00:42:13,360
record added or removed or updated,
an event is fired and you update your

626
00:42:13,360 --> 00:42:17,239
cash. And so if that other
service is down or communication between you is

627
00:42:17,280 --> 00:42:21,960
down, you always still have your
cash to work from data might be a

628
00:42:21,960 --> 00:42:23,800
whole idea, right, but the
data might not be up to date exactly,

629
00:42:23,840 --> 00:42:28,320
So it's a cap theorem your training
consistency for availability. Right. And

630
00:42:28,320 --> 00:42:32,679
what about CQRS that comes to mind, where you have a separate pathway for

631
00:42:32,760 --> 00:42:38,119
querying than you do for writing data, right, And it's exactly this type

632
00:42:38,119 --> 00:42:40,960
of thing I just described that.
It's one of the reasons why you want

633
00:42:42,000 --> 00:42:45,559
to have that separation of commands and
queries. So CQRS, if you don't

634
00:42:45,559 --> 00:42:50,960
know, the acronym is command query
responsibility segregation and the benefit of it.

635
00:42:51,000 --> 00:42:52,079
There's a bunch of benefits, but
one of them is that you can use

636
00:42:52,079 --> 00:42:59,280
different patterns and different architectural approaches for
your commands versus your query's. So,

637
00:42:59,360 --> 00:43:01,079
like I was saying, you could
throw a command on a queue and forget

638
00:43:01,079 --> 00:43:04,360
about it, you can't do that
with a query, right. You can't

639
00:43:04,440 --> 00:43:07,639
just throw it on a queue and
continue on because you need that data and

640
00:43:07,679 --> 00:43:10,440
so you have other patterns that you
use to respond to those. And so

641
00:43:10,559 --> 00:43:15,719
in a modular architecture, whether it's
going to turn into micro services or remain

642
00:43:15,760 --> 00:43:19,960
a modular monolith, it does make
sense for you to define your messages in

643
00:43:20,039 --> 00:43:23,920
terms of queries and commands and events. Those are the three messages you should

644
00:43:23,920 --> 00:43:30,159
have explicitly defined and then use those
as your mechanism for communication, and then

645
00:43:30,159 --> 00:43:34,360
put those in the contracts project for
each module. And just to illustrate how

646
00:43:34,400 --> 00:43:37,360
complex these things are, I saw
a great tweet by Greg Young, who

647
00:43:37,599 --> 00:43:40,800
was the first one to do CQRS. I think he might even coin the

648
00:43:40,880 --> 00:43:45,360
term in the pattern, but that
he was turned down at a job offer

649
00:43:45,519 --> 00:43:52,320
because they said he didn't know enough
about CQRS. You don't know anything about

650
00:43:52,360 --> 00:43:58,400
CQRS. It's like saying Steve Smith, you don't know anything about nimble pros.

651
00:43:59,679 --> 00:44:01,280
Go, yeah, Like did you
even google it? You know,

652
00:44:01,559 --> 00:44:06,760
yeah, google that phrase and you
know his name, right, So what

653
00:44:06,800 --> 00:44:10,760
have we missed? Is there anything
else that people should be on the lookout

654
00:44:10,800 --> 00:44:16,079
for? Maybe maybe when investigating and
existing architecture, right, and you're you

655
00:44:16,159 --> 00:44:22,599
obviously things that are tightly coupled.
But how does one begin to take a

656
00:44:22,719 --> 00:44:25,800
monolith that might not be modular and
modularize it. There's a few different ways

657
00:44:25,800 --> 00:44:29,719
that you can start. Like one
of them is you look at the data

658
00:44:29,719 --> 00:44:32,159
model or the object model and you
try and figure out where there's some isolation,

659
00:44:32,280 --> 00:44:36,679
there's some things that could stand alone. And it might be that your

660
00:44:37,000 --> 00:44:39,039
your hand is forced. It might
be that there are constraints like this is

661
00:44:39,079 --> 00:44:42,400
the one that's not performing well enough, or this is the one that needs

662
00:44:42,440 --> 00:44:45,000
to be in a separate region,
and so you have to start there.

663
00:44:45,599 --> 00:44:49,920
But if you're not forced, it's
usually best if you can pick something that's

664
00:44:50,400 --> 00:44:52,360
low hanging fruit, that is,
you know, sort of the Hello World,

665
00:44:52,519 --> 00:44:57,800
of of the of the various modules, right, something easy and so

666
00:44:58,039 --> 00:45:00,320
you know, sometimes it's something like
how we send emails, right, take

667
00:45:00,400 --> 00:45:04,960
all the email sending functions and put
them in a module and figure out a

668
00:45:05,000 --> 00:45:07,119
way to send communication to that module
to say, hey, here's everything you

669
00:45:07,119 --> 00:45:10,559
need to send this email, and
then it can do that work right,

670
00:45:10,599 --> 00:45:14,280
And that could also be spun off
as a micro service if you want it.

671
00:45:14,320 --> 00:45:16,920
I've I've done that many times for
clients as their first micro service.

672
00:45:17,000 --> 00:45:21,760
Like here's your micro service that just
sends emails. Like it's it's really small,

673
00:45:21,760 --> 00:45:23,039
it's micro, it's only got one
thing it has to worry about,

674
00:45:23,280 --> 00:45:27,519
and you do it from all over
the place inside your various applications. So

675
00:45:27,679 --> 00:45:31,000
like it makes a good first micro
service, and then likewise is an easy

676
00:45:31,000 --> 00:45:34,000
thing to pull out, you know, some type of thing like that.

677
00:45:34,559 --> 00:45:37,800
It could be an easy thing to
pull out for a module in a modulate

678
00:45:37,880 --> 00:45:40,400
model. The reason for it is
that once you've done something simple and easy

679
00:45:40,440 --> 00:45:45,280
like that, you've you've figured out
where all the dragons are, you figured

680
00:45:45,280 --> 00:45:49,440
out what all the problems are.
It's a nice easy vertical slice that you

681
00:45:49,440 --> 00:45:51,639
know, you have to answer all
those questions like well, how do I

682
00:45:51,679 --> 00:45:52,679
communicate with it? And how do
I you know, separate it, and

683
00:45:52,679 --> 00:45:55,119
how do I deploy it separately?
If it's a micro service, all those

684
00:45:55,159 --> 00:45:59,320
questions have to be answered, but
you're not, you know, bogged down

685
00:45:59,400 --> 00:46:02,079
by the This is this huge,
massive, complicated thing that's tied into everything

686
00:46:02,079 --> 00:46:06,280
else. Like no, do a
simple thing that you can solve all the

687
00:46:06,320 --> 00:46:08,880
distributed problems or all the modularity problems. And then once you have that as

688
00:46:08,880 --> 00:46:14,360
an example, now you can just
take that example and use that same approach

689
00:46:14,440 --> 00:46:16,800
for the next one that's more challenging. Do we have to know DDD in

690
00:46:16,880 --> 00:46:20,719
order to do this? Do I
have to take a course on demand driven

691
00:46:20,719 --> 00:46:22,760
design? You don't have to,
but it probably helps because of some of

692
00:46:22,760 --> 00:46:27,920
the patterns that are involved. Right, Each one of these modules or each

693
00:46:28,000 --> 00:46:30,559
micro service should be its own bounded
context. Right, And if you have

694
00:46:30,639 --> 00:46:35,119
never heard of that, then that's
add a little bit about DDU would probably

695
00:46:35,119 --> 00:46:38,039
go a long way, right.
Okay, So you know, I'm basically

696
00:46:38,440 --> 00:46:44,000
hearing of voices of the listeners out
there going all right, you guys are

697
00:46:44,280 --> 00:46:49,199
sort of pooping on micro services.
But does that mean all these other technologies

698
00:46:49,199 --> 00:46:53,599
and patterns and strategies that we use
are are invalid? And you know the

699
00:46:53,639 --> 00:46:59,360
answer over and over again is no. It's just that the modules exist in

700
00:46:59,400 --> 00:47:05,559
a single problem first, right,
Yeah, if there's a good reason to

701
00:47:05,639 --> 00:47:07,440
go to micro services, by all
means you. I'm not saying don't do

702
00:47:07,519 --> 00:47:10,519
that. I'm just saying don't do
it without a good reason, right,

703
00:47:10,719 --> 00:47:15,519
And don't necessarily do it out of
the gate like you're if you're building a

704
00:47:15,559 --> 00:47:21,400
brand new application, you will go
orders of magnitude faster building a modular monolith.

705
00:47:21,760 --> 00:47:23,639
Then you will if you're having to
try and have a bunch of different

706
00:47:23,679 --> 00:47:28,760
services that all communicate to each other
like debugging and deploying, and you know,

707
00:47:28,800 --> 00:47:30,679
reckoning with that and then changing that
design later. Yeah, that's the

708
00:47:30,719 --> 00:47:35,519
thing you be most likely to get
defensive. Yeah. I mean the only

709
00:47:35,519 --> 00:47:37,599
place I've seen this makes sense,
and you know we addressed this before,

710
00:47:37,800 --> 00:47:42,400
is oh, we have one hundred
people working on this, and they're actually

711
00:47:42,480 --> 00:47:45,960
breaking it into these pieces and creating
all the communication layers because it allows everybody

712
00:47:45,000 --> 00:47:50,000
to work at once and hopefully and
you've got a contract team that's sitting over

713
00:47:50,000 --> 00:47:52,559
top of that that's making sure that
the APIs are consistent and nobody gets surprised.

714
00:47:52,599 --> 00:47:57,760
Like, so you're already paying the
overhead to make that many people productive,

715
00:47:57,840 --> 00:47:59,960
right, I just don't know how
many folks are in that situation,

716
00:48:00,800 --> 00:48:02,960
right, Like really, you know, there's an upside to Conways law,

717
00:48:04,039 --> 00:48:07,639
which is if the app is architectured
to the size of the team, and

718
00:48:07,639 --> 00:48:09,159
the team generally has their hands around
it, like they know what they're looking

719
00:48:09,199 --> 00:48:15,159
at, right. Yeah, and
this subsequent you know, break breaking a

720
00:48:15,199 --> 00:48:21,159
part of things because of performance or
other constraints is more reflective of how the

721
00:48:21,199 --> 00:48:24,400
software is being used rather than the
initial architecture. Yeah. And why do

722
00:48:24,440 --> 00:48:27,880
you have one hundred people working on
this? Usually it's because you want to

723
00:48:27,920 --> 00:48:30,400
achieve some level of velocity, right, Well, I would argue that you

724
00:48:30,400 --> 00:48:34,679
could have half as many people working
on it, and you know, build

725
00:48:34,719 --> 00:48:39,480
it as a single repository modular monolith, and you would go faster than having

726
00:48:39,480 --> 00:48:44,679
one hundred people working on it in
a dozen different repositories and all trying to

727
00:48:44,679 --> 00:48:46,719
figure it out, with a separate
team responsible for contracts, and another one

728
00:48:46,920 --> 00:48:51,960
responsible for making sure everybody does everything
right, and two more teams responsible for

729
00:48:52,119 --> 00:48:53,760
figuring out how to deploy it all. Well, Steve, is there anything

730
00:48:53,800 --> 00:48:57,760
else besides here? Of course you
want to pitch or talk about or do

731
00:48:57,880 --> 00:49:00,519
we miss anything before we sign off? Probably mentioned since we've been talking about

732
00:49:00,519 --> 00:49:07,840
micro services and monoliths that I do
have another course coming. I think it'll

733
00:49:07,880 --> 00:49:13,000
be ready first of April or so
on. From micro services to modular monoliths,

734
00:49:13,480 --> 00:49:16,000
which is the backward direction from most
of the books in literature that's been

735
00:49:16,119 --> 00:49:21,119
rud for the last ten years.
But if you've found yourself in a mess

736
00:49:21,159 --> 00:49:23,760
with your micro services and you want
to get back to a monolith but still

737
00:49:23,840 --> 00:49:28,039
keep your modularity that you've worked so
hard to get, that's what this course

738
00:49:28,079 --> 00:49:30,320
will cover. Very cool, Steve, I can't thank you enough for being

739
00:49:30,320 --> 00:49:32,920
with us. It's always enlightening to
talk to you, and we always learned

740
00:49:32,960 --> 00:49:37,400
something and take the course. Get
out there, check it out. Thanks

741
00:49:37,400 --> 00:49:40,000
again, Steve, Thanks Carl Richard. All right, always Bud. We'll

742
00:49:40,039 --> 00:50:04,880
see you next time on dot net
rocks. Dot net rocks is brought to

743
00:50:04,920 --> 00:50:08,960
you by Franklin's Net and produced by
Pop Studios, a full service audio,

744
00:50:09,079 --> 00:50:15,039
video and post production facility located physically
in New London, Connecticut, and of

745
00:50:15,079 --> 00:50:20,880
course in the cloud online at pwop
dot com. Visit our website at d

746
00:50:20,960 --> 00:50:24,239
O T N E t R O
c k S dot com for RSS feeds,

747
00:50:24,480 --> 00:50:30,000
downloads, mobile apps, comments,
and access to the full archives going

748
00:50:30,000 --> 00:50:34,599
back to show number one recorded in
September two thousand and two. And make

749
00:50:34,639 --> 00:50:37,280
sure you check out our sponsors.
They keep us in business. Now go

750
00:50:37,320 --> 00:50:49,880
write some code, See you next
time. You got Jamtlevans and
