1
00:00:00,000 --> 00:00:02,200
Hey, a quick message. 
For those of you who are 

2
00:00:02,200 --> 00:00:04,300
listening to this episode on 
Spotify. 

3
00:00:04,600 --> 00:00:07,500
I have a small favor to ask 
Spotify. 

4
00:00:07,500 --> 00:00:10,100
Now allows mobile users to rate 
podcasts. 

5
00:00:10,400 --> 00:00:13,300
I would really appreciate it. 
If you can take a quick, pause 

6
00:00:13,300 --> 00:00:16,100
to go to the technique Journal 
podcast page, and leave your 

7
00:00:16,100 --> 00:00:18,800
favorite show. 
Your best rating on Spotify. 

8
00:00:19,200 --> 00:00:21,800
It will help me a lot to get 
this podcast to reach more 

9
00:00:21,800 --> 00:00:24,300
people on the platform. 
Thanks a lot. 

10
00:00:24,700 --> 00:00:26,700
You're good examples. 
If you have someone in a really 

11
00:00:26,700 --> 00:00:30,500
fast car like a Ferrari and you 
have someone else in a Bicycle, 

12
00:00:30,600 --> 00:00:33,600
the Ferrari is faster. 
But if you go in the wrong 

13
00:00:33,600 --> 00:00:35,700
direction, the bicycle is 
better. 

14
00:00:36,000 --> 00:00:38,500
If you're trying to get to the 
right place, a bicycle might be 

15
00:00:38,500 --> 00:00:40,200
better. 
So, I see a lot of people in 

16
00:00:40,200 --> 00:00:42,200
programming we talk about 
velocities. 

17
00:00:42,400 --> 00:00:45,300
We're talking about how fast can
we do things and there's nothing

18
00:00:45,300 --> 00:00:46,800
wrong with that. 
I mean, it's good to improve 

19
00:00:46,800 --> 00:00:49,400
your processes to make them 
faster and more efficient is 

20
00:00:49,400 --> 00:00:51,600
good. 
But sometimes people lose track 

21
00:00:51,600 --> 00:00:54,300
of was even more important is 
doing the right thing in the 

22
00:00:54,300 --> 00:01:00,800
first place. 
Hey everyone. 

23
00:01:01,300 --> 00:01:03,100
My name is Henry Surya with 
Robin. 

24
00:01:04,800 --> 00:01:07,700
And you're listening to the 
technology, you know, podcast 

25
00:01:08,100 --> 00:01:10,400
the show where I'll be bringing 
you the greatest technical 

26
00:01:10,400 --> 00:01:14,300
leaders practitioners and 
thought leaders in the industry 

27
00:01:14,700 --> 00:01:19,000
to discuss about their Journey 
ideas and practices that we all 

28
00:01:19,000 --> 00:01:22,600
can learn and apply to build a 
highly performing technical team

29
00:01:23,000 --> 00:01:25,400
and to make an impact in your 
personal work. 

30
00:01:25,900 --> 00:01:34,400
So let's dive into our Journal. 
Hello again, to all of you, my 

31
00:01:34,400 --> 00:01:37,600
friends and listeners. 
Welcome to a new episode of the 

32
00:01:37,600 --> 00:01:40,900
fact that Janelle podcast. 
I am your host Henry Surya Vera 

33
00:01:40,900 --> 00:01:42,700
Wang. 
Thank you for tuning in 

34
00:01:42,800 --> 00:01:45,500
listening to this episode. 
If this is your first time 

35
00:01:45,500 --> 00:01:48,200
listening to technology, you 
know, subscribe and follow the 

36
00:01:48,200 --> 00:01:51,800
show on your favorite podcast 
app and social media on 

37
00:01:51,800 --> 00:01:53,600
LinkedIn, Twitter, and 
Instagram. 

38
00:01:54,100 --> 00:01:56,900
And if you are a regular 
listener and enjoy listening to 

39
00:01:56,900 --> 00:02:00,300
the episodes, subscribe, as a 
patron at Tech, did you know 

40
00:02:00,300 --> 00:02:03,200
that laughs? 
As Patron and support my journey

41
00:02:03,300 --> 00:02:06,200
to continue producing great 
technology, new episodes every 

42
00:02:06,200 --> 00:02:08,699
week. 
Many of us may think that 

43
00:02:08,699 --> 00:02:11,500
implementing domain driven 
design means using 

44
00:02:11,500 --> 00:02:15,100
object-oriented programming and 
paradigms, especially when 

45
00:02:15,100 --> 00:02:18,700
looking at some of the DD 
technical design patterns and 

46
00:02:18,700 --> 00:02:21,100
some of us, especially the 
functional programming 

47
00:02:21,100 --> 00:02:24,700
practitioners, May wonder 
whether functional programming 

48
00:02:24,700 --> 00:02:27,500
can also be used to implement 
domain-driven design. 

49
00:02:27,800 --> 00:02:30,500
And if so how we can do that 
properly. 

50
00:02:31,100 --> 00:02:34,100
This episode tries to provide 
you some answers to that 

51
00:02:34,100 --> 00:02:37,400
particular question. 
My guest for today's episode is 

52
00:02:37,400 --> 00:02:40,500
Scott Russian. 
He is the author of domain 

53
00:02:40,500 --> 00:02:44,300
modeling made functional and the
popular F sharp sight. 

54
00:02:44,300 --> 00:02:49,300
F sharp for Fun and Profit.com 
in this episode Scott began by 

55
00:02:49,300 --> 00:02:51,900
sharing his view of the need for
developers today. 

56
00:02:51,900 --> 00:02:55,100
To become more polyglot 
developers and learn multiple 

57
00:02:55,100 --> 00:02:58,600
programming languages as someone
who learns a lot of programming 

58
00:02:58,600 --> 00:03:02,400
languages and even being really 
good at five to six different 

59
00:03:02,400 --> 00:03:06,200
languages, Scott provided some 
great insights on why we should 

60
00:03:06,200 --> 00:03:09,700
try to at least learn and 
practice more than one language.

61
00:03:10,200 --> 00:03:12,600
Scott then shared about 
functional programming 

62
00:03:12,600 --> 00:03:16,100
fundamentals and how functional 
programming differs from 

63
00:03:16,100 --> 00:03:19,900
object-oriented programming, as 
well, as sharing some cases when

64
00:03:19,900 --> 00:03:23,700
one is better suited than the 
other Scott, then explained how 

65
00:03:23,700 --> 00:03:25,400
we can use functional 
programming. 

66
00:03:25,400 --> 00:03:28,800
When implementing domain driven 
design, including how to model 

67
00:03:28,800 --> 00:03:32,300
some of the DD technical designs
and Transaction boundary 

68
00:03:33,000 --> 00:03:36,500
throughout the conversation. 
Scott shared why F sharp has 

69
00:03:36,500 --> 00:03:40,400
become his favorite and go to 
programming language and why he 

70
00:03:40,400 --> 00:03:43,000
thinks it may be better from the
other available. 

71
00:03:43,000 --> 00:03:46,300
Functional programming 
languages, towards the end of 

72
00:03:46,300 --> 00:03:49,400
our conversation. 
Scott touch on important advice 

73
00:03:49,400 --> 00:03:51,900
about Effectiveness versus 
efficiency. 

74
00:03:52,300 --> 00:03:55,300
And what leaders need to be 
aware of regarding doing the 

75
00:03:55,300 --> 00:03:58,100
right thing versus doing the 
thing fast. 

76
00:03:59,000 --> 00:04:02,400
I really enjoyed my conversation
with With Scott learning about 

77
00:04:02,400 --> 00:04:05,500
functional programming, how to 
apply it in domain driven 

78
00:04:05,500 --> 00:04:08,400
design, and a good reminder 
about the importance of 

79
00:04:08,400 --> 00:04:12,000
Effectiveness rather than 
efficiency, and I wasn't really 

80
00:04:12,000 --> 00:04:15,700
aware that F sharp is actually 
now available outside of windows

81
00:04:15,700 --> 00:04:18,600
platform. 
If you also enjoy and find this 

82
00:04:18,600 --> 00:04:22,000
episode useful, please share it 
with someone, you know, either 

83
00:04:22,000 --> 00:04:24,300
your friends, or your 
colleagues, who would also 

84
00:04:24,300 --> 00:04:26,500
benefit from listening to this 
episode. 

85
00:04:27,000 --> 00:04:30,200
Also leave a rating and review 
on your podcast app or share 

86
00:04:30,200 --> 00:04:32,400
about this. 
Out on your social media 

87
00:04:32,400 --> 00:04:35,200
platform. 
It is my ultimate mission to 

88
00:04:35,200 --> 00:04:38,000
make this podcast and the 
knowledge available to more 

89
00:04:38,000 --> 00:04:40,400
people. 
And you can play a part towards 

90
00:04:40,400 --> 00:04:43,100
fulfilling my mission. 
Before we continue to the 

91
00:04:43,100 --> 00:04:45,600
episode. 
Let's hear some words from our 

92
00:04:45,600 --> 00:04:48,200
sponsor. 
Today's episode is proudly 

93
00:04:48,200 --> 00:04:51,800
sponsored by skills matter. 
The global community and events 

94
00:04:51,800 --> 00:04:56,300
platform with more than 100,000 
software professionals here 

95
00:04:56,500 --> 00:04:59,600
members, can organize their 
learning experiences around the 

96
00:04:59,600 --> 00:05:03,200
technology topics that Care 
about most you get on-demand 

97
00:05:03,200 --> 00:05:07,100
access to their latest content 
thought, leadership insights, as

98
00:05:07,100 --> 00:05:11,000
well as the exciting schedule of
tech events running across all 

99
00:05:11,000 --> 00:05:13,700
time zones. 
So where the devops our data 

100
00:05:13,700 --> 00:05:17,700
science is your bus or you are 
fan of functional programming or

101
00:05:17,700 --> 00:05:20,400
all things Cloud. 
You can make real connections 

102
00:05:20,400 --> 00:05:24,500
with people who share your 
interests head on over to skills

103
00:05:24,500 --> 00:05:27,800
method or Cam to become part of 
the tech community that matters 

104
00:05:27,800 --> 00:05:30,500
most to you. 
It's free to join and you will 

105
00:05:30,500 --> 00:05:32,600
find it. 
Z to keep up with the latest 

106
00:05:32,600 --> 00:05:37,200
tech Trends. 
Hello everyone, welcome back to 

107
00:05:37,200 --> 00:05:40,300
another new episode of the 
packaging of podcast today. 

108
00:05:40,300 --> 00:05:43,200
I'm very excited to have someone
with me, is name is Scott 

109
00:05:43,200 --> 00:05:47,700
Russian and he is actually the 
famous author of the book domain

110
00:05:47,700 --> 00:05:50,800
modeling made functional. 
So if you are into domain-driven

111
00:05:50,800 --> 00:05:53,900
design and also into the 
functional programming, I'm 

112
00:05:53,900 --> 00:05:55,500
sure. 
Maybe you have heard about this 

113
00:05:55,500 --> 00:05:58,000
book. 
He's also the creator of popular

114
00:05:58,000 --> 00:06:00,600
F-sharp website called f sharp 
for fun. 

115
00:06:00,600 --> 00:06:04,200
And Profit.com, the name itself?
Sounds really fun. 

116
00:06:04,600 --> 00:06:07,800
So got really looking forward to
have you in the show today and 

117
00:06:07,800 --> 00:06:09,900
looking forward also to learn 
more about functional 

118
00:06:09,900 --> 00:06:12,500
programming and maybe also 
domain-driven design at the same

119
00:06:12,500 --> 00:06:14,400
time. 
Well, thanks for having me 

120
00:06:14,400 --> 00:06:15,500
Henry. 
It's nice to be here. 

121
00:06:16,300 --> 00:06:18,000
So Scott, maybe in the 
beginning. 

122
00:06:18,000 --> 00:06:21,300
I'd like to always ask my guest 
to introduce themselves and also

123
00:06:21,300 --> 00:06:23,800
to tell us more about your 
highlights or turning points in 

124
00:06:23,800 --> 00:06:26,800
your career. 
So I'm quite old, I've been 

125
00:06:26,800 --> 00:06:30,600
around since the dinosaurs. 
So I first started programming 

126
00:06:30,600 --> 00:06:33,600
back. 
The 1980s that so old I am, 

127
00:06:33,800 --> 00:06:36,000
that's when everything was still
in black and white. 

128
00:06:36,300 --> 00:06:40,500
The very first computer I ever 
used, was actually a CPM machine

129
00:06:40,500 --> 00:06:44,300
before dose, even it was a 
kaypro and it had two floppy 

130
00:06:44,300 --> 00:06:47,400
disks and now hard drive, very 
exciting. 

131
00:06:47,700 --> 00:06:50,500
But, you know, it's amazing. 
What you can actually, learn 

132
00:06:50,800 --> 00:06:53,800
given how nowadays, we consider 
these machines really tell, but 

133
00:06:53,800 --> 00:06:55,700
you can learn a lot mean. 
I learned all my programming on 

134
00:06:55,700 --> 00:06:58,400
this machine and the first 
program I actually used was 

135
00:06:58,400 --> 00:07:03,000
debase to, which was The 
Microsoft Access of its day or 

136
00:07:03,000 --> 00:07:05,400
the fox probe its day. 
It was like everybody used it 

137
00:07:05,400 --> 00:07:07,300
for doing database. 
Programming ahead of a 

138
00:07:07,300 --> 00:07:09,100
programming language, you're 
scripting language built in. 

139
00:07:09,100 --> 00:07:12,000
So I started programming 
database and I actually end up 

140
00:07:12,000 --> 00:07:13,700
writing some really quite 
complicated things and it will 

141
00:07:13,700 --> 00:07:15,800
fit on one floppy disk or two 
floppy disk. 

142
00:07:15,800 --> 00:07:18,100
And then, of course, this is 
pre-internet. 

143
00:07:18,100 --> 00:07:22,000
I used to be a big subscriber of
all those computer magazines 

144
00:07:22,000 --> 00:07:24,000
like B magazine. 
Dr. Dobbs journal. 

145
00:07:24,000 --> 00:07:27,700
And my favorite one is actually 
called computer language, which 

146
00:07:27,700 --> 00:07:30,200
is all about computer. 
Languages you get introduced to 

147
00:07:30,200 --> 00:07:31,800
all these interesting. 
Things that you would know 

148
00:07:31,800 --> 00:07:34,700
about. 
So, I learned prologue and I 

149
00:07:34,700 --> 00:07:38,500
learned small talk and I learned
a language called icon, which is

150
00:07:38,500 --> 00:07:41,800
sort of a predecessor of python.
I played around with all these. 

151
00:07:41,900 --> 00:07:44,400
You could basically get floppy 
disks with all these programming

152
00:07:44,400 --> 00:07:47,200
errors on it and a funny sort of
way because there wasn't any 

153
00:07:47,200 --> 00:07:49,800
standard language really people 
would experiment. 

154
00:07:49,800 --> 00:07:52,000
There's a lot of experimenting 
people try all sorts of stuff 

155
00:07:52,400 --> 00:07:55,000
and I think nowadays people 
actually do less 

156
00:07:55,000 --> 00:07:56,800
experimentation. 
There's so much to learn. 

157
00:07:57,200 --> 00:08:00,600
You can spend your whole career 
just doing JavaScript or Java or

158
00:08:00,600 --> 00:08:01,200
c. 
Shot. 

159
00:08:01,300 --> 00:08:03,100
So you'd end up not 
experimenting with all these 

160
00:08:03,100 --> 00:08:05,400
different other things. 
So, there's actually great for 

161
00:08:05,400 --> 00:08:07,200
me because I learned all these 
interesting things. 

162
00:08:08,000 --> 00:08:10,700
So I actually got a job doing 
Small Talk programming back in 

163
00:08:10,700 --> 00:08:13,200
the early 90s. 
This is pre Java. 

164
00:08:13,200 --> 00:08:16,500
So, small talk was actually used
by Banks and insurance companies

165
00:08:17,000 --> 00:08:18,400
and these big corporate 
businesses. 

166
00:08:18,400 --> 00:08:20,900
They thought the small talk was 
gonna be their Enterprise 

167
00:08:20,900 --> 00:08:23,100
language. 
So for a couple of years, it was

168
00:08:23,500 --> 00:08:26,900
and then the internet came along
and Java came along and small 

169
00:08:26,900 --> 00:08:29,500
talk basically died. 
So then I switch to using 

170
00:08:29,500 --> 00:08:32,200
python. 
Python program for a while. 

171
00:08:32,200 --> 00:08:36,200
And then I switched it C sharp 
when dotnet came out in 2001 or 

172
00:08:36,200 --> 00:08:40,500
2002 study, using C sharp. 
Then back 2010. 

173
00:08:40,500 --> 00:08:43,400
I started using F sharp and so F
sharp. 

174
00:08:43,400 --> 00:08:46,400
I've really loved ever since 
that's been my kind of main 

175
00:08:46,400 --> 00:08:48,900
programming language ever since,
although I still do bit of C 

176
00:08:48,900 --> 00:08:52,100
sharp and I still do Python and 
if I have a contract that's 

177
00:08:52,100 --> 00:08:54,600
going to pay me a lot of money 
that we use whichever language 

178
00:08:54,600 --> 00:08:57,000
they're paying me to use, I 
would say back in the early 

179
00:08:57,000 --> 00:08:58,400
days. 
There's a lot of creativity 

180
00:08:58,400 --> 00:09:00,100
around learning programming 
languages. 

181
00:09:00,600 --> 00:09:02,900
The The big thing I did and this
is what I would recommend 

182
00:09:02,900 --> 00:09:05,200
everybody is again back about 10
years ago. 

183
00:09:05,200 --> 00:09:08,700
I started doing my blog but if 
shop for Fun and Profit and I 

184
00:09:08,700 --> 00:09:12,100
did that originally, as a way of
teaching myself, F sharp. 

185
00:09:12,500 --> 00:09:16,100
The idea is, I would try to 
explain it to somebody else, you

186
00:09:16,100 --> 00:09:18,000
know, there's a static thing. 
If you try to explain it to 

187
00:09:18,000 --> 00:09:21,100
somebody else, it forces you to 
learn it really well by 

188
00:09:21,100 --> 00:09:22,200
something. 
I already knew. 

189
00:09:22,200 --> 00:09:25,100
And so I thought I'd do that and
every weekend, I would write a 

190
00:09:25,100 --> 00:09:28,600
blog post about something in a 
shop and it turned out a lot of 

191
00:09:28,608 --> 00:09:30,300
people found. 
It really useful, not just me 

192
00:09:30,700 --> 00:09:32,700
and It turned out to be really 
quite popular blog. 

193
00:09:33,000 --> 00:09:35,400
It still is quite popular blog. 
And so that's nice. 

194
00:09:35,700 --> 00:09:38,200
I would recommend anyone if 
you're looking for career advice

195
00:09:38,200 --> 00:09:40,900
is to do blogging or something, 
to make yourself, stand out from

196
00:09:40,900 --> 00:09:44,300
the crowd, having a Blog, a big,
an expert in something doing 

197
00:09:44,300 --> 00:09:45,900
conferences. 
These are all good. 

198
00:09:45,900 --> 00:09:47,300
Career moves as well as being 
fun. 

199
00:09:47,500 --> 00:09:50,100
I really enjoyed writing the 
blog and it was very good for my

200
00:09:50,100 --> 00:09:51,600
career as well. 
Right now. 

201
00:09:51,600 --> 00:09:54,300
I'm just doing a mixture of 
writing books and doing 

202
00:09:54,300 --> 00:09:56,500
contracts with people, and 
that's how I make my living. 

203
00:09:57,400 --> 00:10:00,400
Thanks for sharing your story. 
It's since a long time ago, even

204
00:10:00,400 --> 00:10:04,600
I Unborn their tithe. 
It is a long time ago. 

205
00:10:04,700 --> 00:10:07,200
Yeah, it's really interesting to
hear that last time, there was 

206
00:10:07,200 --> 00:10:09,900
not even a hard disk, and you 
mentioned that you have learned 

207
00:10:09,900 --> 00:10:11,600
so many different languages, 
right? 

208
00:10:11,600 --> 00:10:15,200
So maybe if you can count 10 20,
like Chennai, will probably say 

209
00:10:15,200 --> 00:10:19,100
this five or six languages that 
I'm extremely good at including 

210
00:10:19,100 --> 00:10:22,000
sequel. 
I did also act as a SQL DBA for 

211
00:10:22,000 --> 00:10:24,200
a while. 
So I'm pretty understanding of 

212
00:10:24,200 --> 00:10:26,700
how SQL in relational databases 
work, which I also think is a 

213
00:10:26,700 --> 00:10:29,600
useful skill for any developer. 
Yeah, I would say it's probably 

214
00:10:29,600 --> 00:10:32,500
five or six languages are very 
Open the apps and a couple other

215
00:10:32,500 --> 00:10:35,100
ones I could probably do. 
If I have to, I'm not really a 

216
00:10:35,100 --> 00:10:37,600
JavaScript expert but I can hack
it if necessary. 

217
00:10:37,800 --> 00:10:39,700
First. 
I don't identify Myself by a 

218
00:10:39,700 --> 00:10:41,100
language. 
There's some people say I'm a 

219
00:10:41,100 --> 00:10:43,500
Java developer. 
I'm a c-sharp developer. 

220
00:10:43,800 --> 00:10:45,600
I think of myself as a 
developer. 

221
00:10:45,800 --> 00:10:48,900
I've solved problems the 
language that you use to solve 

222
00:10:48,900 --> 00:10:50,700
the problems. 
It's not that important. 

223
00:10:50,700 --> 00:10:52,000
It does actually make a 
difference. 

224
00:10:52,200 --> 00:10:54,100
Different languages do make a 
difference in how you think 

225
00:10:54,100 --> 00:10:57,600
about the problem, but I'm not 
particularly bothered by having 

226
00:10:57,600 --> 00:11:00,100
a language debates about which 
is the best language and all the

227
00:11:00,100 --> 00:11:03,000
stuff is just going. 
Trivial really one of the topics

228
00:11:03,000 --> 00:11:04,500
these days that is very hot. 
Right? 

229
00:11:04,500 --> 00:11:06,900
Whether you should be a polyglot
developers or not. 

230
00:11:07,000 --> 00:11:09,500
So coming from your background 
learning so many different 

231
00:11:09,500 --> 00:11:12,900
languages and even expert, five 
to six different languages that 

232
00:11:12,900 --> 00:11:14,900
you say. 
You can be really good at all. 

233
00:11:14,900 --> 00:11:17,400
Why do you think developers 
should think about being a 

234
00:11:17,408 --> 00:11:20,200
polyglot developers? 
I think the first of all, 

235
00:11:20,200 --> 00:11:21,200
there's a couple of different 
reasons. 

236
00:11:21,200 --> 00:11:24,900
The first one is that the more 
different languages, you know, 

237
00:11:25,200 --> 00:11:26,700
it makes makes your toolkit 
bigger. 

238
00:11:26,700 --> 00:11:29,900
So if you think about, if you're
a carpenter, you have a hammer 

239
00:11:30,100 --> 00:11:31,300
for you. 
Also have a Driver. 

240
00:11:31,300 --> 00:11:34,300
And you also have a wrench and 
you also have a drill and you 

241
00:11:34,308 --> 00:11:36,700
have all these different tools 
and you use the right tool for 

242
00:11:36,700 --> 00:11:38,900
the job. 
A carpenter only ever used a 

243
00:11:38,908 --> 00:11:41,800
hammer and never use a 
screwdriver would be a very bad 

244
00:11:41,800 --> 00:11:44,200
confident. 
And so, it's the same thing with

245
00:11:44,200 --> 00:11:45,800
programming. 
I think different programming 

246
00:11:45,800 --> 00:11:48,100
languages are different tools, 
and they have different ways of 

247
00:11:48,100 --> 00:11:50,600
working with the tool. 
So if you sequel, It's a 

248
00:11:50,608 --> 00:11:51,900
completely different way of 
thinking. 

249
00:11:51,900 --> 00:11:54,400
Then if you're using an 
imperative language, like C 

250
00:11:54,400 --> 00:11:57,300
sharp or something, it basically
changes the way you think about 

251
00:11:57,300 --> 00:11:59,800
programming, so it expands your 
mind. 

252
00:12:00,100 --> 00:12:01,700
So for my purposes, Personal 
point of view. 

253
00:12:01,800 --> 00:12:03,900
It's very good. 
And then just from a practical 

254
00:12:03,900 --> 00:12:07,400
point of view, the more 
languages, you know, the more 

255
00:12:07,400 --> 00:12:09,500
job opportunities you have 
that's another thing. 

256
00:12:09,900 --> 00:12:13,200
But also when you do work on a 
job as a contractor, you can 

257
00:12:13,200 --> 00:12:16,500
just walk onto job and do not 
going to be complaining that you

258
00:12:16,508 --> 00:12:19,200
don't like the syntax or you 
don't like the style or you 

259
00:12:19,200 --> 00:12:21,900
don't like them do this way, 
some programmers like to rewrite

260
00:12:21,900 --> 00:12:25,400
everything, using the best way, 
when I come into a job, what I 

261
00:12:25,408 --> 00:12:28,000
call a Brownfield project where 
the codes already written it, as

262
00:12:28,000 --> 00:12:30,700
a legacy project, leave the code
use the same. 

263
00:12:30,900 --> 00:12:34,300
Style that the people they're 
already using do within reason. 

264
00:12:34,300 --> 00:12:36,300
Obviously, if it's horrible, you
can refactor it. 

265
00:12:36,400 --> 00:12:40,300
But basically don't try and 
impose your perfect Style on 

266
00:12:40,300 --> 00:12:42,800
existing code, just adapt to the
stylus or do that. 

267
00:12:43,000 --> 00:12:45,200
If you've done many different 
languages, you tend to be much 

268
00:12:45,200 --> 00:12:47,600
more open to that. 
If you had limited experience, 

269
00:12:47,600 --> 00:12:50,000
you tend to be much more picky 
and you say, well, has to be 

270
00:12:50,000 --> 00:12:52,300
this way, is the only way I know
and this is the way it has to 

271
00:12:52,300 --> 00:12:53,600
be. 
That's not very good as a 

272
00:12:53,600 --> 00:12:55,200
professional. 
I don't think you should work 

273
00:12:55,200 --> 00:12:58,100
that way. 
Yeah, a lot of cases these days,

274
00:12:58,100 --> 00:13:01,000
especially developers who just 
came into a project. 

275
00:13:01,000 --> 00:13:04,300
Maybe they started a new career 
new company or their consultant.

276
00:13:04,300 --> 00:13:07,000
They join a project. 
So yeah, definitely one of the 

277
00:13:07,000 --> 00:13:10,200
most common remarks made by 
those new joiners, of course, 

278
00:13:10,200 --> 00:13:12,600
the code base is probably not so
well done. 

279
00:13:12,700 --> 00:13:14,600
We should refactor this, we 
should rewrite. 

280
00:13:14,700 --> 00:13:17,100
And I think you brought a good 
point that if you have so many 

281
00:13:17,100 --> 00:13:20,100
different paradigms and you are 
familiar with them, and maybe 

282
00:13:20,100 --> 00:13:22,800
also good at that. 
Maybe you can adapt yourself to 

283
00:13:22,800 --> 00:13:25,000
different code bases, right? 
That's right. 

284
00:13:25,400 --> 00:13:28,300
The good example. 
Is I just did a python contract 

285
00:13:28,800 --> 00:13:31,000
M4 experience in functional 
programming and also very 

286
00:13:31,000 --> 00:13:32,900
experienced in object-oriented 
programming. 

287
00:13:33,100 --> 00:13:36,100
But for python, I think the 
right thing is just basically, 

288
00:13:36,100 --> 00:13:38,400
at a Chic kind of procedural 
programming. 

289
00:13:38,700 --> 00:13:41,500
And so when I was writing this 
code, I didn't use a lot of 

290
00:13:41,500 --> 00:13:44,000
weird functional stuff. 
I didn't use monads and all this

291
00:13:44,000 --> 00:13:47,100
stuff, and I didn't use super 
nested class hierarchies with 

292
00:13:47,100 --> 00:13:49,900
lots of inheritance because I 
think python has a certain style

293
00:13:49,900 --> 00:13:50,700
of working. 
Yeah. 

294
00:13:50,700 --> 00:13:53,500
I have seen people do JavaScript
or Python and they ringing 

295
00:13:53,500 --> 00:13:55,900
monads or they bring in some 
wood functional stuff. 

296
00:13:56,300 --> 00:13:58,700
There's not fair to the person 
is going to have to maintain it.

297
00:13:58,800 --> 00:14:00,700
I would say that's not being a 
professional programmer. 

298
00:14:00,700 --> 00:14:02,100
You have to think about other 
people. 

299
00:14:02,100 --> 00:14:03,600
It's not all about what you want
to do. 

300
00:14:03,900 --> 00:14:05,700
It's what makes life easier for 
other people. 

301
00:14:06,100 --> 00:14:07,900
I would never use Advanced 
functional programming 

302
00:14:07,900 --> 00:14:10,500
techniques in a project where 
people didn't care about that 

303
00:14:10,500 --> 00:14:12,000
stuff. 
That's not the right way to do 

304
00:14:12,000 --> 00:14:14,800
it. 
Yeah, and also, I saw one of the

305
00:14:14,800 --> 00:14:17,800
most popular tweet that you. 
Did you mentioned that by being 

306
00:14:17,800 --> 00:14:20,900
a polygon developers? 
You start treating syntax as it 

307
00:14:20,900 --> 00:14:24,000
is, it stops being a big deal 
that you don't being nitpick 

308
00:14:24,000 --> 00:14:26,000
about certain writings. 
Yeah. 

309
00:14:26,300 --> 00:14:28,200
The Test example, is Curly 
braces. 

310
00:14:28,400 --> 00:14:31,500
So F sharp doesn't have curly. 
Braces python doesn't have curly

311
00:14:31,500 --> 00:14:33,500
braces. 
Sequel doesn't have curly 

312
00:14:33,500 --> 00:14:36,500
braces, a lot of programming 
language do not have curly 

313
00:14:36,500 --> 00:14:38,100
braces. 
And yet I have seen some 

314
00:14:38,100 --> 00:14:40,100
developers say, well, if it 
doesn't have a curly brace, I 

315
00:14:40,100 --> 00:14:42,600
can't understand it. 
Then I just think that's silly. 

316
00:14:42,700 --> 00:14:45,300
That's just very limiting. 
The curly brace does not make a 

317
00:14:45,300 --> 00:14:47,900
big difference in the syntax of 
which that what the keywords are

318
00:14:47,900 --> 00:14:49,900
and stuff. 
That's not the important thing. 

319
00:14:49,900 --> 00:14:52,600
It's about expressing yourself. 
So, anyone who says that kind of

320
00:14:52,600 --> 00:14:54,200
stick, I just think they need to
get out more. 

321
00:14:54,200 --> 00:14:56,000
They need to try more different 
languages and learning. 

322
00:14:56,100 --> 00:14:58,700
In a bit, get out of their 
bubble and try some more things.

323
00:14:59,200 --> 00:15:02,100
So, let's move to the main topic
of today, which is aligned your 

324
00:15:02,100 --> 00:15:04,800
book dumb in modeling made 
functional these days. 

325
00:15:04,800 --> 00:15:07,400
A lot of crazy about domain 
driven design, functional 

326
00:15:07,400 --> 00:15:09,800
programming as well. 
A lot of people swear by it. 

327
00:15:09,900 --> 00:15:11,800
That's like the ultimate 
programming language. 

328
00:15:11,800 --> 00:15:14,200
I myself come from more 
object-oriented, programming 

329
00:15:14,200 --> 00:15:16,300
background. 
So, maybe in the first place, 

330
00:15:16,300 --> 00:15:18,100
right? 
Maybe if you can share with us, 

331
00:15:18,300 --> 00:15:20,800
what is the functional 
programming, why people should 

332
00:15:20,800 --> 00:15:23,600
maybe try to understand it? 
And why is it probably much 

333
00:15:23,600 --> 00:15:25,300
better in some respects to all 
people. 

334
00:15:26,100 --> 00:15:28,600
So first of all, there's no 
official definition of 

335
00:15:28,608 --> 00:15:31,500
functional programming. 
My definition is, it's a 

336
00:15:31,500 --> 00:15:35,900
programming style where you use 
functions to do everything in 

337
00:15:35,900 --> 00:15:39,100
object-oriented programming. 
The basic unit is a class and in

338
00:15:39,100 --> 00:15:41,600
functional programming. 
The basic unit is a function in 

339
00:15:41,600 --> 00:15:43,200
function program. 
If you want to change the 

340
00:15:43,200 --> 00:15:46,200
behavior of something, like the 
strategy pattern you pass in a 

341
00:15:46,200 --> 00:15:50,000
function, if you want to compose
a bigger set of functionality, 

342
00:15:50,000 --> 00:15:52,600
you combine two functions 
together, basically everything 

343
00:15:52,600 --> 00:15:56,000
you do is functions, you take 
these functions and you Chain 

344
00:15:56,000 --> 00:15:58,000
them together, typically into 
some sort of pipeline. 

345
00:15:58,500 --> 00:16:01,000
You might even have a function 
where the input is a function 

346
00:16:01,000 --> 00:16:03,200
and the output is a function. 
And so you might call that a 

347
00:16:03,208 --> 00:16:06,100
function Transformer. 
So you basically have some kind 

348
00:16:06,100 --> 00:16:07,700
of function and it doesn't do 
what you want. 

349
00:16:07,700 --> 00:16:10,300
So you want it to this function 
Transformer and it turns into a 

350
00:16:10,308 --> 00:16:12,900
different kind of function, 
which does do what you want. 

351
00:16:13,300 --> 00:16:16,300
So it's just a different way of 
thinking about how you build 

352
00:16:16,300 --> 00:16:18,100
software. 
Another part of functional 

353
00:16:18,100 --> 00:16:21,200
programming is also, 
immutability is typically the 

354
00:16:21,200 --> 00:16:24,100
default Behavior because in a 
classic mathematical function 

355
00:16:24,200 --> 00:16:27,700
things don't change. 
When you say two plus two, the 

356
00:16:27,700 --> 00:16:30,100
number two doesn't change when 
you add something to it. 

357
00:16:30,200 --> 00:16:32,400
You've got a new number back. 
You don't change the original 

358
00:16:32,400 --> 00:16:35,800
numbers and the same thing with 
dates when you add time to a 

359
00:16:35,800 --> 00:16:37,600
date, you don't modify the 
original date. 

360
00:16:37,800 --> 00:16:40,800
So if you apply that logic to 
everything, that nothing changes

361
00:16:40,800 --> 00:16:42,100
and you always create new 
things. 

362
00:16:42,400 --> 00:16:44,700
It makes understanding the 
program a lot easier because you

363
00:16:44,700 --> 00:16:47,000
always know that the things that
you've worked on, haven't been 

364
00:16:47,000 --> 00:16:48,800
touched, and you've always got 
new things to work on. 

365
00:16:49,200 --> 00:16:51,400
So, the combination of work 
using functions everywhere and 

366
00:16:51,400 --> 00:16:53,800
having immutability. 
It's a very hard thing to get 

367
00:16:53,800 --> 00:16:55,400
your head around when you first 
start learning. 

368
00:16:55,800 --> 00:16:57,700
Programming. 
It's really, it's weird. 

369
00:16:58,000 --> 00:16:59,800
I mean, when I first started 
learning I've shot by was 

370
00:16:59,800 --> 00:17:01,500
thinking, how can you write any 
code? 

371
00:17:01,500 --> 00:17:03,800
When everything is the musical? 
That's just not possible. 

372
00:17:04,099 --> 00:17:06,599
And then, yeah, if she turns 
out, you can and turns out 

373
00:17:06,599 --> 00:17:09,200
that's not too hard. 
And then how can you do things 

374
00:17:09,200 --> 00:17:12,000
without using classes? 
How many wider program with you?

375
00:17:12,000 --> 00:17:15,200
You see classes and methods? 
Well, it turns out you can, so 

376
00:17:15,200 --> 00:17:17,400
it's definitely another way of 
expanding your mind. 

377
00:17:17,900 --> 00:17:19,300
So why is functional program? 
Now? 

378
00:17:19,300 --> 00:17:20,900
Like I said, I love of Georgia 
programming. 

379
00:17:21,099 --> 00:17:23,500
As I said, I used to do a lot of
small talk, then I love small 

380
00:17:23,500 --> 00:17:27,000
talk, but I think from Modern. 
Enterprise programming, 

381
00:17:27,000 --> 00:17:29,500
specially, functional 
programming because of this 

382
00:17:29,500 --> 00:17:31,700
immutability and because the 
composition, there's no 

383
00:17:31,700 --> 00:17:35,000
inheritance and so, everything 
tends to be very explicit. 

384
00:17:35,000 --> 00:17:38,300
Every parameter is passed in 
explicitly with class based 

385
00:17:38,300 --> 00:17:40,800
programming. 
There's a lot of implicit code. 

386
00:17:40,800 --> 00:17:42,900
I mean, you could have a methods
with no parameters. 

387
00:17:43,200 --> 00:17:46,000
It returns void and has no 
parameters behind the scenes. 

388
00:17:46,000 --> 00:17:48,900
It's doing things because it's 
using instance variables or 

389
00:17:48,900 --> 00:17:51,100
something, but you can't really 
see what it's doing. 

390
00:17:51,100 --> 00:17:52,600
And that's the whole point of 
all going to probe. 

391
00:17:52,600 --> 00:17:54,700
The whole point of object when 
it is encapsulation. 

392
00:17:55,000 --> 00:17:58,000
You're supposed to I doubt it's 
working, but I think functional 

393
00:17:58,000 --> 00:17:59,500
programming is the opposite, the
ideas. 

394
00:17:59,500 --> 00:18:02,300
Everything's transparent. 
Everything is exposed. 

395
00:18:02,700 --> 00:18:05,700
There's no hidden data, and you 
might think well, that's a bad 

396
00:18:05,700 --> 00:18:06,800
thing. 
There's no hidden data. 

397
00:18:06,800 --> 00:18:09,600
But again, if everything is 
immutable exposing it tends not 

398
00:18:09,600 --> 00:18:11,500
to be that bad because you can't
change it. 

399
00:18:11,500 --> 00:18:14,200
Obviously, things like apis as a
different thing in general, when

400
00:18:14,200 --> 00:18:16,500
you're coding, if everything's 
immutable, it doesn't really 

401
00:18:16,500 --> 00:18:18,000
matter. 
If people can see the internals 

402
00:18:18,000 --> 00:18:19,400
of an object because they can't 
change. 

403
00:18:20,200 --> 00:18:22,800
And one aspect of immutability 
that I understand as well. 

404
00:18:22,800 --> 00:18:24,500
Right? 
So if everywhere it's immutable,

405
00:18:24,600 --> 00:18:26,800
it also supports For concurrency
really? 

406
00:18:26,800 --> 00:18:29,500
Well, so you don't have side 
effects and you don't have to 

407
00:18:29,500 --> 00:18:32,600
worry about multiple processes, 
accessing the same instance. 

408
00:18:33,400 --> 00:18:34,200
Yes. 
Exactly. 

409
00:18:34,200 --> 00:18:36,300
Although I have to say it's a 
little bit overblown. 

410
00:18:36,700 --> 00:18:38,500
But I mean, that was one of the 
things they hyped up about 

411
00:18:38,500 --> 00:18:40,400
functional programming, is it to
concurrency really? 

412
00:18:40,400 --> 00:18:44,500
Well, they did processing really
well which it does but even if 

413
00:18:44,500 --> 00:18:47,300
it didn't I don't think that's 
the main reason to use it. 

414
00:18:47,300 --> 00:18:49,300
I think the main reason is 
because the programs that you 

415
00:18:49,300 --> 00:18:51,500
write with functional programs. 
I think they're just going to be

416
00:18:51,500 --> 00:18:54,500
a lot clearer and easier to 
understand sometimes with 

417
00:18:54,500 --> 00:18:57,400
objects. 
To get what I call object soup 

418
00:18:57,600 --> 00:18:59,800
where an object is talking to 
another object which is talking 

419
00:18:59,800 --> 00:19:01,800
to another object which is 
talking to the first object. 

420
00:19:01,900 --> 00:19:03,700
All these objects are talking to
each other and it's really hard 

421
00:19:03,700 --> 00:19:06,000
to disentangle. 
Them should ever debug something

422
00:19:06,000 --> 00:19:07,300
like that. 
It's really painful. 

423
00:19:07,400 --> 00:19:09,100
There's nothing in 
object-oriented program that 

424
00:19:09,100 --> 00:19:10,700
stops you doing that. 
There's no pressure. 

425
00:19:11,100 --> 00:19:13,000
It's always easy. 
Just to add another method. 

426
00:19:13,200 --> 00:19:14,700
Functional programming is 
somehow. 

427
00:19:14,700 --> 00:19:17,300
It doesn't quite do that because
the pressure is to keep things. 

428
00:19:17,300 --> 00:19:19,700
Simple, when every single 
parameter is passed in, it's 

429
00:19:19,700 --> 00:19:21,100
really hard to have 100 
parameters. 

430
00:19:21,500 --> 00:19:24,000
There's a natural pressure to 
keep things simple and make 

431
00:19:24,000 --> 00:19:25,600
small components that are glued 
together. 

432
00:19:25,700 --> 00:19:27,800
Heather. 
So, again, about concurrency 

433
00:19:27,800 --> 00:19:29,400
stuff. 
I just think function program is

434
00:19:29,400 --> 00:19:31,700
a really nice technique. 
That's not the only technique. 

435
00:19:32,000 --> 00:19:34,300
One of the things I like about 
our shop is it actually has an 

436
00:19:34,300 --> 00:19:35,600
object-oriented component as 
well? 

437
00:19:36,300 --> 00:19:39,500
So you can actually choose, 
which ever is the best Paradigm.

438
00:19:39,800 --> 00:19:42,200
Sometimes I'll get audited, is 
actually the right Paradigm for 

439
00:19:42,200 --> 00:19:44,100
certain things. 
And so it's nice to be able to 

440
00:19:44,100 --> 00:19:46,200
have a language which supports 
both and you can just switch 

441
00:19:46,200 --> 00:19:48,200
between them. 
But typically I would call 

442
00:19:48,200 --> 00:19:50,900
myself a functional first 
program in, which is I start by 

443
00:19:50,900 --> 00:19:53,800
doing functional and if that 
doesn't work properly or it 

444
00:19:53,808 --> 00:19:58,100
doesn't feel right then, I 
switch to When do you see this? 

445
00:19:58,100 --> 00:20:01,000
As the Tipping Point when you 
started as a functional first, 

446
00:20:01,000 --> 00:20:03,500
but then what made you switch to
the ob Paradigm? 

447
00:20:03,500 --> 00:20:06,100
What do you think are some of 
the good problems with to solve 

448
00:20:06,100 --> 00:20:08,400
my old pee? 
Well, if you really talk about 

449
00:20:08,400 --> 00:20:11,400
Behavior, if you really do want 
to encapsulate, if I have a 

450
00:20:11,400 --> 00:20:14,600
bunch of things and I don't care
about the data. 

451
00:20:14,600 --> 00:20:17,900
I only care about the behavior, 
then that's what LLP is really 

452
00:20:17,900 --> 00:20:19,800
good for. 
If you think about agent BAE 

453
00:20:19,800 --> 00:20:23,900
Systems, agents are basically 
oop just very similar model, 

454
00:20:24,200 --> 00:20:25,600
especially if you're doing a 
user. 

455
00:20:25,700 --> 00:20:27,200
Face or something of your 
origin. 

456
00:20:27,200 --> 00:20:28,900
Interfaces is so nice thing 
because, you know, they're 

457
00:20:28,900 --> 00:20:32,000
button class and a listbox floss
and I think they all have 

458
00:20:32,000 --> 00:20:34,000
basically the same behavior you 
want to click on them. 

459
00:20:34,200 --> 00:20:36,200
So that of your origin program 
is wait for that. 

460
00:20:36,400 --> 00:20:39,500
Graphical, programming objects 
are great for agent, based 

461
00:20:39,500 --> 00:20:42,400
programming the goods. 
Sometimes I say where you have a

462
00:20:42,400 --> 00:20:44,700
kind of plug-in model and you 
don't actually care how its 

463
00:20:44,700 --> 00:20:46,700
implemented. 
So it is useful. 

464
00:20:46,800 --> 00:20:49,200
In those cases. 
I do mix and match between the 

465
00:20:49,200 --> 00:20:51,200
same piece of code. 
And sometimes you really do want

466
00:20:51,200 --> 00:20:52,200
it. 
Sometimes it's really nice to 

467
00:20:52,200 --> 00:20:55,200
have inheritance occasionally 
not massive deep in her in the 

468
00:20:55,208 --> 00:20:57,900
street. 
They sometimes nice a base class

469
00:20:57,900 --> 00:21:00,300
with a couple of sub classes 
that inherit from it. 

470
00:21:00,500 --> 00:21:02,000
Sometimes it's just nice to have
that. 

471
00:21:02,500 --> 00:21:06,300
So in domain-driven design most 
of the literature that I read 

472
00:21:06,300 --> 00:21:10,300
actually they used the or Ps. 
Ml sample reference, you and 

473
00:21:10,300 --> 00:21:12,900
came out with a book domain 
modeling meet functional, which 

474
00:21:12,900 --> 00:21:16,200
is kind of unique in a sense. 
So what made you think that the 

475
00:21:16,200 --> 00:21:19,300
domain modeling can also be 
solved by functional programming

476
00:21:19,300 --> 00:21:21,600
Paradigm? 
This is very interesting because

477
00:21:21,600 --> 00:21:24,500
you're quite right, that domain 
driven design is not attached to

478
00:21:24,500 --> 00:21:26,700
any particular programming. 
In Paradigm, it really shouldn't

479
00:21:26,700 --> 00:21:29,700
be domain-driven design. 
The idea is that you focus on 

480
00:21:29,700 --> 00:21:32,100
the domain instead of the 
technology. 

481
00:21:32,700 --> 00:21:35,400
So you try and focus up, use the
words from the domain. 

482
00:21:35,600 --> 00:21:37,700
You try and model The Domain in 
the code. 

483
00:21:37,900 --> 00:21:40,800
And you try not to contaminate 
your domain with all sorts of 

484
00:21:40,800 --> 00:21:42,700
technical stuff, which is not 
relevant to people. 

485
00:21:43,100 --> 00:21:45,600
So the got nothing to do with 
which programming Paradigm use. 

486
00:21:46,000 --> 00:21:48,900
But one of the nice things about
functional programming is 

487
00:21:48,900 --> 00:21:51,500
because in object order program,
it's very easy to have a lot of 

488
00:21:51,500 --> 00:21:55,500
extra complexity or what people 
ceremony, extra stuff like that.

489
00:21:55,700 --> 00:21:58,800
Sauces and all this stuff, and 
it's quite easy to end up with 

490
00:21:58,800 --> 00:22:01,100
code, which has a lot of stuff 
in it, which isn't really part 

491
00:22:01,100 --> 00:22:02,800
of the domain. 
So, you have a base class. 

492
00:22:03,200 --> 00:22:05,300
We're in the real world. 
You don't have base classes. 

493
00:22:05,600 --> 00:22:08,200
You don't have proxy classes. 
You don't have manager classes. 

494
00:22:08,600 --> 00:22:11,100
You don't have interfaces The 
Real World objects do not have 

495
00:22:11,100 --> 00:22:14,300
that in functional programming. 
It tends to be a lot simpler 

496
00:22:14,300 --> 00:22:15,900
because ocean foam doesn't have 
classes. 

497
00:22:15,900 --> 00:22:18,600
So then that stuff happens, it 
basically has data and it has 

498
00:22:18,600 --> 00:22:22,100
actions on the data. 
I think also lot of people, when

499
00:22:22,100 --> 00:22:25,900
they do domain with a focus on 
the data side of things, And you

500
00:22:25,900 --> 00:22:28,400
often have database driven 
design where you start with the 

501
00:22:28,400 --> 00:22:30,500
database tables and you work 
back from there. 

502
00:22:31,000 --> 00:22:33,100
I think what's happened is 
people have realized in what 

503
00:22:33,100 --> 00:22:35,800
businesses care about analyzing 
a real system. 

504
00:22:36,000 --> 00:22:38,400
It's the events. 
It's the actions. 

505
00:22:38,400 --> 00:22:41,100
It's the workflows the 
activities. 

506
00:22:41,300 --> 00:22:43,800
These are the things that are 
actually important and the data 

507
00:22:43,800 --> 00:22:45,600
is just a way of transferring 
stuff. 

508
00:22:45,800 --> 00:22:48,400
But the activities you want to 
model an activity. 

509
00:22:48,400 --> 00:22:50,800
You can model is something with 
an input, you send me this 

510
00:22:50,800 --> 00:22:53,300
letter and I do this action. 
You send me an e-mail or you 

511
00:22:53,300 --> 00:22:54,600
create this event and I do 
something. 

512
00:22:54,900 --> 00:22:57,300
A function is Jackie, that's an 
input and output. 

513
00:22:57,700 --> 00:23:00,400
So functions are actually very 
good for the main model. 

514
00:23:00,800 --> 00:23:03,100
Now, there's another thing which
applies to certain functional. 

515
00:23:03,100 --> 00:23:06,100
Programming languages namely the
statically typed ones. 

516
00:23:06,200 --> 00:23:10,700
So not things like closure, the 
things like F sharp a camel Elm.

517
00:23:11,000 --> 00:23:13,900
They have a type system, which 
is very different from an object

518
00:23:13,900 --> 00:23:16,200
oriented type system in the 
functional. 

519
00:23:16,200 --> 00:23:18,600
Programming type system. 
This is called an algebraic type

520
00:23:18,600 --> 00:23:20,900
system or a composable type 
system. 

521
00:23:21,400 --> 00:23:24,300
You can actually build bigger 
types from smaller types in a 

522
00:23:24,308 --> 00:23:26,800
couple of different ways. 
But one of the ways you can do 

523
00:23:26,800 --> 00:23:30,200
it is you can do it as a choice.
So you could say this thing is, 

524
00:23:30,200 --> 00:23:32,200
a choice between this thing or 
this other thing. 

525
00:23:32,500 --> 00:23:34,000
Think of it, kind of like an 
enum. 

526
00:23:34,100 --> 00:23:36,800
The glorified enum. 
I mean most audio two languages 

527
00:23:36,800 --> 00:23:39,000
do not have this. 
It turns out this Choice 

528
00:23:39,000 --> 00:23:41,300
modeling is super important for 
most of Maine's. 

529
00:23:41,300 --> 00:23:44,000
If I say, I'll send you an 
e-mail or I will send you a 

530
00:23:44,000 --> 00:23:47,400
letter that's a choice. 
I want a model that choice and 

531
00:23:47,400 --> 00:23:50,000
it's actually surprisingly hard 
then obviously to language and 

532
00:23:50,000 --> 00:23:51,800
you can have two different 
subclasses, but it's kind of 

533
00:23:51,800 --> 00:23:55,100
painful in a functional language
with an algebraic type system is

534
00:23:55,100 --> 00:23:57,300
actually really. 
See, so a lot of my book is 

535
00:23:57,300 --> 00:24:00,200
actually talking about modeling 
things with the type system, 

536
00:24:00,500 --> 00:24:04,200
just modeling things as choices,
and then as record types, which 

537
00:24:04,200 --> 00:24:06,500
is very common and then these 
functions with inputs and 

538
00:24:06,500 --> 00:24:08,300
outputs. 
So I think there's a very good 

539
00:24:08,300 --> 00:24:11,100
match for functional. 
Programming, one aspect of the 

540
00:24:11,100 --> 00:24:13,900
domain driven design is actually
what they call tactical design. 

541
00:24:13,900 --> 00:24:17,300
So, these are things like design
patterns commonly used in DD 

542
00:24:17,300 --> 00:24:20,800
things, like entity aggregate 
value object service repository.

543
00:24:20,800 --> 00:24:24,100
And there's so many others and 
normally they kind of like being

544
00:24:24,100 --> 00:24:27,200
modeled as Opie. 
That was also the Paradigm that 

545
00:24:27,200 --> 00:24:29,800
stick to it my head. 
So when you implement those kind

546
00:24:29,800 --> 00:24:32,600
of tactical design in functional
programming, maybe you can give 

547
00:24:32,600 --> 00:24:35,000
some examples. 
How can you really design at the

548
00:24:35,008 --> 00:24:37,600
d-class of an aggregate class in
f p? 

549
00:24:38,500 --> 00:24:42,500
So a lot of those things I think
do, apply only the very object 

550
00:24:42,500 --> 00:24:45,500
oriented these low level domain 
driven design things like 

551
00:24:45,500 --> 00:24:50,300
entities language value objects 
in DD is an object where if you 

552
00:24:50,300 --> 00:24:53,100
have a different object with the
same data in it, it's the same 

553
00:24:53,100 --> 00:24:56,200
thing. 
So if you have to address, Data 

554
00:24:56,200 --> 00:24:58,500
structures and they have the 
exactly the same address data in

555
00:24:58,500 --> 00:24:59,900
them. 
They're the same address. 

556
00:25:00,500 --> 00:25:02,000
And what's interesting in 
functional programming. 

557
00:25:02,000 --> 00:25:04,400
That's the default in 
object-oriented programming. 

558
00:25:04,400 --> 00:25:06,600
That is not the default in 
object-oriented programming, 

559
00:25:06,600 --> 00:25:08,500
every object is a different 
reference. 

560
00:25:08,900 --> 00:25:11,700
So if you want to make two 
things equal, you have to 

561
00:25:11,700 --> 00:25:14,800
override the equals method and 
the get hashcode method and all 

562
00:25:14,800 --> 00:25:16,700
this other stuff and in 
functional, programming 

563
00:25:16,700 --> 00:25:18,200
languages, that's the exact 
opposite. 

564
00:25:18,400 --> 00:25:21,000
So that's nice. 
And then in object-oriented 

565
00:25:21,000 --> 00:25:23,900
programming entities are 
considered to be mutable objects

566
00:25:24,200 --> 00:25:25,400
in functional programming. 
They're not. 

567
00:25:25,600 --> 00:25:27,800
Immutable obviously. 
So really, they just objects 

568
00:25:27,800 --> 00:25:30,500
where there's an ID. 
They have something ID field so 

569
00:25:30,500 --> 00:25:33,100
that as you change them they 
have the same identity. 

570
00:25:33,200 --> 00:25:34,800
I don't like having all this. 
Jargon. 

571
00:25:34,800 --> 00:25:37,200
I think it takes away from 
making people understand these 

572
00:25:37,200 --> 00:25:39,400
things, but you can totally do 
the same things. 

573
00:25:39,700 --> 00:25:41,700
Things like the concept of 
service, which provides a 

574
00:25:41,708 --> 00:25:43,500
service. 
That's not special to any 

575
00:25:43,500 --> 00:25:46,200
particular programming language.
One thing I should point out 

576
00:25:46,200 --> 00:25:48,000
though. 
Is this repository pattern, 

577
00:25:48,000 --> 00:25:51,300
which is used in domain-driven 
design is actually used outside 

578
00:25:51,300 --> 00:25:55,100
of domain driven design, people 
almost never use that in 

579
00:25:55,100 --> 00:25:57,800
function. 
Going so it's very common in 

580
00:25:57,800 --> 00:26:02,000
object-oriented programming to 
mix up database, access and code

581
00:26:02,000 --> 00:26:04,300
and business logic. 
You might have an object that 

582
00:26:04,300 --> 00:26:06,600
saves itself. 
You might have a save method on 

583
00:26:06,600 --> 00:26:08,900
an object which saves itself to 
the database. 

584
00:26:08,900 --> 00:26:12,400
That's a very common style. 
This used in C sharp with Entity

585
00:26:12,400 --> 00:26:14,700
framework and with python with 
Django. 

586
00:26:14,700 --> 00:26:17,700
And so on in functional programs
that we can be considered an 

587
00:26:17,700 --> 00:26:20,100
anti-pattern that would be 
considered a really bad thing to

588
00:26:20,100 --> 00:26:21,900
do. 
Because in functional program, 

589
00:26:21,900 --> 00:26:25,400
we tend to separate predictable 
stuff from unpredictable stuff. 

590
00:26:25,600 --> 00:26:29,000
Of deterministic code from 
non-deterministic code. 

591
00:26:29,200 --> 00:26:32,400
What we called Pure function is 
a function that always gives the

592
00:26:32,408 --> 00:26:34,800
same result with the same input.
It always give the same result. 

593
00:26:34,800 --> 00:26:37,300
So adding two numbers together, 
always gives the same result. 

594
00:26:37,500 --> 00:26:40,600
Now, reading something from a 
database is not like that. 

595
00:26:40,600 --> 00:26:42,800
If I read from the database 
again, I might get a completely 

596
00:26:42,800 --> 00:26:45,200
different set of data. 
So, in a functional program, we 

597
00:26:45,200 --> 00:26:48,100
hate that we hate having 
unpredictable data. 

598
00:26:48,600 --> 00:26:52,000
So what we tend to do in Fontana
program is separate anything to 

599
00:26:52,000 --> 00:26:56,200
do with databases or file system
or network, which And move it 

600
00:26:56,200 --> 00:26:57,800
outside the Core Business. 
Logic. 

601
00:26:58,100 --> 00:27:00,000
So we have this Core Business 
logic in the middle. 

602
00:27:00,400 --> 00:27:04,100
And anything to do with the 
outside world is on the edges of

603
00:27:04,100 --> 00:27:06,600
the application typical 
examples, you might load up some

604
00:27:06,600 --> 00:27:08,800
data from the database. 
And then you do all this 

605
00:27:08,800 --> 00:27:11,300
business logic and then you save
some data back to the database 

606
00:27:11,300 --> 00:27:14,000
of the end. 
So the database stuff is on the 

607
00:27:14,000 --> 00:27:16,400
outside and then the Core 
Business logic is in the middle.

608
00:27:16,500 --> 00:27:19,200
So it's completely opposite from
the classic interior 

609
00:27:19,200 --> 00:27:21,600
architecture where you have the 
database layer at the bottom. 

610
00:27:22,100 --> 00:27:24,500
In the function program, the 
databases on the outside, not on

611
00:27:24,500 --> 00:27:26,300
the inside. 
This is not necessarily a 

612
00:27:26,300 --> 00:27:28,600
functional, programming thing. 
People have been talking about 

613
00:27:28,600 --> 00:27:30,800
this in other architectures. 
There's the ports and depth 

614
00:27:30,800 --> 00:27:34,000
architecture. 
There is the onion architecture 

615
00:27:34,000 --> 00:27:36,100
that clean architecture. 
The hexagonal architecture. 

616
00:27:36,100 --> 00:27:38,400
All these things is to try and 
keep the domain logic in the 

617
00:27:38,400 --> 00:27:41,200
middle and keep the rest of the 
world on the outside. 

618
00:27:41,400 --> 00:27:43,800
There's another way of saying 
which is an imperative shell and

619
00:27:43,800 --> 00:27:46,500
a functional called as taught by
Gary Bernhardt on that topic. 

620
00:27:46,800 --> 00:27:49,000
So what's interesting is in 
object oriented. 

621
00:27:49,000 --> 00:27:52,300
People have to be encouraged to 
do this, but in functional 

622
00:27:52,300 --> 00:27:55,100
programming, it happens 
automatically, it's the default 

623
00:27:55,100 --> 00:27:57,000
Behavior. 
So you don't really have to try 

624
00:27:57,000 --> 00:27:59,200
and persuade people to do it 
this because this is really the 

625
00:27:59,200 --> 00:28:01,700
only way of doing it. 
So I think one of the reasons 

626
00:28:01,700 --> 00:28:03,500
going back to why I think 
functional programming is quite 

627
00:28:03,500 --> 00:28:06,600
nice, is that there are some 
languages where you can do 

628
00:28:06,600 --> 00:28:09,700
something, but it doesn't really
encourage you to do the right 

629
00:28:09,700 --> 00:28:11,600
thing. 
The language can let you get 

630
00:28:11,600 --> 00:28:13,200
away with all sorts of terrible 
things. 

631
00:28:13,500 --> 00:28:15,100
So for example, let's talk about
C. 

632
00:28:15,100 --> 00:28:18,600
So C you can be very cautious 
with your memory management and 

633
00:28:18,600 --> 00:28:20,900
your bounds checking stuff, but 
the language doesn't work, 

634
00:28:20,900 --> 00:28:23,000
doesn't really encourage you to 
do bounds checking. 

635
00:28:23,000 --> 00:28:24,600
There's nothing in it, which 
forces you to do. 

636
00:28:25,000 --> 00:28:26,800
So. 
It's very easy to make mistakes.

637
00:28:27,100 --> 00:28:29,800
So I like a language where 
you're really kind of forced to 

638
00:28:29,800 --> 00:28:32,300
do the right thing. 
So a language which is immutable

639
00:28:32,300 --> 00:28:34,100
and doesn't let you do database 
stuff. 

640
00:28:34,400 --> 00:28:36,800
It kind of forces you to keep 
the database stuff separate from

641
00:28:36,800 --> 00:28:39,400
that Core Business logic. 
And so that's what I like about 

642
00:28:39,400 --> 00:28:41,300
functional languages. 
They really encourage you to 

643
00:28:41,300 --> 00:28:44,100
write code in a certain way. 
Nothing that you couldn't do and

644
00:28:44,100 --> 00:28:46,200
I'll be Odin language, but 
somehow it just seems easier 

645
00:28:46,200 --> 00:28:47,500
when you're using functional 
style. 

646
00:28:47,600 --> 00:28:51,300
I don't know why that is so I'll
be bubble half wrap their head 

647
00:28:51,300 --> 00:28:53,900
around these paradigms. 
I think it makes it intuitive 

648
00:28:53,900 --> 00:28:55,400
another aspect that I want to 
ask. 

649
00:28:55,600 --> 00:28:57,600
Because it seems very 
interesting topic and 

650
00:28:57,600 --> 00:28:59,900
domain-driven design is the 
concept of transactional 

651
00:28:59,900 --> 00:29:03,200
boundary in dddd. 
Advocate aggregate should be the

652
00:29:03,200 --> 00:29:06,000
scope of the transaction. 
So how do you actually do this 

653
00:29:06,000 --> 00:29:08,600
in FP with just now, when you 
mentioned predictable, pictures 

654
00:29:08,600 --> 00:29:10,900
and predictable? 
Where is that layer for the 

655
00:29:10,900 --> 00:29:13,700
transaction part? 
Well, let me just about to 

656
00:29:13,700 --> 00:29:16,400
boundaries of their all into my 
rooms on the first boundary 

657
00:29:16,600 --> 00:29:18,500
this, what they call a bounded 
context. 

658
00:29:18,700 --> 00:29:21,600
The idea of about a contest is 
you break your program into 

659
00:29:21,600 --> 00:29:25,200
subsystems, but each subsystem 
does one thing. 

660
00:29:25,200 --> 00:29:27,700
Well, Well, it's kind of like a 
giant object everything in the 

661
00:29:27,700 --> 00:29:31,000
sub system uses the same 
terminology works in the same 

662
00:29:31,000 --> 00:29:32,700
way. 
Again, it sounds really obvious.

663
00:29:32,700 --> 00:29:34,400
But it's very easy to write 
systems. 

664
00:29:34,400 --> 00:29:36,400
I have seen lots of big systems 
where everything's kind of 

665
00:29:36,400 --> 00:29:39,600
Tangled together and you have 
pieces of codes that they all 

666
00:29:39,600 --> 00:29:42,000
interact in a big mess, big ball
of mugs. 

667
00:29:42,600 --> 00:29:46,200
And so that's the first thing is
to have these bad a context and 

668
00:29:46,200 --> 00:29:49,500
then within a band of context do
want to guarantee that certain 

669
00:29:49,500 --> 00:29:51,700
constraints or Integrity the 
met. 

670
00:29:52,100 --> 00:29:54,300
So if you have an order, 
something you want to make sure 

671
00:29:54,300 --> 00:29:57,800
that the price Charging is the 
sum of the prices of the items. 

672
00:29:58,200 --> 00:30:00,600
Are you want to make sure that 
an email address always has 

673
00:30:00,600 --> 00:30:03,000
intact sign or something that's 
various rules about things. 

674
00:30:03,600 --> 00:30:05,500
You can just enforce that with a
function. 

675
00:30:05,500 --> 00:30:07,900
And again, if you have an input 
and output, you can just say, 

676
00:30:07,900 --> 00:30:10,600
well the only way you can change
this thing is through this one 

677
00:30:10,600 --> 00:30:12,600
function. 
I think this is because it's 

678
00:30:12,600 --> 00:30:16,300
very common with a mutable 
object because you can mutate 

679
00:30:16,300 --> 00:30:19,200
any of the fields. 
It's very easy to mutate one 

680
00:30:19,200 --> 00:30:22,500
field and then forget to mutate 
one of the other fields, and 

681
00:30:22,500 --> 00:30:25,100
that might be wrong. 
There might be some sort of a 

682
00:30:25,100 --> 00:30:26,500
strange. 
Ain't that if you do this thing,

683
00:30:26,500 --> 00:30:27,900
this other thing also has to 
happen. 

684
00:30:28,200 --> 00:30:31,300
So if you have immutable data, 
you can't have that problem. 

685
00:30:31,800 --> 00:30:35,600
If you can't mutate values, then
once it's correct, then it can 

686
00:30:35,600 --> 00:30:37,900
never ever change. 
Very simple example. 

687
00:30:37,900 --> 00:30:41,000
If I have an email object. 
When I create this email object,

688
00:30:41,000 --> 00:30:43,100
I validate that it has an at 
sign or whatever. 

689
00:30:43,600 --> 00:30:47,100
Once I've created it. 
It's immutable I never ever have

690
00:30:47,100 --> 00:30:50,000
to check it ever again. 
There's nobody can mess it up. 

691
00:30:50,100 --> 00:30:53,400
So I don't ever have to worry 
about revalidating it or 

692
00:30:53,400 --> 00:30:56,700
double-checking it or so on. 
This immutable, it can never 

693
00:30:56,700 --> 00:30:58,700
ever be changed. 
So he actually ends up with a 

694
00:30:58,700 --> 00:31:01,700
lot less defensive programming. 
If you have immutable data, you 

695
00:31:01,700 --> 00:31:05,000
typically validate things at the
very beginning that the edges of

696
00:31:05,000 --> 00:31:06,700
your program. 
And then once you're inside your

697
00:31:06,708 --> 00:31:10,000
program, you basically trusted. 
It's all valid because it can't 

698
00:31:10,000 --> 00:31:13,100
possibly be changed so that even
applies to bigger things. 

699
00:31:13,400 --> 00:31:15,700
But if you have a thing where if
you change this field, this 

700
00:31:15,700 --> 00:31:18,500
other field has to change at the
same time in an object-oriented 

701
00:31:18,500 --> 00:31:21,900
thing where they're two separate
fields that would be card to 

702
00:31:22,000 --> 00:31:25,100
enforce but if the only way to 
change it is through this 

703
00:31:25,100 --> 00:31:27,000
special. 
The function and the function 

704
00:31:27,000 --> 00:31:30,200
changes both things at the same 
time and spits out a new one 

705
00:31:30,500 --> 00:31:32,700
which is valid. 
And if the things aren't 

706
00:31:32,700 --> 00:31:35,700
correct, it returns nothing. 
You've always got a valid piece 

707
00:31:35,700 --> 00:31:38,000
of data. 
So, a lot of these things about 

708
00:31:38,000 --> 00:31:39,500
integrity, constraints and 
stuff. 

709
00:31:39,900 --> 00:31:42,400
It's really easy to do. 
It's not even that big a deal. 

710
00:31:42,600 --> 00:31:44,800
It's not something you have to 
make an extra effort to work on 

711
00:31:44,800 --> 00:31:45,800
because that's just the kind of 
way. 

712
00:31:45,800 --> 00:31:46,700
It works. 
Naturally. 

713
00:31:47,000 --> 00:31:48,300
Again. 
This is where the program 

714
00:31:48,300 --> 00:31:51,000
Paradigm encourages you to write
stuff in a certain way. 

715
00:31:51,200 --> 00:31:52,500
Okay, then I'll join the 
program. 

716
00:31:52,500 --> 00:31:55,400
You can have a class where you 
can only set things. 

717
00:31:55,500 --> 00:31:57,800
Instructor a none of the fields 
are mutable. 

718
00:31:58,100 --> 00:32:00,200
And if you want to change any of
the fields, you have to create a

719
00:32:00,208 --> 00:32:02,600
user Factory method or 
something, which validates, 

720
00:32:02,600 --> 00:32:06,400
everything you can totally write
code that way in 0 as well, but 

721
00:32:06,400 --> 00:32:09,800
it just kind of feels it's hard.
It's like you're going against 

722
00:32:09,800 --> 00:32:12,100
the way the language works. 
The language doesn't make it 

723
00:32:12,100 --> 00:32:14,700
easy for you to do that. 
It's not specific to functional 

724
00:32:14,700 --> 00:32:17,400
programming but I do think it's 
the way that functional 

725
00:32:17,400 --> 00:32:20,000
programmers. 
Think about these problems Maps,

726
00:32:20,000 --> 00:32:23,400
very nicely onto this kind of 
issue in the book that you're 

727
00:32:23,400 --> 00:32:27,200
chose F sharp as the Language to
express your thoughts. 

728
00:32:27,400 --> 00:32:30,400
You also create your website, 
F-sharp for Fun and Profit. 

729
00:32:30,600 --> 00:32:32,700
Maybe you can tell us why F 
sharp. 

730
00:32:32,700 --> 00:32:35,700
Why people should use F sharp 
instead of closure and all the 

731
00:32:35,700 --> 00:32:39,200
other functional programming. 
Well, I think F sharp is a very 

732
00:32:39,200 --> 00:32:42,700
nice multi-paradigm language. 
Educated depends on the 

733
00:32:42,700 --> 00:32:44,000
environment. 
You're working a bit of time. 

734
00:32:44,000 --> 00:32:46,200
Talking about typical business 
applications for Enterprise 

735
00:32:46,200 --> 00:32:49,000
stuff. 
First of all, I would say it's 

736
00:32:49,000 --> 00:32:51,800
nice to have a statically typed 
language and if you're working 

737
00:32:51,800 --> 00:32:53,700
by yourself, that's fine, but I 
think statically. 

738
00:32:53,700 --> 00:32:55,900
Typed languages are definitely 
the way to go if you A team of 

739
00:32:55,900 --> 00:32:58,400
people, so that eliminates 
closure and so on. 

740
00:32:58,700 --> 00:33:01,000
And then, in terms of the 
statically, typed functional 

741
00:33:01,000 --> 00:33:04,500
languages, you have Haskell. 
You have, oh camel you have Elm.

742
00:33:04,600 --> 00:33:07,000
They have F sharp what I like 
about their shop. 

743
00:33:07,000 --> 00:33:09,600
Is, it's on a big platform. 
It's on the.net platform. 

744
00:33:10,000 --> 00:33:12,500
For people who don't know, 
dotnet actually runs on Linux 

745
00:33:12,500 --> 00:33:14,300
really? 
Well, it's no longer a Windows 

746
00:33:14,300 --> 00:33:17,700
only thing and because it's only
on.net, any kind of thing you 

747
00:33:17,700 --> 00:33:21,100
want to interface with, there's 
a dotnet API for it probably or 

748
00:33:21,100 --> 00:33:24,600
donut library and you can just 
plug that into a shop and go so 

749
00:33:24,600 --> 00:33:27,200
you don't have to Write your own
libraries all the time. 

750
00:33:27,600 --> 00:33:29,300
So, just in terms of 
productivity. 

751
00:33:29,700 --> 00:33:32,100
I just think it's my favorite 
language would being productive.

752
00:33:32,100 --> 00:33:34,000
It's also got extremely good 
tooling. 

753
00:33:34,400 --> 00:33:36,600
Most of the function languages 
do not have as good to link. 

754
00:33:36,800 --> 00:33:38,900
The obturator languages don't 
have much better Tooling in 

755
00:33:38,908 --> 00:33:41,500
general, but I would say of the 
function languages have shot, 

756
00:33:41,500 --> 00:33:44,500
probably has the best Tooling in
terms of refactoring and then 

757
00:33:44,500 --> 00:33:45,500
the editor hints. 
And so on. 

758
00:33:45,508 --> 00:33:49,500
There's a very nice plug in 4 vs
code called iron, I'd Visual 

759
00:33:49,500 --> 00:33:53,000
Studio supports F sharp out of 
the box and jetbrains Rider 

760
00:33:53,100 --> 00:33:56,800
supports shot out of the box. 
So it's just a very nice 

761
00:33:56,800 --> 00:33:59,600
experience a language. 
Like Haskell is a very, very 

762
00:33:59,600 --> 00:34:02,900
powerful language, but it really
does hurt your brain, because 

763
00:34:02,900 --> 00:34:06,100
it's so strict about 
immutability and strict about 

764
00:34:06,100 --> 00:34:08,199
doing I owe. 
So if you want to learn 

765
00:34:08,199 --> 00:34:10,100
functional programming, that's 
actually a very good language to

766
00:34:10,107 --> 00:34:12,300
learn because it will force you 
to learn this stuff. 

767
00:34:12,500 --> 00:34:15,500
But in terms of actually being 
productive, I think F sharp is a

768
00:34:15,507 --> 00:34:17,800
little bit easier to be 
productive in one of the 

769
00:34:17,800 --> 00:34:20,100
problems are with languages. 
Like Haskell is some people like

770
00:34:20,100 --> 00:34:22,199
to get really advanced in some 
of the stuff. 

771
00:34:22,199 --> 00:34:25,300
They do men have to go, sort of 
encourages that a lot of people.

772
00:34:25,400 --> 00:34:26,900
To write weird car stuff in 
Haskell. 

773
00:34:27,100 --> 00:34:29,000
It makes it very hard for other 
people to come along and 

774
00:34:29,000 --> 00:34:30,800
maintain it because it's just 
crazy. 

775
00:34:30,800 --> 00:34:33,800
So you can't get too weird 
enough shopping at some people 

776
00:34:33,800 --> 00:34:36,000
think well, that's bad. 
But I think that's nice. 

777
00:34:36,000 --> 00:34:39,000
You can't go overboard with 
advanced stuff. 

778
00:34:39,000 --> 00:34:40,100
You can never get too much that 
way. 

779
00:34:40,100 --> 00:34:42,400
So again this very practical 
very pragmatic language that 

780
00:34:42,400 --> 00:34:45,000
way. 
So looking at the other thing 

781
00:34:45,000 --> 00:34:47,600
that you are big, about you 
mention about productivity. 

782
00:34:47,600 --> 00:34:50,699
Just now you mentioned that 
programmers need to be more 

783
00:34:50,699 --> 00:34:53,400
effective versus being more 
efficient. 

784
00:34:53,400 --> 00:34:56,400
So I think you have topic is a 
big thing in Productivity world,

785
00:34:56,400 --> 00:34:58,100
right? 
So effective as insufficient. 

786
00:34:58,200 --> 00:34:59,900
Maybe you can give us your 
thoughts as well. 

787
00:34:59,900 --> 00:35:03,000
What do you mean by programmers?
Should be aspiring to be more 

788
00:35:03,000 --> 00:35:07,300
effective versus efficient. 
So, efficient is doing something

789
00:35:07,300 --> 00:35:10,200
better. 
Like, an LED light bulb is more 

790
00:35:10,200 --> 00:35:12,600
efficient than incandescent 
light bulb. 

791
00:35:12,900 --> 00:35:17,300
It uses less power and Global 
doing a task with less energy 

792
00:35:17,300 --> 00:35:20,400
and with less money, that's 
being efficient, but we do tend 

793
00:35:20,400 --> 00:35:23,800
to focus on efficiency instead 
of Effectiveness. 

794
00:35:23,800 --> 00:35:24,900
Now. 
Effectiveness. 

795
00:35:25,400 --> 00:35:29,000
Is doing the right thing, so 
it's not about how efficiently 

796
00:35:29,000 --> 00:35:29,800
you do it. 
It's about. 

797
00:35:29,800 --> 00:35:32,000
Are you even doing the right 
thing in the first place? 

798
00:35:32,500 --> 00:35:35,400
The good example is, if you have
someone in a really fast car 

799
00:35:35,400 --> 00:35:38,600
like a Ferrari and you have 
someone else in a bicycle, the 

800
00:35:38,600 --> 00:35:42,500
Ferrari is faster, but if you go
in the wrong direction, the 

801
00:35:42,500 --> 00:35:44,700
bicycle is better. 
If you're trying to get to the 

802
00:35:44,700 --> 00:35:46,800
right place, a bicycle might be 
better. 

803
00:35:46,900 --> 00:35:48,500
So, I see a lot of people in 
programming. 

804
00:35:48,500 --> 00:35:52,100
We talk about velocities when 
it's all about Sprints, and 

805
00:35:52,100 --> 00:35:56,800
velocity, and story points and 
all Stuff we talked about how 

806
00:35:56,800 --> 00:36:00,300
fast can we do things and can we
take off features fast and all 

807
00:36:00,300 --> 00:36:02,200
the stuff and there's nothing 
wrong with that. 

808
00:36:02,200 --> 00:36:04,600
I mean, it's good to improve 
your processes to make them 

809
00:36:04,600 --> 00:36:06,200
faster and more efficient is 
good. 

810
00:36:06,400 --> 00:36:09,100
But sometimes people lose track 
of was even more. 

811
00:36:09,100 --> 00:36:11,400
Important is doing the right 
thing in the first place. 

812
00:36:11,800 --> 00:36:14,700
I've had a bad experience where 
I spent a long time building a 

813
00:36:14,700 --> 00:36:16,500
product. 
We had a really good team. 

814
00:36:16,500 --> 00:36:18,200
We had really expert 
programmers. 

815
00:36:18,600 --> 00:36:21,800
We had really good. 
Processes is very agile, all 

816
00:36:21,800 --> 00:36:23,800
this stuff. 
But after we finish building the

817
00:36:23,800 --> 00:36:26,500
product nobody wanted it. 
It was a failure because we 

818
00:36:26,500 --> 00:36:28,500
didn't actually build what 
people want it. 

819
00:36:28,900 --> 00:36:31,500
We were so obsessed with our own
efficiency. 

820
00:36:31,700 --> 00:36:33,200
We didn't actually talk to 
anybody. 

821
00:36:33,400 --> 00:36:36,500
We don't actually talk to the 
end users ever since then. 

822
00:36:36,500 --> 00:36:39,700
I've been very concerned about 
doing user experience, testing, 

823
00:36:40,000 --> 00:36:42,300
getting feedback from the 
customer, getting feedback from 

824
00:36:42,300 --> 00:36:45,300
other programs, thinking about 
other people and listening to 

825
00:36:45,300 --> 00:36:47,500
other people. 
Not just doing what you think. 

826
00:36:47,500 --> 00:36:50,200
You again, techie people tend to
be very concerned about 

827
00:36:50,200 --> 00:36:52,800
technology that this is a 
technology solution for every 

828
00:36:52,800 --> 00:36:55,100
problem. 
Sometimes it isn't a technology 

829
00:36:55,100 --> 00:36:57,900
problem. 
So people button and so you have

830
00:36:57,900 --> 00:37:00,700
to improve your people skills, 
your listening skills. 

831
00:37:00,700 --> 00:37:03,900
And like I said, try to 
understand what is the right 

832
00:37:03,900 --> 00:37:06,300
thing to do, not just how fast 
you do it. 

833
00:37:06,400 --> 00:37:08,600
Well, I had a tweet, a funny 
tweets about this. 

834
00:37:08,600 --> 00:37:11,300
A few weeks ago, which is 
there's a famous detective 

835
00:37:11,300 --> 00:37:14,900
series in America in the 1990s 
called Murder. 

836
00:37:14,900 --> 00:37:18,600
She Wrote, it was set in this 
very small town in America. 

837
00:37:19,000 --> 00:37:22,600
Every episode, some personal get
murdered this woman. 

838
00:37:22,600 --> 00:37:24,500
She was really good at being a 
detective every week. 

839
00:37:24,500 --> 00:37:25,600
She solved the murder. 
Eager. 

840
00:37:25,800 --> 00:37:28,700
And so she was very efficient at
solving murders. 

841
00:37:29,200 --> 00:37:32,200
So she sold hundreds and 
hundreds of murders, but that's 

842
00:37:32,200 --> 00:37:34,100
being a very efficient. 
But really, if you want to be 

843
00:37:34,100 --> 00:37:37,600
effective, you should be saying,
why are there so many murders in

844
00:37:37,600 --> 00:37:39,900
this small town. 
And why don't you stop these 

845
00:37:39,900 --> 00:37:41,500
murders from happening in the 
first place. 

846
00:37:41,800 --> 00:37:44,000
That would be effective, not 
just being efficient. 

847
00:37:44,300 --> 00:37:47,000
It's very hard to think about 
Effectiveness as no metrics for 

848
00:37:47,000 --> 00:37:49,100
it. 
Effectiveness is very hard to 

849
00:37:49,100 --> 00:37:50,600
joke. 
It's a judgment call. 

850
00:37:50,900 --> 00:37:53,300
Are you doing the right thing? 
We sometimes do the same thing. 

851
00:37:53,300 --> 00:37:55,200
We focus on solving the problems
quickly. 

852
00:37:55,400 --> 00:37:56,700
Well, then actually trying to 
figure out. 

853
00:37:56,700 --> 00:37:58,200
What's the point of solving this
problem. 

854
00:37:58,200 --> 00:38:00,900
If it's not even the right 
problem to solve, there's a 

855
00:38:00,900 --> 00:38:04,000
social component which is if you
are seen as a very efficient 

856
00:38:04,000 --> 00:38:07,400
person, you get a lot of credit.
If you solve all these murders, 

857
00:38:07,700 --> 00:38:10,000
you consider the great detective
and everyone thinks you're 

858
00:38:10,000 --> 00:38:12,000
fantastic. 
If you stop, the murders from 

859
00:38:12,000 --> 00:38:14,600
happening in the first place, 
nobody cares. 

860
00:38:14,900 --> 00:38:17,300
Because you never even happened,
and therefore, people don't 

861
00:38:17,300 --> 00:38:20,000
think you're doing anything. 
So, unfortunately, we don't get 

862
00:38:20,000 --> 00:38:22,700
rewarded for being effective. 
We only get rewarded for being 

863
00:38:22,700 --> 00:38:23,900
efficient. 
So that's something just to be 

864
00:38:23,900 --> 00:38:27,000
aware of if you're ever, Were in
a management position, don't 

865
00:38:27,000 --> 00:38:29,700
just watch people for being 
efficient and productive reward,

866
00:38:29,700 --> 00:38:30,900
people for doing the right 
thing. 

867
00:38:32,000 --> 00:38:35,600
So yeah, I was about to say that
people probably don't associate 

868
00:38:35,600 --> 00:38:37,700
high-performance with 
Effectiveness unless the 

869
00:38:37,700 --> 00:38:40,400
management has actually already 
realized about this. 

870
00:38:40,600 --> 00:38:43,200
So they tend to see people who 
can work as many times as 

871
00:38:43,200 --> 00:38:46,400
possible within a short amount 
of period of time or probably 

872
00:38:46,400 --> 00:38:49,400
the person is just busy all the 
time, but always get things 

873
00:38:49,400 --> 00:38:52,600
done, but there are people who 
tend to maybe perceive as lazy 

874
00:38:52,600 --> 00:38:54,600
but they are actually doing the 
right thing that solve the 

875
00:38:54,600 --> 00:38:57,700
problem at the root, cause 
probably tend to be less visible

876
00:38:57,700 --> 00:39:00,000
unless they can mention about 
the impact and all that. 

877
00:39:00,100 --> 00:39:02,700
So what do you think will be 
your Advice to managers or 

878
00:39:02,700 --> 00:39:05,500
leaders to always have this 
mindset to be looking at the 

879
00:39:05,500 --> 00:39:07,700
effectiveness versus the 
efficiency. 

880
00:39:08,500 --> 00:39:10,700
There is a tough one. 
The problem is, it's very hard. 

881
00:39:10,700 --> 00:39:12,800
It's just hard to measure and 
now we're not even in the realm 

882
00:39:12,800 --> 00:39:15,200
of Technology. 
The person I would recommend is 

883
00:39:15,200 --> 00:39:18,500
a guy called Peter Drucker. 
He wrote books on management 

884
00:39:18,500 --> 00:39:21,400
Theory, back in the 1950s and 
1960s. 

885
00:39:21,600 --> 00:39:24,100
He is the person who she came 
up, this idea of the difference 

886
00:39:24,100 --> 00:39:25,600
between Effectiveness and 
efficiency. 

887
00:39:25,900 --> 00:39:29,100
It's not an easy thing to do. 
It's so easy to get sucked into 

888
00:39:29,100 --> 00:39:31,200
the whole efficiency thing one 
way. 

889
00:39:31,300 --> 00:39:34,800
To listen to the outside world. 
So again, rather than working on

890
00:39:34,800 --> 00:39:37,200
something and thinking that, you
know, the right way to do it, 

891
00:39:37,200 --> 00:39:41,300
listen to users, listen to the 
feedback from people and change 

892
00:39:41,300 --> 00:39:43,100
direction. 
If you're going in the wrong 

893
00:39:43,100 --> 00:39:45,100
direction, you want to know as 
soon as possible. 

894
00:39:45,100 --> 00:39:48,000
So I guess would be having 
feedback loops as many feedback 

895
00:39:48,000 --> 00:39:50,200
loops as possible, so that you 
can change direction. 

896
00:39:50,200 --> 00:39:52,200
If you realize that people 
aren't happy with what you're 

897
00:39:52,200 --> 00:39:54,200
doing. 
And he comes back again to the 

898
00:39:54,200 --> 00:39:56,500
direction, Vector speed. 
You may send the beginning if 

899
00:39:56,500 --> 00:39:59,600
you have a Ferrari, but if you 
go to the wrong direction, it's 

900
00:39:59,600 --> 00:40:01,200
even worse. 
Exactly, exactly. 

901
00:40:01,300 --> 00:40:02,900
Really? 
Yeah, and unfortunately, I've 

902
00:40:02,900 --> 00:40:04,500
seen a lot of tech companies to 
exert. 

903
00:40:04,500 --> 00:40:06,300
They build a product that nobody
wants. 

904
00:40:06,700 --> 00:40:08,800
It's nothing to do with a little
quality of the team. 

905
00:40:09,300 --> 00:40:11,200
It's just literally you're 
building the wrong thing and you

906
00:40:11,207 --> 00:40:12,800
haven't actually listen to your 
customers. 

907
00:40:12,800 --> 00:40:15,500
So, it's sad. 
And that affects this day. 

908
00:40:15,500 --> 00:40:18,200
I mean, social media and all 
that people also wants to Crave 

909
00:40:18,200 --> 00:40:20,800
instant gratification or instant
achievements. 

910
00:40:21,100 --> 00:40:22,800
Sometimes you also need to think
about. 

911
00:40:22,800 --> 00:40:26,000
Are you going into the right 
direction with that speed or 

912
00:40:26,000 --> 00:40:28,000
actually something that matters 
to you. 

913
00:40:28,200 --> 00:40:30,100
So that's a food for thought for
everyone here. 

914
00:40:30,600 --> 00:40:33,300
So Scott is In a pleasant 
conversation learning about 

915
00:40:33,300 --> 00:40:36,400
functional programming. 
I myself get intrigued by all 

916
00:40:36,400 --> 00:40:38,700
these nice things about 
functional programming, and 

917
00:40:38,700 --> 00:40:41,200
maybe I'll give it a try as well
in my day to day job. 

918
00:40:41,400 --> 00:40:44,200
But before we wrap up our 
conversation, I always like to 

919
00:40:44,200 --> 00:40:46,800
ask my guests to share. 
Three technical leadership is 

920
00:40:46,800 --> 00:40:48,300
done. 
So, this is something like a 

921
00:40:48,308 --> 00:40:49,800
message. 
You want to share to the 

922
00:40:49,800 --> 00:40:52,800
audience here for them to 
actually also reflect and maybe 

923
00:40:52,800 --> 00:40:55,700
learn from your experience. 
So, would you be able to share 

924
00:40:55,700 --> 00:40:57,100
your tree? 
Technically, the ship is 

925
00:40:57,100 --> 00:40:58,900
tomatoes? 
Yes. 

926
00:40:58,900 --> 00:41:02,800
So the first thing I would say 
is to read more about 

927
00:41:02,800 --> 00:41:05,600
nonsensical, things in 
particular, a lot of the stuff. 

928
00:41:05,600 --> 00:41:08,800
I've learned this come from 
reading about architecture, or 

929
00:41:08,800 --> 00:41:12,000
reading about systems thinking 
or reading about other 

930
00:41:12,000 --> 00:41:14,500
engineering books, right? 
Mechanical, engineering or 

931
00:41:14,500 --> 00:41:16,400
something. 
It gives you insight into your 

932
00:41:16,400 --> 00:41:18,800
problems again, getting out of 
your bubble and getting 

933
00:41:18,800 --> 00:41:20,800
feedback. 
One of my favorite books is the 

934
00:41:20,800 --> 00:41:22,900
Design of Everyday Things by Don
Norman. 

935
00:41:23,300 --> 00:41:27,800
None of my favorite books is how
buildings learn by Stuart 

936
00:41:28,100 --> 00:41:28,800
Willie. 
Some books. 

937
00:41:28,800 --> 00:41:30,200
They're not about programming at
all. 

938
00:41:30,400 --> 00:41:32,500
But you can see, they really do 
apply to program. 

939
00:41:32,800 --> 00:41:35,800
Another piece of leadership. 
Wisdom is literally what we just

940
00:41:35,800 --> 00:41:37,800
talked about. 
Yes, to be careful about 

941
00:41:37,800 --> 00:41:40,500
focusing, only on efficiency of 
focusing on metrics. 

942
00:41:40,800 --> 00:41:42,600
Make sure you're building. 
The right thing. 

943
00:41:42,900 --> 00:41:45,900
Another thing is, getting out of
the house, talking to people 

944
00:41:46,300 --> 00:41:48,600
listening to people, and don't 
think the, you know, all the 

945
00:41:48,600 --> 00:41:51,500
answers something which has been
very useful to me in this area 

946
00:41:51,500 --> 00:41:54,300
is actually reading about 
anthropology of all things. 

947
00:41:54,900 --> 00:41:58,000
So, anthropologists, their whole
job is to listen to people. 

948
00:41:58,400 --> 00:42:02,500
And to learn things in a 
non-judgmental way again recent 

949
00:42:02,500 --> 00:42:04,500
popular and apology and I think 
it will help you be a better 

950
00:42:04,500 --> 00:42:06,300
programmer, just gonna 
interesting. 

951
00:42:06,600 --> 00:42:10,100
And the third one I would say is
again in the whole Spirit of 

952
00:42:10,100 --> 00:42:12,300
getting outside. 
Your bubble is being a poly got 

953
00:42:12,300 --> 00:42:15,500
programmer and learning 
different paradigms. 

954
00:42:15,900 --> 00:42:18,300
It just expanding your mind in 
any way possible. 

955
00:42:18,600 --> 00:42:22,300
It's so easy to focus on one 
thing and just do one thing all 

956
00:42:22,300 --> 00:42:24,300
the time. 
The other ways of doing that is 

957
00:42:24,300 --> 00:42:26,600
to stop burnout. 
I did have a big problem with 

958
00:42:26,600 --> 00:42:28,800
burnout and I think other people
have problems with Not. 

959
00:42:29,100 --> 00:42:31,000
And one way to stop burnout is 
to have fun. 

960
00:42:31,000 --> 00:42:33,900
Fun is really important. 
It's not all about work. 

961
00:42:34,000 --> 00:42:36,400
And so do things that are fun 
for you. 

962
00:42:36,400 --> 00:42:38,900
And if that's learning a new 
programming language or 

963
00:42:38,900 --> 00:42:41,000
expanding your horizons and 
other areas. 

964
00:42:41,000 --> 00:42:42,800
I just think that's a really 
important by this. 

965
00:42:42,800 --> 00:42:44,700
The whole thing is not just 
about your job. 

966
00:42:44,700 --> 00:42:47,700
It's about your whole life. 
So that's my last bit of wisdom 

967
00:42:47,700 --> 00:42:49,800
for you. 
Thanks for plugging in the 

968
00:42:49,800 --> 00:42:51,900
burnout message. 
So, I think you have many people

969
00:42:51,900 --> 00:42:55,800
probably also experience burnout
with the insurmountable amount 

970
00:42:55,800 --> 00:42:58,300
of work as video. 
Is this internet? 

971
00:42:58,400 --> 00:43:01,000
Is everyone can reach everyone 
very easily. 

972
00:43:01,200 --> 00:43:04,000
So Scott for people who want to 
continue the conversation with 

973
00:43:04,000 --> 00:43:06,200
you any place. 
They can find you online. 

974
00:43:06,600 --> 00:43:09,400
I'm only pretty much on Twitter.
Not trying to avoid social 

975
00:43:09,400 --> 00:43:12,700
media, but I am on Twitter and 
my Twitter handle is stop 

976
00:43:12,700 --> 00:43:14,500
lotion. 
That's another piece of my study

977
00:43:14,500 --> 00:43:16,800
of social media. 
If you want to be protective. 

978
00:43:17,000 --> 00:43:19,100
That's actually a very good 
thing about Effectiveness versus

979
00:43:19,100 --> 00:43:20,900
efficiency. 
They measure stuff by 

980
00:43:20,900 --> 00:43:23,700
engagements. 
They want to get you angry, the 

981
00:43:23,700 --> 00:43:25,600
more Angry, you get them all 
clicks again. 

982
00:43:26,000 --> 00:43:28,300
I do think it's very unhealthy 
spend a lot of time. 

983
00:43:28,400 --> 00:43:30,100
Social media. 
I just don't think it's good. 

984
00:43:30,100 --> 00:43:33,300
So yeah, stay off social media 
and focus on the real world. 

985
00:43:33,800 --> 00:43:34,600
There are. 
Yeah. 

986
00:43:34,700 --> 00:43:35,500
Yeah. 
Yeah. 

987
00:43:35,500 --> 00:43:37,000
Thanks for that message. 
So Scott. 

988
00:43:37,000 --> 00:43:38,600
Hope you enjoyed this 
conversation. 

989
00:43:38,800 --> 00:43:40,500
Thanks again for sharing your 
knowledge. 

990
00:43:40,900 --> 00:43:45,900
Thank you so much. 
Thank you for listening to this 

991
00:43:45,900 --> 00:43:49,300
episode and for staying, right 
until the end if you highly 

992
00:43:49,300 --> 00:43:52,100
enjoyed it, I would appreciate 
if you share it with your 

993
00:43:52,100 --> 00:43:55,100
friends and colleagues who you 
think would also benefit from 

994
00:43:55,100 --> 00:43:57,600
listening to this episode. 
And if you are new to the 

995
00:43:57,600 --> 00:44:00,600
podcast, make sure to subscribe 
and leave me your valuable 

996
00:44:00,600 --> 00:44:03,200
review and feedback. 
It helps me a lot. 

997
00:44:03,200 --> 00:44:05,200
In order to grow this podcast 
better. 

998
00:44:05,600 --> 00:44:08,500
You can also find the full show 
notes of this conversation on 

999
00:44:08,500 --> 00:44:12,200
the episode page at technology 
Arnold death website, including 

1000
00:44:12,200 --> 00:44:15,500
the full transcript enter. 
Resting courts and links to the 

1001
00:44:15,500 --> 00:44:17,900
resources mention from the 
conversation. 

1002
00:44:18,200 --> 00:44:21,300
And lastly, make sure to 
subscribe to the shows mailing 

1003
00:44:21,300 --> 00:44:24,700
list on pack leader. 
No dot f to get notified for any

1004
00:44:24,700 --> 00:44:27,400
future episodes. 
Stay tuned for the next 

1005
00:44:27,400 --> 00:44:28,700
technology. 
No episode. 

1006
00:44:29,100 --> 00:44:30,700
And until then. 
Goodbye.

