1
00:00:00,040 --> 00:00:02,764
Here we come to what I think may
have been one of my worst 

2
00:00:02,764 --> 00:00:05,116
mistakes in my career. 
I shudder to think at how many 

3
00:00:05,116 --> 00:00:07,400
billions of dollars or something
have lost productivity result 

4
00:00:07,400 --> 00:00:10,716
from that one error. 
Gavin King, the creator of 

5
00:00:10,716 --> 00:00:13,134
Hibernate and key contributor to
enterprise Java specifications, 

6
00:00:13,134 --> 00:00:16,343
shares his hibernate creation 
story and how he's currently 

7
00:00:16,343 --> 00:00:19,295
modernizing Java persistence. 
What exactly the problems that 

8
00:00:19,295 --> 00:00:22,500
you saw back then that led you 
to creating Hibernate? 

9
00:00:22,650 --> 00:00:27,543
My career really started out of 
my frustrations with the Java EE

10
00:00:27,543 --> 00:00:29,230
platform. 
Hibernate started as a result of

11
00:00:29,230 --> 00:00:32,466
a kind of an argument with my 
boss at the time who wanted us 

12
00:00:32,466 --> 00:00:35,900
to use entity beans. 
I argued that beans just didn't 

13
00:00:35,900 --> 00:00:39,308
work very well. 
Many people carry around the 

14
00:00:39,308 --> 00:00:42,118
belief that specifications 
designed by committees are 

15
00:00:42,118 --> 00:00:44,350
doomed to fail or be bad in some
way. 

16
00:00:44,410 --> 00:00:46,640
I actually hold absolutely the 
opposite view. 

17
00:00:46,640 --> 00:00:49,264
For my career, the things I'm 
proudest of is those 

18
00:00:49,264 --> 00:00:51,074
specifications work we've done 
within the JCP and now at 

19
00:00:51,074 --> 00:00:53,187
Jakarta. 
Explain a little bit why there 

20
00:00:53,187 --> 00:00:55,449
are such love and hate 
relationship with ORM. 

21
00:00:55,449 --> 00:00:59,132
In the past, Hibernate picked a 
way of doing things which 

22
00:00:59,132 --> 00:01:01,930
involved more magic than some 
people probably wanted. 

23
00:01:02,020 --> 00:01:05,265
People have been sold in this 
notion that persistence can be 

24
00:01:05,265 --> 00:01:06,973
transparent. 
My goal has always been to give 

25
00:01:06,973 --> 00:01:08,890
people powerful primitive so 
that they can implement whatever

26
00:01:08,890 --> 00:01:11,590
sorts of architectural decisions
that they wish to implement. 

27
00:01:11,650 --> 00:01:15,128
The whole discourse around 
design patterns and 

28
00:01:15,128 --> 00:01:18,850
architectural patterns lacks 
foundation in logic and math. 

29
00:01:18,880 --> 00:01:21,511
It lacks empirical foundation. 
Architecture is something that 

30
00:01:21,511 --> 00:01:23,800
has to emerge naturally from the
code. 

31
00:01:23,860 --> 00:01:26,325
If they don't make the code 
better and more elegant and more

32
00:01:26,325 --> 00:01:28,410
flexible, then you should not be
doing them. 

33
00:01:44,492 --> 00:01:47,565
All right, so welcome to the 
Tech Lead Journal podcast, 

34
00:01:47,565 --> 00:01:49,510
Gavin. 
Uh, it's my pleasure actually to

35
00:01:49,510 --> 00:01:53,174
have you here. 
So I had Sanne maybe a couple of

36
00:01:53,174 --> 00:01:54,449
weeks back, right? 
Yeah, sure. 

37
00:01:54,554 --> 00:01:57,445
So I'm very happy to have 
another, you know, so-called 

38
00:01:57,445 --> 00:01:59,577
Hibernate creator to be in this 
show. 

39
00:02:00,087 --> 00:02:04,443
Uh, and I must say, um, when I 
started my career, Java 

40
00:02:04,443 --> 00:02:08,829
Persistence with Hibernate is 
like my, go-to book, especially 

41
00:02:08,829 --> 00:02:11,583
20 years ago. 
I just started my career, you 

42
00:02:11,583 --> 00:02:13,245
know, learning about Hibernate 
and all of that. 

43
00:02:13,485 --> 00:02:15,795
And thanks for writing the book 
and, uh, it's my pleasure to 

44
00:02:15,795 --> 00:02:18,408
have you in the show. 
Thanks for having me here and 

45
00:02:18,408 --> 00:02:21,736
you know, thanks for, thanks for
liking my, liking the book, and,

46
00:02:21,736 --> 00:02:23,780
you know, uh, that's great to 
hear. 

47
00:02:24,195 --> 00:02:27,984
So Gavin, maybe people know a 
lot, uh, you as a creator of 

48
00:02:27,984 --> 00:02:30,165
Hibernate. 
Uh, but maybe let's start by, 

49
00:02:30,165 --> 00:02:33,025
you know, maybe sharing some 
stories about yourself, any kind

50
00:02:33,025 --> 00:02:35,445
of career turning points or 
highlights that you probably 

51
00:02:35,445 --> 00:02:38,957
think we can learn from you. 
I don't know, I don't know how 

52
00:02:38,957 --> 00:02:42,124
much there is to learn from me, 
but, um, I guess I can give you 

53
00:02:42,124 --> 00:02:46,331
a rundown of, you know, um... 
I started my career by dropping 

54
00:02:46,331 --> 00:02:50,353
out of a PhD and going to work 
for a bubble tech, you know, the

55
00:02:50,353 --> 00:02:52,866
original tech bubble company, 
startup company. 

56
00:02:52,866 --> 00:02:57,068
And, um, because I was just very
interested in this new world of 

57
00:02:57,068 --> 00:02:59,701
the internet, right? 
And the worldwide web, which 

58
00:02:59,701 --> 00:03:02,886
was, you know, I was reading 
Wired magazine and, you know, I 

59
00:03:02,886 --> 00:03:04,176
didn't have a background in 
computing. 

60
00:03:04,176 --> 00:03:05,526
I have a background in 
mathematics. 

61
00:03:05,616 --> 00:03:08,645
Um, and you know, I started 
working with Smalltalk a little 

62
00:03:08,645 --> 00:03:11,999
bit, and then very quickly Java 
came through like this wave, 

63
00:03:11,999 --> 00:03:14,495
which took over the, you know, 
the industry at the time. 

64
00:03:14,825 --> 00:03:16,115
And so I started working with 
Java. 

65
00:03:17,047 --> 00:03:21,914
I was working on, at a 
consulting firm in Australia who

66
00:03:21,914 --> 00:03:25,170
were doing IBM WebSphere 
consulting, so building, um, 

67
00:03:25,170 --> 00:03:27,230
applications on top of using 
WebSphere. 

68
00:03:28,218 --> 00:03:34,002
And my, I guess my career really
started out of my frustrations 

69
00:03:34,002 --> 00:03:37,803
with the JavaEE platform as it 
existed at that time. 

70
00:03:38,073 --> 00:03:42,668
And so Hibernate started, you 
know, for, in one sense, as a 

71
00:03:42,668 --> 00:03:45,618
result of a kind of an argument,
you know, a debate let's say I 

72
00:03:45,618 --> 00:03:49,178
had with my boss at the time who
wanted us to use entity beans 

73
00:03:49,178 --> 00:03:52,916
and the standards because, you 
know, he argued, you know, in a 

74
00:03:52,916 --> 00:03:55,094
sense, quite rightly that there 
is value in standards. 

75
00:03:55,094 --> 00:03:57,280
There's a value of having a 
standard way of doing things so 

76
00:03:57,280 --> 00:03:58,994
that everybody knows how to do 
things in the same way. 

77
00:03:59,834 --> 00:04:04,154
And I argued that entity beans 
just didn't work very well. 

78
00:04:04,214 --> 00:04:07,362
And that, you know, no matter 
what the value of a standard is,

79
00:04:07,362 --> 00:04:10,550
if the thing doesn't actually 
work, then, um, you shouldn't 

80
00:04:10,550 --> 00:04:14,852
use it. 
And so I was very interested in 

81
00:04:14,852 --> 00:04:19,000
open source, which was kind of 
a, I don't wanna say it was a 

82
00:04:19,000 --> 00:04:21,202
new, new thing, but it was, at 
least, it was something that was

83
00:04:21,202 --> 00:04:24,882
new to me. 
The idea of, you know, the whole

84
00:04:24,882 --> 00:04:29,148
question of how open source 
related to the commercial world 

85
00:04:29,148 --> 00:04:33,509
of building software for money 
was a very interesting, you 

86
00:04:33,509 --> 00:04:37,262
know, to me, just a very 
intellectually interesting 

87
00:04:37,262 --> 00:04:41,682
question, right? 
How do you, you know, what is 

88
00:04:41,682 --> 00:04:44,227
the best way to produce 
software? 

89
00:04:44,617 --> 00:04:47,658
This thing which has a zero unit
cost of production, but it is on

90
00:04:47,658 --> 00:04:49,382
the other hand, very expensive 
to produce. 

91
00:04:49,562 --> 00:04:52,452
You know, how do you, what is 
the best business model for 

92
00:04:52,452 --> 00:04:54,322
accommodating those economic 
realities? 

93
00:04:54,322 --> 00:04:57,582
And so I was interested to start
an open source project. 

94
00:04:57,582 --> 00:04:59,882
And so that's how Hibernate 
began. 

95
00:04:59,882 --> 00:05:02,908
We just, I just started writing 
some code for persistence and 

96
00:05:02,908 --> 00:05:06,998
put it out there. 
And in those days, that was a 

97
00:05:06,998 --> 00:05:10,968
way that it was quite easy to 
get attention, right? 

98
00:05:10,968 --> 00:05:15,233
Um, I think it's probably harder
to get attention just from that 

99
00:05:15,233 --> 00:05:17,873
today. 
And I think that open source 

100
00:05:17,873 --> 00:05:20,828
projects today that become 
successful are a lot, more of 

101
00:05:20,828 --> 00:05:22,798
them have some sort of corporate
backing. 

102
00:05:22,978 --> 00:05:25,538
But at that time it was, well, 
it was possible, as you know. 

103
00:05:25,568 --> 00:05:27,798
Um, and so there's a lot of that
going on. 

104
00:05:28,805 --> 00:05:32,663
Pretty soon, like a, you know, a
year, a year and a half, two 

105
00:05:32,663 --> 00:05:38,118
years later, I was absolutely 
overwhelmed by the amount of 

106
00:05:38,118 --> 00:05:42,459
work that was involved in 
supporting this open source 

107
00:05:42,459 --> 00:05:45,230
project. 
And so this is critical to 

108
00:05:45,230 --> 00:05:49,129
understand that, you know, an 
open source project does require

109
00:05:49,129 --> 00:05:52,808
some sort of business model 
behind it or you're just gonna 

110
00:05:52,808 --> 00:05:55,253
be overwhelmed by the work it 
takes to support it. 

111
00:05:56,059 --> 00:05:59,157
So I was looking for a way, you 
know, I got fired from my job 

112
00:05:59,157 --> 00:06:02,449
for spending too much time on 
this, you know, um, I was outta 

113
00:06:02,449 --> 00:06:04,950
work for a while. 
That was quite precarious 

114
00:06:04,950 --> 00:06:07,076
actually. 
But I, you know, I had this 

115
00:06:07,076 --> 00:06:09,317
thing there that seemed to be 
going places, right? 

116
00:06:10,037 --> 00:06:14,381
And I was actually in Boston for
a speaking event. 

117
00:06:14,381 --> 00:06:18,023
I forget what it was. 
But, um, and then these um, 

118
00:06:18,023 --> 00:06:22,130
couple guys from this tiny 
little company that was barely 

119
00:06:22,130 --> 00:06:25,299
even a company at that point 
called JBoss from Atlanta, 

120
00:06:25,299 --> 00:06:28,643
Georgia, you know, flew up. 
Well, I actually, uh, Bill lived

121
00:06:28,643 --> 00:06:32,705
in the area, but, um, Ben flew 
up and, to talk to me and they 

122
00:06:32,705 --> 00:06:35,069
were like, you know, well, you 
know what, you know, would you 

123
00:06:35,069 --> 00:06:37,347
be interested in, you know, 
coming and joining JBoss? 

124
00:06:37,347 --> 00:06:38,897
And I was like, yeah, hell yeah,
absolutely. 

125
00:06:38,897 --> 00:06:40,325
I'm interested. 
That was exactly what I was 

126
00:06:40,325 --> 00:06:45,784
hoping you were gonna ask me. 
And so, um, I moved to Atlanta 

127
00:06:45,784 --> 00:06:52,017
from Australia. 
And then began the two or three 

128
00:06:52,017 --> 00:06:58,643
most intense years of my life in
some ways, um, of, uh, just 

129
00:06:58,643 --> 00:07:02,870
flying around and, you know, 
talking to people about 

130
00:07:02,870 --> 00:07:05,336
Hibernate and about. 
And it was crazy. 

131
00:07:05,336 --> 00:07:08,627
You know, it's, uh, it's amazing
to think of all the stuff that 

132
00:07:08,627 --> 00:07:11,546
happened in what was really such
a short period of time. 

133
00:07:12,557 --> 00:07:16,579
At one point, and I think a very
important turning point was 

134
00:07:16,579 --> 00:07:20,048
that, you know, Hibernate was 
not the only game in town at the

135
00:07:20,048 --> 00:07:21,820
time. 
There was JDO, for example, 

136
00:07:21,820 --> 00:07:24,982
which was a specification that 
these object database vendors 

137
00:07:24,982 --> 00:07:26,474
had. 
MyBatis, iBatis, MyBatis. 

138
00:07:26,684 --> 00:07:28,634
Yeah, ah, those kind of came 
later. 

139
00:07:28,634 --> 00:07:35,694
Yeah, I, no, at the time, the 
biggest kind of sort of 

140
00:07:35,694 --> 00:07:39,830
contrary, you know, other option
that people were pushing was the

141
00:07:39,830 --> 00:07:42,048
JDO specification, which was 
already an existing 

142
00:07:42,048 --> 00:07:44,743
specification. 
It had certain features that 

143
00:07:44,743 --> 00:07:47,363
meant that, you know, we, I 
really didn't like it. 

144
00:07:47,523 --> 00:07:50,588
But there was a perception that 
we needed to adopt some sort of 

145
00:07:50,588 --> 00:07:52,819
specification. 
You know, JBoss was implementing

146
00:07:52,819 --> 00:07:57,087
Jakarta, uh, Java EE, and, and 
there was a perception that, you

147
00:07:57,087 --> 00:07:59,562
know, we should be somehow 
involved in the specifications. 

148
00:07:59,652 --> 00:08:02,868
Um, what happened eventually was
that, um, Marc Fleury and I one 

149
00:08:02,868 --> 00:08:07,157
day got on a phone call with the
EJB3 group and, you know I, 

150
00:08:07,157 --> 00:08:10,295
proposed that, hey guys, why 
don't we just drop this whole 

151
00:08:10,295 --> 00:08:13,271
entity beans thing, do something
else, which is more like the 

152
00:08:13,271 --> 00:08:16,635
direction that Hibernate. 
Um, after that, the TopLink guys

153
00:08:16,635 --> 00:08:21,390
got involved and then JPA was 
born, Java Persistence API. 

154
00:08:22,146 --> 00:08:25,818
Now that was, I mean, an 
incredibly politically fraught 

155
00:08:25,818 --> 00:08:28,884
process. 
Um, it's, you know, huge, huge 

156
00:08:28,884 --> 00:08:32,408
credit to Linda DeMichiel for 
actually like living through and

157
00:08:32,408 --> 00:08:35,912
having to, you know, fight 
through all the stuff that got 

158
00:08:35,912 --> 00:08:39,042
thrown at JPA. 
I learned so much from that. 

159
00:08:39,042 --> 00:08:43,421
And in particular I learned a 
lesson, which I think that many 

160
00:08:43,421 --> 00:08:47,023
people, a huge number of people 
back in those days and I think 

161
00:08:47,023 --> 00:08:50,803
still these days, carry around a
belief that specifications and 

162
00:08:50,803 --> 00:08:54,586
especially specifications 
designed by committees are 

163
00:08:54,586 --> 00:08:58,393
doomed to fail or be bad in some
way. 

164
00:08:58,932 --> 00:09:02,920
I actually hold absolutely the 
opposite view from my, you know,

165
00:09:02,920 --> 00:09:06,112
experience with that, with, you 
know, working on some of these 

166
00:09:06,112 --> 00:09:09,160
specifications. 
Um, I think that specifications 

167
00:09:09,160 --> 00:09:13,606
force you to really think 
through the semantics of things 

168
00:09:13,606 --> 00:09:17,181
you're doing. 
Iron out the, um, you know, 

169
00:09:17,181 --> 00:09:20,801
little corner cases. 
And so I have a very different 

170
00:09:20,801 --> 00:09:23,770
attitude towards specifications 
than I think most of, even most 

171
00:09:23,770 --> 00:09:26,369
of my colleagues. 
And you know, I learned that 

172
00:09:26,369 --> 00:09:27,961
from Linda, you know, from 
watching Linda worked. 

173
00:09:27,981 --> 00:09:31,258
And, um, and so, you know, for 
me, you know, for my career, the

174
00:09:31,258 --> 00:09:33,825
things I'm proudest of is the, 
you know, the specifications 

175
00:09:33,825 --> 00:09:36,691
work we've done within the, in 
the JCP and now at Jakarta. 

176
00:09:37,224 --> 00:09:44,792
After that I started, I was 
concerned about the question of 

177
00:09:44,792 --> 00:09:49,654
how these kind of more, what 
were considered sort of more 

178
00:09:49,654 --> 00:09:54,143
backend technologies, you know, 
EJB, JPA integrated with the 

179
00:09:54,143 --> 00:09:59,079
Java EE, web layer, the servlet,
etc, JSF. 

180
00:09:59,810 --> 00:10:04,010
And so, you know, there was no 
good tie in there. 

181
00:10:04,010 --> 00:10:07,394
You kind of were forced to 
introduce a sort of a layering, 

182
00:10:07,394 --> 00:10:11,210
which was unnatural. 
And the, you know, EJB3 had a 

183
00:10:11,210 --> 00:10:14,959
kind of a dependency injection 
approach, which at the time was 

184
00:10:14,959 --> 00:10:18,921
a super popular thing. 
But it wasn't really, it wasn't 

185
00:10:18,921 --> 00:10:21,651
really well integrated with the 
web layer. 

186
00:10:21,681 --> 00:10:23,811
You know, you had JSF had its 
own sort of approach. 

187
00:10:23,841 --> 00:10:27,599
And so I proposed this JSR, the 
Java Specification Request 

188
00:10:27,599 --> 00:10:31,414
called, which was titled 
originally Web Beans to kind of 

189
00:10:31,414 --> 00:10:35,549
integrate the two sides of the, 
you know, Java EE programing 

190
00:10:35,549 --> 00:10:41,029
model at the time, after EJB3. 
And that eventually evolved into

191
00:10:41,029 --> 00:10:47,101
what's now called CDI, which is 
kind of a central sort of glue 

192
00:10:47,101 --> 00:10:51,392
that, you know, now today holds 
the Jakarta EE platform together

193
00:10:51,392 --> 00:10:55,844
in some sense. 
And that was, you know, that was

194
00:10:55,844 --> 00:11:00,114
again, um, a very interesting 
political process, um, some 

195
00:11:00,114 --> 00:11:01,614
stage. 
Yeah, anyway. 

196
00:11:01,884 --> 00:11:06,551
Um, that was interesting. 
After that I had got a bit 

197
00:11:06,551 --> 00:11:10,028
frustrated with all the 
politics, which is something I 

198
00:11:10,028 --> 00:11:11,183
think a lot of people go 
through. 

199
00:11:11,273 --> 00:11:13,970
And I was also kind of 
frustrated with the Java 

200
00:11:13,970 --> 00:11:17,295
language as it was at the time. 
Not kind of, I was very 

201
00:11:17,295 --> 00:11:21,958
frustrated. 
I felt that the things we were 

202
00:11:21,958 --> 00:11:28,078
doing as builders of frameworks 
and libraries, we were very, we 

203
00:11:28,078 --> 00:11:32,343
were always stuck in this 
straitjacket of what was 

204
00:11:32,343 --> 00:11:35,665
possible in the language. 
Even today, there are just 

205
00:11:35,665 --> 00:11:39,539
things that are missing from 
Java that would make my life as 

206
00:11:39,539 --> 00:11:43,933
an API or library designer, you 
know, like the ability to be 

207
00:11:43,933 --> 00:11:47,109
able to refer in a type safe way
to a method of function, right? 

208
00:11:47,369 --> 00:11:50,953
You know, the lack of method 
references is to my mind, just, 

209
00:11:50,953 --> 00:11:54,635
you know, 2025, the language has
been around for decades, it is 

210
00:11:54,635 --> 00:11:56,857
crazy, right? 
Java has improved a lot. 

211
00:11:56,857 --> 00:11:59,745
At that time, you know, we 
didn't even have higher order 

212
00:11:59,745 --> 00:12:03,723
functions, etc. 
So I proposed to my boss that 

213
00:12:03,723 --> 00:12:09,581
we'd do a language that would 
act as, that would enable us to 

214
00:12:09,581 --> 00:12:14,387
do more in our platform and in 
the libraries and frameworks we 

215
00:12:14,387 --> 00:12:17,377
were building. 
And so that's where, that's how 

216
00:12:17,377 --> 00:12:21,645
Ceylon started. 
Ceylon was something, it's 

217
00:12:21,645 --> 00:12:25,302
something I, at one stage after 
it was all, after the dust all 

218
00:12:25,302 --> 00:12:28,070
settled, I sat down and realized
I'd spent 10 years of my life on

219
00:12:28,070 --> 00:12:28,684
that, right? 
Yeah. 

220
00:12:28,684 --> 00:12:35,034
Um, and I mean, in a sense, I 
mean we did a lot of, you know, 

221
00:12:35,034 --> 00:12:38,682
really great technical things. 
The type system of the language 

222
00:12:38,682 --> 00:12:43,526
is, you know, I mean, I will 
defend it that this, that is the

223
00:12:43,526 --> 00:12:48,248
right type system for a language
with subtype and parametric 

224
00:12:48,248 --> 00:12:52,996
polymorphism and normal typing. 
Like that is the correct type 

225
00:12:52,996 --> 00:12:54,994
system. 
And there are things which just 

226
00:12:54,994 --> 00:12:57,305
work out so much more elegantly 
with that type system. 

227
00:12:58,028 --> 00:13:00,912
Sadly, you know, the, in terms 
of our commercial perspective, 

228
00:13:00,912 --> 00:13:04,343
you know, we had a user 
community, but it just never... 

229
00:13:04,343 --> 00:13:07,976
Red Hat, in part because Red Hat
didn't really know what to do 

230
00:13:07,976 --> 00:13:09,768
with it in terms of promoting 
it. 

231
00:13:10,016 --> 00:13:13,352
In part, I'm sure because of 
mistakes, you know, we made, it 

232
00:13:13,352 --> 00:13:16,655
wasn't so easy to just kind of 
start using it in a language, in

233
00:13:16,655 --> 00:13:19,709
a, excuse me, in a project which
was already in Java anyway. 

234
00:13:20,674 --> 00:13:22,864
It wasn't a success and 
eventually the project ended. 

235
00:13:22,924 --> 00:13:27,716
Um, and that was a, you know, 
really a thing which, you know, 

236
00:13:27,716 --> 00:13:31,958
sent me, you know, really into a
period of, I don't know, I 

237
00:13:31,958 --> 00:13:34,962
wouldn't say depression because 
I had my family, I had my salsa,

238
00:13:34,962 --> 00:13:36,930
I had, you know, lots of things 
going on. 

239
00:13:36,930 --> 00:13:41,283
But, um, but in terms of, uh, 
career wise, I was very, um, 

240
00:13:41,283 --> 00:13:44,347
unmotivated. 
And, you know, I would say that,

241
00:13:44,347 --> 00:13:47,374
you know, so that's important to
acknowledge that, you know, a 

242
00:13:47,374 --> 00:13:50,520
career goes through, you know, 
ups and downs with, you know, 

243
00:13:50,520 --> 00:13:53,784
these incredibly intense periods
and then periods where, um, 

244
00:13:53,784 --> 00:13:57,422
just, you know, things you just 
feel like, you know, well, what 

245
00:13:57,422 --> 00:14:00,690
do I do next, you know? 
I don't have anything. 

246
00:14:01,645 --> 00:14:05,269
And, um, eventually when Quarkus
came along and we were kind of 

247
00:14:05,269 --> 00:14:07,730
looking around and realized that
persistence was still, and I sat

248
00:14:07,730 --> 00:14:11,210
down one day and I was like, oh,
they wanna use Hibernate. 

249
00:14:11,210 --> 00:14:13,550
And I'm like, it's like 15 
years. 

250
00:14:13,550 --> 00:14:16,304
And they, I'm like, is this 
still something that's... 

251
00:14:16,304 --> 00:14:19,444
Yeah, I'm like, is this so still
something that's relevant and 

252
00:14:19,444 --> 00:14:22,086
important today? 
And, you know, so I went and 

253
00:14:22,086 --> 00:14:25,547
like pulled some the data set 
they have for Stack Overflow and

254
00:14:25,547 --> 00:14:28,451
did some analysis on that and, 
you know, looked at some other. 

255
00:14:28,451 --> 00:14:30,947
And it turns out, oh yeah, 
actually it turns out this is 

256
00:14:30,947 --> 00:14:33,791
still what everybody's still all
using. 

257
00:14:34,931 --> 00:14:38,051
And we've kind of had it a bit 
in maintenance mode, right? 

258
00:14:38,563 --> 00:14:44,733
And so, you know, I'd say, I 
don't want to say that this all 

259
00:14:44,733 --> 00:14:48,424
happened all at once, but so I 
kind of came back and started 

260
00:14:48,424 --> 00:14:51,942
asking the question of, well, if
we were just designing this 

261
00:14:51,942 --> 00:14:54,078
today, what would we do 
different? 

262
00:14:54,215 --> 00:14:59,155
How can we go beyond what were 
the limitations? 

263
00:15:00,372 --> 00:15:03,360
And so somehow I got dragged 
back into doing, to doing 

264
00:15:03,360 --> 00:15:05,902
Hibernate again. 
Something I'd promised that I 

265
00:15:05,902 --> 00:15:09,404
wasn't gonna let happen. 
I don't know, the last, it turns

266
00:15:09,404 --> 00:15:11,972
out that there was so much still
to do and the persistence, you 

267
00:15:11,972 --> 00:15:13,772
know, nobody talks about 
persistence, but it's like 

268
00:15:14,222 --> 00:15:20,422
something that is so central to 
really what most program, 

269
00:15:20,422 --> 00:15:24,249
enterprise programs do that it's
something we should actually 

270
00:15:24,249 --> 00:15:27,302
probably talk about more. 
So, yeah. 

271
00:15:27,302 --> 00:15:30,163
So that brings me here and um, 
and that's what I've been 

272
00:15:30,163 --> 00:15:31,682
working on recently. 
Wow. 

273
00:15:31,862 --> 00:15:34,676
Thank you so much for sharing, 
you know, almost kind of like a 

274
00:15:34,676 --> 00:15:36,272
full picture of your career, I 
would say. 

275
00:15:36,632 --> 00:15:39,764
There are ups and downs. 
I think one thing that really 

276
00:15:39,764 --> 00:15:41,702
stood out for me is your 
persistence. 

277
00:15:41,762 --> 00:15:44,192
I mean, not talking about 
'persistence', but persistence 

278
00:15:44,192 --> 00:15:48,740
in pursuing the idealism, right?
So like when you fought with 

279
00:15:48,740 --> 00:15:52,495
your boss, you know, trying to 
pursue how to create standards, 

280
00:15:52,495 --> 00:15:55,138
specifications, making the open 
source successful. 

281
00:15:55,138 --> 00:15:58,046
And then creating a new language
because you think there will be 

282
00:15:58,046 --> 00:16:00,168
a better way of creating new 
language. 

283
00:16:00,848 --> 00:16:03,564
And then yeah, coming back to, 
um, you know, working on the 

284
00:16:03,564 --> 00:16:06,420
Jakarta EE stuff, I think, 
definitely, we, as community, 

285
00:16:06,420 --> 00:16:09,740
can thank you for your 
contributions towards all these,

286
00:16:09,740 --> 00:16:13,694
uh, great inventions, right? 
So maybe if I can just try to 

287
00:16:13,694 --> 00:16:16,280
pick some parts of what you just
shared, right? 

288
00:16:16,310 --> 00:16:17,560
Let's start with Hibernate, 
right? 

289
00:16:17,560 --> 00:16:20,430
So you were saying back then 
EJBs, right? 

290
00:16:20,430 --> 00:16:23,040
My experience with EJB is when I
studied in university. 

291
00:16:23,140 --> 00:16:28,610
Maybe it's EJB2 something. 
It was quite horrible, in fact. 

292
00:16:29,030 --> 00:16:32,652
Um, but what I wanted to ask you
is like what exactly the 

293
00:16:32,652 --> 00:16:36,285
problems that you saw back then 
that led you to creating 

294
00:16:36,285 --> 00:16:38,578
Hibernate? 
Like because Hibernate is like a

295
00:16:38,578 --> 00:16:40,348
new paradigm altogether. 
The way it works... 

296
00:16:40,388 --> 00:16:43,518
I wouldn't say that, but finish,
finish the question. 

297
00:16:43,823 --> 00:16:47,678
Yeah, because to me back then it
was like totally new paradigm. 

298
00:16:47,798 --> 00:16:50,488
It's a POJO thing, right? 
And then you have some, you 

299
00:16:50,488 --> 00:16:53,340
know, annotations and all that. 
It feels different for me. 

300
00:16:53,430 --> 00:16:55,500
But maybe tell us a little bit 
more the story. 

301
00:16:55,530 --> 00:16:58,260
What frustrated you the most and
why? 

302
00:16:58,290 --> 00:17:00,070
What led you to creating 
Hibernate? 

303
00:17:00,595 --> 00:17:05,935
Yeah, that's a good question. 
So it was unclear I would say at

304
00:17:05,935 --> 00:17:09,924
the time, whether, and I'm still
unclear on this whether entity 

305
00:17:09,924 --> 00:17:13,137
beans had ever, you know... 
Okay, first of all, let, I'll 

306
00:17:13,137 --> 00:17:16,666
take, let me take a step back. 
I wasn't around, I was like, the

307
00:17:16,666 --> 00:17:21,896
very beginning of my career, I 
was not involved in at all in 

308
00:17:21,896 --> 00:17:27,663
the creation of any of the Java 
platform up until Java, up until

309
00:17:27,663 --> 00:17:32,273
EJB3. 
I don't really know what 

310
00:17:32,273 --> 00:17:35,486
happened, right? 
And I, and so it's hard for me 

311
00:17:35,486 --> 00:17:37,637
to come up with explanations for
what went wrong. 

312
00:17:38,087 --> 00:17:44,927
But my speculation has always 
been that Java was new. 

313
00:17:45,947 --> 00:17:51,020
Nobody actually knew how to 
write Java effectively at the 

314
00:17:51,020 --> 00:17:55,865
time. 
And I speculate or infer that 

315
00:17:55,865 --> 00:18:01,469
the people who were writing the 
specifications for the early 

316
00:18:01,469 --> 00:18:08,009
versions of Java EE were in fact
not Java developers because, you

317
00:18:08,009 --> 00:18:10,736
know, that was the next 
generation of people who were 

318
00:18:10,736 --> 00:18:14,433
actually Java developers, right?
And so they had inherited some 

319
00:18:14,433 --> 00:18:18,119
thinking about the ways to do 
things, which kind of came from,

320
00:18:18,119 --> 00:18:21,591
you know, C++ and kind of came, 
you know, from CORBA, and the 

321
00:18:21,591 --> 00:18:24,689
work on that. 
And the web was new and the 

322
00:18:24,689 --> 00:18:27,744
whole question of how you 
architect, what the architecture

323
00:18:27,744 --> 00:18:32,749
for program, which, you know, 
makes data available on the web.

324
00:18:32,839 --> 00:18:35,629
I mean this was something which 
was new. 

325
00:18:35,900 --> 00:18:38,000
And there weren't, you know, 
answers. 

326
00:18:38,000 --> 00:18:42,357
And so it takes, so it is normal
that you take some time to 

327
00:18:42,357 --> 00:18:45,620
evolve or a meaningful, you 
know, the right solution. 

328
00:18:46,307 --> 00:18:50,393
I think what went wrong was that
somehow some people's 

329
00:18:50,393 --> 00:18:55,160
experiments kind of got pushed 
suddenly, all of a sudden on, 

330
00:18:55,160 --> 00:18:59,988
you know, I don't know, hundreds
of thousands of developers 

331
00:18:59,988 --> 00:19:04,653
before going through a process 
of maturation and, you know, 

332
00:19:04,653 --> 00:19:07,087
okay, did that work? 
Or, you know, no, well, we 

333
00:19:07,087 --> 00:19:11,006
better change it like this. 
And so it was kind of a victim 

334
00:19:11,006 --> 00:19:14,306
of its own success and suddenly 
you had a bunch of angry people 

335
00:19:14,306 --> 00:19:16,471
because if you told that this 
was the way, this is what they 

336
00:19:16,471 --> 00:19:18,900
had to do, which is probably 
never the attention of the 

337
00:19:18,900 --> 00:19:20,528
people developing. 
You know, I'm quite certain that

338
00:19:20,528 --> 00:19:22,758
the people who are developing 
this platform, you know, you 

339
00:19:22,758 --> 00:19:24,585
used to hear oh, vendors, 
they're terrible. 

340
00:19:24,585 --> 00:19:26,295
They do, you know, they're 
always in their own interest. 

341
00:19:26,295 --> 00:19:27,805
No, I'm quite certain. 
I know some of these. 

342
00:19:27,805 --> 00:19:28,815
You know, I've met some of these
people. 

343
00:19:28,815 --> 00:19:31,065
I'm sure that their intentions 
would've produce something great

344
00:19:31,065 --> 00:19:33,705
that made it easy as possible to
build these systems. 

345
00:19:34,331 --> 00:19:38,550
But I think that just nobody 
knew the right way to do things 

346
00:19:38,550 --> 00:19:41,009
at that time. 
And so I think that's, I think 

347
00:19:41,009 --> 00:19:43,986
that's what went wrong. 
Specifically in the case of 

348
00:19:43,986 --> 00:19:46,086
entity beans, which was always 
the worst part of it. 

349
00:19:46,086 --> 00:19:49,416
I'm not even clear that they 
were originally intended for 

350
00:19:50,301 --> 00:19:54,701
object relational mapping, okay.
I don't know the answer to that.

351
00:19:54,741 --> 00:19:56,661
It's unclear. 
I've heard some people say no, 

352
00:19:56,661 --> 00:20:00,155
I've heard some people say yes. 
But certainly they were 

353
00:20:00,155 --> 00:20:03,140
interpreted as that. 
You know, with an identity or at

354
00:20:03,140 --> 00:20:05,447
least people with looking, you 
know, people obviously were 

355
00:20:05,447 --> 00:20:07,573
looking for, okay, well okay, 
we've got this platform. 

356
00:20:07,573 --> 00:20:09,685
You know, how do you do, you 
know, how am I supposed to 

357
00:20:09,685 --> 00:20:11,845
interact with the database? 
And so, you know, that was an 

358
00:20:11,845 --> 00:20:13,350
obvious construct to map to the 
data. 

359
00:20:13,350 --> 00:20:15,566
Oh, we have these things with an
identity that are sort of 

360
00:20:15,566 --> 00:20:17,060
persistent and so we'll try to 
map them to that. 

361
00:20:17,421 --> 00:20:20,992
The issue was that building an 
object relational mapping 

362
00:20:20,992 --> 00:20:23,128
solution is an enormous 
undertaking. 

363
00:20:23,188 --> 00:20:26,808
And that just wasn't, just 
wasn't there, you know? 

364
00:20:26,888 --> 00:20:29,392
Um, nobody had a good enough 
implementation. 

365
00:20:31,372 --> 00:20:37,300
A second problem with this issue
of how I'm trying to avoid all 

366
00:20:37,300 --> 00:20:40,547
sorts of words I hate, like 
heavyweight, um, which I think 

367
00:20:40,547 --> 00:20:47,019
is a meaningless term, um. 
In EJB, there was an extremely 

368
00:20:47,019 --> 00:20:50,211
intrusive programming model and 
quite verbose. 

369
00:20:51,051 --> 00:20:54,981
And this was in a time when Java
the language didn't have the 

370
00:20:54,981 --> 00:20:58,476
kind of tooling we have today. 
The language itself was more 

371
00:20:58,476 --> 00:21:01,041
verbose. 
We certainly didn't have coding 

372
00:21:01,041 --> 00:21:05,059
assistants. 
And so the amount of just typing

373
00:21:05,059 --> 00:21:09,795
it took to create a simple piece
of functionality was out of 

374
00:21:09,795 --> 00:21:12,112
control. 
Um, sometimes people forget, 

375
00:21:12,112 --> 00:21:15,832
fail to recognize how far we've 
come, right? 

376
00:21:15,832 --> 00:21:20,755
You know, from WebSphere in 
those days to, you know, Quarkus

377
00:21:20,755 --> 00:21:23,167
today. 
I mean, just that, just the fact

378
00:21:23,167 --> 00:21:26,398
of, you know, hey, you spent all
day restarting the server and, 

379
00:21:26,398 --> 00:21:30,062
you know, to see your changes. 
I mean, it was awful. 

380
00:21:30,222 --> 00:21:33,092
You know, nowadays with Quarkus,
you just make a change and there

381
00:21:33,092 --> 00:21:35,452
it, refresh, there it is, right?
Um, it's crazy. 

382
00:21:36,186 --> 00:21:39,238
So I would say, you know, yeah, 
it's a combination of you know, 

383
00:21:39,238 --> 00:21:41,800
people were trying to do things 
before really understanding the 

384
00:21:41,800 --> 00:21:45,568
problem well enough, and just 
because of the incredible amount

385
00:21:45,568 --> 00:21:50,832
of energy and attention, and in 
Java at the time, stuff just got

386
00:21:50,832 --> 00:21:55,726
adopted wholesale before it had 
been, you know, too fast, right,

387
00:21:55,726 --> 00:21:59,107
is what I would say happened. 
But we've, but you know, and 

388
00:21:59,107 --> 00:22:01,993
this is what I think people 
should give more credit. 

389
00:22:03,523 --> 00:22:08,092
We fixed it, right? 
Like the Java Community Process 

390
00:22:08,092 --> 00:22:12,575
responded to that. 
They went, you know, guys like, 

391
00:22:12,575 --> 00:22:16,350
you know, JBoss, you know, 
annoying JBoss people who, you 

392
00:22:16,350 --> 00:22:18,960
know, people didn't necessarily 
like us very much, right? 

393
00:22:19,560 --> 00:22:21,540
You know, we came along and 
said, no, we should do this and 

394
00:22:21,540 --> 00:22:24,018
this, and who the hell are you? 
You know, you're like four guys 

395
00:22:24,018 --> 00:22:26,708
and a dog in Atlanta, right? 
But they responded to that, 

396
00:22:26,708 --> 00:22:28,254
right? 
You know, these enormous 

397
00:22:28,254 --> 00:22:30,223
companies, they went, yeah, all 
right. 

398
00:22:30,283 --> 00:22:31,477
Okay. 
Let's do what these guys are 

399
00:22:31,477 --> 00:22:34,260
telling us we should do. 
I mean, do you realize how, you 

400
00:22:34,260 --> 00:22:37,410
know, that is something they 
deserve massive credit for. 

401
00:22:37,932 --> 00:22:41,961
And so the truth is that the 
community process that Sun had 

402
00:22:41,961 --> 00:22:44,966
set up was successfully 
responded the objections. 

403
00:22:44,966 --> 00:22:49,535
It improved the platform. 
And the platform actually kept 

404
00:22:49,535 --> 00:22:51,756
improving. 
And what we have today is, you 

405
00:22:51,756 --> 00:22:53,638
know, is it perfect? 
No, it's not perfect. 

406
00:22:54,432 --> 00:22:59,708
But in fact, you know, I mean, I
think is a sad thing is that the

407
00:22:59,708 --> 00:23:02,662
platform went through several 
years of not evolving very fast.

408
00:23:02,932 --> 00:23:06,312
Um, and I, I'm hopeful that 
there's a quite a fair amount of

409
00:23:06,312 --> 00:23:08,897
energy coming back into it right
now and coming back into, 

410
00:23:08,897 --> 00:23:11,218
certainly, on the persistent 
side, things are moving very 

411
00:23:11,218 --> 00:23:15,306
fast right now. 
And so, yeah, like, um, I know I

412
00:23:15,306 --> 00:23:17,990
say too much about 
specifications and about, you 

413
00:23:17,990 --> 00:23:20,095
know. 
But you know, I think that's 

414
00:23:20,095 --> 00:23:22,799
some of the narrative I hear, I 
think is unfair. 

415
00:23:23,149 --> 00:23:24,634
Sorry. 
Yeah. 

416
00:23:24,634 --> 00:23:26,309
Thanks for sharing the 
perspective from you. 

417
00:23:26,369 --> 00:23:29,463
Like I'm, even though that's not
true, right, a hundred percent, 

418
00:23:29,463 --> 00:23:33,208
but at least we got a glimpse 
how difficult it is to actually 

419
00:23:33,208 --> 00:23:36,432
evolve a language that is being 
used by a lot of people, 

420
00:23:36,432 --> 00:23:38,619
especially enterprise, right? 
And there are so many vendors, 

421
00:23:38,619 --> 00:23:40,255
you know, backing it as well, 
right? 

422
00:23:40,255 --> 00:23:43,585
So definitely to make a change 
is not an easy thing. 

423
00:23:43,945 --> 00:23:46,893
Personally myself, maybe I 
haven't used Java a lot in the 

424
00:23:46,893 --> 00:23:49,495
last, I don't know, maybe 10 
years, let's put it that way. 

425
00:23:49,885 --> 00:23:51,895
And I saw your demo just 
recently as well. 

426
00:23:51,895 --> 00:23:55,615
I think the amount of changes, 
it seems pretty intensive. 

427
00:23:55,665 --> 00:23:59,053
Like a lot of new stuff being 
introduced to the language, you 

428
00:23:59,053 --> 00:24:01,033
know? 
I think it's pretty exciting if 

429
00:24:01,033 --> 00:24:04,203
let's say people are still 
working on the new Java, uh, 

430
00:24:04,203 --> 00:24:06,470
version, right? 
Yeah, yeah. 

431
00:24:06,560 --> 00:24:08,865
I think there are people, 
sometimes I see comments from 

432
00:24:08,865 --> 00:24:11,561
people talking about, you know, 
criticizing Java and I can just 

433
00:24:11,561 --> 00:24:15,000
see, I can just see that they 
are thinking of a version of 

434
00:24:15,000 --> 00:24:17,930
Java which existed 10 to, you 
know, 10 years ago. 

435
00:24:17,970 --> 00:24:22,204
And it is not the reality of the
current technology, you know, of

436
00:24:22,204 --> 00:24:23,320
what's there today. 
Right. 

437
00:24:23,950 --> 00:24:26,950
So Hibernate definitely is like 
one of your biggest achievement,

438
00:24:26,950 --> 00:24:29,290
I would say, right, um, in your 
career. 

439
00:24:29,680 --> 00:24:33,370
So obviously, it's very hard to 
kind of like summarize the key 

440
00:24:33,370 --> 00:24:36,804
success factors to the project. 
But now we can see like millions

441
00:24:36,804 --> 00:24:38,739
of downloads. 
Maybe people even like pulling 

442
00:24:38,739 --> 00:24:41,589
it out of a framework without 
actually knowing Hibernate is 

443
00:24:41,589 --> 00:24:43,291
there. 
And there are many contributors 

444
00:24:43,291 --> 00:24:45,279
as well. 
I think Sanne told me the other 

445
00:24:45,279 --> 00:24:47,889
day there are like thousands of 
contributors to the project. 

446
00:24:48,609 --> 00:24:51,039
Maybe as a creator yourself, 
first, like how do you feel 

447
00:24:51,039 --> 00:24:53,975
about it and what do you think, 
if you can pick maybe, I don't 

448
00:24:53,975 --> 00:24:56,379
know, top three, top five key 
things that make Hibernate 

449
00:24:56,379 --> 00:24:57,789
really successful? 
Hmm. 

450
00:24:58,238 --> 00:24:59,918
I mean, first of all, I mean 
it's wonderful. 

451
00:24:59,918 --> 00:25:05,040
I mean, I'm so happy to have, 
you know, got lucky enough to 

452
00:25:05,040 --> 00:25:09,811
have been able to do something 
that was so, you know, kind of 

453
00:25:09,811 --> 00:25:11,911
so significant in enough 
people's lives. 

454
00:25:11,971 --> 00:25:16,143
Um, you know, I think that's the
most you can hope to get out of 

455
00:25:16,143 --> 00:25:21,853
a career is um, to make things 
better for a significant number 

456
00:25:21,853 --> 00:25:25,341
of people. 
Yeah, I actually, Sanne would 

457
00:25:25,341 --> 00:25:28,047
know how many contributors there
are because we recently went 

458
00:25:28,047 --> 00:25:30,655
through the process of, he 
recently led the process of 

459
00:25:30,655 --> 00:25:32,705
relicensing Hibernate and 
getting everybody's, all the 

460
00:25:32,705 --> 00:25:35,587
contributors' sign off and 
permission to, uh, switch to the

461
00:25:35,587 --> 00:25:38,030
Apache license. 
Um, so yeah, I mean there've 

462
00:25:38,030 --> 00:25:40,815
been a lot of people who have 
worked on it over the years. 

463
00:25:41,155 --> 00:25:45,600
So why was it successful? 
I mean, again, I think it was 

464
00:25:45,600 --> 00:25:49,200
successful because, you know, 
first of all, because it was 

465
00:25:49,200 --> 00:25:51,000
solving a problem that is 
absolutely ubiquitous. 

466
00:25:51,270 --> 00:25:53,830
Persistence, as I said, is 
something we barely talk about, 

467
00:25:53,830 --> 00:25:57,868
but it is there as an incredibly
important problem in, you know, 

468
00:25:57,868 --> 00:26:00,370
essentially all the programs 
people write. 

469
00:26:01,000 --> 00:26:03,670
It is underserved. 
People don't pay enough 

470
00:26:03,670 --> 00:26:07,638
attention to it. 
And if you can find a niche like

471
00:26:07,638 --> 00:26:11,062
that and make something which 
addresses, you know, this 

472
00:26:11,062 --> 00:26:13,680
extremely common unaddressed 
need, then it can become very 

473
00:26:13,680 --> 00:26:15,224
successful. 
Obviously, the fact that it was 

474
00:26:15,224 --> 00:26:18,285
open source, especially at that 
time, was enormously 

475
00:26:18,285 --> 00:26:21,612
significant. 
Obviously, TopLink could not. 

476
00:26:21,832 --> 00:26:25,632
TopLink, which is a relatively 
similar, took a relatively 

477
00:26:25,632 --> 00:26:29,778
similar approach didn't have the
potential to blow up the way 

478
00:26:29,778 --> 00:26:32,518
Hibernate did because of its 
commercial, the commercial 

479
00:26:32,518 --> 00:26:36,187
nature of it at that time. 
So that was very important. 

480
00:26:37,245 --> 00:26:41,782
As I kind of alluded to earlier,
I think that at that particular 

481
00:26:41,782 --> 00:26:45,761
point in time, it was very easy 
for a little open source project

482
00:26:45,761 --> 00:26:51,400
run by a couple of guys to get 
attention. 

483
00:26:52,733 --> 00:26:58,332
And I am very sad that I think, 
at least in the Java world, that

484
00:26:58,332 --> 00:27:04,618
we've lost some of that. 
And that now we expect for 

485
00:27:04,618 --> 00:27:11,514
everything to come, you know, 
all nicely packaged up from a 

486
00:27:11,514 --> 00:27:17,420
major vendor and... 
Guys, I mean, you don't need to 

487
00:27:17,420 --> 00:27:20,710
be spoonfed everything, right? 
You know, it can be good to 

488
00:27:20,710 --> 00:27:23,330
like, you know, try out 
something you find on the 

489
00:27:23,330 --> 00:27:25,976
internet, right? 
And see if it works. 

490
00:27:26,006 --> 00:27:28,546
I'm a little concerned that now 
we, you know, we have, so... 

491
00:27:28,546 --> 00:27:31,048
And I mean, it's great in some 
sense that we have this such a 

492
00:27:31,048 --> 00:27:34,318
high expectation of platform 
integration, that you just pull 

493
00:27:34,318 --> 00:27:37,006
Quarkus and then everything's 
there for you, right? 

494
00:27:38,032 --> 00:27:41,359
I mean, that's great. 
But I almost feel like we've 

495
00:27:41,359 --> 00:27:44,401
moved away from this, you know, 
thing we had where somebody 

496
00:27:44,401 --> 00:27:47,216
could put something out and 
people would try it out, and 

497
00:27:47,216 --> 00:27:50,207
then people would get in, you 
know, have their flame works on 

498
00:27:50,207 --> 00:27:52,957
the flame, flame wars on 
theserverside.com about it. 

499
00:27:53,183 --> 00:27:55,253
And it would be this thing that 
everyone was talking about. 

500
00:27:55,725 --> 00:27:58,635
Perhaps this, perhaps that just 
represents the fact that there's

501
00:27:58,635 --> 00:28:01,713
less energy in Java these days. 
Perhaps, you know, the, it is 

502
00:28:01,713 --> 00:28:05,532
still the case in, you know, if 
we would, you know, for people 

503
00:28:05,532 --> 00:28:08,265
doing AI stuff that the world 
really still is like that. 

504
00:28:08,265 --> 00:28:10,953
I'm not clear on that. 
I don't think it is, but, uh, 

505
00:28:10,953 --> 00:28:14,646
not in quite the same way. 
Yeah, um I think that was an 

506
00:28:14,646 --> 00:28:17,631
important factor that the world 
at the time was a little more. 

507
00:28:18,375 --> 00:28:20,578
And here's what I wanna, I guess
I wanna say where I'm going with

508
00:28:20,578 --> 00:28:24,150
that. 
I think that the world of blogs 

509
00:28:24,150 --> 00:28:28,716
and news sites was a better 
world than the world of Twitter 

510
00:28:28,716 --> 00:28:33,378
and LinkedIn, right, for people 
trying to build interesting 

511
00:28:33,378 --> 00:28:35,669
things, right? 
Why do you think that's the 

512
00:28:35,669 --> 00:28:39,967
case? 
It was the fact that you could 

513
00:28:39,967 --> 00:28:42,139
publish news on 
theserverside.com, that would 

514
00:28:42,139 --> 00:28:44,433
go, ah, great, you know, they 
would publish anything, right? 

515
00:28:45,242 --> 00:28:47,394
And the whole, you know, kind of
the whole, not the whole 

516
00:28:47,394 --> 00:28:49,847
community, but like a 
significant chunk of the 

517
00:28:49,847 --> 00:28:52,911
community would see that and 
respond to it. 

518
00:28:54,230 --> 00:28:59,704
Twitter is like this fragmented 
thing where people don't 

519
00:28:59,704 --> 00:29:02,990
interact because, I mean, what 
happens on social media? 

520
00:29:02,990 --> 00:29:05,649
Yeah, we used to have flame 
wars, but I mean, social media 

521
00:29:05,649 --> 00:29:10,380
flame wars in this tiny little, 
you know, messages are way more 

522
00:29:10,380 --> 00:29:12,801
toxic. 
And so people don't interact, 

523
00:29:12,801 --> 00:29:17,442
people don't get into any sort 
of debate of substance on social

524
00:29:17,442 --> 00:29:19,934
media today. 
You know, um, you have people 

525
00:29:19,934 --> 00:29:25,196
post stuff on LinkedIn. 
It's crazy to say, but LinkedIn 

526
00:29:25,196 --> 00:29:28,530
is kind of better than, more 
interesting than Twitter these 

527
00:29:28,530 --> 00:29:33,331
days, it feels like. 
And yeah, it just, it's just the

528
00:29:33,331 --> 00:29:36,609
nature of, you know, where 
publications have to fit on the 

529
00:29:36,609 --> 00:29:40,567
screen of that thing. 
Um, there's just less content, 

530
00:29:40,567 --> 00:29:43,897
there's less sophisticated ideas
being communicated. 

531
00:29:43,977 --> 00:29:47,172
And somehow we have to get back 
to... 

532
00:29:47,172 --> 00:29:51,911
I mean, there's no going back to
blogs, I guess, but we have to 

533
00:29:51,911 --> 00:29:56,341
open up a space where people can
communicate ideas that don't fit

534
00:29:56,341 --> 00:30:01,057
in on this, this, I dunno how, I
don't know how that's gonna 

535
00:30:01,057 --> 00:30:02,560
work, right? 
But it'll have, it'll happen 

536
00:30:02,560 --> 00:30:03,210
eventually. 
Right. 

537
00:30:03,610 --> 00:30:05,945
I think some of the alternatives
these days are like Reddit, 

538
00:30:05,945 --> 00:30:07,255
Hacker News, those kind of 
stuff. 

539
00:30:07,255 --> 00:30:10,646
But obviously sometimes it's 
like the social media effect as 

540
00:30:10,646 --> 00:30:12,727
well. 
If it doesn't get picked up by 

541
00:30:12,727 --> 00:30:14,685
somebody. 
And it doesn't get commented as 

542
00:30:14,685 --> 00:30:17,980
well, I guess it will be drowned
against all the other posts. 

543
00:30:18,411 --> 00:30:20,891
So yeah, definitely thanks for 
sharing, um, you know, the key 

544
00:30:20,891 --> 00:30:23,501
success factors. 
And I think it works as well, 

545
00:30:23,501 --> 00:30:25,631
right? 
Hibernate works compared to, you

546
00:30:25,631 --> 00:30:29,588
know, well, I guess that's the 
key success factor, uh, as well,

547
00:30:29,588 --> 00:30:32,489
right? 
And it gets adopted by other 

548
00:30:32,489 --> 00:30:35,965
frameworks as well. 
So I think, and the vendors, the

549
00:30:35,965 --> 00:30:38,163
enterprise, Java Enterprise 
server or something like that, 

550
00:30:38,163 --> 00:30:39,721
right? 
And once again, right? 

551
00:30:39,791 --> 00:30:42,029
It was important. 
People may not realize it and 

552
00:30:42,029 --> 00:30:43,181
some people thought it wasn't 
important. 

553
00:30:43,181 --> 00:30:44,711
Some people thought we shouldn't
do it, right? 

554
00:30:45,161 --> 00:30:47,751
It was important that we wrote 
the JPA spec. 

555
00:30:48,041 --> 00:30:50,537
And that then the Hibernate was 
implementing a specification 

556
00:30:50,537 --> 00:30:53,705
that was, you know, the 
specification is this public 

557
00:30:53,705 --> 00:30:57,961
document that says, hey those of
us who know something about this

558
00:30:57,961 --> 00:31:02,417
topic, TopLink and you know, and
JBoss and Sun and IBM, we've 

559
00:31:02,417 --> 00:31:05,771
come together and we've agreed, 
we've come to agreement that 

560
00:31:05,771 --> 00:31:08,241
this is the right way to do 
persistence in Java. 

561
00:31:08,301 --> 00:31:11,348
And here we have documented, 
laid out what it has to do, 

562
00:31:11,348 --> 00:31:13,671
right? 
There is huge value in that. 

563
00:31:13,721 --> 00:31:17,372
And it was important to 
Hibernate, to the existence of 

564
00:31:17,372 --> 00:31:19,557
Hibernate I believe, that we did
that. 

565
00:31:19,557 --> 00:31:23,727
We took that step. 
Um Otherwise, I'm not quite sure

566
00:31:23,727 --> 00:31:27,749
what would've happened. 
But you know, I mean, you can 

567
00:31:27,749 --> 00:31:30,496
say that, okay, you know, Spring
have always been hostile to 

568
00:31:30,496 --> 00:31:33,307
going down that path and they've
become successful anyway. 

569
00:31:35,017 --> 00:31:37,513
I dunno how much I want to go. 
Let's, let's not go, let's not 

570
00:31:37,513 --> 00:31:42,045
go there right now. 
Um, but, um, to me, I think 

571
00:31:42,045 --> 00:31:45,591
that, particularly given that 
Hibernate at the time was not 

572
00:31:45,591 --> 00:31:48,032
the only game in town, that it 
was very important to have, 

573
00:31:48,032 --> 00:31:52,436
being part of, to have had the 
specification where we would, 

574
00:31:52,436 --> 00:31:54,484
where we were not the only 
implementer, that there was 

575
00:31:54,484 --> 00:31:56,226
TopLink, but there was other 
things implementing it, right? 

576
00:31:56,496 --> 00:31:57,636
I think that was also important.
Right. 

577
00:31:58,176 --> 00:32:01,861
I think this is also a good 
segue to go to your work at the 

578
00:32:01,861 --> 00:32:03,816
standards, specifications and 
all that, right? 

579
00:32:04,134 --> 00:32:07,910
I think for many people, right, 
we are not involved in this kind

580
00:32:07,910 --> 00:32:10,870
of process, right? 
So maybe let's try to demystify 

581
00:32:10,870 --> 00:32:14,037
what actually happened behind 
the scenes when people are 

582
00:32:14,037 --> 00:32:16,620
putting JSR, putting something 
to the standards. 

583
00:32:17,000 --> 00:32:19,790
And you were mentioning 
political a few times. 

584
00:32:19,790 --> 00:32:22,836
I guess maybe if you can share a
little bit, um, like what's the 

585
00:32:22,836 --> 00:32:25,040
process like? 
How difficult it is to introduce

586
00:32:25,040 --> 00:32:29,075
a change to a language that is 
kind of like widely used, a lot 

587
00:32:29,075 --> 00:32:31,925
of enterprise usage, and it has 
to be backward compatible, 

588
00:32:31,925 --> 00:32:33,806
right? 
I think that those kind of main 

589
00:32:33,806 --> 00:32:34,790
things about Java. 
Sure. 

590
00:32:35,205 --> 00:32:36,855
So I can't talk about the 
language. 

591
00:32:36,855 --> 00:32:40,770
I've never been involved in the 
Java SE side of things, okay? 

592
00:32:40,770 --> 00:32:44,898
Um, I can say sort of a little 
bit how it used to work with the

593
00:32:44,898 --> 00:32:48,230
EE specs was that, you know, you
submitted a JSR and one of the, 

594
00:32:48,230 --> 00:32:52,547
one of the big things was to 
have a specification request and

595
00:32:52,547 --> 00:32:56,144
they convince enough of the 
members of the executive 

596
00:32:56,144 --> 00:32:58,139
committee, hey, this is 
something that should, you know,

597
00:32:58,139 --> 00:32:59,900
give us a chance to work on 
this, right? 

598
00:33:00,838 --> 00:33:04,480
Then you need to form a group of
people who are actually gonna 

599
00:33:04,480 --> 00:33:08,160
support and actually, you know, 
give meaningful feedback. 

600
00:33:08,160 --> 00:33:11,587
You don't wanna just sit down by
yourself and write a spec and 

601
00:33:11,587 --> 00:33:14,920
then say, hey, vote on this, 
right? 

602
00:33:15,020 --> 00:33:19,710
Um, you want to get, you know, 
you actually have to get 

603
00:33:19,710 --> 00:33:22,374
meaningful feedback and 
suggestions from, you know, the 

604
00:33:22,374 --> 00:33:24,256
other people working in that 
space. 

605
00:33:24,256 --> 00:33:27,136
Because the simple fact of the 
matter is, you know, often I 

606
00:33:27,136 --> 00:33:29,176
know what the right answer 
should be. 

607
00:33:30,359 --> 00:33:32,709
Not always. 
You know, very often someone 

608
00:33:32,709 --> 00:33:36,155
would come and I'd be like, oh, 
you know, oh yeah, shit, I 

609
00:33:36,155 --> 00:33:38,399
didn't think about it. 
Yeah, we should do that instead.

610
00:33:38,399 --> 00:33:42,014
You know, great. 
Like, you know, having a way to 

611
00:33:42,014 --> 00:33:45,779
gather feedback from, you know, 
especially feedback from other 

612
00:33:45,779 --> 00:33:50,262
groups, which may be, you know, 
you may, they may, you know, it 

613
00:33:50,262 --> 00:33:52,170
may be vicious competitors in 
other scenarios. 

614
00:33:52,692 --> 00:33:56,547
But you want to get together, 
you know, ideas. 

615
00:33:58,214 --> 00:34:01,921
I think people imagine that the 
process of writing a spec is a 

616
00:34:01,921 --> 00:34:05,944
lot more, involves a lot more 
horse trading than it does, than

617
00:34:05,944 --> 00:34:08,683
it actually does. 
Obviously there is a lot of 

618
00:34:08,683 --> 00:34:11,221
negotiation, but the kind of 
negotiation that at least 

619
00:34:11,221 --> 00:34:14,993
ideally is more, you know, 
involves a lot more, okay, let's

620
00:34:14,993 --> 00:34:20,331
all sit down and think about 
what is the best solution that 

621
00:34:20,331 --> 00:34:22,315
addresses everyone's substantive
concerns. 

622
00:34:22,516 --> 00:34:27,677
I have not, at least in my 
experience, I have not seen this

623
00:34:27,677 --> 00:34:30,889
dynamic that people, I believe 
assume, and that I used to hear 

624
00:34:30,889 --> 00:34:32,539
people from outside saying, 
that's how it works. 

625
00:34:32,569 --> 00:34:35,215
Oh, such and such is trying to 
standardize their technology, 

626
00:34:35,215 --> 00:34:37,040
right? 
And they're just trying to put a

627
00:34:37,040 --> 00:34:41,007
rubber stamp on. 
I have never particularly seen 

628
00:34:41,007 --> 00:34:43,206
that dynamic. 
Yes, people will come and they 

629
00:34:43,206 --> 00:34:45,109
will have a product now of an 
implementation and obviously, 

630
00:34:45,109 --> 00:34:47,268
you know, that does what they 
thought was the best, you know, 

631
00:34:47,418 --> 00:34:48,469
the right way to solve the 
problem. 

632
00:34:48,469 --> 00:34:49,909
And they'll say, yeah, we should
do something like this. 

633
00:34:49,909 --> 00:34:52,112
Okay. 
But I, you know, at least the 

634
00:34:52,112 --> 00:34:54,699
people, you know, most of the 
people who are actually get 

635
00:34:54,699 --> 00:34:57,385
involved in this sort of work 
are people who are, you know, 

636
00:34:57,385 --> 00:34:59,191
extremely open-minded, are 
extremely committed to finding 

637
00:34:59,191 --> 00:35:01,429
the technically best, you know, 
option. 

638
00:35:02,314 --> 00:35:05,329
And so in the, you know, in the 
best case where people are, 

639
00:35:05,329 --> 00:35:07,859
uh... and also it takes a 
particular personality type, 

640
00:35:07,859 --> 00:35:09,842
right? 
It takes the sort of 

641
00:35:09,842 --> 00:35:13,780
personality, which isn't the 
sort of person who is not gonna,

642
00:35:13,780 --> 00:35:19,209
sort of get defensive of the 
first solution they came up 

643
00:35:19,209 --> 00:35:22,273
with. 
You know, for me working on 

644
00:35:22,273 --> 00:35:25,643
these things, you know, I have 
to, you know, it's something I 

645
00:35:25,643 --> 00:35:28,928
like in there, always telling 
myself, always telling myself, 

646
00:35:28,928 --> 00:35:33,103
okay, don't, you know, give 
this, it's fair. 

647
00:35:33,103 --> 00:35:38,122
You know, give this, what this 
person's saying its fair 

648
00:35:38,122 --> 00:35:41,596
hearing. 
Switch into this mode where you 

649
00:35:41,596 --> 00:35:44,946
take this idea seriously and 
take it and see how far it gets,

650
00:35:44,946 --> 00:35:47,824
right? 
And that's not to say I'll be 

651
00:35:47,824 --> 00:35:50,679
like, you know, oh yeah, that's 
a great idea to every proposal. 

652
00:35:50,679 --> 00:35:52,747
Absolutely not. 
In fact, I'm more likely to be 

653
00:35:52,747 --> 00:35:55,179
okay about this, right? 
And this and this, okay. 

654
00:35:55,179 --> 00:35:57,367
But, you know, it has to go 
through that process, right, as 

655
00:35:57,367 --> 00:35:58,624
well. 
But that doesn't mean that I'm 

656
00:35:58,624 --> 00:36:01,159
not there telling myself, okay, 
but what are the pluses of this?

657
00:36:01,159 --> 00:36:02,569
You know, even if I don't like 
it, right? 

658
00:36:02,569 --> 00:36:06,274
Where, what does it have, what 
is there in there that even if 

659
00:36:06,274 --> 00:36:10,510
this is not what we go with, 
that we need to somehow recover 

660
00:36:10,510 --> 00:36:15,955
that good aspect of it, right? 
And so that takes a particular 

661
00:36:15,955 --> 00:36:20,690
sort of mental discipline. 
I think not everybody has or 

662
00:36:20,690 --> 00:36:24,675
wants to have or whatever. 
I don't know, it's a different, 

663
00:36:24,675 --> 00:36:26,781
it's a different thing to 
sitting down and writing code, 

664
00:36:26,781 --> 00:36:30,152
obviously. 
Yeah, I guess it involves a lot 

665
00:36:30,152 --> 00:36:32,493
of people, right? 
Maybe, uh, a lot of backers as 

666
00:36:32,493 --> 00:36:34,359
well. 
Typically, typically not. 

667
00:36:34,359 --> 00:36:37,523
So typically the specifications 
I've worked on had a relatively 

668
00:36:37,523 --> 00:36:40,178
small number of active 
contributors. 

669
00:36:40,178 --> 00:36:42,398
In fact, that's probably what 
works best. 

670
00:36:42,398 --> 00:36:45,959
It's, you know, when you have 
three or four people with, you 

671
00:36:45,959 --> 00:36:49,404
know, two or three suggestions 
for how to do something that's 

672
00:36:49,404 --> 00:36:53,680
probably works better than if 
you have 20 people with too many

673
00:36:53,680 --> 00:36:58,706
good ideas, right? 
So I think definitely, right, 

674
00:36:58,706 --> 00:37:02,461
the, again, the persistence of 
you pushing into the 

675
00:37:02,461 --> 00:37:04,360
specifications. 
I think we all can thank you for

676
00:37:04,360 --> 00:37:06,074
that. 
Because back then when I was 

677
00:37:06,074 --> 00:37:09,284
starting my career, right, there
was already this war between 

678
00:37:09,284 --> 00:37:11,202
standard. 
Following standards or following

679
00:37:11,202 --> 00:37:13,034
like Spring, Hibernate path, 
right? 

680
00:37:13,034 --> 00:37:17,357
Which is like open source, um. 
And back then to me like seems 

681
00:37:17,357 --> 00:37:21,003
following the open source way is
much better because again, the 

682
00:37:21,003 --> 00:37:24,045
community thrive on it. 
There are many new inventions. 

683
00:37:24,135 --> 00:37:27,690
And definitely we don't want to 
get associated with heavyweight 

684
00:37:27,750 --> 00:37:31,130
kind of server and all that. 
Nobody likes that. 

685
00:37:31,350 --> 00:37:35,310
Um, so I think now that the 
specifications kind of like get 

686
00:37:35,310 --> 00:37:38,766
evolved and modernized as well, 
I think I can see a lot of, uh, 

687
00:37:38,766 --> 00:37:40,470
so many cool things happening in
Java world. 

688
00:37:40,847 --> 00:37:44,599
So again, thank you for that. 
So one thing these days when 

689
00:37:44,599 --> 00:37:46,705
people hear about Java EE, 
right? 

690
00:37:46,909 --> 00:37:49,751
Like for me, right? 
Uh, It's kind of like renamed to

691
00:37:49,751 --> 00:37:51,571
Jakarta EE, so it's a bit 
trivia. 

692
00:37:51,843 --> 00:37:54,183
What is the story behind it and 
why Jakarta? 

693
00:37:54,183 --> 00:37:56,711
Because I'm Indonesian. 
In one sense, I'm very proud 

694
00:37:56,711 --> 00:37:59,223
about it. 
Java and then now Jakarta. 

695
00:37:59,703 --> 00:38:02,613
So maybe a little bit trivia, 
why is this, uh, renaming? 

696
00:38:02,853 --> 00:38:03,483
Yeah. 
Okay. 

697
00:38:03,483 --> 00:38:10,179
So I, first of all, I hate it. 
Um, I actually was not involved 

698
00:38:10,179 --> 00:38:13,909
in, I was away doing other 
things, Ceylon and stuff, when 

699
00:38:13,909 --> 00:38:16,690
most of that was going on. 
Max Anderson is the person from 

700
00:38:16,690 --> 00:38:19,736
our side who has, I think has 
the most visibility to what went

701
00:38:19,736 --> 00:38:22,436
on. 
So there was a lot of pressure 

702
00:38:22,436 --> 00:38:26,369
on Oracle after Oracle acquired 
Sun to make Java open source and

703
00:38:26,369 --> 00:38:31,706
to make, um, and I believe... 
No, let me not say something on 

704
00:38:31,706 --> 00:38:33,476
video where I might have my 
facts wrong. 

705
00:38:34,151 --> 00:38:38,148
Anyway, there was pressure to, 
for various reasons which as I 

706
00:38:38,148 --> 00:38:42,383
said, I'm not an expert on for, 
to make the Java EE platform, 

707
00:38:42,383 --> 00:38:45,454
you know, open source and let it
evolve out in the community. 

708
00:38:45,816 --> 00:38:49,340
Now so the Eclipse Foundation at
the time was quite popular. 

709
00:38:49,340 --> 00:38:51,182
And so Eclipse was, they 
identified somehow that Eclipse 

710
00:38:51,182 --> 00:38:53,593
was the right place to carry it 
forward. 

711
00:38:54,751 --> 00:38:58,066
And look, I've heard some 
stories, but I wasn't there, so 

712
00:38:58,066 --> 00:39:00,982
I'm not gonna count them. 
That was so Spanish. 

713
00:39:00,987 --> 00:39:04,522
That was Spanish English. 
I'm not going to recount them. 

714
00:39:04,834 --> 00:39:10,214
But essentially, Oracle agreed 
to do that, but they insisted 

715
00:39:10,214 --> 00:39:14,819
that the name Java, which they, 
you know, acquired from Sun, 

716
00:39:14,819 --> 00:39:18,868
couldn't be put on this stuff 
anymore, which caused this, you 

717
00:39:18,868 --> 00:39:22,884
know, renaming of all the 
packages from Java X to Jakarta.

718
00:39:23,160 --> 00:39:26,324
I actually have often asked 
myself, because Jakarta was a 

719
00:39:26,324 --> 00:39:29,543
name for the Apache Jakarta 
project. 

720
00:39:29,573 --> 00:39:33,638
Um, and so somehow that name was
transferred to Eclipse, and I 

721
00:39:33,638 --> 00:39:36,256
have no idea how that happened. 
As I said, I wasn't, I wasn't 

722
00:39:36,256 --> 00:39:40,339
there. 
Yeah, so now it's no longer 

723
00:39:40,339 --> 00:39:45,421
called Java EE, which I, I'm 
really not happy about it, um. 

724
00:39:45,671 --> 00:39:49,557
It makes it seem, you know, 
somehow less, you know, than 

725
00:39:49,557 --> 00:39:53,209
what it was, um. 
But it is still what it was. 

726
00:39:53,209 --> 00:39:58,432
And you know, really, I still 
think it is the best place for 

727
00:39:58,432 --> 00:40:02,722
us to move the enterprise, you 
know, technologies forward. 

728
00:40:03,228 --> 00:40:05,248
And that's why, you know, 
investing time in it. 

729
00:40:05,608 --> 00:40:07,772
Right. 
At least it still retains the J,

730
00:40:07,772 --> 00:40:09,636
right? 
So you can still call JPA and 

731
00:40:09,636 --> 00:40:10,468
all that. 
Otherwise... 

732
00:40:10,468 --> 00:40:12,718
I presume that's... 
I presume the word Jakarta. 

733
00:40:13,408 --> 00:40:15,083
Jakarta's a city in Java, so, 
and... 

734
00:40:15,898 --> 00:40:21,970
So you now are working with, you
know, Jakarta Data, Jakarta QL, 

735
00:40:21,970 --> 00:40:25,208
and all that, right? 
So as part of, you know, solving

736
00:40:25,208 --> 00:40:28,789
the persistence problem, right? 
So maybe let's elaborate a 

737
00:40:28,789 --> 00:40:31,124
little bit, right? 
So persistence, right? 

738
00:40:31,304 --> 00:40:34,124
What do you think is some of the
common problems before this 

739
00:40:34,124 --> 00:40:37,826
Jakarta projects come in, right?
So what are the common problems,

740
00:40:37,826 --> 00:40:40,904
what are common complaints from 
people, and what are you trying 

741
00:40:40,904 --> 00:40:42,794
to solve now with this new 
standard? 

742
00:40:43,229 --> 00:40:43,979
Mm. 
Okay. 

743
00:40:43,979 --> 00:40:47,349
So with specifically with 
Jakarta data or with Jakarta? 

744
00:40:47,349 --> 00:40:48,869
Let's just talk about the whole 
thing, right? 

745
00:40:48,869 --> 00:40:50,686
Yeah. 
Because in a sense, you know, we

746
00:40:50,686 --> 00:40:53,813
have a bunch of moving parts and
it's, you know, sometimes 

747
00:40:53,813 --> 00:40:57,544
difficult even for my colleagues
to see how all the bits relate, 

748
00:40:57,544 --> 00:41:00,934
you know, like, um. 
You know, Hibernate 6.0 was a 

749
00:41:00,934 --> 00:41:04,390
massive, a massive investment of
work and a massive step forward 

750
00:41:04,390 --> 00:41:08,111
that for Hibernate on the 
implementation side, you know, 

751
00:41:08,111 --> 00:41:13,555
we've had Jakarta Persistence 
3.2, which has a bunch of sort 

752
00:41:13,555 --> 00:41:16,780
of little improvements that you 
might almost think are not that 

753
00:41:16,780 --> 00:41:19,782
significant, but together, you 
know, I really do believe that 

754
00:41:19,782 --> 00:41:23,789
sometimes like if you pile up 
enough little improvements, it 

755
00:41:23,789 --> 00:41:26,704
amounts to a big improvement. 
After that, Jakarta Persistence 

756
00:41:26,704 --> 00:41:29,514
4.0 is a much bigger, is a much 
bigger thing that, you know, 

757
00:41:29,514 --> 00:41:33,074
we're still working on. 
We've introduced Jakarta Data, 

758
00:41:33,074 --> 00:41:37,804
and that's forcing us into the 
direction of, of this Jakarta 

759
00:41:37,804 --> 00:41:41,018
Query initiative. 
What is all this amounting to? 

760
00:41:41,048 --> 00:41:44,948
Okay, so first of all, you know,
after so many years we realized,

761
00:41:44,978 --> 00:41:46,949
okay, there was some things 
which weren't quite perfect, 

762
00:41:46,949 --> 00:41:48,753
right? 
Let's first of all say, you 

763
00:41:48,753 --> 00:41:51,619
know, what are the things that, 
you know, I mean, the first step

764
00:41:51,619 --> 00:41:53,878
was, you know, well, what are 
all the things that both TopLink

765
00:41:53,878 --> 00:41:56,599
and Hibernate have that were 
never in the spec? 

766
00:41:56,599 --> 00:41:58,219
And let's just, you know, that's
low hanging fruit. 

767
00:41:58,249 --> 00:42:00,109
Let's just, you know, write them
down. 

768
00:42:00,349 --> 00:42:05,540
Um, a second thing was, you 
know, especially since I had 

769
00:42:05,540 --> 00:42:08,881
been spending a decade or 
whatever thinking about type 

770
00:42:08,881 --> 00:42:11,965
systems, about type safety and, 
you know, I come back and look 

771
00:42:11,965 --> 00:42:14,466
at this stuff and it's, you 
know, kind of a little cringe 

772
00:42:14,466 --> 00:42:18,741
worthy to see strings in some 
places where there shouldn't be 

773
00:42:18,741 --> 00:42:21,983
strings. 
Um, so a big motivating factor 

774
00:42:21,983 --> 00:42:25,743
was to improve the type safety 
of things. 

775
00:42:26,177 --> 00:42:30,299
You know, and that was what 
really... that desire for type 

776
00:42:30,299 --> 00:42:33,773
safety and for compile time 
type, checking of queries and 

777
00:42:33,773 --> 00:42:38,188
stuff like that was what 
convinced us to get involved in 

778
00:42:38,188 --> 00:42:41,112
Jakarta Data. 
You know, I said last night, it 

779
00:42:41,112 --> 00:42:44,907
was something that we were 
originally kind of not that 

780
00:42:44,907 --> 00:42:48,389
excited about. 
But when we kind of realized 

781
00:42:48,389 --> 00:42:52,065
that okay, with adaptation 
processes and with the, I mean, 

782
00:42:52,065 --> 00:42:55,126
there was some non-trivial work 
to like which, you know, I kind 

783
00:42:55,126 --> 00:42:58,871
of get the Hibernate query 
compiler working inside an 

784
00:42:58,871 --> 00:43:03,727
annotation processor, right, 
within a, in a high performance 

785
00:43:03,727 --> 00:43:07,065
way, right, so that, you know, 
if you weren't gonna be sitting 

786
00:43:07,095 --> 00:43:10,894
there waiting for your, you 
know, um, for the compiler, was 

787
00:43:10,894 --> 00:43:14,929
non trivially hard, right, and 
involved significant package. 

788
00:43:15,019 --> 00:43:18,199
But it worked. 
It works very surprisingly well.

789
00:43:18,199 --> 00:43:22,236
I'm actually amazed how, shocked
how well it works, um, and 

790
00:43:22,236 --> 00:43:26,403
actually works. 
And so it was when, you know, 

791
00:43:26,403 --> 00:43:30,997
kind of Steve and I realized 
that, hey, we can do this with 

792
00:43:30,997 --> 00:43:34,933
an annotation processor and we 
can get something out of this, 

793
00:43:34,933 --> 00:43:38,013
which we didn't, which we really
didn't have before, that we 

794
00:43:38,013 --> 00:43:40,893
realize, okay, so maybe this 
repositories thing has something

795
00:43:40,893 --> 00:43:44,297
that's useful in that. 
And so we kind of, you know, try

796
00:43:44,297 --> 00:43:47,322
to push this, the spec in a 
different direction with this as

797
00:43:47,322 --> 00:43:50,292
the goal. 
And so finally Jakarta Data kind

798
00:43:50,292 --> 00:43:52,886
of delivers on something which I
think Jakarta Persistence 

799
00:43:52,886 --> 00:43:56,469
somehow failed in the end to 
deliver, which was, you know, 

800
00:43:56,469 --> 00:44:00,854
that compile time type safe 
querying. 

801
00:44:01,440 --> 00:44:04,210
And, um, and that's great, you 
know, that's wonderful. 

802
00:44:04,932 --> 00:44:06,672
You know, maybe, you know, 
Jakarta data might not be for 

803
00:44:06,672 --> 00:44:08,472
everybody and that's fine. 
That's completely fine. 

804
00:44:08,532 --> 00:44:10,812
Jakarta Persistence doesn't need
to be for everybody. 

805
00:44:11,642 --> 00:44:15,833
And that's also completely fine.
Yeah, so with Jakarta Query, an 

806
00:44:15,833 --> 00:44:20,352
aspect of Jakarta Data, which 
I'm not the person to talk 

807
00:44:20,352 --> 00:44:25,780
about, is that it does not only 
target relational databases, but

808
00:44:25,780 --> 00:44:29,511
can also be used with other 
different kinds of data for 

809
00:44:29,511 --> 00:44:31,140
technology, graph database and 
document database. 

810
00:44:31,995 --> 00:44:35,889
And we subsetted the query 
language of Jakarta Persistence 

811
00:44:35,889 --> 00:44:39,425
in a way that allowed 
implementation of the subset of 

812
00:44:39,425 --> 00:44:42,585
Jakarta Data Query Language on 
these other data stores. 

813
00:44:43,235 --> 00:44:45,263
That process involved quite a 
lot of back and forth between 

814
00:44:45,263 --> 00:44:47,080
the two spec. 
Okay, back and forth between, 

815
00:44:47,080 --> 00:44:51,027
it's like, you know, me talking 
to Lucas, me talking to W and, 

816
00:44:51,027 --> 00:44:53,497
and Nathan. 
But you know that's still back 

817
00:44:53,497 --> 00:44:55,661
and forth and it's, and and you 
realize, okay, you know, no, 

818
00:44:55,661 --> 00:44:58,801
this isn't the way. 
What we really need is a common 

819
00:44:58,801 --> 00:45:00,889
specification document for 
Jakarta Persistence Query 

820
00:45:00,889 --> 00:45:03,240
Language, Jakarta Data Query 
Language, you know. 

821
00:45:03,240 --> 00:45:06,140
So let's have a Jakarta Query 
Language. 

822
00:45:06,410 --> 00:45:12,673
Um, this will be the object 
oriented dialect of SQL, right? 

823
00:45:12,673 --> 00:45:15,759
There used to be one. 
Um, the ODMG, um, used to have 

824
00:45:15,759 --> 00:45:17,691
this thing called object query 
language. 

825
00:45:18,239 --> 00:45:21,524
It never went really anywhere. 
I don't think it was ever fully 

826
00:45:21,524 --> 00:45:24,600
implemented. 
I think I, you know, I believe 

827
00:45:24,600 --> 00:45:27,749
maybe one or two object database
vendors maybe partially 

828
00:45:27,749 --> 00:45:29,639
implemented, but it was never 
fully implemented. 

829
00:45:30,141 --> 00:45:32,736
And so, and, but I'm sure its 
capabilities are nothing like 

830
00:45:32,736 --> 00:45:34,996
the capability to say Hibernate 
Query Language, for example. 

831
00:45:35,811 --> 00:45:40,895
So, hey, you know, this is an 
actual thing, like a dialect of 

832
00:45:40,895 --> 00:45:46,386
SQL for querying, you know, 
objects, classes, is an actual 

833
00:45:46,386 --> 00:45:49,760
real thing. 
It would be good to have written

834
00:45:49,760 --> 00:45:53,237
down what that thing is and what
it should be, again, right, to 

835
00:45:53,237 --> 00:45:57,043
have a public document that says
this is what this technology, 

836
00:45:57,043 --> 00:45:59,912
this is what this technology 
should look like, what it should

837
00:45:59,912 --> 00:46:02,688
do. 
And yeah, it'll have a, you 

838
00:46:02,688 --> 00:46:05,566
know, a way of a complete 
implementation of it, which we 

839
00:46:05,566 --> 00:46:07,795
know to be implementable against
relational data stores. 

840
00:46:09,235 --> 00:46:12,784
Without giving too much away, I 
wanna say that you guys should 

841
00:46:12,784 --> 00:46:16,784
be looking forward to a world 
where the full power of Jakarta 

842
00:46:16,784 --> 00:46:20,034
Query or Jakarta Persistence 
Query Language is available not 

843
00:46:20,034 --> 00:46:24,353
only on relational data stores, 
but also on at least one other 

844
00:46:24,353 --> 00:46:27,422
data database technology, which 
a lot of people are using. 

845
00:46:28,182 --> 00:46:31,286
But then there will be, but 
obviously, you know, you can't 

846
00:46:31,286 --> 00:46:35,592
implement all of HQL on a key 
value store or a, you know. 

847
00:46:36,206 --> 00:46:39,830
There are limitations. 
And so, and so there is a subset

848
00:46:39,830 --> 00:46:42,957
which is meant to be 
implementable on less, let's 

849
00:46:42,957 --> 00:46:46,477
say, data store technologies 
with less powerful querying 

850
00:46:46,477 --> 00:46:49,971
capabilities, right? 
But I, you know, I don't know 

851
00:46:49,971 --> 00:46:54,029
how this far this is gonna go, 
but let's say that, you know, 

852
00:46:54,029 --> 00:46:57,306
document databases and graph 
databases these days have fairly

853
00:46:57,306 --> 00:47:01,964
powerful querying capabilities. 
So, you know, perhaps we're 

854
00:47:01,964 --> 00:47:06,121
looking, you know, ideally, and 
I'm not making saying this as a 

855
00:47:06,121 --> 00:47:13,396
prediction, but as a, a hope, as
a, that maybe we can have an 

856
00:47:13,396 --> 00:47:16,886
object oriented query language 
that works, that really does 

857
00:47:16,886 --> 00:47:19,458
work against these very 
different, these very distinct, 

858
00:47:19,458 --> 00:47:21,060
um, technologies. 
Right. 

859
00:47:21,800 --> 00:47:23,920
You mentioned something about 
type safety, right? 

860
00:47:23,920 --> 00:47:26,967
And I can imagine that, let's 
say when I write a SQL query, 

861
00:47:26,967 --> 00:47:31,301
like it's a string, right? 
And then I, if somehow I get a 

862
00:47:31,301 --> 00:47:34,977
typo or I misarrange the, you 
know, the columns and all that. 

863
00:47:34,977 --> 00:47:39,277
I could only get sense that I'm 
wrong when I test it. 

864
00:47:39,377 --> 00:47:41,873
Or when I write some tests in 
the background, right? 

865
00:47:42,173 --> 00:47:46,003
And so why do you think type 
safety is so, so much important 

866
00:47:46,023 --> 00:47:50,079
in this persistence framework? 
And maybe if you look back at 

867
00:47:50,079 --> 00:47:51,693
the language aspect as well, 
right? 

868
00:47:51,693 --> 00:47:54,388
There are some languages that 
are type safe and there are 

869
00:47:54,388 --> 00:47:56,533
languages that are not, maybe 
more dynamics. 

870
00:47:56,533 --> 00:47:58,763
And you can even change it 
during runtime and all that. 

871
00:47:58,913 --> 00:48:01,533
So maybe in your view, what's 
the importance of type safety? 

872
00:48:01,743 --> 00:48:05,673
Right. 
So I think, you know, one of the

873
00:48:05,673 --> 00:48:09,243
fallacies that... 
I think a good number of people 

874
00:48:09,243 --> 00:48:12,258
understand, but there are still 
some people who don't 

875
00:48:12,258 --> 00:48:17,412
understand, is that a very tiny 
percentage of my time is spent 

876
00:48:17,412 --> 00:48:20,798
authoring code. 
Incredibly tiny percentage. 

877
00:48:21,430 --> 00:48:24,444
When I'm actually, you know, 
developing rather than just 

878
00:48:24,444 --> 00:48:28,780
thinking, um, or writing, the 
most frustrating and 

879
00:48:28,780 --> 00:48:33,737
demoralizing, and by far, the 
most time consuming part of 

880
00:48:33,737 --> 00:48:38,447
developing a, you know, mature 
system like, you know, Hibernate

881
00:48:38,447 --> 00:48:42,625
or like Ceylon or like, you 
know, whatever you can think of,

882
00:48:42,625 --> 00:48:47,154
is waiting for the test to run. 
That is the most time consuming 

883
00:48:47,154 --> 00:48:52,469
part of developing, okay. 
So you wanna run tests as little

884
00:48:52,469 --> 00:48:55,313
as possible, okay. 
People who make the claim, and 

885
00:48:55,313 --> 00:48:57,935
you will hear this even today, 
but you certainly used to hear 

886
00:48:57,935 --> 00:49:02,304
it 10 years ago. 
People who make the claim that I

887
00:49:02,304 --> 00:49:08,023
don't need types because I have 
tests, are not taking into 

888
00:49:08,023 --> 00:49:13,192
account that how often you run 
your tests is, essentially, that

889
00:49:13,192 --> 00:49:16,189
is the bottleneck for being able
to produce code quickly, right? 

890
00:49:16,189 --> 00:49:18,947
That is the primary bottleneck, 
is how long it takes to run the 

891
00:49:18,947 --> 00:49:20,711
test. 
Especially these days when, you 

892
00:49:20,711 --> 00:49:24,075
know, okay, the test, my test 
ran against, um, H2 locally. 

893
00:49:24,075 --> 00:49:26,267
Okay, great. 
Now I've gotta wait for them to 

894
00:49:26,267 --> 00:49:28,476
run against, you know, 10 
different database, well, less 

895
00:49:28,476 --> 00:49:31,536
than 10, on the, you know, CI 
bill, right? 

896
00:49:32,346 --> 00:49:33,696
It slows you down incredibly, 
okay. 

897
00:49:33,696 --> 00:49:38,088
So any little thing which can be
found at compile time without 

898
00:49:38,088 --> 00:49:41,566
having to write the test makes 
me, you know, means that I have 

899
00:49:41,566 --> 00:49:45,540
to run the test one time less. 
And that makes me much faster, 

900
00:49:45,540 --> 00:49:47,998
right? 
What happens with coding 

901
00:49:47,998 --> 00:49:49,718
assistants once we throw them 
into the mix? 

902
00:49:50,168 --> 00:49:52,508
Well, actually nothing changes, 
right? 

903
00:49:52,508 --> 00:49:56,078
Because coding assistant code 
like humans by nature, right? 

904
00:49:56,078 --> 00:49:57,878
And they make the same kind of 
mistakes. 

905
00:49:58,358 --> 00:50:01,882
And I don't think we can, at 
least not at current technology 

906
00:50:01,882 --> 00:50:04,166
levels, I don't think we can 
assume that coding assistants 

907
00:50:04,166 --> 00:50:07,414
are gonna make fewer of the sort
of, of the sort of bugs which 

908
00:50:07,414 --> 00:50:09,388
can be detected by a static type
system. 

909
00:50:09,886 --> 00:50:12,434
And in fact, you know, having 
used coding assistants a little 

910
00:50:12,434 --> 00:50:14,656
bit recently, I've noticed that 
I spend a lot of time waiting 

911
00:50:14,656 --> 00:50:19,054
for the, uh... so I mean, you 
know, the... you know, I wanna 

912
00:50:19,054 --> 00:50:24,299
shift things always to more code
writing and thinking time and 

913
00:50:24,299 --> 00:50:27,019
less finger twiddling and 
scrolling Twitter time, right? 

914
00:50:27,775 --> 00:50:29,567
So, you know, so coding 
assistants aren't gonna help 

915
00:50:29,567 --> 00:50:32,443
with that part, but static types
are gonna help with coding 

916
00:50:32,443 --> 00:50:36,595
assistants. 
And so, you know, when we're 

917
00:50:36,595 --> 00:50:40,595
talking about pushing 
development forward, I think 

918
00:50:40,595 --> 00:50:43,520
that nowhere near enough 
attention, I still believe this,

919
00:50:43,520 --> 00:50:47,031
you know, even after, you know, 
the failure or whatever Ceylon, 

920
00:50:47,031 --> 00:50:50,865
I still believe that we are not 
paying enough attention to 

921
00:50:50,865 --> 00:50:57,789
static typing and its potential.
Um, you know, Java has a kind of

922
00:50:57,789 --> 00:51:03,529
medium level, good type system. 
It, you know, has obvious 

923
00:51:03,529 --> 00:51:08,345
problems, lack of type safety 
for null, generic type erasure, 

924
00:51:08,345 --> 00:51:12,075
which is terrible, results in 
all these unchecked type casts, 

925
00:51:12,075 --> 00:51:15,417
which can fail at runtime in 
your tests. 

926
00:51:15,628 --> 00:51:17,584
But it's, you know, it's still 
better than, it's still better 

927
00:51:17,584 --> 00:51:20,722
and more expressive than, you 
know, Python or Go or whatever, 

928
00:51:20,722 --> 00:51:23,959
you know, or whatever. 
You know, I use Python on a 

929
00:51:23,959 --> 00:51:26,491
pretty regular basis these days.
You use Python for anything to 

930
00:51:26,491 --> 00:51:29,359
do with quantum, use Python for 
anything to do with AI. 

931
00:51:29,833 --> 00:51:31,963
And it's miserable, right? 
It is so much slower. 

932
00:51:31,963 --> 00:51:35,693
Oh my God, right? 
Like you know, things I can do 

933
00:51:35,693 --> 00:51:41,263
with this in IntelliJ, in Java. 
No, I mean, you're sitting there

934
00:51:41,263 --> 00:51:44,398
typing, pressing keys. 
It's that, man. 

935
00:51:45,283 --> 00:51:48,193
It's terrible. 
Um, and, and it actually doesn't

936
00:51:48,193 --> 00:51:51,711
have to be like that. 
Well, the reason, you know, the 

937
00:51:51,711 --> 00:51:54,261
biggest reason it's, you know, 
okay, let's not say it's the 

938
00:51:54,261 --> 00:51:57,987
biggest reason. 
Our reason I have to go to 

939
00:51:57,987 --> 00:52:03,441
Python to do quantum things, to 
do data science, is that 

940
00:52:03,441 --> 00:52:08,706
unfortunately we have no linear 
algebra library in Java. 

941
00:52:09,608 --> 00:52:12,058
That's something which I really 
think our community needs to, 

942
00:52:12,058 --> 00:52:15,008
you know, jump on and say, you 
know, Java could be a... 

943
00:52:15,008 --> 00:52:17,654
I don't know if Java can be a 
good language for data science. 

944
00:52:17,654 --> 00:52:19,864
It could certainly be a 
perfectly good language for, um,

945
00:52:19,864 --> 00:52:22,451
uh, the kind of, you know, AI 
applications we're seeing 

946
00:52:22,451 --> 00:52:25,896
become, you know, huge today. 
No reason it can't be, you know.

947
00:52:26,646 --> 00:52:28,815
There's no reason, you know, 
from the nature of the language 

948
00:52:28,815 --> 00:52:31,816
why you couldn't have a version 
of Qiskit in Java. 

949
00:52:32,246 --> 00:52:36,859
Um, well there is a reason which
is there's no equivalent of 

950
00:52:36,859 --> 00:52:38,473
NumPy, right? 
Anyway, sorry. 

951
00:52:38,503 --> 00:52:39,433
Sorry. 
That was, that was a... 

952
00:52:39,433 --> 00:52:43,173
I think essentially the type 
safety brings a much faster 

953
00:52:43,173 --> 00:52:45,841
feedback loop, right? 
So even when you're typing the, 

954
00:52:45,841 --> 00:52:48,958
if you use good IDEs, it will 
tell you straight away, okay, 

955
00:52:48,958 --> 00:52:50,663
this is probably not right, 
right? 

956
00:52:50,763 --> 00:52:53,331
And you can even use their kind 
of like autosuggestion and 

957
00:52:53,331 --> 00:52:55,537
things like that to fix it 
straight away, right? 

958
00:52:55,537 --> 00:52:58,657
So I think the feedback loop... 
I mean, it, it is important to 

959
00:52:58,657 --> 00:53:00,787
always keep in mind, you know, 
it's a balance, right? 

960
00:53:00,787 --> 00:53:05,568
It's a, you know. 
Yes, it is true that a lot of 

961
00:53:05,568 --> 00:53:07,398
typing errors are false 
positives. 

962
00:53:07,528 --> 00:53:09,048
There's no doubt about that, 
okay. 

963
00:53:09,048 --> 00:53:13,943
That is absolutely true, and I 
think that's where your first 

964
00:53:13,943 --> 00:53:17,208
encounter with Java, not so much
with Java but certainly with the

965
00:53:17,208 --> 00:53:20,912
language of a very, with a very 
powerful static type system by 

966
00:53:20,912 --> 00:53:22,249
some people. 
Sometimes people's first 

967
00:53:22,249 --> 00:53:24,804
encounter with static typing if 
they're used to, or something 

968
00:53:24,804 --> 00:53:26,788
more like JavaScript or Python 
or whatever. 

969
00:53:27,638 --> 00:53:29,968
You know, is, ah, but that's, 
you know, but that's fine. 

970
00:53:29,968 --> 00:53:31,914
That code's fine. 
Why is it making me jump through

971
00:53:31,914 --> 00:53:32,562
hoops? 
Okay. 

972
00:53:33,882 --> 00:53:36,317
And that's fair when you have, 
when your program is little, 

973
00:53:36,317 --> 00:53:38,546
right? 
But as your programming gets 

974
00:53:38,546 --> 00:53:42,030
bigger and bigger and bigger, 
yes, yes, you have to sometimes 

975
00:53:42,030 --> 00:53:44,586
jump through hoops to 
accommodate, you know, to get 

976
00:53:44,586 --> 00:53:46,986
past these false positives. 
But ultimately, you know, once 

977
00:53:46,986 --> 00:53:50,321
the program gets big enough that
you can't fit it all in your 

978
00:53:50,321 --> 00:53:53,666
head, you know, the benefits far
outweigh the, um, the downsides.

979
00:53:54,270 --> 00:53:58,064
The other thing about false 
positives is that they often 

980
00:53:58,064 --> 00:54:01,875
point to a lack of expressivity 
in the type system. 

981
00:54:02,100 --> 00:54:05,520
And that often with a more 
powerful type system, you will 

982
00:54:05,520 --> 00:54:09,519
have maybe less false positive. 
Fair enough. 

983
00:54:10,389 --> 00:54:13,039
Well, type safety is one thing 
that you are working on to 

984
00:54:13,039 --> 00:54:16,113
improve, right? 
The other thing, I think I must 

985
00:54:16,113 --> 00:54:20,599
guess that it relates to some of
the, maybe reasons why people 

986
00:54:20,599 --> 00:54:23,174
hate ORM. 
You know, like I mean there are 

987
00:54:23,174 --> 00:54:25,149
two sides in the programming 
world these days, right? 

988
00:54:25,179 --> 00:54:27,879
There are people who feel ORM is
very useful and great. 

989
00:54:27,879 --> 00:54:30,981
There are some people who may 
have been bitten by some past 

990
00:54:30,981 --> 00:54:33,614
experience, say that ORM is the 
worst thing that, you know, they

991
00:54:33,614 --> 00:54:36,566
have used in the past. 
So I guess maybe you can explain

992
00:54:36,566 --> 00:54:39,699
a little bit why there are such 
love and hate relationship. 

993
00:54:39,959 --> 00:54:42,399
And what are you trying to fix, 
uh, in this new spec? 

994
00:54:43,227 --> 00:54:46,205
So, I mean, I'm not... 
I'm not sure if I can give you a

995
00:54:46,205 --> 00:54:48,681
great explanation. 
It's something that I, you know,

996
00:54:48,681 --> 00:54:52,749
spend time, you know, have spent
time trying to think about and 

997
00:54:52,749 --> 00:54:56,877
trying to understand what it is 
that people are saying when they

998
00:54:56,877 --> 00:55:00,652
say they hate ORM. 
And unfortunately, a very 

999
00:55:00,652 --> 00:55:05,296
unfortunate fact is that very 
often they don't actually give a

1000
00:55:05,296 --> 00:55:06,701
proper explanation of what it 
is. 

1001
00:55:07,629 --> 00:55:11,019
And so I'm often left a little 
confused. 

1002
00:55:11,019 --> 00:55:13,676
And sometimes when there is some
sort of an explanation, it's, 

1003
00:55:13,676 --> 00:55:15,477
you know, not a particularly 
good one. 

1004
00:55:15,657 --> 00:55:21,392
But I have some speculation. 
First of all, I think there's 

1005
00:55:21,392 --> 00:55:26,942
some aspect to it, which is just
that any persistent solution and

1006
00:55:26,942 --> 00:55:30,815
certainly a powerful object 
relational mapper like Hibernate

1007
00:55:30,815 --> 00:55:33,059
is a very complex piece of 
technology. 

1008
00:55:34,282 --> 00:55:38,722
Anytime you insert something 
complicated into your program, 

1009
00:55:40,852 --> 00:55:42,932
there is some sort of a cost to 
that. 

1010
00:55:42,932 --> 00:55:44,102
Okay. 
Without a doubt. 

1011
00:55:45,014 --> 00:55:52,123
I think in addition to that, in 
the past, things like Hibernate 

1012
00:55:52,123 --> 00:55:57,571
picked a way of doing things 
which involved more magic than 

1013
00:55:57,571 --> 00:55:59,771
some people probably wanted, 
right? 

1014
00:55:59,771 --> 00:56:04,089
And so this comes back to this 
thing I've talked about quite a 

1015
00:56:04,089 --> 00:56:07,585
lot with the fact that, and this
was, you know, let's be clear, 

1016
00:56:07,585 --> 00:56:09,491
this is what most people ask 
for, right? 

1017
00:56:10,121 --> 00:56:15,034
This notion of a stateful 
persistence context of managed 

1018
00:56:15,034 --> 00:56:17,135
entities. 
So these objects that represent 

1019
00:56:17,135 --> 00:56:20,846
the state in our database, you 
know, belong to a first level 

1020
00:56:20,846 --> 00:56:22,776
cache. 
There are automatically dirty 

1021
00:56:22,776 --> 00:56:24,540
checks. 
So if I change them, the change 

1022
00:56:24,540 --> 00:56:26,932
to them is automatically 
propagated back to the database.

1023
00:56:26,962 --> 00:56:29,842
Everything happens sort of 
asynchronously. 

1024
00:56:29,842 --> 00:56:33,832
So me calling the persist method
doesn't actually do very much. 

1025
00:56:34,585 --> 00:56:40,292
And that programming model is 
obviously more difficult to 

1026
00:56:40,292 --> 00:56:43,827
reason about. 
I don't think there's any 

1027
00:56:43,827 --> 00:56:46,457
denying that. 
And it's certainly more 

1028
00:56:46,457 --> 00:56:53,446
difficult to debug. 
And so I speculate that this is 

1029
00:56:53,446 --> 00:56:59,117
a major factor in people who 
dislike ORM. 

1030
00:56:59,247 --> 00:57:02,052
I don't think that what they 
dislike is the object relational

1031
00:57:02,052 --> 00:57:04,251
mapping bit. 
I think the bit that they 

1032
00:57:04,251 --> 00:57:07,871
dislike is the, is the, um, is 
the, is the, uh, you know, the, 

1033
00:57:07,871 --> 00:57:09,671
the stateful persistence context
bit, right? 

1034
00:57:10,781 --> 00:57:13,186
And here we come to what I 
think, you know, may have been 

1035
00:57:13,186 --> 00:57:16,526
one of my worst mistakes in my 
career, which was that in 

1036
00:57:16,526 --> 00:57:19,812
Hibernate 3.0, we, you know, 
kind of recognized that there 

1037
00:57:19,812 --> 00:57:22,874
were cases where, you know, um, 
stateful persistance concepts 

1038
00:57:22,874 --> 00:57:27,759
simply weren't appropriate. 
And so I kind of threw the, I 

1039
00:57:27,759 --> 00:57:32,003
quickly did this thing called 
stateless session that was sort 

1040
00:57:32,003 --> 00:57:36,360
of, you know, obviously in an 
incomplete state, threw it out 

1041
00:57:36,360 --> 00:57:39,966
there, and then I went to work 
on other things for 15 years. 

1042
00:57:40,986 --> 00:57:45,302
And because it wasn't in JPA, 
because in our documentation we 

1043
00:57:45,302 --> 00:57:51,045
kind of, you know, presented it 
as this thing for bulk 

1044
00:57:51,045 --> 00:57:54,726
processing, which wasn't a sweet
spot of ORM anyway, right? 

1045
00:57:55,434 --> 00:57:56,414
People just didn't use it, 
right? 

1046
00:57:57,995 --> 00:58:00,596
And it wasn't finished. 
And because nobody was using it,

1047
00:58:00,596 --> 00:58:03,602
nobody thought to finish it, and
because it wasn't finished, 

1048
00:58:03,602 --> 00:58:07,292
nobody felt like this was a 
viable alternative, right? 

1049
00:58:08,385 --> 00:58:11,366
And when I kind of came back to 
persistence, I looked at all 

1050
00:58:11,366 --> 00:58:14,065
this and I, you know, tried to, 
you know, trying to think about,

1051
00:58:14,065 --> 00:58:16,820
well, okay, even though this is 
clearly, you know, empirically, 

1052
00:58:16,820 --> 00:58:19,965
this is clearly the thing that 
most people are using, right? 

1053
00:58:20,595 --> 00:58:23,774
Why is it that we have this 
minority of people who dislike 

1054
00:58:23,774 --> 00:58:26,740
it? 
And one of the things that 

1055
00:58:26,740 --> 00:58:30,871
really hit me is, well, you 
know, they probably don't like 

1056
00:58:30,871 --> 00:58:33,032
the stateful persistence context
programming model. 

1057
00:58:33,923 --> 00:58:37,545
And so that was a mistake. 
You know, we should have had the

1058
00:58:37,545 --> 00:58:39,855
stateless model in JPA from the 
start. 

1059
00:58:40,405 --> 00:58:42,555
Anyway, so it's gonna be in 
Jakarta Persistence 4.0 like, 

1060
00:58:42,555 --> 00:58:47,584
you know, two decades too late. 
And, you know, you have me to 

1061
00:58:47,584 --> 00:58:50,771
blame for that. 
Um, you know, I shudder to think

1062
00:58:50,771 --> 00:58:54,378
at how many billions of dollars 
or something of lost 

1063
00:58:54,378 --> 00:58:56,574
productivity result from that 
one error. 

1064
00:58:57,326 --> 00:59:02,143
Forgive me, you know, um. 
Yeah, so that was a mistake, um,

1065
00:59:02,143 --> 00:59:04,697
that we're belatedly fixing. 
Stateless session is now fixed 

1066
00:59:04,697 --> 00:59:07,402
and Jakarta Data by default, you
know, in implementation go 

1067
00:59:07,402 --> 00:59:08,817
through stateless session, you 
know? 

1068
00:59:08,847 --> 00:59:12,063
Um, and so hopefully people now,
you know, those people who you 

1069
00:59:12,063 --> 00:59:14,796
know now have an alternative, 
which is less magic, which they 

1070
00:59:14,796 --> 00:59:18,443
have more control over. 
Another thing is, you know, I 

1071
00:59:18,443 --> 00:59:20,972
think that Hibernate, at least, 
you know, when, if you see 

1072
00:59:20,972 --> 00:59:22,457
people complaining about 
Hibernate, at least in the case 

1073
00:59:22,457 --> 00:59:26,066
of Hibernate, I think that it 
was originally developed with a,

1074
00:59:26,066 --> 00:59:30,397
you know, with a view of what 
was good error reporting that 

1075
00:59:30,397 --> 00:59:34,566
was actually relatively okay 
back in 2003 or whatever, when 

1076
00:59:34,566 --> 00:59:38,101
things typically didn't have 
great error reporting. 

1077
00:59:38,161 --> 00:59:40,751
But, but that, you know, kind of
got stuck a bit there. 

1078
00:59:41,711 --> 00:59:45,162
And, um, one of the things we 
put a lot of work into recently 

1079
00:59:45,162 --> 00:59:48,108
is improving all the error 
messages you get out so that 

1080
00:59:48,108 --> 00:59:51,228
people aren't left... 
You know, and I would, I hate it

1081
00:59:51,228 --> 00:59:54,780
too, right, when I'm trying to 
use something and I do something

1082
00:59:54,780 --> 01:00:00,012
wrong, but it spits out some 
message that doesn't identify 

1083
01:00:00,012 --> 01:00:04,611
what it is I did wrong. 
And I think that Hibernate used 

1084
01:00:04,611 --> 01:00:06,541
to be quite bad at that. 
It wasn't the worst. 

1085
01:00:06,561 --> 01:00:09,243
I've seen much worse things, 
but, um, but it used to be quite

1086
01:00:09,243 --> 01:00:12,295
bad at that. 
So that's another thing, I think

1087
01:00:12,295 --> 01:00:16,392
where we really went wrong, and 
that probably is a major, was a 

1088
01:00:16,392 --> 01:00:19,515
major contributor to people who 
are hostile to objectional 

1089
01:00:19,515 --> 01:00:22,348
relational mapper as I'm sure 
that we weren't the only object 

1090
01:00:22,348 --> 01:00:24,605
relational mapper that have poor
error reporting because good 

1091
01:00:24,605 --> 01:00:26,907
error reporting is actually 
really, really hard, especially 

1092
01:00:26,907 --> 01:00:29,205
with a, you know, when you have 
this. 

1093
01:00:29,505 --> 01:00:31,861
Yeah, I mean one of the problems
we do have to deal with is that 

1094
01:00:31,861 --> 01:00:35,215
the databases themselves and the
JDBC drivers tend to report 

1095
01:00:35,215 --> 01:00:38,787
errors in a atrocious way. 
Um, and so then we have to 

1096
01:00:38,787 --> 01:00:40,155
figure out how to make sense of 
it. 

1097
01:00:40,215 --> 01:00:43,806
But, um, yeah, I mean, we 
traditionally did a bad job on 

1098
01:00:43,806 --> 01:00:45,625
that. 
We do a much better job on that 

1099
01:00:45,625 --> 01:00:47,007
now. 
Um, so there's, those are two 

1100
01:00:47,007 --> 01:00:49,300
things. 
And I think, I like the way you 

1101
01:00:49,300 --> 01:00:50,971
explain it, right? 
Because in the very beginning 

1102
01:00:50,971 --> 01:00:53,071
when people pick up Hibernate or
maybe learn a about it. 

1103
01:00:53,101 --> 01:00:55,981
The magic thing really stood out
like, whoa, what do you mean? 

1104
01:00:55,981 --> 01:00:58,141
Like it can flush all this thing
automatically. 

1105
01:00:58,141 --> 01:00:59,851
You can just make changes to the
object. 

1106
01:00:59,851 --> 01:01:02,189
It knows how, you know, to 
update the database and all 

1107
01:01:02,189 --> 01:01:04,411
that. 
But obviously when you start 

1108
01:01:04,411 --> 01:01:06,181
building enterprise 
applications, when many 

1109
01:01:06,301 --> 01:01:09,227
developers are working on it, 
it's really hard to debug, 

1110
01:01:09,227 --> 01:01:11,511
especially when things happen 
asynchronously, right? 

1111
01:01:11,851 --> 01:01:14,761
And maybe that's some of the 
reasons why people hate it. 

1112
01:01:14,851 --> 01:01:18,106
The other one is probably about 
association, I suppose, like 

1113
01:01:18,106 --> 01:01:21,177
eager fetching, lazy fetching, 
you know, when you have one to 

1114
01:01:21,177 --> 01:01:23,481
many, many to many, those kind 
of stuff. 

1115
01:01:24,421 --> 01:01:28,718
Yeah, but I insist that this 
problem is fundamental, okay? 

1116
01:01:28,718 --> 01:01:32,468
That this problem you will have 
to deal with even if you're 

1117
01:01:32,468 --> 01:01:34,268
writing your stuff by hand, 
okay? 

1118
01:01:34,268 --> 01:01:36,525
Well, okay, look at the way I 
tried to present it last night, 

1119
01:01:36,525 --> 01:01:38,028
okay? 
You have two options. 

1120
01:01:38,118 --> 01:01:39,998
Not really, because I didn't 
actually choose. 

1121
01:01:40,628 --> 01:01:43,658
There's a linear space of 
options in between. 

1122
01:01:43,658 --> 01:01:44,948
There are two extreme options, 
right? 

1123
01:01:45,733 --> 01:01:50,205
One of the extremes is I don't 
need entity classes, right? 

1124
01:01:50,375 --> 01:01:53,988
I'm gonna have queries I write 
in SQL or whatever. 

1125
01:01:53,989 --> 01:01:57,435
It doesn't have to be in SQL, in
JPQL, no problem. 

1126
01:01:57,713 --> 01:02:01,481
And I'm gonna have these little 
records, right, which model the 

1127
01:02:01,481 --> 01:02:04,023
shape of the result set of the 
query, right? 

1128
01:02:05,043 --> 01:02:08,752
This is actually reasonable, 
especially on a smaller program.

1129
01:02:09,742 --> 01:02:12,565
Excuse me. 
If you have a, you know, just a 

1130
01:02:12,565 --> 01:02:14,479
few screens, this is entirely 
reasonable. 

1131
01:02:14,659 --> 01:02:18,146
It works. 
You write a query, which fetches

1132
01:02:18,146 --> 01:02:21,221
exactly the data you need, and 
then you have something which 

1133
01:02:21,221 --> 01:02:23,899
will slot it into a list of 
records, okay? 

1134
01:02:24,529 --> 01:02:26,119
Thousands of things will do that
for you. 

1135
01:02:26,119 --> 01:02:28,574
I mean, you know, yes, you can 
use Hibernate to do it for you, 

1136
01:02:28,574 --> 01:02:30,499
but you can also use much 
simpler things as well, right? 

1137
01:02:31,195 --> 01:02:35,142
So that is an option. 
Now I am never gonna tell you 

1138
01:02:35,142 --> 01:02:37,886
it's a terrible option. 
I'm never gonna tell you it's a 

1139
01:02:37,886 --> 01:02:41,153
bad option in context. 
What I'm gonna say is that I 

1140
01:02:41,153 --> 01:02:44,077
don't believe it's the best 
option in all contexts. 

1141
01:02:44,077 --> 01:02:48,499
And I think that the fact that 
by far the overwhelming majority

1142
01:02:48,499 --> 01:02:53,589
of enterprise developers are not
choosing that option is a very 

1143
01:02:53,589 --> 01:02:57,691
strong hint that in fact, in 
most contexts, it's not the 

1144
01:02:57,691 --> 01:03:03,079
better of the two options, okay.
So the other extreme is that you

1145
01:03:03,079 --> 01:03:06,313
have Java classes, which 
represent the entities, the 

1146
01:03:06,313 --> 01:03:09,079
basic things in your model of 
the problem domain. 

1147
01:03:10,211 --> 01:03:14,181
And the things and the, the 
fundamental constructs you work 

1148
01:03:14,181 --> 01:03:18,934
with in the business logic in 
your program are graphs, not 

1149
01:03:18,934 --> 01:03:24,208
trees, excuse me, um, you know, 
graphs of not even DAGs, but, 

1150
01:03:24,208 --> 01:03:27,190
you know, serious graphs of 
entity instances. 

1151
01:03:28,741 --> 01:03:31,837
And it doesn't matter whether 
you use ORM or not, you are 

1152
01:03:31,837 --> 01:03:34,561
gonna have to deal with the 
following simple fact. 

1153
01:03:36,121 --> 01:03:39,311
In a relational database, this 
meant this is probably not the 

1154
01:03:39,311 --> 01:03:42,411
case with a document database, 
that's murkier, right? 

1155
01:03:42,411 --> 01:03:46,441
But in a relational database, 
you do not have trees. 

1156
01:03:47,090 --> 01:03:50,679
Everything is interconnected. 
It's a, you know, it's a fully 

1157
01:03:50,679 --> 01:03:54,744
connected graph or a graph with,
you know, a small number of 

1158
01:03:54,744 --> 01:03:56,464
connected subgraphs typically, 
okay. 

1159
01:03:56,854 --> 01:03:59,302
You cannot just go, gimme the 
book and everything that's 

1160
01:03:59,302 --> 01:04:01,082
related to it. 
No, 'cause everything is 

1161
01:04:01,082 --> 01:04:03,208
related, includes all the 
authors and all the other books 

1162
01:04:03,208 --> 01:04:04,884
they've written and all the 
authors of all those books. 

1163
01:04:05,424 --> 01:04:07,174
And pretty soon it's the whole 
database, okay. 

1164
01:04:07,234 --> 01:04:09,621
And the, and it's publisher and 
all the other books are 

1165
01:04:09,621 --> 01:04:12,362
published by that publisher, and
yeah, pretty soon, and it's the 

1166
01:04:12,362 --> 01:04:15,699
whole database. 
So you have to determine where 

1167
01:04:15,699 --> 01:04:19,403
to stop that graph, right? 
This didn't arrive in the 

1168
01:04:19,403 --> 01:04:21,721
option, in the first extreme 
option because, you know, we 

1169
01:04:21,721 --> 01:04:25,010
kind of had a different type 
safe model for each, for each 

1170
01:04:25,010 --> 01:04:27,076
query, right? 
But over here where we're trying

1171
01:04:27,076 --> 01:04:30,226
to share the same model between 
all our bits of, you know, 

1172
01:04:30,226 --> 01:04:31,738
business logic, this problem 
arises. 

1173
01:04:31,827 --> 01:04:35,817
You know, because of how shared 
that entity model is, we can't 

1174
01:04:35,817 --> 01:04:38,925
into the type system engineer 
the fact of where the graph 

1175
01:04:38,925 --> 01:04:41,387
stops. 
And so there's this fundamental 

1176
01:04:41,387 --> 01:04:45,954
hole in how this is typed. 
That hole is plugged by lazy 

1177
01:04:45,954 --> 01:04:48,083
initialization exception. 
Okay. 

1178
01:04:48,795 --> 01:04:52,734
And so what happens, right? 
If I'm, if I approach this 

1179
01:04:52,734 --> 01:04:56,619
naively, you know, what happens?
I run into one of two things. 

1180
01:04:56,619 --> 01:04:58,869
I run into, you know, lazy 
fetching happening. 

1181
01:04:58,869 --> 01:05:01,809
One I didn't want it to be 
happening, and N+1 selects. 

1182
01:05:01,809 --> 01:05:04,899
I run into, oh, lazy 
initialization exception. 

1183
01:05:04,899 --> 01:05:06,924
Why didn't they, bla bla bla. 
Okay. 

1184
01:05:08,424 --> 01:05:11,367
There's a solution and a 
solution involves discipline, 

1185
01:05:11,367 --> 01:05:14,214
alright? 
And I insist to you that this is

1186
01:05:14,214 --> 01:05:17,184
not anything to do with using an
object relational mapper. 

1187
01:05:17,184 --> 01:05:21,532
It is a fundamental aspect of 
using graphs of entities to 

1188
01:05:21,532 --> 01:05:25,924
represent your data and having a
database that's external to 

1189
01:05:25,924 --> 01:05:29,724
that. 
You have to specify upfront what

1190
01:05:29,724 --> 01:05:35,034
data you're gonna use in this 
transaction, have that data 

1191
01:05:35,034 --> 01:05:39,622
fetched in an efficient fashion,
and that is certainly no easier 

1192
01:05:39,622 --> 01:05:42,082
if you write that code yourself 
in SQL. 

1193
01:05:42,082 --> 01:05:45,522
In fact, it is harder. 
Hibernate makes that much, much 

1194
01:05:45,522 --> 01:05:48,592
easier. 
And this is where people like 

1195
01:05:48,592 --> 01:05:50,392
get wrong. 
What they get wrong, right. 

1196
01:05:50,392 --> 01:05:52,912
But you have to do it, you have 
to specify explicitly, right? 

1197
01:05:54,272 --> 01:05:56,754
What happened? 
People have been sold, not by 

1198
01:05:56,754 --> 01:05:57,322
us. 
Okay. 

1199
01:05:57,322 --> 01:05:59,174
We have always said right from 
the start, there is no such 

1200
01:05:59,174 --> 01:06:01,202
thing as transparent position, 
eh, persistence. 

1201
01:06:01,792 --> 01:06:05,208
People have been sold in some 
books this notion that 

1202
01:06:05,250 --> 01:06:08,550
persistence can be transparent. 
There's all this stuff that, oh,

1203
01:06:08,550 --> 01:06:11,270
oh yeah, what's it called? 
Ports and adapters or something 

1204
01:06:11,270 --> 01:06:13,257
nonsense. 
Um, that, oh, we can have, you 

1205
01:06:13,257 --> 01:06:15,970
know, persistence is adapter or 
something, right? 

1206
01:06:15,970 --> 01:06:18,240
And we can just swap it in and 
out, right? 

1207
01:06:18,300 --> 01:06:22,361
No, you, no, you cannot just 
swap persistence in and out, 

1208
01:06:22,361 --> 01:06:24,380
right? 
It fundamentally impacts the 

1209
01:06:24,380 --> 01:06:28,091
whole, um, the whole way you 
define the behavior of your 

1210
01:06:28,091 --> 01:06:29,814
application. 
You have to specify, I'm gonna 

1211
01:06:29,814 --> 01:06:32,401
be needing this data, right? 
Get me this data in an efficient

1212
01:06:32,401 --> 01:06:34,603
way. 
And then I can start navigating 

1213
01:06:34,603 --> 01:06:38,112
my graph of objects and, you 
know, if I run into lazy 

1214
01:06:38,112 --> 01:06:40,770
initialization exception, that's
my indication that I needed to 

1215
01:06:40,770 --> 01:06:44,280
get more data, um, before I 
start writing, um, N+1 selects. 

1216
01:06:46,440 --> 01:06:51,637
Interestingly, the stateless 
model where lazy fetching is an 

1217
01:06:51,637 --> 01:06:54,193
explicit operation rather than 
an implicit operation because 

1218
01:06:54,193 --> 01:06:57,951
this thing is not a managed, 
never a managed entity, results 

1219
01:06:57,951 --> 01:07:00,291
in more lazy initialization 
exceptions. 

1220
01:07:00,801 --> 01:07:04,451
And that's an advantage, right? 
Because it's telling you, oh, 

1221
01:07:04,451 --> 01:07:07,491
you didn't have the data you 
maybe thought you had, right? 

1222
01:07:07,491 --> 01:07:10,911
And so you're far less likely to
accidentally get N+1 selects, 

1223
01:07:10,911 --> 01:07:14,971
um, happening. 
I hope I explained that well. 

1224
01:07:15,121 --> 01:07:17,501
Yeah, definitely. 
I think it's, again, the 

1225
01:07:17,501 --> 01:07:19,681
discipline that you mentioned, 
right, for developers, right? 

1226
01:07:19,681 --> 01:07:22,651
Especially when accessing data. 
I mean, many developers just 

1227
01:07:22,651 --> 01:07:25,271
think, okay, we, I can just 
query, do whatever I need and 

1228
01:07:25,271 --> 01:07:27,391
just pass it back to whatever 
that needs it, right? 

1229
01:07:27,391 --> 01:07:29,551
But I think thinking about 
transaction boundaries, that's 

1230
01:07:29,551 --> 01:07:32,191
the first thing that is, can be 
difficult, right? 

1231
01:07:32,191 --> 01:07:34,291
You want it to be short as much 
as possible. 

1232
01:07:34,501 --> 01:07:37,051
And then second thing is fetch 
as sufficiently as possible. 

1233
01:07:37,051 --> 01:07:39,479
And this could relate to the 
type of database that you use, 

1234
01:07:39,479 --> 01:07:41,589
right? 
It could be relational, it could

1235
01:07:41,589 --> 01:07:43,933
be document database. 
Different databases, different 

1236
01:07:43,933 --> 01:07:45,601
characteristics when you query 
them. 

1237
01:07:46,021 --> 01:07:49,981
It relates to also how, um, you 
can, if you introduce a second 

1238
01:07:49,981 --> 01:07:52,851
level cache into your system, 
that's also gonna impact how you

1239
01:07:52,851 --> 01:07:53,461
fetch it. 
Yeah. 

1240
01:07:53,461 --> 01:07:55,927
And cache is always like the 
most difficult problem in 

1241
01:07:55,927 --> 01:07:59,661
computer, I guess, yeah. 
So definitely, uh, thanks for 

1242
01:07:59,661 --> 01:08:02,051
sharing that. 
And I believe these days, right,

1243
01:08:02,051 --> 01:08:04,737
there's also a way for you to 
mix and match, right? 

1244
01:08:04,947 --> 01:08:07,004
So like what you mentioned the 
two extreme, right? 

1245
01:08:08,494 --> 01:08:11,517
So for some problems, maybe you 
can use ORM which is much more 

1246
01:08:11,517 --> 01:08:13,785
effective and efficient, 
especially when you have so many

1247
01:08:13,785 --> 01:08:15,697
columns. 
I don't think we want to write 

1248
01:08:15,697 --> 01:08:18,426
it, although now maybe coding 
assistants can help in a sense. 

1249
01:08:18,777 --> 01:08:23,015
Uh, but in some way when you 
actually need to kinda like in 

1250
01:08:23,015 --> 01:08:25,849
detail specify the queries you 
can use, you know, the stateless

1251
01:08:25,849 --> 01:08:29,328
option or maybe the records 
result set kind of, uh, types to

1252
01:08:29,328 --> 01:08:31,858
actually represent that. 
Yeah, so I think, yeah, as I 

1253
01:08:31,858 --> 01:08:34,201
said, so I think that is these 
two extreme options where, no, 

1254
01:08:34,201 --> 01:08:36,701
I'm gonna use this everywhere, 
and oh no, I'm gonna use this 

1255
01:08:36,701 --> 01:08:39,548
other thing everywhere. 
And no, I think the best option 

1256
01:08:39,548 --> 01:08:42,724
is to, you know, use the thing 
that's most convenient in this 

1257
01:08:42,724 --> 01:08:44,960
particular context and which 
gets you want, where you wanna 

1258
01:08:44,960 --> 01:08:47,461
go fastest. 
And, you know, certainly, you 

1259
01:08:47,461 --> 01:08:51,268
know, any decent ORM solution 
will make it very easy to use 

1260
01:08:51,268 --> 01:08:52,523
either of those options. 
Right. 

1261
01:08:53,002 --> 01:08:56,002
So maybe if you can share a 
little bit some these exciting 

1262
01:08:56,002 --> 01:08:58,415
things that you are building in 
this new specification that 

1263
01:08:58,415 --> 01:09:01,151
people can expect, right? 
Because when I watched you last 

1264
01:09:01,151 --> 01:09:04,559
night, I'm excited myself to 
see, you know, wow, there are so

1265
01:09:04,559 --> 01:09:07,111
many cool things that I can do, 
you know, especially the 

1266
01:09:07,111 --> 01:09:09,563
repository and the find 
annotations and all that. 

1267
01:09:09,563 --> 01:09:11,212
I find it quite exciting, 
actually. 

1268
01:09:11,506 --> 01:09:14,578
I wish I could probably have 
some chance to work on Java 

1269
01:09:14,578 --> 01:09:16,907
again, but maybe... 
What are you writing with? 

1270
01:09:17,212 --> 01:09:18,796
I'm currently using TypeScript 
more. 

1271
01:09:18,801 --> 01:09:20,087
Yeah, yeah. 
Sorry, you said, yeah, yeah, 

1272
01:09:20,087 --> 01:09:22,325
yeah, yeah. 
So maybe tell us some glimpse, 

1273
01:09:22,325 --> 01:09:25,488
maybe like a marketing pitch, 
uh, why people should consider 

1274
01:09:25,488 --> 01:09:27,747
this new Jakarta Repository Data
and QL. 

1275
01:09:27,767 --> 01:09:30,514
Yeah. 
So, um, right, so I guess the 

1276
01:09:30,514 --> 01:09:33,895
fundamental thing is I'm not, 
you know, I'm never gonna tell 

1277
01:09:33,895 --> 01:09:36,006
you you have to use this, or you
have to use this. 

1278
01:09:36,187 --> 01:09:39,667
I'm gonna say, try this out and 
see if it fits your flow. 

1279
01:09:40,053 --> 01:09:44,915
So, yeah, so Jakarta Data, at 
least in our implementation, the

1280
01:09:44,915 --> 01:09:48,912
primary advantage that it offers
is the ability to immediately 

1281
01:09:48,912 --> 01:09:53,207
get that feedback of, oh, my 
query is correct or my query is 

1282
01:09:53,207 --> 01:09:55,688
wrong as soon as you, as you're 
authoring your code. 

1283
01:09:55,688 --> 01:09:59,164
You just press, you know, 
command back slash in IntelliJ, 

1284
01:09:59,164 --> 01:10:01,583
sends it off to the annotation 
processor and the annotation 

1285
01:10:01,583 --> 01:10:03,878
processor will give you 
meaningful error messages back. 

1286
01:10:04,376 --> 01:10:06,596
That's to my mind the primary 
reason to use this. 

1287
01:10:06,626 --> 01:10:09,607
Of course, there are people who 
have other reasons for liking 

1288
01:10:09,607 --> 01:10:12,318
repositories. 
Some of those reasons are good 

1289
01:10:12,318 --> 01:10:14,870
reasons, some of the reasons I 
find unconvincing. 

1290
01:10:15,020 --> 01:10:18,332
Um, but, you know, one simple, 
one reason, which I think is, 

1291
01:10:18,332 --> 01:10:22,214
you know, it sounds kind of 
silly, but actually I think it's

1292
01:10:22,214 --> 01:10:27,065
a good reason, is it gives you a
place to put your queries, 

1293
01:10:27,065 --> 01:10:29,816
right? 
Um, you know, I don't think 

1294
01:10:29,816 --> 01:10:33,035
there's anything wrong with 
writing queries directly in the,

1295
01:10:33,035 --> 01:10:34,730
you know, controller or 
whatever. 

1296
01:10:35,960 --> 01:10:38,268
Nothing wrong with it. 
And you know, again, it depends 

1297
01:10:38,268 --> 01:10:39,860
on what complexity it comes 
back, you know? 

1298
01:10:40,175 --> 01:10:45,789
But I see the desire to have 
your queries in some persistence

1299
01:10:45,789 --> 01:10:49,117
place, right? 
And so I think repositories are 

1300
01:10:49,117 --> 01:10:52,633
a reasonable way to think about 
organizing your queries, right? 

1301
01:10:53,531 --> 01:10:58,850
I think that the pre-existing 
approaches to repositories fail 

1302
01:10:58,850 --> 01:11:03,581
to deliver in this respect 
because they have the notion 

1303
01:11:03,581 --> 01:11:06,695
that there is a one-to-one 
association between repositories

1304
01:11:06,695 --> 01:11:10,520
and entity types. 
And I think that's actually 

1305
01:11:10,520 --> 01:11:12,121
incorrect. 
I would go, so, you know, if I 

1306
01:11:12,121 --> 01:11:14,600
want to take an extreme position
on this, I would say, you know, 

1307
01:11:14,600 --> 01:11:16,365
why not have repository per 
controller, right? 

1308
01:11:16,605 --> 01:11:20,050
Um, and so, you know, if you 
have a, you know, that's likely 

1309
01:11:20,050 --> 01:11:23,315
to be a construct with a higher 
cohesion, right? 

1310
01:11:24,176 --> 01:11:26,776
Of course, I'm not advocating 
that you, that's what you should

1311
01:11:26,776 --> 01:11:27,926
literally, that's what you 
should do. 

1312
01:11:27,926 --> 01:11:30,473
No, you should think about how, 
where do I wanna arrange, 

1313
01:11:30,473 --> 01:11:32,641
organize my stuff? 
So yeah, so repositories give 

1314
01:11:32,641 --> 01:11:36,046
you, or at least in Jakarta 
Data, give you a flexible way to

1315
01:11:36,046 --> 01:11:39,854
organize your code that I think 
is appealing, with this type 

1316
01:11:39,854 --> 01:11:44,650
safety, which I think is a major
selling feature is a real step 

1317
01:11:44,650 --> 01:11:48,707
change to how productive you can
be using JPA or whatever, right?

1318
01:11:50,377 --> 01:11:52,605
Secondly, another new thing that
we're working. 

1319
01:11:52,605 --> 01:11:55,155
It's not there yet, okay. 
This is, I'm talking about 

1320
01:11:55,155 --> 01:11:58,068
Jakarta Data 1.1 now, is this 
issue of dynamic, 

1321
01:11:58,068 --> 01:12:00,338
programmatically constructed 
queries. 

1322
01:12:00,478 --> 01:12:03,757
So in the very early days of 
Hibernate, there was this thing,

1323
01:12:03,757 --> 01:12:08,543
we had a criteria API, where you
could kind of build a tree of 

1324
01:12:08,543 --> 01:12:10,600
restrictions on an entity and, 
you know. 

1325
01:12:11,845 --> 01:12:13,825
I guess you know what I mean by 
a tree like query, right? 

1326
01:12:13,825 --> 01:12:17,207
It's, you know, we don't have 
kind of restrictions which 

1327
01:12:17,207 --> 01:12:19,885
involve, you know, two leaves of
the tree. 

1328
01:12:20,615 --> 01:12:24,582
And it wasn't type safe, it was 
all strings and it was kind of 

1329
01:12:24,582 --> 01:12:27,025
janky. 
That's the weird way, daughter 

1330
01:12:27,025 --> 01:12:29,985
taught me. 
And we kind of have left that in

1331
01:12:29,985 --> 01:12:31,570
the past. 
In fact, that doesn't even exist

1332
01:12:31,570 --> 01:12:34,347
in Hibernate 6. 
Um, now, there were actually at 

1333
01:12:34,347 --> 01:12:38,268
some point I noticed when we 
took it away from people, we 

1334
01:12:38,268 --> 01:12:40,743
noticed that there were people 
who actually really liked it and

1335
01:12:40,743 --> 01:12:44,483
complained that this totally 
rubbish thing, you know, that 

1336
01:12:44,483 --> 01:12:47,835
from 2000 and, you know, 
whatever, that there were people

1337
01:12:47,835 --> 01:12:50,793
who were still using it and 
actually found it to be the most

1338
01:12:50,793 --> 01:12:52,869
convenient thing. 
What happened in JPA 2, people 

1339
01:12:52,869 --> 01:12:56,481
wanted to have like a criteria 
API, which was a full model of 

1340
01:12:56,481 --> 01:13:00,555
everything you could do in JPQL.
And they also wanted to be able 

1341
01:13:00,555 --> 01:13:02,570
to have multiple implementations
so that each vendor could have 

1342
01:13:02,570 --> 01:13:03,760
its own implementation of the 
criteria API. 

1343
01:13:05,360 --> 01:13:07,430
And then I came along and I 
wanted it to be type safe. 

1344
01:13:08,322 --> 01:13:11,257
And so we got this monstrous API
that it's, you know, at some 

1345
01:13:11,257 --> 01:13:14,421
point, for 10 years, I would 
look back at this and go, oh 

1346
01:13:14,421 --> 01:13:16,263
wow, I really associated myself 
with that. 

1347
01:13:18,281 --> 01:13:22,444
Now, funny thing it's about is 
that during those years, support

1348
01:13:22,444 --> 01:13:24,802
for annotation processes got 
better. 

1349
01:13:25,342 --> 01:13:30,312
Java introduced the var keyword.
We found some, a bunch of other 

1350
01:13:30,312 --> 01:13:31,824
things we could do with static 
metamodel. 

1351
01:13:31,854 --> 01:13:34,594
And now I am actually like super
happy that we did that. 

1352
01:13:34,594 --> 01:13:38,154
And in fact, the criteria API 
isn't as bad as it used to be. 

1353
01:13:38,154 --> 01:13:40,640
And also people just got more 
used to working with generics 

1354
01:13:40,640 --> 01:13:43,574
and the whole thing is, you 
know, less embarrassing, much 

1355
01:13:43,574 --> 01:13:46,484
less embarrassing than now than 
I felt about it for years and 

1356
01:13:46,484 --> 01:13:49,114
years and years. 
Um, but it's still nobody's 

1357
01:13:49,114 --> 01:13:52,154
favorite API, I think is fair to
say. 

1358
01:13:52,154 --> 01:13:55,943
Um, it's quite verbose. 
It's quite good for vibe coding,

1359
01:13:55,943 --> 01:13:57,572
interestingly. 
Yeah, the code assistant seem to

1360
01:13:57,572 --> 01:14:00,296
do a good job with it. 
But it's not great. 

1361
01:14:00,296 --> 01:14:03,978
So we had this, so I think for 
years and years and years we've 

1362
01:14:03,978 --> 01:14:14,262
had this hole between, okay, 
JPQL for static queries, the 

1363
01:14:14,262 --> 01:14:20,919
criteria API, which is the whole
hog of being able to completely,

1364
01:14:20,919 --> 01:14:24,148
entirely construct everything 
about the query completely 

1365
01:14:24,148 --> 01:14:27,229
dynamically and 
programmatically, and yet I 

1366
01:14:27,229 --> 01:14:31,784
think that what most people 
actually wanted was something in

1367
01:14:31,784 --> 01:14:33,908
between those two extremes 
again, right? 

1368
01:14:34,298 --> 01:14:37,306
Jesus, it's a very recurring, 
recurring theme here which was 

1369
01:14:37,306 --> 01:14:39,644
that they wanted to be able to, 
you know, they had some search 

1370
01:14:39,644 --> 01:14:41,356
screen and they wanted to be 
able to programmatically add 

1371
01:14:41,356 --> 01:14:43,135
this, a restriction on this 
field, restriction on this 

1372
01:14:43,135 --> 01:14:45,046
field, and no restriction on 
this other field, right? 

1373
01:14:45,856 --> 01:14:50,744
So, uh, in JPA 1.1, we have, you
know, rectified what I think, 

1374
01:14:50,744 --> 01:14:52,870
you know, that historical 
mistake, I think. 

1375
01:14:52,870 --> 01:14:55,876
And we're in the process of 
introducing an API, which is, 

1376
01:14:55,876 --> 01:15:00,545
you know, in some sense you 
could view as a, you know, a re,

1377
01:15:00,545 --> 01:15:05,813
you know, a rethinking of the 
original API and old Hibernate 4

1378
01:15:05,813 --> 01:15:08,823
treelike restrictions. 
I think it's actually super 

1379
01:15:08,823 --> 01:15:10,045
elegant. 
I don't know what other people 

1380
01:15:10,045 --> 01:15:12,813
are gonna think. 
It's, again, these are APIs for.

1381
01:15:12,863 --> 01:15:15,703
These APIs for, uh, internal 
DSLs. 

1382
01:15:15,703 --> 01:15:18,353
I know, I always forget which 
one's external, which one, 

1383
01:15:18,353 --> 01:15:21,103
internal DSL, right, are 
naturally complicated. 

1384
01:15:21,103 --> 01:15:22,273
Especially if you want type 
safety. 

1385
01:15:22,413 --> 01:15:25,083
But I think it's, elegant. 
I think it's nice. 

1386
01:15:25,083 --> 01:15:29,844
I think it's easy to use. 
And so I think that is gonna be 

1387
01:15:29,844 --> 01:15:32,919
a step forward in terms of 
solving something that 

1388
01:15:32,919 --> 01:15:36,159
traditionally was left, you 
know, unsolved. 

1389
01:15:36,289 --> 01:15:38,764
Right. 
Thanks for sharing some of 

1390
01:15:38,764 --> 01:15:40,782
these. 
I'm not sure how people can 

1391
01:15:40,782 --> 01:15:44,771
follow without even trying, 
right, or seeing your demo, 

1392
01:15:44,771 --> 01:15:47,444
right? 
So definitely, I personally, 

1393
01:15:47,444 --> 01:15:50,544
again, I shared my experience, 
uh, when I saw your talk. 

1394
01:15:50,544 --> 01:15:52,974
I'm very excited, even though 
I'm not a Java developer 

1395
01:15:52,974 --> 01:15:56,345
anymore, I'm, I feel excited. 
And I'm sure so many other Java 

1396
01:15:56,345 --> 01:15:59,373
developers out there who saw it,
uh, will find it very exciting 

1397
01:15:59,373 --> 01:16:02,316
and useful as well. 
I think the feedback loop is 

1398
01:16:02,316 --> 01:16:05,492
really, really good, right? 
So I think hopefully the project

1399
01:16:05,492 --> 01:16:09,139
turns successful. 
I can see throughout the way you

1400
01:16:09,139 --> 01:16:12,811
explain stuff, you are, even 
though you try your best, not to

1401
01:16:12,811 --> 01:16:15,511
say that there's a best 
architecture, but you tend to 

1402
01:16:15,571 --> 01:16:17,461
intentionally think about 
architecture. 

1403
01:16:18,031 --> 01:16:22,261
And there's a context specific 
to some people, right, um, that 

1404
01:16:22,501 --> 01:16:25,039
people need to understand before
they pick a certain 

1405
01:16:25,039 --> 01:16:27,682
architecture. 
So maybe if you can think or 

1406
01:16:27,682 --> 01:16:31,202
maybe explain to us like, how do
you actually explain an 

1407
01:16:31,202 --> 01:16:35,176
architecture so that, you know, 
people know what's the best 

1408
01:16:35,176 --> 01:16:36,916
thing to adopt for their 
context? 

1409
01:16:36,916 --> 01:16:40,126
Because I mean, these days, so 
many people talk about 

1410
01:16:40,126 --> 01:16:41,356
architecture wars, right? 
Okay. 

1411
01:16:41,356 --> 01:16:43,156
I have microservice versus 
monolith. 

1412
01:16:43,546 --> 01:16:45,876
I have DDD versus, I don't know 
what else, right? 

1413
01:16:46,246 --> 01:16:48,699
I have, I don't know, Spring 
framework type versus, you know,

1414
01:16:48,699 --> 01:16:51,233
all the others. 
So maybe how Gavin actually 

1415
01:16:51,233 --> 01:16:53,849
thinks about architecture. 
Maybe if you can give us, I 

1416
01:16:53,849 --> 01:16:55,994
don't know, some advice here. 
Yeah. 

1417
01:16:56,024 --> 01:17:01,902
So first of all, you know, to 
begin with, um, I had long had a

1418
01:17:01,902 --> 01:17:05,892
policy of attempting to avoid 
giving any advice on 

1419
01:17:05,892 --> 01:17:10,272
architecture, because number 
one, I don't write application 

1420
01:17:10,272 --> 01:17:13,559
programs and I haven't written 
an application program since I 

1421
01:17:13,559 --> 01:17:17,307
was 20 something. 
And so whatever advice I could 

1422
01:17:17,307 --> 01:17:20,367
possibly give is almost certain 
to be wrong, right? 

1423
01:17:21,891 --> 01:17:24,378
And I think, you know, generally
that our whole team had that 

1424
01:17:24,378 --> 01:17:30,453
view that, you know, we were 
better off providing a library 

1425
01:17:30,453 --> 01:17:33,549
with powerful primitives. 
You know, even if you look at 

1426
01:17:33,549 --> 01:17:35,745
something, you know, you could 
say, look at CDI and say, okay, 

1427
01:17:35,745 --> 01:17:40,977
CDI was this thing. 
That is more of a framework. 

1428
01:17:41,037 --> 01:17:43,451
Or if you, you know, you look at
the whole platform and say it is

1429
01:17:43,451 --> 01:17:46,630
more of a framework, okay. 
But, you know, I always want it 

1430
01:17:46,630 --> 01:17:49,835
to be a very flexible framework 
that, you know, in fact, you 

1431
01:17:49,835 --> 01:17:52,847
know, one of the goals of CDI 
was to not force you into this 

1432
01:17:53,627 --> 01:17:56,699
layering that existed, you know,
and to give you the flexibility 

1433
01:17:56,699 --> 01:17:59,113
to introduce that sort of 
layering if you wanted to, but 

1434
01:17:59,113 --> 01:18:02,600
not if you didn't wish to. 
My goal has always been give 

1435
01:18:02,600 --> 01:18:04,592
people power, powerful 
primitives so that they can 

1436
01:18:04,592 --> 01:18:07,154
implement whatever sorts of 
architectural decisions they 

1437
01:18:07,154 --> 01:18:11,910
wish to implement, okay. 
Unfortunately, if you kinda 

1438
01:18:11,910 --> 01:18:15,750
withdraw from that space of 
giving people advice. 

1439
01:18:16,914 --> 01:18:20,514
What happened at is that, you 
know, into that vacuum caused a 

1440
01:18:20,514 --> 01:18:23,454
deluge of people who have lots 
of opinions, right? 

1441
01:18:24,504 --> 01:18:29,366
And I think I sort of see, you 
know, sometimes when people have

1442
01:18:29,366 --> 01:18:32,199
been, you know, made to feel 
that they have to do something 

1443
01:18:32,199 --> 01:18:37,855
in such and such a way where the
basis for that, for the idea 

1444
01:18:37,855 --> 01:18:42,917
that they have to do it that way
is just not there, right? 

1445
01:18:42,917 --> 01:18:48,947
There is no mass. 
But you know, the whole 

1446
01:18:48,947 --> 01:18:53,977
discourse around design patterns
and architectural patterns lacks

1447
01:18:53,977 --> 01:18:59,254
foundation in logic and math. 
It lacks empirical foundation, 

1448
01:18:59,254 --> 01:19:01,489
you know. 
Yeah, okay, this worked great 

1449
01:19:01,489 --> 01:19:04,514
for you on your two projects, 
but like there is nobody out. 

1450
01:19:04,514 --> 01:19:06,901
Like, I think what people need 
to understand is that this 

1451
01:19:06,901 --> 01:19:12,752
so-called experts, there is 
nobody out there who has spent 

1452
01:19:12,752 --> 01:19:17,496
10 years developing and 
maintaining more than two or 

1453
01:19:17,496 --> 01:19:20,084
three projects, all right? 
There is nobody like that. 

1454
01:19:20,144 --> 01:19:21,704
Why? 
Because people aren't that old. 

1455
01:19:23,504 --> 01:19:27,350
So either they've skipped from 
project to project to project, 

1456
01:19:27,350 --> 01:19:30,274
and never had to deal with any 
of the consequences of their 

1457
01:19:30,274 --> 01:19:33,708
decisions. 
Or they've really only worked on

1458
01:19:33,708 --> 01:19:38,210
two projects. 
And so when you hear people 

1459
01:19:38,210 --> 01:19:42,155
making that sort of advice, you 
need to understand that worked 

1460
01:19:42,155 --> 01:19:44,999
for them in the context of the 
two projects they worked on. 

1461
01:19:44,999 --> 01:19:48,450
Or, you know, or maybe they 
never actually even had to 

1462
01:19:48,450 --> 01:19:50,799
maintain a system with this, 
with these decisions. 

1463
01:19:50,799 --> 01:19:55,297
And in which case, I, you know, 
I really, you know, I'm sorry, 

1464
01:19:55,297 --> 01:19:57,926
but I'm gonna treat their advice
with a great deal of skepticism,

1465
01:19:57,926 --> 01:20:01,853
okay? 
So what do I say instead? 

1466
01:20:01,853 --> 01:20:06,488
If you can't trust the advice of
architecture experts, you know, 

1467
01:20:06,518 --> 01:20:08,068
what should you do instead, 
right? 

1468
01:20:08,068 --> 01:20:11,826
Because obviously, you have to, 
you have to have some basis for 

1469
01:20:11,826 --> 01:20:15,333
making decisions, right? 
And so what my advice is, and 

1470
01:20:15,333 --> 01:20:17,888
it's always been my advice, I 
think. 

1471
01:20:18,098 --> 01:20:21,366
It's always been my position, 
but is more and more my position

1472
01:20:21,366 --> 01:20:25,202
recently, I've been radicalized 
on this lately from seeing this 

1473
01:20:25,202 --> 01:20:28,685
discourse around DDD. 
Um, my now radicalized position 

1474
01:20:28,685 --> 01:20:33,700
on this is that architecture is 
something that has to emerge 

1475
01:20:33,700 --> 01:20:37,382
naturally from the code, right? 
The code should be pushing you 

1476
01:20:37,382 --> 01:20:39,802
in a particular direction. 
If it's not, then you need to 

1477
01:20:39,802 --> 01:20:41,576
have a different relationship 
with your code, right? 

1478
01:20:42,200 --> 01:20:46,985
A relationship which is based on
being very critical of it, 

1479
01:20:46,985 --> 01:20:49,885
right? 
It's kind of obsessively trying 

1480
01:20:49,885 --> 01:20:53,031
to make it beautiful, 
obsessively applying the, you 

1481
01:20:53,031 --> 01:20:55,530
know, the first commandment of 
software engineering. 

1482
01:20:55,560 --> 01:21:00,300
Don't repeat yourself, right? 
Oh God, I see recently, lately, 

1483
01:21:00,300 --> 01:21:03,752
a particular some type of meme 
on LinkedIn of people 

1484
01:21:03,752 --> 01:21:06,194
challenging DRY and saying, oh, 
DRY is rubbish. 

1485
01:21:06,194 --> 01:21:07,634
You can, you can repeat 
yourself. 

1486
01:21:07,639 --> 01:21:10,027
And then, and you know, until 
you have like three instances, 

1487
01:21:10,027 --> 01:21:11,414
it's okay that you repeat 
yourself. 

1488
01:21:11,894 --> 01:21:15,854
No, no, no, no, no. 
DRY is fundamental. 

1489
01:21:15,854 --> 01:21:17,774
DRY software engineering is 
about dry. 

1490
01:21:17,774 --> 01:21:20,654
It is the most basic, it is the 
most basic principle. 

1491
01:21:20,654 --> 01:21:23,672
And as soon as you have two 
instances of the same code, you 

1492
01:21:23,672 --> 01:21:28,198
should refactor, right? 
Like, I'm sorry, I, I'm, you 

1493
01:21:28,198 --> 01:21:30,958
know, as soon as you have two 
instances, you have the prob, 

1494
01:21:30,958 --> 01:21:34,166
you know, the possibility that 
you make a fix there and you 

1495
01:21:34,166 --> 01:21:38,574
forget to make it there, um. 
So the process of arriving at an

1496
01:21:38,574 --> 01:21:42,260
architecture is a process of 
obsessively refactoring, 

1497
01:21:42,260 --> 01:21:48,721
iteratively, you know, arriving 
at something that works 

1498
01:21:48,721 --> 01:21:52,621
naturally in your context. 
Now, yes, it does involve 

1499
01:21:52,621 --> 01:21:56,437
thinking about modularity. 
It does involve thinking about 

1500
01:21:56,437 --> 01:21:58,267
APIs. 
It does involve thinking about 

1501
01:21:58,267 --> 01:22:01,443
layering, you know. 
Now layering is this thing 

1502
01:22:01,443 --> 01:22:06,519
where, you know, layers are easy
to come up with when you draw 

1503
01:22:06,519 --> 01:22:08,067
boxes and sticks on whiteboards,
right? 

1504
01:22:08,657 --> 01:22:10,187
But layers come at a cost, 
right? 

1505
01:22:10,187 --> 01:22:13,327
I would never say never use, 
never introduce layers. 

1506
01:22:13,327 --> 01:22:15,247
We certainly have layers within 
Hibernate. 

1507
01:22:15,688 --> 01:22:19,319
But layers should be, you know, 
something that you introduce 

1508
01:22:19,319 --> 01:22:22,844
with care when you can see that 
they actually have make, 

1509
01:22:22,844 --> 01:22:25,124
actually make things better at 
the code level. 

1510
01:22:25,124 --> 01:22:27,312
But everything has to be done. 
Architectures have to be 

1511
01:22:27,312 --> 01:22:29,144
motivated from the level of the 
code. 

1512
01:22:29,398 --> 01:22:32,098
If they don't make the code 
better and more elegant and more

1513
01:22:32,098 --> 01:22:33,923
flexible, then you should not be
doing them, right? 

1514
01:22:34,093 --> 01:22:38,311
And so somebody who comes in 
there with their massively 

1515
01:22:38,311 --> 01:22:40,744
cooked architecture and all 
these patterns and says, yeah, 

1516
01:22:40,744 --> 01:22:42,333
you should be doing things this 
way. 

1517
01:22:43,196 --> 01:22:44,572
I'm sorry, but no, you 
shouldn't, unless you can show 

1518
01:22:44,572 --> 01:22:45,626
me that that makes the code 
better. 

1519
01:22:45,996 --> 01:22:49,536
Makes it simpler, more elegant, 
more, um, better factored. 

1520
01:22:50,242 --> 01:22:54,738
That is my view. 
I guess the main point that you 

1521
01:22:54,738 --> 01:22:57,120
mentioned about architecture 
should emerge from your code 

1522
01:22:57,120 --> 01:22:58,964
base, right? 
And the kind of problems that 

1523
01:22:58,964 --> 01:23:00,326
you're dealing with. 
That's the first thing. 

1524
01:23:00,596 --> 01:23:05,048
And iteratively refactoring it. 
I think maybe this part is kind 

1525
01:23:05,048 --> 01:23:08,596
of like what people don't aspire
to do for some sense. 

1526
01:23:08,636 --> 01:23:10,850
Yeah. 
So here's, so here's the thing, 

1527
01:23:10,850 --> 01:23:13,709
I guess the counterpoint to 
everything I've just said, and I

1528
01:23:13,709 --> 01:23:15,194
guess the best argument against 
it, right? 

1529
01:23:15,194 --> 01:23:16,664
Which is always what you should 
try to do. 

1530
01:23:16,664 --> 01:23:20,102
And if you're gonna start 
ranting on a podcast about your 

1531
01:23:20,102 --> 01:23:22,643
dumb opinions on something, 
right, then you should ask, you 

1532
01:23:22,643 --> 01:23:24,577
know, what's the best argument 
against this? 

1533
01:23:24,577 --> 01:23:27,542
And I think the best that you've
exactly identified what's the 

1534
01:23:27,542 --> 01:23:30,746
best argument against it. 
The best argument against it is,

1535
01:23:30,746 --> 01:23:34,466
oh, I don't have time for all 
that refactoring. 

1536
01:23:35,876 --> 01:23:38,516
I'm just trying to solve this 
Jira issue, right? 

1537
01:23:39,697 --> 01:23:45,322
So what do I think? 
I think issue report driven 

1538
01:23:45,322 --> 01:23:50,527
development is a major problem 
for many types of projects. 

1539
01:23:51,345 --> 01:23:53,115
Certainly for the kind of 
projects which we have. 

1540
01:23:53,115 --> 01:23:58,607
You know, if everything we do is
responsive to a complaint from a

1541
01:23:58,607 --> 01:24:02,385
user, what happens? 
You get a product whose 

1542
01:24:02,385 --> 01:24:05,615
semantics have all sorts of 
special cases, right? 

1543
01:24:06,523 --> 01:24:08,732
For a product like Hibernate, 
that is death, okay. 

1544
01:24:08,912 --> 01:24:12,988
Like that produces a product 
which cannot be reasoned about 

1545
01:24:12,988 --> 01:24:14,312
for anybody. 
Why? 

1546
01:24:14,312 --> 01:24:17,194
Because it has all these little 
hand engineered in special 

1547
01:24:17,194 --> 01:24:20,211
cases, for, you know, for that 
guy over there wanted to work 

1548
01:24:20,211 --> 01:24:21,422
like this. 
That guy over there wanted to 

1549
01:24:21,422 --> 01:24:24,441
work like this. 
And now I can't reason about 

1550
01:24:24,441 --> 01:24:26,327
what is the correct behavior, 
right? 

1551
01:24:27,026 --> 01:24:29,136
This is far worse, obviously, if
you don't have a spec. 

1552
01:24:29,136 --> 01:24:30,696
If you have at least a spec, 
right? 

1553
01:24:30,696 --> 01:24:32,876
You know, okay, well, what does 
the spec say we should do? 

1554
01:24:32,876 --> 01:24:35,529
And what can we infer from what 
the spec says about what should 

1555
01:24:35,529 --> 01:24:37,197
happen in this case, even if 
it's not explicit? 

1556
01:24:38,261 --> 01:24:42,239
And so to me, yes, it's 
important to solve issues, issue

1557
01:24:42,239 --> 01:24:44,441
reports, obviously, okay, um, 
it's very important. 

1558
01:24:45,071 --> 01:24:48,525
But we should never just assume,
we should never approach an 

1559
01:24:48,525 --> 01:24:52,456
issue report assuming that what 
this user is asking for is 

1560
01:24:52,456 --> 01:24:56,934
something we should do, right? 
And I piss off a lot of users, 

1561
01:24:56,934 --> 01:24:58,454
right? 
Because I'll be like, no, we're 

1562
01:24:58,454 --> 01:25:01,550
not gonna do that. 
I, you know, and I am, it is not

1563
01:25:01,550 --> 01:25:03,902
that I don't see why you want me
to do that, right? 

1564
01:25:03,992 --> 01:25:06,756
I do see it, right? 
I absolutely see why this is 

1565
01:25:06,756 --> 01:25:11,826
what you need. 
But from, I don't wanna say high

1566
01:25:11,826 --> 01:25:16,518
level, but from the, well, yeah,
from the broader perspective of 

1567
01:25:16,518 --> 01:25:21,166
where does this take the 
semantics of this whole system, 

1568
01:25:21,166 --> 01:25:26,753
we're not gonna do that. 
Um, and you know, on the side 

1569
01:25:26,753 --> 01:25:29,434
of... 
I, look, I don't like people 

1570
01:25:29,434 --> 01:25:33,280
spending time doing grandiose 
refactorings that, you know, you

1571
01:25:33,280 --> 01:25:37,803
know, I introduce some, you 
know, again, box and sticks on 

1572
01:25:37,803 --> 01:25:39,848
whiteboard. 
Oh, we're gonna do this 'cause I

1573
01:25:39,848 --> 01:25:42,080
like it, right? 
No, don't do it that way. 

1574
01:25:43,250 --> 01:25:45,797
But what I do really like is 
sitting there, spending some 

1575
01:25:45,797 --> 01:25:48,506
time looking at this code, and 
spending some time and trying to

1576
01:25:48,506 --> 01:25:51,889
improve the code, right? 
And out of that should emerge, 

1577
01:25:51,889 --> 01:25:56,795
if you do it well, an 
architecture or layers or at 

1578
01:25:56,795 --> 01:26:03,113
least, you know, elegant ways of
reusing functionality and 

1579
01:26:03,113 --> 01:26:06,937
semantics, which are consistent 
across different, you know, 

1580
01:26:06,937 --> 01:26:09,215
parts of the product. 
Yeah. 

1581
01:26:09,725 --> 01:26:11,855
And I like the keyword that you 
mentioned, systems that people 

1582
01:26:11,855 --> 01:26:14,505
could reason about, right? 
Don't forget you work with 

1583
01:26:14,505 --> 01:26:17,332
multiple developers. 
You know, if you don't have a 

1584
01:26:17,332 --> 01:26:20,375
one uniform way of doing stuff, 
I guess it's pretty difficult to

1585
01:26:20,375 --> 01:26:22,905
reason and evolve the system. 
Make code change, even bug 

1586
01:26:22,905 --> 01:26:25,124
fixing, right? 
Sometimes it can be very, very 

1587
01:26:25,124 --> 01:26:27,281
difficult. 
So you mentioned a little bit 

1588
01:26:27,281 --> 01:26:29,735
about DDD, I don't know whether 
we should go there... 

1589
01:26:33,517 --> 01:26:36,601
I've made it my punching bag or 
something recently. 

1590
01:26:36,601 --> 01:26:40,801
But, um, look, I mean, I, look, 
I'm not gonna represent, put 

1591
01:26:40,801 --> 01:26:44,270
myself on some expert on DDD and
whether it works or not, I have 

1592
01:26:44,270 --> 01:26:45,840
no idea. 
You know, maybe it works for 

1593
01:26:45,840 --> 01:26:48,086
some people, you know, like I'm 
sure it does, you know, some 

1594
01:26:48,086 --> 01:26:52,325
people seem to like it, okay. 
What I don't want is for the 

1595
01:26:52,325 --> 01:26:55,527
assumptions behind DDD to find 
their way into technologies 

1596
01:26:55,527 --> 01:26:59,639
we're using, right? 
And that has begun to happen in 

1597
01:26:59,639 --> 01:27:04,138
some areas. 
So we see a framework which will

1598
01:27:04,138 --> 01:27:08,483
remain nameless, which is 
advocating that things have to 

1599
01:27:08,483 --> 01:27:13,800
use aggregates and admits in the
documentation that this is to 

1600
01:27:13,800 --> 01:27:17,260
some extent, it wasn't unnatural
is the word they picked. 

1601
01:27:17,260 --> 01:27:22,390
It was a untraditional or 
traditionally not the considered

1602
01:27:22,390 --> 01:27:25,570
the normal way to work with a 
relational database. 

1603
01:27:25,570 --> 01:27:27,100
I can't think of the quote off 
the top of my head. 

1604
01:27:27,580 --> 01:27:31,210
That is like, that's, you know, 
massive red flag, alarm bells 

1605
01:27:31,210 --> 01:27:32,920
going off as soon as I see that,
okay. 

1606
01:27:32,920 --> 01:27:37,120
As soon as somebody says that 
our, our framework makes, has 

1607
01:27:37,120 --> 01:27:40,094
the expectation that you're 
gonna work with your relational 

1608
01:27:40,094 --> 01:27:44,161
database in a weird way. 
Okay. 

1609
01:27:44,191 --> 01:27:46,931
Um, no, we wanna work with 
relational databases in a 

1610
01:27:47,571 --> 01:27:50,338
traditional, normal, um, natural
way. 

1611
01:27:50,973 --> 01:27:55,583
And so to the extent that DDD 
advocates this idea of 

1612
01:27:55,583 --> 01:27:58,308
aggregates, and one of the 
problems in talking about, one 

1613
01:27:58,308 --> 01:28:02,191
of the problems in talking about
all this stuff is that none of 

1614
01:28:02,191 --> 01:28:05,973
these things come with 
particularly robust or rigorous 

1615
01:28:05,973 --> 01:28:09,558
definitions, okay? 
And so if you read the 

1616
01:28:09,558 --> 01:28:12,679
definition of aggregate, I mean,
it doesn't, I'm not even sure 

1617
01:28:12,679 --> 01:28:14,733
that any two people agree on 
what it means. 

1618
01:28:15,548 --> 01:28:17,865
And you read it and you try, you
know, with the perspective, 

1619
01:28:17,865 --> 01:28:20,301
okay, look, let's, you know, be 
as charitable as possible and 

1620
01:28:20,301 --> 01:28:24,178
let's try to assign to these 
words the most charitable, you 

1621
01:28:24,178 --> 01:28:27,816
know, meaning to them. 
And I've been through that 

1622
01:28:27,816 --> 01:28:30,345
exercise, you know, what most 
charitably it could possibly 

1623
01:28:30,345 --> 01:28:34,456
mean? 
You know, even then I cannot 

1624
01:28:34,456 --> 01:28:38,814
escape to the conclusion that 
they think that relational 

1625
01:28:38,814 --> 01:28:41,086
databases should be document 
databases, okay. 

1626
01:28:42,046 --> 01:28:47,666
That the data exists as a 
discreet set of trees. 

1627
01:28:48,916 --> 01:28:53,968
And the process of retrieving 
data is a process of retrieving 

1628
01:28:53,968 --> 01:28:58,144
of the root of the tree and then
working through the data from 

1629
01:28:58,144 --> 01:29:01,595
that root. 
This is neither a natural, nor 

1630
01:29:01,595 --> 01:29:04,649
is it a correct way to work with
relational data. 

1631
01:29:04,679 --> 01:29:06,599
Relational data is not made of 
trees. 

1632
01:29:07,053 --> 01:29:10,603
That is a document database, and
if someone can't distinguish 

1633
01:29:10,603 --> 01:29:13,953
between what is a document 
database and what is a 

1634
01:29:13,953 --> 01:29:17,013
relational database, then please
be very careful about taking 

1635
01:29:17,013 --> 01:29:20,571
their advice on data. 
And so yeah, that's been a 

1636
01:29:20,571 --> 01:29:23,337
little bit of a jihad I've been 
running, um, recently about 

1637
01:29:23,337 --> 01:29:25,407
against, you know, telling 
people no, look. 

1638
01:29:25,407 --> 01:29:28,466
Um, aggregates don't, you know, 
probably don't make sense. 

1639
01:29:28,466 --> 01:29:29,576
Yes. 
I'm not saying it's impossible 

1640
01:29:29,576 --> 01:29:31,368
that you could find an 
aggregate, you know, you could 

1641
01:29:31,368 --> 01:29:32,786
find a tree somewhere in your 
data model. 

1642
01:29:32,816 --> 01:29:34,556
Yeah. 
I'm sure you can, right? 

1643
01:29:34,616 --> 01:29:36,566
But don't try to shoehorn 
everything into this, okay. 

1644
01:29:36,566 --> 01:29:38,066
Don't try to shoehorn things 
into aggregates. 

1645
01:29:38,066 --> 01:29:42,384
That usually doesn't make sense.
Let's not put like a doctrine 

1646
01:29:42,384 --> 01:29:44,576
that you have follow this a 
hundred percent. 

1647
01:29:44,846 --> 01:29:47,286
Always. 
I think any kind architecture 

1648
01:29:47,286 --> 01:29:50,706
there'll be the plus points plus
the negative points. 

1649
01:29:50,706 --> 01:29:52,386
It's all about trade off at 
the-end-of the day. 

1650
01:29:52,586 --> 01:29:55,729
So think picking the right 
architecture for your context 

1651
01:29:55,729 --> 01:29:58,945
can reason probably is the most 
thing that people should aspire 

1652
01:29:58,945 --> 01:30:00,089
to work on, right? 
Yeah. 

1653
01:30:00,089 --> 01:30:03,229
Like trusting in some sense. 
That whole advice, that whole 

1654
01:30:03,229 --> 01:30:06,681
rant was trust in your own 
intuitions about what's gonna 

1655
01:30:06,681 --> 01:30:10,457
work for your system, right? 
Like people like, you know, 

1656
01:30:10,457 --> 01:30:15,548
trust that it's okay, you know. 
When I was, how old would I be 

1657
01:30:15,548 --> 01:30:18,848
26, 28? 
You know, I told my very 

1658
01:30:18,848 --> 01:30:21,836
experienced manager, no, we 
shouldn't do entity beans, okay?

1659
01:30:22,046 --> 01:30:26,718
Even though IBM and Sun and 
everybody were telling the whole

1660
01:30:26,718 --> 01:30:29,366
world they should use entity 
beans, right? 

1661
01:30:29,396 --> 01:30:32,846
No, you can be right and 
everyone can be wrong. 

1662
01:30:32,876 --> 01:30:34,796
Like this is the thing that 
happens, right? 

1663
01:30:35,173 --> 01:30:37,903
As long as you have good reason,
as long as you do understand 

1664
01:30:37,903 --> 01:30:40,663
your own system and what your 
system does and, you know, you 

1665
01:30:40,663 --> 01:30:44,122
should do the thing that seems 
natural and works. 

1666
01:30:44,362 --> 01:30:45,532
Yeah, I think that's very 
inspiring. 

1667
01:30:45,532 --> 01:30:48,187
Definitely. 
And look what it had led you, 

1668
01:30:48,187 --> 01:30:50,944
you know, to creating Hibernate,
working on specifications and 

1669
01:30:50,944 --> 01:30:53,367
all that. 
I think again, we as a community

1670
01:30:53,367 --> 01:30:54,951
can thank you for your 
contributions. 

1671
01:30:55,341 --> 01:30:57,741
Gavin, I think it's been a great
conversation so far. 

1672
01:30:57,741 --> 01:31:01,445
I think many people would have 
learned a lot from listening to 

1673
01:31:01,445 --> 01:31:03,521
this conversation. 
Unfortunately we have to wrap 

1674
01:31:03,521 --> 01:31:05,547
up. 
Before I let you go, I have one 

1675
01:31:05,547 --> 01:31:07,947
tradition in my podcast to 
actually ask this question I 

1676
01:31:07,947 --> 01:31:09,891
call the three technical 
leadership wisdom. 

1677
01:31:10,311 --> 01:31:12,902
You can think of it like an 
advice that you wanna give to 

1678
01:31:12,902 --> 01:31:14,725
listeners. 
Maybe if you can pick the top 

1679
01:31:14,725 --> 01:31:18,261
three version of your... 
I'm nervous, all these things. 

1680
01:31:18,266 --> 01:31:18,726
Yeah. 
Go on. 

1681
01:31:18,726 --> 01:31:19,446
Go and shoot. 
Yeah. 

1682
01:31:19,546 --> 01:31:21,621
So yeah, maybe if you can share 
that would be great. 

1683
01:31:22,154 --> 01:31:23,939
All right, so there's one thing 
I've been on about recently. 

1684
01:31:23,969 --> 01:31:27,899
Um, I think I've recently seen a
lot of it over the last years. 

1685
01:31:27,899 --> 01:31:30,911
I've seen a lot of advice that 
would tend to tell people, 

1686
01:31:30,911 --> 01:31:33,774
instruct people that they should
be more agreeable. 

1687
01:31:34,544 --> 01:31:37,834
And that people who are 
disagreeable and opinionated and

1688
01:31:37,834 --> 01:31:41,461
prepared to fight for what they 
believe with are so-called quote

1689
01:31:41,461 --> 01:31:44,994
unquote toxic people. 
Now, in my opinion, as soon as 

1690
01:31:44,994 --> 01:31:49,024
you see someone describing 
someone else as toxic, then you 

1691
01:31:49,024 --> 01:31:52,924
should be asking the question of
who is the truly the toxic 

1692
01:31:52,924 --> 01:31:55,134
person here? 
People have different 

1693
01:31:55,134 --> 01:31:57,006
personalities. 
There are people, you know, 

1694
01:31:57,006 --> 01:31:59,608
disagreeableness, agreeableness 
is a, is, you know, is one of 

1695
01:31:59,608 --> 01:32:01,192
the big five personality traits,
okay. 

1696
01:32:01,421 --> 01:32:02,961
There are people who are more 
comfortable. 

1697
01:32:03,181 --> 01:32:07,096
It's not about, you know, being 
insulting, but there are people 

1698
01:32:07,096 --> 01:32:08,783
who are more confident, 
comfortable with disagreement, 

1699
01:32:08,783 --> 01:32:10,811
and there are people less 
comfortable with disagreement. 

1700
01:32:11,199 --> 01:32:13,409
When somebody who is a person 
who is comfortable with 

1701
01:32:13,409 --> 01:32:16,596
disagreement disagrees with you,
they're not attacking you 

1702
01:32:16,596 --> 01:32:18,980
personally. 
They are trying to find, most 

1703
01:32:18,980 --> 01:32:22,348
likely just trying to find a way
to the best, you know, a 

1704
01:32:22,348 --> 01:32:23,628
technically good solution, 
right? 

1705
01:32:24,214 --> 01:32:29,652
The road to consensus passes 
through disagreement as a 

1706
01:32:29,652 --> 01:32:35,135
necessary way point. 
We cannot possibly arrive at a 

1707
01:32:35,135 --> 01:32:39,113
consensus if we don't all 
express forthrightly, honestly, 

1708
01:32:39,113 --> 01:32:44,459
and with the necessary force to,
you know, our opinion, our... 

1709
01:32:44,459 --> 01:32:48,327
and not necessarily even just 
our opinion, but the issues that

1710
01:32:48,327 --> 01:32:50,713
we're concerned about that the 
solution has to satisfy. 

1711
01:32:51,699 --> 01:32:53,858
And, um, and, and we have to 
pass through that point of 

1712
01:32:53,858 --> 01:32:55,268
disagreement to arrive at 
consensus. 

1713
01:32:55,268 --> 01:32:57,278
Otherwise, we are not achieving 
a consensus. 

1714
01:32:57,278 --> 01:33:01,012
What are we are achieving is an 
end state where nine out of the 

1715
01:33:01,012 --> 01:33:06,158
10 people have shut up. 
And so I think we need to come 

1716
01:33:06,158 --> 01:33:11,582
back a bit from this question of
some people are toxic because 

1717
01:33:11,582 --> 01:33:16,025
they have opinions. 
And, um, start looking at it as 

1718
01:33:16,025 --> 01:33:19,574
how can we facilitate, you know,
how can we work to facilitate 

1719
01:33:19,574 --> 01:33:22,588
these kind of discussions so 
that people are less comfortable

1720
01:33:22,588 --> 01:33:26,359
with this agreement can also 
feel safety to put forward their

1721
01:33:26,359 --> 01:33:29,377
views and, you know, it's not 
just someone bullying the 

1722
01:33:29,377 --> 01:33:31,407
others, right? 
But, you know, but that also 

1723
01:33:31,407 --> 01:33:33,744
that we're actually having these
discussions and we're not just 

1724
01:33:33,744 --> 01:33:35,994
telling, you know, young 
developers, they need to shut up

1725
01:33:35,994 --> 01:33:39,541
and do what, you know, what 
their boss or whoever you know, 

1726
01:33:39,541 --> 01:33:42,792
is telling 'em to do. 
I think that that is the risk 

1727
01:33:42,792 --> 01:33:44,729
with this kind of talk I see a 
lot on LinkedIn. 

1728
01:33:44,884 --> 01:33:49,257
I think the risk is that you're 
giving people the idea that they

1729
01:33:49,257 --> 01:33:52,650
should shut up and go along with
the, um, go with the flow, 

1730
01:33:52,650 --> 01:33:56,279
right? 
And so in my opinion, that is 

1731
01:33:56,279 --> 01:33:59,058
probably not great career 
advice, ultimately. 

1732
01:33:59,148 --> 01:34:02,232
You know, your best career 
advice is to learn how to put 

1733
01:34:02,232 --> 01:34:07,354
your your disagreements forward 
in a, in a way which generates 

1734
01:34:07,354 --> 01:34:10,614
the least possible emotion with 
understanding. 

1735
01:34:10,834 --> 01:34:12,064
There will be emotion in it, 
right? 

1736
01:34:12,064 --> 01:34:15,749
There, emotion is a natural part
of it, of this process. 

1737
01:34:16,219 --> 01:34:18,374
So I know that that's something 
which you can take it or leave 

1738
01:34:18,374 --> 01:34:20,595
it, you know? 
That's just some opinion I have 

1739
01:34:20,595 --> 01:34:23,815
of all. 
Um, I'm not saying I'm a expert 

1740
01:34:23,815 --> 01:34:26,749
at, you know, any of this. 
Right. 

1741
01:34:27,259 --> 01:34:29,677
Thank you so much, Gavin. 
Uh, it's, again, it's a pleasure

1742
01:34:29,677 --> 01:34:32,465
to meet you, listened to your 
talk and had a chance to 

1743
01:34:32,465 --> 01:34:34,561
actually talk to you in person 
for this episode. 

1744
01:34:34,891 --> 01:34:37,146
Again, thank you so much and I 
hope you enjoyed this 

1745
01:34:37,146 --> 01:34:38,121
conversation. 
I did. 

1746
01:34:38,121 --> 01:34:39,471
Thank you very much, Henry, for 
having me on. 

1747
01:34:39,471 --> 01:34:40,721
It's very fun.
