1
00:00:00,494 --> 00:00:06,414
So I want to start with something non
-controversial and ask you tabs or spaces.

2
00:00:07,334 --> 00:00:13,594
Oh, we use spaces in Laravel, but I think
there's merit to the tabs argument, if I'm

3
00:00:13,594 --> 00:00:14,674
being honest.

4
00:00:14,674 --> 00:00:15,514
Yeah.

5
00:00:15,514 --> 00:00:18,254
You know, I have to give it credit.

6
00:00:18,334 --> 00:00:20,154
Yeah, you could be convinced.

7
00:00:20,514 --> 00:00:24,194
Yeah, so when I originally wrote Laravel,
it actually was tabs.

8
00:00:24,194 --> 00:00:24,704
OK.

9
00:00:24,704 --> 00:00:28,424
And, you know, so of course, I guess the
merit I'm referring to is people can kind

10
00:00:28,424 --> 00:00:30,190
of configure what that looks like.

11
00:00:30,190 --> 00:00:31,810
on their machine.

12
00:00:31,810 --> 00:00:37,710
At some point in the PHP ecosystem, there
was sort of a coding standard that was

13
00:00:37,710 --> 00:00:39,490
adopted across the whole ecosystem.

14
00:00:39,490 --> 00:00:42,710
And it gained a ton of traction across
tons of projects.

15
00:00:42,710 --> 00:00:44,890
And it dictated that you use spaces.

16
00:00:44,890 --> 00:00:47,630
And that's when we moved to spaces, sort
of.

17
00:00:47,630 --> 00:00:49,100
They forced our hand, in a sense.

18
00:00:49,100 --> 00:00:51,010
But we were originally tabs.

19
00:00:51,070 --> 00:00:51,590
Interesting.

20
00:00:51,590 --> 00:00:51,950
OK.

21
00:00:51,950 --> 00:00:52,680
And do you miss that?

22
00:00:52,680 --> 00:00:56,210
Did you take advantage of the fact that
you could change what a tab meant?

23
00:00:56,290 --> 00:00:59,130
I actually didn't on my own machine.

24
00:00:59,982 --> 00:01:04,092
But I know that's just one of the things
that people refer to as an advantage of

25
00:01:04,092 --> 00:01:05,042
tabs.

26
00:01:05,402 --> 00:01:06,062
Gotcha.

27
00:01:06,062 --> 00:01:07,182
Yeah, that's fair.

28
00:01:07,182 --> 00:01:10,702
I wonder if people do that at all, or if
that's just an argument that justifies

29
00:01:10,702 --> 00:01:12,702
after the fact some other preference.

30
00:01:13,082 --> 00:01:14,622
Yeah, I'm not sure.

31
00:01:14,622 --> 00:01:18,322
You come from, I think, a Rails
background.

32
00:01:18,342 --> 00:01:21,082
That's a spaces environment, right?

33
00:01:21,082 --> 00:01:23,722
Yeah, I think Ruby's all spaces.

34
00:01:24,222 --> 00:01:28,302
I don't think there's any traction on the
tabs in Ruby land.

35
00:01:30,158 --> 00:01:35,088
But it's that whole like, I do this, but I
respect the other side's argument is how I

36
00:01:35,088 --> 00:01:38,098
feel a little bit about like Vim and
Emacs, for example.

37
00:01:38,098 --> 00:01:42,238
Like I'm a Vim guy, but I got to admit,
Emacs is a great editor.

38
00:01:42,238 --> 00:01:46,458
It's being able to like code your, like
configure your editor and Lisp is badass.

39
00:01:46,458 --> 00:01:50,678
The fact that it's just like a running
Lisp instance is just super cool.

40
00:01:50,678 --> 00:01:52,658
So I respect both sides.

41
00:01:52,958 --> 00:01:54,378
Yeah, and I've never used Emacs.

42
00:01:54,378 --> 00:01:56,218
I've only used Vim.

43
00:01:56,438 --> 00:01:58,486
Vim's not my primary editor, but I'm...

44
00:01:58,486 --> 00:02:03,206
proficient enough to like make changes in
a program if I need to using Vim, if I'm

45
00:02:03,206 --> 00:02:05,906
in like a production server or something.

46
00:02:07,086 --> 00:02:12,546
But yeah, all of my college professors
were big Vim users.

47
00:02:12,606 --> 00:02:15,496
And that's all we used in all of our
classes actually.

48
00:02:15,496 --> 00:02:18,126
So I got a lot of Vim experience then.

49
00:02:18,126 --> 00:02:19,046
Nice.

50
00:02:19,046 --> 00:02:21,656
I feel like people should try it.

51
00:02:21,656 --> 00:02:24,846
Like I think it's worth knowing to
experience like, hey, modal editing is a

52
00:02:24,846 --> 00:02:24,996
thing.

53
00:02:24,996 --> 00:02:27,054
It's kind of a different paradigm than
everybody else.

54
00:02:27,054 --> 00:02:28,194
basically everybody else uses.

55
00:02:28,194 --> 00:02:30,784
I think that's just like worth exposing
yourself to even if it doesn't really

56
00:02:30,784 --> 00:02:32,074
click for you.

57
00:02:32,074 --> 00:02:33,694
Yeah, I agree.

58
00:02:34,794 --> 00:02:36,624
So what is your daily driver now?

59
00:02:36,624 --> 00:02:38,054
What do you what do you code in?

60
00:02:38,054 --> 00:02:46,294
I am in die hard, die hard, loyal to
sublime text still.

61
00:02:46,294 --> 00:02:46,854
Oh, OK.

62
00:02:46,854 --> 00:02:51,214
Which I don't you know, I don't know what
the current state of sublime text is as

63
00:02:51,214 --> 00:02:53,414
far as user adoption, but.

64
00:02:53,806 --> 00:02:59,096
Before like VS code and I mean before VS
code there was like the atom editor from

65
00:02:59,096 --> 00:03:02,736
github I don't know if you remember that
but sure and they kind of VS code came out

66
00:03:02,736 --> 00:03:07,726
and it feels like VS code grabbed a lot of
Sublime text old market share, but sublime

67
00:03:07,726 --> 00:03:09,256
text is just so dang fast.

68
00:03:09,256 --> 00:03:14,716
It's so light feeling You can just fly
around files.

69
00:03:14,716 --> 00:03:20,878
It's so much faster than VS code which I
think even VS code users admit I think the

70
00:03:20,878 --> 00:03:26,798
The downside to Sublime is its package
ecosystem is not nearly as vast as VS

71
00:03:26,798 --> 00:03:31,088
codes is at this point, probably because
you can write things in JavaScript and VS

72
00:03:31,088 --> 00:03:36,278
code, whereas in Sublime Text, you're
writing Python, which maybe is not as

73
00:03:36,278 --> 00:03:38,098
widely known, I guess.

74
00:03:38,778 --> 00:03:39,778
So yeah.

75
00:03:39,778 --> 00:03:43,338
When you say fast, is that like fast to
start, fast to open files?

76
00:03:43,338 --> 00:03:44,308
Like what is fast?

77
00:03:44,308 --> 00:03:44,718
Yeah, both.

78
00:03:44,718 --> 00:03:45,138
Everything.

79
00:03:45,138 --> 00:03:45,468
Okay.

80
00:03:45,468 --> 00:03:48,298
Yeah, fast to start, fast to open files.

81
00:03:48,558 --> 00:03:54,238
just navigating around files even somehow
feels faster within a single file, you

82
00:03:54,238 --> 00:03:54,978
know.

83
00:03:54,978 --> 00:03:55,878
Interesting.

84
00:03:55,878 --> 00:03:56,338
Okay.

85
00:03:56,338 --> 00:03:58,638
Yeah, it's just a pretty sweet little
editor.

86
00:03:58,638 --> 00:04:01,928
And I think it's cool because it's one of
those projects that's written by kind of

87
00:04:01,928 --> 00:04:03,118
one person.

88
00:04:03,118 --> 00:04:08,358
It reminds me of like a roller coaster
tycoon or like Stardew Valley, you know,

89
00:04:08,358 --> 00:04:11,038
or some of these pretty ambitious
projects.

90
00:04:11,038 --> 00:04:14,728
Those are both games, but they were
written by a single developer all the way

91
00:04:14,728 --> 00:04:15,406
through.

92
00:04:15,406 --> 00:04:19,646
and sort of achieved worldwide fame and
success, which is, I think, pretty cool.

93
00:04:19,646 --> 00:04:21,306
And Sublime Text is like that.

94
00:04:21,306 --> 00:04:25,246
Was there going to be some big Sublime
Text rewrite that never happened?

95
00:04:25,346 --> 00:04:26,506
Or am I remembering that right?

96
00:04:26,506 --> 00:04:30,896
There was a long break kind of between
Sublime Text three and four.

97
00:04:30,896 --> 00:04:35,706
And the Sublime Text author, I think his
name is John Skinner, he'll just disappear

98
00:04:35,706 --> 00:04:40,748
for months, you know, and then he'll pop
back out with a huge update.

99
00:04:40,748 --> 00:04:44,708
And there's not a lot of updates in the
meantime, you know of like hey, yep still

100
00:04:44,708 --> 00:04:45,408
working on it.

101
00:04:45,408 --> 00:04:49,778
Here's what I'm doing It's just radio
silence and then boom sublime text 4 and

102
00:04:49,778 --> 00:04:54,228
then that kind of a year like I kind of
get that You know, it's just like I'll be

103
00:04:54,228 --> 00:04:55,078
in my coding cave.

104
00:04:55,078 --> 00:04:59,428
I'm not gonna talk to you Yeah, I like to
imagine he lives on like sort of a

105
00:04:59,428 --> 00:05:04,238
Caribbean Island and just resurfaces every
now and then to Ship an update.

106
00:05:04,238 --> 00:05:05,248
Yeah, he doesn't have any internet.

107
00:05:05,248 --> 00:05:10,574
He just had like every few months takes a
boat to the mainland like upload something

108
00:05:10,574 --> 00:05:12,274
Yeah, exactly.

109
00:05:12,334 --> 00:05:14,994
I thought what are you using?

110
00:05:15,374 --> 00:05:18,214
I mean, so most of it, I'm still Vim.

111
00:05:18,214 --> 00:05:21,954
Like my VimRC is like almost 20 years old
at this point.

112
00:05:21,954 --> 00:05:24,854
Yeah, but yeah, it's just it works for me.

113
00:05:24,854 --> 00:05:28,974
Yeah, I think once you're that invested in
Vim, you know, it's probably hard to

114
00:05:28,974 --> 00:05:29,854
totally.

115
00:05:29,854 --> 00:05:34,194
Yeah, I mean, it's like super, super
sanded down to like be like the way I want

116
00:05:34,194 --> 00:05:34,354
it.

117
00:05:34,354 --> 00:05:37,154
You know, it's like it's really highly
configured and I have a lot of muscle

118
00:05:37,154 --> 00:05:40,156
memory built up and I still feel like.

119
00:05:41,902 --> 00:05:45,972
at least for most of the editing I'm
doing, it feels like the fastest for me to

120
00:05:45,972 --> 00:05:50,102
get code out and to make changes into
files and things like that.

121
00:05:50,702 --> 00:05:54,962
I think there are times where I'm a little
jealous of certain things, like, oh, are

122
00:05:54,962 --> 00:05:59,442
there better debugging tools or
refactoring tools or slightly higher level

123
00:05:59,442 --> 00:06:00,922
things that maybe I'm interested in?

124
00:06:00,922 --> 00:06:01,862
I want to check out Zedd.

125
00:06:01,862 --> 00:06:03,322
That seems pretty cool as an editor.

126
00:06:03,322 --> 00:06:04,722
I don't know if you play with that.

127
00:06:04,722 --> 00:06:06,142
I haven't.

128
00:06:06,142 --> 00:06:09,982
And I actually don't use a lot of those
kind of higher level tools either.

129
00:06:10,862 --> 00:06:11,802
Are you a shortcuts guy?

130
00:06:11,802 --> 00:06:15,042
Are you kind of like arrow keys, just like
doing an old -fashioned way?

131
00:06:15,042 --> 00:06:17,922
Yeah, I use a lot of shortcuts for sure.

132
00:06:17,922 --> 00:06:22,032
I don't use a lot of like high -level
debugging tools like that, you know, like

133
00:06:22,032 --> 00:06:24,162
kind of IDE style debugging tools.

134
00:06:24,162 --> 00:06:25,422
I don't really get into that.

135
00:06:25,422 --> 00:06:29,212
I think because a lot of what I do is
program for the web, and I've actually

136
00:06:29,212 --> 00:06:34,520
found that like early in my career, I
wrote .NET desktop applications.

137
00:06:34,520 --> 00:06:38,460
where the application starts up and it's
sort of like this long -lived process,

138
00:06:38,460 --> 00:06:42,480
right, that has sort of state that is
maintained over hours potentially and

139
00:06:42,480 --> 00:06:43,990
variables and things.

140
00:06:43,990 --> 00:06:48,220
And I find that when I'm writing web
software, you know, any given web request

141
00:06:48,220 --> 00:06:50,010
exists for an order of milliseconds.

142
00:06:50,010 --> 00:06:55,650
And the path through the application is
generally easy to follow from beginning to

143
00:06:55,650 --> 00:06:57,350
end as far as what is happening.

144
00:06:57,350 --> 00:07:00,366
And I just don't feel like it really
requires like...

145
00:07:00,366 --> 00:07:04,926
a step debugger to step through those
kinds of situations very often.

146
00:07:04,926 --> 00:07:09,056
Whereas when I was writing desktop
applications, I used the step debugger and

147
00:07:09,056 --> 00:07:13,906
all of those tools in Visual Studio every
single day because there was this

148
00:07:13,906 --> 00:07:17,826
complicated state in the desktop
application and you kind of need to step

149
00:07:17,826 --> 00:07:21,086
through it or even reverse and see what's
happening when users click certain

150
00:07:21,086 --> 00:07:22,086
buttons.

151
00:07:22,286 --> 00:07:26,676
But I just haven't had that experience on
the web as I haven't found myself reaching

152
00:07:26,676 --> 00:07:27,746
for that.

153
00:07:27,786 --> 00:07:29,128
Yeah, interesting.

154
00:07:29,518 --> 00:07:33,858
It was a trip going from desktop to web.

155
00:07:34,658 --> 00:07:36,758
Yeah, I mean, super different.

156
00:07:37,118 --> 00:07:38,598
But I like writing for the web.

157
00:07:38,598 --> 00:07:42,338
And when I'm referring to the web, I'm
primarily referring to server -side web.

158
00:07:42,338 --> 00:07:46,428
So I'm sure if you're writing heavy client
-side applications, I think those bear

159
00:07:46,428 --> 00:07:52,218
actually more resemblance to desktop
application development than back -end web

160
00:07:52,218 --> 00:07:55,298
development, where a quest is in and out,
done, over.

161
00:07:56,498 --> 00:07:58,718
So yeah, it was a big change.

162
00:07:58,718 --> 00:07:59,438
But I'm...

163
00:07:59,438 --> 00:08:01,038
I enjoy it, you know?

164
00:08:01,038 --> 00:08:02,838
Yeah, totally.

165
00:08:03,398 --> 00:08:09,658
So switching from editors, do you have
thinking about shell?

166
00:08:09,678 --> 00:08:12,498
Do you have a are you a what shell are you
using?

167
00:08:12,658 --> 00:08:13,698
I use that.

168
00:08:13,698 --> 00:08:14,318
Oh, my.

169
00:08:14,318 --> 00:08:15,538
Is it zish?

170
00:08:15,538 --> 00:08:16,558
Yeah, sure.

171
00:08:16,558 --> 00:08:17,028
Zish.

172
00:08:17,028 --> 00:08:17,338
I think.

173
00:08:17,338 --> 00:08:18,358
Yeah, I use that.

174
00:08:18,358 --> 00:08:23,178
I don't configure it all that heavily
other than how it comes out of the box.

175
00:08:23,178 --> 00:08:28,628
I just have like a pretty simple bash
profile that sets up some aliases and

176
00:08:28,628 --> 00:08:29,134
some.

177
00:08:29,134 --> 00:08:33,514
a couple of functions, but I'm not a, I
don't have a ton of customizations, I

178
00:08:33,514 --> 00:08:34,954
would say to my shell.

179
00:08:34,954 --> 00:08:37,504
Do you make heavy use of the functions and
the aliases you write?

180
00:08:37,504 --> 00:08:39,574
Like what do you use it most frequently?

181
00:08:40,314 --> 00:08:43,714
I have a lot for jumping around different
directories on my system.

182
00:08:43,714 --> 00:08:49,014
I have some for like, Sim linking certain
directories so that I can test Laravel,

183
00:08:49,754 --> 00:08:54,084
the framework against like the application
skeleton without kind of involving a

184
00:08:54,084 --> 00:08:55,434
package manager.

185
00:08:56,238 --> 00:09:00,428
I have some related to like SSH -ing into
different things, but I mean nothing too

186
00:09:00,428 --> 00:09:03,198
crazy, pretty basic stuff, I would say.

187
00:09:04,758 --> 00:09:09,078
And then your Sublime Text, similar deal,
not super configured?

188
00:09:10,018 --> 00:09:11,608
No, I have a few packages.

189
00:09:11,608 --> 00:09:12,818
I mean, I kind of like that.

190
00:09:12,818 --> 00:09:16,368
I feel like it's kind of like even on my
iPhone, I tend to try to use like the

191
00:09:16,368 --> 00:09:18,198
native apps, you know?

192
00:09:18,818 --> 00:09:21,718
I try to use notes, try to use music.

193
00:09:22,158 --> 00:09:26,988
So I think that carries over into like my
dev stack where I try not to actually get

194
00:09:26,988 --> 00:09:31,788
into this sort of crazy customization
because I feel like when I start up a new

195
00:09:31,788 --> 00:09:36,658
machine, I just kind of like not having to
do a bazillion different things to get my

196
00:09:36,658 --> 00:09:38,858
sort of like environment configured.

197
00:09:38,858 --> 00:09:41,218
It's just a lot to wrap my head around.

198
00:09:41,218 --> 00:09:44,498
So I like to keep things as simple as
possible in general.

199
00:09:44,498 --> 00:09:48,838
I bet I only have like seven or eight
extensions installed on Sublime Text.

200
00:09:48,838 --> 00:09:50,098
You know, it's pretty simple.

201
00:09:50,098 --> 00:09:51,498
And on the dot, I do have...

202
00:09:51,498 --> 00:09:57,158
basic dot files, but again, nothing crazy,
you know?

203
00:09:57,158 --> 00:09:57,348
Okay.

204
00:09:57,348 --> 00:09:58,778
Nothing super nuts.

205
00:09:58,898 --> 00:09:59,818
No.

206
00:10:00,218 --> 00:10:03,338
Not even a dot file big enough to put in a
GitHub repo.

207
00:10:03,338 --> 00:10:07,518
It doesn't even feel worth doing that.

208
00:10:08,378 --> 00:10:09,858
Yeah, interesting.

209
00:10:10,218 --> 00:10:16,838
And so it seems like maybe that's kind of
a philosophy of yours in some sense.

210
00:10:17,018 --> 00:10:20,518
Yeah, I think, I mean, I'm a minimalist in
general, you know?

211
00:10:21,326 --> 00:10:25,406
I was definitely even more of a minimalist
before, like I got married and had kids.

212
00:10:26,426 --> 00:10:28,886
But still a minimalist, I would say.

213
00:10:28,886 --> 00:10:31,786
And I think that carries over outside of
my personal life.

214
00:10:31,786 --> 00:10:35,926
It definitely carries over into my code
life, into the way I write code, the way I

215
00:10:35,926 --> 00:10:37,946
set up my environment, everything.

216
00:10:38,046 --> 00:10:40,566
And I think it carries into Laravel as
well.

217
00:10:40,566 --> 00:10:45,716
I think I've tried to maintain a sort of
minimalist philosophy as I write Laravel

218
00:10:45,716 --> 00:10:46,906
as well.

219
00:10:47,006 --> 00:10:47,486
Totally.

220
00:10:47,486 --> 00:10:49,172
I watched that documentary that...

221
00:10:49,172 --> 00:10:54,082
somebody made if about Laravel recently
and Yeah, I heard the word minimal a lot

222
00:10:54,082 --> 00:10:58,322
of times that seemed to be like a really
core thing that you cared about Yeah,

223
00:10:58,322 --> 00:11:02,272
yeah, we tried to avoid obviously
complexity at all costs I mean, I think

224
00:11:02,272 --> 00:11:07,552
every programmer would say they like to
try to avoid complexity But yeah, we

225
00:11:07,552 --> 00:11:11,362
definitely I At least try to make that a
priority for sure.

226
00:11:11,362 --> 00:11:15,630
Yeah, so what was how do you given that
everyone wants it?

227
00:11:15,630 --> 00:11:18,750
But I would say minimalism is actually
probably in sort of short supply.

228
00:11:18,750 --> 00:11:21,750
Like, what are you doing that actually
works there?

229
00:11:22,910 --> 00:11:27,100
I mean, just kind of getting into the
nitty gritty of like how I like to write

230
00:11:27,100 --> 00:11:27,890
code.

231
00:11:28,030 --> 00:11:29,170
But great.

232
00:11:29,170 --> 00:11:35,920
I try to keep the code like to me, good
code is just code that is easy to change

233
00:11:35,920 --> 00:11:44,014
and doesn't have a lot of like sort of
like apparatus around it or like.

234
00:11:44,014 --> 00:11:49,574
You know, it's not like this big ornate
cathedral that feels extremely

235
00:11:49,814 --> 00:11:55,124
meticulously designed to be this perfect
creation that will withstand all business

236
00:11:55,124 --> 00:11:59,664
use cases without, without, you know, it
will be able to absorb any use case we

237
00:11:59,664 --> 00:12:02,334
need because it's so flexible and so well
thought out.

238
00:12:02,334 --> 00:12:08,934
And I actually gave a talk a few years ago
where I sort of parroted a quote by, oh,

239
00:12:08,934 --> 00:12:10,030
it's a lady.

240
00:12:10,030 --> 00:12:12,280
I'll have to look up her name after the
podcast and put in the show notes.

241
00:12:12,280 --> 00:12:17,670
But she said, you want your code to be
like Kenny from South Park and not like T

242
00:12:17,670 --> 00:12:19,550
1000 from Terminator.

243
00:12:19,550 --> 00:12:27,620
Disposable, easy to change, you know,
because as much as you can try to like

244
00:12:27,620 --> 00:12:32,010
plan ahead for so many different business
use cases, it just never pans out.

245
00:12:32,010 --> 00:12:34,540
It seems like and that's actually what
leads to a lot of complexity.

246
00:12:34,540 --> 00:12:38,330
I think in code is trying to anticipate
all of these future scenarios.

247
00:12:38,330 --> 00:12:39,886
Whereas if you just keep the

248
00:12:39,886 --> 00:12:42,486
Write like the minimal amount of code you
need now.

249
00:12:42,486 --> 00:12:44,916
And I think there is some balancing to
this.

250
00:12:44,916 --> 00:12:50,686
Like you can't just be sloppy or, you
know, do something totally, you know,

251
00:12:50,686 --> 00:12:55,406
that's just going to cause you a lot of
problems later, be significant tech debt,

252
00:12:55,406 --> 00:12:59,486
but try to write the minimal amount of
code to get the job done well, let's say,

253
00:12:59,486 --> 00:13:01,796
and go from there.

254
00:13:01,796 --> 00:13:06,986
You know, don't try to anticipate every
single business case you might have in the

255
00:13:06,986 --> 00:13:09,406
future on your product and code around
that.

256
00:13:10,030 --> 00:13:15,770
It seems like it could be that like having
an opinion enables minimalism.

257
00:13:15,770 --> 00:13:20,420
Like if you decide like this is how we're
going to do cues in Laravel and like this

258
00:13:20,420 --> 00:13:21,530
is going to be a small API.

259
00:13:21,530 --> 00:13:22,550
Like this is how we do it.

260
00:13:22,550 --> 00:13:24,990
And we're not going to support a bunch of
other things.

261
00:13:24,990 --> 00:13:28,110
And that lets you have a small surface
area and like keep things minimal.

262
00:13:28,110 --> 00:13:29,590
Does that sound right to you?

263
00:13:29,730 --> 00:13:30,730
I think so.

264
00:13:30,730 --> 00:13:31,370
Yeah.

265
00:13:31,370 --> 00:13:33,150
I mean, yes, agree.

266
00:13:33,150 --> 00:13:37,170
If you have opinions, you can keep things
much simpler for sure.

267
00:13:37,170 --> 00:13:38,006
And I think.

268
00:13:38,006 --> 00:13:42,506
Laravel is an opinionated framework in the
sense that it's born out of the Rails

269
00:13:42,506 --> 00:13:47,876
lineage of sort of inspired frameworks,
which Rails being an opinionated framework

270
00:13:47,876 --> 00:13:50,246
written by a pretty opinionated developer.

271
00:13:50,246 --> 00:13:55,386
We definitely follow in those footsteps,
and it makes our life easier to an extent.

272
00:13:55,706 --> 00:14:00,726
So we try to keep things like, as far as
Laravel goes, keep things extendable and

273
00:14:00,726 --> 00:14:04,014
flexible where people can write sort of
third -party packages to...

274
00:14:04,014 --> 00:14:07,914
hook into maybe some interfaces we've
written or contracts we've written in our

275
00:14:07,914 --> 00:14:09,014
queue system.

276
00:14:09,014 --> 00:14:13,694
Like, hey, as long as your queue system
does like a push, a pop, or whatever, you

277
00:14:13,694 --> 00:14:18,734
know, queues do, you can just write your
own driver and support your own queue.

278
00:14:18,734 --> 00:14:21,854
So we try to do that and it helps us keep
the core pretty minimal.

279
00:14:22,754 --> 00:14:23,514
Yeah.

280
00:14:23,514 --> 00:14:25,564
Do you value backwards compatibility a
lot?

281
00:14:25,564 --> 00:14:27,964
Like, do you try really hard to maintain
that or is that like a thing you're

282
00:14:27,964 --> 00:14:30,354
willing to sacrifice for cleanliness?

283
00:14:30,714 --> 00:14:31,758
So...

284
00:14:31,758 --> 00:14:36,858
As Laravel has gotten older, and I
released Laravel in 2011, I value

285
00:14:36,858 --> 00:14:41,178
backwards compatibility more so, the
longer that Laravel is around.

286
00:14:41,178 --> 00:14:45,238
When Laravel was very young, like in 2011,
we made breaking changes all the time,

287
00:14:45,238 --> 00:14:47,328
because there weren't that many users.

288
00:14:47,328 --> 00:14:50,618
Most of them were early adopters that were
sort of used to living on the cutting

289
00:14:50,618 --> 00:14:54,988
edge, and were perfectly willing to have
breaking changes in the name of like

290
00:14:54,988 --> 00:14:58,508
progress and fixing things that kind of
weren't panning out in the framework.

291
00:14:58,508 --> 00:15:01,448
And we were sort of still feeling our way
through.

292
00:15:01,518 --> 00:15:06,038
what we wanted the framework to be like
and what we wanted its personality to be.

293
00:15:06,038 --> 00:15:10,898
Now though, 12 years later with so many
businesses and so many developers using

294
00:15:10,898 --> 00:15:16,018
Laravel, I do feel a greater obligation to
maintain backwards compatibility, mainly

295
00:15:16,018 --> 00:15:20,898
because I know how much it sucks to update
dependencies that are breaking things all

296
00:15:20,898 --> 00:15:22,118
the time.

297
00:15:22,378 --> 00:15:23,488
So we definitely value that.

298
00:15:23,488 --> 00:15:29,508
We do releases once a year and there are
usually some minor breaking changes and I

299
00:15:29,508 --> 00:15:29,838
sort of...

300
00:15:29,838 --> 00:15:31,008
think about it in time.

301
00:15:31,008 --> 00:15:34,478
So in our documentation, we list like
estimated upgrade time.

302
00:15:34,478 --> 00:15:38,518
And I try to keep that like 15 minutes,
you know?

303
00:15:38,518 --> 00:15:43,578
So there's a few breaking changes, but
it's not hours of work or days of work.

304
00:15:43,578 --> 00:15:48,378
And try to try to do things that we can
automate as well.

305
00:15:48,658 --> 00:15:49,138
Yeah.

306
00:15:49,138 --> 00:15:51,578
So does that do you find?

307
00:15:52,298 --> 00:15:57,198
So that basically requires you to get it
kind of right in the first place or?

308
00:15:57,198 --> 00:16:01,178
to have some sort of like compatibility
layer that you insert for people that lets

309
00:16:01,178 --> 00:16:03,358
them not have to change if they don't want
to.

310
00:16:03,358 --> 00:16:05,218
So do you feel like you're...

311
00:16:05,218 --> 00:16:05,888
That sounds right.

312
00:16:05,888 --> 00:16:11,298
So are you investing a ton of effort in
trying to get the initial API correct?

313
00:16:11,398 --> 00:16:12,708
Does that sound like you?

314
00:16:12,708 --> 00:16:14,348
Yeah, I would say so.

315
00:16:14,348 --> 00:16:19,888
I mean, we're definitely very hesitant to
take on new APIs because once we do, you

316
00:16:19,888 --> 00:16:22,158
know, we're committed to that API.

317
00:16:22,158 --> 00:16:26,802
So I definitely think those through a lot
before we adopt them.

318
00:16:26,926 --> 00:16:32,946
And yes, we do try to, like say an API
doesn't pan out or it just kind of like

319
00:16:32,946 --> 00:16:33,706
doesn't feel right.

320
00:16:33,706 --> 00:16:37,986
We do try to develop a new API while
keeping the old one.

321
00:16:37,986 --> 00:16:41,386
So like this, say, I mean, let's just keep
it really simple and say like, I hate this

322
00:16:41,386 --> 00:16:43,516
method name that we named this method.

323
00:16:43,516 --> 00:16:46,006
Like we could obviously just leave the old
method in there.

324
00:16:46,006 --> 00:16:47,376
We'll make a new method.

325
00:16:47,376 --> 00:16:51,846
We'll have the old method just call the
new method and everything sort of works.

326
00:16:51,846 --> 00:16:56,078
We do that actually fairly often if we
want to.

327
00:16:56,078 --> 00:16:59,338
Fix things but not break things.

328
00:16:59,938 --> 00:17:00,418
Nice.

329
00:17:00,418 --> 00:17:05,028
Yeah, we should turn off your automated
reaction things.

330
00:17:05,028 --> 00:17:06,018
I don't if you just saw that.

331
00:17:06,018 --> 00:17:07,588
Yeah, what was that?

332
00:17:07,588 --> 00:17:10,838
This is a new Mac OS feature they turned
on by default.

333
00:17:10,838 --> 00:17:15,698
I think if you click the green camera in
the menu bar, there'll be a little video

334
00:17:15,698 --> 00:17:16,218
thing somewhere.

335
00:17:16,218 --> 00:17:17,338
I see that, reactions.

336
00:17:17,338 --> 00:17:18,158
Oh, I turned it off.

337
00:17:18,158 --> 00:17:18,778
Okay.

338
00:17:18,778 --> 00:17:21,478
You do it per app, by the way, so get used
to doing that.

339
00:17:21,478 --> 00:17:22,358
Wow.

340
00:17:22,358 --> 00:17:23,958
Which is a wild decision.

341
00:17:24,118 --> 00:17:25,414
Yeah, so then...

342
00:17:25,652 --> 00:17:30,062
Yeah, I feel like the I heard interesting
things about like how stripe maintains

343
00:17:30,062 --> 00:17:34,472
their their API or there's all of these
transformations They've written going

344
00:17:34,472 --> 00:17:37,702
basically back to the beginning of time
where it's like you can just be on any

345
00:17:37,702 --> 00:17:41,932
version and they will translate it for you
to get to you where you need to go and

346
00:17:41,932 --> 00:17:45,812
that's just like that that commitment to
To not making programmers go back and

347
00:17:45,812 --> 00:17:46,202
change stuff.

348
00:17:46,202 --> 00:17:51,432
I feel like it's kind of an
underappreciated Bit of work that keeps

349
00:17:51,432 --> 00:17:54,550
your thing popular and appreciated and
loved

350
00:17:54,990 --> 00:17:58,570
Yeah, and one thing I've talked about
actually with with Adam Wathen on this

351
00:17:58,570 --> 00:18:02,530
topic is I don't like people to go
shopping on the framework.

352
00:18:02,530 --> 00:18:08,900
Like if I make a bunch of breaking changes
And I think you can kind of see this Maybe

353
00:18:08,900 --> 00:18:13,140
with like view 2 to view 3 I don't want to
put like view and to negative of spotlight

354
00:18:13,140 --> 00:18:17,200
But when you make a lot of breaking
changes and people sort of have to almost

355
00:18:17,200 --> 00:18:20,500
rewrite it feels like if I'm rewriting

356
00:18:20,750 --> 00:18:23,630
Now there's sort of like a question in my
mind of what should I rewrite it in?

357
00:18:23,630 --> 00:18:27,370
And it's not necessarily going to be the
same thing.

358
00:18:27,570 --> 00:18:29,620
And programmers love a new thing.

359
00:18:29,620 --> 00:18:32,190
They're excited to try the new whatever.

360
00:18:32,330 --> 00:18:36,000
So they'll take that They would love
nothing more than to rewrite the whole app

361
00:18:36,000 --> 00:18:38,050
in an entirely new stack.

362
00:18:38,050 --> 00:18:40,480
Not just rewrite, but rewrite in a new
place.

363
00:18:40,480 --> 00:18:41,380
Yeah, with a new thing.

364
00:18:41,380 --> 00:18:42,490
Absolutely.

365
00:18:43,030 --> 00:18:47,630
So I try not to sort of instigate that
mentality in developers.

366
00:18:47,630 --> 00:18:49,742
Because if we have to rewrite,

367
00:18:49,742 --> 00:18:54,052
Why not rewrite in React or Zvelt or in
Laravel's case, why not rewrite in, you

368
00:18:54,052 --> 00:18:58,622
know, I don't know, Rails or Django or
Next .js or whatever it is.

369
00:18:58,622 --> 00:18:59,602
Yeah.

370
00:18:59,602 --> 00:19:04,872
So is there anything besides trying to get
the initial API right and trying to like

371
00:19:04,872 --> 00:19:10,772
not just like be conscious of breaking
changes that helps you keep avoid that

372
00:19:10,772 --> 00:19:11,702
fate?

373
00:19:13,482 --> 00:19:19,502
A lot of the stuff we do, I would prefer
it to be born out of real world needs.

374
00:19:19,502 --> 00:19:23,302
So like surprisingly, when people
contribute to a framework, they will

375
00:19:23,302 --> 00:19:26,652
contribute things that they actually have
never needed in the real world.

376
00:19:26,652 --> 00:19:30,752
And I think when you do that, that's when
you run kind of the biggest risk of not

377
00:19:30,752 --> 00:19:32,452
getting the API right, right?

378
00:19:32,452 --> 00:19:38,122
Cause it's not really born out of any
application need or any business need that

379
00:19:38,122 --> 00:19:40,182
you actually had in the real world.

380
00:19:40,182 --> 00:19:45,672
And I think that's one thing that benefits
Rails and benefits Laravel quite a bit is

381
00:19:45,672 --> 00:19:47,374
that both of the frameworks,

382
00:19:47,374 --> 00:19:53,134
are sort of extracted out of real world
stuff, whether it be Laravel's queue

383
00:19:53,134 --> 00:19:56,894
system or authorization system.

384
00:19:56,894 --> 00:20:00,854
And like, you know, I saw Rails just came
out with a new solid queue that's sort of

385
00:20:00,854 --> 00:20:05,634
born out of their queue experiments and
sort of database backed queues and also

386
00:20:05,634 --> 00:20:07,714
their new solid cache package.

387
00:20:07,934 --> 00:20:13,704
I think that helps you get the API right,
you know, because you know that the use

388
00:20:13,704 --> 00:20:16,668
case is valid, that the methods make
sense.

389
00:20:16,974 --> 00:20:20,894
So I'm always very hesitant and I've
actually closed PRs on the Laravel

390
00:20:20,894 --> 00:20:25,304
framework that I could tell were sort of
built in a vacuum and they weren't

391
00:20:25,304 --> 00:20:28,394
connected with any sort of real
development need.

392
00:20:28,494 --> 00:20:30,314
They're just sort of cool to have.

393
00:20:30,914 --> 00:20:32,894
I think that's risky.

394
00:20:32,934 --> 00:20:35,624
Is there a smell that you noticed that
those have?

395
00:20:35,624 --> 00:20:36,074
Yes.

396
00:20:36,074 --> 00:20:41,194
So I see them come in, like we'll get,
let's say we get one PR that adds a

397
00:20:41,194 --> 00:20:43,278
feature and it gets merged.

398
00:20:43,278 --> 00:20:47,628
someone will see that it gets merged and
then open a very related PR to add maybe

399
00:20:47,628 --> 00:20:52,258
like a complimentary method or something
that I know for sure they have not had the

400
00:20:52,258 --> 00:20:52,778
need for yet.

401
00:20:52,778 --> 00:20:55,078
They only saw the first PR get merged.

402
00:20:55,078 --> 00:20:58,958
And so they're like, oh, well, it would be
cool actually if we had this too.

403
00:20:59,138 --> 00:21:01,618
And I almost always close those.

404
00:21:02,178 --> 00:21:02,378
Interesting.

405
00:21:02,378 --> 00:21:03,308
I can tell.

406
00:21:03,308 --> 00:21:05,058
I can tell where they're coming from.

407
00:21:05,058 --> 00:21:09,078
I assume there's probably a little bit of
a sense of cache from getting a PR merged

408
00:21:09,078 --> 00:21:10,058
into the framework.

409
00:21:10,058 --> 00:21:11,022
Like do you?

410
00:21:11,022 --> 00:21:15,722
I picture myself as a young developer
seeing that, like, ooh, we added first,

411
00:21:15,722 --> 00:21:16,332
second, and third.

412
00:21:16,332 --> 00:21:20,062
Maybe if I make a PR for fourth, that'll
get in there.

413
00:21:20,062 --> 00:21:20,802
Exactly.

414
00:21:20,802 --> 00:21:23,162
And then I get my name on the contributors
list.

415
00:21:23,302 --> 00:21:23,982
Yeah.

416
00:21:23,982 --> 00:21:25,342
And I get it.

417
00:21:25,442 --> 00:21:29,442
People do get excited about contributing
to big open source projects.

418
00:21:29,442 --> 00:21:32,582
But yeah, that's exactly the kind of PR
I'm referring to.

419
00:21:32,582 --> 00:21:33,322
Gotcha.

420
00:21:33,322 --> 00:21:34,542
Yeah, nice.

421
00:21:34,562 --> 00:21:39,422
I've heard that your comments are a little
bit infamous.

422
00:21:39,720 --> 00:21:42,110
You have a very specific comment style.

423
00:21:42,110 --> 00:21:45,070
I would love for you to opine about
comments.

424
00:21:46,370 --> 00:21:52,270
Yeah, so all of the comments in Laravel
are three lines long and each line is

425
00:21:52,270 --> 00:21:57,120
three characters less than the line before
it and I don't know I honestly don't

426
00:21:57,120 --> 00:22:02,260
remember how or when that started but
eventually it became Kind of a thing and

427
00:22:02,260 --> 00:22:03,710
it felt like I was so invested in it.

428
00:22:03,710 --> 00:22:07,874
I might as well keep going And make every
comment that way from now on

429
00:22:08,214 --> 00:22:11,794
There's actually a pretty funny like stack
exchange post from me.

430
00:22:11,794 --> 00:22:16,524
This is pre Laravel actually I was still a
dotnet developer asking like is it dumb to

431
00:22:16,524 --> 00:22:21,074
care about these sort of aesthetic things
in a code base And most of the answers

432
00:22:21,074 --> 00:22:24,934
were like yeah There actually is better
better things that you could be spending

433
00:22:24,934 --> 00:22:30,084
your time on probably But I don't know it
is sort of like is a small thing that

434
00:22:30,084 --> 00:22:33,014
makes me happy when I go through the code
base and like all the comments are the

435
00:22:33,014 --> 00:22:38,094
Same even though it has no real value but
yeah, it's kind of become just like a

436
00:22:38,094 --> 00:22:41,754
a shtick at this point and we just keep it
up in the code base.

437
00:22:41,754 --> 00:22:42,814
Yeah.

438
00:22:42,934 --> 00:22:48,244
It seems like you have a strong, like,
aesthetic sense or like a sense of craft

439
00:22:48,244 --> 00:22:50,444
and like you care about small details and
things.

440
00:22:50,444 --> 00:22:52,994
Do you feel like that was like, was that a
learned thing?

441
00:22:52,994 --> 00:22:54,414
Like, are people born with that?

442
00:22:54,414 --> 00:22:56,844
Did you pick it up by seeing other people
do it or something?

443
00:22:56,844 --> 00:22:58,254
Like, where did that come from?

444
00:22:59,114 --> 00:23:00,964
Probably a little bit of both.

445
00:23:00,964 --> 00:23:05,384
I definitely picked it up some from seeing
other people do it and not seeing it just

446
00:23:05,384 --> 00:23:07,474
necessarily in programming alone.

447
00:23:07,758 --> 00:23:12,478
Like for example, I used to mow grass when
I was in college and back then my grandpa

448
00:23:12,478 --> 00:23:14,418
would help me actually sometimes.

449
00:23:14,758 --> 00:23:19,618
And after every time we mowed, he would
make me lift the mower up on this like

450
00:23:19,618 --> 00:23:24,138
lift and spray off the whole underside of
the mower before we put it back in the

451
00:23:24,138 --> 00:23:25,078
garage.

452
00:23:25,518 --> 00:23:29,858
So it didn't get any, a single blade of
grass in the garage basically.

453
00:23:29,858 --> 00:23:34,214
And he just sort of had this personality
in general of like, you know, like,

454
00:23:34,434 --> 00:23:37,834
finish the backside of the piece of
furniture, you know, make everything look

455
00:23:37,834 --> 00:23:39,654
good, even if no one's going to see it.

456
00:23:39,654 --> 00:23:42,434
That kind of personality, I guess.

457
00:23:42,454 --> 00:23:47,304
And I did pick up on that and sort of
carry it over into programming in some

458
00:23:47,304 --> 00:23:53,224
sense where if I knew, for example, that
like there was some nasty file took deep

459
00:23:53,224 --> 00:23:55,434
into Laravel that was just gross.

460
00:23:55,474 --> 00:23:57,474
I just like couldn't sleep well at night.

461
00:23:57,474 --> 00:24:01,264
Like I wouldn't want to even use Laravel
at all, you know, because I would know

462
00:24:01,264 --> 00:24:03,582
that deep down in there, it's sort of
like.

463
00:24:03,584 --> 00:24:07,954
Farce and there's this ugly code and I
can't well, how can I build my business on

464
00:24:07,954 --> 00:24:10,194
this piece of trash, you know?

465
00:24:10,354 --> 00:24:15,944
So I think it is a little bit OCD to an
extent in a legitimate sense, but that's

466
00:24:15,944 --> 00:24:20,334
just sort of like It's been a it's been a
good thing for Laravel I guess in the

467
00:24:20,334 --> 00:24:26,834
sense that it's made me really thorough in
terms of the quality of the tool I feel

468
00:24:26,834 --> 00:24:31,664
like this I feel like I I can empathize
with some of this where I think I think

469
00:24:31,664 --> 00:24:33,486
people that create stuff

470
00:24:33,486 --> 00:24:38,136
to create things tend to have this like,
it has to be amazing and like it's trash

471
00:24:38,136 --> 00:24:39,166
otherwise.

472
00:24:39,186 --> 00:24:41,746
And like you just want it to be so perfect
and so good.

473
00:24:41,746 --> 00:24:46,726
And I feel like all of us are just kind of
like, man, it sucks today, but eventually

474
00:24:46,726 --> 00:24:47,946
I'm gonna make it like so good.

475
00:24:47,946 --> 00:24:52,146
Once I get these last few things, it's
just this constant sense of not quite good

476
00:24:52,146 --> 00:24:52,626
enough.

477
00:24:52,626 --> 00:24:58,426
And it can be hard to live with, I think,
because it's not, it doesn't feel, yeah.

478
00:24:58,426 --> 00:25:00,610
Yeah, it can be hard to live that life
sometimes.

479
00:25:00,610 --> 00:25:03,270
when you're focused on the negatives and
like needle things to want all the things

480
00:25:03,270 --> 00:25:04,210
to be perfect.

481
00:25:04,210 --> 00:25:07,090
But I do think it leads to really great
software.

482
00:25:07,530 --> 00:25:08,910
Yeah, I agree.

483
00:25:09,650 --> 00:25:09,930
All right.

484
00:25:09,930 --> 00:25:12,870
Do you do you have a coding hill that you
would die on?

485
00:25:13,370 --> 00:25:14,510
Oh, gosh.

486
00:25:14,510 --> 00:25:15,720
What's an example of a hill?

487
00:25:15,720 --> 00:25:17,350
Like, do you have a hill?

488
00:25:18,710 --> 00:25:25,330
Like all instance methods should be like
one line, Max, maybe three lines if you

489
00:25:25,330 --> 00:25:27,190
are an emergency kind of thing.

490
00:25:27,470 --> 00:25:28,750
Um.

491
00:25:28,970 --> 00:25:36,560
Wouldn't say I have a hill that specific
No, I can't even honestly think of like a

492
00:25:36,560 --> 00:25:44,560
certain hill I would necessarily die on in
that sense I Mean I I think in general We

493
00:25:44,560 --> 00:25:49,670
have a few guidelines that I try to follow
I like to keep methods fairly short I

494
00:25:49,670 --> 00:25:55,230
would say but not necessarily a specific
number of lines of code one thing We also

495
00:25:55,230 --> 00:25:58,690
try to avoid really small thing, but I
think it helps

496
00:25:58,894 --> 00:26:04,584
in terms of code readability is we never
make callers of like a function pass

497
00:26:04,584 --> 00:26:09,014
Boolean flags to change the behavior of
the function.

498
00:26:09,074 --> 00:26:12,794
So basically you don't want to end up with
a function that's like some method name,

499
00:26:12,794 --> 00:26:17,574
open parentheses, false, true, false,
true, true, false, you know?

500
00:26:17,574 --> 00:26:22,154
And it's just like imperceptible from the
outside what any of that means.

501
00:26:22,654 --> 00:26:28,270
So in all of Laravel, you never would have
to pass a Boolean flag to any method.

502
00:26:28,622 --> 00:26:34,922
So the way we work around that, you know,
is usually having another method.

503
00:26:34,922 --> 00:26:37,442
Like, let's say we have a method that
generates a URL.

504
00:26:37,442 --> 00:26:39,622
We have a function called URL.

505
00:26:39,682 --> 00:26:43,752
And maybe sometimes people might be
tempted to put like a Boolean flag if they

506
00:26:43,752 --> 00:26:49,332
want the URL to start with HTTPS instead
of just HTTP, like a secure flag, let's

507
00:26:49,332 --> 00:26:49,922
say.

508
00:26:49,922 --> 00:26:54,902
We would just make like a secure URL
function that requires you not to pass the

509
00:26:54,902 --> 00:26:56,036
Boolean flag.

510
00:26:56,128 --> 00:26:58,738
So we do that throughout Laravel.

511
00:26:59,598 --> 00:27:00,818
But I don't know.

512
00:27:00,878 --> 00:27:01,948
None of them are like...

513
00:27:01,948 --> 00:27:05,058
That's actually probably one of the
strictest rules we have.

514
00:27:05,138 --> 00:27:07,278
I would definitely die on that hill.

515
00:27:07,278 --> 00:27:11,148
Before I would put a Boolean flag in the
Laravel docks, I would rather delete the

516
00:27:11,148 --> 00:27:12,858
project, I feel like.

517
00:27:13,998 --> 00:27:14,838
Nice.

518
00:27:14,838 --> 00:27:18,218
By the way, I think that's a really good
anti -pattern to know about.

519
00:27:18,218 --> 00:27:21,098
The term to Google is control couple.

520
00:27:21,538 --> 00:27:24,302
I remember reading about this...

521
00:27:24,302 --> 00:27:25,002
quite a bit.

522
00:27:25,002 --> 00:27:29,992
It's it's sort of like you're effectively
leaking into all the colors of this

523
00:27:29,992 --> 00:27:33,342
method, the conditional that's in the
method.

524
00:27:34,162 --> 00:27:37,312
You know, it's like, everybody knows I got
a conditional and it looks like this.

525
00:27:37,312 --> 00:27:39,192
And it's like, that's not, you're not
supposed to know that.

526
00:27:39,192 --> 00:27:40,322
That's a secret.

527
00:27:40,322 --> 00:27:41,082
Yeah.

528
00:27:41,082 --> 00:27:42,222
That's true.

529
00:27:42,222 --> 00:27:42,542
Yeah.

530
00:27:42,542 --> 00:27:43,282
Call, call the other.

531
00:27:43,282 --> 00:27:43,502
Yeah.

532
00:27:43,502 --> 00:27:46,682
So, so split them into different methods
and call, call what you actually want is I

533
00:27:46,682 --> 00:27:47,918
think a better approach.

534
00:27:47,918 --> 00:27:51,078
By the way, I just like Google control
couple just to remind myself.

535
00:27:51,078 --> 00:27:54,108
And the first result is the anti pattern
that I was speaking about.

536
00:27:54,108 --> 00:27:56,528
The second one is, are you in a
relationship with a controlling partner?

537
00:27:56,528 --> 00:27:57,978
Nine signs.

538
00:27:58,798 --> 00:28:00,108
It's bad.

539
00:28:00,108 --> 00:28:02,118
And it's bad in a lot of contexts.

540
00:28:02,458 --> 00:28:03,798
Yeah.

541
00:28:04,178 --> 00:28:04,578
So no.

542
00:28:04,578 --> 00:28:06,798
So no control couples allowed in there at
all.

543
00:28:06,938 --> 00:28:07,978
No.

544
00:28:08,698 --> 00:28:12,558
And you know, one thing, if I can bring up
something, I think one thing I find

545
00:28:12,558 --> 00:28:14,518
interesting about clean code.

546
00:28:14,734 --> 00:28:17,474
is how clean code is seen across different
ecosystems.

547
00:28:17,474 --> 00:28:20,544
And you may have some insight into this
because we kind of come from different

548
00:28:20,544 --> 00:28:21,914
ecosystems in a sense.

549
00:28:21,914 --> 00:28:22,274
Yeah.

550
00:28:22,274 --> 00:28:26,214
But like when you say clean code, do you
mean the book or the concept?

551
00:28:26,354 --> 00:28:28,194
I mean, a little bit of both, actually.

552
00:28:28,194 --> 00:28:36,674
So like in the PHP and dot net ecosystems,
clean code as in the book and clean code

553
00:28:36,674 --> 00:28:41,614
as in like the Uncle Bob sense of clean
code, if people have heard of this person

554
00:28:41,614 --> 00:28:43,854
is like super popular.

555
00:28:43,854 --> 00:28:44,574
So.

556
00:28:45,166 --> 00:28:50,896
tons of like tons of directories and
architecture and interfaces around

557
00:28:50,896 --> 00:28:57,526
separating concerns really, you know, a
lot of ceremony around getting all of the

558
00:28:57,526 --> 00:29:01,746
application architecture just right with
all of these boundary layers and how they

559
00:29:01,746 --> 00:29:02,806
interact and things like this.

560
00:29:02,806 --> 00:29:06,216
And it's just like a super popular thing
and in .NET.

561
00:29:06,216 --> 00:29:11,146
And I think that's leaked over into PHP
and maybe Java as well, let's say.

562
00:29:11,226 --> 00:29:14,446
Whereas like in JavaScript and

563
00:29:14,446 --> 00:29:19,506
Even in Ruby, to an extent, I feel like
it's not the same emphasis.

564
00:29:20,366 --> 00:29:24,966
And it's like not the same influence of
the same people has bled into those

565
00:29:24,966 --> 00:29:25,366
ecosystems.

566
00:29:25,366 --> 00:29:29,806
And it creates sort of different
definitions of what clean code means.

567
00:29:31,206 --> 00:29:38,276
Whereas like in PHP and .NET and Java, I
feel like clean code means your code is

568
00:29:38,276 --> 00:29:40,686
separated into different files in the
right way.

569
00:29:40,686 --> 00:29:42,646
And they have the right interfaces.

570
00:29:43,006 --> 00:29:43,416
And...

571
00:29:43,416 --> 00:29:45,946
You know, they're typed the right way.

572
00:29:45,946 --> 00:29:52,016
Whereas like in Ruby, or at least in
Rails, it feels like clean code is sort of

573
00:29:52,016 --> 00:29:57,246
code that reads like prose or is, you
know, like more English, plain English or

574
00:29:57,246 --> 00:29:57,466
something.

575
00:29:57,466 --> 00:30:04,046
And it's not the focus is not so much on
like architectural purity as it is in like

576
00:30:04,046 --> 00:30:10,786
ease, how easy it is to read and, you
know, kind of the syntactic sugar of the

577
00:30:10,786 --> 00:30:11,306
code.

578
00:30:11,306 --> 00:30:12,140
Yes.

579
00:30:12,140 --> 00:30:13,930
Which I find interesting.

580
00:30:13,950 --> 00:30:15,270
Yeah, that is interesting.

581
00:30:15,770 --> 00:30:18,430
The word that popped into my head, it was
like idiomatic.

582
00:30:18,430 --> 00:30:19,430
Yeah.

583
00:30:19,430 --> 00:30:24,260
It feels like languages will have
different idiomatic ways of writing code

584
00:30:24,260 --> 00:30:30,050
that is kind of distilled from the culture
of the people who are writing it in a way.

585
00:30:30,470 --> 00:30:33,670
Like you could certainly write, like the
thing when I think of clean code, I think

586
00:30:33,670 --> 00:30:36,890
of the solid principles, like the capital,
all caps.

587
00:30:37,130 --> 00:30:39,726
And like, I would say...

588
00:30:39,726 --> 00:30:42,306
I bet DHH would be like, yeah, that's not
that interesting.

589
00:30:42,306 --> 00:30:45,446
I'm interested in how the file looks.

590
00:30:46,226 --> 00:30:51,096
I'm a software writer, and I want to write
it like an essay a little bit, and it

591
00:30:51,096 --> 00:30:53,266
should look a certain way and feel a
certain way.

592
00:30:53,266 --> 00:30:57,016
And this thing you're telling me about the
Liskov substitution principle about how

593
00:30:57,016 --> 00:30:59,156
this class should be able to stand up for
that class, I don't really give a shit

594
00:30:59,156 --> 00:30:59,846
about that.

595
00:30:59,846 --> 00:31:03,386
That's not that interesting to me in this
hypothetical world where I'm refactoring

596
00:31:03,386 --> 00:31:06,706
in this certain way and using a class
hierarchy.

597
00:31:06,866 --> 00:31:08,366
And so I think it's.

598
00:31:08,366 --> 00:31:12,226
But I think that resonates that sort of
approach resonates more and maybe like

599
00:31:12,226 --> 00:31:17,966
other o languages that are just just with
different people in them Yeah, and I think

600
00:31:17,966 --> 00:31:22,526
one one place I was going with that is the
salt like take for example the solid

601
00:31:22,526 --> 00:31:29,066
principles of clean code Yeah, which I
think in general are kind of helpful Some

602
00:31:29,066 --> 00:31:30,176
of them are more helpful than others.

603
00:31:30,176 --> 00:31:35,626
I think But I think it can lead to this
sort of

604
00:31:36,178 --> 00:31:39,558
idea that clean code can be boiled down
into like a checklist.

605
00:31:39,558 --> 00:31:45,108
And if I do these things in my code, the
code is going to be good and easy to

606
00:31:45,108 --> 00:31:45,578
maintain.

607
00:31:45,578 --> 00:31:51,608
And it's sort of, I feel like it's almost
a little bit of ironically, a lazy way to

608
00:31:51,608 --> 00:31:55,628
code in the sense that you're, you can
not, you can sort of check out your real

609
00:31:55,628 --> 00:32:00,398
critical thinking and just say like, as
long as I'm doing solid, the code is good

610
00:32:00,398 --> 00:32:02,358
in this very robotic, you know, fashion.

611
00:32:02,358 --> 00:32:03,426
Yeah.

612
00:32:03,426 --> 00:32:07,606
And I think it's sort of chasing a silver
bullet to clean code that maybe isn't as

613
00:32:07,606 --> 00:32:10,186
clear cut as you would like it to be.

614
00:32:10,386 --> 00:32:15,656
And I've seen this a lot when working with
especially younger developers who are just

615
00:32:15,656 --> 00:32:19,186
getting into code and they're kind of
taking code serious, which is good, but

616
00:32:19,186 --> 00:32:23,406
they sort of latch on to sort of these
checklists that they can follow to achieve

617
00:32:23,406 --> 00:32:24,086
clean code.

618
00:32:24,086 --> 00:32:27,950
And I think it lacks a little bit of the
intuition that is needed.

619
00:32:27,950 --> 00:32:31,770
when writing clean code, a little bit of
just like the experience of coding for

620
00:32:31,770 --> 00:32:35,920
years and kind of knowing, hey, typically
when I've written code in this way, it's

621
00:32:35,920 --> 00:32:36,650
gone poorly.

622
00:32:36,650 --> 00:32:39,670
You know, like when I've written code in
this way, it's gone well.

623
00:32:39,690 --> 00:32:42,560
And that's just born out of years of
programming, I think.

624
00:32:42,560 --> 00:32:45,190
It can't be summarized into a checklist.

625
00:32:45,210 --> 00:32:50,690
Yeah, I feel like that's also kind of what
makes coding so hard is like, hey, did I

626
00:32:50,690 --> 00:32:51,910
pick a good architecture for this?

627
00:32:51,910 --> 00:32:54,858
You can't even know that today or this
year.

628
00:32:54,862 --> 00:32:58,012
Yeah, you know, you'll you'll know that
maybe like three years from now when like

629
00:32:58,012 --> 00:33:01,782
you're trying to make these complicated
changes or like new people are coming up

630
00:33:01,782 --> 00:33:06,182
onto the system and trying to understand
how it works and reason about it or it's

631
00:33:06,182 --> 00:33:11,542
it like takes a long time to even get good
feedback from your decisions.

632
00:33:11,642 --> 00:33:13,702
Yeah, it really does.

633
00:33:13,702 --> 00:33:16,462
Yeah, unfortunately, you're making a piece
of a pottery.

634
00:33:16,462 --> 00:33:18,942
You can be like, all right, this is a good
bowl of water.

635
00:33:18,942 --> 00:33:20,032
It's you know, it's watertight.

636
00:33:20,032 --> 00:33:21,342
It didn't fall apart.

637
00:33:21,342 --> 00:33:22,622
And like, yeah, it looks nice.

638
00:33:22,622 --> 00:33:24,134
I did it, you know.

639
00:33:24,270 --> 00:33:26,670
Yeah, but like does did the queue system
turn out well?

640
00:33:26,670 --> 00:33:30,700
Do we pick the right API for this or like
are we gonna regret parts of this later

641
00:33:30,700 --> 00:33:31,870
that we couldn't anticipate?

642
00:33:31,870 --> 00:33:34,390
That's that all comes much further down
the road.

643
00:33:34,670 --> 00:33:35,830
Yeah.

644
00:33:36,990 --> 00:33:37,930
Yep.

645
00:33:38,450 --> 00:33:39,890
How do you feel about testing?

646
00:33:40,630 --> 00:33:42,170
I like testing.

647
00:33:42,510 --> 00:33:42,910
We write.

648
00:33:42,910 --> 00:33:44,650
I write a lot of tests.

649
00:33:44,650 --> 00:33:47,010
Laravel has thousands and thousands of
tests.

650
00:33:47,010 --> 00:33:49,560
I don't do a lot of tests first.

651
00:33:49,560 --> 00:33:53,444
I would say I do a lot of tests during
kind of tests after.

652
00:33:53,642 --> 00:33:58,052
But yeah, huge fan of testing in general
would not be able to ship software

653
00:33:58,052 --> 00:33:59,382
confidently without tests.

654
00:33:59,382 --> 00:34:03,952
I don't think Definitely think it's you
know something that every developer should

655
00:34:03,952 --> 00:34:09,452
learn But yeah have no strong opinion in
terms of like test first or test driven

656
00:34:09,452 --> 00:34:15,602
development, I would say Gotcha went so if
you're what does it look like when you

657
00:34:15,602 --> 00:34:16,822
are?

658
00:34:16,822 --> 00:34:22,102
Tackling a kind of law a large new Project
of some kind you like are you a

659
00:34:22,102 --> 00:34:23,298
prototyper?

660
00:34:23,342 --> 00:34:24,362
Like, do you...

661
00:34:24,362 --> 00:34:25,142
What does this look like?

662
00:34:25,142 --> 00:34:26,902
When do the tests show up?

663
00:34:27,342 --> 00:34:32,552
Okay, well, like, let's take, for example,
like a new package or a new feature in

664
00:34:32,552 --> 00:34:33,322
Laravel.

665
00:34:33,322 --> 00:34:38,812
A lot of what I do first is just go into a
blank text file and start writing kind of

666
00:34:38,812 --> 00:34:42,302
my dream API for what this is going to
look like from the outside in.

667
00:34:42,302 --> 00:34:44,922
So basically, kind of like what the
documentation is going to look like.

668
00:34:44,922 --> 00:34:47,582
What are the examples that are going to be
in the documentation?

669
00:34:47,582 --> 00:34:51,334
And sometimes I even call this, you know,
like documentation -driven development.

670
00:34:51,701 --> 00:34:59,422
I think that helps iron out a lot of the
the warts and like problems in your idea

671
00:34:59,422 --> 00:35:03,992
if you have to write out sort of how
people will use it and I also kind of

672
00:35:03,992 --> 00:35:07,352
carry that over into Say I'm building like
a full app.

673
00:35:07,352 --> 00:35:14,342
I have a whole new product idea I'll build
a UI first And it doesn't have to be like

674
00:35:14,342 --> 00:35:17,842
pretty, you know, I'll just use basic
Let's say tailwind classes to sort of get

675
00:35:17,842 --> 00:35:20,864
some basic shape in place, but I'm
definitely not like, you know

676
00:35:20,864 --> 00:35:23,674
tweaking every drop shadow and every
gradient.

677
00:35:24,054 --> 00:35:29,054
But just to make sure that the user
perspective is correct first.

678
00:35:29,494 --> 00:35:30,784
And I didn't used to be this way.

679
00:35:30,784 --> 00:35:33,804
When I first started programming, I would
do like back and I'm going to build this

680
00:35:33,804 --> 00:35:36,394
whole API first that has no front end.

681
00:35:36,394 --> 00:35:37,934
It's front end agnostic.

682
00:35:37,934 --> 00:35:41,934
And that sounded like really appealing for
some reason to my developer brain.

683
00:35:41,934 --> 00:35:46,954
But I was bitten by that sort of several
times where I would build this big API

684
00:35:46,954 --> 00:35:48,134
that was front end agnostic.

685
00:35:48,134 --> 00:35:50,098
And when I went to write the front end,

686
00:35:50,414 --> 00:35:53,114
there was all these awkward things I
needed to do that the API didn't

687
00:35:53,114 --> 00:35:54,534
accommodate for.

688
00:35:54,814 --> 00:36:00,004
So now I start from the outside and work
my way in both if I'm doing an application

689
00:36:00,004 --> 00:36:04,114
or I'm writing something that's just
purely a Laravel feature, like a package

690
00:36:04,114 --> 00:36:06,054
for Laravel that doesn't have a UI at all.

691
00:36:06,054 --> 00:36:09,254
In that case, I would start with a
documentation level, basically.

692
00:36:09,754 --> 00:36:10,554
Gotcha.

693
00:36:10,554 --> 00:36:13,954
And do you like to have like...

694
00:36:13,954 --> 00:36:17,494
Will you spin up a new Laravel app to try
to use this thing?

695
00:36:17,494 --> 00:36:19,404
Like you make it like a toy example kind
of?

696
00:36:19,404 --> 00:36:20,174
Yes.

697
00:36:20,174 --> 00:36:21,054
Exactly.

698
00:36:21,054 --> 00:36:23,614
I do that every day almost.

699
00:36:24,394 --> 00:36:29,724
I actually just have a blank Laravel app,
you know, ready to go to kind of like a

700
00:36:29,724 --> 00:36:33,014
sketch pad that I can just write, drop an
idea into.

701
00:36:33,014 --> 00:36:33,474
Got it.

702
00:36:33,474 --> 00:36:37,684
And then from that app, you're like
writing calls you wish you had and then

703
00:36:37,684 --> 00:36:39,754
updating the framework to try to support
that.

704
00:36:39,754 --> 00:36:41,394
Yep, exactly.

705
00:36:41,554 --> 00:36:41,974
Nice.

706
00:36:41,974 --> 00:36:46,414
And then once you have it the way you like
it, some of those calls probably become

707
00:36:46,414 --> 00:36:48,890
unit tests on the new functionality.

708
00:36:48,974 --> 00:36:53,194
Yep, then I'll just go back in and fill in
the test and you know ship it out there

709
00:36:53,194 --> 00:36:54,234
pretty much.

710
00:36:54,234 --> 00:36:56,294
Yeah, are you are you?

711
00:36:56,594 --> 00:36:57,544
What was your balance?

712
00:36:57,544 --> 00:37:00,954
Would you say between like kind of lower
level unit tests versus higher level

713
00:37:00,954 --> 00:37:02,474
integration type things?

714
00:37:02,474 --> 00:37:03,984
This is another thing that's changed.

715
00:37:03,984 --> 00:37:06,964
I think over the years Earlier in my
career.

716
00:37:06,964 --> 00:37:08,754
I wrote a lot of low level tests.

717
00:37:08,754 --> 00:37:13,494
They ended up feeling really brittle I
think I think there are certain classes

718
00:37:13,494 --> 00:37:18,446
that like lend themselves well to low
level testing things that are sort of

719
00:37:18,446 --> 00:37:22,946
really like say like you pass in a string,
you get out a string, you pass in an

720
00:37:22,946 --> 00:37:23,876
array, you get out an array.

721
00:37:23,876 --> 00:37:27,696
And they're like these very unit testable
types of classes, like a classic like

722
00:37:27,696 --> 00:37:30,346
calculator class or something like that.

723
00:37:30,346 --> 00:37:33,136
Where I feel like those kinds of things
actually lend themselves well to like low

724
00:37:33,136 --> 00:37:35,886
level testing or even just like test
driven development.

725
00:37:35,966 --> 00:37:40,766
But when I'm building web applications, I
test from like the feature level or like,

726
00:37:40,766 --> 00:37:44,386
I guess you would say the controller level
of like, let's make an actual simulated

727
00:37:44,386 --> 00:37:47,080
HTTP request into this endpoint.

728
00:37:47,182 --> 00:37:50,582
we're actually going to assert that
certain records exist in the database

729
00:37:50,582 --> 00:37:51,382
afterwards.

730
00:37:51,382 --> 00:37:56,732
We're going to assert that a mail was
maybe dispatched to some user or a mail

731
00:37:56,732 --> 00:37:59,222
notification or text message or whatever.

732
00:37:59,522 --> 00:38:01,672
And some of those things might be sort of
like faked.

733
00:38:01,672 --> 00:38:04,382
Like, of course, we might fake like the
actual mail sending.

734
00:38:04,382 --> 00:38:07,602
But in general, the test is very high
level.

735
00:38:07,602 --> 00:38:10,978
I just feel like I get so much more
confidence out of those tests.

736
00:38:11,022 --> 00:38:15,412
And I guess the downside is if something
goes wrong, maybe it's not as granular

737
00:38:15,412 --> 00:38:17,942
what exactly went wrong during the
request.

738
00:38:17,942 --> 00:38:21,972
But in my experience, it's still been very
quick to sort of diagnose what was

739
00:38:21,972 --> 00:38:22,762
happening.

740
00:38:22,762 --> 00:38:26,842
And I just get so much more confidence out
of those tests versus like these very low

741
00:38:26,842 --> 00:38:31,442
level tests that almost start to feel
coupled to the implementation of the code

742
00:38:31,442 --> 00:38:33,962
that they're testing in a way.

743
00:38:35,102 --> 00:38:37,860
And in general, I find that also,

744
00:38:37,934 --> 00:38:42,014
the higher level test helped me achieve
what I consider to be the goal of testing,

745
00:38:42,014 --> 00:38:46,694
which is one, shipping software
confidently that you know works, but then

746
00:38:46,694 --> 00:38:53,134
also two, being able to change the code
without significantly changing the tests.

747
00:38:54,114 --> 00:38:58,674
And I think a lot of people actually get
their tests so coupled to the code because

748
00:38:58,674 --> 00:39:03,194
they are so low level that they're almost
one -to -one in terms of when they change.

749
00:39:03,194 --> 00:39:07,086
And to me, that's like losing one of the
main benefits of even having tests is,

750
00:39:07,086 --> 00:39:11,556
the ability to refactor the code or
improve the code without changing the

751
00:39:11,556 --> 00:39:12,526
tests.

752
00:39:13,166 --> 00:39:17,886
So that's why I kind of prefer, honestly,
high level end -to -end tests.

753
00:39:17,966 --> 00:39:18,176
Gotcha.

754
00:39:18,176 --> 00:39:18,526
Yeah.

755
00:39:18,526 --> 00:39:21,666
I would say my style has moved that way as
well recently.

756
00:39:21,666 --> 00:39:24,236
I was a pretty hardcore TDD practitioner.

757
00:39:24,236 --> 00:39:28,276
So I was like, well, I need a lot of unit
tests to drive the next step in this

758
00:39:28,276 --> 00:39:31,706
process of me writing another method and
changing how that method behaves.

759
00:39:32,506 --> 00:39:36,110
But I had of come to the same conclusion
you did, which is that,

760
00:39:36,110 --> 00:39:41,550
The maintenance burden of tests that are a
bit too low level is really pretty high.

761
00:39:41,870 --> 00:39:43,450
And it just doesn't feel...

762
00:39:43,450 --> 00:39:47,370
I feel like I get way more leverage on the
higher level ones.

763
00:39:47,670 --> 00:39:48,590
Yeah.

764
00:39:48,590 --> 00:39:52,290
And you know, like, I keep bringing up
Adam, but I think Adam Wevin actually has

765
00:39:52,290 --> 00:39:54,890
one of the best testing video courses out
there.

766
00:39:54,890 --> 00:39:57,030
It is a Laravel -based course.

767
00:39:57,030 --> 00:40:00,710
It's a video course with like, I don't
even know how many hours of video.

768
00:40:00,710 --> 00:40:02,490
It's gotta be like 100 hours.

769
00:40:02,550 --> 00:40:05,518
But he does a high -level test, but tests
first.

770
00:40:05,518 --> 00:40:10,398
And I think even if you don't use Laravel
or PHP, it's such an awesome course to

771
00:40:10,398 --> 00:40:15,108
check out because it demonstrates, I
think, how to write tests that aren't

772
00:40:15,108 --> 00:40:18,388
brittle but still write tests first if
that's kind of like what people are

773
00:40:18,388 --> 00:40:19,058
interested in.

774
00:40:19,058 --> 00:40:19,408
I don't know.

775
00:40:19,408 --> 00:40:20,448
I found it super cool.

776
00:40:20,448 --> 00:40:25,338
It actually was very influential, I think,
in my own testing journey in a sense.

777
00:40:25,598 --> 00:40:26,198
Cool.

778
00:40:26,198 --> 00:40:26,558
Nice.

779
00:40:26,558 --> 00:40:28,638
That's test -driven Laravel, I think it's
called.

780
00:40:28,638 --> 00:40:29,530
Yeah.

781
00:40:30,286 --> 00:40:32,086
I remember that that was a beast.

782
00:40:32,086 --> 00:40:35,636
I think I remember talking to him as he
was trying to get like the 80th through

783
00:40:35,636 --> 00:40:37,286
100th video released.

784
00:40:37,286 --> 00:40:40,546
Yeah, yeah, that was a quite a labor.

785
00:40:41,106 --> 00:40:44,836
How often are you looking at like a big
chunk of code that you're trying to

786
00:40:44,836 --> 00:40:45,346
understand?

787
00:40:45,346 --> 00:40:48,466
Does this happen frequently with like
contributions or like picking up a

788
00:40:48,466 --> 00:40:49,406
different library or something?

789
00:40:49,406 --> 00:40:51,066
Is this at least weekly?

790
00:40:51,066 --> 00:40:55,936
I would say I don't know I would go so far
as I daily, but weekly for sure, mainly in

791
00:40:55,936 --> 00:40:59,956
the form of pull request, but also in the
form of code that.

792
00:40:59,956 --> 00:41:04,916
employees here at Laravel have written and
we kind of have a peer review process

793
00:41:04,916 --> 00:41:08,276
where probably other people have looked at
it first and we're kind of getting to the

794
00:41:08,276 --> 00:41:11,846
point as well where I don't scan every
single line of code in our commercial

795
00:41:11,846 --> 00:41:12,566
products.

796
00:41:12,566 --> 00:41:14,666
I'm just gonna be such a bottleneck.

797
00:41:14,666 --> 00:41:19,486
But at the framework level, I actually do
read through every pull request to this

798
00:41:19,486 --> 00:41:19,686
day.

799
00:41:19,686 --> 00:41:24,726
I'm the only one that merges pull requests
into the Laravel framework still.

800
00:41:25,166 --> 00:41:28,146
So I review every single pull request and
of course some of them are pretty

801
00:41:28,146 --> 00:41:29,286
complicated.

802
00:41:29,406 --> 00:41:34,086
And so I would say about once a week I'm
looking at a pretty beefy pull request

803
00:41:34,086 --> 00:41:37,266
that let's say is 20 files changed.

804
00:41:37,266 --> 00:41:41,856
I would consider that kind of like in my
context a pretty big pull request for the

805
00:41:41,856 --> 00:41:44,966
framework and sometimes even more than
that.

806
00:41:45,046 --> 00:41:46,186
How do you do that?

807
00:41:46,186 --> 00:41:50,686
Well, I don't know.

808
00:41:50,686 --> 00:41:54,206
I try to tackle like the hard things
first.

809
00:41:54,510 --> 00:41:59,310
So just in general, not just on this
topic, but if I have something that I'm

810
00:41:59,310 --> 00:42:04,370
trying to tackle, I'll just do the hardest
task first and just get through it.

811
00:42:04,370 --> 00:42:06,470
So I kind of do that with pull requests.

812
00:42:06,730 --> 00:42:10,030
I don't really have any secret other than
just like gritting your teeth and pulling

813
00:42:10,030 --> 00:42:13,510
down the pull request and going through it
kind of file by file.

814
00:42:13,530 --> 00:42:17,320
So first, I'll take like a high level
cursory overview, just like in the GitHub

815
00:42:17,320 --> 00:42:20,878
web interface and kind of get my head
wrapped around.

816
00:42:20,878 --> 00:42:23,808
in general what they're trying to do and
then I'll pull down the pull request

817
00:42:23,808 --> 00:42:29,938
locally go file by file checking them off
on GitHub as I go, you know, making sure

818
00:42:29,938 --> 00:42:35,378
everything looks good renaming variables
refactoring methods if I need to, you

819
00:42:35,378 --> 00:42:37,018
know, things like that.

820
00:42:37,138 --> 00:42:37,388
Interesting.

821
00:42:37,388 --> 00:42:41,518
Okay, so you'll so you'll you're editing
you're making edits here as you go.

822
00:42:41,518 --> 00:42:45,458
Yeah, like maybe pushing to a branch that
is like their changes plus yours kind of

823
00:42:45,458 --> 00:42:47,318
thing and merging that later.

824
00:42:47,318 --> 00:42:48,742
Yep, exactly.

825
00:42:49,652 --> 00:42:54,682
And I will say that like the bigger your
poor request is to Laravel, it has to be

826
00:42:54,682 --> 00:42:55,962
really valuable.

827
00:42:56,062 --> 00:42:59,062
So I'm all about like bang for your buck
poor requests.

828
00:42:59,062 --> 00:43:03,422
So my favorite poor requests are obviously
poor requests that are like two lines

829
00:43:03,422 --> 00:43:08,282
changed, but immense developer value like
added.

830
00:43:08,282 --> 00:43:13,882
Because obviously almost no maintenance
burden, tons of value added for the

831
00:43:13,882 --> 00:43:15,542
hundreds of thousands of people using
Laravel.

832
00:43:15,542 --> 00:43:16,882
Like that's ideal.

833
00:43:17,062 --> 00:43:19,406
The bigger your poor request is,

834
00:43:19,406 --> 00:43:24,536
it has to be really freaking good in terms
of value added because I have to take over

835
00:43:24,536 --> 00:43:27,726
all of the maintenance burden for that
feature going forward.

836
00:43:27,726 --> 00:43:31,596
And it doesn't matter honestly how hard
the person promises that they'll stick

837
00:43:31,596 --> 00:43:33,346
around and maintain the feature.

838
00:43:33,346 --> 00:43:38,136
Just like you have to understand that life
happens, they change careers, maybe

839
00:43:38,136 --> 00:43:43,396
they're in a different language, they're
at a different company and they're not

840
00:43:43,396 --> 00:43:46,266
even using PHP anymore and it's like, hey,
sorry.

841
00:43:46,382 --> 00:43:50,622
I don't remember exactly why we did this,
or I don't even use PHP anymore.

842
00:43:50,622 --> 00:43:54,582
So I just assume that we're maintaining
this forever without any help.

843
00:43:55,422 --> 00:43:59,362
And in that case, the feature has to be
freaking awesome if it's going to be like

844
00:43:59,362 --> 00:44:02,462
20 or 30 files changed in the framework.

845
00:44:02,762 --> 00:44:04,902
Yeah, that makes sense.

846
00:44:05,442 --> 00:44:05,912
Yeah.

847
00:44:05,912 --> 00:44:08,262
Do you care about good commit messages?

848
00:44:09,982 --> 00:44:12,622
Yeah, when we squash things down, yes.

849
00:44:12,622 --> 00:44:16,000
Especially if it's pretty complicated,
what's being added.

850
00:44:16,062 --> 00:44:22,742
I try to add something meaningful in my
own pull requests at least Just to kind of

851
00:44:22,742 --> 00:44:25,412
you know make it easier for people if
they're browsing through and seeing what

852
00:44:25,412 --> 00:44:31,782
changed Mm -hmm And so do you is this
mostly like a description of like a high

853
00:44:31,782 --> 00:44:33,362
-level description of what's what's going
on?

854
00:44:33,362 --> 00:44:35,782
What's part of this this change?

855
00:44:35,782 --> 00:44:41,002
Yeah, pretty much So like we recently
refactored some stuff in Laravel to make

856
00:44:41,002 --> 00:44:45,166
it a little bit slimmer a little bit
easier to onboard

857
00:44:45,166 --> 00:44:48,526
sort of new developers into a little bit
less overwhelming out of the box.

858
00:44:48,526 --> 00:44:52,186
And when I made that change, I actually
wrote a pretty detailed description in the

859
00:44:52,186 --> 00:44:55,936
get commit message of like everything that
changed and why it changed and the

860
00:44:55,936 --> 00:44:59,436
implications of that, because it was a
sort of beefy PR that fundamentally

861
00:44:59,436 --> 00:45:01,706
changed some things in Laravel.

862
00:45:02,106 --> 00:45:06,446
So if the poor request is more, you
there's a lot of kind of moving parts and

863
00:45:06,446 --> 00:45:09,746
a lot of things happening, you know, I'll
write a more detailed message.

864
00:45:09,746 --> 00:45:12,046
If it's a pretty simple change, that's
pretty self -explanatory.

865
00:45:12,046 --> 00:45:14,286
I might not write much of anything.

866
00:45:14,626 --> 00:45:15,258
Right.

867
00:45:15,342 --> 00:45:18,702
Do you draw diagrams or anything as you
work?

868
00:45:18,882 --> 00:45:21,202
Do you keep notes or sketches or anything?

869
00:45:21,722 --> 00:45:22,842
Rarely.

870
00:45:22,842 --> 00:45:27,542
I mean, I can only think of like a handful
of times I might have done that.

871
00:45:28,162 --> 00:45:31,622
There are times I wish I had a whiteboard
next to my desk.

872
00:45:31,622 --> 00:45:35,482
I feel like when I used to have that when
I was like in a cubicle, I used that

873
00:45:35,482 --> 00:45:37,702
actually a lot to sketch out things.

874
00:45:37,702 --> 00:45:42,142
So maybe the fact that I don't sketch out
things is just lack of access to a quick

875
00:45:42,142 --> 00:45:43,526
whiteboard, but...

876
00:45:44,014 --> 00:45:47,574
No, it's not something I really reach for
very often.

877
00:45:47,914 --> 00:45:52,094
I'll more like write, I would say, like a
manifesto of a new feature more than I

878
00:45:52,094 --> 00:45:52,874
would like draw something.

879
00:45:52,874 --> 00:45:57,804
So I might open up Notion, go to a new
document, let's say, you know, new

880
00:45:57,804 --> 00:46:02,204
database feature in Laravel and type up
like a pitch for that feature just to kind

881
00:46:02,204 --> 00:46:05,234
of wrap my head around it and the benefits
and the drawbacks.

882
00:46:05,234 --> 00:46:08,934
I do that more than like drawing diagrams,
I would say.

883
00:46:09,054 --> 00:46:09,954
Gotcha.

884
00:46:10,394 --> 00:46:12,814
Do you feel like there are habits?

885
00:46:12,814 --> 00:46:16,014
that you follow that help you make good
code.

886
00:46:17,274 --> 00:46:22,374
Kent Beck has this great quote, which is,
I think he says something like, I'm an

887
00:46:22,374 --> 00:46:25,154
average programmer with above average
habits.

888
00:46:25,914 --> 00:46:27,114
That's interesting.

889
00:46:27,114 --> 00:46:28,134
Yeah.

890
00:46:32,270 --> 00:46:36,010
I mean, asking a lot of questions as far
as like, why does it have to be this way?

891
00:46:36,010 --> 00:46:37,270
Why does it have to be that way?

892
00:46:37,270 --> 00:46:40,330
You know, challenging assumptions in terms
of what we're building.

893
00:46:40,330 --> 00:46:42,490
Do we actually need this code at all?

894
00:46:42,490 --> 00:46:44,990
I think is a good question to ask.

895
00:46:45,090 --> 00:46:45,810
Totally.

896
00:46:46,130 --> 00:46:49,170
Which is, you know, not probably asked
often enough.

897
00:46:49,170 --> 00:46:56,410
I sort of agree that like I see myself as
a very average developer with, I think my

898
00:46:56,470 --> 00:47:02,116
power in a sense is I have a very low
threshold for like pain, developer pain.

899
00:47:02,286 --> 00:47:04,696
And there are just like certain APIs.

900
00:47:04,696 --> 00:47:06,306
I'm just not willing to stomach.

901
00:47:06,306 --> 00:47:12,766
And I think my threshold is pretty low
compared to other programmers around me

902
00:47:12,766 --> 00:47:15,696
that I see where it's like they're willing
to put up with a little bit more

903
00:47:15,696 --> 00:47:19,746
complexity, a little bit more like
cumbersome APIs and just sort of live with

904
00:47:19,746 --> 00:47:21,826
it and move on with their life.

905
00:47:21,886 --> 00:47:26,766
Whereas in Laravel, I'm just have such a
low threshold for what I'm willing to

906
00:47:26,766 --> 00:47:31,626
tolerate in terms of like cumbersome,
awkward, gross.

907
00:47:31,806 --> 00:47:34,746
unrefined API's are.

908
00:47:35,246 --> 00:47:41,146
And I think that helps a lot keep Laravel
nice and clean and feeling fresh and

909
00:47:41,146 --> 00:47:41,986
enjoyable.

910
00:47:41,986 --> 00:47:45,596
Yeah, I thought that's kind of the secret
of quality is just like caring a little

911
00:47:45,596 --> 00:47:46,546
bit more.

912
00:47:46,546 --> 00:47:52,286
Yeah, I think that just works in almost
everything is like it's not that like I'm

913
00:47:52,286 --> 00:47:55,446
so brilliant programmer or a product
person.

914
00:47:55,446 --> 00:47:57,518
I think it's a little bit more just like
I.

915
00:47:57,518 --> 00:47:58,958
I have low pain tolerance.

916
00:47:58,958 --> 00:48:01,828
Like it's I get more annoyed maybe than
the average person.

917
00:48:01,828 --> 00:48:03,678
Yeah, when things are not awesome.

918
00:48:03,678 --> 00:48:05,468
And so I'm just like, well, can't we just
make it better?

919
00:48:05,468 --> 00:48:07,338
And often the answer is yes.

920
00:48:07,338 --> 00:48:08,378
But you only get to that.

921
00:48:08,378 --> 00:48:08,588
Yes.

922
00:48:08,588 --> 00:48:10,138
If you're like, I find this too annoying.

923
00:48:10,138 --> 00:48:12,078
Like I want you to make it better.

924
00:48:12,078 --> 00:48:12,428
Yeah.

925
00:48:12,428 --> 00:48:18,008
So I've long thought that was sort of one
key to, you know, Laravel success in a

926
00:48:18,008 --> 00:48:18,818
sense.

927
00:48:18,818 --> 00:48:20,648
It's just you.

928
00:48:20,648 --> 00:48:20,868
Yeah.

929
00:48:20,868 --> 00:48:23,778
You not being annoyed.

930
00:48:23,778 --> 00:48:24,098
Yeah.

931
00:48:24,098 --> 00:48:25,898
Being okay with pain.

932
00:48:25,898 --> 00:48:26,686
Yeah.

933
00:48:27,126 --> 00:48:34,276
And I think needing things, you know, I'm
not I don't feel like an exceptionally

934
00:48:34,276 --> 00:48:39,036
gifted computer scientist, you know, I
kind of prefer things to be easy and

935
00:48:39,036 --> 00:48:40,086
digestible.

936
00:48:40,086 --> 00:48:43,586
And, you know, so I tend to try to write
code that way.

937
00:48:43,586 --> 00:48:48,816
I mean, it's probably it's probably better
that you aren't because if you were a

938
00:48:48,816 --> 00:48:53,046
super brilliant programmer, it might be
hard for you to know that you have written

939
00:48:53,046 --> 00:48:55,706
something that is hard to understand or
follow.

940
00:48:55,846 --> 00:48:57,298
Yeah, I agree.

941
00:48:57,518 --> 00:49:00,868
I think I'm an average developer that hits
average developer problems and writes

942
00:49:00,868 --> 00:49:05,498
solutions for the average developer, and
that is a big market.

943
00:49:05,498 --> 00:49:08,438
There's a lot of people there.

944
00:49:08,538 --> 00:49:09,238
Yeah.

945
00:49:09,238 --> 00:49:10,678
Yeah, nice.

946
00:49:10,678 --> 00:49:13,098
So if you think about your...

947
00:49:13,098 --> 00:49:16,478
So maybe you're an average developer, but
let's...

948
00:49:16,478 --> 00:49:21,408
If you think about your programming skill
over time, when was that curve the

949
00:49:21,408 --> 00:49:22,638
steepest?

950
00:49:23,338 --> 00:49:25,262
In terms of when did I improve the most?

951
00:49:25,262 --> 00:49:28,802
Yeah, when were you improving the most and
what were you doing that led to that?

952
00:49:29,202 --> 00:49:33,692
I feel like I made the biggest leap during
my dotnet days when I was working with

953
00:49:33,692 --> 00:49:38,712
some really talented dotnet programmers
that were much smarter than me and had

954
00:49:38,712 --> 00:49:41,382
much more experience than me in building
software.

955
00:49:41,382 --> 00:49:46,702
And I just leveled up like extremely
quickly in that environment, which kind of

956
00:49:46,702 --> 00:49:50,342
sucks because I feel like I'm not in that
environment anymore necessarily.

957
00:49:50,342 --> 00:49:51,382
Yeah.

958
00:49:51,582 --> 00:49:53,042
And I it's just awesome.

959
00:49:53,042 --> 00:49:53,376
If.

960
00:49:53,376 --> 00:49:58,006
early in your career, you can be around a
great team of people that really know what

961
00:49:58,006 --> 00:49:59,366
they're doing.

962
00:50:00,326 --> 00:50:06,216
And not in the sense that like they're,
you know, ivory tower people, but just

963
00:50:06,216 --> 00:50:10,866
they've got a lot of experience building
and maintaining software, and they know

964
00:50:10,866 --> 00:50:13,086
what works, they know what doesn't.

965
00:50:13,106 --> 00:50:16,446
And I just think you can level up so
quickly in that environment.

966
00:50:16,446 --> 00:50:20,026
Yeah, I think if you're a newer programmer
optimizing for the quality of your

967
00:50:20,026 --> 00:50:23,118
teammates is probably the number one thing
like over

968
00:50:23,118 --> 00:50:27,958
product or salary like, oh, I'm super
excited about the app or like I would make

969
00:50:27,958 --> 00:50:28,478
a lot of money.

970
00:50:28,478 --> 00:50:29,008
Okay, fine.

971
00:50:29,008 --> 00:50:32,818
But like, how good are the people on your
team and are they willing to teach you?

972
00:50:32,818 --> 00:50:36,398
That's that's the thing I'll be thinking
about early in my career in particular.

973
00:50:36,398 --> 00:50:36,858
Right?

974
00:50:36,858 --> 00:50:37,678
Yeah.

975
00:50:37,678 --> 00:50:38,498
Did you?

976
00:50:38,498 --> 00:50:41,348
So when these when you were getting better
by working with these more experienced

977
00:50:41,348 --> 00:50:44,038
programmers, what what was the knowledge
transfer like?

978
00:50:44,038 --> 00:50:46,218
Was it happening mostly in code reviews?

979
00:50:46,218 --> 00:50:48,418
Was were you sitting at lunch talking
about this stuff?

980
00:50:48,418 --> 00:50:49,778
Were you pair programming?

981
00:50:50,318 --> 00:50:55,708
It actually was more like in the code in
the code reviews like and I was not a very

982
00:50:55,708 --> 00:50:56,778
good programmer.

983
00:50:56,778 --> 00:51:00,698
I had only been programming for you know,
maybe a year professionally at this time

984
00:51:00,698 --> 00:51:05,168
and obviously making like just you know,
new programmer mistakes or writing things

985
00:51:05,168 --> 00:51:08,198
in a way that maybe I wouldn't write today
and they'd be like, hey, what if we wrote

986
00:51:08,198 --> 00:51:09,118
it like this way?

987
00:51:09,118 --> 00:51:12,558
Or have you thought about like taking this
approach and it would just like click and

988
00:51:12,558 --> 00:51:15,918
be like, oh yeah, that actually is a much
better way to do things.

989
00:51:16,814 --> 00:51:21,394
So it was a lot of that, a lot of just
friendly review and pointers in the code.

990
00:51:21,394 --> 00:51:23,934
And then also looking at how they wrote
code.

991
00:51:23,954 --> 00:51:27,214
Because say I just had a down afternoon
where I didn't really have much to do

992
00:51:27,214 --> 00:51:29,014
because I had wrapped up a project or
whatever.

993
00:51:29,014 --> 00:51:33,784
Then I could just go browse some code and
just see how things worked and see what

994
00:51:33,784 --> 00:51:35,154
people were doing.

995
00:51:35,614 --> 00:51:37,434
Do you ever do that now?

996
00:51:37,854 --> 00:51:39,994
Not really, no.

997
00:51:39,994 --> 00:51:42,374
I don't do that a lot now.

998
00:51:42,774 --> 00:51:43,790
But I did.

999
00:51:43,790 --> 00:51:46,840
definitely do that early in my career just
to kind of like get insight into how

1000
00:51:46,840 --> 00:51:49,470
people were tackling different problems.

1001
00:51:49,630 --> 00:51:51,170
Yeah, totally.

1002
00:51:52,830 --> 00:52:00,330
It's kind of shocking to me how I was
watching in that Laird Mill documentary,

1003
00:52:00,330 --> 00:52:02,830
what a big role Ian Lansman played.

1004
00:52:03,390 --> 00:52:08,090
I didn't recognize him as kind of like the
daddy that like kind of incubated this

1005
00:52:08,090 --> 00:52:09,390
thing and made it happen.

1006
00:52:09,390 --> 00:52:10,850
That was really fascinating.

1007
00:52:10,890 --> 00:52:11,598
Yeah.

1008
00:52:11,598 --> 00:52:16,938
I mean, I think Ian took a pretty big risk
on Laravel, I guess, early days.

1009
00:52:16,938 --> 00:52:23,258
I had released Laravel maybe six months
before I got an email from Ian, like, hey,

1010
00:52:23,358 --> 00:52:27,198
we build customer support software and we
kind of want to modernize some of our, you

1011
00:52:27,198 --> 00:52:30,048
know, PHP code base onto Laravel.

1012
00:52:30,048 --> 00:52:31,958
It looks like kind of a cool tool.

1013
00:52:32,178 --> 00:52:35,178
Would you want to come work for us and
help us do that?

1014
00:52:35,178 --> 00:52:36,974
And Laravel was like not a...

1015
00:52:36,974 --> 00:52:39,154
It was not a big thing at all.

1016
00:52:39,154 --> 00:52:44,694
Definitely not outside of PHP, but even
within PHP, it was not even in the top,

1017
00:52:44,694 --> 00:52:49,554
let's say four or five frameworks that you
might choose to write a new application

1018
00:52:49,554 --> 00:52:50,154
in.

1019
00:52:50,154 --> 00:52:55,104
So in that sense, it definitely feel like
he was placing a bet on a pretty young

1020
00:52:55,104 --> 00:52:55,734
tool.

1021
00:52:55,734 --> 00:53:00,744
But what was cool is when I got there, he
actually gave me probably six months to

1022
00:53:00,744 --> 00:53:05,184
just work only on Laravel, building out
features that we knew we would need.

1023
00:53:05,184 --> 00:53:06,062
Like we knew...

1024
00:53:06,062 --> 00:53:07,072
we would need a queue system.

1025
00:53:07,072 --> 00:53:10,152
We were handling lots of incoming email,
building a customer support tool.

1026
00:53:10,152 --> 00:53:13,822
We needed to really queue a lot of
incoming email for processing later.

1027
00:53:14,402 --> 00:53:16,842
We wrote the whole database migration
system.

1028
00:53:16,842 --> 00:53:18,882
We improved the ORM a lot.

1029
00:53:18,882 --> 00:53:23,542
Tons of stuff that we knew we would need,
I built during those months.

1030
00:53:23,542 --> 00:53:26,222
So yeah, I mean, it was a pretty pivotal
moment for the framework.

1031
00:53:26,222 --> 00:53:30,122
He's also the one that sort of first
encouraged me to have like a Laricon in

1032
00:53:30,122 --> 00:53:31,082
general.

1033
00:53:31,242 --> 00:53:34,462
He was like, hey, I think we could do a
conference about this.

1034
00:53:34,606 --> 00:53:36,126
about Laravel.

1035
00:53:36,306 --> 00:53:37,596
And I was like, man, I don't know.

1036
00:53:37,596 --> 00:53:39,326
Like, I don't know if anyone's going to
come to that.

1037
00:53:39,326 --> 00:53:43,136
And he was like, you know, even if it's
only like 100 people, we should do it.

1038
00:53:43,136 --> 00:53:43,926
It'd be fun.

1039
00:53:43,926 --> 00:53:46,186
And that's just kind of how it got
started.

1040
00:53:46,546 --> 00:53:47,806
Yeah, that's so cool.

1041
00:53:47,806 --> 00:53:55,376
I feel like my takeaway from that was that
it can be so powerful to believe in a

1042
00:53:55,376 --> 00:54:00,226
person and a thing and like encourage them
to raise their ambitions a bit.

1043
00:54:00,886 --> 00:54:01,806
Yes.

1044
00:54:01,826 --> 00:54:03,172
Yeah, agree.

1045
00:54:03,374 --> 00:54:06,284
I've done that in the Larval ecosystem
sometimes where I'll see like someone

1046
00:54:06,284 --> 00:54:09,664
write something really cool and I'll just
like email them and be like, I just want

1047
00:54:09,664 --> 00:54:11,814
to let you know, like this is a pretty
cool thing.

1048
00:54:12,034 --> 00:54:15,184
You know, if I can ever be in any
assistance to you, you know, like, let me

1049
00:54:15,184 --> 00:54:15,384
know.

1050
00:54:15,384 --> 00:54:19,634
Like not any kind of like I'm not looking
for any business deal or anything like

1051
00:54:19,634 --> 00:54:23,654
that, but just like if I can like put you
on in any way that helps you, you know,

1052
00:54:23,654 --> 00:54:25,314
like, let me know.

1053
00:54:25,654 --> 00:54:26,844
Yeah, I think that's really good.

1054
00:54:26,844 --> 00:54:31,094
Like, like kind of like watering the seed
a little bit, but it also seems like Ian

1055
00:54:31,094 --> 00:54:33,550
watered the seed and also like

1056
00:54:33,550 --> 00:54:35,070
told you like this could be bigger.

1057
00:54:35,070 --> 00:54:37,290
This can be like a real thing.

1058
00:54:37,290 --> 00:54:38,400
This conference can happen.

1059
00:54:38,400 --> 00:54:40,390
People could like really love this
framework.

1060
00:54:40,390 --> 00:54:42,890
Like it was like raise the ambitions, not
just like support.

1061
00:54:42,890 --> 00:54:46,490
I think this is good, but like this can be
more than you think it could.

1062
00:54:46,490 --> 00:54:48,500
Yeah, yeah, totally agree.

1063
00:54:48,500 --> 00:54:53,130
Because at the time, like when when I was
writing Laravel, the most popular

1064
00:54:53,130 --> 00:54:57,750
framework in PHP was a framework called
Symphony and like and also code igniter.

1065
00:54:57,750 --> 00:54:59,054
And I was like Laravel will like.

1066
00:54:59,054 --> 00:55:00,814
obviously never be his biggest symphony.

1067
00:55:00,814 --> 00:55:02,294
Like that's what I was thinking in my
head.

1068
00:55:02,294 --> 00:55:03,284
And that was fine.

1069
00:55:03,284 --> 00:55:06,794
Like I was just building Laravel for
really for myself, honestly, to build my

1070
00:55:06,794 --> 00:55:07,294
own ideas.

1071
00:55:07,294 --> 00:55:09,754
But if anyone else used it, that was just
added bonus.

1072
00:55:09,754 --> 00:55:13,114
And then once it was his biggest symphony,
it was like, it'll never be as big as

1073
00:55:13,114 --> 00:55:18,594
rails, you know, like it'll never reach
that level of like market permeation.

1074
00:55:18,594 --> 00:55:22,274
And then eventually sort of basically got
to that point.

1075
00:55:22,274 --> 00:55:25,054
So I don't know, just crazy.

1076
00:55:25,054 --> 00:55:26,318
But yeah, he did.

1077
00:55:26,318 --> 00:55:30,078
kind of seemed to always believe that it
could be much bigger than I did.

1078
00:55:30,558 --> 00:55:31,258
Yeah.

1079
00:55:31,258 --> 00:55:34,518
So, yeah, I hope people sort of take that
lesson.

1080
00:55:34,798 --> 00:55:36,008
I don't think it...

1081
00:55:36,008 --> 00:55:39,198
In this case, he gave you a job, so it
literally cost him something.

1082
00:55:39,198 --> 00:55:42,678
But I think the raising someone's
ambitions and helping them believe

1083
00:55:42,678 --> 00:55:47,398
something could be bigger doesn't usually
directly cost anything, but can have huge

1084
00:55:47,398 --> 00:55:48,538
impacts.

1085
00:55:48,558 --> 00:55:49,918
Yeah.

1086
00:55:50,338 --> 00:55:54,998
So you're one of two people that I talk to
pretty regularly, the one being Adam, who

1087
00:55:54,998 --> 00:55:55,822
have...

1088
00:55:55,822 --> 00:56:03,122
taken an open source thing and then built
a pretty huge business around it, which is

1089
00:56:03,122 --> 00:56:04,012
kind of wild.

1090
00:56:04,012 --> 00:56:06,322
And it feels a little bit like the dream.

1091
00:56:06,322 --> 00:56:11,862
It's almost like the best sort of freemium
business there is, whereas like the open

1092
00:56:11,862 --> 00:56:15,322
source thing is free and then there's paid
things around it.

1093
00:56:15,602 --> 00:56:16,322
Yeah.

1094
00:56:16,962 --> 00:56:18,832
Any thoughts on like how you pulled that
off?

1095
00:56:18,832 --> 00:56:21,922
Because I know you left Ian and you were
like, you're like, all right, I'm going

1096
00:56:21,922 --> 00:56:22,990
full time on Laravel.

1097
00:56:22,990 --> 00:56:26,570
Did you have a path in front of you when
you did that and knew how you were going

1098
00:56:26,570 --> 00:56:27,530
to do it?

1099
00:56:28,210 --> 00:56:31,090
When I first wrote Laravel, no, I had no
idea.

1100
00:56:31,090 --> 00:56:33,170
And that wasn't even the intention,
honestly.

1101
00:56:33,170 --> 00:56:37,810
The goal was to write my own SaaS using
Laravel and start my own business that

1102
00:56:37,810 --> 00:56:38,370
way.

1103
00:56:38,370 --> 00:56:40,970
And Laravel kind of turned into this meta
business.

1104
00:56:41,950 --> 00:56:47,170
But when I first wrote my first commercial
product, which was Laravel Forge, which

1105
00:56:47,170 --> 00:56:50,300
was kind of this deployment tool that you
could use to deploy your Laravel apps, I

1106
00:56:50,300 --> 00:56:52,970
wrote that and launched it in 2014.

1107
00:56:53,198 --> 00:56:57,998
And even in the weeks before it launched,
I was talking to my wife and I was like,

1108
00:56:57,998 --> 00:57:02,658
if it just pays our mortgage and our
bills, that'd be awesome.

1109
00:57:02,658 --> 00:57:06,358
And we can just have that money for fun
money and whatever.

1110
00:57:06,358 --> 00:57:10,208
But within a few weeks, I was actually
making more than I was making at

1111
00:57:10,208 --> 00:57:10,758
Userscape.

1112
00:57:10,758 --> 00:57:13,418
And soon I was making double what I was
making at Userscape within a couple of

1113
00:57:13,418 --> 00:57:13,938
months.

1114
00:57:13,938 --> 00:57:17,878
And then it was like, oh boy, this is a
real business at this point.

1115
00:57:17,878 --> 00:57:22,126
And that's basically when Ian was like,
look, you can't work here and run your own

1116
00:57:22,126 --> 00:57:24,326
full business at this scale.

1117
00:57:24,326 --> 00:57:30,386
OK, so we sort of transitioned me out of
userscape at the end of 2014.

1118
00:57:30,486 --> 00:57:35,086
But I mean, it was all of it was like a
surprise to me, honestly.

1119
00:57:35,486 --> 00:57:38,786
I guess I just underestimated how many
people were going to be interested in that

1120
00:57:38,786 --> 00:57:39,746
kind of thing.

1121
00:57:39,746 --> 00:57:43,416
And then once that was out, we just kind
of kept building more commercial products

1122
00:57:43,416 --> 00:57:49,006
around Laravel and went on to launch, you
know, four or five more things.

1123
00:57:49,306 --> 00:57:52,164
Do you ever talk publicly about the
revenue of those things?

1124
00:57:52,494 --> 00:57:55,904
I think I have a few times so like a
couple years ago.

1125
00:57:55,904 --> 00:58:01,974
I think I had I did a podcast series on my
own podcast of like Building Laravel to

1126
00:58:01,974 --> 00:58:06,184
like ten million dollars in sales as like
a solo founder and that was a few years

1127
00:58:06,184 --> 00:58:10,684
ago And I mean I think all time Laravel's
an ecosystem has passed like 30 million in

1128
00:58:10,684 --> 00:58:14,504
revenue or something like that That's the
commercial products built around open

1129
00:58:14,504 --> 00:58:14,714
source.

1130
00:58:14,714 --> 00:58:16,274
Yeah, the commercial products.

1131
00:58:16,274 --> 00:58:19,164
Yeah and Across all of them.

1132
00:58:19,164 --> 00:58:22,706
So we have five forage vapor on voyeur
Nova spark

1133
00:58:22,830 --> 00:58:28,520
And all together, I think they've passed
like 30 million lifetime revenue since

1134
00:58:28,520 --> 00:58:29,690
2014.

1135
00:58:30,130 --> 00:58:33,570
So pretty crazy, honestly, for like an old
source tool.

1136
00:58:33,570 --> 00:58:38,060
And we've also done conferences, but
conferences have always been a very

1137
00:58:38,060 --> 00:58:39,300
breakeven thing for us.

1138
00:58:39,300 --> 00:58:42,930
We've never made any significant money
running events like that.

1139
00:58:42,930 --> 00:58:43,930
Yeah.

1140
00:58:43,930 --> 00:58:46,110
But it fills the excitement bucket,
though.

1141
00:58:46,110 --> 00:58:46,390
Yeah.

1142
00:58:46,390 --> 00:58:50,070
That's the only reason it exists is to
just sort of build excitement and goodwill

1143
00:58:50,070 --> 00:58:51,370
like in the community.

1144
00:58:51,370 --> 00:58:52,450
Yeah.

1145
00:58:52,590 --> 00:58:54,600
So I went to the last Lericon, it was
great.

1146
00:58:54,600 --> 00:58:56,370
And like the excitement is real.

1147
00:58:56,370 --> 00:58:59,630
And like I was talking to some tuple users
there and that like filled me up with just

1148
00:58:59,630 --> 00:59:02,810
like that's the in -person interaction
with people that you normally like only

1149
00:59:02,810 --> 00:59:05,350
talk to through the internet is like, it's
amazing.

1150
00:59:05,610 --> 00:59:09,320
Yeah, I always come away from those events
like super energized, honestly.

1151
00:59:09,320 --> 00:59:15,620
And I didn't realize how big, how much I
was missing that during the COVID years.

1152
00:59:15,620 --> 00:59:20,100
But when we did our first Lericon since
COVID, which was actually like July of

1153
00:59:20,100 --> 00:59:21,046
this year,

1154
00:59:21,310 --> 00:59:24,790
I was like, wow, I actually really miss
this a lot.

1155
00:59:25,490 --> 00:59:27,710
So I'm glad we got back on that train.

1156
00:59:27,710 --> 00:59:31,350
And I'm actually I just signed the
contract for 2024 LaraCon today.

1157
00:59:31,350 --> 00:59:34,490
So we'll be we'll be back next year as
well.

1158
00:59:34,490 --> 00:59:35,210
Cool.

1159
00:59:35,210 --> 00:59:40,750
And so it seems like it sounds like you're
spending a lot of your time focused on

1160
00:59:40,750 --> 00:59:45,630
Laravel itself and less on the commercial
products now.

1161
00:59:45,630 --> 00:59:48,582
So have you have you freed yourself up
mostly from that?

1162
00:59:49,038 --> 00:59:50,778
From a coding perspective, yes.

1163
00:59:50,778 --> 00:59:55,468
So what I do is like at the beginning of
each month, I'll write up like a pitch of

1164
00:59:55,468 --> 00:59:59,568
all the things I think we should do on the
commercial products and kind of who I

1165
00:59:59,568 --> 01:00:00,398
think should work on them.

1166
01:00:00,398 --> 01:00:03,878
But honestly, like that, even that is sort
of flexible based on what the employees

1167
01:00:03,878 --> 01:00:06,378
are feeling like and what they have an
appetite for.

1168
01:00:06,378 --> 01:00:10,638
So I'll write up the high level product
pitches and maybe a few technical details

1169
01:00:10,638 --> 01:00:12,782
of like how I think maybe it could work.

1170
01:00:12,782 --> 01:00:17,322
But then they're sort of like free to go
implement those things as they see see fit

1171
01:00:17,322 --> 01:00:20,882
I mean they know the code base is better
than I do at this point like I actually

1172
01:00:20,882 --> 01:00:25,472
wrote every commercial product at Laravel
from start to finish in terms of the 1 .0

1173
01:00:25,472 --> 01:00:32,262
version that was initially launched to
customers So I did know the code base is

1174
01:00:32,262 --> 01:00:35,432
like top to bottom at one point but over
the years I've of course forgotten them

1175
01:00:35,432 --> 01:00:40,262
and now they know more than I do so they
do that and I mainly focus on the open

1176
01:00:40,262 --> 01:00:41,112
source stuff and

1177
01:00:41,112 --> 01:00:45,802
I mean, on a day -to -day basis, I'm
almost exclusively in our open source code

1178
01:00:45,802 --> 01:00:50,482
because I think the framework is sort of
the foundation and centerpiece of the

1179
01:00:50,482 --> 01:00:51,202
whole ecosystem.

1180
01:00:51,202 --> 01:00:55,462
So I'm really focused on making sure that
stays really well maintained.

1181
01:00:55,782 --> 01:00:59,632
And then are the other Laravel core team
members paid as well?

1182
01:00:59,632 --> 01:01:01,502
Are they employees of you?

1183
01:01:01,502 --> 01:01:07,202
Yeah, so we have 10 employees and they're
all full -time paid employees.

1184
01:01:07,202 --> 01:01:10,734
And we actually have two of them that are
really

1185
01:01:10,734 --> 01:01:16,994
It's pretty exclusively open source, full
time, salaried, open source people that

1186
01:01:16,994 --> 01:01:21,434
help me triage things, help me with the
release process, because we have a lot of

1187
01:01:21,434 --> 01:01:25,614
packages these days, and we do weekly
releases, help me with that whole process.

1188
01:01:25,654 --> 01:01:27,694
Just make sure things are like running
smoothly.

1189
01:01:27,694 --> 01:01:31,474
If there's a really gnarly bug that I
don't have bandwidth to really chase down,

1190
01:01:31,474 --> 01:01:36,804
like we have a guy that's just really good
at chasing down hard to find bugs that are

1191
01:01:36,804 --> 01:01:38,354
deep into the framework.

1192
01:01:38,354 --> 01:01:39,892
So they help with that.

1193
01:01:40,130 --> 01:01:44,840
And then the other programmers are
primarily on the commercial products seems

1194
01:01:44,840 --> 01:01:52,510
like such a huge advantage if you can make
it so that your Open source project can

1195
01:01:52,510 --> 01:01:57,600
have some sort of revenue stream attached
to it That then lets you hire people to

1196
01:01:57,600 --> 01:02:00,670
work on the open source project that feeds
the paid thing.

1197
01:02:00,670 --> 01:02:06,600
Just like a beautiful flywheel Yeah, I
mean it is a huge huge advantage and I

1198
01:02:06,600 --> 01:02:07,822
think there's like

1199
01:02:07,822 --> 01:02:11,642
only a few categories of open source
project that actually lend themselves to

1200
01:02:11,642 --> 01:02:13,322
this sort of model.

1201
01:02:13,902 --> 01:02:17,882
Unfortunately, I think there's so many
important libraries out there that just

1202
01:02:17,882 --> 01:02:20,762
never seem to lend themselves to
significant revenue.

1203
01:02:22,502 --> 01:02:26,882
But frameworks are definitely one of them
where it feels like you can kind of

1204
01:02:26,882 --> 01:02:28,182
leverage this model.

1205
01:02:28,182 --> 01:02:36,482
But there are some open source packages
like you have a Excel spreadsheet

1206
01:02:36,482 --> 01:02:37,358
manipulator.

1207
01:02:37,358 --> 01:02:38,498
package on GitHub.

1208
01:02:38,498 --> 01:02:42,108
And it just never seems those kinds of
packages just never seem important as they

1209
01:02:42,108 --> 01:02:44,498
are and widely used as they may be.

1210
01:02:44,498 --> 01:02:48,168
Never seem to make any significant
revenue, you know, unfortunately through

1211
01:02:48,168 --> 01:02:49,758
like donations or whatever.

1212
01:02:49,758 --> 01:02:53,738
And people ask me all the time, like, how
did you make open source sustainable?

1213
01:02:53,738 --> 01:02:56,588
And I don't feel like I actually made open
source sustainable.

1214
01:02:56,588 --> 01:03:00,268
You know, I just built commercial products
around an open source platform.

1215
01:03:00,268 --> 01:03:04,978
And to me, that's sort of a little bit of
a different thing than actually making

1216
01:03:04,978 --> 01:03:06,730
open source sustainable.

1217
01:03:07,182 --> 01:03:08,182
Right.

1218
01:03:08,502 --> 01:03:08,962
Right.

1219
01:03:08,962 --> 01:03:10,462
It's like open source.

1220
01:03:10,462 --> 01:03:14,332
Open source became sort of lead gen for
these paid products that plugged in

1221
01:03:14,332 --> 01:03:15,222
nicely.

1222
01:03:15,262 --> 01:03:15,542
Yeah.

1223
01:03:15,542 --> 01:03:19,972
I don't know very many people at all that
just like maintain open source and make a

1224
01:03:19,972 --> 01:03:22,782
couple hundred K a year on GitHub
sponsorships.

1225
01:03:22,782 --> 01:03:25,102
That seems like incredibly rare.

1226
01:03:25,122 --> 01:03:25,442
Right.

1227
01:03:25,442 --> 01:03:25,772
Yeah.

1228
01:03:25,772 --> 01:03:26,682
Totally.

1229
01:03:26,802 --> 01:03:27,822
Yeah.

1230
01:03:28,262 --> 01:03:31,822
Well, if I ever started open source tool,
that will be my goal.

1231
01:03:31,822 --> 01:03:34,622
It's something that could get that
flywheel going.

1232
01:03:34,622 --> 01:03:35,672
Because man, what?

1233
01:03:35,672 --> 01:03:37,912
What a huge advantage to like have all the
incentives aligned.

1234
01:03:37,912 --> 01:03:41,222
Like you just like, yeah, I want to hire
more people and pay them to work on this

1235
01:03:41,222 --> 01:03:44,982
thing that we happily give away for free
because that generates new customers who

1236
01:03:44,982 --> 01:03:49,292
can new potential customers for these paid
products over here that lets us hire more

1237
01:03:49,292 --> 01:03:49,722
programmers.

1238
01:03:49,722 --> 01:03:51,242
It's just, it's, that's great.

1239
01:03:51,242 --> 01:03:51,982
Yeah.

1240
01:03:51,982 --> 01:03:52,762
Yeah.

1241
01:03:52,762 --> 01:03:53,122
Yeah.

1242
01:03:53,122 --> 01:03:54,602
It's been nice.

1243
01:03:54,662 --> 01:03:55,282
Cool, man.

1244
01:03:55,282 --> 01:03:55,902
Awesome.

1245
01:03:55,902 --> 01:03:58,362
Well, thanks for sharing all this
programming wisdom.

1246
01:03:58,362 --> 01:03:59,002
That was a great chat.

1247
01:03:59,002 --> 01:04:00,912
Yeah, that was a, yeah, it was a fun
conversation.

1248
01:04:00,912 --> 01:04:02,382
Covered a lot of ground.

1249
01:04:02,382 --> 01:04:03,082
Yeah, we did.

1250
01:04:03,082 --> 01:04:04,382
I enjoyed it.

1251
01:04:04,382 --> 01:04:04,792
Cool.

1252
01:04:04,792 --> 01:04:05,900
Well, thanks.

1253
01:04:05,902 --> 01:04:06,212
Thanks.

1254
01:04:06,212 --> 01:04:07,342
Thanks for having me.

1255
01:04:07,342 --> 01:04:08,842
Yeah, take care.