WEBVTT

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

