[00:00] (0.64s)
Hey everyone, this is Daniel and you're
[00:02] (2.72s)
watching a long form conversation with
[00:04] (4.88s)
Robert Martin, also known as Uncle Bob.
[00:07] (7.92s)
For those of you who don't know him,
[00:09] (9.36s)
he's a professional software engineer
[00:11] (11.44s)
for more than 50 years. And he's the
[00:13] (13.52s)
author of several programming books,
[00:15] (15.44s)
including clean code and clean
[00:17] (17.12s)
architecture that we also discuss in
[00:19] (19.36s)
this conversation. And we cover a lot.
[00:21] (21.20s)
We cover the skill and craft of
[00:23] (23.44s)
programming and how we can grow that.
[00:25] (25.28s)
The productivity of developers, advice
[00:27] (27.84s)
for newcomers in the field and stacks of
[00:29] (29.84s)
books that angle Bob can recommend.
[00:32] (32.32s)
Programming in the age of AI,
[00:33] (33.92s)
discussions on various languages
[00:35] (35.52s)
including Java, Scola, Closure, C++, and
[00:38] (38.32s)
a couple others. Type systems and
[00:40] (40.16s)
technical bits and a lot more. I've
[00:42] (42.80s)
personally left with a couple of ideas
[00:44] (44.48s)
that I've been pondering over the last
[00:45] (45.84s)
few days, and I'm probably going to
[00:47] (47.28s)
ponder for quite a few more. So, please
[00:49] (49.84s)
enjoy a wide-ranging conversation with
[00:52] (52.24s)
Uncle Bob Martin.
[00:56] (56.32s)
Robert, Uncle Bob, thank you so much for
[00:58] (58.88s)
making the time. It's a pleasure.
[01:00] (60.72s)
>> It's my pleasure.
[01:02] (62.40s)
>> I always enjoy doing these things.
[01:04] (64.72s)
>> All right. So, I want to start uh out of
[01:07] (67.52s)
all places with closure.
[01:12] (72.16s)
>> what's your relationship to closure and
[01:14] (74.88s)
uh how did it change your thinking about
[01:18] (78.96s)
Okay. Uh, let's see. Where is it? Where
[01:22] (82.24s)
is it? Uh, I got a book. Somebody gave
[01:25] (85.52s)
me a book years ago. Oh, there it is.
[01:30] (90.96s)
>> It's a big bookshelf. if I have for
[01:33] (93.84s)
>> so um years ago this like 15 maybe 20
[01:38] (98.48s)
years ago
[01:40] (100.40s)
>> somebody said I should read this book
[01:42] (102.16s)
and I went on eBay and I got a a fairly
[01:44] (104.96s)
rough beat up copy of the thing and it
[01:47] (107.84s)
sat on my desk for a couple of years and
[01:49] (109.92s)
then I one day I just picked it up and
[01:52] (112.16s)
thought you know I should read this book
[01:54] (114.72s)
and um I started throwing the pages. I
[01:59] (119.44s)
mean, it was it was one of those weird
[02:01] (121.36s)
experiences where it sucked me in and I
[02:04] (124.64s)
was I was reading code, but it was, you
[02:06] (126.80s)
know, scheme. It was list code. I'd
[02:09] (129.28s)
always had a kind of negative feeling
[02:11] (131.68s)
about lists. People had told me there
[02:13] (133.60s)
were too many parentheses.
[02:15] (135.44s)
>> So, as I started reading it, it was
[02:17] (137.20s)
like, oh, oh, oh, oh, this is really
[02:21] (141.20s)
interesting. And I'm throwing the pages
[02:23] (143.60s)
over and about um I don't know, it's
[02:26] (146.32s)
page 242
[02:28] (148.48s)
or something like that, the book comes
[02:30] (150.80s)
to this screeching halt and says, "Okay,
[02:34] (154.16s)
now we have to destroy everything we've
[02:36] (156.48s)
told you so far." And and they
[02:38] (158.64s)
introduced an assignment statement. And
[02:40] (160.56s)
I was absolutely floored by this because
[02:42] (162.72s)
I' i'd read a whole bunch of code in
[02:45] (165.20s)
this book and I had to go back and look
[02:47] (167.36s)
at it all to see that there in fact were
[02:48] (168.96s)
no assignment statements anywhere in any
[02:51] (171.04s)
of that code and I thought
[02:52] (172.96s)
>> okay this is different. This is not
[02:56] (176.32s)
something I I'm used to. The date the
[02:58] (178.72s)
year now is probably I don't know 2006
[03:02] (182.72s)
something like that.
[03:04] (184.24s)
>> So I thought okay this is something I
[03:07] (187.28s)
have to learn. I finished reading the
[03:08] (188.96s)
book, of course. I went on to find uh
[03:12] (192.00s)
some lisp engines and I just stumbled
[03:15] (195.52s)
upon closure, which was brand new at the
[03:19] (199.04s)
>> Uh and it was, you know, sits on top of
[03:20] (200.96s)
the JVM. So, it gives you all of the JVM
[03:24] (204.72s)
libraries
[03:26] (206.32s)
and all the power of the JVM, you know,
[03:28] (208.88s)
for better or for worse. Uh but you get
[03:32] (212.00s)
to write uh in in a very lispy like
[03:34] (214.80s)
language. I was also intrigued because
[03:37] (217.68s)
the author of Closure was Rich Hickey
[03:40] (220.40s)
and I knew Rich Hickey a little bit. I
[03:43] (223.04s)
had interacted with him on a number of
[03:46] (226.64s)
earlier debates about C++ and
[03:49] (229.20s)
object-oriented programming and things
[03:51] (231.04s)
like that. And I I had learned to
[03:52] (232.96s)
respect his opinion even though we
[03:54] (234.88s)
disagreed on several things.
[03:56] (236.80s)
>> Okay.
[03:57] (237.12s)
>> Uh so I thought, okay, this is a rich
[03:59] (239.04s)
hickey creation. I can buy that. It's a
[04:01] (241.44s)
lisp. It's on top of the JVM. And I
[04:03] (243.92s)
began to write code and I got a number
[04:06] (246.72s)
of the early books and I read them books
[04:08] (248.96s)
by Stu Halloway and and other folks uh
[04:12] (252.16s)
and thought you know what there's
[04:14] (254.16s)
something to this language it's it's
[04:16] (256.96s)
better than what I have been doing and I
[04:19] (259.84s)
had been writing a lot of Java at that
[04:21] (261.76s)
point you know my my career spans an
[04:24] (264.32s)
immense number of languages from
[04:26] (266.48s)
assembly language to C to C++ to Java
[04:28] (268.96s)
and a whole bunch of others.
[04:30] (270.24s)
>> Yeah. uh and I had been working in Java
[04:32] (272.96s)
at the time and and started doing a lot
[04:36] (276.24s)
of work in closure and the more work I
[04:38] (278.16s)
did the more I liked it.
[04:39] (279.92s)
>> Uh so I I have been a closure programmer
[04:43] (283.52s)
ever since that that point. Wow.
[04:46] (286.40s)
>> I can still dabble in Java. I can still
[04:49] (289.44s)
dabble in C. Every once in a while I
[04:51] (291.44s)
will write a little C program just to
[04:53] (293.12s)
make sure that I can still do it. Every
[04:55] (295.44s)
once in a while, I'll write a little
[04:56] (296.72s)
assembly language program just to make
[04:58] (298.56s)
sure I can still do it. But if I'm
[05:01] (301.12s)
writing code, I'm writing code in
[05:02] (302.48s)
closure.
[05:04] (304.72s)
That's the short version of the story.
[05:06] (306.80s)
>> Why closure? Out of all the things that
[05:09] (309.36s)
that you've touched,
[05:11] (311.68s)
what makes it so special and what makes
[05:13] (313.92s)
it your preferred choice?
[05:17] (317.84s)
>> There is a relationship between uh the
[05:22] (322.08s)
elegance of elegance, wrong word.
[05:24] (324.40s)
There's there is a relationship between
[05:26] (326.96s)
the expressiveness of a language and the
[05:30] (330.08s)
syntax of a language and that
[05:32] (332.24s)
relationship is inverse. The more
[05:34] (334.80s)
syntax, the less expressivity
[05:37] (337.28s)
expressivity. The fewer things you can
[05:39] (339.68s)
say. The more syntax and grammar there
[05:42] (342.00s)
is, the more constrained you are and
[05:44] (344.32s)
it's harder to say the things you need
[05:46] (346.40s)
to say. Closure has like all lisps
[05:50] (350.88s)
almost no syntax at all and almost no
[05:53] (353.36s)
grammar at all. It is an absurdly
[05:55] (355.36s)
trivial language which means that you
[05:58] (358.32s)
can say an immense amount of things very
[06:01] (361.68s)
easily. Now the the uh the other side of
[06:04] (364.96s)
that coin is that you can also uh bury
[06:08] (368.00s)
yourself very easily. You know the
[06:09] (369.92s)
constraints that people put into
[06:11] (371.68s)
languages are done for a reason.
[06:14] (374.08s)
>> Yep. And so Java is, you know,
[06:16] (376.40s)
statically typed language. You can't
[06:18] (378.72s)
pass the wrong argument to the wrong,
[06:21] (381.04s)
you know, you it tries to protect you.
[06:23] (383.76s)
Closure doesn't try to protect you at
[06:25] (385.52s)
all. It's just you do whatever the hell
[06:28] (388.16s)
you want to do and and you know, if it
[06:30] (390.32s)
doesn't work, well, that's on you.
[06:32] (392.48s)
>> I've been programming for over 50 years.
[06:34] (394.56s)
I'm very comfortable with that.
[06:36] (396.32s)
>> You know, I don't need a a language to
[06:39] (399.60s)
protect me from myself. I don't need
[06:41] (401.68s)
static type checking. I don't need any
[06:43] (403.60s)
of that stuff. What I'm after in a
[06:45] (405.68s)
language is to be able to say what I
[06:47] (407.60s)
want to say in as few tokens as possible
[06:50] (410.96s)
with the most expressiveness, the most
[06:53] (413.84s)
elegance. And I find that to be uh any
[06:57] (417.36s)
kind of lisp, but in particular closure.
[07:00] (420.32s)
I I think Hickey did a really
[07:02] (422.80s)
spectacular job with just the few little
[07:07] (427.76s)
gentle adornments he added on top of
[07:10] (430.88s)
closure. uh to make it a little bit
[07:13] (433.44s)
different from lisp. So I I happen to
[07:16] (436.72s)
like the way closure works. That may
[07:18] (438.72s)
just be my own bias because I've been
[07:20] (440.56s)
coding now for I don't know 15 years in
[07:23] (443.84s)
closure.
[07:24] (444.96s)
>> Wow. Uh and uh everybody thinks you're a
[07:28] (448.80s)
Java programmer after the after the um
[07:31] (451.92s)
the big popular books. Uh but I'm not
[07:34] (454.96s)
sure how many people are that. Yeah. Um
[07:39] (459.84s)
well I am a Java programmer and I I I
[07:42] (462.32s)
can code plenty of Java
[07:44] (464.64s)
you know. So, it's the expressiveness of
[07:47] (467.44s)
closure that brought that keeps you in.
[07:50] (470.00s)
Anything else? uh doesn't
[07:52] (472.32s)
>> I wanted to talk about uh static types
[07:55] (475.36s)
uh a little bit later but now that you
[07:57] (477.04s)
brought brought them up what makes you
[08:00] (480.24s)
what makes you uh comfortable with uh
[08:04] (484.56s)
writing in a in a weekly typed not
[08:07] (487.84s)
weekly a dynamically typed language
[08:13] (493.20s)
code of any reasonable complexity. I
[08:16] (496.16s)
felt that
[08:18] (498.08s)
I mean I I write Scola a lot and uh I
[08:20] (500.88s)
feel that the Scola type system is
[08:26] (506.00s)
very helpful in specifying what needs to
[08:29] (509.20s)
happen when and uh it can I mean brought
[08:33] (513.84s)
to its extreme the scholype system being
[08:36] (516.32s)
very powerful it can be extremely
[08:38] (518.32s)
constrained to the degree that you can't
[08:40] (520.40s)
really open up an HTTP server unless you
[08:42] (522.56s)
know Kisley's and monads and whatever
[08:44] (524.24s)
else Um,
[08:47] (527.04s)
right. So, I was wondering how you how
[08:49] (529.52s)
you feel and how you think about these
[08:51] (531.84s)
uh about these ideas. What makes you now
[08:54] (534.24s)
comfortable with a dynamically typed
[08:56] (536.80s)
system on code of any non-trivial
[09:00] (540.56s)
complexity?
[09:03] (543.28s)
>> Well, a lot of this has to do with my
[09:06] (546.08s)
background. Um, you know, I've been
[09:07] (547.84s)
programming for 50 some odd years. Uh,
[09:11] (551.76s)
and I started out as an assembly
[09:13] (553.52s)
language programmer, which is not a
[09:16] (556.96s)
statically typed, you know, language.
[09:20] (560.16s)
It's not a dynamically typed language
[09:22] (562.00s)
either. There's no types except for the
[09:24] (564.16s)
word. And you have to invent your own
[09:26] (566.72s)
types, you know, data structures that
[09:28] (568.80s)
that do certain things or represent
[09:31] (571.36s)
certain things. And the assembler is not
[09:33] (573.28s)
going to check a damn thing.
[09:34] (574.96s)
>> Yeah. So, so very early on I learned the
[09:39] (579.76s)
discipline of understanding what my
[09:42] (582.88s)
types are and how I had to protect them.
[09:45] (585.36s)
That was just the normal way of coding.
[09:48] (588.64s)
>> I became a C programmer in the 70s, the
[09:51] (591.84s)
later 70s.
[09:53] (593.04s)
>> Uh, and the same thing happened there.
[09:54] (594.88s)
The C was not typed at all. You you
[09:57] (597.04s)
could have types, but the compiler
[09:59] (599.12s)
didn't check a thing, right? So, you you
[10:00] (600.80s)
you could pass anything to any function
[10:02] (602.96s)
and blow the stack. And so that same
[10:05] (605.52s)
kind of discipline carried forward.
[10:08] (608.88s)
Now something weird happened around
[10:14] (614.88s)
right? And this was the the introduction
[10:18] (618.08s)
of C++. You know, Jesus Drew Drip
[10:21] (621.52s)
publishes a couple of books and one of
[10:23] (623.84s)
them looks just like KN&R
[10:26] (626.48s)
>> and all the C programmers go, "Oh, this
[10:28] (628.96s)
is going to be the new C." And so we all
[10:31] (631.20s)
get the book and we're all reading the
[10:32] (632.72s)
book and he's introducing this concept
[10:35] (635.28s)
of really good good in the in back for
[10:38] (638.88s)
those days static typing and there was
[10:41] (641.44s)
this great sigh of relief in the
[10:44] (644.64s)
industry. Oh thank god thank god now we
[10:48] (648.00s)
have a compiler that checks types
[10:49] (649.68s)
because if we didn't have that we were
[10:51] (651.28s)
all going to have to become Pascal
[10:52] (652.96s)
programmers and we didn't want to do
[10:55] (655.60s)
>> So so we adopted C++ almost on moss. I
[10:59] (659.52s)
mean the the C community moved to C++
[11:02] (662.80s)
I'd say like 80% of them and we we
[11:06] (666.24s)
adopted the static typing model and for
[11:08] (668.96s)
a while that was very comforting but
[11:12] (672.32s)
then you see what starts to happen right
[11:14] (674.56s)
you got this fairly simple static typing
[11:17] (677.12s)
model in C++ and then they want to put
[11:20] (680.16s)
in templates generics
[11:23] (683.12s)
>> and at first the generics are fine you
[11:24] (684.96s)
know little angle brackets who cares and
[11:27] (687.20s)
okay yeah that's pretty useful I create
[11:29] (689.36s)
a list of integers. I can create a list
[11:31] (691.60s)
of doubles, you know. Oh, that's really
[11:34] (694.24s)
nice. And then they want to add more to
[11:38] (698.08s)
it so that you can do other things,
[11:41] (701.84s)
co-variance and contravariance and and
[11:44] (704.80s)
then they start to add even more things
[11:47] (707.20s)
to it and the generic thing goes crazy.
[11:50] (710.88s)
>> Yeah. You can then write entire games
[11:52] (712.88s)
just in just in types then,
[11:54] (714.96s)
>> right? The generic language becomes
[11:56] (716.88s)
touring complete. Okay, bam. You're at
[12:00] (720.16s)
that point, the language is dead. Uh,
[12:02] (722.32s)
and I left the language screaming in
[12:04] (724.48s)
horror. I thought, okay, these guys are
[12:06] (726.88s)
way off the rails. I'm not I'm not
[12:09] (729.12s)
dealing with C++ anymore. And I I became
[12:11] (731.76s)
a Java programmer. Well, then the same
[12:14] (734.24s)
thing happens in Java, right? Java's
[12:16] (736.80s)
nice type type system, pretty easy. Then
[12:19] (739.60s)
they put some generics in. They're
[12:21] (741.60s)
simple generics, little angle brackets,
[12:23] (743.68s)
no big deal. Okay? And then they start
[12:25] (745.84s)
putting in the question marks and the
[12:28] (748.00s)
funny little things and the whole thing
[12:30] (750.00s)
just goes crazy and it's like, okay, I
[12:33] (753.68s)
got to get out of this Java language cuz
[12:35] (755.36s)
they're going to take it off the rails,
[12:36] (756.96s)
which I believe they have. Java's way
[12:40] (760.48s)
the heck out there now. They do some
[12:43] (763.12s)
goofball things. They tried to get, you
[12:45] (765.60s)
know, closures in there. They tried to
[12:47] (767.84s)
get all kinds of gunk in there. And and
[12:50] (770.16s)
at some point, you just have to say,
[12:52] (772.00s)
"Okay, guys, you go. you run with it,
[12:54] (774.64s)
but I've got real work to do. I'm going
[12:56] (776.56s)
to work in a language that lets me do
[12:58] (778.24s)
real work. And so when I adopted
[13:00] (780.96s)
closure, which was like 15 years ago or
[13:04] (784.48s)
something like that, the lack of strong
[13:08] (788.08s)
typing, the lack of static typing,
[13:10] (790.32s)
didn't bother me. It's like, oh, okay, I
[13:12] (792.80s)
remember this. I remember what this was
[13:14] (794.56s)
like, and I just fell back on my old
[13:17] (797.68s)
disciplines, and that was fine. Although
[13:20] (800.48s)
there was a new discipline that I had
[13:22] (802.96s)
added to that list which was test-driven
[13:24] (804.96s)
development.
[13:25] (805.76s)
>> Yeah,
[13:26] (806.32s)
>> I started becoming a test-driven
[13:27] (807.92s)
developer like 25 years ago. Started
[13:30] (810.96s)
writing unit tests in earnest, right?
[13:33] (813.36s)
You know, disciplined writing of unit
[13:36] (816.08s)
tests before I write the code. I
[13:38] (818.24s)
followed Kent Beck's rules.
[13:40] (820.40s)
>> Mhm.
[13:41] (821.04s)
>> And uh once I went back into closure,
[13:44] (824.88s)
I didn't abandon that. I just kept on
[13:47] (827.12s)
writing unit tests. And those unit tests
[13:50] (830.08s)
were a big help for typeecking, right? I
[13:53] (833.52s)
could make sure that all of the all of
[13:55] (835.28s)
the data structures that I was passing
[13:57] (837.04s)
around were the right kinds of data
[13:59] (839.12s)
structures and I was very pleased with
[14:01] (841.28s)
that. So that's that's where it was
[14:03] (843.84s)
maybe 15 years ago. Then in the last
[14:06] (846.64s)
five, six yearsish,
[14:09] (849.68s)
the closure community introduced a
[14:12] (852.00s)
library which they call spec spec alpha
[14:15] (855.68s)
I think they call it. uh and it's very
[14:18] (858.00s)
tentative and everybody's wondering if
[14:19] (859.76s)
it's going to survive in that form or
[14:21] (861.60s)
not. Maybe it will, maybe it won't.
[14:23] (863.68s)
>> But it's a a very interesting library
[14:26] (866.00s)
that allows you to check types
[14:29] (869.28s)
dynamically but with an awful lot of
[14:32] (872.16s)
discipline. So if I feel the need to to
[14:37] (877.20s)
really anchor a type, I can do that. I
[14:40] (880.72s)
can write a library. I can make sure
[14:43] (883.04s)
that that library is called by my unit
[14:45] (885.28s)
tests to make sure that all the types
[14:47] (887.84s)
remain remain intact. I can even put the
[14:51] (891.28s)
uh the checks in the main loop of the
[14:53] (893.68s)
program so that you know maybe every
[14:55] (895.60s)
hundred times around the main loop I
[14:57] (897.20s)
just throw a a type check for the whole
[14:59] (899.36s)
big uh bunch of in-memory data just to
[15:04] (904.96s)
>> if anything's gone wrong. And that's
[15:06] (906.96s)
good for, you know, alpha testing and
[15:08] (908.80s)
beta testing and before you get into
[15:10] (910.96s)
production. Uh once in production, I rip
[15:13] (913.52s)
all that stuff out. But that's been
[15:15] (915.76s)
great for me. I it's it's better, I
[15:19] (919.60s)
think, than static typing because I'm
[15:22] (922.88s)
not constrained by anything I don't want
[15:26] (926.24s)
to be constrained by.
[15:27] (927.84s)
>> But then you get the guarantees. I get
[15:29] (929.84s)
all the guarantees I need dynamically
[15:31] (931.84s)
but I have unit tests
[15:34] (934.24s)
and I if I need to soften a guarantee I
[15:37] (937.36s)
can I can say well in this case this
[15:40] (940.24s)
type does not need to conform perfectly
[15:42] (942.80s)
right but in these cases it must I have
[15:45] (945.04s)
all that power uh which is the power
[15:47] (947.52s)
that a static typing system cannot give
[15:49] (949.68s)
you so I'm I'm very happy with that
[15:52] (952.24s)
>> that's very interesting u I mean reading
[15:55] (955.36s)
your material I I I
[15:58] (958.08s)
would have guessed like 95% you're
[15:59] (959.92s)
you're an advocate of full static
[16:02] (962.40s)
typing, but now that now that you're
[16:04] (964.56s)
describing uh your relationships to uh
[16:08] (968.00s)
testing and closure, it feels like
[16:10] (970.00s)
you're like 20% of the static typing,
[16:12] (972.48s)
but with the 98% of the guarantees of
[16:16] (976.48s)
that the stat static typing can give you
[16:18] (978.72s)
and uh with the flexibility that allows
[16:21] (981.44s)
you to then shape that at will.
[16:26] (986.32s)
>> I think that's that's a fair way to put
[16:27] (987.84s)
that. Yeah, I mean I I've been
[16:30] (990.32s)
programming for too long to um to not
[16:33] (993.68s)
want the flexibility.
[16:36] (996.96s)
>> That's very interesting.
[16:37] (997.76s)
>> Rail against the constraints, but I will
[16:40] (1000.56s)
put my own constraints up.
[16:42] (1002.24s)
>> Yeah, that's that's so interesting
[16:44] (1004.56s)
because um uh the way that I that I
[16:47] (1007.12s)
generally thought about uh about static
[16:49] (1009.28s)
typing was that they make explicit what
[16:52] (1012.80s)
otherwise is in your head. So if you
[16:55] (1015.04s)
don't have like a full static types, you
[16:58] (1018.48s)
kind of have to know while reading your
[17:00] (1020.00s)
your program how your data structures
[17:02] (1022.08s)
need to look like and what is consistent
[17:04] (1024.48s)
with what so that you can guarantee the
[17:07] (1027.20s)
correctness of your code. So in other
[17:09] (1029.44s)
words, if you don't have the types
[17:11] (1031.04s)
explicitly mentioned by or enforced by
[17:14] (1034.16s)
something like a type checker or the
[17:16] (1036.00s)
compiler, you have to kind of hold them
[17:18] (1038.08s)
in your head. But that I understand now
[17:21] (1041.12s)
that it's a false dichotomy because you
[17:25] (1045.68s)
can enforce the types in something like
[17:28] (1048.00s)
what you're doing but then not be
[17:31] (1051.76s)
constrained by
[17:34] (1054.96s)
um the um the rigidity of
[17:40] (1060.08s)
uh a type checker. Am I getting this
[17:42] (1062.00s)
right?
[17:42] (1062.56s)
>> I think you're getting that just right.
[17:45] (1065.12s)
>> Got it. There's a great deal of comfort
[17:48] (1068.40s)
especially for younger programmers I
[17:50] (1070.64s)
think uh in having the compiler do all
[17:53] (1073.52s)
this checking for you right um now I you
[17:57] (1077.92s)
know I I adopted C++
[18:00] (1080.48s)
in the 80s in the late 80s and I felt
[18:03] (1083.28s)
that comfort I thought oh good thank
[18:05] (1085.04s)
goodness now we've got static typing I
[18:07] (1087.20s)
don't have to worry about passing an int
[18:08] (1088.96s)
where a double is necessary and I can I
[18:11] (1091.28s)
can actually you know have the compiler
[18:13] (1093.36s)
check this for me and then as the years
[18:15] (1095.68s)
went by, my um my enthusiasm for that
[18:20] (1100.16s)
began to wayne because okay, yes, it
[18:23] (1103.92s)
does check a few things, but not nearly
[18:26] (1106.80s)
enough.
[18:27] (1107.68s)
>> Mhm.
[18:28] (1108.64s)
>> I mean, we still had, you know, plenty
[18:31] (1111.20s)
of null pointer exceptions, plenty of
[18:33] (1113.52s)
segmentation faults, plenty of all of
[18:36] (1116.16s)
the old horrors that we had with C. The
[18:39] (1119.52s)
static type checker might have saved a
[18:41] (1121.76s)
few of a few things, but it didn't stop
[18:45] (1125.84s)
the neverending patter of bugs.
[18:50] (1130.48s)
And what I found that did was unit
[18:54] (1134.24s)
testing that and stop is the wrong word.
[18:57] (1137.84s)
uh greatly attenuate. If you're writing
[19:01] (1141.04s)
a stream of unit tests and if you're
[19:02] (1142.88s)
disciplined about it, you will greatly
[19:05] (1145.36s)
diminish the number of these kind of
[19:08] (1148.00s)
weirdo bugs that occur, the segmentation
[19:10] (1150.48s)
faults and the no pointer exceptions and
[19:12] (1152.80s)
weirdo gunk that happens. You will get
[19:14] (1154.80s)
that under control much more quickly.
[19:18] (1158.24s)
And it was right in that time frame
[19:20] (1160.16s)
where I was writing a lot of unit tests
[19:21] (1161.84s)
and I was doing it in Java and I
[19:24] (1164.08s)
thought, wait a minute, why do I need
[19:26] (1166.24s)
this static type checking if I'm doing
[19:29] (1169.52s)
all these unit tests that are checking
[19:31] (1171.68s)
my types dynamically and I don't run my
[19:34] (1174.96s)
application until all the unit tests
[19:36] (1176.64s)
pass. And bit by bit I thought you know
[19:40] (1180.08s)
I should investigate other languages
[19:41] (1181.92s)
like Ruby. So, Ruby came along right
[19:44] (1184.24s)
about that time and I thought this
[19:47] (1187.12s)
language Ruby, I think I'm going to be a
[19:49] (1189.44s)
Ruby programmer. And for about two or
[19:51] (1191.52s)
three years, I didd around with Ruby on
[19:53] (1193.76s)
Rails and fiddled and I really enjoyed
[19:57] (1197.12s)
the freedom of the uh the uh the type
[20:00] (1200.40s)
system because it's dynamically typed.
[20:03] (1203.36s)
And then then I stumbled onto Closure
[20:05] (1205.52s)
and that just changed everything, right?
[20:07] (1207.12s)
that changed everything because it was a
[20:08] (1208.80s)
functional language and because it was
[20:10] (1210.96s)
dynamically typed and it was just so
[20:12] (1212.80s)
damn trivial. The syntax was just so tur
[20:16] (1216.64s)
and I thought yeah this is where I need
[20:18] (1218.56s)
to be.
[20:19] (1219.36s)
>> That's very interesting. Um
[20:22] (1222.32s)
how would how do you balance this idea
[20:24] (1224.48s)
of enforcing your discipline with unit
[20:27] (1227.76s)
tests and with libraries that kind of
[20:30] (1230.96s)
make sure that your data structures
[20:32] (1232.72s)
conform to the patterns that you want?
[20:35] (1235.28s)
How do you balance that with the uh
[20:40] (1240.56s)
I mean a critic of that would say that
[20:42] (1242.40s)
there's a lack of productivity because
[20:43] (1243.84s)
you have to write unit tests over unit
[20:46] (1246.00s)
tests and have all sorts of libraries to
[20:47] (1247.84s)
enforce your your stuff especially in
[20:50] (1250.24s)
critical paths of your code which may
[20:52] (1252.88s)
lower the the throughput of your
[20:55] (1255.60s)
thinking. Whereas a a compiler with a uh
[21:00] (1260.24s)
static type system would naturally
[21:02] (1262.32s)
enforce that and you would just focus on
[21:04] (1264.48s)
the business logic and the compiler
[21:05] (1265.92s)
would enforce um I mean for for example
[21:09] (1269.52s)
in languages with explicit nulls it
[21:12] (1272.32s)
would just not compile if you don't
[21:15] (1275.04s)
check for nulls with any sort of flow
[21:17] (1277.28s)
typing. How do you how do you balance
[21:19] (1279.04s)
this out?
[21:21] (1281.28s)
I learned a very long time ago um
[21:25] (1285.60s)
that the thing that slows me down the
[21:28] (1288.16s)
most is debugging.
[21:31] (1291.76s)
If I, you know, I'm debugging something,
[21:34] (1294.24s)
it could go on for a minute, it could go
[21:36] (1296.16s)
on for two weeks.
[21:37] (1297.76s)
>> Yeah,
[21:38] (1298.00s)
>> I've had those cases where it's two
[21:39] (1299.68s)
weeks long. In one case, my the CEO of
[21:43] (1303.28s)
the company, uh there was a bug. It was
[21:45] (1305.60s)
just one of those weird bugs and it
[21:47] (1307.44s)
happened like every other week. uh and
[21:50] (1310.48s)
it was in the field and there was a
[21:52] (1312.08s)
customer who was going to cancel and it
[21:53] (1313.92s)
was just a nasty situation and and the
[21:56] (1316.64s)
CEO said, "Bob, when that bug occurs,
[21:58] (1318.72s)
the next time that bug occurs in the
[22:00] (1320.24s)
field, they're going to call us. You're
[22:01] (1321.60s)
going to get on a chartered jet. You're
[22:03] (1323.20s)
going to go out there. You will be there
[22:04] (1324.64s)
in a couple of hours and you will debug
[22:06] (1326.24s)
that thing." Fortunately, I found the
[22:08] (1328.40s)
bug before I had to get on that on that
[22:10] (1330.56s)
jet. But it was one of those, you know,
[22:12] (1332.72s)
hair tearing kind of bugs. I learn I
[22:15] (1335.52s)
learned a long time ago that debugging
[22:17] (1337.44s)
is the bane of productivity. Anything I
[22:20] (1340.16s)
can do to stop myself from debugging is
[22:23] (1343.12s)
going to make me much more productive.
[22:25] (1345.68s)
>> And static typing
[22:29] (1349.20s)
did not help me with that.
[22:31] (1351.04s)
>> That's very interesting. Can you tell me
[22:32] (1352.40s)
more about that? because I I found I
[22:34] (1354.72s)
found as a scholar developer that I've I
[22:37] (1357.44s)
haven't used a debugger in like two
[22:40] (1360.24s)
>> because because everything is just out
[22:44] (1364.40s)
there for me. Uh I mean I happen to to
[22:47] (1367.92s)
know very well the libraries and tools
[22:49] (1369.52s)
that I'm using. So I know my stuff.
[22:51] (1371.60s)
There's nothing that I need to um to
[22:54] (1374.40s)
concern myself with. Um but I'm curious
[22:57] (1377.12s)
to hear your take on it.
[22:59] (1379.28s)
Well, my take comes from the uh the time
[23:02] (1382.40s)
period where C++ was the statically
[23:04] (1384.80s)
typed language I was using. And one of
[23:07] (1387.84s)
the things that I found was that there
[23:10] (1390.32s)
there is a typing there are typing bugs.
[23:14] (1394.56s)
>> You write your code and it won't
[23:16] (1396.08s)
compile. And then you have to debug why
[23:18] (1398.32s)
it won't compile.
[23:19] (1399.84s)
>> And sometimes that's easy. Oh, I missed
[23:21] (1401.92s)
a type here. Sometimes it's not so easy.
[23:24] (1404.40s)
Sometimes you have to do funny little
[23:26] (1406.32s)
workarounds or change the types in
[23:28] (1408.48s)
strange ways or or fiddle around and and
[23:31] (1411.60s)
I found that I was spending a lot of
[23:33] (1413.44s)
time debugging the type system because
[23:36] (1416.96s)
the type system was so constraining and
[23:39] (1419.60s)
and of course everybody's solution to
[23:41] (1421.36s)
that is you know well just cast it just
[23:43] (1423.76s)
do a cast you know cast it from one type
[23:45] (1425.76s)
to the next or do a dynamic cast or or
[23:48] (1428.96s)
you know what you could always you could
[23:50] (1430.48s)
always move it over to a void pointer
[23:52] (1432.24s)
and then recast it. There's all these
[23:54] (1434.48s)
>> horrible tricks that you can do that are
[23:56] (1436.56s)
very tempting
[23:58] (1438.08s)
>> when you're when you're battling a
[24:00] (1440.40s)
typing error.
[24:02] (1442.48s)
>> Now, on the on the one side of the
[24:04] (1444.24s)
argument, it's well, your code isn't
[24:06] (1446.48s)
correct, so you've got to correct it and
[24:08] (1448.56s)
get the typing right. Okay, but that's
[24:11] (1451.92s)
no different from saying I have to get
[24:13] (1453.44s)
the program correct when it executes,
[24:15] (1455.44s)
right? It's still debugging. And
[24:18] (1458.08s)
anything I can do to shorten that debug
[24:20] (1460.32s)
time to get rid of the debugging issues
[24:23] (1463.36s)
will make me go faster. So every unit
[24:25] (1465.84s)
test I write makes me go faster. Every
[24:28] (1468.56s)
time I I specify a dynamic type
[24:31] (1471.20s)
constraint, that makes me go faster
[24:33] (1473.44s)
because it eliminates another one of
[24:35] (1475.44s)
those debugging rat holes that I'm going
[24:37] (1477.60s)
to go down if I don't do that. So that's
[24:40] (1480.16s)
that's kind of my philosophy.
[24:42] (1482.16s)
>> Avoid any kind of debugging rat hole.
[24:46] (1486.40s)
the the way that I mean the reason I'm
[24:48] (1488.40s)
asking and uh the reason why I'm double
[24:50] (1490.72s)
clicking on stat static typing for so
[24:52] (1492.40s)
long is because uh for the longest time
[24:55] (1495.44s)
I felt that a uh a static type system is
[25:00] (1500.88s)
uh a great solution to the problem of
[25:04] (1504.24s)
how do you prove that your code is going
[25:06] (1506.16s)
to be correct other than just by running
[25:08] (1508.88s)
it. I feel that uh after so many decades
[25:12] (1512.00s)
of programming
[25:13] (1513.76s)
uh we are still not in the place where
[25:16] (1516.24s)
we can say okay I've wrote I've written
[25:18] (1518.08s)
a program I want something to tell me if
[25:19] (1519.76s)
this thing is correct uh without me
[25:22] (1522.48s)
actually putting this into production or
[25:24] (1524.32s)
running this um and if it feels like um
[25:29] (1529.28s)
a moral failure of the the entire field
[25:32] (1532.00s)
of the industry that in at least in some
[25:35] (1535.92s)
places the only way that you can prove
[25:38] (1538.40s)
whether program is correct is to run it
[25:40] (1540.96s)
and it there has to be a better
[25:43] (1543.36s)
solution. This is why I'm I'm asking
[25:44] (1544.96s)
this for I'm I'm uh digging into this
[25:47] (1547.92s)
subject.
[25:48] (1548.48s)
>> So you have you have fallen into the
[25:50] (1550.72s)
Dystra trap.
[25:53] (1553.20s)
>> Tell me about it and tell everybody
[25:55] (1555.04s)
about it.
[25:56] (1556.08s)
>> Huh? I'm sorry.
[25:57] (1557.20s)
>> Tell everybody about it.
[25:58] (1558.24s)
>> Oh, so Edgar Dystra, this goes way the
[26:00] (1560.96s)
heck back in time in the late 1940s, the
[26:03] (1563.44s)
early 1950s. uh Edgar Dystra young man
[26:07] (1567.84s)
uh was wanted to be a theoretical
[26:09] (1569.28s)
physicist but he saw a computer
[26:12] (1572.96s)
>> and it was a computer that didn't even
[26:16] (1576.48s)
but but he really liked the idea and he
[26:19] (1579.60s)
got hired as a programmer and he helped
[26:23] (1583.12s)
them um first of all he helped them get
[26:25] (1585.20s)
the hardware working and then he also
[26:27] (1587.28s)
started writing code in an extremely
[26:29] (1589.60s)
primitive machine.
[26:31] (1591.12s)
>> Mhm. And he encountered all of these
[26:33] (1593.68s)
debugging issues. He encountered the
[26:35] (1595.84s)
difficulty of expressing code in these
[26:38] (1598.56s)
very primitive machines. And he said
[26:40] (1600.56s)
exactly what you just said. He said what
[26:43] (1603.20s)
we need is a mathematical structure
[26:46] (1606.64s)
where you can prove software correct.
[26:49] (1609.92s)
And he railed against tests. He said
[26:51] (1611.84s)
tests do not prove software correct. All
[26:54] (1614.96s)
a test can show you is the existence of
[26:57] (1617.04s)
bugs. It cannot show you the absence.
[26:59] (1619.76s)
what we need to do is prove things
[27:02] (1622.88s)
correct. And he worked on this for a
[27:05] (1625.52s)
very long time. And I won't bore you
[27:07] (1627.52s)
with all of the details, but in the end,
[27:09] (1629.36s)
he completely failed.
[27:12] (1632.64s)
>> I mean, it's a testament to I mean, the
[27:14] (1634.96s)
current state of programming uh world is
[27:18] (1638.08s)
a testament to that.
[27:20] (1640.08s)
>> Yeah. Well,
[27:24] (1644.32s)
software, we we want software to be a
[27:27] (1647.12s)
mathematics. We want software to be
[27:29] (1649.84s)
provable. That's what we want. You know,
[27:31] (1651.52s)
we Oh, we we should have a a hierarchy
[27:34] (1654.24s)
of theorems. That's what Dyster wanted.
[27:36] (1656.72s)
A hierarchy of thems. And programmers
[27:39] (1659.44s)
should not be writing code from scratch.
[27:42] (1662.00s)
They should be taking the theorems that
[27:44] (1664.24s)
already exist and adding a few little
[27:47] (1667.20s)
lemas to them like a mathematician would
[27:49] (1669.60s)
do, right? You take what already exists,
[27:52] (1672.08s)
the superructure of theorems, and then
[27:54] (1674.32s)
you add a few little things to prove
[27:56] (1676.32s)
some little thing down here. That's what
[27:59] (1679.60s)
Dyster wanted to create. And he he
[28:01] (1681.84s)
failed at that. He could not create
[28:03] (1683.36s)
that. He he went through the effort of
[28:05] (1685.84s)
trying to prove software correct and
[28:08] (1688.48s)
found that the effort was greater than
[28:10] (1690.40s)
the effort to write the software and
[28:12] (1692.40s)
test it. It's an enormous amount of
[28:15] (1695.04s)
effort.
[28:16] (1696.64s)
Software in conclusion. My conclusion,
[28:18] (1698.96s)
this is my conclusion. Software is not a
[28:21] (1701.52s)
mathematics. It can't be a mathematics,
[28:24] (1704.16s)
right? It is instead a science.
[28:27] (1707.28s)
Mathematics is a positive discipline.
[28:30] (1710.08s)
You prove things correct. Science is a
[28:33] (1713.36s)
negative discipline. You prove things
[28:35] (1715.68s)
incorrect.
[28:36] (1716.88s)
>> Yeah.
[28:37] (1717.36s)
>> That's what you validate the theories,
[28:39] (1719.36s)
right?
[28:40] (1720.00s)
>> That's all you can do in science.
[28:41] (1721.76s)
Nothing has ever been proven in science
[28:45] (1725.12s)
>> except what isn't true.
[28:47] (1727.04s)
>> Yeah. We can prove the things that
[28:48] (1728.80s)
aren't true, but we cannot prove the
[28:50] (1730.72s)
things that are. Truth will always be
[28:53] (1733.20s)
hidden from us in a science, right? We
[28:56] (1736.24s)
might narrow in on it,
[28:57] (1737.76s)
>> but we will never get there. That's
[28:59] (1739.36s)
what's interesting about science. And
[29:01] (1741.52s)
that's what's interesting about software
[29:03] (1743.84s)
at at some level.
[29:06] (1746.88s)
We h we all have to admit that yes,
[29:10] (1750.56s)
software could be a mathematics. It is a
[29:14] (1754.16s)
structured logic. You could prove things
[29:17] (1757.76s)
correct, but from a practical point of
[29:20] (1760.64s)
view, that's outside of our reach. And
[29:23] (1763.28s)
we have to treat it like a science. We
[29:25] (1765.68s)
test it to see if it's correct. We run
[29:28] (1768.56s)
experiments to see if it's correct. We
[29:30] (1770.96s)
treat it like a science and respect it
[29:33] (1773.76s)
in the same way. The respect a scientist
[29:37] (1777.52s)
has for a theory is skepticism.
[29:40] (1780.88s)
>> Right. Yeah.
[29:41] (1781.68s)
>> You don't you never buy a theory, right?
[29:43] (1783.60s)
It's like okay, you know, F equals MA.
[29:46] (1786.64s)
Well, yeah, but uh not in every in not
[29:50] (1790.08s)
in every circumstance. Scientists are
[29:52] (1792.56s)
always skeptical. Mathematicians
[29:55] (1795.36s)
are not.
[29:56] (1796.64s)
>> Mhm.
[29:57] (1797.04s)
>> Mathematicians prove things. So they
[29:59] (1799.92s)
know. Scientists never know. And
[30:03] (1803.60s)
programmers never know.
[30:06] (1806.72s)
>> Yep. That's what we know.
[30:10] (1810.16s)
That's what experience teaches us. Um I
[30:12] (1812.88s)
was curious how you maintain the the
[30:14] (1814.88s)
discipline that you uh that you were
[30:17] (1817.12s)
mentioning earlier. You said that you
[30:19] (1819.04s)
are still writing assembly code and C
[30:21] (1821.20s)
code just to just to make sure that you
[30:23] (1823.44s)
that you can still do it. How does that
[30:25] (1825.76s)
help you with um the discipline that
[30:28] (1828.88s)
then informs the rest of your code?
[30:36] (1836.48s)
>> I don't know that it does. Um,
[30:41] (1841.52s)
it's more like
[30:45] (1845.60s)
I'm trying to come up with a good
[30:46] (1846.80s)
analogy. Uh, it's more like a a guy who
[30:50] (1850.24s)
runs a contracting business, right? And
[30:52] (1852.80s)
he's got a hundred guys working for him
[30:55] (1855.04s)
and he's he's out there making deals
[30:56] (1856.96s)
with clients and but he used to swing a
[30:59] (1859.60s)
hammer.
[31:01] (1861.04s)
>> He built that business from the ground
[31:02] (1862.72s)
up, right? And every once in a while
[31:05] (1865.68s)
that guy who sits in an office somewhere
[31:07] (1867.76s)
and he's on the phone all the time
[31:09] (1869.20s)
making deals, every once in a while he
[31:11] (1871.68s)
picks up a hammer and hammers in a nail
[31:14] (1874.32s)
just to remind himself of his roots. And
[31:17] (1877.36s)
I think that's what it is for me. You
[31:19] (1879.28s)
know, every once in a while I'll just
[31:21] (1881.52s)
pop open a little little thing. I'll
[31:23] (1883.68s)
write a little bit of assembly language
[31:25] (1885.28s)
just to remember the distance that I
[31:28] (1888.56s)
have traveled because I'll tell you one
[31:30] (1890.80s)
thing, it's a hell of a distance.
[31:32] (1892.72s)
>> Yeah. I mean, it's a it's a it's an
[31:36] (1896.96s)
impressive career by every stretch of
[31:39] (1899.28s)
the imagination. And uh
[31:40] (1900.88s)
>> Oh, I'm just talking about the distance
[31:42] (1902.32s)
of the of of what programming was like
[31:45] (1905.20s)
in the in the late60s and what
[31:49] (1909.12s)
you've been part of that you've been
[31:50] (1910.32s)
part of that journey.
[31:51] (1911.60s)
>> Yeah. I lived I lived most of that
[31:53] (1913.60s)
journey like you know I did a fair bit
[31:55] (1915.60s)
of writing of code in punch cards.
[31:58] (1918.40s)
>> Yeah.
[31:59] (1919.04s)
>> And paper tape. uh you know
[32:04] (1924.80s)
>> do you have any any similar advice for
[32:07] (1927.92s)
programmers of this day and age to keep
[32:11] (1931.60s)
well grounded as to keep themselves well
[32:14] (1934.48s)
grounded as programmers? Do you do you
[32:17] (1937.84s)
would you suggest a new programmer learn
[32:20] (1940.64s)
one of the oldish
[32:23] (1943.84s)
languages or thinking uh just u
[32:29] (1949.36s)
keep in their head the fact that they
[32:31] (1951.44s)
are programmers
[32:35] (1955.04s)
machines and not
[32:37] (1957.92s)
just thinking uh just building uh mental
[32:43] (1963.20s)
house of houses of cards. Am I making
[32:45] (1965.60s)
this sense with this question?
[32:46] (1966.72s)
>> No, you're making that perfectly clear.
[32:48] (1968.24s)
And and it's one of the things I tell
[32:50] (1970.16s)
students in virtually every class I
[32:52] (1972.96s)
teach is that at some point you should
[32:57] (1977.52s)
break open a little assembly language
[32:59] (1979.44s)
thing. Find something on the internet
[33:01] (1981.20s)
that'll let you write some code for a
[33:04] (1984.32s)
6502 or an 8080 or something like that.
[33:07] (1987.28s)
Some old machine that was that was
[33:09] (1989.12s)
popular back in the 70s or 80s and spend
[33:12] (1992.16s)
a glorious weekend. You'll have to get
[33:14] (1994.80s)
rid of all your family cuz it's a very
[33:17] (1997.20s)
deep dive. uh but spend a glorious
[33:19] (1999.68s)
weekend just trying to get anything at
[33:21] (2001.60s)
all done in an assembly language just so
[33:24] (2004.72s)
that you know what the roots are just so
[33:26] (2006.88s)
that you understand what these machines
[33:29] (2009.04s)
are. The machines themselves, although
[33:31] (2011.76s)
they've gotten much faster and their bit
[33:34] (2014.80s)
channels are wider, you know, 64-bit
[33:37] (2017.20s)
machines and and they've got some
[33:39] (2019.52s)
interesting instructions, they are still
[33:42] (2022.80s)
van architecture computers. The
[33:45] (2025.60s)
architecture hasn't changed much. These
[33:48] (2028.24s)
are still
[33:50] (2030.16s)
single instruction executing machines
[33:52] (2032.96s)
that work the same way that those old
[33:55] (2035.76s)
machines work. And it's important for us
[33:58] (2038.40s)
to understand that as programmers to
[34:01] (2041.04s)
know, you know, what the roots of our of
[34:04] (2044.08s)
our profession are. I wrote this whole
[34:06] (2046.00s)
book about this. Where's that book?
[34:10] (2050.16s)
Oh yes, here it is. Yeah,
[34:12] (2052.88s)
we programmers. I just wrote this couple
[34:15] (2055.36s)
about a year and a half, two years ago.
[34:17] (2057.36s)
Uh, and this is the story of Charles
[34:21] (2061.68s)
Babage, Grace Hopper, Edgar Dystra,
[34:26] (2066.16s)
um, the guys who made C, Kernan, and
[34:29] (2069.04s)
Richie and and, uh, Thompson, uh, and a
[34:33] (2073.28s)
bunch of other people
[34:34] (2074.64s)
>> and and I go into a very deep technical
[34:37] (2077.52s)
dive. This is a book written for
[34:39] (2079.44s)
programmers. So, you want to know what
[34:41] (2081.04s)
kind of machine those guys were using? I
[34:42] (2082.88s)
go into, you know, what the instruction
[34:44] (2084.32s)
sets were and the architectures of the
[34:46] (2086.24s)
machine and how they had to write the
[34:48] (2088.80s)
code and what form that code was in. So,
[34:51] (2091.36s)
this is a very technical book, but it's
[34:53] (2093.28s)
also a very personal book
[34:55] (2095.20s)
>> because you get to know these people a
[34:57] (2097.68s)
little bit and their goals and
[34:59] (2099.76s)
aspirations and their failings.
[35:03] (2103.92s)
It's a a fascinating story and this is
[35:06] (2106.64s)
this is something that I think younger
[35:09] (2109.52s)
programmers should know.
[35:12] (2112.24s)
We are in the midst of facing down a an
[35:15] (2115.84s)
interesting demon and it's the AI demon.
[35:19] (2119.20s)
Now, there's nothing wrong with that.
[35:21] (2121.04s)
But AI is great.
[35:22] (2122.08s)
>> Now that you brought it up, let's let's
[35:25] (2125.04s)
>> Well, AI is great. I love it. I, you
[35:26] (2126.96s)
know, I've got co-pilot attached to my
[35:28] (2128.64s)
IDE and it throws up little suggestions
[35:31] (2131.44s)
to me all the time, most of which I
[35:33] (2133.12s)
ignore, but some of them are useful,
[35:34] (2134.56s)
right? So, it's it's a productivity
[35:37] (2137.04s)
tool. Helps, great. I love it. Um, but
[35:40] (2140.56s)
there is a risk. The demon here is the
[35:43] (2143.84s)
is the idea that you will trust it
[35:47] (2147.44s)
beyond its means.
[35:50] (2150.08s)
Now, I'm also a pilot, right? I fly I
[35:52] (2152.48s)
fly a little little airplane around just
[35:54] (2154.48s)
for fun nowadays. Used to do it for
[35:56] (2156.24s)
business, now it's just for fun. Uh, and
[36:00] (2160.16s)
airplanes got a good good autopilot.
[36:02] (2162.24s)
Real good autopilot, right? So, uh, I
[36:05] (2165.12s)
don't trust it.
[36:09] (2169.04s)
You know, I'm watching it like a hawk
[36:10] (2170.64s)
all the time. I check all the time. Are
[36:12] (2172.40s)
you right? Are you still in the right
[36:13] (2173.60s)
mode? Are you still doing the right
[36:14] (2174.80s)
thing?
[36:15] (2175.60s)
>> Every once in a while, that autopilot
[36:17] (2177.12s)
will go off and do something weird.
[36:19] (2179.12s)
>> Now, that's because I hit the wrong
[36:20] (2180.48s)
button, but still, I mean, I didn't know
[36:23] (2183.12s)
I hit the wrong button. I didn't know I
[36:24] (2184.96s)
didn't set it up correctly. And all of a
[36:26] (2186.32s)
sudden, the autopilot's taking the plane
[36:27] (2187.76s)
in the wrong direction. And I'm I'm
[36:29] (2189.28s)
looking at it going, "Yeah, no, you're
[36:31] (2191.04s)
not doing this thing right." It's the
[36:33] (2193.04s)
same attitude I have with an AI, right?
[36:36] (2196.08s)
I am in control of that AI. You know, I
[36:39] (2199.84s)
am the programmer. I author this code.
[36:42] (2202.96s)
The AI can help me. I've got no problem
[36:45] (2205.28s)
with that. But but I'm going to
[36:46] (2206.72s)
scrutinize everything it does.
[36:48] (2208.88s)
>> The demon is the demon of trust.
[36:52] (2212.48s)
That's where and and I and I see this
[36:54] (2214.72s)
beginning to creep in especially in
[36:56] (2216.96s)
younger programmers where they just
[36:59] (2219.12s)
write a prompt and they trust the code.
[37:03] (2223.12s)
>> Yeah. They expect the entire app and the
[37:05] (2225.20s)
to build from scratch.
[37:06] (2226.72s)
>> Yeah. No, that's that is not going to be
[37:08] (2228.80s)
the way this works. Even when the AIs
[37:11] (2231.68s)
are good enough to really write the code
[37:14] (2234.56s)
well. They're not yet, but they're
[37:16] (2236.16s)
getting there. They're getting there.
[37:18] (2238.24s)
Even when they are able to write the
[37:20] (2240.48s)
code very well, the difficulty will then
[37:24] (2244.24s)
be in structuring the prompt properly.
[37:27] (2247.76s)
>> Mhm.
[37:28] (2248.56s)
>> Which is a way of programming. We
[37:31] (2251.44s)
programmers
[37:33] (2253.04s)
are the people who specify the details.
[37:36] (2256.64s)
Those details have to be specified
[37:38] (2258.48s)
somehow. And whether they are specified
[37:40] (2260.88s)
in closure or Java or Scala or a prompt,
[37:45] (2265.68s)
they still have to be specified with
[37:48] (2268.40s)
sufficient detail and with sufficient
[37:50] (2270.72s)
knowledge of the business that an AI
[37:53] (2273.68s)
could then write the code. Think of
[37:55] (2275.28s)
every compiler you've ever used as just
[37:58] (2278.00s)
another kind of AI, right? Because
[38:00] (2280.08s)
that's what they are, right? This is
[38:01] (2281.92s)
just a better one. Okay? But somebody
[38:04] (2284.96s)
still has to specify. And you know who
[38:07] (2287.68s)
doesn't want to do that is the business.
[38:10] (2290.96s)
Businesses don't want to get involved
[38:12] (2292.72s)
with all the little horrible details,
[38:14] (2294.88s)
right? We do that. We programmers are
[38:17] (2297.84s)
the detail managers that make sure that
[38:20] (2300.32s)
every little fiddly detail is just
[38:23] (2303.04s)
right. There's a little thing behind me.
[38:25] (2305.28s)
Uh it's on the screen back there. It's a
[38:28] (2308.00s)
little project that I did for my uh
[38:30] (2310.80s)
>> uh flight school. I go in there every
[38:33] (2313.12s)
once in a while. The guy there said,
[38:34] (2314.96s)
"Hey, um, maybe maybe you could help me
[38:38] (2318.16s)
write a little thing that would list all
[38:40] (2320.56s)
the flights that are reserved and and
[38:43] (2323.28s)
check to see if they're in the air and
[38:44] (2324.96s)
here's some websites you can pull data
[38:46] (2326.88s)
from." And so I put that thing together
[38:48] (2328.96s)
for him.
[38:49] (2329.92s)
>> Mhm.
[38:50] (2330.56s)
>> And you know what? It was just a lot of
[38:52] (2332.48s)
little details. Just a lot of dumb
[38:54] (2334.64s)
little details. Oh, how big should that
[38:56] (2336.80s)
field be? And how where should the
[38:58] (2338.56s)
spaces be? And and you know, what order
[39:01] (2341.44s)
should they be? and just all this.
[39:03] (2343.76s)
That's the stuff we excel at. That's
[39:06] (2346.40s)
what we're good at. Programmers are good
[39:08] (2348.80s)
at thinking at that level. Not
[39:11] (2351.12s)
necessarily the level of code, but just
[39:13] (2353.84s)
the details of getting it all right. And
[39:17] (2357.60s)
the AIs aren't going to do that very
[39:19] (2359.20s)
well. We're going to have to be putting
[39:22] (2362.00s)
that effort into our prompts and we'll
[39:24] (2364.96s)
probably have to be reviewing code for a
[39:26] (2366.72s)
very long time.
[39:28] (2368.00s)
>> Right? I mean in the in the industry a
[39:31] (2371.20s)
lot of our time is spent reviewing code
[39:33] (2373.28s)
more than writing like typing the stuff.
[39:35] (2375.84s)
So u the the ability to read and
[39:38] (2378.88s)
understand code quickly is going to be
[39:41] (2381.44s)
an increasingly important skill I feel.
[39:45] (2385.20s)
>> and and in order to do that well you
[39:47] (2387.76s)
must know the design principles and the
[39:50] (2390.00s)
coding principles and all the standards
[39:52] (2392.88s)
and in order to have those into your
[39:54] (2394.80s)
brain well you better be writing some
[39:56] (2396.56s)
code too.
[39:57] (2397.60s)
>> Yep.
[39:59] (2399.36s)
because otherwise you don't have the
[40:00] (2400.72s)
good understanding of what that thing is
[40:02] (2402.32s)
going to do.
[40:03] (2403.12s)
>> That's right.
[40:04] (2404.24s)
>> Um I I had a I had a curiosity. Um you
[40:07] (2407.92s)
said that uh I mean first of all uh I
[40:10] (2410.88s)
agree with the principle uh that
[40:14] (2414.24s)
good software is fundamentally
[40:17] (2417.20s)
good thinking and
[40:21] (2421.04s)
software is good structured thinking so
[40:24] (2424.00s)
that you can make the machine do what
[40:26] (2426.72s)
you wanted with sufficient detail even
[40:29] (2429.28s)
if the the co-pilot ends up generating
[40:33] (2433.92s)
at least a bit of the code. I was
[40:36] (2436.24s)
wondering how you how you can evaluate
[40:40] (2440.64s)
whether a model or the co-pilot in
[40:44] (2444.16s)
question has exceeded its means. You
[40:46] (2446.64s)
said that uh the demon is trusting the
[40:50] (2450.16s)
LLMs beyond their means. Um I was
[40:53] (2453.60s)
wondering how how you can tell what
[40:55] (2455.52s)
those means are and how those means can
[40:58] (2458.24s)
evolve as the LLMs get better.
[41:01] (2461.68s)
So when I when I'm using Copilot or
[41:04] (2464.32s)
something like that, um it will make
[41:07] (2467.84s)
suggestions.
[41:09] (2469.20s)
>> Sometimes they're fairly large
[41:10] (2470.48s)
suggestions.
[41:11] (2471.84s)
>> Uh I already have an an image in my mind
[41:16] (2476.32s)
of what that what the solution should
[41:21] (2481.04s)
>> Just that, you know, I say, okay, there
[41:22] (2482.88s)
ought to be these these structures here
[41:24] (2484.88s)
and they ought to dangle down like this.
[41:26] (2486.80s)
And then I let co-pilot do it. And if it
[41:28] (2488.72s)
comes up with something completely
[41:30] (2490.08s)
different, then I'm very skeptical.
[41:32] (2492.80s)
>> Although I have I have had it in in the
[41:35] (2495.44s)
past where the thing that he came up
[41:37] (2497.20s)
with different was actually better. But
[41:39] (2499.12s)
that's a good thing to know. You see,
[41:40] (2500.64s)
you evaluate it and think, "Oh, yeah, I
[41:42] (2502.56s)
should have thought of that. That's a
[41:43] (2503.84s)
good idea." Um, but I always have this
[41:47] (2507.04s)
expectation. I'm not just going to let
[41:49] (2509.28s)
it free and then accept whatever it
[41:52] (2512.08s)
>> So, that's the first thing.
[41:54] (2514.00s)
>> Okay. Secondly, I've got a bunch of
[41:55] (2515.60s)
smells that I can test for, you know, so
[41:58] (2518.08s)
if it writes a 50line function, I'm
[42:00] (2520.16s)
going to be really skeptical, right?
[42:02] (2522.08s)
Because it should should have broken
[42:03] (2523.52s)
that down into a bunch of much smaller
[42:05] (2525.36s)
functions from my point of view. If it
[42:07] (2527.92s)
throws a switch statement out there, I'm
[42:09] (2529.76s)
going to be pretty skeptical of that,
[42:11] (2531.52s)
right? Because couldn't you have used
[42:13] (2533.20s)
some kind of polymorphism in here? Isn't
[42:15] (2535.12s)
there some better way to structure that?
[42:17] (2537.68s)
So I have a bunch of principles that
[42:20] (2540.00s)
that are in my head that I've written
[42:22] (2542.64s)
about uh for years. Uh and I can take I
[42:26] (2546.08s)
can take those principles and apply them
[42:27] (2547.84s)
to the code that the AI produces. And
[42:30] (2550.64s)
that's not very hard to do is I'm going
[42:32] (2552.72s)
to look at it and go okay okay fine you
[42:35] (2555.04s)
know that that's good that part's bad
[42:37] (2557.36s)
this I can fix that. So that's how I
[42:41] (2561.12s)
that's how I approach it. I supervise
[42:43] (2563.84s)
it. I make sure it matches the
[42:46] (2566.40s)
principles that I am comfortable with. I
[42:49] (2569.28s)
make sure that it meets the expectation
[42:51] (2571.20s)
I had and if it doesn't I'm I analyze it
[42:54] (2574.16s)
very carefully. Uh and I think that's
[42:56] (2576.40s)
the best anybody could do and and I do
[43:01] (2581.20s)
not let it write the tests. I write the
[43:03] (2583.60s)
tests.
[43:05] (2585.36s)
That's so interesting because I've seen
[43:08] (2588.80s)
uh examples of
[43:11] (2591.28s)
software being written where the
[43:13] (2593.04s)
programmer I mean even if the AI is
[43:15] (2595.20s)
being used as a co-pilot not let it spit
[43:18] (2598.00s)
out everything the programmer writes
[43:20] (2600.80s)
most of the stuff with some help from
[43:22] (2602.32s)
the AI and then the prompt is generate
[43:25] (2605.92s)
tests for that and then 30 tests pop up.
[43:30] (2610.08s)
>> Yeah, how useless is that? Every bug
[43:32] (2612.48s)
that's in that code is now going to be
[43:34] (2614.08s)
replicated in the tests.
[43:38] (2618.40s)
The whole the whole point of writing
[43:40] (2620.72s)
tests is double-ended bookkeeping,
[43:43] (2623.68s)
right? Accountants enter, you know,
[43:46] (2626.32s)
every every transaction they enter, they
[43:48] (2628.00s)
enter in two different places so that
[43:49] (2629.44s)
they can check it.
[43:50] (2630.48s)
>> There's this great big check that
[43:51] (2631.92s)
happens on the balance sheet, right?
[43:53] (2633.84s)
>> When we're writing tests, it's done
[43:56] (2636.08s)
because we want to make sure that we've
[43:58] (2638.64s)
said everything twice.
[44:01] (2641.76s)
If you write code and then have the AI
[44:04] (2644.56s)
generate tests or if you write tests and
[44:07] (2647.36s)
have the AI generate code, it is only
[44:10] (2650.16s)
been written once,
[44:12] (2652.40s)
right? You haven't said it twice.
[44:15] (2655.20s)
>> Yeah.
[44:15] (2655.52s)
>> So when I'm doing this, I write the
[44:17] (2657.44s)
tests. I don't show the tests to the AI.
[44:22] (2662.00s)
I have the AI do what I ask it to do and
[44:25] (2665.12s)
then I will run the tests and that makes
[44:27] (2667.84s)
sure that the AI did what I needed it to
[44:29] (2669.92s)
do. I write the tests. It might write
[44:32] (2672.88s)
some code.
[44:35] (2675.20s)
>> That's a very interesting take. How do
[44:37] (2677.52s)
you how do you
[44:41] (2681.04s)
Okay. Uh I'm thinking of a good way to
[44:42] (2682.96s)
frame to phrase this question. Um
[44:46] (2686.64s)
because you call this uh trust this uh
[44:51] (2691.36s)
borderline blind trust in AI a demon
[44:54] (2694.32s)
that is
[44:56] (2696.64s)
more or less going to start swallowing a
[44:58] (2698.88s)
good chunk of the programming world.
[45:01] (2701.84s)
Um, I see the uh the big danger of the
[45:05] (2705.28s)
demon as one the trust being misplaced
[45:09] (2709.12s)
and two the thinking that comes up with
[45:13] (2713.52s)
good software, the good structured
[45:15] (2715.44s)
thinking that led to the good code in
[45:17] (2717.44s)
the first place becoming atrophied over
[45:19] (2719.68s)
time because as we rely on AI more and
[45:22] (2722.00s)
more, we rely on our brains less and
[45:23] (2723.76s)
less. So the question is how do you
[45:27] (2727.84s)
envision us programmers keeping this
[45:30] (2730.88s)
part sharp as AI starts taking more and
[45:34] (2734.64s)
more responsibility and more and more of
[45:37] (2737.20s)
the code being written by AI.
[45:40] (2740.40s)
>> Yeah, I think that's a personal
[45:41] (2741.76s)
discipline. You know, I like I go back
[45:43] (2743.44s)
and write some assembly language every
[45:44] (2744.96s)
once in a while just because
[45:47] (2747.20s)
>> and I think every programmer should
[45:48] (2748.88s)
probably be doing that. Everybody should
[45:50] (2750.56s)
go back and write a little Java, you
[45:52] (2752.16s)
know, write a little write a little
[45:54] (2754.48s)
Scola, whatever languages you're
[45:56] (2756.32s)
comfortable with, just go back and make
[45:58] (2758.00s)
sure that you still understand how all
[46:00] (2760.72s)
that stuff works. Even even if you are
[46:03] (2763.28s)
working with an AI, uh not 80% of the
[46:06] (2766.64s)
time, you know, 90% of the time, okay,
[46:09] (2769.36s)
I'm writing prompts and it's great. Uh
[46:11] (2771.84s)
you should go back and write a little
[46:13] (2773.20s)
bit of code from time to time just so
[46:14] (2774.96s)
that you have those principles in your
[46:17] (2777.36s)
brain. The day will likely come where
[46:21] (2781.04s)
that won't be necessary, right? where
[46:23] (2783.20s)
the AIS will be so so good that they
[46:26] (2786.48s)
will be the new compiler and we will
[46:29] (2789.28s)
understand the prompt language well
[46:31] (2791.28s)
enough so that we can write structured
[46:34] (2794.56s)
prompts well and we know the code that's
[46:36] (2796.96s)
going to be generated will be correct
[46:38] (2798.96s)
we're already in that state with Java
[46:41] (2801.28s)
right nobody looks at the the bite code
[46:43] (2803.84s)
anymore we're already already in that
[46:45] (2805.84s)
case with things like go nobody looks at
[46:48] (2808.24s)
the machine language anymore right you
[46:50] (2810.56s)
can trust that the compiler is going to
[46:52] (2812.80s)
generate the right code.
[46:54] (2814.80s)
>> It's not the way it used to be, by the
[46:56] (2816.24s)
way. We used to check it like crazy cuz
[46:58] (2818.08s)
cuz it didn't generate the right code
[46:59] (2819.76s)
half the time, but nowadays it does. And
[47:02] (2822.00s)
the same will happen with the AIS,
[47:03] (2823.68s)
right? Eventually, we will come to trust
[47:06] (2826.80s)
what the AIs generate if we enter the
[47:09] (2829.92s)
right kind of prompt language. And the
[47:11] (2831.60s)
prompt language is probably going to
[47:13] (2833.04s)
have to be very structured, very much
[47:15] (2835.20s)
like a what a lawyer uses.
[47:18] (2838.64s)
Words will have meanings and structures
[47:21] (2841.68s)
will have meanings and we'll have to
[47:23] (2843.60s)
come up with a good testing language as
[47:25] (2845.44s)
well. All right. And all of that's going
[47:27] (2847.44s)
to have to happen.
[47:29] (2849.44s)
That's probably decades away yet.
[47:32] (2852.48s)
>> Do you think so? There there I I I think
[47:35] (2855.44s)
there are people that that are saying
[47:36] (2856.80s)
that the data you're describing is
[47:38] (2858.64s)
either here or very very close like by
[47:41] (2861.76s)
end of year, end of
[47:44] (2864.88s)
>> Well, I'll believe that when I see it.
[47:47] (2867.12s)
How does that day look like? How do you
[47:48] (2868.80s)
tell whether that day has come?
[47:51] (2871.92s)
>> Um,
[47:53] (2873.84s)
here's how I would look at this, right?
[47:55] (2875.92s)
There will be a there will be a period
[48:00] (2880.08s)
crazy enthusiasm, which we're seeing
[48:02] (2882.24s)
now, right?
[48:02] (2882.88s)
>> Yeah.
[48:03] (2883.52s)
>> And ramp up like crazy. And one of the
[48:06] (2886.08s)
most enthusiastic enthusias most one of
[48:09] (2889.60s)
the most enthusiastic groups will be the
[48:12] (2892.32s)
managers who think they don't need
[48:13] (2893.68s)
programmers anymore.
[48:15] (2895.20s)
>> Mhm. There are several people that are I
[48:17] (2897.60s)
mean there are many that already think
[48:19] (2899.60s)
that programming is becoming extinct for
[48:21] (2901.60s)
for this reason.
[48:22] (2902.64s)
>> Yep. So they're going to fail terribly
[48:25] (2905.92s)
uh because the problem is not
[48:28] (2908.00s)
programmers. The problem the problem is
[48:30] (2910.64s)
being able to specify things in enough
[48:33] (2913.28s)
detail and they're going to need people
[48:34] (2914.96s)
who can do that and people who do that
[48:37] (2917.04s)
are programmers. So So that that'll
[48:39] (2919.52s)
happen. and there'll be this big uh
[48:41] (2921.52s)
burnout and I don't think it's going to
[48:43] (2923.36s)
take very long for that to happen and
[48:45] (2925.60s)
then we will learn that okay we need to
[48:48] (2928.24s)
figure out how we how we construct this
[48:50] (2930.80s)
prompting language and there there will
[48:52] (2932.64s)
be a whole bunch of them people will
[48:54] (2934.16s)
come up with one scheme or another
[48:55] (2935.92s)
scheme or another scheme and that will
[48:57] (2937.92s)
take a while to condense and then at
[49:01] (2941.04s)
some point we will have one or two or
[49:03] (2943.92s)
three relatively good prompting
[49:06] (2946.80s)
languages that are formal and structured
[49:09] (2949.52s)
that you know you you put everything in
[49:11] (2951.76s)
the right order and all you choose just
[49:14] (2954.00s)
the right words and all of that will
[49:16] (2956.08s)
have to happen and I think that that's
[49:18] (2958.56s)
going to take some time. So I I I think
[49:21] (2961.68s)
what's happening right now is that we're
[49:23] (2963.12s)
in this enthusiasm phase and everybody
[49:24] (2964.96s)
says it's right around the corner. Don't
[49:27] (2967.12s)
worry, it's going to happen. It's next
[49:29] (2969.28s)
week. And I think no, it's probably a
[49:33] (2973.12s)
decade out. And there's another factor.
[49:37] (2977.52s)
We are burning gigawatts on this stuff.
[49:40] (2980.88s)
Probably terowatts on this stuff. And
[49:44] (2984.40s)
we're still expecting exponential
[49:46] (2986.64s)
growth. Now you take terowatts and you
[49:49] (2989.68s)
run them through exponential growth and
[49:52] (2992.32s)
you got yourself a heck of a problem.
[49:54] (2994.56s)
>> Yeah, you also need a Dyson sphere
[49:56] (2996.16s)
today.
[49:58] (2998.08s)
>> So if there's not a big revolution in
[50:01] (3001.60s)
efficiency,
[50:03] (3003.20s)
we're going to hit a plateau. We're
[50:04] (3004.80s)
going to hit a wall and that wall will
[50:06] (3006.40s)
be simple power consumption, right?
[50:08] (3008.72s)
Eventually it just takes too many
[50:10] (3010.88s)
nuclear power plants to run the AIS.
[50:16] (3016.00s)
>> Okay. Um so
[50:19] (3019.52s)
so as I uh if I'm hearing this right uh
[50:23] (3023.04s)
the day that you're describing sounds
[50:25] (3025.28s)
like basically a new programming
[50:27] (3027.52s)
language which bas which is like a
[50:29] (3029.60s)
glorified English or an unglorified
[50:32] (3032.40s)
programming language like a mix
[50:33] (3033.68s)
>> unglorified English I would think. Yeah.
[50:35] (3035.76s)
Legal ease.
[50:36] (3036.80s)
>> Legal ease program. Okay.
[50:39] (3039.12s)
>> Yeah. uh and
[50:42] (3042.00s)
uh some uh yeah probably the the
[50:46] (3046.00s)
hardware and the efficiencies and stuff
[50:48] (3048.00s)
uh may become a solvable problem maybe
[50:51] (3051.20s)
not but you're say you're saying that
[50:53] (3053.20s)
this is uh decades away okay that's an
[50:55] (3055.28s)
interesting take
[50:56] (3056.72s)
>> well yeah decades now I suppose it could
[50:58] (3058.80s)
be one decade I' I'd bet more like two
[51:01] (3061.44s)
but okay
[51:03] (3063.20s)
>> by the way I was wrong about
[51:04] (3064.48s)
self-driving cars so I made that same
[51:06] (3066.80s)
prediction about self-driving cars that
[51:08] (3068.80s)
that's That's decades away. No, no, it's
[51:11] (3071.20s)
not. So, take that for what it's worth.
[51:16] (3076.24s)
>> It's an interesting take now.
[51:17] (3077.28s)
Nonetheless, I'm curious to hear your
[51:19] (3079.60s)
take on this. And uh I'm also curious
[51:22] (3082.24s)
now that that we're speaking about AI.
[51:24] (3084.88s)
Uh I'm curious how do how you see our
[51:28] (3088.80s)
responsibility as programmers because as
[51:30] (3090.64s)
the AIS generate more code that has
[51:33] (3093.12s)
impact in in the real world who takes
[51:36] (3096.32s)
the blame if something goes wrong with
[51:41] (3101.76s)
>> programmer takes the blame
[51:44] (3104.16s)
that's not going to change I don't think
[51:46] (3106.16s)
the humans are always responsible you
[51:48] (3108.72s)
can't make a machine responsible you
[51:51] (3111.20s)
can't put a can't put a machine in
[51:53] (3113.04s)
prison doesn't mean anything to the
[51:54] (3114.88s)
machine.
[51:56] (3116.40s)
>> But if the if the a if the AI writes
[51:59] (3119.60s)
code that we really don't understand um
[52:04] (3124.72s)
>> I mean
[52:05] (3125.20s)
>> isn't that true now? I mean you write
[52:07] (3127.36s)
Scala. Do you understand what's getting
[52:09] (3129.04s)
generated?
[52:10] (3130.48s)
>> You have any idea what the bits are
[52:11] (3131.76s)
doing down at the low level?
[52:15] (3135.28s)
Yeah, I guess it's a matter of trust all
[52:17] (3137.04s)
the way down, I guess, because you trust
[52:18] (3138.96s)
the compiler, you trust the by code
[52:20] (3140.56s)
generator, you trust the machine that
[52:22] (3142.72s)
you trust the OS, you trust the Linux
[52:25] (3145.44s)
kernel or whatever kernel you're
[52:26] (3146.88s)
running, and then you trust the CPU and
[52:28] (3148.48s)
then you're trusting all the way down.
[52:31] (3151.68s)
Okay. Uh so it's is it a fundamental
[52:35] (3155.68s)
issue of trust no matter how how good
[52:38] (3158.72s)
the AI is? How do you think about this?
[52:42] (3162.48s)
Well, it's going to be an issue of
[52:44] (3164.48s)
trust. We will eventually trust that the
[52:46] (3166.56s)
AIS take our prompting language and do
[52:49] (3169.28s)
the right thing with it. Now, that trust
[52:51] (3171.92s)
is not um unconditional, right? Even
[52:55] (3175.92s)
today, you know, I'm writing code in
[52:58] (3178.08s)
Java or I'm writing code in Closure and
[53:00] (3180.64s)
it's not doing what I expect.
[53:04] (3184.08s)
uh after enough testing, I'm going to
[53:06] (3186.00s)
start suspecting that there's something
[53:08] (3188.16s)
wrong in the closure interpreter or
[53:11] (3191.60s)
something like that or maybe there's a
[53:13] (3193.28s)
hardware issue. Right? So those that
[53:16] (3196.48s)
trust is never perfectly unconditional.
[53:19] (3199.44s)
But after you've got enough experience,
[53:21] (3201.20s)
after you've after you've run through uh
[53:26] (3206.32s)
hundreds of thousands of hours of
[53:28] (3208.56s)
writing prompts and getting the right
[53:30] (3210.08s)
result, yeah, you you will have a lot of
[53:32] (3212.96s)
trust. You'll also understand very
[53:36] (3216.00s)
deeply what the limitations are, right?
[53:38] (3218.72s)
So you will understand why you need this
[53:40] (3220.56s)
structured language and why you need to
[53:42] (3222.88s)
say things in just the right way and in
[53:44] (3224.88s)
just the right order. In some sense, we
[53:48] (3228.24s)
will become machine psychologists.
[53:52] (3232.64s)
Did you ever did you ever read Iroot? I
[53:55] (3235.60s)
Isaac Azimoff's lovely book.
[53:58] (3238.64s)
>> I have it on my Kindle, but I did not
[54:01] (3241.60s)
get to it.
[54:03] (3243.04s)
>> So, so the primary characters other than
[54:05] (3245.76s)
the robots themselves are the
[54:08] (3248.48s)
psychologists
[54:10] (3250.00s)
who try to figure out why these machines
[54:12] (3252.88s)
behave in the strange way they do. And
[54:16] (3256.16s)
I'll I'll leave the I'll leave it to you
[54:17] (3257.92s)
to read the book. The book is just
[54:19] (3259.28s)
fascinating. But the uh the basic idea
[54:22] (3262.16s)
there is that the humans are still
[54:24] (3264.24s)
there. The humans still have to monitor
[54:26] (3266.72s)
these machines. Weird things happen
[54:28] (3268.96s)
because they are machines and someone
[54:31] (3271.44s)
has to understand those machines at a
[54:33] (3273.28s)
very deep level in order to figure out
[54:35] (3275.92s)
why they're behaving the way they
[54:37] (3277.28s)
behave. I I expect
[54:41] (3281.20s)
that the AI revolution will go exactly
[54:44] (3284.64s)
the way every other revolution in our in
[54:47] (3287.12s)
our industry has gone. Every other
[54:49] (3289.44s)
revolution, whether it's the first
[54:51] (3291.28s)
compiler or the first OO or the first VM
[54:55] (3295.12s)
or anything like that, every single one
[54:57] (3297.52s)
of those revolutions
[54:59] (3299.60s)
was generated a lot of fear that we
[55:02] (3302.56s)
aren't going to need programmers
[55:03] (3303.68s)
anymore, right?
[55:05] (3305.60s)
lay people will be able to write code.
[55:07] (3307.76s)
The programmers are going to go away.
[55:09] (3309.28s)
They said that for forran they said that
[55:11] (3311.52s)
for C++ they said that for Java, right?
[55:14] (3314.64s)
Oh, we're not going to need programmers
[55:15] (3315.92s)
anymore. It's going to be great. And
[55:17] (3317.52s)
what really happened was we needed even
[55:19] (3319.44s)
more programmers.
[55:20] (3320.88s)
>> and I think that's exactly what's going
[55:22] (3322.48s)
to happen with AI. The the AI power will
[55:26] (3326.08s)
open up so many possibilities that we
[55:29] (3329.12s)
will need even more programmers to tell
[55:31] (3331.60s)
the AIs what to do. That's that's how I
[55:34] (3334.72s)
expect this to work. That's very
[55:36] (3336.64s)
interesting because that ties into my
[55:38] (3338.72s)
next question which is how do you
[55:40] (3340.64s)
envision the principles of good software
[55:45] (3345.36s)
craft craftsmanship the kind of clean
[55:47] (3347.68s)
code that you've been adv advocating for
[55:50] (3350.16s)
um decades now um how does that evolve
[55:55] (3355.04s)
how do you see
[55:57] (3357.04s)
>> how do you see these principles
[55:58] (3358.24s)
>> evolves any different
[55:59] (3359.92s)
>> tell me
[56:00] (3360.40s)
>> I don't um so assembly language I'm
[56:03] (3363.36s)
writing assembly language what
[56:04] (3364.88s)
principles am I using same principles I
[56:06] (3366.96s)
use today when I was writing C what
[56:09] (3369.44s)
principles was I using same principles
[56:11] (3371.28s)
now I'm writing enclosure same
[56:12] (3372.88s)
principles right organization
[56:15] (3375.20s)
specification
[56:16] (3376.80s)
use nice names you know separation of
[56:20] (3380.40s)
concerns coupling cohesion all those
[56:24] (3384.24s)
things are still going to be there when
[56:27] (3387.52s)
we are writing prompts in a structured
[56:30] (3390.72s)
well-defined legalistic way we will have
[56:34] (3394.40s)
all those same issues. Read a contract.
[56:37] (3397.36s)
Read a a contract from a lawyer and you
[56:39] (3399.52s)
will see all those principles in that
[56:41] (3401.20s)
contract. Coupling and cohesion and
[56:44] (3404.48s)
organization and naming things properly.
[56:47] (3407.76s)
They're all there in the in the language
[56:50] (3410.80s)
of lawyers. So, and that's what we will
[56:53] (3413.60s)
end up being just machine lawyers.
[56:57] (3417.36s)
>> Machine lawyers. Yeah. Programmers.
[57:00] (3420.48s)
Okay. Um
[57:04] (3424.16s)
how do you uh how does one get these
[57:07] (3427.44s)
principles internally? I mean there are
[57:09] (3429.52s)
ways to formalize them and uh obviously
[57:11] (3431.52s)
you spend a good amount of time uh
[57:15] (3435.84s)
clearly specifying what those principles
[57:18] (3438.24s)
are and with many examples and with uh
[57:21] (3441.84s)
more books than uh other people I mean
[57:24] (3444.88s)
many people have ever read. you've
[57:26] (3446.96s)
written more more books on programming
[57:28] (3448.72s)
that many programmers have read really
[57:31] (3451.04s)
uh about these. How do you how do you
[57:34] (3454.64s)
envision people really internalizing
[57:37] (3457.60s)
these principles
[57:40] (3460.32s)
uh at an intuitive level? Because it
[57:42] (3462.32s)
sounds to me that as the programming
[57:44] (3464.24s)
industry evolves, the way that we're
[57:46] (3466.48s)
going to specify our programs is like a
[57:49] (3469.68s)
program in the sense that we are not
[57:53] (3473.12s)
really writing very well structured code
[57:56] (3476.96s)
but better structured English or a less
[57:59] (3479.68s)
structured language and leave the AI to
[58:02] (3482.72s)
um generate more and more of that. And
[58:05] (3485.60s)
so the principles of
[58:09] (3489.20s)
clean code, good understanding, um, good
[58:12] (3492.40s)
I mean separation of concerns, all the
[58:15] (3495.76s)
ideas that you've been discussing are
[58:20] (3500.72s)
going to be expressed at an intuitive
[58:22] (3502.64s)
level. And the question is, how can that
[58:25] (3505.44s)
intuition ever be acquired? Uh, and is
[58:30] (3510.56s)
there a way to accelerate that process?
[58:33] (3513.44s)
This is a bit a pretty wide and a pretty
[58:36] (3516.80s)
vague question, but I I'll let you take
[58:39] (3519.20s)
that wherever you like.
[58:42] (3522.32s)
>> Well, okay. So, I I believe that the the
[58:45] (3525.04s)
principles we're talking about
[58:46] (3526.40s)
principles of good good code.
[58:48] (3528.48s)
>> Mhm.
[58:48] (3528.96s)
>> Yeah.
[58:49] (3529.36s)
>> Uh will evolve along with our uh
[58:53] (3533.84s)
adoption of AIS.
[58:56] (3536.24s)
>> And it'll evolve in the same way that it
[58:58] (3538.16s)
always has. You know, when people first
[59:00] (3540.08s)
started writing uh object-oriented code,
[59:02] (3542.64s)
they made a mess of it. You know, we all
[59:04] (3544.72s)
made a mess of it because we didn't
[59:06] (3546.24s)
really understand exactly how to apply
[59:08] (3548.80s)
this whole inheritance thing, classes,
[59:11] (3551.60s)
and methods. And that was just so brand
[59:14] (3554.32s)
new. But over a period of about 5 years,
[59:18] (3558.24s)
all the old rules that applied back in
[59:21] (3561.68s)
the 70s reasserted themselves in this
[59:24] (3564.96s)
new context. And all of a sudden, we're
[59:27] (3567.36s)
all going, "Oh, yeah. No, this isn't
[59:29] (3569.52s)
really all that different, is it?" Okay,
[59:31] (3571.68s)
yeah, we got to separate this. We got to
[59:33] (3573.60s)
put all that together. Okay, name
[59:35] (3575.68s)
things. Okay, it's kind of the same
[59:37] (3577.68s)
thing. Oh, a little different language,
[59:39] (3579.76s)
but it's kind of the same thing. And
[59:41] (3581.36s)
then that happens over and over again.
[59:44] (3584.56s)
And I think that's what will happen
[59:46] (3586.00s)
here, right? Because at first, we're
[59:47] (3587.92s)
just writing, you know, English to the
[59:50] (3590.32s)
machine. Hey machine, I want you to do
[59:53] (3593.04s)
this and that and this and that. and it
[59:55] (3595.92s)
generates something and then you look at
[59:57] (3597.52s)
it and go, "Well, no, you didn't
[59:58] (3598.72s)
generate it right, so I need to add more
[60:00] (3600.40s)
to the prompt." Add more to the prompt.
[60:02] (3602.32s)
Now, generate it. Oh, no, that's not
[60:04] (3604.24s)
right either. Okay, add more to the
[60:05] (3605.68s)
prompt. Take this thing out. Move that
[60:07] (3607.52s)
thing around like so. Do that. Okay,
[60:09] (3609.68s)
more to the prompt. And as you're doing
[60:11] (3611.52s)
that work, you are once again
[60:13] (3613.92s)
rediscovering all the old rules that
[60:16] (3616.56s)
were that were around in the 70s and the
[60:18] (3618.72s)
80s. Same old rules. Okay. Yeah.
[60:21] (3621.12s)
Separation of concern, name things well,
[60:23] (3623.44s)
define things nicely. Okay. And in the
[60:27] (3627.20s)
end we will come to the conclusion that
[60:28] (3628.96s)
oh yeah this really isn't all that
[60:30] (3630.16s)
different is it? It's just kind of the
[60:33] (3633.92s)
just in a slightly better language.
[60:35] (3635.92s)
Yeah. Just a slightly better
[60:37] (3637.68s)
>> interesting. So you're saying that the
[60:39] (3639.68s)
same principles will apply because of
[60:41] (3641.20s)
the I I mean kind of like a Lindy effect
[60:44] (3644.00s)
but uh just the way that we're phrasing
[60:45] (3645.92s)
it to the computers is going to change
[60:47] (3647.68s)
is going to change. Nothing else.
[60:49] (3649.76s)
>> We will make the mistakes cuz everybody
[60:51] (3651.92s)
will and then we won't remember. Oh
[60:54] (3654.72s)
yeah. Yeah. That happened to me back
[60:56] (3656.56s)
when I was writing in C. Okay. Yeah.
[60:58] (3658.48s)
Yeah. I gotta do it this way. All the
[61:00] (3660.96s)
same rules will just come. Some more
[61:02] (3662.72s)
rules might come out. There might be
[61:04] (3664.80s)
some better uh different rules, but all
[61:07] (3667.28s)
those same basic principles will reapply
[61:09] (3669.60s)
themselves. And you asked an interesting
[61:11] (3671.44s)
question. You know, how do you
[61:12] (3672.80s)
internalize those rules? And the answer
[61:15] (3675.44s)
to that and and you implied it is to
[61:18] (3678.40s)
read read like crazy. Read as much as
[61:21] (3681.20s)
you can and read the stuff that was
[61:23] (3683.12s)
written in the 70s. Yeah. The stuff
[61:25] (3685.92s)
written by Tom DeMarco and Tim Listister
[61:28] (3688.32s)
and all those guys when they were
[61:30] (3690.16s)
struggling with the barest ideas they
[61:33] (3693.12s)
they had no idea but they just trying to
[61:35] (3695.76s)
get this stuff together. And as you read
[61:38] (3698.88s)
through that, you can feel the angst
[61:42] (3702.40s)
and you can identify with that angst and
[61:46] (3706.88s)
figure out the pathway that these
[61:49] (3709.12s)
principles follow. You know, everybody
[61:52] (3712.00s)
always says uh uh best time to learn
[61:55] (3715.52s)
history is is when you're young, but
[61:57] (3717.44s)
nobody bothers. You learn you learn
[61:59] (3719.92s)
history when you're old and then you
[62:01] (3721.84s)
realize, oh yeah, shouldn't have done
[62:06] (3726.24s)
It's probably going to be
[62:07] (3727.36s)
>> industry when you're young. Yeah.
[62:09] (3729.20s)
>> Uh it's probably going to be
[62:10] (3730.16s)
increasingly relevant for the field of
[62:11] (3731.60s)
programming as well. Even if this is a
[62:13] (3733.60s)
relatively new industry, it's starting
[62:15] (3735.28s)
to have a decent amount of history and
[62:18] (3738.00s)
of uh experiences to it and uh
[62:20] (3740.80s)
>> about 80 years now. Yeah.
[62:24] (3744.16s)
>> How do you feel the principles of clean
[62:26] (3746.24s)
code and of good code in general have
[62:28] (3748.32s)
changed over the years as you were
[62:30] (3750.40s)
witnessing them? Is there something that
[62:33] (3753.04s)
uh for example do you ever look at uh
[62:36] (3756.08s)
parts of your clean code book and you
[62:38] (3758.32s)
think oh my god I should have written
[62:40] (3760.32s)
this differently?
[62:41] (3761.92s)
>> I am in the midst of writing the second
[62:43] (3763.52s)
edition right now. In fact it's it's at
[62:45] (3765.28s)
the publisher at the moment.
[62:46] (3766.96s)
>> Okay. Um, and
[62:49] (3769.20s)
>> yes, yes, I mean there are things that I
[62:53] (3773.04s)
in the second edition there are things
[62:54] (3774.64s)
that I say differently and I change some
[62:56] (3776.88s)
emphasis
[62:58] (3778.40s)
and I relax some of the rules and I
[63:01] (3781.68s)
tighten some of the other rules, right?
[63:04] (3784.16s)
Because it's been what 15 years
[63:06] (3786.80s)
>> and in that 15 years I've learned a fair
[63:08] (3788.80s)
bit. Other people have have commented
[63:11] (3791.68s)
and I I understand their comments and
[63:13] (3793.60s)
I've incorporated them. Um, so sure, I
[63:17] (3797.12s)
think all of that evolves as it always
[63:19] (3799.92s)
does. You know, there's little bits here
[63:21] (3801.68s)
and there that we tune and tweak and
[63:23] (3803.68s)
fiddle with and that's never going to
[63:26] (3806.32s)
end. Uh, but
[63:30] (3810.24s)
then the second edition does does
[63:33] (3813.60s)
readress all the old ideas in a very
[63:38] (3818.16s)
different way. The the book is almost a
[63:40] (3820.24s)
complete rewrite. I think I saved a
[63:43] (3823.04s)
couple of chapters but even those
[63:44] (3824.64s)
chapters are are heavily edited. Uh but
[63:47] (3827.52s)
otherwise it's almost an entirely
[63:49] (3829.36s)
complete rewrite but the message is the
[63:53] (3833.20s)
>> Do do you have any example of something
[63:55] (3835.60s)
that you used to believe very strongly
[63:57] (3837.52s)
but uh has changed or you emphasized
[64:01] (3841.44s)
>> in the book? I was a very uh strong
[64:03] (3843.44s)
proponent proponent of test driven
[64:05] (3845.60s)
development and at the time I wrote it I
[64:08] (3848.32s)
was relatively new. I'd only been doing
[64:11] (3851.20s)
it for about eight or nine years. Uh,
[64:13] (3853.52s)
and so my disciplines were tight. I'm
[64:16] (3856.64s)
going to write my tests first. I'm going
[64:18] (3858.88s)
to write tests for everything. Over the
[64:21] (3861.36s)
last next 16 years, since then, I've
[64:25] (3865.20s)
encountered situations that made me
[64:27] (3867.76s)
soften those roles. And I've also en
[64:30] (3870.08s)
encountered debates that have made me
[64:31] (3871.76s)
soften those roles. Not soften the
[64:34] (3874.72s)
discipline.
[64:36] (3876.24s)
The discipline is still there, but widen
[64:38] (3878.80s)
the widen some of the constraints on
[64:40] (3880.72s)
those disciplines. So, for example, I
[64:43] (3883.68s)
write my tests first. I write a test, I
[64:46] (3886.32s)
make it pass. I write a test, I make it
[64:47] (3887.92s)
pass. But there are cases where that
[64:50] (3890.80s)
doesn't work, where you can't write the
[64:53] (3893.04s)
test first. And there's a bunch of
[64:54] (3894.48s)
reasons why, and I I don't need to go
[64:57] (3897.04s)
into them here, but they exist. Okay.
[64:59] (3899.76s)
So, then I have to write those tests
[65:01] (3901.36s)
after. Mhm.
[65:02] (3902.80s)
>> And I've accepted the fact that, you
[65:04] (3904.48s)
know, sometimes it's just better to
[65:06] (3906.96s)
write some of the tests after. Sometimes
[65:10] (3910.40s)
it's better, not always, but sometimes
[65:12] (3912.56s)
it's better to not write the test first,
[65:15] (3915.84s)
but to write 20 or 30 or even 40 lines
[65:19] (3919.04s)
of code because you don't really know
[65:21] (3921.76s)
what you want to do. And so, you kind of
[65:23] (3923.84s)
fiddle with the code and you get it into
[65:25] (3925.52s)
a certain kind of shape and think, okay,
[65:28] (3928.80s)
if I do anything more, I'm going to lose
[65:30] (3930.40s)
control of it. So now I'm going to write
[65:31] (3931.68s)
some tests.
[65:33] (3933.20s)
>> So that that happens to me. Uh I won't
[65:35] (3935.84s)
say a fair bit, but it does happen
[65:37] (3937.84s)
enough.
[65:39] (3939.04s)
>> So in the book I talk about these
[65:40] (3940.64s)
things. I talked about okay, I still
[65:42] (3942.64s)
like test-driven development. I think
[65:44] (3944.24s)
that's the way to go, but there are
[65:45] (3945.68s)
several other quasi disciplines that you
[65:49] (3949.12s)
can apply in certain circumstances
[65:51] (3951.92s)
that uh are going to be helpful. Um, I I
[65:55] (3955.68s)
make the same kind of quasi change in
[65:58] (3958.88s)
the size of functions. In in the
[66:00] (3960.80s)
original clean code book, I said, hey,
[66:02] (3962.88s)
you know, you want your functions to be
[66:04] (3964.40s)
five lines, four lines, six lines. You
[66:06] (3966.48s)
want them to be really small. Uh, in the
[66:09] (3969.36s)
second edition, I'm saying things like,
[66:10] (3970.96s)
well, yeah, that's still true. you still
[66:13] (3973.04s)
want your functions to be small, but
[66:14] (3974.72s)
there are cases where if you pull a
[66:18] (3978.24s)
20line function apart,
[66:20] (3980.96s)
the coupling between those two functions
[66:23] (3983.52s)
can be too high and it makes it obs it
[66:27] (3987.52s)
obscures the code. So it sometimes is
[66:30] (3990.32s)
better to leave those leave those
[66:32] (3992.96s)
functions together in a single function
[66:35] (3995.52s)
rather than extracting them uh because
[66:38] (3998.40s)
it softens the coupling issue. Right? So
[66:41] (4001.60s)
I make that point in a number of number
[66:43] (4003.92s)
of places as well. And there's a lot of
[66:46] (4006.00s)
things like that. A lot of things where
[66:48] (4008.64s)
after 16 years I'm going well okay still
[66:51] (4011.84s)
a good rule but there are these cases
[66:54] (4014.16s)
off to the side that you have to be
[66:55] (4015.68s)
aware of.
[66:57] (4017.36s)
>> What other kinds of criticism have you
[67:00] (4020.40s)
received for for clean code? I mean what
[67:03] (4023.44s)
are some vocal ideas that prompted some
[67:07] (4027.28s)
changes to to the book?
[67:11] (4031.76s)
Um probably the biggest impact on the
[67:14] (4034.56s)
book was uh Auststerhout's
[67:17] (4037.28s)
um uh philosophy of software design. I
[67:20] (4040.32s)
think that's the name of the book. Uh a
[67:22] (4042.88s)
a philosophy of software. Yeah. A
[67:25] (4045.12s)
philosophy of software design. Um
[67:27] (4047.20s)
Austster wrote this book and uh he's
[67:30] (4050.32s)
he's very critical of clean code in the
[67:32] (4052.32s)
book although he's targeted, right? He
[67:35] (4055.04s)
does he doesn't just wipe the whole
[67:36] (4056.64s)
book. He says, "This thing in the book I
[67:39] (4059.04s)
don't agree with because of this. That
[67:41] (4061.12s)
thing in the book I don't agree with
[67:42] (4062.56s)
because of that, but this thing in the
[67:43] (4063.84s)
book I do agree with." So, he's he's uh
[67:46] (4066.16s)
he's rational about it. He's reasonable
[67:48] (4068.08s)
about it. He's not one of the flamers
[67:49] (4069.44s)
who goes off and says, "Oh, God, clean
[67:51] (4071.36s)
code's terrible."
[67:52] (4072.80s)
>> Um, and I read that book very carefully
[67:55] (4075.36s)
and then he and I got into an extended
[67:57] (4077.52s)
debate on the issue, which I actually uh
[68:00] (4080.24s)
transcribed that debate and I include it
[68:02] (4082.32s)
in the second edition
[68:04] (4084.24s)
>> very
[68:04] (4084.80s)
>> at the end as an appendix. right?
[68:06] (4086.64s)
Because it was a very worthwhile
[68:08] (4088.80s)
discussion. Um, so that's one where I
[68:12] (4092.24s)
thought the criticism was
[68:15] (4095.68s)
uh if not welld deserved, at least
[68:18] (4098.00s)
wellreasoned.
[68:19] (4099.60s)
>> Mhm.
[68:20] (4100.00s)
>> Now, there's a bunch of other people who
[68:21] (4101.68s)
have just come up and and done clickbait
[68:24] (4104.24s)
stuff. You know, clean code, terrible
[68:26] (4106.16s)
performance,
[68:27] (4107.92s)
just clickbait.
[68:29] (4109.84s)
And I get big big letters on the screen.
[68:32] (4112.40s)
clean code. Terrible for or it's time to
[68:35] (4115.20s)
stop recommending clean code there. All
[68:37] (4117.12s)
these lovely clickbaity things. Okay,
[68:39] (4119.76s)
fine. If you want to get clicks, you can
[68:41] (4121.52s)
do that, I guess. You know,
[68:44] (4124.00s)
and I I have um uh at first I tried to
[68:48] (4128.24s)
write uh responses. Nowadays, I don't
[68:50] (4130.64s)
even bother. It's just not worth it.
[68:55] (4135.04s)
What kept you um this this is something
[68:58] (4138.48s)
that I that I admire uh about you
[69:00] (4140.96s)
because you have written a lot and
[69:05] (4145.68s)
it seems to me that over time as you
[69:10] (4150.00s)
wrote new material, you incorporated
[69:12] (4152.88s)
feedback and experience and made you
[69:15] (4155.92s)
adapt the lessons that you were very
[69:18] (4158.40s)
adamant about as you were just
[69:20] (4160.08s)
describing. Um,
[69:23] (4163.28s)
and the reason why I admire this is that
[69:26] (4166.48s)
you seem to be truly
[69:31] (4171.52s)
internalizing the word craft into your
[69:33] (4173.60s)
code. And so I was wondering what kept
[69:35] (4175.60s)
you a craftsman over the years and how
[69:40] (4180.72s)
has that impacted the way that you view
[69:45] (4185.44s)
the productivity of a programmer?
[69:52] (4192.00s)
Long ago, I said to myself, the only way
[69:54] (4194.80s)
to go fast is to do a good job. You
[69:57] (4197.52s)
know, that's that's kind of grandparent
[70:00] (4200.00s)
speak, right? Grandparents tell their
[70:01] (4201.52s)
grandchildren, you the only way to do a
[70:03] (4203.20s)
good job. The only way to go fast, do a
[70:05] (4205.12s)
good job. Everything worth doing well.
[70:06] (4206.80s)
You know, just that kind of stuff. Um,
[70:09] (4209.44s)
but I I accepted that, you know, I said,
[70:11] (4211.44s)
"Okay, if I'm going to go fast, the only
[70:14] (4214.24s)
way I'm going to go fast is to do a good
[70:16] (4216.24s)
job." And therefore, everything else I
[70:19] (4219.28s)
learn must be targeted at doing a good
[70:21] (4221.60s)
job because that's the only way I'm
[70:23] (4223.04s)
going to go fast. My productivity can
[70:25] (4225.60s)
only go up the better job I do. Right?
[70:30] (4230.32s)
So, onetoone relationship or or a
[70:33] (4233.28s)
monotonic relationship, the better job I
[70:35] (4235.52s)
do, the higher my productivity.
[70:38] (4238.00s)
Productivity does not drive
[70:41] (4241.44s)
I I hate to use the word quality that's
[70:43] (4243.28s)
not the right word but productivity does
[70:45] (4245.68s)
not drive uh goodness of code
[70:49] (4249.36s)
>> goodness of code drives productivity
[70:53] (4253.12s)
>> what happen habits
[70:55] (4255.68s)
>> what habits are you keeping in order to
[70:58] (4258.88s)
continue growing your craft uh with the
[71:02] (4262.32s)
amount of stuff that's happening in the
[71:03] (4263.68s)
programming space I mean there are
[71:05] (4265.04s)
million things developing as we
[71:08] (4268.08s)
Uh so I was wondering how how you keep
[71:11] (4271.20s)
uh how you keep your craft growing
[71:16] (4276.08s)
when um
[71:19] (4279.36s)
let me say this differently. The the
[71:21] (4281.52s)
field that we are in
[71:24] (4284.24s)
is changing dramatically all the time
[71:27] (4287.52s)
and it and it always has. We we rode Mo
[71:30] (4290.56s)
Moore's law uh up until Moors law died
[71:33] (4293.68s)
and now we're blowing out server farms
[71:36] (4296.08s)
and using terowatts and and you know the
[71:38] (4298.72s)
the the change in our field is rampant.
[71:44] (4304.08s)
Some one guy I know calls it the churn.
[71:46] (4306.80s)
He built a whole business on taking
[71:48] (4308.40s)
advantage of the churn.
[71:52] (4312.32s)
Initially when you're young that's
[71:54] (4314.72s)
overwhelming, right? I mean, how can you
[71:57] (4317.36s)
possibly keep up with this?
[71:58] (4318.88s)
>> Yep.
[71:59] (4319.28s)
>> There's just so much happening.
[72:01] (4321.68s)
>> But as the years go by, you begin to
[72:03] (4323.52s)
realize that a lot of the churn is
[72:07] (4327.04s)
repetitious. It's the same thing being
[72:10] (4330.24s)
said in a slightly different way. And as
[72:13] (4333.68s)
the as the wheel turns, as the time goes
[72:16] (4336.64s)
by, more and more of the churn becomes
[72:20] (4340.32s)
identifiable as old news, even though
[72:23] (4343.92s)
it's stated as something new.
[72:26] (4346.16s)
It's old news. It's been around that
[72:29] (4349.28s)
block before. Don't need to pay
[72:31] (4351.28s)
attention to it any longer. So, uh,
[72:33] (4353.28s)
we've had a whole bunch of new languages
[72:34] (4354.80s)
come out, right? And I'll go all the way
[72:37] (4357.04s)
back to the Golang. Beautiful language,
[72:39] (4359.36s)
by the way. Old news. Old news. We've
[72:42] (4362.56s)
been around that block a few times. Not
[72:44] (4364.16s)
that the language is bad. It's just
[72:46] (4366.08s)
okay. We tried that before. Uh, a couple
[72:49] (4369.04s)
little differences. Who cares? Um, same
[72:51] (4371.44s)
thing with um Oh, what is the big one
[72:54] (4374.48s)
now? Uh, React. Oh, everybody's talking
[72:56] (4376.48s)
about React and and and I know that's a
[72:58] (4378.96s)
little old news, but oh, everybody's
[73:00] (4380.56s)
still talking about React. It's old
[73:02] (4382.16s)
news. It's old news. And you pick up a
[73:04] (4384.32s)
an inside Macintosh. Old news, right?
[73:06] (4386.72s)
It's been around that block. So, so the
[73:09] (4389.68s)
way I deal with the question that you're
[73:12] (4392.00s)
asking me is that I I have enough
[73:14] (4394.32s)
experience
[73:15] (4395.92s)
to look at the churn and pick out the
[73:19] (4399.36s)
things that are really new and there
[73:21] (4401.20s)
aren't many and ignore the things that
[73:24] (4404.00s)
are just old news. And I, you know, I
[73:26] (4406.96s)
can look at the old new stuff and
[73:28] (4408.32s)
evaluate it and say, you know, I'll
[73:29] (4409.60s)
spend a day and say, "Yeah, okay, I get
[73:32] (4412.00s)
it." And then I don't have to spend any
[73:34] (4414.08s)
more time on.
[73:36] (4416.40s)
Am I risking missing an innovation?
[73:40] (4420.32s)
Yeah, maybe. But everybody has to parse
[73:42] (4422.96s)
the stream that's coming in based on
[73:45] (4425.04s)
their experience and then pick the
[73:47] (4427.36s)
things that are
[73:50] (4430.48s)
that they believe are going to be
[73:54] (4434.00s)
impactful.
[73:56] (4436.16s)
And you know, with 50 years behind me,
[73:58] (4438.24s)
I'm I'm looking at those things and
[73:59] (4439.60s)
thinking, okay, I I think I know what
[74:01] (4441.20s)
they are.
[74:02] (4442.32s)
>> I could be wrong, but I think I know
[74:03] (4443.84s)
what they are.
[74:06] (4446.56s)
Something that makes me very curious
[74:08] (4448.24s)
about this um this idea ties into some
[74:11] (4451.36s)
of my earlier questions about good taste
[74:13] (4453.28s)
and uh internalizing good code. You and
[74:16] (4456.32s)
I are both teachers. Obviously you have
[74:19] (4459.60s)
um more experience uh teaching than I
[74:22] (4462.40s)
have of life. But uh I was one thing
[74:26] (4466.72s)
that I believe as a teacher is that if
[74:29] (4469.44s)
something can be learned, it can be
[74:30] (4470.80s)
taught. So my question to you is can
[74:33] (4473.84s)
this skill of identifying patterns and
[74:36] (4476.56s)
finding out what's old and constant
[74:40] (4480.08s)
can the skill be taught and if it can be
[74:43] (4483.04s)
accelerated in any way?
[74:46] (4486.16s)
>> Well, I think it can. Um
[74:49] (4489.36s)
the the way the way young people learn
[74:52] (4492.56s)
is by dealing with people who've been
[74:54] (4494.32s)
around the block a few times, right? By
[74:56] (4496.96s)
the way, that's something that we've
[74:58] (4498.24s)
lost in in the programming industry to
[75:00] (4500.72s)
some extent. Uh but in general, if
[75:04] (4504.08s)
you're going to learn something and
[75:05] (4505.28s)
learn it well, you want to learn it from
[75:06] (4506.72s)
someone who has been doing it for a long
[75:08] (4508.64s)
time. So I sitting next to an apprentice
[75:13] (4513.60s)
can identify things to that apprentice.
[75:15] (4515.68s)
The apprentice may run in and say, "Hey,
[75:17] (4517.60s)
look at this. It's so new." And I can
[75:19] (4519.12s)
say, "Yeah, no, that's not new at all.
[75:20] (4520.88s)
And here's why." And I can pull the
[75:22] (4522.08s)
books down off my shelf and say, "See
[75:23] (4523.76s)
there? See there? That was all done 30
[75:25] (4525.52s)
years ago.
[75:28] (4528.16s)
And if you do that a few times, uh, you
[75:30] (4530.56s)
start to inculcate in the apprentice,
[75:33] (4533.20s)
uh, a a value system for the things that
[75:37] (4537.20s)
are old and be able to compare that to
[75:40] (4540.24s)
the things that are new, right? Which is
[75:42] (4542.32s)
good. That's a good thing to do. Now, I
[75:44] (4544.80s)
said that that our industry has um not
[75:47] (4547.76s)
been following that rule very well or
[75:50] (4550.64s)
not following that pattern. One of the
[75:52] (4552.56s)
reasons for that is is that we seem to
[75:55] (4555.60s)
think that programming can be learned in
[75:59] (4559.84s)
uh a 13-week boot camp or um a 4-year
[76:05] (4565.76s)
degree program that has a couple of
[76:08] (4568.24s)
computer science courses taught by
[76:10] (4570.64s)
people who have never coded in anger in
[76:12] (4572.72s)
their life.
[76:14] (4574.56s)
Uh it's probably not a good way to bring
[76:18] (4578.24s)
programmers into the world. Yeah. My son
[76:21] (4581.12s)
runs a company um called Clean Coders
[76:25] (4585.04s)
>> and he uses this apprenticeship model,
[76:27] (4587.44s)
right? And it and he's really detailed
[76:30] (4590.32s)
and disciplined about it, right? And
[76:32] (4592.72s)
they bring apprentices in and the
[76:34] (4594.64s)
apprentices go through a fairly long
[76:37] (4597.04s)
cycle before they ever touch client
[76:38] (4598.96s)
code, right? They go through a fairly
[76:41] (4601.20s)
long cycle of dealing with the masters
[76:44] (4604.88s)
uh and learning how to do things well.
[76:48] (4608.48s)
Aside from apprenticeships and uh
[76:52] (4612.32s)
osmosis
[76:53] (4613.84s)
for the lack of a better term, is there
[76:56] (4616.32s)
any other way that you think the skill
[76:58] (4618.96s)
can be imparted?
[77:02] (4622.32s)
The skills skills are something you
[77:04] (4624.16s)
learn by doing, but the values can be
[77:06] (4626.32s)
imparted, right? And and you learn
[77:08] (4628.40s)
values two ways. You either learn learn
[77:10] (4630.40s)
values by learning them from someone you
[77:12] (4632.72s)
respect or you learn them by making a
[77:14] (4634.80s)
lot of mistakes.
[77:16] (4636.80s)
>> Yeah. either way will work just fine. Um
[77:20] (4640.72s)
the the first of those, learning from
[77:22] (4642.64s)
people that you respect, the best way to
[77:24] (4644.72s)
do that is just to read. And again, I'll
[77:27] (4647.20s)
just go back to that again. Read, read,
[77:28] (4648.88s)
read, read, read. Find all these books
[77:30] (4650.40s)
and read them. Uh don't don't make the
[77:33] (4653.28s)
mistake of thinking that you're a
[77:35] (4655.04s)
programmer because you know how to write
[77:36] (4656.08s)
an if statement.
[77:38] (4658.00s)
>> Yep.
[77:40] (4660.32s)
>> Okay.
[77:41] (4661.60s)
What books would you recommend a
[77:43] (4663.92s)
newcomer
[77:45] (4665.76s)
read in order to I mean okay you've
[77:49] (4669.28s)
written more books than than uh um yeah
[77:53] (4673.20s)
okay uh but some foundational books uh
[77:57] (4677.92s)
that a newcomer is supposed to have
[78:00] (4680.96s)
internalized not just read in order to
[78:03] (4683.36s)
call themselves a programmer or maybe a
[78:07] (4687.20s)
craftsman. Well, okay. I I kind of like
[78:10] (4690.00s)
I kind of don't like to use the uh the
[78:12] (4692.80s)
phrase in order to call themselves, but
[78:16] (4696.08s)
what should a young programmer read
[78:19] (4699.44s)
>> in order to improve their career?
[78:22] (4702.32s)
>> Oh my goodness. Well, I've got a lot of
[78:23] (4703.76s)
books here. So, let's start with some
[78:27] (4707.04s)
really goodies, but oldies
[78:30] (4710.32s)
>> Can
[78:31] (4711.92s)
honest to God, you know, dear
[78:34] (4714.24s)
programmers, read these books.
[78:37] (4717.12s)
Re read them. They're wonderful. You
[78:39] (4719.60s)
will learn things you didn't know in
[78:42] (4722.16s)
these books. Fundamental algorithms. Did
[78:44] (4724.40s)
I have it right? Yeah. Fundamental
[78:45] (4725.76s)
algorithms, sorting and searching,
[78:47] (4727.20s)
semi-numerical algorithms. Lovely books.
[78:49] (4729.76s)
Get them. Can's uh what is it? The um
[78:53] (4733.36s)
art of computer programming written a
[78:56] (4736.40s)
very long time ago.
[78:58] (4738.64s)
>> Uh let's see. Get those books. Read
[79:00] (4740.96s)
those books. Um,
[79:05] (4745.60s)
Tom DeMarco, Structured Systems
[79:07] (4747.76s)
Analysis.
[79:10] (4750.40s)
You should definitely read this book. It
[79:12] (4752.56s)
is really old. It has diagrams in it
[79:15] (4755.44s)
that are very old style. We tend not to
[79:17] (4757.68s)
use those diagrams anymore, although you
[79:19] (4759.52s)
should know about them. And you should
[79:21] (4761.60s)
also understand the topic here. How do
[79:25] (4765.12s)
you talk to someone who is not technical
[79:28] (4768.24s)
>> and capture the technical essence of
[79:31] (4771.52s)
what they want and turn that into an a
[79:34] (4774.48s)
design?
[79:36] (4776.08s)
>> This is a great book for that that
[79:38] (4778.16s)
particular purpose.
[79:40] (4780.24s)
Uh let's see um the next book.
[79:45] (4785.04s)
>> This is fascinating.
[79:46] (4786.72s)
>> Okay. Design patterns 1995.
[79:50] (4790.00s)
This may be the most important book
[79:51] (4791.76s)
written in the last 30, 40 years. Uh,
[79:54] (4794.48s)
and and right now it's undergoing an
[79:57] (4797.04s)
awful lot of negative press. People are
[79:59] (4799.60s)
saying that's that's so old. That stuff
[80:02] (4802.24s)
is just useless. No, we're not. No,
[80:07] (4807.20s)
you you should know this stuff. You
[80:09] (4809.60s)
should know this really really well.
[80:12] (4812.48s)
This is a very very important, very
[80:14] (4814.48s)
powerful topic. And this book is the uh
[80:17] (4817.52s)
the book that describes it best.
[80:19] (4819.36s)
Although there are some others out there
[80:20] (4820.80s)
that do a nice job.
[80:23] (4823.20s)
You should definitely learn that book.
[80:25] (4825.36s)
This book, I already pulled it out. God,
[80:28] (4828.56s)
read this book.
[80:29] (4829.36s)
>> Yeah, this is
[80:30] (4830.64s)
>> Read it later. All right. After you've
[80:33] (4833.60s)
read a few of these others, read this
[80:35] (4835.20s)
one cuz this this one changed my life.
[80:37] (4837.76s)
This one was a a really interesting
[80:39] (4839.92s)
book. By the way, you can still see all
[80:42] (4842.56s)
their lectures online as they're drawing
[80:45] (4845.20s)
lisp code on a blackboard. parenthesy
[80:47] (4847.92s)
parenthesy parenthesy. Fascinating.
[80:50] (4850.80s)
Fascinating stuff. Uh let's see what
[80:53] (4853.92s)
else is there. Oh, heavens heavens. How
[80:56] (4856.48s)
could I have forgotten this one?
[80:58] (4858.96s)
1972 structured programming.
[81:02] (4862.08s)
>> Dystra doll You will read this
[81:05] (4865.84s)
book and you will learn where an awful
[81:08] (4868.72s)
lot of the ideas you think are modern uh
[81:11] (4871.36s)
came from because a lot of them are
[81:13] (4873.84s)
sitting right in this book. Great book
[81:15] (4875.92s)
to read. Uh pretty easy reading.
[81:23] (4883.52s)
Martin Fowler Refactor.
[81:24] (4884.88s)
>> Refactoring again.
[81:26] (4886.16s)
>> Second. This is the second edition. It
[81:28] (4888.00s)
doesn't matter which edition you get,
[81:29] (4889.36s)
frankly. Uh but e either one. This is
[81:31] (4891.92s)
probably the only one you can get now.
[81:33] (4893.92s)
uh but startling book from from my point
[81:37] (4897.44s)
of view. I read this in 1995 and it was
[81:40] (4900.64s)
one of those things where it was the
[81:42] (4902.64s)
first book to ever represent code as
[81:47] (4907.28s)
something malleable, something that you
[81:49] (4909.76s)
could change and improve. All the other
[81:52] (4912.32s)
books before that just showed you code
[81:53] (4913.92s)
in its final form. This book shows you
[81:56] (4916.88s)
code before it's reached its final form
[81:59] (4919.60s)
and then shows you how to improve it.
[82:02] (4922.32s)
Fascinating book. Very well worth very
[82:05] (4925.44s)
well worth uh having around. Let's see.
[82:09] (4929.04s)
One more. One more. Uh it's up here
[82:13] (4933.36s)
somewhere. Yep. Yep. There it is.
[82:20] (4940.64s)
>> Yep.
[82:21] (4941.44s)
>> Very undervalued book. Analysis
[82:24] (4944.48s)
patterns. Wonderful. Wonderful. These
[82:27] (4947.76s)
are ideas for how to take a business
[82:31] (4951.52s)
person's mindset
[82:34] (4954.00s)
and turn it into something that you can
[82:36] (4956.80s)
articulate in code.
[82:39] (4959.68s)
Wonderful book m this is the best book
[82:41] (4961.68s)
Martin Fowler ever wrote and not nearly
[82:44] (4964.72s)
enough people have read it. So So let's
[82:47] (4967.92s)
see. I could probably go on
[82:52] (4972.24s)
but there's
[82:52] (4972.96s)
>> fascinating
[82:53] (4973.92s)
>> there's a few that that you ought to
[82:57] (4977.20s)
Nice. Thank you so much for that. I'm
[82:59] (4979.04s)
going to uh add notes to to the video
[83:02] (4982.80s)
and to the conversation so that people
[83:04] (4984.48s)
can uh grab these books uh whenever they
[83:07] (4987.60s)
can. Um
[83:11] (4991.44s)
okay, how do you convince these people?
[83:14] (4994.40s)
Uh I mean, okay, I I I don't I'm
[83:18] (4998.48s)
thinking about how to phrase this. Um,
[83:21] (5001.36s)
how do you convince people to adopt the
[83:25] (5005.04s)
principles within the books that you've
[83:27] (5007.52s)
just shown us? Uh, to adopt these
[83:31] (5011.12s)
patterns and ways of thinking as habits,
[83:34] (5014.00s)
not just a nice to have or a one shot a
[83:37] (5017.20s)
one-shot thing that you have to do when
[83:39] (5019.28s)
your code starts breaking and when
[83:40] (5020.72s)
you're doing rewrites. How do you uh how
[83:44] (5024.56s)
do you convince people to adopt these
[83:46] (5026.64s)
things as a recurrent thing that they
[83:48] (5028.72s)
should keep in the back of their minds?
[83:52] (5032.16s)
>> I've come to the conclusion over many
[83:54] (5034.00s)
years of attempting to convince people
[83:55] (5035.76s)
that you can't convince anybody of these
[83:57] (5037.60s)
things.
[84:00] (5040.48s)
Oh, there are a few people who will
[84:03] (5043.12s)
listen and internalize.
[84:05] (5045.84s)
Most people will listen and become
[84:07] (5047.92s)
skeptical. And there's not anything
[84:10] (5050.08s)
wrong with that. That's a healthy
[84:11] (5051.76s)
attitude to take. And then uh they might
[84:15] (5055.84s)
leave leave and do something else for a
[84:18] (5058.56s)
while. There will come a moment in their
[84:21] (5061.52s)
career when suddenly something will go
[84:24] (5064.56s)
wrong or about to go wrong and their
[84:27] (5067.36s)
memory will go, "Oh,
[84:30] (5070.08s)
I heard about that."
[84:32] (5072.48s)
And that'll be the convincing moment.
[84:34] (5074.56s)
And it it may take many of those
[84:36] (5076.16s)
moments. all of a sudden you see, oh
[84:39] (5079.84s)
yeah, that guy over there, he said this,
[84:41] (5081.44s)
he said this, he does that, he does
[84:42] (5082.96s)
that. I think I understand why now.
[84:46] (5086.72s)
So, I've seen that happen a great deal.
[84:49] (5089.60s)
But, but the the convincing bit,
[84:53] (5093.60s)
that's very hard to do. Now, what do I
[84:55] (5095.28s)
do? What do I do to convince people?
[84:57] (5097.12s)
Well, I go on podcasts like this and I
[85:00] (5100.00s)
talk about it a lot and I write a lot of
[85:01] (5101.68s)
books and I write a lot of articles and
[85:03] (5103.84s)
blogs and I speak at conferences and I
[85:06] (5106.64s)
do YouTube rants and I do as much
[85:10] (5110.16s)
communicating as I can in the hope that
[85:14] (5114.88s)
some of that information will get into
[85:17] (5117.04s)
the brains of the people who are
[85:18] (5118.72s)
listening and then one day germinate and
[85:23] (5123.44s)
turn into a
[85:26] (5126.56s)
blossom. something flower.
[85:29] (5129.20s)
>> Got it.
[85:29] (5129.68s)
>> Probably chose the wrong metaphor there.
[85:32] (5132.00s)
>> if you can convince one person and uh
[85:34] (5134.96s)
that person ends up building some useful
[85:37] (5137.20s)
code, then uh it's probably mission
[85:39] (5139.20s)
successful at least on that front. Um
[85:42] (5142.72s)
>> hope so.
[85:44] (5144.48s)
I I I have some follow-up questions that
[85:48] (5148.08s)
are um let's say a little bit more
[85:51] (5151.04s)
self-interested because I'm a teacher
[85:53] (5153.04s)
and I am looking for ways to develop
[85:55] (5155.84s)
myself as a teacher and
[85:59] (5159.12s)
you are a person that I uh would like to
[86:02] (5162.64s)
learn from not just as a programmer
[86:04] (5164.24s)
because you've written a lot and uh
[86:06] (5166.16s)
there there's so much material that you
[86:08] (5168.40s)
speak about in your books than we can
[86:10] (5170.16s)
ever cover in a conversation like this
[86:12] (5172.80s)
but Maybe uh
[86:16] (5176.40s)
could you tell me when did you realize
[86:20] (5180.96s)
that you are a teacher? because in your
[86:24] (5184.80s)
writing uh you can you can consider your
[86:27] (5187.76s)
writing as
[86:29] (5189.60s)
a form of teaching and I I'm wondering
[86:32] (5192.96s)
how you realized that you were a teacher
[86:35] (5195.12s)
and how you developed your own skills as
[86:36] (5196.96s)
a teacher because it it shows in this
[86:39] (5199.84s)
conversation that you're very engaging
[86:43] (5203.60s)
that you describe things in a certain
[86:45] (5205.84s)
way that you use certain gestures that
[86:47] (5207.52s)
you use certain words that you use
[86:48] (5208.96s)
certain emphasis
[86:51] (5211.20s)
and I'm I want to get some of those
[86:55] (5215.20s)
skills for myself as well. So, I'm
[86:57] (5217.36s)
wondering how when did you realize that
[86:59] (5219.84s)
you had this in you and how did you
[87:01] (5221.52s)
develop these skills?
[87:05] (5225.68s)
>> If I look way back into my childhood,
[87:10] (5230.96s)
I can recognize moments where um
[87:16] (5236.40s)
I was enjoying teaching something.
[87:18] (5238.56s)
>> Okay? And this goes way back to like
[87:20] (5240.96s)
being five or four,
[87:23] (5243.12s)
>> okay? Way back in time. It's probably
[87:25] (5245.92s)
some kind of personality defect. You
[87:28] (5248.16s)
know, if you get me into lecture mode,
[87:31] (5251.04s)
um it's hard to stop me.
[87:33] (5253.36s)
>> And so I I enjoy it. I enjoy the
[87:37] (5257.28s)
lecture. It's a passion. It's something
[87:40] (5260.56s)
that that I dream of doing.
[87:44] (5264.64s)
If I'm out on my bicycle riding and I'll
[87:47] (5267.12s)
do a 20-mi bike ride and that bike ride
[87:49] (5269.44s)
will be me lecturing to a a fictitious
[87:53] (5273.52s)
audience,
[87:55] (5275.76s)
refining my arguments and you refining
[87:58] (5278.96s)
my the phrasiology that I use and coming
[88:01] (5281.68s)
up with sound bites. It's just something
[88:03] (5283.84s)
that is in my head. I do it. The most
[88:07] (5287.28s)
important advice I can give to anyone
[88:09] (5289.84s)
who wants to teach
[88:12] (5292.72s)
is to have a ton of fun. If you're
[88:15] (5295.76s)
having fun, everybody else will too and
[88:19] (5299.36s)
they will learn. If you're up there
[88:21] (5301.84s)
stiff and you're teaching because you
[88:24] (5304.16s)
have to teach something, uh, everybody's
[88:26] (5306.80s)
going to turn off.
[88:28] (5308.48s)
>> Absolutely.
[88:28] (5308.88s)
>> You have to have a passion for what
[88:30] (5310.72s)
you're teaching. You have to enjoy the
[88:32] (5312.64s)
the delivery of the message. You have to
[88:35] (5315.84s)
be as engaged as a human being can be in
[88:39] (5319.52s)
the delivery of communication
[88:44] (5324.00s)
and everybody else is going to go, "Oh
[88:45] (5325.92s)
yeah, I could." It's the It's the best
[88:47] (5327.76s)
way to open other people to receive
[88:50] (5330.00s)
information. If you enjoy yourself
[88:53] (5333.20s)
visibly and animatedly, everybody else
[88:56] (5336.08s)
will too.
[88:57] (5337.52s)
>> That's something that I've definitely
[88:58] (5338.80s)
seen. And uh when I the way that I could
[89:03] (5343.04s)
get an audience to be engaged is for me
[89:06] (5346.24s)
to be engaged in the subject first and
[89:10] (5350.24s)
they will mirror my engagement at least
[89:12] (5352.80s)
in the topic and then to me as a speaker
[89:15] (5355.36s)
as well because they will see how how
[89:18] (5358.64s)
much energy and how much
[89:21] (5361.12s)
uh for yeah how much passion really uh
[89:25] (5365.20s)
I've invested into the subject and into
[89:27] (5367.84s)
making it as clear as possible. So, it
[89:30] (5370.64s)
uh this advice definitely resonates.
[89:33] (5373.28s)
Have you ever trained this skill of
[89:38] (5378.16s)
clarifying information and delivering it
[89:40] (5380.64s)
to people or has it just occurred
[89:42] (5382.72s)
naturally to you and h uh you've grown
[89:46] (5386.24s)
it just by just delivering lots of
[89:48] (5388.64s)
talks? Did you grow it in any way
[89:51] (5391.60s)
deliberately?
[89:53] (5393.12s)
Um I have been asked from time to time
[89:55] (5395.04s)
to train um people in the art of public
[89:58] (5398.96s)
speaking and the art of teaching.
[90:00] (5400.96s)
>> Uh which I enjoy doing. That's great. Um
[90:03] (5403.20s)
I I enjoy doing those lectures as well.
[90:06] (5406.08s)
Nobody gave me a lecture like that.
[90:08] (5408.96s)
>> Now my father was a science teacher.
[90:12] (5412.72s)
>> Uh and he and I would have very long
[90:15] (5415.20s)
discussions on scientific and religious
[90:17] (5417.60s)
topics and philosophical topics. and he
[90:20] (5420.64s)
was a very good speaker in a one-to-one
[90:23] (5423.52s)
basis. So I think I learned a few things
[90:25] (5425.44s)
from him. I also learned an awful lot
[90:28] (5428.32s)
about um delivery
[90:31] (5431.36s)
from of all people Bill Cosby. I used to
[90:34] (5434.08s)
I used to listen to his comedy routines
[90:38] (5438.24s)
over and over. I memorized most of them
[90:41] (5441.36s)
back when I was 10 or 11 or 12. Uh, and
[90:45] (5445.76s)
if you're if you're if you follow if
[90:48] (5448.08s)
you've ever followed Bill Cosby and then
[90:50] (5450.32s)
you watch me, you will identify some
[90:52] (5452.72s)
mannerisms because I certainly
[90:54] (5454.08s)
internalized a lot of what he did. Uh,
[90:57] (5457.20s)
despite I know the the the
[91:00] (5460.16s)
controversy that came later. The man was
[91:02] (5462.64s)
a genius. Um, so there's a lot of things
[91:05] (5465.76s)
like that where I I would watch people
[91:08] (5468.16s)
who delivered things well. Have you ever
[91:10] (5470.24s)
watched a Fineman lecture?
[91:12] (5472.08s)
>> Yes. Holy cow, that guy is is he liked
[91:15] (5475.20s)
what he did.
[91:18] (5478.08s)
>> He he really enjoyed it and he he
[91:20] (5480.64s)
enjoyed delivering the message.
[91:22] (5482.80s)
>> WA is kind of a benchmark for me. Uh
[91:24] (5484.80s)
from the point of view of teaching, he
[91:26] (5486.32s)
loved this so much. You can see it in
[91:28] (5488.72s)
his writing as well. He
[91:31] (5491.60s)
>> Yeah. Uh so you learned uh to grow your
[91:37] (5497.28s)
your speaking and your delivery skills
[91:40] (5500.08s)
by osmosis from the people that you
[91:41] (5501.92s)
admire. Am I getting this right?
[91:43] (5503.28s)
>> Um yeah. And there was also just some
[91:46] (5506.16s)
internal uh personality defect. I
[91:49] (5509.04s)
remember being 5 years old and uh my
[91:52] (5512.64s)
kindergarten teacher said, "Bobby, why
[91:54] (5514.80s)
don't you sing Rudolph the Red-Nosed
[91:56] (5516.08s)
Reindeer?" It was Christmas. And you
[91:57] (5517.52s)
know how kids usually sing really soft
[91:59] (5519.76s)
when they when they have to sing in
[92:01] (5521.20s)
public? And I just belted the dog on
[92:02] (5522.96s)
thing out. I got up in front of
[92:04] (5524.48s)
everybody and just Rudolph the Red-Nosed
[92:06] (5526.72s)
Reindeer.
[92:08] (5528.72s)
Five years old. No fear of audiences.
[92:11] (5531.52s)
Never. I've never had a fear of
[92:12] (5532.88s)
audiences. Um, for whatever reason, like
[92:15] (5535.28s)
I said, some kind of weird personality
[92:17] (5537.44s)
defect.
[92:18] (5538.16s)
>> It's just an obstacle that you didn't
[92:20] (5540.16s)
have to overcome. That's it. As far as I
[92:23] (5543.12s)
can tell,
[92:23] (5543.84s)
>> I never get stage fright. Um, and I'm
[92:26] (5546.64s)
almost at my happiest when I'm on stage.
[92:29] (5549.04s)
Almost.
[92:32] (5552.32s)
where uh okay uh I'm curious about that.
[92:35] (5555.36s)
Um do you go to conferences at all at uh
[92:39] (5559.68s)
this time?
[92:41] (5561.44s)
>> Uh up until co I was an avid conference
[92:45] (5565.52s)
go. I did a lot of uh going and speaking
[92:48] (5568.32s)
and you know I traveled all over the
[92:50] (5570.24s)
world. Mhm.
[92:51] (5571.44s)
>> Um since CO, you know, that all stopped
[92:54] (5574.80s)
at CO and then once it started up again,
[92:57] (5577.84s)
I'm of a certain age where I thought,
[92:59] (5579.60s)
you know, I don't need to get on an
[93:01] (5581.52s)
airplane again. I don't need to travel
[93:04] (5584.24s)
so much anymore. Why don't I stay home
[93:06] (5586.88s)
with my wife
[93:09] (5589.04s)
whom I really enjoy being with and my,
[93:11] (5591.52s)
you know, children and grandchildren. So
[93:14] (5594.16s)
nowadays, I don't do that stuff very
[93:16] (5596.56s)
much and I used to used to do it a lot.
[93:20] (5600.24s)
What? Okay. Uh I'm curious about how you
[93:22] (5602.56s)
think about programming conferences.
[93:24] (5604.16s)
What makes a great programming
[93:26] (5606.00s)
conference to you to to you given your
[93:28] (5608.80s)
experience?
[93:30] (5610.64s)
>> What makes a great programming
[93:32] (5612.24s)
conference? Um
[93:34] (5614.64s)
somebody writing a lot of code on the
[93:37] (5617.36s)
screen.
[93:38] (5618.56s)
>> Okay.
[93:38] (5618.96s)
>> Uh demonstrating things uh very very
[93:42] (5622.64s)
well. Uh so there's been a number of
[93:45] (5625.12s)
conferences where where that happens,
[93:47] (5627.36s)
right? Somebody will put something on
[93:49] (5629.36s)
the screen. It's code on the screen. You
[93:51] (5631.12s)
got a bunch of programmers staring at
[93:53] (5633.20s)
that and then the the person is going
[93:55] (5635.52s)
through it point by point demonstrating
[93:58] (5638.72s)
some interesting principle or feature or
[94:02] (5642.64s)
maybe something about a framework or
[94:04] (5644.88s)
something about a language. But if
[94:07] (5647.20s)
there's it's a bunch of programmers,
[94:09] (5649.04s)
right? If there's code on the screen,
[94:10] (5650.72s)
you've got their attention. The worst
[94:12] (5652.80s)
thing is when somebody gets up on the on
[94:15] (5655.04s)
the stage and is talking about something
[94:18] (5658.64s)
philosophical blahy blah at least for
[94:21] (5661.36s)
me, you know, I just turn that off.
[94:23] (5663.36s)
Okay, where's the code? Show me the
[94:25] (5665.92s)
>> Um, so that's that's from my point of
[94:28] (5668.08s)
view. Whenever I gave talks, uh, there
[94:30] (5670.80s)
was code on the screen or there was
[94:32] (5672.48s)
something technical on the screen,
[94:34] (5674.56s)
something that would draw a programmer
[94:36] (5676.32s)
in. uh and that's what I enjoy talking
[94:39] (5679.52s)
about enjoy uh presenting
[94:42] (5682.00s)
>> anything else other other than uh
[94:44] (5684.96s)
writing and demonstrating code this is
[94:46] (5686.80s)
intuitively how I've uh how I've held
[94:51] (5691.60s)
pretty much all my all my conference
[94:53] (5693.28s)
talks they're like just like live coding
[94:55] (5695.92s)
uh but I'm uh wondering
[94:59] (5699.92s)
what you felt made a great programming
[95:02] (5702.80s)
conference
[95:08] (5708.80s)
aside from the demonstration of code, is
[95:12] (5712.24s)
there anything else that made you feel,
[95:14] (5714.80s)
oh, that was a great that was a great
[95:16] (5716.64s)
event. I would go there again.
[95:23] (5723.28s)
There have been a a a number of
[95:25] (5725.20s)
conferences I've been to where a a
[95:28] (5728.16s)
keynote speaker has been invited
[95:31] (5731.44s)
>> and it's a keynote speaker who had
[95:35] (5735.28s)
who who's very experienced
[95:37] (5737.60s)
and had
[95:39] (5739.68s)
a significant message to deliver.
[95:43] (5743.76s)
>> Uh so I I once attended a conference
[95:45] (5745.84s)
where Tom DeMarco gave a speech and he
[95:48] (5748.24s)
had no code on the screen but it didn't
[95:49] (5749.76s)
matter because it was Tom DeMarco and he
[95:52] (5752.48s)
had a message and the message was a good
[95:53] (5753.92s)
message. Um, I've been to into
[95:57] (5757.60s)
conferences where Grady Booch is a
[96:00] (5760.24s)
keynote speaker.
[96:01] (5761.60s)
>> And again, no code on the screen, but a
[96:03] (5763.52s)
good message, a good message about being
[96:06] (5766.00s)
a software developer or a software
[96:07] (5767.84s)
manager or a certain kind of discipline.
[96:10] (5770.48s)
Um, those I I count as being very
[96:14] (5774.56s)
worthwhile conferences to have been to.
[96:18] (5778.24s)
But what makes a conference worthwhile
[96:21] (5781.60s)
apart from all of that is just hanging
[96:24] (5784.88s)
out with a bunch of guys who want to go
[96:26] (5786.24s)
to conferences
[96:28] (5788.96s)
>> and you know hanging out in there and
[96:30] (5790.40s)
then sitting next to him and say hey
[96:31] (5791.76s)
let's write some code come on show me
[96:33] (5793.92s)
this new language that you've been up
[96:35] (5795.12s)
to. the uh it's the social activity of
[96:38] (5798.24s)
getting a bunch of programmers in a room
[96:40] (5800.64s)
and or or in a in a building uh and then
[96:43] (5803.36s)
letting them interact with each other
[96:45] (5805.12s)
and then okay you go to a talk every
[96:46] (5806.96s)
once in a while and okay you go to a
[96:48] (5808.56s)
keynote but mostly it's just that
[96:51] (5811.12s)
camaraderie that's the best thing about
[96:53] (5813.04s)
a good software conference. Gracehopper
[96:57] (5817.12s)
uh convened the very first software
[97:01] (5821.20s)
conference ever in 1950 something or
[97:04] (5824.16s)
other. Uh and it was it was a conference
[97:06] (5826.88s)
about the possibility of having
[97:10] (5830.24s)
compilers because back then they were
[97:12] (5832.32s)
just doing machine language.
[97:14] (5834.64s)
And um she says of that conference that
[97:18] (5838.40s)
it was a great conference. I mean a lot
[97:19] (5839.84s)
of good talks and and you know people
[97:22] (5842.24s)
showing possibilities for how you could
[97:24] (5844.24s)
do you know arithmetic expressions in a
[97:27] (5847.28s)
language. Nobody had ever thought of
[97:28] (5848.80s)
that before. Really interesting stuff.
[97:31] (5851.20s)
But the most important things happened
[97:33] (5853.04s)
at the bar between between 1000 p.m. and
[97:38] (5858.08s)
>> Yeah.
[97:39] (5859.84s)
>> So that's really where the conference
[97:41] (5861.92s)
happens.
[97:42] (5862.80s)
>> Okay.
[97:44] (5864.80s)
Nice. I'll take these uh
[97:50] (5870.64s)
U. Robert, I wanted to be respectful of
[97:54] (5874.00s)
your time. So, uh as we draw this
[97:58] (5878.40s)
conversation to a wrap, uh is there
[98:00] (5880.88s)
anything that you would like to share
[98:03] (5883.60s)
with my audience? Maybe a a thought, a
[98:06] (5886.00s)
quip, a piece of advice. uh the famous
[98:08] (5888.80s)
kind of billboard that other podcasters
[98:11] (5891.84s)
seem to be asking like if you had a
[98:13] (5893.36s)
billboard that could be seen by millions
[98:15] (5895.36s)
of people what would you write on it?
[98:16] (5896.72s)
Any any anything of that sort that you
[98:18] (5898.80s)
would like to say to my audience?
[98:22] (5902.08s)
>> Well, probably um
[98:26] (5906.72s)
appropriate for the times we are in.
[98:31] (5911.12s)
Don't be afraid of the future.
[98:34] (5914.32s)
>> Be great.
[98:36] (5916.08s)
>> Good one. A lot of programmers are
[98:37] (5917.92s)
afraid of this AI thing and uh they're
[98:41] (5921.36s)
paralyzed like, "Oh my god, I'm going to
[98:43] (5923.12s)
be left without a job. What am I going
[98:44] (5924.40s)
to learn next? How should I sharpen my
[98:46] (5926.56s)
skills? Am I going to be stressed for
[98:48] (5928.56s)
the rest of my career?"
[98:50] (5930.64s)
Good. That's a good one. That's a good
[98:53] (5933.68s)
one. Robert, it's been a pleasure. Thank
[98:56] (5936.24s)
you so much for being so gracious with
[98:57] (5937.84s)
your time. I'm going to leave links
[99:00] (5940.48s)
>> I'm going to leave a lot uh a lot of
[99:02] (5942.08s)
links because we have a lot of book
[99:03] (5943.92s)
recommendations and pieces of advice and
[99:05] (5945.68s)
people that uh are worth following and
[99:08] (5948.24s)
worth listening to. Robert, it's been a
[99:10] (5950.64s)
privilege. Thank you so much for making
[99:12] (5952.24s)
the time. Well,
[99:13] (5953.52s)
>> I appreciate it. Thank you.