1
00:00:01,000 --> 00:00:04,759
How'd you like to listen to dot
net Rocks with no ads? Easy?

2
00:00:05,320 --> 00:00:09,880
Become a patron For just five dollars
a month you get access to a private

3
00:00:10,000 --> 00:00:14,400
RSS feed where all the shows have
no ads. Twenty dollars a month will

4
00:00:14,400 --> 00:00:18,800
get you that and a special dot
net Rocks patron mug. Sign up now

5
00:00:18,839 --> 00:00:24,199
at Patreon dot dot net rocks dot
com. Hey Carlin Richard here. As

6
00:00:24,239 --> 00:00:29,519
you may have heard, NDC is
back offering their incredible in person conferences around

7
00:00:29,559 --> 00:00:33,960
the world, and we'd like to
tell you about them. NDC Copenhagen is

8
00:00:34,000 --> 00:00:39,600
happening August twenty seventh through the thirty
first. Go to NDC Copenhagen dot com

9
00:00:39,799 --> 00:00:44,960
for more information. NDC Porto is
happening October sixteenth through the twentieth. The

10
00:00:45,039 --> 00:00:50,280
Early Bird Discouver DC Porto ends July
twenty first. Go to Dcporto dot com

11
00:00:50,320 --> 00:00:55,600
to register and check out the full
lineup of conferences at NDC Conferences dot com.

12
00:00:57,240 --> 00:01:00,439
Hey there, this is Jeff Fritz, the purple bloa guy from Microsoft,

13
00:01:00,799 --> 00:01:06,000
letting you in on a little secret
about my friend Carl Franklin. You

14
00:01:06,040 --> 00:01:08,840
know, the guy who started dot
net Rocks, the first podcast about dot

15
00:01:08,840 --> 00:01:15,000
net in two thousand and two.
The guy who's been teaching Blazer on YouTube

16
00:01:15,000 --> 00:01:19,760
since twenty twenty. Yeah, that
Carl Franklin. Well, Carl's joined up

17
00:01:19,760 --> 00:01:23,760
with the folks from Code in a
Castle to teach a week long hands on

18
00:01:23,879 --> 00:01:29,920
Blazer class. Are you ready to
get this? At a castle slash villa

19
00:01:30,319 --> 00:01:34,680
in Tuscany. It's sort of a
luxury vacation with Blazer learning built in.

20
00:01:36,799 --> 00:01:42,000
Carl's calling it the Blazer master Class. You'll learn Blazer from the ground up,

21
00:01:42,400 --> 00:01:48,879
finishing the week with the ability to
build and deploy Blazer applications. Since

22
00:01:48,920 --> 00:01:52,920
the training happens for only four hours
in the morning over six days, you

23
00:01:52,920 --> 00:01:57,359
can bring your significant other, your
partner with you and you should right This

24
00:01:57,439 --> 00:02:02,200
part of Italy is absolutely beautiful.
There's so much to see and do and

25
00:02:02,640 --> 00:02:08,240
in Larion Marco from Code into Castle
are organizing daily activities both at the castle

26
00:02:08,599 --> 00:02:13,759
and in the area. The castle
is in the Marema, a less touristed

27
00:02:13,759 --> 00:02:19,800
region of Tuscany, offering both classic
Tuscan hill country as well as easy access

28
00:02:19,840 --> 00:02:24,520
to the Etruscan Riviera, with sublime
local food, wine and olive oil around

29
00:02:24,639 --> 00:02:30,319
every corner. Breakfast is included every
day. There will be two communal dinners

30
00:02:30,360 --> 00:02:35,199
at the castle book ending the experience, and most other meals and all activities

31
00:02:35,199 --> 00:02:39,479
are included. And did I mention
you'll learn Blazer in person from Carl Franklin.

32
00:02:40,199 --> 00:02:45,319
Listen, space is limited and for
very good reason. This is quality

33
00:02:45,360 --> 00:02:52,000
training in a beautiful setting. Go
to code in Acastle dot com slash Blazer

34
00:02:52,080 --> 00:02:58,879
twenty twenty three that's bla z o
R two zero two three to take advantage

35
00:02:58,879 --> 00:03:04,199
of this amazing opportun tunity to join
Carl in Tuscany for an unforgettable week of

36
00:03:04,360 --> 00:03:23,439
La dolce vita while advancing your programming
skills in this important new technology. Hey

37
00:03:23,520 --> 00:03:27,759
guess what, it's dot net rocks
again. I'm Carl Franklin, and I'm

38
00:03:27,840 --> 00:03:31,400
Richard Cabell and Dennis Stouman is here. We're gonna be talking about all sorts

39
00:03:31,400 --> 00:03:37,120
of cool stuff but affluent assertions,
I believe. But how are you,

40
00:03:37,199 --> 00:03:39,520
my friend, doing well? You
know what we're doing. We're selling house,

41
00:03:39,879 --> 00:03:44,080
no kidding, Yeah, it's time
the house in town, not the

42
00:03:44,639 --> 00:03:47,199
city, each house. Wow.
The house we selected because it was near

43
00:03:47,240 --> 00:03:50,840
good schools and then you know,
built it and all that stuff. But

44
00:03:50,879 --> 00:03:53,479
it's been twenty five years, and
yeah, you know, the girls are

45
00:03:53,520 --> 00:03:57,319
growing gone and it's time to downsize
a bit, and I want to spend

46
00:03:57,360 --> 00:04:00,280
more time on the coast. That's
good. Do you and at the host

47
00:04:00,280 --> 00:04:04,919
house, did you add like the
waterfall tub filling and the Japanese toilet sea

48
00:04:05,120 --> 00:04:09,080
and all the things I remember about
your house? Yeah? No, no,

49
00:04:09,039 --> 00:04:12,560
no, that'll come later. In
fact, as soon as we started

50
00:04:12,599 --> 00:04:15,800
having the conversation about selling the house, who's already a conversation about building something

51
00:04:15,840 --> 00:04:18,759
new. So I wouldn't be the
least bit surprised to see those kirts of

52
00:04:18,800 --> 00:04:23,600
features up here. Do you have
land up on the coast house to build

53
00:04:23,759 --> 00:04:26,240
something small that you could actually live
in? Two and a half acres?

54
00:04:26,360 --> 00:04:29,279
Yeah? Yeah, good, we
have space. That's cool. Yeah,

55
00:04:29,279 --> 00:04:31,920
I love it. Make a tree
house because it's surrounded by woods, right

56
00:04:32,040 --> 00:04:35,319
yeah, yeah, we're fully in
the forest. But you know, I

57
00:04:35,360 --> 00:04:38,879
think that'd be so cool. I
think I need something that can actually get

58
00:04:38,879 --> 00:04:41,800
a permit for, and that's going
to be a little tricky, so well

59
00:04:41,920 --> 00:04:46,120
permit schmermit. Yeah, what is
this whole safety thing? What do you

60
00:04:46,120 --> 00:04:49,560
you know? Yeah? All right, who does that? Who does that?

61
00:04:49,639 --> 00:04:53,240
All? Right, let's roll the
crazy music, because I have something

62
00:04:53,240 --> 00:05:02,639
cool for you for a better no
framework awesome? All right, man,

63
00:05:02,639 --> 00:05:08,519
when you got well about trying to
do the math here this is coming out

64
00:05:08,560 --> 00:05:14,439
on July thirteenth, and a good
month and a half ago, I did

65
00:05:14,959 --> 00:05:18,800
a Blazer Train episode called Blazer is
the New forty two. Okay, and

66
00:05:18,920 --> 00:05:23,399
those of you who have read Hitchhiker's
Guide to the Galaxy know exactly what I'm

67
00:05:23,439 --> 00:05:27,439
talking about. A year old.
Yes, I'm old. Yeah, I

68
00:05:27,439 --> 00:05:30,519
remember when I was forty two and
I thought I was the answer to everything.

69
00:05:30,680 --> 00:05:35,199
But apparently apparently I was wrong.
Yeah, aren't we all? Well

70
00:05:35,199 --> 00:05:40,399
anyway, So the whole idea is
that, you know, Blazer is a

71
00:05:40,399 --> 00:05:44,519
component model can go anywhere. Now
it can It can not only go to

72
00:05:44,720 --> 00:05:48,639
well we know it goes to websites
in browsers, but it can go to

73
00:05:49,319 --> 00:05:54,399
you can use it for MAUI,
so it can go to iOS applications and

74
00:05:54,399 --> 00:05:59,120
Android applications and if you're crazy,
ties in TVs and things like that,

75
00:06:00,160 --> 00:06:04,839
macdesktop apps, but it can all
you can also build WPF and Windows Forms

76
00:06:04,920 --> 00:06:10,519
apps with it, and so that
that's the whole ideas that you know,

77
00:06:11,399 --> 00:06:15,800
the whole promise of Zammal was that
it would be this ubiquitous thing, and

78
00:06:16,120 --> 00:06:19,680
and it turned out to be completely
untrue. There's at least seven or eight

79
00:06:19,800 --> 00:06:24,720
flavors of Zammal they used to be
anyway. I mean, that's slowly cleaning

80
00:06:24,720 --> 00:06:27,759
that up. There were there were
many forces at work there that cause that

81
00:06:28,199 --> 00:06:31,399
fragmentation, right. But if you
think of what Microsoft's job is to with

82
00:06:31,519 --> 00:06:39,399
Zamal, it's to implement the behavior
and look and feel of what Zamil does

83
00:06:40,160 --> 00:06:44,959
uh consistently on every platform. And
it's not there yet. I'm just I'm

84
00:06:45,000 --> 00:06:46,879
telling you the truth. It's even
with Maui it's not there. Yeah,

85
00:06:46,920 --> 00:06:49,800
they never got to that part of
the mission. But clearly that is the

86
00:06:49,839 --> 00:06:54,879
effort of products like Maui's finally after
all these years, Yeah, that is

87
00:06:54,879 --> 00:06:59,560
the effort. But but a similar
effort was done with the browser manufacturers,

88
00:06:59,759 --> 00:07:05,240
right to make sure that Htmail CSS
and JavaScript performed and looked and acted the

89
00:07:05,439 --> 00:07:10,879
same on all of the browsers.
And they've pretty much and that didn't work

90
00:07:10,920 --> 00:07:15,199
either. Well, okay, well
they're a lot farther along than then Microsoft,

91
00:07:15,279 --> 00:07:18,759
as exampled, they're having to do
by themselves what all these browser manufacturers

92
00:07:18,759 --> 00:07:21,800
had to do with the browser.
Yeah, one of would argue, that's

93
00:07:21,800 --> 00:07:27,879
an easier problem than running if safari
code. Yeah, yeah, exactly.

94
00:07:27,959 --> 00:07:32,560
So anyway, it's a Blazer Train
episode and the link is to a GitHub

95
00:07:32,680 --> 00:07:35,959
repo that explains everything, gives you
code that you can copy and paste and

96
00:07:36,000 --> 00:07:40,439
cut and paste into all these different
projects. It's cool, Yeah, it's

97
00:07:40,480 --> 00:07:44,120
fun. Yeah, Blazery is the
new forty two. Yeah, Blazer's new

98
00:07:44,160 --> 00:07:47,560
forty two. So who's talking to
us? Richard grabbed commonhov A show seventeen

99
00:07:47,720 --> 00:07:50,920
thirty five. We get back in
twenty twenty one with our friend Ian Cooper.

100
00:07:51,319 --> 00:07:56,480
We're talking about test driven development and
testing as a whole, and actually

101
00:07:56,519 --> 00:07:59,439
lots of good comments on this show. Was one of those powerful conversations,

102
00:07:59,439 --> 00:08:03,600
and Ryan said this. He says, what to test is a strategic topic.

103
00:08:03,879 --> 00:08:07,680
It depends on the risk profile.
What is the cost of failure to

104
00:08:07,720 --> 00:08:11,839
the business that is financial, reputational, or opportunity? Is the code likely

105
00:08:11,879 --> 00:08:15,279
to be extended? Who'll be working
with this code so many months from now?

106
00:08:16,000 --> 00:08:18,360
When I'm writing tests, I'm thinking
how much production code can I get

107
00:08:18,399 --> 00:08:24,079
away with while keeping the sweet fast
and comprehensible. If I get it right,

108
00:08:24,160 --> 00:08:26,279
it hits a sweet spot where I
have a high level test API that

109
00:08:26,319 --> 00:08:31,799
facilitates implementing changes as things evolve.
Only certain types of modules get the full

110
00:08:31,799 --> 00:08:35,919
treatment business critical, complicated, dynamic
requirements. Setting up this kind of test

111
00:08:35,919 --> 00:08:39,080
suite short and takes a lot of
effort, but it pays off in a

112
00:08:39,159 --> 00:08:43,240
long run. And I also appreciate
this sort of point here that if I

113
00:08:43,320 --> 00:08:46,519
know this is going to continue to
be worked on and likely not by me,

114
00:08:46,279 --> 00:08:50,320
then build out a big test framework
to make it easy for the folks

115
00:08:50,320 --> 00:08:54,159
to handle it. But don't write
tests for absolutely everything. And it's hard

116
00:08:54,159 --> 00:08:56,879
to argue about that. You know, we get a little fixated on one

117
00:08:56,960 --> 00:09:01,039
hundred percent test coverage thing, which
is essentially to be strategic about thinking about

118
00:09:01,039 --> 00:09:05,080
you're testing him. I think it's
smart, Ryan, good thinking. So

119
00:09:05,240 --> 00:09:07,840
Ryan, thank you so much your
comment, and a copy of Ustic Coby

120
00:09:07,960 --> 00:09:09,960
is on its way to you.
And if you'd like a copy Abustic co

121
00:09:09,039 --> 00:09:11,919
buy, write a comment on the
website at dot net rocks dot com or

122
00:09:13,000 --> 00:09:15,759
on the facebooks. We publish every
show there, and if you comment there

123
00:09:15,759 --> 00:09:18,080
and everybody in the show, we'll
like your copy of mused to go buy

124
00:09:18,120 --> 00:09:22,240
and you should definitely think about following
us on macedon. Twitter's fine, but

125
00:09:22,159 --> 00:09:26,320
the fun stuff and the cool kids
are over Macedon. I'm at Carl Franklin

126
00:09:26,480 --> 00:09:31,759
at TecHub dot social, and I'm
rich Campbell at Mastodon dot social and send

127
00:09:31,840 --> 00:09:35,639
us a too. We'll be waiting
up for it. M mmm. So

128
00:09:35,919 --> 00:09:39,960
let's bring on Dennis Duman. He's
a Microsoft MVP and principal consultant at Dutch

129
00:09:41,000 --> 00:09:46,960
Microsoft consultancy firm of Vivas Solutions.
We have twenty six years of experience under

130
00:09:46,960 --> 00:09:52,440
his belt as a software architect and
lead developer. He specializes in designing full

131
00:09:52,480 --> 00:09:56,360
stack enterprise solutions based on dot net, as well as providing coaching on all

132
00:09:56,399 --> 00:10:01,960
aspects of designing, building, document
deploying, and maintaining software systems in an

133
00:10:03,000 --> 00:10:07,080
agile world. He is the author
of Fluent Assertions, an assertion library to

134
00:10:07,120 --> 00:10:13,480
make your unit tests look great.
Also Liquid Projections, a set of libraries

135
00:10:13,519 --> 00:10:18,320
for building events sourcing projections. And
he's been maintaining coding guidelines for c Sharp

136
00:10:18,440 --> 00:10:20,919
since two thousand and one. Hey, Richard, that's a whole year before

137
00:10:20,919 --> 00:10:26,960
our podcast started. That's before c
Sharp shipped. Yeah. You can find

138
00:10:28,000 --> 00:10:31,159
Dennis on Twitter, Mastodon, and
Blue Sky. A Blue Sky is the

139
00:10:31,159 --> 00:10:35,200
one I just learned about yesterday,
right, that's right. Yeah, okay,

140
00:10:35,240 --> 00:10:37,399
Well, welcome Dennis. Thank you. It's an honor to be here.

141
00:10:37,399 --> 00:10:41,759
Finally. Oh, I'm looking forward
to a great conversation. You've certainly

142
00:10:41,759 --> 00:10:45,759
got a lot of experience. You're
you're old like us, not quite as

143
00:10:45,799 --> 00:10:48,080
old as old, almost as old. Yeah, true, Yeah, we

144
00:10:48,159 --> 00:10:52,039
had that discussion before we started,
exactly. That was pretty awesome to be

145
00:10:52,039 --> 00:10:56,240
here, and I'm looking forward to
what you're being exchanging here. Ye,

146
00:10:56,600 --> 00:11:01,159
So fluent assertions. This is a
testing work, not exactly. It's not

147
00:11:01,240 --> 00:11:05,039
like a competition to actually unit or
an unit. And don't start me talking

148
00:11:05,039 --> 00:11:09,240
about amostest. No, it's a
it's a very it's it's basically a tiny

149
00:11:09,600 --> 00:11:16,440
library to make your assertions look nicer. It's basically fluent affluent syntax. For

150
00:11:16,360 --> 00:11:24,279
you know, some variable should be
equivalent to some object graph or an action

151
00:11:24,600 --> 00:11:28,440
or funk in c shops should throw
an exception or an a sync exception.

152
00:11:28,720 --> 00:11:33,879
That's cool. Stuff like that.
It's very simple, honestly, but for

153
00:11:33,919 --> 00:11:37,759
some reason it got a lot of
traction over the last twelve thirty years.

154
00:11:37,960 --> 00:11:39,840
Well, it's it's more accurate than
what we're doing now, you know,

155
00:11:39,879 --> 00:11:43,840
which is naming testing methods, and
what if you get those names wrong?

156
00:11:43,879 --> 00:11:48,840
What if the test changes of what
it does and now you're going to change

157
00:11:48,840 --> 00:11:52,360
the name of it. You know, It's it makes sense, although that

158
00:11:52,399 --> 00:11:56,360
doesn't replace good naming, yes,
because honestly, I also believe that.

159
00:11:56,120 --> 00:12:00,559
I mean, I'm a big fan
of test driven development and which Ward was

160
00:12:00,600 --> 00:12:03,639
just talking about one hundred percent,
which are completely agree. It's it's completely

161
00:12:03,679 --> 00:12:07,279
unrealistic and it's it's it's a goal
that you don't want to achieve. I

162
00:12:07,320 --> 00:12:11,879
would say, if you actually practice
stiff development, getting ninety percent should be

163
00:12:11,879 --> 00:12:18,799
pretty trivial. Flu Dessertion itself has
ninety seven percent, but that's not that

164
00:12:18,840 --> 00:12:22,840
difficult. A very simple library with
a simple API doesn't have complicated dependencies like

165
00:12:22,919 --> 00:12:28,720
real world codebases have, so it's
completely obvious, and we use mutation testing

166
00:12:28,720 --> 00:12:31,240
and all kinds of stuff to really
make it fully covered. But it's just

167
00:12:31,279 --> 00:12:35,159
because we want to be able to
ship any release without even doing any manual

168
00:12:35,200 --> 00:12:39,840
testing, which we still don't do. Honestly, he's sticking with automated testing

169
00:12:39,879 --> 00:12:41,840
as much as possible. Yes,
I mean the other part around this,

170
00:12:41,919 --> 00:12:46,159
and I think this is associated with
what Ryan was saying. Was it like

171
00:12:46,240 --> 00:12:52,840
those last few percentage points are also
tested or perpetually breaking, Like it's code

172
00:12:52,840 --> 00:12:56,120
that was growlly in the first place, so it's hard to test, and

173
00:12:56,159 --> 00:12:58,039
so as changes are made to it, you're having tough time with the testing.

174
00:12:58,200 --> 00:13:03,279
Even though it's maybe functional, it's
just the testing framework around it isn't

175
00:13:03,320 --> 00:13:07,879
happy. True. On the other
hand, I also see that the technology

176
00:13:07,919 --> 00:13:11,759
that we have makes it a lot
easier to test things like remember like in

177
00:13:11,799 --> 00:13:15,360
the past when we did a speed
on net controllers, and I still see

178
00:13:15,399 --> 00:13:18,559
that. By the way, these
people actually create a test that creates an

179
00:13:18,559 --> 00:13:22,279
instance of that controller class and then
calls the methods, which for me is

180
00:13:22,320 --> 00:13:26,480
like, wait a second, that's
an implementation detail. So now actually it's

181
00:13:26,519 --> 00:13:28,600
not even now. We even had
that with Owen. If you remember that

182
00:13:28,679 --> 00:13:33,840
from the past, sure, yeah, test host build or a web host

183
00:13:33,840 --> 00:13:35,919
build, always forget which one it
is. You can now test your entire

184
00:13:37,159 --> 00:13:41,559
HTP pipeline, you know, send
HTOP requests to your test or to your

185
00:13:41,559 --> 00:13:46,759
actual code which includes everything even your
startup class and all your d I registrations.

186
00:13:46,200 --> 00:13:50,480
So it becomes a lot easier to
do. And if I make comment

187
00:13:50,559 --> 00:13:54,960
on that as well, if you
look at other areas where typically people were

188
00:13:54,000 --> 00:13:58,279
struggling to get full test coverage,
was stuff interacts interacts with the database,

189
00:14:00,159 --> 00:14:03,320
right, I mean, yeah,
we were all taught I don't know,

190
00:14:03,360 --> 00:14:07,440
twenty years ago. Isolate the ugly
stuff, you know, create repository abstractions

191
00:14:07,440 --> 00:14:13,440
and stuff like that, and then
people start creating tests for classes that barely

192
00:14:13,440 --> 00:14:16,759
do anything. Right now, we
can just run sequel server or something in

193
00:14:16,840 --> 00:14:18,840
a Linux container and you know,
start up to go. You have test

194
00:14:18,840 --> 00:14:22,559
containers for the net, which is
a beautiful little library as well. You

195
00:14:22,639 --> 00:14:26,440
start Sequel serving your test suite,
you run your tests, even create test

196
00:14:26,519 --> 00:14:30,840
data in the database, you interact
with it. You you even cover all

197
00:14:30,879 --> 00:14:35,360
your ef core or whatever orm you
prefer to use. So it becomes easier,

198
00:14:35,559 --> 00:14:37,360
a lot easier these days. To
get to that point. It's not

199
00:14:37,399 --> 00:14:41,840
a goal, it's a means to
an end, right, but yeah,

200
00:14:41,840 --> 00:14:45,320
it does. It's interesting. Do
you make that point that what's making is

201
00:14:45,360 --> 00:14:48,600
a lot more feasible is better and
better tooling exactly? Yeah, Yeah,

202
00:14:48,759 --> 00:14:52,159
So if you ever run into a
case where something just couldn't be tested,

203
00:14:52,960 --> 00:14:56,960
that could couldn't be re architected so
it could be tested. No, that's

204
00:14:56,960 --> 00:15:01,519
a good question. But the thing
is one of my one of my jobs

205
00:15:01,639 --> 00:15:07,679
is to actually help clients with legacy
codebases to make it more testable. Right,

206
00:15:07,120 --> 00:15:11,879
And that actually means that I'm looking
at that code base and trying to

207
00:15:11,879 --> 00:15:16,679
figure out how can we make that
more testable. One of the ways that

208
00:15:16,720 --> 00:15:20,759
I usually start with, and I
didn't come up with idea myself. Michael

209
00:15:20,759 --> 00:15:24,000
Fellows came up with that idea in
his brilliant book. I think it's called

210
00:15:24,000 --> 00:15:28,759
working effectively with legacy code y characteristics
tests. You know, you basically create

211
00:15:28,799 --> 00:15:33,320
a bunch of very ugly, unmaintainable
you know you don't care about that,

212
00:15:33,320 --> 00:15:37,799
that suite that just repeats the behavior
of the current system, including a database

213
00:15:37,879 --> 00:15:43,159
or whatever you have which is your
temporary safety net. And then you start

214
00:15:43,200 --> 00:15:46,679
to identify, you know, pieces
of your codebase that you can refact them.

215
00:15:46,720 --> 00:15:52,120
Maybe you can identify things that are
being reused, you know that shouldn't

216
00:15:52,120 --> 00:15:56,159
be reused. Maybe by duplicating some
code you can actually remove some coupling and

217
00:15:56,200 --> 00:16:00,840
a code base, maybe you can
imply things. I mean, I know

218
00:16:00,919 --> 00:16:03,519
that solid is a term that can
be debate about. It's a lot of

219
00:16:03,519 --> 00:16:08,679
people that have opinions about that.
But the the dependency in version principle actually

220
00:16:08,720 --> 00:16:11,679
like it. It's a nice tool
and it's nothing more than that. A

221
00:16:11,679 --> 00:16:15,759
tool that helps me the couple you
know, parts of the code base from

222
00:16:15,759 --> 00:16:18,559
each other. But it's a big
investment. It's it's you know, I

223
00:16:18,679 --> 00:16:22,720
use tools to create an architecture diagram
of the code based trying to understand how

224
00:16:22,759 --> 00:16:26,120
things is, how things are connected. I look at the dependency graph,

225
00:16:26,360 --> 00:16:32,200
you're basically what is the word unraveling
or and I think the word you want

226
00:16:32,320 --> 00:16:37,919
is unfu I wasn't sure you can
actually say that. You could say whatever

227
00:16:37,960 --> 00:16:41,559
you want, it'll be believed.
But a decoupling, I think it's what

228
00:16:41,600 --> 00:16:47,639
you're looking for. Yeah, but
it's like you have this this intertroned spaghetti

229
00:16:47,679 --> 00:16:49,320
code base, and what you're trying
to do is you're trying to take every

230
00:16:49,320 --> 00:16:52,840
individual strain detan trying to Yeah,
de tangle, that's the word I was

231
00:16:52,840 --> 00:17:00,559
looking at. Of course, named
to the Disney movie Tangled, Who Knew?

232
00:17:00,799 --> 00:17:03,519
Who Knew? Disney was in the
software deal ball. Yeah, I'm

233
00:17:03,559 --> 00:17:06,559
Dutch. You can hear that from
my accent. But as a lot of

234
00:17:06,640 --> 00:17:10,839
English terms titles of books, of
series and movies, it's just the English

235
00:17:10,920 --> 00:17:14,400
term until you start to literally translate
in your brain and then you think that's

236
00:17:14,440 --> 00:17:17,880
really stupid. Even star Wise is
kind of stupid in that. By the

237
00:17:17,880 --> 00:17:21,359
way, I don't remember if we
were talking about Freakindal before we started and

238
00:17:21,519 --> 00:17:23,839
bitter Balling, but I think it's
before we started recording. But you know,

239
00:17:25,000 --> 00:17:26,880
I spend a little time ragging on
that. But you know, there

240
00:17:27,000 --> 00:17:32,440
is no better cheese than eat them, you know, yes, yeah,

241
00:17:32,519 --> 00:17:36,039
yeah, yeah, honestly. Yeah. You know, Dutch people actually the

242
00:17:36,359 --> 00:17:40,119
worst in all the cultural things.
They don't walk in wooded shoes. They

243
00:17:40,119 --> 00:17:41,640
don't know where all the fancy places
and the needlands are. You need to

244
00:17:41,680 --> 00:17:48,839
be an expat to actually, you
know, visit all these places. Okay,

245
00:17:51,079 --> 00:17:53,279
were we talking about flu in assert
I think we were. We were

246
00:17:53,319 --> 00:17:56,880
trying to get there. It might
have just been me. I don't know,

247
00:17:56,200 --> 00:18:00,799
No, So, yeah, it
started tirteen years ago and I just

248
00:18:00,880 --> 00:18:04,960
checked it has two hundred and fifty
one million downloads on new Gats Honestly,

249
00:18:06,240 --> 00:18:08,799
I have no clue. I have
no clue why people are using it everybody

250
00:18:08,839 --> 00:18:12,920
that I mean, I go to
conferences these days, I speak about completely

251
00:18:12,960 --> 00:18:17,039
different topics architecture, and then people
say, oh, you're the guy that

252
00:18:17,079 --> 00:18:19,319
created a fluent thank you for that. You've made my life, you know,

253
00:18:19,480 --> 00:18:22,200
much better, Like, oh,
okay, I still don't know how

254
00:18:22,240 --> 00:18:26,279
to respond to that. Yeah,
I think, yeah, thank you,

255
00:18:26,359 --> 00:18:27,799
the only thing you can really say. Yeah, yeah, Basically, I

256
00:18:27,839 --> 00:18:30,759
hope you enjoy it. If you
have feedback, let me know what we

257
00:18:30,799 --> 00:18:34,799
can do about it, you know, create an issue if you like it,

258
00:18:34,960 --> 00:18:38,200
right, that's that's great, That's
what I was hoping for. Indeed.

259
00:18:38,319 --> 00:18:44,119
Indeed, so it's fluent assertion something
that you use in your test code

260
00:18:44,160 --> 00:18:49,200
as well? Or is it just
on attributes that for testing methods? How

261
00:18:49,559 --> 00:18:53,680
how exactly do you use it?
Oh? No, it's it's actually an

262
00:18:53,680 --> 00:18:59,119
extension method which is called shoot as
you can expect, okay, and that

263
00:18:59,440 --> 00:19:03,440
basically exposes a bunch of methods like
it should be true, should be empty,

264
00:19:03,599 --> 00:19:10,839
should contain stuff like that. So
extension methods for for all basic types

265
00:19:11,200 --> 00:19:15,519
basically yeah, yeah, yeah,
collections and let's even support for data set,

266
00:19:15,559 --> 00:19:22,400
which was a mistake because a contributor
used uh and we were we were

267
00:19:22,400 --> 00:19:30,279
afraid to say yes, indeed no, But that's essentially what it is.

268
00:19:30,279 --> 00:19:34,400
It's just surprising how much time you
have to spend on maintaining a code base

269
00:19:34,519 --> 00:19:38,240
like that that's popular, Like people
always come up with niche IDs. You

270
00:19:38,319 --> 00:19:42,720
have to be you know, backwards
compatible. I'm really and by the way,

271
00:19:42,839 --> 00:19:47,440
I just want to give some kudos
to my person that spent the last

272
00:19:47,480 --> 00:19:51,960
three years maintaining as well, you
know us in Europe UM. But we

273
00:19:52,279 --> 00:19:55,759
work together and we tried to keep
the whole API consistent. We tried to

274
00:19:55,799 --> 00:20:00,279
support all the frameworks, you know, make sure the code itself is test

275
00:20:00,319 --> 00:20:03,960
it and it's actually example code.
We practice test different ephilement our selves at

276
00:20:04,039 --> 00:20:08,279
NDC also even talked about like all
the little tools and practices that we use

277
00:20:08,559 --> 00:20:12,880
to maintain that library, which to
my own surprise was like, there's actually

278
00:20:12,920 --> 00:20:15,480
quite a lot we do to make
it great. It's almost like a real

279
00:20:15,519 --> 00:20:19,680
project. So do you have almost
like it's a real project. So getting

280
00:20:19,680 --> 00:20:23,000
back to the extension method thing,
you have extension method for objects, so

281
00:20:23,039 --> 00:20:27,279
it just works everywhere. So having
your own models, you could say that

282
00:20:27,480 --> 00:20:32,680
should you know, you can do
actually should be equivalent too. Yeah,

283
00:20:32,720 --> 00:20:37,559
and then you can pass in another
object and what it will do it will

284
00:20:37,880 --> 00:20:41,880
treat that object as a truth.
So you can also pass an anonymous object

285
00:20:41,880 --> 00:20:45,880
anonymous type. Sure, one,
yeah and one. It's actually there's a

286
00:20:45,920 --> 00:20:49,359
design principle behind that, because I
believe that in your unit test or automated

287
00:20:49,400 --> 00:20:55,599
test, every test should have one
purpose. So if you have some kind

288
00:20:55,640 --> 00:21:00,319
of object like subject or the test
that has a bunch of property, but

289
00:21:00,400 --> 00:21:03,599
for that particular test you only care
about, for example, two properties,

290
00:21:03,039 --> 00:21:07,240
then you can say it should be
equivalent to create anonymous type only mentioned the

291
00:21:07,279 --> 00:21:11,599
two properties and those will be compared. The rest will be ignored, which

292
00:21:11,640 --> 00:21:15,559
I use a lot for HTP based
testing for example. Yeah, I remember

293
00:21:15,599 --> 00:21:19,480
before I discovered tricks like that,
having to implement iclonable, you know,

294
00:21:19,519 --> 00:21:23,079
to make copies of the object just
to test and to see you know this

295
00:21:23,200 --> 00:21:29,559
is that yeah yeah, yeah,
And like it's also recursive, so it's

296
00:21:29,559 --> 00:21:32,079
a bit too smart, you know. It started with a simple thing,

297
00:21:32,079 --> 00:21:34,400
but this is equivalent too, does
a kind of recursive analysis. It tries

298
00:21:34,440 --> 00:21:38,720
to understand how to treat records and
two poles and dictionaries. You know,

299
00:21:38,759 --> 00:21:44,640
if the dictionary contains the same keys
and the values in those dictionaries are equivalent,

300
00:21:45,079 --> 00:21:48,680
it will also satisfy the assertion that
you can completely twigg that. Well,

301
00:21:48,759 --> 00:21:52,200
that's one of the features that kind
of exploded and became maybe became too

302
00:21:52,240 --> 00:21:56,200
powerful to be honest. Well,
but I noticed you didn't say it uses

303
00:21:56,279 --> 00:22:03,119
AI because the new Hi Fi of
the fifties. Well, actually you can

304
00:22:03,160 --> 00:22:07,680
ask chet Cheapt to rewrite your test
using fluids socitions and we'll do that for

305
00:22:07,720 --> 00:22:11,839
you. Well that's GPT. But
yeah, I just hate it that I

306
00:22:11,880 --> 00:22:15,039
was listening to the radio this morning
and there was some ad for some technology

307
00:22:15,119 --> 00:22:18,720
thing and they're saying, you know, now with AI, it's like,

308
00:22:18,920 --> 00:22:25,240
you know everything is AI now.
Yeah, correct, everybody's trying to it's

309
00:22:25,319 --> 00:22:29,240
big, one, big marketing thing. It's totally marketing thing. They Yeah,

310
00:22:29,279 --> 00:22:33,279
they went down to the home the
home maintenance center, and they bought

311
00:22:33,319 --> 00:22:38,039
themselves a spray can at AI and
they're squirting on everything. There you go,

312
00:22:38,079 --> 00:22:44,039
I just draw out the letters.
It's got AI on it lows minards

313
00:22:44,319 --> 00:22:49,559
all that pick one. Uh,
it's kind of astonishing. Like I was

314
00:22:49,599 --> 00:22:52,680
just poking on the good Hubb pods
where I realized, like, you guys

315
00:22:52,720 --> 00:22:55,359
have been on good hubs. It's
twenty ten, that's before it was cool.

316
00:22:55,839 --> 00:23:00,640
Um, I think we just we
we jumped from cod plaques to get

317
00:23:00,720 --> 00:23:03,799
Up just in time. Oh I
see Coplex. Yeah I did. I

318
00:23:03,799 --> 00:23:07,519
did even I mean my Jonas didn't
join by them, but I was doing

319
00:23:07,519 --> 00:23:12,000
this alone. But I think it
started as in some kind of internal project.

320
00:23:12,480 --> 00:23:15,440
Then I moved into Coplex, which
was kind of difficult to work with

321
00:23:17,079 --> 00:23:18,839
because if people want to contribute,
they had to deliver a patch file like

322
00:23:18,920 --> 00:23:22,720
yeah, it didn't work. Yeah. And then at some point I remember

323
00:23:22,759 --> 00:23:26,720
there was an option to confer it
because it was basically team Foundation service under

324
00:23:26,759 --> 00:23:30,920
the hoods right, right, and
they built some kind of feature that you

325
00:23:30,960 --> 00:23:33,359
can send an email to the Coplex
team, say, can you confer this

326
00:23:33,480 --> 00:23:37,279
GIT. That was basically when I
started doing GIT. Yeah, and then

327
00:23:37,319 --> 00:23:41,880
get Up came and then you know, everything changes pool Quest and it didn't

328
00:23:41,960 --> 00:23:45,400
yeah, and now it's we barely
keep up with all the pool request reviews

329
00:23:45,440 --> 00:23:49,160
that we get and the issue reports
and the feature request and right, that's

330
00:23:49,200 --> 00:23:52,279
the flip side of being successful I
would. I'm sure, I don't want

331
00:23:52,319 --> 00:23:56,079
to use the word successful, but
I think that's fairly. Fifteen one million

332
00:23:56,079 --> 00:24:00,119
downloads is pretty much qualifying you to
be successful. Yeah, yeah, sure,

333
00:24:00,960 --> 00:24:04,440
well and still you know, like
you look at the stats on the

334
00:24:04,440 --> 00:24:08,119
project, you go, this is
a healthy open source project, like regular

335
00:24:08,160 --> 00:24:12,680
contributions, lots of people working on
it, lots of issues, like it's

336
00:24:12,720 --> 00:24:17,519
a busy project. Your pull requests
are pretty under control. Friend, at

337
00:24:17,519 --> 00:24:22,839
this particular moment, there are eight
and they have real conversations attached to them.

338
00:24:22,839 --> 00:24:26,799
This is not this blind code going
in m That's true. It's costing

339
00:24:26,839 --> 00:24:29,880
me a lot of time, yea, Janus as well. Unfortunately you want

340
00:24:29,880 --> 00:24:30,920
to spend a bit more time on
it. I also do a lot of

341
00:24:30,920 --> 00:24:34,759
talks and stuff around that, which
consumes sometime about that. But yeah,

342
00:24:36,119 --> 00:24:38,720
it's I'm very happy with it.
Good jobs just to yeah, yeah,

343
00:24:38,799 --> 00:24:42,880
thank you, Joan Us. That's
something kind. It's funny because I actually

344
00:24:42,920 --> 00:24:45,920
met him at the NBC for the
first time in my life. Who like,

345
00:24:47,000 --> 00:24:51,640
literally, wow, collaborated remotely for
three years, four years, three

346
00:24:51,720 --> 00:24:55,119
years, four years, and now
you finally face to face with NDC Oslow.

347
00:24:55,319 --> 00:24:57,519
Yeah, indeed, it's it's like, yeah, indeed, that was

348
00:24:57,559 --> 00:25:02,839
really interesting. It was a great
experience to finally meet the guy. And

349
00:25:02,960 --> 00:25:07,279
this was not the only There was
another project from Jeremy Miller Marten, and

350
00:25:07,319 --> 00:25:10,880
he also met his major contributor for
the first time in person. Actually,

351
00:25:10,920 --> 00:25:14,200
I met Jeremy for the first time, which was also nice. It's cool.

352
00:25:14,480 --> 00:25:18,599
Yeah, yeah, all these folks
that you've communicated with for years and

353
00:25:18,680 --> 00:25:22,599
years and you just don't actually get
this whole in person thing. You know,

354
00:25:22,640 --> 00:25:23,319
we didn't do it for a couple
of years, and now we can

355
00:25:23,440 --> 00:25:27,599
kind of like, hey, it's
a feature true. Yeah, wow,

356
00:25:27,920 --> 00:25:30,880
yeah, I mean it's a lot. We could spend a lot of time

357
00:25:30,960 --> 00:25:33,720
to dig in through fluent, but
I think you hit the key points here

358
00:25:33,759 --> 00:25:38,160
and it does. I'd like this
whole like detected a test framework and work

359
00:25:38,240 --> 00:25:42,559
with it kind of mindset to say, okay, well we're using in units,

360
00:25:42,599 --> 00:25:47,480
so do it like this. Yeah, yeah, and yeah. People

361
00:25:47,519 --> 00:25:52,920
ask me sometimes like why is it
successful? Honestly, I don't know what

362
00:25:53,079 --> 00:25:56,119
is the key thing? Because there's
a lot of open source developers in the

363
00:25:56,119 --> 00:26:00,319
world that want to contribute, and
you know, sometimes like what is what

364
00:26:00,400 --> 00:26:04,079
makes it successful? And I don't
know is the catching name. Probably not,

365
00:26:06,599 --> 00:26:10,000
But yeah, we do care about
the quality of the code. We

366
00:26:10,079 --> 00:26:17,319
do try to actually said contribute,
have decent discussions on gid up, like

367
00:26:17,400 --> 00:26:19,640
try to understand what people try to
do. Yeah, we have a slack

368
00:26:19,680 --> 00:26:26,000
as well. Obviously it's designed for
extensibility, but it's like a real project.

369
00:26:26,000 --> 00:26:29,720
You make mistakes, you introduce technical
debts, you accept pull a quest

370
00:26:29,880 --> 00:26:33,319
that in retrospect we shouldn't have accepted
that. Well, we'll try to fix

371
00:26:33,359 --> 00:26:37,000
that the next major release. But
yeah, we do semantic versioning, which

372
00:26:37,039 --> 00:26:38,680
means you cannot Yeah, you have
to be very careful. It's not just

373
00:26:38,759 --> 00:26:42,160
that it has to be compatible on
the source code level, but there's also

374
00:26:42,279 --> 00:26:47,000
quite a lot of Actually that's what
I discovered in the hard way. There's

375
00:26:47,000 --> 00:26:49,680
a lot of people that build their
own new get package is that depend on

376
00:26:49,720 --> 00:26:53,559
this as extensions, you know,
And then you change the signature of a

377
00:26:53,599 --> 00:26:57,160
method, like the return type of
a method like who cares that should be

378
00:26:57,599 --> 00:27:00,640
just compuls And then somebody says,
oh, yeah, but now I have

379
00:27:00,720 --> 00:27:06,640
this binary compatibility issue missing, notthet
exception stuff that that that makes it a

380
00:27:06,680 --> 00:27:11,880
bit more harder for us. Yeah, yeah, it's I get the sense

381
00:27:11,920 --> 00:27:15,640
you made this because you had problems
you were trying to solve, and then

382
00:27:15,680 --> 00:27:19,359
it became its own set of problems. Effectively, I don't see it like

383
00:27:19,400 --> 00:27:22,880
that. I mean, of course, I'm proud and I use it myself

384
00:27:22,960 --> 00:27:26,440
every day, and you know,
I go, I do a lot of

385
00:27:26,480 --> 00:27:29,839
consultancy gigs, and then you come
into your client and it turns out a

386
00:27:29,839 --> 00:27:32,559
lot of people already using it and
they know you, and you know,

387
00:27:32,680 --> 00:27:36,640
yeah, the only thing is it
starts to define you, like like okay,

388
00:27:36,720 --> 00:27:38,920
this is mister fluent desertions. Yeah
you all you do is testing.

389
00:27:38,920 --> 00:27:41,640
You don't do anything else, right, No, yeah, yeah, exactly.

390
00:27:42,200 --> 00:27:45,440
You know, but it does give
me some credits. I even had

391
00:27:45,440 --> 00:27:48,960
at my client that people were I
was working for the client for a couple

392
00:27:48,960 --> 00:27:53,680
of years and people were actually applying
for a job because they knew that I

393
00:27:53,839 --> 00:27:59,079
was there. Like, okay,
I don't want to spoil your your I'm

394
00:27:59,119 --> 00:28:03,240
not that good. Actually nobody is. Well you're humble, that's for sure.

395
00:28:03,400 --> 00:28:07,359
Yeah, it's reasonable. Are you
seeing a lot of folks, I

396
00:28:07,400 --> 00:28:12,160
mean, are taking TDD seriously?
Like it's because it seems like fluent exactly

397
00:28:12,200 --> 00:28:17,000
what you want in this idea of
I can describe the test before I write

398
00:28:17,000 --> 00:28:19,440
the code, and as the code
gets developed, the test will pass.

399
00:28:22,119 --> 00:28:25,359
A lot of people want to do
it right, and not a lot of

400
00:28:25,400 --> 00:28:29,599
people. No, I would say
thirty percent of the people that I meet

401
00:28:29,720 --> 00:28:36,079
actually do it or they're trying to, not necessarily with fluid desertion, because

402
00:28:36,119 --> 00:28:37,839
that's just the tiny ingredient of it, right, but a lot of them

403
00:28:37,880 --> 00:28:42,359
are struggling with that. And this
is also one of the many talks that

404
00:28:42,400 --> 00:28:47,839
I do at conferences because I see
them struggling, and I've tried to understand

405
00:28:47,880 --> 00:28:51,720
why they're struggling with that, and
quite often it's the mistakes I made myself,

406
00:28:51,799 --> 00:28:55,880
like testing at two small scope,
like assuming every class is its own

407
00:28:56,000 --> 00:28:59,799
units, Well, for me,
that's wrong. That's almost always wrong,

408
00:29:00,000 --> 00:29:03,160
and that is already a change in
mindset. And you know, you need

409
00:29:03,200 --> 00:29:07,519
to actually understand the internal boundaries of
your system, of your code base and

410
00:29:07,599 --> 00:29:11,079
try to align the unit of your
unit test with those boundaries, which means

411
00:29:11,079 --> 00:29:15,880
that you might actually testing a couple
of different classes together. And the example

412
00:29:15,960 --> 00:29:22,720
that I use for that is that
this single method and in flow dessertion be

413
00:29:22,839 --> 00:29:26,279
equivalent too. It's a single method. But if you're going to look at

414
00:29:26,319 --> 00:29:30,400
the code base behind that, that's
like twenty thirty different classes with strategy pattern

415
00:29:30,400 --> 00:29:34,920
implementation and stuff like that. And
then I'll show people the UMIL diagram,

416
00:29:36,039 --> 00:29:38,519
assuming people still can read UML you
know something that we learned in the past,

417
00:29:38,559 --> 00:29:41,799
you know, three years ago,
And I showed them the diagram,

418
00:29:41,880 --> 00:29:45,279
and then I'm asking them like,
okay, this is the method that you

419
00:29:45,440 --> 00:29:48,319
use on the front time I'm using
my hands, which obviously doesn't work here

420
00:29:49,519 --> 00:29:55,799
wildly. Yeah, you use to
be equivalent to method. That is the

421
00:29:55,839 --> 00:30:00,079
actual thing that you're working with,
that is your contract. Everything underneath it

422
00:30:00,599 --> 00:30:06,640
is essentially an implementation detail. Because
twelve years ago I had one class I

423
00:30:06,680 --> 00:30:11,400
think it was called equivalency validator or
maybe even I don't know, extensions or

424
00:30:11,400 --> 00:30:15,759
something like that. Over the years, I wrote like tons of tests.

425
00:30:15,759 --> 00:30:18,720
I think there's like a two thousand
different unit tests against this. Be careful

426
00:30:18,720 --> 00:30:22,920
the two methods. I never started
testing the individual classes. I always test

427
00:30:22,960 --> 00:30:26,079
the whole thing as a unit because
all of them are implementation details. Because

428
00:30:26,119 --> 00:30:30,720
of that, I managed to refractor
things over the years, and that's at

429
00:30:30,799 --> 00:30:34,160
least that's what I believe what the
original gang of formant with, you know,

430
00:30:34,279 --> 00:30:37,559
design patterns. It's a way to
refactor your codebase, you know,

431
00:30:37,599 --> 00:30:41,119
give it more structure, make it
easier for people to understand that structure.

432
00:30:41,920 --> 00:30:45,240
And I have a bunch of these
examples that I do in my talk to

433
00:30:45,440 --> 00:30:49,200
try to make people aware that the
unit is quite often much more than that

434
00:30:49,240 --> 00:30:55,119
single class, except if that class
is designed to be usable, right right,

435
00:30:56,200 --> 00:30:59,759
That is one of the key ingredients, if I may that. I

436
00:31:00,000 --> 00:31:03,240
think that makes a big difference if
you're trying to practice unit testing and test

437
00:31:03,359 --> 00:31:07,200
of development. Yeah, yeah,
absolutely, that's the challenge. And it's

438
00:31:07,240 --> 00:31:10,440
interesting to see. You know,
you've got this recursive effect going on,

439
00:31:10,519 --> 00:31:15,119
Dennis, where you're using those testing
principles on your testing framework, you know,

440
00:31:15,480 --> 00:31:18,680
and making all of those mistakes along
the way. I mean, one

441
00:31:18,720 --> 00:31:22,839
of the parts about this has he'd
been doing it long enough that you started

442
00:31:22,839 --> 00:31:26,200
before a new GAT like you didn't
have all the help that it's around now,

443
00:31:26,200 --> 00:31:30,400
so you've sort of grown up into
that as well. True, and

444
00:31:30,519 --> 00:31:33,359
just say it's it's interesting to see
that you were just learning along with the

445
00:31:33,400 --> 00:31:37,319
rest of us about all of these
problems. I'm trying to get to.

446
00:31:37,559 --> 00:31:38,599
I think we're in a better place. I'm pretty sure we're in a better

447
00:31:38,640 --> 00:31:41,119
place. Yeah, were in a
better place, absolutely, if I compare

448
00:31:41,160 --> 00:31:45,799
that. I mean, indeed,
I remember that we didn't have new gats.

449
00:31:45,799 --> 00:31:49,039
I remember that we didn't have standard
or dot net core. We didn't

450
00:31:49,039 --> 00:31:57,119
have multi targeting. I remember that
Claire Novoltki helped me a lot like implementing

451
00:31:57,119 --> 00:32:00,880
like a baiting click implementation, you
know, so that we can support multiple

452
00:32:00,920 --> 00:32:07,400
frameworks and dynamically load certain parts of
FLU desertions based on the framework you're targeting.

453
00:32:07,440 --> 00:32:10,480
I remember there was something called dot
nuts five, which has nothing to

454
00:32:10,480 --> 00:32:15,400
do with uh oh, there's no
dot get coal Five's that dotnet coal five.

455
00:32:15,440 --> 00:32:19,519
I don't even remember. No,
it was just called dot net.

456
00:32:19,519 --> 00:32:21,880
By then you'd just called five.
Yeah, we got the get rid of

457
00:32:21,880 --> 00:32:24,240
the core. Yeah, And there
was like this moniker called dot nuts five

458
00:32:24,279 --> 00:32:29,480
I remember correctly. A couple of
years ago, way before donut core.

459
00:32:29,559 --> 00:32:32,319
They were trying to come up with
some new new framework standards or maybe it

460
00:32:32,400 --> 00:32:39,400
was proposed Microsoft dot Net framework something
like that. Because it's currently there is

461
00:32:39,440 --> 00:32:43,599
no five for that. No,
no, it was what wasn't even called

462
00:32:43,640 --> 00:32:47,720
dotnet five man, it's it's a
long it's it's a dark age time thing

463
00:32:47,759 --> 00:32:52,440
where everything became very difficult with doldnet. I think when what was dotnet was

464
00:32:52,559 --> 00:32:57,599
kind of losing its popularity for a
while, you know, Um, but

465
00:32:57,839 --> 00:33:00,200
yeah, I mean now multi targeting
is just a matter if you know specified

466
00:33:00,200 --> 00:33:05,640
the targets you want to target,
use some if deaf statements here and down.

467
00:33:05,720 --> 00:33:08,519
It just works. It's so much
easier. That standard also enabled a

468
00:33:08,519 --> 00:33:12,880
lot of things we couldn't do in
the past. H Yeah. But also

469
00:33:13,000 --> 00:33:16,440
mock down being able to build your
own documentation websites with jack all have get

470
00:33:16,519 --> 00:33:22,640
up hosed them love markdown. Yeah. Good ideas that help editing a little

471
00:33:22,640 --> 00:33:25,400
easier. Um, yeah, it's
I think we're in a great world with

472
00:33:25,720 --> 00:33:30,440
that. Actually, it's definitely without
doubt. Yeah, And Dennis, I'm

473
00:33:30,480 --> 00:33:37,519
gonna interrupt for one moment this very
important message or two and we're back.

474
00:33:37,599 --> 00:33:42,559
I'm Richard Campbell. That's Carl Franklin. Hey, you're listening to dot net

475
00:33:42,640 --> 00:33:45,200
Rocks. We're here with our friend
Dennis Duman. We're talking a bit about

476
00:33:45,559 --> 00:33:50,039
fluent assertions. Do we need to
talk about liquid projections? I like these

477
00:33:50,119 --> 00:33:53,119
names. I think we should.
I mean, I think we should sort

478
00:33:53,160 --> 00:33:57,400
of start at the beginning about events
sourcing and what it's used for. There

479
00:33:57,720 --> 00:34:00,240
we don't really we haven't really gone
into that. Um, so maybe we

480
00:34:00,279 --> 00:34:05,119
should define that and cqrs and then
why we need projections in what they are.

481
00:34:05,720 --> 00:34:10,559
Yeah, so that's a question I
assume, right, yeah, yeah,

482
00:34:10,639 --> 00:34:16,199
yeah, let's start there. Event
sourcing is an architecture style. It's

483
00:34:16,239 --> 00:34:21,719
not an architecture, but it's just
a style that you can use to store.

484
00:34:22,000 --> 00:34:24,840
Essentially, it means you store the
state of your domain in the form

485
00:34:24,880 --> 00:34:29,480
of a series of events. So
instead of storing you know, creating a

486
00:34:29,519 --> 00:34:34,239
customer stable and you have a customer
object and DOTNT and you just use an

487
00:34:34,320 --> 00:34:37,280
ORM or something like that, like
anti framework or an hibernat if you're old

488
00:34:37,360 --> 00:34:42,920
enough, you store that into a
table. You're actually storing things that happened

489
00:34:42,920 --> 00:34:45,559
in the domain changes, the changes, but not just the changes, but

490
00:34:45,639 --> 00:34:50,960
also you try to capture the intent, like what happened functionally in the system.

491
00:34:51,199 --> 00:34:54,159
I think the textbook example of that
is that when you change the address

492
00:34:54,199 --> 00:34:59,199
of a client or something like that, is that because there was a mistake

493
00:34:59,360 --> 00:35:01,440
in the address, or was that
because the client moved to a different place.

494
00:35:02,239 --> 00:35:06,960
I mean even the number, how
the number of the street. I

495
00:35:07,000 --> 00:35:09,280
mean if you I know some pretty
big, big streets in the US,

496
00:35:09,360 --> 00:35:14,119
and if you move from I don't
know what is the biggest street with all

497
00:35:14,119 --> 00:35:19,599
the bars in the Los Angeles always
forget But if you move from number fifteen

498
00:35:19,599 --> 00:35:22,679
to two thousands, is that a
mistake or did you actually move to a

499
00:35:22,679 --> 00:35:27,440
different place? Right right. A
canonical example also is in finance right where

500
00:35:27,800 --> 00:35:31,280
where you can't just like change the
amount that you charge somebody. If you

501
00:35:31,320 --> 00:35:36,320
overcharge them, you have to put
in how much you charge them, and

502
00:35:36,360 --> 00:35:39,719
then you have to add an event
for or a projection or something that says,

503
00:35:39,719 --> 00:35:43,719
oh, we had to correct for
this, and now the current value

504
00:35:43,840 --> 00:35:50,039
is this, So that you always
have a record of how the state has

505
00:35:50,119 --> 00:35:54,280
mutated and and hopefully you be able
to undo that or go back in time

506
00:35:54,320 --> 00:35:57,960
and look to see what the state
was at a certain time. That is

507
00:35:58,000 --> 00:36:00,920
one of the strength of defense sourcings
that you can actually do that. You

508
00:36:00,960 --> 00:36:05,079
can also replay history, can actually
look at the state of the domain at

509
00:36:05,079 --> 00:36:07,159
a particular point in time, which
is why it's coming from the financial word.

510
00:36:07,440 --> 00:36:13,079
So projections comes up within the context
of cqrs, usually right command query

511
00:36:13,239 --> 00:36:19,639
fastility segregation, where you want to
transform the state from maybe what your application

512
00:36:19,760 --> 00:36:25,199
uses to something else. The event
needs to be projected into some other kind

513
00:36:25,239 --> 00:36:29,280
of shape so that it's easier to
do something that you want to do,

514
00:36:29,320 --> 00:36:31,440
like query correct because the challenge with
the events, of course, if you

515
00:36:31,480 --> 00:36:36,360
only store events, you cannot do
a query like give me all the open

516
00:36:36,480 --> 00:36:39,199
orders which total value is bigger than
one hundred k or something, all the

517
00:36:39,280 --> 00:36:46,199
clients with orders that have over one
hundred thousand dollars because that information is not

518
00:36:46,239 --> 00:36:51,519
available. You can only say give
me a particular customer if that's the entity

519
00:36:51,599 --> 00:36:54,800
that you have. So if you
want to be able to do queries across

520
00:36:54,880 --> 00:36:59,480
all these entities and all kinds of
different structures, you need to take those

521
00:36:59,519 --> 00:37:04,000
events and project, as you said, into a format that is more optimized

522
00:37:04,039 --> 00:37:07,199
for quarrying, and that can be
an h T p API that you're use

523
00:37:07,239 --> 00:37:12,280
in the UI. You can even
project it into adjacent or XML or xtmail

524
00:37:12,320 --> 00:37:15,440
page that is already pre rendered so
by the time the request comes in,

525
00:37:15,519 --> 00:37:20,960
which is very powerful. Yeah,
that is usually a source of a lot

526
00:37:20,960 --> 00:37:24,880
of complexity to build those projections to
think about Okay, should they be synchronous

527
00:37:24,880 --> 00:37:28,679
with the domain? You know,
if you click on the save button from

528
00:37:28,679 --> 00:37:31,480
a web page and you do querry, should then be consistent? Or is

529
00:37:31,480 --> 00:37:37,119
it acceptable that these things built in
the background. They're also a big problem.

530
00:37:37,119 --> 00:37:39,599
If you upgrade your version of the
code based do new version, then

531
00:37:39,599 --> 00:37:43,599
you need to deal with the schema
changes or something like that. You have

532
00:37:43,599 --> 00:37:46,840
to reproject things. And if there's
millions of events in your events stor as

533
00:37:46,840 --> 00:37:51,719
they used to call that, that
can take a while. So Liquid Projections

534
00:37:51,920 --> 00:37:57,360
is just another tiny library that are
built to make it easier to build those

535
00:37:57,400 --> 00:38:02,360
projects. The projection code basically what
we call ject us um. Nothing more

536
00:38:02,360 --> 00:38:06,239
than that. It's it's just a
bunch of building blocks, not even a

537
00:38:06,280 --> 00:38:09,239
framework. I don't like frameworks.
I like to build small building blocks that

538
00:38:09,320 --> 00:38:14,719
you can mix. A match does
require you to understand those building blocks a

539
00:38:14,719 --> 00:38:17,480
bit better, and I have some
documentation on the website about that, and

540
00:38:17,639 --> 00:38:21,440
nothing more than that. Doesn't even
take me a lot of time to maintain.

541
00:38:21,480 --> 00:38:23,880
Actually, does it also use a
fluent syntax? It does use fluent

542
00:38:23,960 --> 00:38:30,000
APIs yes, yeah, indeed,
I sense a pattern here, Yeah,

543
00:38:30,760 --> 00:38:36,280
yeah, it it becomes cheesy.
I also build something called I think it's

544
00:38:36,519 --> 00:38:40,320
fluid. Fluid cashing was another little
library I created, so liquid projections,

545
00:38:40,360 --> 00:38:45,760
fluid cashing, fluent assertions, and
then I probably used Google to find other

546
00:38:45,840 --> 00:38:51,880
synonyms for things that can. You
know, you could do a fluent library

547
00:38:51,880 --> 00:39:00,039
for f sharp and call it a
fluent or some people that's pretty good.

548
00:39:01,800 --> 00:39:07,079
I love that, I think.
Don't email me. Some people actually hate

549
00:39:07,079 --> 00:39:08,320
this whole fluent API, but I
like it. I love it. I

550
00:39:08,400 --> 00:39:13,920
found. Yeah, there's another lot
of people floral or something for building fluent

551
00:39:14,079 --> 00:39:16,800
HTP request or something like that.
Yeah. Yeah, well I just both

552
00:39:16,840 --> 00:39:22,719
poking around you getting suck two hundred
and fifty million downloads of fluid assertions that

553
00:39:22,840 --> 00:39:28,639
thought. That's a big number.
Okay, there's no question about it.

554
00:39:28,679 --> 00:39:31,360
You're successful here. Yeah. Well
ask my wife. She said, like,

555
00:39:31,400 --> 00:39:36,199
but why can't you just earn I
don't know one sent yeh, that's

556
00:39:36,199 --> 00:39:37,840
true, yeah, I said,
doesn't work like that. So what do

557
00:39:37,880 --> 00:39:43,760
you get out of it? I
don't know, the murray, the admiration

558
00:39:43,800 --> 00:39:45,559
of your fans, yeah, something
like that. Absolutely, you get to

559
00:39:45,679 --> 00:39:50,880
you get to be on dot net
rocks. Yeah, indeed, which is

560
00:39:51,079 --> 00:39:57,239
worth it already. Listeners appreciate it. Yeah, that in five euros will

561
00:39:57,239 --> 00:40:01,559
get you all at today. Yeah, that's a topic on itself, funding

562
00:40:01,639 --> 00:40:06,599
an open source development. We were
just talking about that last week. Yeah,

563
00:40:06,639 --> 00:40:09,159
I mean it's a recurring topic on
the show lately, especially because I

564
00:40:09,199 --> 00:40:13,960
see you have a Patreon in things
like is any of that helping? No,

565
00:40:14,440 --> 00:40:17,440
right, the only thing that's helping
is is get up sponsoring. Yeah,

566
00:40:17,440 --> 00:40:21,480
the gihub spont it did see there's
a few gith hub sponsors. Yeah,

567
00:40:21,760 --> 00:40:24,159
it's not It seems to be the
most direct. That's usually because it

568
00:40:24,239 --> 00:40:29,880
also supports Well. The thing is
with funding is that a lot of companies

569
00:40:29,880 --> 00:40:31,840
don't know how to do that.
Yeah. It's not like somebody can pull

570
00:40:31,880 --> 00:40:35,559
the credit card and pay for it. They have to go to the I

571
00:40:35,599 --> 00:40:39,360
don't know what's the name of this
department procurement or something like that. Yes,

572
00:40:39,719 --> 00:40:44,440
finance, right, yeah, yeah, finance. And it becomes very

573
00:40:44,480 --> 00:40:47,760
hard. And I was talking about
this with Mathias Cork who built another library

574
00:40:47,760 --> 00:40:52,599
called Nuke, which is a c
sharp build buildings build script library. You

575
00:40:52,679 --> 00:40:58,360
were struggling with the same thing.
It's it's difficult, it's difficult and again

576
00:40:58,679 --> 00:41:00,159
I'm not doing it for the money. Yeah, I mean I have a

577
00:41:00,199 --> 00:41:06,079
day job, but it does help
a little bit with getting a speaking gigs

578
00:41:06,119 --> 00:41:10,239
and you know that kind of stuff. Yeah, but it is it is

579
00:41:10,760 --> 00:41:15,559
for better worth a labor or passion, because it isn't it isn't a business

580
00:41:15,639 --> 00:41:17,599
itself, and I don't know that
it would be better. Like the other

581
00:41:17,599 --> 00:41:22,559
conversation we're having is, Okay,
now I'm productizing this because there's certain customers

582
00:41:22,559 --> 00:41:25,119
out there that want to pay me, but only if it's actually got a

583
00:41:25,159 --> 00:41:30,280
commercial component to it. I don't
know that fluid Assertions falls into that category.

584
00:41:30,400 --> 00:41:32,119
I don't think of anything. I
mean, what would you offer,

585
00:41:32,199 --> 00:41:37,360
like somebody has to pay for a
unit testing a library, Like how would

586
00:41:37,400 --> 00:41:40,440
you even do that? For support? Like does that? Does that even

587
00:41:40,480 --> 00:41:44,000
make sense? Yeah, that's what
I do. I do that. Yeah.

588
00:41:44,079 --> 00:41:46,840
Yeah, you can actually use gate
of sponsors and pay a certain amount

589
00:41:46,880 --> 00:41:51,119
of money you get like some time
for me to help you make your test

590
00:41:51,199 --> 00:41:55,000
power. But that doesn't really it
hasn't really helped. No, no,

591
00:41:55,360 --> 00:41:59,840
no, it's not like a density
server, you know, where you actually

592
00:42:00,400 --> 00:42:02,840
this is a crucial part of your
product, and then people are willing to

593
00:42:02,840 --> 00:42:07,519
pay for it because it solves a
production issue. Yeah, it's a chunk

594
00:42:07,519 --> 00:42:10,239
of code they're running in production and
they want, you know, certain things

595
00:42:10,320 --> 00:42:15,480
from that. The funny part is
in last week's show we were literally described

596
00:42:15,559 --> 00:42:17,639
and I said, hey, yeah, this makes sense when it's a CMS,

597
00:42:17,679 --> 00:42:21,039
which when we were talking to Sean
Walker about it, that you can

598
00:42:21,079 --> 00:42:22,719
turn into commercial product. But there's
going to be these internal libraries. It

599
00:42:22,719 --> 00:42:27,440
doesn't make sense for and here we
are having a conversation with you about an

600
00:42:27,440 --> 00:42:30,800
internal library that it doesn't make sense, doesn't correct. It has to come

601
00:42:30,840 --> 00:42:35,480
from people that appreciate it or they
feel like it really helped them in a

602
00:42:35,480 --> 00:42:37,360
certain way and they're willing to do
a one time thing or something like that.

603
00:42:38,159 --> 00:42:40,679
I mean, look at yourself,
like how easy. How often do

604
00:42:40,760 --> 00:42:45,159
you contribute or do you sponsor other
libraries? Yeah, I mean I should.

605
00:42:45,239 --> 00:42:49,159
I should actually pay for action in
it and all these libraries that make

606
00:42:49,199 --> 00:42:52,760
my life, you know, that
makes me a better developer, help my

607
00:42:52,800 --> 00:42:57,079
clients. Even one thing that just
occurred to me is that you know,

608
00:42:57,199 --> 00:43:00,000
in the music business of the past, because as I don't think it's really

609
00:43:00,079 --> 00:43:07,800
relevant anymore, they used to you
used to bars and performance establishments used to

610
00:43:07,800 --> 00:43:13,639
pay or they still do, ask
CAP and BMI to collect royalties for artists

611
00:43:13,719 --> 00:43:16,840
on their behalf, and they would
just you know, how how many hours

612
00:43:16,880 --> 00:43:21,000
a week do you have? What
joke box stations do you? Blah blah

613
00:43:21,000 --> 00:43:22,599
blah this and that. All right, we estimate you're going to pay,

614
00:43:22,639 --> 00:43:25,320
like, you know, a thousand
dollars a year or something like that.

615
00:43:25,880 --> 00:43:30,360
And then the goal of ask cap
and BMI then is to get artists to

616
00:43:30,400 --> 00:43:37,400
register with them and then distribute royalties
accordingly. But you know that it's it's

617
00:43:37,440 --> 00:43:42,360
become a joke with live streaming and
all that stuff. But yeah, but

618
00:43:42,679 --> 00:43:46,719
you know, there is a similar
idea that you know, get hub or

619
00:43:46,760 --> 00:43:52,079
one of these places that we've been
talking about. Some some establishment or some

620
00:43:52,920 --> 00:43:59,559
nonprofit agency could essentially say, you
know, if you if you use open

621
00:43:59,599 --> 00:44:05,559
source, you should become a member
and pay a due and then those dues

622
00:44:05,599 --> 00:44:09,559
are collected and then distributed to open
source projects based on the number of downloads

623
00:44:09,559 --> 00:44:15,559
they get. Whatever that is.
I would embrace that, right, and

624
00:44:15,679 --> 00:44:17,760
if there was such a thing I
would I would do that as well.

625
00:44:17,960 --> 00:44:22,599
I would become a member of that
organization because then it's not like I'm not

626
00:44:22,800 --> 00:44:27,119
nickel and diming myself for this project
that project. In this project, that

627
00:44:27,159 --> 00:44:30,000
project, I'm saying, look,
here's one hundred dollars a month or whatever

628
00:44:30,000 --> 00:44:35,400
it is. Then I'm giving to
this membership, and then that is going

629
00:44:35,440 --> 00:44:43,079
to support the open source community.
I like that. Somebody proved me wrong.

630
00:44:43,239 --> 00:44:45,199
I like that too. Actually in
the Netherlands, in the Netherlands,

631
00:44:45,280 --> 00:44:49,960
you actually still have to pay for
music like that. If you have a

632
00:44:50,079 --> 00:44:52,280
bar, sports conteam, you actually
have to pay well, I know,

633
00:44:52,400 --> 00:44:57,679
even if you Spotify. Yeah,
I know Spotify business costs like fifty dollars

634
00:44:57,679 --> 00:45:04,679
a month per room that it's in
um And I have people who I'm friends

635
00:45:04,679 --> 00:45:07,719
of mine that on restaurants to say
it's worth it because they can just put

636
00:45:07,760 --> 00:45:10,760
on what they want, you know. But but that's you know, that's

637
00:45:10,800 --> 00:45:16,159
not ASCAP and BMI anymore. That's
Spotify. Who's you know, distributing micropennies

638
00:45:16,239 --> 00:45:22,400
to artists. Yeah, it's kind
of broken. Yeah, it's just a

639
00:45:22,480 --> 00:45:24,599
question of yeah, is it is
it usable money? Does it make a

640
00:45:24,599 --> 00:45:29,280
difference? That's right? Yeah,
I feel this conversation keep coming up.

641
00:45:29,280 --> 00:45:31,440
I'm the guy who is good at
talking to the CFO, and I feel

642
00:45:31,639 --> 00:45:37,079
an it's like, is there a
construct here? You know, it's becoming

643
00:45:37,079 --> 00:45:40,960
more common in bigger companies to have
like a giving fund for charities where the

644
00:45:42,000 --> 00:45:45,760
company says, hey, we'll match
dollar for dollar what you contribute to to

645
00:45:45,039 --> 00:45:49,360
your favorite charity. That kind of
thing like should we be pushing on a

646
00:45:49,440 --> 00:45:52,840
construct for any organization as development?
It says, let us know what open

647
00:45:52,920 --> 00:45:58,440
source libraries you're using, and you
value you know, you put in your

648
00:45:58,559 --> 00:46:01,119
votes, and we have a pool. We're going to spend a thousand dollars

649
00:46:01,119 --> 00:46:06,920
a month distributed across the open source
projects that you think are the most important

650
00:46:06,920 --> 00:46:08,840
for us. Right, let somebody
else deal with the math. Well,

651
00:46:08,880 --> 00:46:12,280
and you know you do that with
a piece of software. They did all

652
00:46:12,360 --> 00:46:15,800
that. All of the developers that
are working inside of an organization, they

653
00:46:15,840 --> 00:46:19,400
you know, we've got to do
a bill of materials for our software anyway.

654
00:46:19,559 --> 00:46:22,480
Right, so we're right, sure, we already know what libraries we're

655
00:46:22,519 --> 00:46:25,079
using. Let's see what show up
the most. Then throw in some voting,

656
00:46:25,199 --> 00:46:29,000
like tell me what your feel of
the value of this is, how

657
00:46:29,000 --> 00:46:31,320
important is and so forth, and
from that we just distribute the money and

658
00:46:31,800 --> 00:46:35,159
you simply assign a budget item to
that. It says, hey, we

659
00:46:35,199 --> 00:46:37,400
depend on a bunch of these things, so we're going to spend X many

660
00:46:37,480 --> 00:46:40,280
dollars a month and distribute from there. I think it takes us a good

661
00:46:40,400 --> 00:46:44,519
citizen. I think companies are more
willing to embrace something like that that can

662
00:46:44,559 --> 00:46:46,440
be a line item in the budget, rather than you know, having developers

663
00:46:46,440 --> 00:46:51,400
come to them and say hey,
I need yeah, five dollars and blah

664
00:46:51,440 --> 00:46:53,280
blah blah. Yeah, the dev
doesn't want to do it because they don't

665
00:46:53,280 --> 00:46:57,480
like talking to finances. Finance doesn't
like these small ticket items. This is

666
00:46:57,480 --> 00:47:00,880
a paint in the buket, but
it's a single monthly line item, and

667
00:47:00,920 --> 00:47:05,400
there's a mechanism for ding distribution done
like dinner. I like that me too.

668
00:47:05,440 --> 00:47:08,159
Actually, I feel guilty that I
haven't pushed for that at my clients,

669
00:47:08,639 --> 00:47:13,320
even my own employer, because it's
not that hard to explain that.

670
00:47:13,360 --> 00:47:16,639
I mean, you spend tons of
I mean just one developer of spends one

671
00:47:16,719 --> 00:47:21,480
day of working is already much more
than much more. That's a thousand dollars

672
00:47:21,559 --> 00:47:24,599
that you just mentioned exactly. The
thing it can't do is evolve into a

673
00:47:24,639 --> 00:47:30,079
business that's for profit, Like it
has to be very very stripped down,

674
00:47:30,320 --> 00:47:36,480
you know, and obviously it needs
oversight. But but what Yeah, it

675
00:47:36,519 --> 00:47:38,679
can't. It can't turn into a
for profit business because then it'll just eat

676
00:47:38,719 --> 00:47:43,079
up everything and then you know,
the developerson won't anything. Well, some

677
00:47:43,119 --> 00:47:47,199
people make that business. I know
this FUGS project at some point on Patroon.

678
00:47:47,400 --> 00:47:52,159
I think there was like fifteen thousand
dollars a month of Like that person

679
00:47:52,199 --> 00:47:55,320
can actually make it that job to
do that right, which is not my

680
00:47:55,440 --> 00:47:59,880
goal because I actually love talking to
clients, but I completely buy into what

681
00:48:00,199 --> 00:48:02,199
saying and I actually I've just decided
I should push a little bit of hotter.

682
00:48:02,679 --> 00:48:06,320
It's not that complicated. Yeah,
this sounds like a project we could

683
00:48:06,360 --> 00:48:10,880
build. It's a little bit of
software and so yeah, and it's about

684
00:48:10,920 --> 00:48:15,480
it's a mind and it's certainly a
mindset. But the whole thing here is

685
00:48:15,480 --> 00:48:19,239
to lower the barrier to doing the
right thing. I think get up has

686
00:48:19,239 --> 00:48:22,400
a responsibility as well. And I
think they're also trying to make it easier

687
00:48:22,440 --> 00:48:28,000
for companies to sponsor projects, right
yeah, And that's the thing is like

688
00:48:28,119 --> 00:48:30,760
right now, get hub sponsorship means
going to the individual project and is signing

689
00:48:30,760 --> 00:48:34,480
the money, Like, there really
needs to be the company level viewpoint.

690
00:48:35,039 --> 00:48:38,480
And heck, if you if your
company's functioning through gethhub with private, private

691
00:48:38,519 --> 00:48:43,039
repositories or public ones, like if
that's where your source code flows through.

692
00:48:43,079 --> 00:48:45,360
Anyway, gehub has all the data
you need, right it can. It

693
00:48:45,440 --> 00:48:49,440
can produce that bill of materials for
you, and you can tell you here's

694
00:48:49,440 --> 00:48:52,960
the dependencies you're taking, like and
here's here's here suggested monthly donation or whatever

695
00:48:52,960 --> 00:48:58,440
it is. Whatever you let's let's
go get Thomas Dems them to the wall.

696
00:48:59,000 --> 00:49:01,599
I think that's a great idea.
That's a great idea. I don't

697
00:49:01,639 --> 00:49:07,400
know who that is, but see
the current CEO of GitHub, so I

698
00:49:07,440 --> 00:49:12,159
should know. Oh I should at
least send him a link to this episode.

699
00:49:12,360 --> 00:49:15,800
Yeah, there you go. I
think we can invite him on.

700
00:49:15,960 --> 00:49:20,559
He's been on my radar someone to
invite on to talk to the state of

701
00:49:20,599 --> 00:49:23,280
geth hub. So let him talk
extemporaneously for a while and then we'll nail

702
00:49:23,360 --> 00:49:37,039
him. Yeah, I'll pin him
down. Now he's not coming. Okay.

703
00:49:37,119 --> 00:49:40,400
Well, we're just trying to make
it a better place for developers all

704
00:49:40,440 --> 00:49:44,719
around, that's all. Yeah,
Well, and the thing is like we

705
00:49:44,920 --> 00:49:49,360
you know, we're thinking through each
level's problems, right, Like, it

706
00:49:49,559 --> 00:49:54,199
is very reasonable for development organization to
recognize the certain amount of money that we're

707
00:49:54,239 --> 00:49:59,159
saving because we use these libraries.
Let's assign a portion of that to be

708
00:49:59,199 --> 00:50:02,199
distributed. But make it easy for
me to do that, and so,

709
00:50:02,400 --> 00:50:06,760
and then you want to support the
right things. You want your developers to

710
00:50:06,800 --> 00:50:08,239
feel great that we're supporting the right
things. So they want you want that

711
00:50:08,320 --> 00:50:12,159
involved in the process. But it
should be simple. Yeah, it seems

712
00:50:12,159 --> 00:50:15,000
to you, guys just solved the
whole problem for us. Well, now

713
00:50:15,079 --> 00:50:19,199
somebody's got it yet. Ideas are
cheap, Yeah, ideas cheap. Execution

714
00:50:19,280 --> 00:50:23,000
is a painting the butt right as
always? C sharp coding guidelines. Why

715
00:50:23,039 --> 00:50:25,800
did you do this? What is
wrong with you? And what is your

716
00:50:25,800 --> 00:50:30,320
wife thinking about it? Yeah,
she doesn't know. It's it's my secret,

717
00:50:30,639 --> 00:50:35,039
the secret electric ship. You must
have gotten ennamorative C sharp right at

718
00:50:35,039 --> 00:50:37,840
the beginning and the original announcement in
two thousand, Like when did you encounter

719
00:50:37,960 --> 00:50:42,559
C sharp the first time? I
think it's two thousand or end of nineteen

720
00:50:42,639 --> 00:50:45,159
ninety nine. I was doing C
plus plus mostly with I think it was

721
00:50:45,199 --> 00:50:51,000
called MFC, and I was working
with a company that had C plus plus

722
00:50:51,039 --> 00:50:57,199
guidelines based on Stroutstrop industrial strength C
plus plus or something like that goes really

723
00:50:58,039 --> 00:51:02,119
and initially it was really annoying,
obnoxious set of rules, like you should

724
00:51:02,159 --> 00:51:06,719
not have more than one hundred lines. Now we have tools for that these

725
00:51:06,800 --> 00:51:10,800
days. This is just a bunch
of development guidelines, you know, some

726
00:51:10,880 --> 00:51:16,239
conventions and a lot of stuff you
can cover with added a confix with what

727
00:51:16,480 --> 00:51:21,599
else rustling with the I use a
lot of Jabbrains tooling. So with we

728
00:51:21,719 --> 00:51:24,599
sharper and writer you can get this
stuff for done. But it's it's mostly

729
00:51:24,760 --> 00:51:30,599
a set of guidelines and for me
they're kind of obvious. Apparently there's still

730
00:51:30,639 --> 00:51:36,599
a market for it because people still
fork the repository or print out this cheat

731
00:51:36,639 --> 00:51:39,079
sheet, which is a one page
PDIA that you can put on people's desks,

732
00:51:39,159 --> 00:51:44,599
like where we're still working at the
office, right, and it's more

733
00:51:44,639 --> 00:51:49,679
guidelines like that people don't start to
overuse I don't know, the new pattern

734
00:51:49,719 --> 00:51:53,800
matching, or make switch statements from
everything instead of thinking about object oriented design,

735
00:51:54,440 --> 00:51:58,960
you know, stuff like that,
to just to remind people about that

736
00:51:59,400 --> 00:52:04,840
every practice, every principle can be
misused and overused. Sure, and I'm

737
00:52:04,880 --> 00:52:09,360
trying to fight some balance, like
how you can do that? Nothing special?

738
00:52:09,599 --> 00:52:14,440
Yeah, yeah, and then every
rule should be broken once in a

739
00:52:14,480 --> 00:52:16,880
while, just done coherently, like
there's a reason why we broke this rule,

740
00:52:17,199 --> 00:52:21,039
that's right. Yeah, and that's
why it's called the guideline or the

741
00:52:21,119 --> 00:52:24,679
rule. Yeah. I always worry
when people print that stuff out and handed

742
00:52:24,679 --> 00:52:28,719
the people it's like this is gospel. You must follow this or you have

743
00:52:28,880 --> 00:52:32,000
failed. I used to be like
that, I don't know, fifty years

744
00:52:32,000 --> 00:52:36,039
ago or something. But yeah,
at some point, I guess you grow

745
00:52:36,119 --> 00:52:38,599
up and you start to understand the
pros and cons and when things apply,

746
00:52:39,039 --> 00:52:43,039
well, just acknowledge that there's more
than one new way to be successful.

747
00:52:43,239 --> 00:52:45,079
There's no absolutes for any of this. If there was one right way,

748
00:52:45,079 --> 00:52:49,960
we'd be doing it, and there
isn't. There isn't. Not true.

749
00:52:50,079 --> 00:52:52,719
That's why it's a get a repo. And I even recommend people to clone

750
00:52:52,800 --> 00:52:57,519
a fork to repo, create air, own internal whatever they want to call

751
00:52:57,559 --> 00:53:00,920
it. I use that as a
starting point. M great idea. And

752
00:53:00,960 --> 00:53:04,440
then but the main thing here is
like why does this guideline exist? Here

753
00:53:04,440 --> 00:53:07,920
are the risks when you don't follow
it, but they're only risks, right,

754
00:53:08,000 --> 00:53:13,280
like this, there's nothing certain.
It's like we've when you're when these

755
00:53:13,280 --> 00:53:15,519
things get too long, they get
harder to maintain, like they you you're

756
00:53:15,679 --> 00:53:22,440
entangling different methods together. Like there's
all the mistakes that we make as developers,

757
00:53:22,880 --> 00:53:24,719
and the guidelines try and steer us
away from that. You can have

758
00:53:24,760 --> 00:53:29,719
opinions about that. You can disagree
with it. It's totally fine. But

759
00:53:29,760 --> 00:53:32,519
I recently learned that I didn't realize
that myself because we're getting older, I

760
00:53:32,639 --> 00:53:37,800
mean, an adult that world for
twenty years. There's an entire group of

761
00:53:37,800 --> 00:53:42,039
people that just graduated or have two
or three years of experience, and they

762
00:53:42,079 --> 00:53:45,840
may be they may benefit from some
of these guidelines because they don't even think

763
00:53:45,840 --> 00:53:47,559
about it. They just try to
make the code work, you know,

764
00:53:47,679 --> 00:53:52,480
and probably some senior developer will slap
them in the face with my guidelines,

765
00:53:52,960 --> 00:53:55,320
I don't know, at least make
them think about this kind of stuff,

766
00:53:55,440 --> 00:54:00,760
right, don't follow it blindly,
don't be dogmatic about anything except that you

767
00:54:00,800 --> 00:54:05,440
should use flu insertions. Of course, yes, did we mention it,

768
00:54:05,480 --> 00:54:09,400
but yeah, I don't know if
you heard. But also that, Yeah,

769
00:54:09,440 --> 00:54:12,719
don't be dogmatic about it. This
is why we do it this way.

770
00:54:12,800 --> 00:54:16,159
And it's hard when you're a new
developer to understand the consequences of the

771
00:54:16,239 --> 00:54:20,880
code you write ten years from now. Yeah, because you haven't had that

772
00:54:20,920 --> 00:54:25,519
experience yet. And again, tooling
has become better now we have Rosslyn analysis

773
00:54:25,599 --> 00:54:30,280
that help you fall. It doesn't
solve the problems, doesn't solve your design

774
00:54:30,320 --> 00:54:35,159
issues, but they can help.
We have so on a cube that may

775
00:54:35,400 --> 00:54:37,599
you know, tell you that your
method is too long. Okay, there's

776
00:54:37,599 --> 00:54:40,960
a risk that people that just blindly
start to stupidly reflect the things and not

777
00:54:42,039 --> 00:54:44,719
make it better. But it should
be a trigger. I hope it's a

778
00:54:44,760 --> 00:54:47,760
trigger. You know, people think
about this or have a conversation with other

779
00:54:47,800 --> 00:54:51,559
developers, like, you know what, my method is pretty big. I

780
00:54:51,559 --> 00:54:53,719
can, of course make all these
very small methods. Doesn't It's not going

781
00:54:53,760 --> 00:54:57,800
to make it better right at different
ways of how I can approach that.

782
00:54:57,920 --> 00:55:01,159
I hope that this will trigger things. It's almost a stimulus for conversation.

783
00:55:01,199 --> 00:55:05,679
It's like, why is my method
getting a large Am I entangling two different

784
00:55:05,719 --> 00:55:08,800
things? Or is it just a
big method? Could be you know,

785
00:55:08,880 --> 00:55:13,239
and you get into the pair of
eyes involved. I look at this,

786
00:55:13,639 --> 00:55:15,400
you know why am I pressing up
against this limit? Am I approaching this

787
00:55:15,519 --> 00:55:20,280
wrong? Or is it this the
right thing to do? Refactoring it just

788
00:55:20,320 --> 00:55:22,800
to make it shorter when it still
does all the same thing is questionable.

789
00:55:23,639 --> 00:55:29,719
Really, I think the main issue
here is am I not sticking with a

790
00:55:29,760 --> 00:55:34,039
single function? I mean, I'm
making them do all the stuff method Well,

791
00:55:34,119 --> 00:55:37,559
that's why a lot of people are
so let's say negative about clean code,

792
00:55:37,599 --> 00:55:39,840
because you know, people start to
follow these these books and stuff like

793
00:55:39,880 --> 00:55:45,039
that blindly without understanding what's behind that. Yeah, that's what everything. I

794
00:55:45,039 --> 00:55:49,239
mean, you can configure son a
cube in a certain way that your poolic

795
00:55:49,280 --> 00:55:52,000
question will be rejected. But the
whole point is you need to you need

796
00:55:52,039 --> 00:55:55,519
to think by yourself, or at
least have that conversation. I should just

797
00:55:55,599 --> 00:56:00,280
set h Yeah, and then I
think you you learn to think by yourself

798
00:56:00,280 --> 00:56:05,800
by having those conversations. You're hoping
that the tools will give you indicators of

799
00:56:05,880 --> 00:56:09,599
when to have those conversations, not
always running back all the time. Yeah,

800
00:56:09,719 --> 00:56:13,639
you just do when it's needed.
No, I really appreciate that.

801
00:56:13,840 --> 00:56:16,079
It's just astonishing to me to do
anything for twenty years. Oh wait,

802
00:56:16,519 --> 00:56:23,639
how long will we make this bloody
podcast? Oh my god, I think

803
00:56:23,679 --> 00:56:27,679
you're the same species, Dennis.
You get involved in things and you just

804
00:56:27,920 --> 00:56:32,519
don't stop. Yeah, we have
that disease. It's called passions. Okay,

805
00:56:32,599 --> 00:56:36,119
we'll call it that. It might
be a kind of insanity too.

806
00:56:37,159 --> 00:56:40,440
Yeah, but I think if understood
correctly, sanity means you're doing the same

807
00:56:40,480 --> 00:56:45,519
thing all over over and over again
and expect different behavior. That is one

808
00:56:45,599 --> 00:56:50,760
kind of insanive it is. I
actually see change of behavior. Yeah,

809
00:56:50,559 --> 00:56:54,559
I see people ignoring me. I
see people throwing my guidelines into you out

810
00:56:54,639 --> 00:56:59,639
of this because she just has your
best interests in mind, you know,

811
00:57:00,599 --> 00:57:04,760
yes, yes, no, but
that that's why we do these things,

812
00:57:04,800 --> 00:57:08,639
right, I mean you're doing a
podcast to share experiences, to provide people

813
00:57:08,639 --> 00:57:12,199
with a different insight. I do
the same thing with my blogs, with

814
00:57:12,280 --> 00:57:16,440
my presenting or conference. It's never
the truth, it's just a mindset or

815
00:57:16,440 --> 00:57:22,199
maybe these different perspectives to you.
Yeah, right, Dennis. It's been

816
00:57:22,280 --> 00:57:24,920
an absolute pleasure having you on the
show, and please do come back again.

817
00:57:25,079 --> 00:57:29,039
I love to thank you very much. All right, awesome, and

818
00:57:29,119 --> 00:57:53,559
we'll see you next time. I'm
dot net rocks dot net. Rocks is

819
00:57:53,599 --> 00:57:59,519
brought to you by Franklin's Net and
produced by Pop Studios, a full service

820
00:57:59,599 --> 00:58:04,719
audio, video and post production facility
located physically in New London, Connecticut,

821
00:58:04,760 --> 00:58:09,679
and of course in the cloud online
at pwop dot com. Visit our website

822
00:58:09,679 --> 00:58:16,039
at dt nt r ocks dot com
for RSS feeds, downloads, mobile apps,

823
00:58:16,199 --> 00:58:21,119
comments, and access to the full
archives going back to show number one,

824
00:58:21,679 --> 00:58:24,400
recorded in September two thousand and two. And make sure you check out

825
00:58:24,400 --> 00:58:29,719
our sponsors. They keep us in
business. Now go write some code CE

826
00:58:29,960 --> 00:58:31,079
next time you got a m
