Latest / The Pragmatic Engineer / The Philosophy of Software Design – with John Ousterhout
Transcript
- 0:00SPEAKER_00: Right now, there is a huge explosion of AI and LLM tools.
- 0:03SPEAKER_00: How might this change software engineering?
- 0:06There's things that seem relatively clear and things that seem
- 0:08less clear.
- 0:09I think on the relatively clear side is that the AI tools will
- 0:12make it easier to
- 0:13SPEAKER_01: churn out low-level code.
- 0:14SPEAKER_01: You should call it autocomplete.
- 0:15SPEAKER_01: Autocomplete will get better and better.
- 0:17SPEAKER_01: It could actually be reasonably high-quality code that gets churned out.
- 0:20SPEAKER_01: So it seems like that will probably happen.
- 0:22SPEAKER_01: And the big question is,
- 0:23to what degree can the AI tools actually replace the
- 0:26higher-level design tasks?
- 0:28SPEAKER_01: I don't know the answer to that.
- 0:30So far,
- 0:30I don't see anything in the current tools that makes me think
- 0:34they're going to do that.
- 0:36SPEAKER_01: But what's interesting about this,
- 0:37SPEAKER_01: I think,
- 0:37SPEAKER_01: is that by handling more and more of the low-level programming tasks,
- 0:42SPEAKER_01: what software designers do is going to be more and more design.
- 0:45SPEAKER_01: I think software design is going to become more and more important.
- 0:48That'll be a larger and larger fraction of where developers
- 0:51spend their time,
- 0:52which makes it even more sad that we don't really teach
- 0:54software design at our
- 0:55SPEAKER_01: universities at all.
- 0:56John Osterhauld is the author of a philosophy of software
- 0:58design and currently a
- 1:00SPEAKER_00: professor of computer science at Stanford.
- 1:02SPEAKER_00: John Kohl founded two tech companies,
- 1:04SPEAKER_00: worked at some microsystems,
- 1:05SPEAKER_00: created a TCL scripting language,
- 1:07and invented the RAF consensus algorithm that is used across
- 1:10databases and systems
- 1:11SPEAKER_00: like MongoDB,
- 1:12SPEAKER_00: CockroachDB,
- 1:13SPEAKER_00: Kafka,
- 1:13SPEAKER_00: and others.
- 1:14SPEAKER_00: In our conversation,
- 1:15we cover the impact of AI on software engineering and why
- 1:19software design could
- 1:19SPEAKER_00: become more important than before.
- 1:22SPEAKER_00: the concept of deep and shallow modules,
- 1:24and why deep modules are so important to deal with complexity
- 1:26in software,
- 1:28SPEAKER_00: John's advice on error handling,
- 1:29SPEAKER_00: commenting,
- 1:30SPEAKER_00: and why he suggests avoiding test-driven development,
- 1:33SPEAKER_00: and many more topics.
- 1:35SPEAKER_00: If you're interested in practical software design tactics and strategies,
- 1:38SPEAKER_00: and want to take a step back from tactical coding,
- 1:41SPEAKER_00: this episode is for you.
- 1:42If you enjoy the show,
- 1:43please subscribe to the podcast on any podcast platform and on YouTube.
- 1:47SPEAKER_00: Welcome to the podcast.
- 1:48SPEAKER_00: Thank you.
- 1:49SPEAKER_00: I'm excited to be here.
- 1:50SPEAKER_00: You have been working in academia at Stanford for quite a while,
- 1:53SPEAKER_00: but you were in the industry beforehand.
- 1:55SPEAKER_00: What made you change from working at tech companies,
- 1:58SPEAKER_00: from founding your own companies to academia?
- 2:00SPEAKER_00: And why did you do it?
- 2:03SPEAKER_01: I've always wanted to do both academia and industry.
- 2:07SPEAKER_01: When I got my PhD,
- 2:08I debated what to do because I love the creative freedom of
- 2:13academia and I love
- 2:14SPEAKER_01: teaching also.
- 2:15SPEAKER_01: But I also love building real software.
- 2:19SPEAKER_01: Coding is one of the passions that I live for in my life.
- 2:22SPEAKER_01: And so I always kind of figured I'd probably do both over my career.
- 2:25SPEAKER_01: But when I got my PhD,
- 2:26SPEAKER_01: the advice I was given was,
- 2:27SPEAKER_01: if you're going to do both,
- 2:29it's always better to do academia first because it's easier to
- 2:31switch from academia
- 2:33SPEAKER_01: to industry than the other way around.
- 2:35SPEAKER_01: So I went to Berkeley, had a fabulous 14 years there.
- 2:37But over time,
- 2:39this nagging feel for wanting to build commercial software had
- 2:42built up.
- 2:43SPEAKER_01: And so I finally decided to take the plunge.
- 2:44SPEAKER_01: I gave up my position at Berkeley,
- 2:46SPEAKER_01: moved to Silicon Valley,
- 2:47SPEAKER_01: worked at Sun for a few years,
- 2:48SPEAKER_01: started a couple of only moderately successful companies,
- 2:52SPEAKER_01: and had a great time doing that.
- 2:54SPEAKER_01: Just learned a ton of stuff doing startups.
- 2:58But over time,
- 2:59the nagging of the call of industry kind of built up in me.
- 3:03SPEAKER_01: And I gradually realized,
- 3:05SPEAKER_01: although I liked doing startups,
- 3:07SPEAKER_01: that I think being a professor,
- 3:09SPEAKER_01: that's my real true passion in life.
- 3:12So after doing startups for 14 years,
- 3:14I was fortunate enough to get a position at Stanford.
- 3:16And I've had another 14 or 15 years back at Stanford where I've
- 3:19been really happy.
- 3:20SPEAKER_01: So it's been really fun, really fun getting to see both sides.
- 3:24SPEAKER_01: And honestly, I think...
- 3:25SPEAKER_01: You know, doing both has actually made me better at both.
- 3:29SPEAKER_00: What you see,
- 3:30SPEAKER_00: I talk with a lot of people,
- 3:32SPEAKER_00: obviously,
- 3:33who are only in the industry and maybe they're thinking of one
- 3:36day doing academia.
- 3:38SPEAKER_00: I at some point thought of this myself.
- 3:40SPEAKER_00: My dad is a university teacher, was a university teacher.
- 3:44SPEAKER_00: And obviously there's people in academia.
- 3:45SPEAKER_00: Having them both,
- 3:47SPEAKER_00: what are big differences between,
- 3:49SPEAKER_00: you know,
- 3:49SPEAKER_00: as we call the tech world,
- 3:50SPEAKER_00: which is industry and academia?
- 3:52SPEAKER_00: Yeah.
- 3:53Well,
- 3:53first,
- 3:53it wasn't as different as I thought it was going to be when I
- 3:56went to industry.
- 3:57SPEAKER_01: Really?
- 3:59SPEAKER_01: Because in both cases, you're working with a relatively small team.
- 4:04You're trying to do something relatively new,
- 4:08trying to build software that really works.
- 4:09SPEAKER_01: Even when I was in academia,
- 4:10SPEAKER_01: we tried to build stuff that really works,
- 4:12SPEAKER_01: not just throwaway research prototypes.
- 4:15SPEAKER_01: So in many ways, it wasn't that different.
- 4:17SPEAKER_01: But in other ways,
- 4:18SPEAKER_01: it was in that you deal with a much broader spectrum of people,
- 4:21SPEAKER_01: you know,
- 4:22SPEAKER_01: salespeople and marketing people and financers and venture capitalists.
- 4:26That was one of the fun things about it is seeing a much
- 4:28greater diversity of people.
- 4:30SPEAKER_01: I would say the difference that contributed to my going back to academia,
- 4:35SPEAKER_01: I would say one of the downsides of industry,
- 4:39is that there's tremendous pressure in startups particularly to
- 4:43make yourself look
- 4:44SPEAKER_01: bigger and better than you are.
- 4:45SPEAKER_01: You know, you're trying to survive and get funding.
- 4:48SPEAKER_01: And so there's a lot of pressure to...
- 4:52SPEAKER_01: spin your company and exaggerate and market yourself.
- 4:57SPEAKER_01: I mean, everybody does it to some degree.
- 4:59SPEAKER_01: Some people do it in ways so stream it's illegal.
- 5:01SPEAKER_01: They get in trouble.
- 5:03SPEAKER_01: But that kind of bothered me.
- 5:06And within my companies,
- 5:08of course,
- 5:08we had to market ourselves externally.
- 5:10SPEAKER_01: But internally, we tried to be very honest.
- 5:12I don't want to hear lies and spinning internally because that
- 5:14puts our company at
- 5:15SPEAKER_01: risk if you do that.
- 5:17SPEAKER_01: But nonetheless,
- 5:18SPEAKER_01: the thing I like about academia is you do a project,
- 5:21SPEAKER_01: some of them work,
- 5:22SPEAKER_01: some of them don't.
- 5:23If a project doesn't work,
- 5:24you just say,
- 5:25oops,
- 5:26okay,
- 5:26that wasn't a good idea.
- 5:27SPEAKER_01: Here's why.
- 5:28SPEAKER_01: And you go on to the next thing.
- 5:29In a company,
- 5:30if it's not working,
- 5:31you can't really say,
- 5:33oops,
- 5:33that didn't work.
- 5:34SPEAKER_01: Sorry, everybody, we're shutting down tomorrow.
- 5:35SPEAKER_01: You try and somehow figure some way around it.
- 5:37So I think that was the thing,
- 5:39the one thing about industry that I liked least.
- 5:42SPEAKER_00: This episode was brought to you by CodeRabbit,
- 5:44the AI code review platform transforming how engineering teams
- 5:47shift faster without
- 5:48SPEAKER_00: sacrificing code quality.
- 5:50SPEAKER_00: Code reviews are critical, but time consuming.
- 5:53CodeRabbit acts as your AI co-pilot providing instant code
- 5:56review comments and
- 5:57SPEAKER_00: potential impacts of every pull request.
- 6:00SPEAKER_00: Beyond just flagging issues,
- 6:02CodeRabbit provides one-click fix solutions and lets you define
- 6:05custom code quality
- 6:06SPEAKER_00: rules using AST graph patterns,
- 6:08SPEAKER_00: catching subtle issues that traditional static analysis tools might miss.
- 6:13SPEAKER_00: CodeRabbit has so far reviewed more than 5 million pull requests,
- 6:16SPEAKER_00: is installed on 1 million repositories,
- 6:19SPEAKER_00: and is used by 50,000 open source projects.
- 6:22Try CodeRabbit free for one month at coderabbit.ai using the
- 6:26code pragmatic.
- 6:27SPEAKER_00: That is coderabbit.ai and use the code pragmatic.
- 6:33This episode is brought to you by modal,
- 6:34the cloud platform that makes AI development simple.
- 6:37SPEAKER_00: Need GPUs without the headache.
- 6:39SPEAKER_00: With modal,
- 6:40SPEAKER_00: just add one line of code to any Python function and boom,
- 6:43SPEAKER_00: it's running in the cloud on your choice of CPU or GPU.
- 6:46SPEAKER_00: And the best part, you only pay for what you use.
- 6:50SPEAKER_00: With sub-second container start and instant scaling to thousands of GPUs,
- 6:54SPEAKER_00: it's no wonder companies like Suno,
- 6:55SPEAKER_00: Ramp,
- 6:56SPEAKER_00: and Substack already trust modal for their AI applications.
- 6:59SPEAKER_00: Getting an H100 is just a pip install away.
- 7:02SPEAKER_00: Go to modal.com slash pragmatic to get $30 in free credits every month.
- 7:07SPEAKER_00: That is modal.com slash pragmatic.
- 7:11SPEAKER_00: Now,
- 7:11SPEAKER_00: thanks to you having worked in academia as well,
- 7:14SPEAKER_00: and you taught a course,
- 7:16SPEAKER_00: which we'll later talk about,
- 7:17SPEAKER_00: but you wrote this book,
- 7:19SPEAKER_00: The Philosophy of Software Design.
- 7:20And a lot of people in the tech world who I talk with point to
- 7:23this book as one of
- 7:25SPEAKER_00: the best books that gives them specific,
- 7:29SPEAKER_00: actionable things,
- 7:30SPEAKER_00: ways to think about software design.
- 7:32SPEAKER_00: I just want to go into some of the things into the book.
- 7:35SPEAKER_00: People who've read it will find this refreshing,
- 7:37SPEAKER_00: and people who haven't might find it as new ideas.
- 7:40SPEAKER_00: In the very beginning of the book,
- 7:42SPEAKER_00: in chapter,
- 7:43SPEAKER_00: I think two or three,
- 7:45SPEAKER_00: in the first 10 or 15 pages,
- 7:46SPEAKER_00: you write about something called tactical tornadoes.
- 7:49SPEAKER_00: And let me just quote a little bit from this.
- 7:53SPEAKER_00: You wrote,
- 7:53a tactical tornado is a prolific programmer who pumps out code
- 7:56faster than others works,
- 7:58SPEAKER_00: but does it in totally tactical fashion.
- 8:00SPEAKER_00: When it comes to implementing a quick feature,
- 8:03SPEAKER_00: nobody gets it done faster than a tactical tornado.
- 8:05SPEAKER_00: In some organizations, management treats tactical tornadoes as heroes.
- 8:09SPEAKER_00: However,
- 8:09SPEAKER_00: tactical tornadoes leave a wave of destruction behind,
- 8:13and typically other engineers must clean up the messes left by
- 8:15this tactical tornado.
- 8:16So I wanted to ask you,
- 8:18first of all,
- 8:18how did you come across your first tactical tornado?
- 8:22SPEAKER_00: And...
- 8:23Why do you think these types of folks are still around in most companies?
- 8:28Because I had an aha moment when I was like,
- 8:30oh yeah,
- 8:31I know the tactical tornadoes as well.
- 8:33I can't point to a specific incident or person,
- 8:36and I wouldn't want to identify them anyway.
- 8:38SPEAKER_01: But I've encountered them over my career.
- 8:40I bet everybody who has significant software development
- 8:43experience has encountered
- 8:44SPEAKER_01: these people over your career.
- 8:46SPEAKER_01: And just kind of observing them and the frustration with that,
- 8:51SPEAKER_01: I think it's just a particular personality type.
- 8:54SPEAKER_01: There are people who are very detail-focused and closers,
- 8:59SPEAKER_01: want to get absolutely everything right,
- 9:00SPEAKER_01: and they finish everything.
- 9:02And there's people who love getting started on projects and
- 9:06doing the first 80% or 90%,
- 9:08SPEAKER_01: but that last 10% or 20% doesn't matter to them so much,
- 9:11SPEAKER_01: and they're not.
- 9:13You know,
- 9:13there's just like there's neater people and there's sloppier
- 9:16people in the world.
- 9:16SPEAKER_01: So, the technical owners are just sort of sloppy.
- 9:18SPEAKER_01: They don't care about, you know, leaving cruft behind.
- 9:21SPEAKER_01: It doesn't really bother them at all.
- 9:23SPEAKER_01: It's just a personality type.
- 9:25SPEAKER_01: So,
- 9:25SPEAKER_01: I suspect they'll always be there,
- 9:27SPEAKER_01: particularly because some organizations value speed above all else.
- 9:33SPEAKER_00: Especially startups, right?
- 9:34SPEAKER_01: Yeah, a lot of startups.
- 9:37There are startups that are probably completely staffed by
- 9:39tactical tornadoes.
- 9:40SPEAKER_00: You call them tactical tornadoes,
- 9:41but some of the synonyms that came into my mind as I was
- 9:46thinking of what people use,
- 9:47SPEAKER_00: sometimes they use a 10x engineer.
- 9:49SPEAKER_00: Especially when management sees, oh, they just get things faster.
- 9:52SPEAKER_00: Sometimes,
- 9:53SPEAKER_00: you know,
- 9:53like it's a hacky way of doing things or someone who just hacks
- 9:56quickly or at some point,
- 9:58SPEAKER_00: maybe a decade ago,
- 9:59SPEAKER_00: people call it a hacker,
- 10:01SPEAKER_00: but in a way of working fast.
- 10:02SPEAKER_00: But I don't think we have that anymore.
- 10:04SPEAKER_00: But there are a lot of cases.
- 10:06SPEAKER_00: It is a positive thing.
- 10:08SPEAKER_00: Indeed.
- 10:09SPEAKER_00: Well, I was seen as a positive initially.
- 10:12SPEAKER_01: When I think of 10X engineers and the way Google defined it,
- 10:15SPEAKER_01: I don't think of these as tactical tornadoes.
- 10:17I think of these are people who come up with the really clean
- 10:20designs that can be
- 10:22SPEAKER_01: implemented in very small amounts of code.
- 10:25SPEAKER_01: And so they might actually write less code per day than other people,
- 10:30SPEAKER_01: but the functionality that they implement is way higher,
- 10:34SPEAKER_01: and it comes with higher stability and evolvability and so on.
- 10:37SPEAKER_01: So to me, at least, that's the 10X engineer.
- 10:41SPEAKER_00: I agree with you.
- 10:42I'll just add the note that I think the 10x engineer is so
- 10:45ambiguous that it means
- 10:46SPEAKER_00: different for every person.
- 10:48And especially so when I've seen it was mostly less technical
- 10:53CEOs refer to my 10x
- 10:55SPEAKER_00: engineer who was a tactical tornado because what they saw is,
- 10:58SPEAKER_00: oh,
- 10:58SPEAKER_00: I'm getting output.
- 10:59SPEAKER_00: They're not saying no, they're building it.
- 11:01SPEAKER_00: But of course,
- 11:02SPEAKER_00: they had trouble understanding the tech depth that is going into there,
- 11:05SPEAKER_00: how it's slowing others down.
- 11:06And some of the people that you talked about in this
- 11:08environment might have not
- 11:09been perceived as a 10x engineer by this person who is not that
- 11:14close to the code.
- 11:15SPEAKER_00: And I totally agree with you, by the way.
- 11:17SPEAKER_00: But this is probably a good reminder of everything is relative, right?
- 11:22SPEAKER_00: Everything is based on your vantage point.
- 11:23If you are close to the code,
- 11:25you're technical,
- 11:26you will value other things.
- 11:27SPEAKER_00: You should value other things.
- 11:28SPEAKER_00: Yeah.
- 11:30SPEAKER_01: You know, I think a lot of this comes down to strategic versus tactical.
- 11:34SPEAKER_01: Again,
- 11:34there are people who value all the short-term stuff and there
- 11:36are people who value,
- 11:38SPEAKER_01: place more emphasis on the long-term stuff.
- 11:40SPEAKER_01: And my view of design is all about the long-term stuff.
- 11:43But as you've said,
- 11:43there are many people who think of it all in terms of
- 11:46short-term stuff.
- 11:47And so I can see how they would have a different idea of what a
- 11:4910X engineer is.
- 11:51SPEAKER_00: And speaking of long-term versus short-term,
- 11:53SPEAKER_00: one thing that came to my mind,
- 11:55SPEAKER_00: rereading this tactical tornado part,
- 11:58SPEAKER_00: is right now there's a huge explosion of AI and LLM tools,
- 12:02SPEAKER_00: which are,
- 12:03SPEAKER_00: as you're probably seeing it,
- 12:05SPEAKER_00: they are really good at generating code rapidly.
- 12:07SPEAKER_00: A little bit like the tactical tornado, to be honest.
- 12:09SPEAKER_00: You can prompt them,
- 12:10SPEAKER_00: they can do short,
- 12:11SPEAKER_00: they can do long,
- 12:11SPEAKER_00: they can do autocomplete,
- 12:13SPEAKER_00: they can do all skeletons.
- 12:14SPEAKER_00: I was wondering,
- 12:16SPEAKER_00: so far what you've observed,
- 12:17SPEAKER_00: what do you think the long-term impact of these tools,
- 12:21SPEAKER_00: if we assume that this is how they're going to stay,
- 12:22SPEAKER_00: let's just assume that,
- 12:24SPEAKER_00: you know,
- 12:25every engineer will have tactical tornadoes at their fingertips
- 12:28and who do not say
- 12:29SPEAKER_00: no and they will,
- 12:30SPEAKER_00: you know,
- 12:30SPEAKER_00: churn out code.
- 12:32SPEAKER_00: How might this change software engineering personally?
- 12:37SPEAKER_01: That's a really interesting question, and I wish I knew the answer.
- 12:41SPEAKER_01: I don't.
- 12:41SPEAKER_01: I can only guess.
- 12:43SPEAKER_01: I think we're going to see big changes over the next five to ten years,
- 12:47SPEAKER_01: and it's really hard to predict what direction they're going to go.
- 12:51There's things that seem relatively clear and things that seem
- 12:53less clear.
- 12:54I think on the relatively clear side is that the AI tools will
- 12:58make it easier to
- 12:59SPEAKER_01: churn out low-level code.
- 13:01SPEAKER_01: As you call it, autocomplete.
- 13:02SPEAKER_01: Autocomplete will get better and better.
- 13:04SPEAKER_01: And I think it won't necessarily be sort of tactical tornado stuff.
- 13:08SPEAKER_01: It could actually be reasonably high-quality code that gets churned out.
- 13:11SPEAKER_01: So it seems like that will probably happen.
- 13:14SPEAKER_01: And the big question is,
- 13:17to what degree can the AI tools actually replace the
- 13:20higher-level design tasks?
- 13:23SPEAKER_01: And I don't know the answer to that.
- 13:26So far,
- 13:26I don't see anything in the current tools that makes me think
- 13:31they're going to do that.
- 13:32SPEAKER_01: But never underestimate what could happen.
- 13:37SPEAKER_01: But what's interesting about this,
- 13:38SPEAKER_01: I think,
- 13:39SPEAKER_01: is that by handling more and more of the low-level programming tasks that
- 13:45SPEAKER_01: What software designers do is going to be more and more design.
- 13:49SPEAKER_01: So I think software design is going to become more and more important.
- 13:54That'll be a larger and larger fraction of where developers
- 13:56spend their time,
- 13:58which makes it even more sort of sad that we don't really teach
- 14:02software design in
- 14:02SPEAKER_01: our universities at all.
- 14:04So the skills we're teaching students may actually be the
- 14:07skills that are going to
- 14:08SPEAKER_01: be replaced by the AI tools.
- 14:12SPEAKER_00: Can we just double click on software design?
- 14:16SPEAKER_00: How do you see software design?
- 14:18SPEAKER_00: What is it and why is it important?
- 14:21SPEAKER_00: And the reason I'm asking the question,
- 14:23SPEAKER_00: it might seem like a naive question,
- 14:25but these days you really can get started building an
- 14:28application by taking a template,
- 14:32SPEAKER_00: using it.
- 14:33You will soon be able to prompt an AI tool that will generate
- 14:38things for you.
- 14:39SPEAKER_00: How do you think about it?
- 14:40SPEAKER_00: software design?
- 14:43SPEAKER_00: It's abstract, right?
- 14:44SPEAKER_00: By nature.
- 14:44SPEAKER_01: So, well, I think of it as it's a decomposition problem.
- 14:50SPEAKER_01: It's how do you take a large,
- 14:52complicated system and divide it up into smaller units that you
- 14:56could implement
- 14:57SPEAKER_01: relatively independently?
- 14:59SPEAKER_01: And by the way,
- 15:00SPEAKER_01: to me,
- 15:02SPEAKER_01: when I give talks,
- 15:02SPEAKER_01: I often ask people,
- 15:03SPEAKER_01: what do you think is the most important idea at all of computer science?
- 15:06SPEAKER_01: And ask the audience.
- 15:07SPEAKER_01: To me, I think decomposition.
- 15:09That's the key thing that threads through everything we do in
- 15:11computer science.
- 15:12SPEAKER_01: How do you take large, complicated problems and break them up?
- 15:14SPEAKER_01: And that's design.
- 15:15SPEAKER_01: And then implementation is when you go about the individual pieces.
- 15:19But again,
- 15:19you may do more design of those to break them up into still
- 15:22smaller pieces.
- 15:23SPEAKER_01: But that's the way I think about software design.
- 15:26SPEAKER_00: Now,
- 15:26an interesting thing that I've noticed over the past few
- 15:29decades is about 20 years
- 15:32SPEAKER_00: or so,
- 15:33SPEAKER_00: maybe a little bit more,
- 15:34there was a lot of focus on architectural practices that felt
- 15:38closer to software design.
- 15:39Things like TDD,
- 15:40test-driven development,
- 15:42architecture approaches like architecture patterns.
- 15:45SPEAKER_00: I think they were called design patterns,
- 15:46SPEAKER_00: a gang of four,
- 15:47SPEAKER_00: different like factory,
- 15:48SPEAKER_00: et cetera,
- 15:49SPEAKER_00: patterns.
- 15:49SPEAKER_00: However...
- 15:51SPEAKER_00: The focus seems to be moving away, at least in the industry.
- 15:56SPEAKER_00: There's fewer people referencing these models, these ideas.
- 16:00From your observation,
- 16:01both in academia and industry,
- 16:03why do you think this might have been?
- 16:04Why did we have such a big focus on architecture design topics
- 16:0910 or 20 years ago?
- 16:11And maybe just we're talking about it less or maybe even
- 16:14thinking about it less.
- 16:15SPEAKER_00: Yeah.
- 16:15SPEAKER_01: Well,
- 16:15SPEAKER_01: you know,
- 16:16SPEAKER_01: of course,
- 16:16there's always fads that everybody gets excited about and they
- 16:18gradually fade away.
- 16:20SPEAKER_01: So maybe that's part of it.
- 16:22SPEAKER_01: Now, to me, the things you mentioned, TDD and patterns...
- 16:27SPEAKER_01: I don't think of those as design, certainly not TDD.
- 16:32In fact,
- 16:33I would argue if you want to get into a TDD discussion,
- 16:35we could have that.
- 16:35SPEAKER_01: But I would argue it actually works against design.
- 16:38SPEAKER_01: Design patterns, that's an alternative to design.
- 16:41That is,
- 16:42rather than designing something,
- 16:43you pull something off the shelf.
- 16:46SPEAKER_01: Where it works, it works.
- 16:47Certainly,
- 16:47there's areas where,
- 16:48of course,
- 16:49if a pattern works,
- 16:50you should just use it.
- 16:51But to me,
- 16:51that only addresses a tiny,
- 16:53tiny fraction of what I think of as software design.
- 16:56There's so much more to design than just picking one of a half
- 16:59a dozen patterns.
- 17:00SPEAKER_00: When you're building new software and you're saying,
- 17:05SPEAKER_00: okay,
- 17:05SPEAKER_00: I'm going to start to design,
- 17:07SPEAKER_00: how do you start designing?
- 17:09SPEAKER_00: Is it sitting down pen and paper?
- 17:11SPEAKER_00: And if we can talk about something specific,
- 17:14SPEAKER_00: I think that could be even useful if there was a project that you did.
- 17:18SPEAKER_00: Because I'm just really curious about your thinking.
- 17:21SPEAKER_01: I can't give a recipe for design.
- 17:23SPEAKER_01: I wish I could.
- 17:24SPEAKER_01: Follow these steps in this order and you'll get a great design.
- 17:28SPEAKER_01: I wish I could.
- 17:29But,
- 17:29you know,
- 17:30there's two general approaches,
- 17:32each of which has its pitfalls.
- 17:33SPEAKER_01: This is the top-down approach and the bottom-up approach.
- 17:36SPEAKER_01: I think what people tend to use,
- 17:38particularly less experienced engineers or people who are in a
- 17:43domain that they're
- 17:44SPEAKER_01: not familiar with,
- 17:45SPEAKER_01: is you do bottom-up.
- 17:46SPEAKER_01: You just say, okay...
- 17:48SPEAKER_01: I'm going to need this functionality in this system.
- 17:50I have no idea what the overall system is going to look like,
- 17:52but I need this piece.
- 17:53SPEAKER_01: I'll just build this piece.
- 17:55SPEAKER_01: Then you pick another piece and you build it.
- 17:57Then you start trying to put the pieces together and you
- 17:59gradually layer in your design.
- 18:02SPEAKER_01: That's the bottom-up approach.
- 18:04The top-down approach is you start at the top and you try and
- 18:07break the system up
- 18:08into what you think are relatively independent components and
- 18:10then decompose those
- 18:11SPEAKER_01: until you eventually get something that you can design.
- 18:16SPEAKER_01: And by the way,
- 18:17SPEAKER_01: in the 1970s,
- 18:18SPEAKER_01: back when I was in graduate school,
- 18:19there was a big discussion about should you do design top-down
- 18:22or bottom-up,
- 18:22SPEAKER_01: and people argued about it.
- 18:24SPEAKER_01: My personal opinion is that it's hard to do either one pure,
- 18:27that the actual process of design is some combination where you
- 18:31think about big pieces,
- 18:32SPEAKER_01: and then you start thinking about some little pieces,
- 18:34SPEAKER_01: and you build some stuff,
- 18:35SPEAKER_01: and you discover it actually didn't work very well,
- 18:37SPEAKER_01: so you throw it away,
- 18:38SPEAKER_01: and you build some more stuff.
- 18:39SPEAKER_01: And it's this iterative kind of back-and-forth process.
- 18:42SPEAKER_01: Yeah.
- 18:45SPEAKER_00: It's interesting that you mentioned the two ways,
- 18:48SPEAKER_00: because in the book,
- 18:49the book itself starts with you writing how design is all about
- 18:54managing complexity,
- 18:56SPEAKER_00: and then you bring these two approaches.
- 18:58SPEAKER_00: What were the two approaches to complexity?
- 19:00So one is that there are certain things you can do in design
- 19:03that simply eliminate
- 19:04SPEAKER_01: complexity completely.
- 19:06SPEAKER_01: Eliminating working on special cases and things like that.
- 19:09SPEAKER_01: So those are the best, most powerful approaches.
- 19:12SPEAKER_01: But you can't eliminate all complexity.
- 19:15SPEAKER_01: So then the second approach is where you use modular design,
- 19:19SPEAKER_01: where you basically try and hide the complexity.
- 19:21SPEAKER_01: That is,
- 19:21you take things that are relatively complicated and put them
- 19:24off to the side where
- 19:25SPEAKER_01: somebody can solve this problem and deal with this complexity,
- 19:28SPEAKER_01: and nobody else in the system has to be aware of that complexity.
- 19:32SPEAKER_01: So those were the two overall ways of dealing with complexity.
- 19:37And good software design will help us deal,
- 19:42like,
- 19:43wrangle complexity,
- 19:44right?
- 19:44SPEAKER_00: Do I sense that that's one of the... It will do with both of those.
- 19:47SPEAKER_01: It will both give you ideas for how to eliminate it and also for how to,
- 19:51SPEAKER_01: again,
- 19:52modularize it so most people don't have to be aware of most of
- 19:55the complexity.
- 19:57One interesting idea that resonated with the book is you wrote
- 20:01about how it's worth
- 20:03SPEAKER_00: designing things twice.
- 20:05SPEAKER_00: In fact, this is a whole chapter in the book, chapter 11.
- 20:07SPEAKER_00: It's called Designing It Twice.
- 20:09SPEAKER_00: And you wrote,
- 20:10SPEAKER_00: I'll quote from you,
- 20:12SPEAKER_00: Unfortunately,
- 20:12I often see smart people who insist implementing the first idea
- 20:15that comes to mind,
- 20:16SPEAKER_00: and this causes them to underperform their true potential.
- 20:19SPEAKER_00: It also makes them frustrating to work with.
- 20:23SPEAKER_00: How did you come across this observation?
- 20:26And one more thing that you added is it doesn't take more time
- 20:31to design twice than
- 20:33SPEAKER_00: what most people think.
- 20:36SPEAKER_01: Yeah.
- 20:36SPEAKER_01: So first,
- 20:38the way I came across this is because I've been a professor at
- 20:40both Stanford and Berkeley,
- 20:41SPEAKER_01: which are two of the top universities in the world.
- 20:45SPEAKER_01: And both places get brilliant graduate students.
- 20:48And I've noticed it's common for students at both places to
- 20:51have bad work habits.
- 20:53And the reason is,
- 20:55all their lives,
- 20:56everything's always been easy for them.
- 20:58SPEAKER_01: They've always been the best at everything they did.
- 21:00SPEAKER_01: In high school, they were smarter than their teachers.
- 21:02SPEAKER_01: In college, perhaps as smart as their professors, top of their class.
- 21:06SPEAKER_01: Their first ideas,
- 21:07just the first thing that came off their mind was always good
- 21:09enough to get great grades.
- 21:12SPEAKER_01: And so there's never been any real incentive for them to think twice.
- 21:17And I think they start kind of latching on to the idea that
- 21:21whatever comes to my
- 21:22SPEAKER_01: mind is going to be good.
- 21:24But,
- 21:24you know,
- 21:24as you get into harder and harder problems,
- 21:27that characteristic goes away.
- 21:29SPEAKER_01: And particularly when we're doing research at top universities,
- 21:33SPEAKER_01: honestly,
- 21:33SPEAKER_01: we're working on really hard problems.
- 21:35SPEAKER_01: Nobody's first idea is going to be the best idea.
- 21:38And so I often have to work with students to force them to
- 21:42think about things.
- 21:44SPEAKER_01: And so, for example, a common technique I will use is I will say,
- 21:48suppose I told you that you may not implement this thing you
- 21:51just suggested.
- 21:51SPEAKER_01: And if you try and do it,
- 21:52SPEAKER_01: I'm going to stop funding you and have you thrown out as a grad student.
- 21:56SPEAKER_01: What would be your second approach?
- 21:58Would you come up with something or would you say,
- 21:59okay,
- 21:59I better look for a new advisor?
- 22:02SPEAKER_01: And the interesting thing is,
- 22:03SPEAKER_01: and by the way,
- 22:03SPEAKER_01: I say this typically when I think there's a better way of doing it.
- 22:06SPEAKER_01: And when I force them,
- 22:08SPEAKER_01: And they go away and come back.
- 22:09SPEAKER_01: The second idea is always better.
- 22:11SPEAKER_01: It's better.
- 22:12SPEAKER_01: And I've seen this myself.
- 22:15The best example I can think of over my whole career was when I
- 22:18was designing the
- 22:19SPEAKER_01: TK Toolkit,
- 22:20SPEAKER_01: which is part of the TK system.
- 22:24And I was trying to figure out what should be the API for
- 22:27programming graphical widgets.
- 22:30SPEAKER_01: And I spent, actually, I think it was mostly a long airplane ride.
- 22:35SPEAKER_01: And I basically did two designs.
- 22:37SPEAKER_01: I did kind of the first idea that came to mind.
- 22:40SPEAKER_01: And then I said, okay, suppose I'm going to throw that out.
- 22:41SPEAKER_01: What would be something that's really different that I could do?
- 22:44SPEAKER_01: I did a second one.
- 22:46SPEAKER_01: And after comparing them, I ended up choosing the second idea.
- 22:49And honestly,
- 22:50that was one of the best ideas I've had in my professional career.
- 22:55SPEAKER_01: One of the things that made TK popular was the API for TK.
- 22:58SPEAKER_01: It was just a very sweet, simple, powerful API.
- 23:02SPEAKER_01: And it was my second choice.
- 23:04SPEAKER_01: It was the second thing that came to my mind.
- 23:06SPEAKER_01: So I have that example.
- 23:07SPEAKER_01: That always motivates me.
- 23:09And when I'm doing new things,
- 23:10I usually try and force myself to think of two ways.
- 23:13SPEAKER_01: Even if I think one of them is really bad,
- 23:15even come up with what you think is a bad alternative and
- 23:18compare it to what you did,
- 23:20SPEAKER_01: you'll learn something from that.
- 23:22SPEAKER_01: And you may discover the bad thing wasn't as bad as you thought it was.
- 23:26SPEAKER_00: I'm actually starting to realize,
- 23:28SPEAKER_00: when I worked at Uber,
- 23:29SPEAKER_00: we had this concept of design docs,
- 23:31SPEAKER_00: RFCs,
- 23:32SPEAKER_00: where you were expected to just write down why you're doing something,
- 23:37SPEAKER_00: how you're doing it,
- 23:37SPEAKER_00: etc.
- 23:39SPEAKER_00: And after a while, we started to add a thing called trade-offs.
- 23:44SPEAKER_00: Or alternatives considered.
- 23:46SPEAKER_00: And we were asking people like,
- 23:47SPEAKER_00: write down at least one,
- 23:49SPEAKER_00: ideally multiple alternatives considered.
- 23:52SPEAKER_00: And we did it because we got better designs,
- 23:56SPEAKER_00: ideas,
- 23:56SPEAKER_00: plans,
- 23:57SPEAKER_00: et cetera,
- 23:58SPEAKER_00: and better discussions as well,
- 23:59SPEAKER_00: because it was clear why you wouldn't do it.
- 24:02SPEAKER_00: And now I'm just reflecting on what you said on like,
- 24:05SPEAKER_00: yeah,
- 24:05SPEAKER_00: well,
- 24:05SPEAKER_00: we were kind of doing a little bit of what you were saying,
- 24:08SPEAKER_00: forcing people to not stop,
- 24:10either not get their first idea or put down others as well and
- 24:13compare them.
- 24:14SPEAKER_00: What you said,
- 24:15SPEAKER_00: oftentimes it will be people just doing,
- 24:17SPEAKER_00: you know,
- 24:17SPEAKER_00: okay,
- 24:17SPEAKER_00: here's some things that will surely not work.
- 24:20SPEAKER_00: And usually, fair enough, it doesn't work.
- 24:21SPEAKER_00: But then sometimes they're like, oh, actually, that's a simple thing.
- 24:24SPEAKER_00: And we could just use that instead.
- 24:25SPEAKER_01: Or maybe we combine these two things together.
- 24:27SPEAKER_00: Yeah.
- 24:28And,
- 24:29you know,
- 24:29you asked about,
- 24:29does this take a lot of time and slow down the process?
- 24:32SPEAKER_01: Well, it will take some extra time, of course.
- 24:35SPEAKER_01: Nothing is free.
- 24:36SPEAKER_01: But honestly, the design at this level is a very high level design.
- 24:41SPEAKER_01: It's not like we're completely building a second alternative.
- 24:45SPEAKER_01: I kind of think at the high level.
- 24:47SPEAKER_01: So with Tickle and TK,
- 24:48SPEAKER_01: this TK design,
- 24:49I might have spent maybe a few days on the design thinking
- 24:54about these two
- 24:54SPEAKER_01: alternatives and comparing them.
- 24:56SPEAKER_01: But then it took a year to implement TK or more than that.
- 25:00So we're talking something on the order of 1% or 2% of the
- 25:04total time to build a system.
- 25:07SPEAKER_01: It's just not that big of a deal.
- 25:09SPEAKER_01: And if it gives you a better design, you get back way more than 1% or 2%.
- 25:13SPEAKER_00: Yeah, I feel this is less than that.
- 25:17SPEAKER_00: People, teams, engineers learn again and again.
- 25:20You know,
- 25:20first,
- 25:21there's always a point where you jump into coding,
- 25:22I'm faster.
- 25:23SPEAKER_00: And then when it's complex enough,
- 25:25SPEAKER_00: you learn,
- 25:25SPEAKER_00: oh,
- 25:26SPEAKER_00: we probably should have planned a little bit better.
- 25:27SPEAKER_00: I would have saved myself time.
- 25:28SPEAKER_00: And then after a while,
- 25:30the cycle goes into like too much planning or people feel it's
- 25:34too much planning
- 25:35SPEAKER_00: and then it starts again.
- 25:36SPEAKER_00: So I feel there's a little bit of never ending cycle,
- 25:39SPEAKER_00: you know,
- 25:39SPEAKER_00: there people still talk about waterfall,
- 25:41SPEAKER_00: which used to be a thing like 20 or 30 years ago.
- 25:44SPEAKER_00: It's not really a thing, but people like
- 25:47SPEAKER_00: There is some disdain,
- 25:48especially for fast-moving teams in planning too much because
- 25:51it's seen as too much
- 25:52SPEAKER_00: talking and not enough doing.
- 25:55SPEAKER_01: Well, and I get that too.
- 25:59I think the fundamental thing about design is it always
- 26:01involves trade-offs.
- 26:03SPEAKER_01: And if you take any one idea and you push it too far,
- 26:06SPEAKER_01: you're probably going to end up in a bad place.
- 26:08So this idea about doing multiple designs,
- 26:11again,
- 26:11you could certainly take that too far also.
- 26:14And I think one of the things that separates the really good
- 26:18designers from the not
- 26:19as good ones is they kind of know how to make those trade-offs
- 26:21and how to combine
- 26:23SPEAKER_01: these different ideas and different phases and balance them off.
- 26:26And that's the kind of thing probably you just have to learn
- 26:30from experience.
- 26:31SPEAKER_01: You try both approaches and see the bad problems with them,
- 26:34SPEAKER_01: and then you eventually get a gut feel for what the trade-offs are.
- 26:38SPEAKER_00: Now,
- 26:38SPEAKER_00: in the book,
- 26:39one idea that stuck with me is this concept of deep modules and
- 26:42shallow modules.
- 26:44SPEAKER_00: And you introduce this concept that a deep module is something,
- 26:47SPEAKER_00: a piece of code or functionality,
- 26:50SPEAKER_00: or a module that has a pretty simple interface,
- 26:52SPEAKER_00: but it has a lot of depth to it.
- 26:53SPEAKER_00: It has a lot of functionality complexity.
- 26:56And then a shallow module is something that has a wide interface,
- 26:59but it doesn't do too much.
- 27:01SPEAKER_00: So it kind of...
- 27:03It might be even transparent in some points that it doesn't do
- 27:07much hiding.
- 27:09And in the book,
- 27:09you emphasize how deep modules are important for good software design.
- 27:15SPEAKER_00: Why is this so?
- 27:16SPEAKER_00: And how did you, again, come across this realization?
- 27:19SPEAKER_01: Well, it all comes back to complexity.
- 27:21And everything in the book really derives from this idea about
- 27:25how do we eliminate
- 27:28SPEAKER_01: or manage complexity,
- 27:29SPEAKER_01: right?
- 27:30SPEAKER_01: And so a deep module is what gives us leverage against complexity.
- 27:37SPEAKER_01: And the way it does that is it provides this very simple interface.
- 27:40So people using the module have almost no cognitive load,
- 27:43very easy to learn.
- 27:45SPEAKER_01: But inside the module,
- 27:47there's a tremendous amount of functionality and complexity
- 27:50that is hidden from
- 27:50SPEAKER_01: everybody else.
- 27:54SPEAKER_01: In the deep notion, I was trying to capture the trade-offs
- 27:58SPEAKER_01: And basically,
- 27:59SPEAKER_01: it's this trade-off between two things,
- 28:02the complexity of the interface and how much functionality you
- 28:04have in the module.
- 28:06And so what you want to do is get the most functionality you
- 28:10can for the simplest
- 28:12SPEAKER_01: possible interface on top.
- 28:15SPEAKER_00: In the book, you have a chapter titled, Defining Errors Out of Existence.
- 28:18SPEAKER_00: And in this one, you talk about error handling.
- 28:21What is your take on error handling and how to design for
- 28:25sensible error handling?
- 28:26SPEAKER_01: Right.
- 28:27SPEAKER_01: So again, this comes back to the complexity issue.
- 28:30And anybody who's built a lot of software knows that error
- 28:32handling is a huge
- 28:34SPEAKER_01: source of complexity.
- 28:36Basically,
- 28:37it's all the special cases,
- 28:38all these weird special cases you have to deal with.
- 28:41And so it's easy for error handling to impose tremendous
- 28:44complexity on software.
- 28:46So then the question I'm constantly asking myself is,
- 28:49how can we reduce error?
- 28:51SPEAKER_01: the impact.
- 28:52SPEAKER_01: I mean, we do have some situations we have to deal with.
- 28:54SPEAKER_01: There's some, you know, there's many exceptions.
- 28:57SPEAKER_01: You simply can't be avoided.
- 28:58SPEAKER_01: They're fundamental to the systems.
- 28:59SPEAKER_01: You have to deal with them.
- 29:01SPEAKER_01: Other cases where they're not so important.
- 29:03SPEAKER_01: So in that chapter, what I was trying to argue is that
- 29:07SPEAKER_01: Exceptions, having more exceptions is not better.
- 29:12SPEAKER_01: It is sometimes necessary.
- 29:14But I sometimes think that designers think that the more
- 29:17exceptions I throw from a class,
- 29:19SPEAKER_01: the better a programmer I'm being.
- 29:21SPEAKER_01: I'm being a more cautious, careful programmer.
- 29:23And I would know the problem is every exception you throw is
- 29:27imposing complexity on
- 29:28SPEAKER_01: the users of your class.
- 29:31SPEAKER_01: And so if you can, if you can reduce the number of exceptions you throw,
- 29:37the number of special cases you generate,
- 29:39that will reduce system complexity.
- 29:41SPEAKER_01: I gave a bunch of examples in that chapter where,
- 29:44SPEAKER_01: in fact,
- 29:45SPEAKER_01: by just a slight change in the design of the system,
- 29:49SPEAKER_01: whole classes of errors simply disappear.
- 29:52SPEAKER_01: They can't happen.
- 29:52SPEAKER_01: There is no error to deal with.
- 29:56SPEAKER_01: But I will say,
- 29:56SPEAKER_01: this is something that happens occasionally,
- 30:01SPEAKER_01: but you have to be very careful about this.
- 30:03SPEAKER_01: And in the class I teach on software design,
- 30:07SPEAKER_01: students have virtually every class,
- 30:09SPEAKER_01: there are people that misunderstand this.
- 30:12SPEAKER_01: And in the first project, they have essentially zero exception handling.
- 30:15SPEAKER_01: They're building a distributed server where machines can crash,
- 30:17SPEAKER_01: and they don't even check for errors in the network.
- 30:20SPEAKER_01: I say, you have no error checks here.
- 30:22SPEAKER_01: What happens if a system crashes?
- 30:24SPEAKER_01: They say, oh, we just defined those errors out of existence.
- 30:29SPEAKER_01: I say, well, no, the errors are still there.
- 30:34SPEAKER_01: You're just ignoring them.
- 30:35SPEAKER_01: You can't do that.
- 30:37SPEAKER_01: So anyhow, I think this is a chapter I have to warn people about.
- 30:40SPEAKER_01: It's really easy to take this one in bad directions.
- 30:45SPEAKER_01: It's kind of like a spice.
- 30:47SPEAKER_01: They use tiny amounts of it in your cooking, and you get a good result.
- 30:49SPEAKER_01: But if you use very much, you end up with a mess.
- 30:51SPEAKER_00: Yeah, but I feel errors, exceptions, things going wrong.
- 30:57They're one of the things that we don't really talk enough
- 31:00about it when we think about design.
- 31:03SPEAKER_00: When I look at outages,
- 31:05SPEAKER_00: I remember a lot of outages that we had specifically at Uber,
- 31:08SPEAKER_00: but even at other companies.
- 31:10A lot of the times when we looked into what caused it,
- 31:12it was like a mishandling of an error.
- 31:15SPEAKER_00: It came from one system.
- 31:17SPEAKER_00: We mapped it incorrectly as a success.
- 31:19SPEAKER_00: And there was a lot of these edge cases which were,
- 31:22SPEAKER_00: We misunderstood either errors or unexpected responses.
- 31:26SPEAKER_00: You know, they're all the same thing.
- 31:27SPEAKER_00: It was something with errors.
- 31:28SPEAKER_00: And I think we struggled to put a finger on it.
- 31:30SPEAKER_00: You know, we looked at ways of like, okay, let's map responses better.
- 31:35SPEAKER_00: Let's have whitelists, let's have blacklists.
- 31:39SPEAKER_00: During the planning phase, I don't really remember.
- 31:41SPEAKER_00: I feel for planning,
- 31:43SPEAKER_00: people tend to be optimistic of,
- 31:44SPEAKER_00: here's how it works,
- 31:45SPEAKER_00: here's how these things will communicate.
- 31:47And I rarely recall planning sessions where we thought,
- 31:51okay,
- 31:51what could go bad?
- 31:54SPEAKER_00: How will we catch it?
- 31:55SPEAKER_00: How will we recover?
- 31:57SPEAKER_01: So it's just- I think you make a good point in that I think people don't,
- 32:01I don't think exception handling is top of people's mind when
- 32:06they are doing the
- 32:06SPEAKER_01: overall system design.
- 32:09It just sort of happens tactically as people discover potential problems.
- 32:15SPEAKER_00: Yes, I think you're putting what I'm trying to put as this observation.
- 32:21SPEAKER_00: It's just a very interesting one.
- 32:23So the one general piece of advice I have for people is that
- 32:27when you're building a
- 32:28module and thinking about what kinds of special cases and
- 32:32exceptions you're going
- 32:33SPEAKER_01: to export through your interface...
- 32:36should think about how you think the callers are going to deal
- 32:42with these and try
- 32:43and put yourself in the mindset of the user as you're thinking
- 32:48through these.
- 32:48SPEAKER_01: And see,
- 32:50SPEAKER_01: rather than having 10 different exceptions,
- 32:53SPEAKER_01: there's only really two different ways people are going to handle this.
- 32:56And so I can boil it all down into two kinds of exceptions
- 33:00rather than 10 kinds of exceptions,
- 33:01SPEAKER_01: for example.
- 33:04So I think the key thing is to think about it from the caller's standpoint.
- 33:08SPEAKER_01: By the way,
- 33:09that brings me to what I think is one of the most important
- 33:13attributes of a really
- 33:14SPEAKER_01: good designer,
- 33:16which is they can change their mindset and think about things
- 33:21from very different
- 33:22SPEAKER_01: point of views.
- 33:23So when I'm designing a module,
- 33:26I'm thinking about all of the details of that module.
- 33:29SPEAKER_01: But then I can change my mindset to think about the user of this module.
- 33:34SPEAKER_01: and realize I don't want to have any awareness of those details.
- 33:38SPEAKER_01: And in particular,
- 33:38SPEAKER_01: when I'm using a module,
- 33:40I don't want to take advantage of things I might know about the
- 33:42inside of that module.
- 33:43SPEAKER_01: I only want to use things in the interface.
- 33:46And so being able to shift your mindset and think about things
- 33:50at one point,
- 33:50but then completely put those out of your mind and take a
- 33:53totally different view
- 33:55SPEAKER_01: some other time,
- 33:56SPEAKER_01: that's really powerful.
- 33:57SPEAKER_01: That's how you come up with good designs, I think.
- 33:59SPEAKER_01: Again,
- 34:00SPEAKER_01: when you're designing something,
- 34:01you can also think about it from the standpoint of somebody
- 34:04that's going to be
- 34:05SPEAKER_01: using it.
- 34:07SPEAKER_00: Interesting.
- 34:08So are you saying that having empathy and being able to put
- 34:14yourself in the shoes
- 34:15SPEAKER_00: of another role,
- 34:16SPEAKER_00: may that be a customer,
- 34:18SPEAKER_00: another developer,
- 34:20SPEAKER_00: another developer who will be working on this,
- 34:23SPEAKER_00: that could make us a better software engineer?
- 34:25SPEAKER_00: I was about to say the word empathy.
- 34:28SPEAKER_01: Yes.
- 34:29What I was going to say is I think this skill set has
- 34:32tremendous value in social
- 34:34SPEAKER_01: context as well as in engineering context.
- 34:37SPEAKER_01: The ability to think about things from some other person's viewpoint.
- 34:41SPEAKER_01: By the way,
- 34:42SPEAKER_01: one of the things I love about computer science,
- 34:45SPEAKER_01: people think of us as these sort of geeky,
- 34:48SPEAKER_01: nerdy people,
- 34:50but many of the ideas that we use in computer systems actually
- 34:54have interesting
- 34:54SPEAKER_01: analogies in social systems as well.
- 34:57SPEAKER_00: Yeah,
- 34:58SPEAKER_00: it's just interesting because when I,
- 35:01SPEAKER_00: you know,
- 35:03SPEAKER_00: I'll start off like you on the software engineering journey,
- 35:06SPEAKER_00: you know,
- 35:07SPEAKER_00: start to learn to code,
- 35:08SPEAKER_00: go to college,
- 35:09SPEAKER_00: get my first job,
- 35:10SPEAKER_00: et cetera.
- 35:11SPEAKER_00: And initially I thought the hard part is the coding.
- 35:13And every developer I talked to or every engineer I talked to
- 35:16above a certain years,
- 35:19we always have this discussion that the hardest part in
- 35:21software engineering,
- 35:22SPEAKER_00: computers and programming is the people.
- 35:24SPEAKER_00: Yeah.
- 35:25SPEAKER_00: You know,
- 35:25SPEAKER_00: when we think back of after your first few years,
- 35:28SPEAKER_00: once you get the syntax and you learn how to debug and those things,
- 35:31SPEAKER_00: you think about what was the hardest project I was?
- 35:34SPEAKER_00: What was the biggest problem?
- 35:35SPEAKER_00: What caused me the most headache?
- 35:36SPEAKER_00: And it's oftentimes miscommunication.
- 35:38SPEAKER_00: You know, like we misunderstood each other.
- 35:41SPEAKER_00: The spec was off, et cetera.
- 35:45SPEAKER_00: Of course,
- 35:45SPEAKER_00: there's outages as well,
- 35:46SPEAKER_00: but usually the root cause is we did not expect this to happen.
- 35:50SPEAKER_00: We didn't have the empathy for the user.
- 35:54And the biggest one is conflicts with teammates,
- 35:59with people that you work with.
- 36:01SPEAKER_00: It's all human things.
- 36:03SPEAKER_00: So it's interesting.
- 36:05SPEAKER_00: There's this joke that the hardest thing in computer science are,
- 36:07SPEAKER_00: I think,
- 36:08SPEAKER_00: caching and naming things,
- 36:09SPEAKER_00: but I will add people as well.
- 36:12SPEAKER_01: Yeah, that sounds interesting.
- 36:13SPEAKER_01: Yep.
- 36:15SPEAKER_00: One thing that in your book you don't touch on,
- 36:18SPEAKER_00: of course,
- 36:19SPEAKER_00: the book cannot touch on anything,
- 36:20but it's a practice that a lot of teams and tech companies use
- 36:24is these things
- 36:24SPEAKER_00: called design reviews and discussions.
- 36:26SPEAKER_00: The idea is that someone before building a system will write down a plan.
- 36:31SPEAKER_00: People will either have a meeting.
- 36:33Amazon famously has this writing culture where people get into
- 36:37a room and they read
- 36:39SPEAKER_00: the plan and then they discuss.
- 36:40SPEAKER_00: In other places, it's done with Google Docs.
- 36:43SPEAKER_00: And even some others like Figma,
- 36:45SPEAKER_00: they use their own tools to kind of like draw visuals and comment on it.
- 36:50SPEAKER_00: What is your take of,
- 36:52SPEAKER_00: before building a system,
- 36:55SPEAKER_00: explaining a plan,
- 36:56SPEAKER_00: either whiteboarding or other ways,
- 36:57SPEAKER_00: and kind of criticizing each other's plans?
- 37:00SPEAKER_00: Have you either done this to some of the things that you do?
- 37:03SPEAKER_00: Do you encourage students in your class on design classes to do this?
- 37:07SPEAKER_01: Oh, yeah.
- 37:08SPEAKER_01: We do this certainly in all the projects I work on.
- 37:11SPEAKER_01: And certainly when I was doing startups, we would do design reviews.
- 37:14SPEAKER_01: They were relatively informal.
- 37:16SPEAKER_01: We didn't have lengthy written documents.
- 37:19SPEAKER_01: But we'd get together and talk about ideas.
- 37:22And this is where,
- 37:23again,
- 37:23you get the multiple designs and you talk about the trade-offs.
- 37:27SPEAKER_01: And it's just...
- 37:28SPEAKER_01: If you can get multiple minds to think about a topic,
- 37:32it's pretty clear you're going to come up with better ideas
- 37:35than if just one person
- 37:36SPEAKER_01: does it.
- 37:37SPEAKER_01: Again,
- 37:37this is an area where smart people sometimes have to get past
- 37:40their history because
- 37:42they've been for much of their life in environments where they
- 37:45couldn't expect to
- 37:46SPEAKER_01: get a lot of useful input from other people.
- 37:48But when you're working at the very highest level with very,
- 37:50very smart people,
- 37:52you know...
- 37:54SPEAKER_01: Two minds are better than one, clearly.
- 37:55SPEAKER_01: So I'm all for it.
- 37:56SPEAKER_01: Again, you don't want to get caught in analysis paralysis.
- 38:01SPEAKER_01: And so trying to figure out what's the right place to do it,
- 38:04SPEAKER_01: how much time to spend on it,
- 38:05SPEAKER_01: there's a certain art to getting just the right level.
- 38:07SPEAKER_01: But I'm all for that.
- 38:08SPEAKER_01: Yeah.
- 38:10And I think this might have changed in the last few years
- 38:12because of remote work.
- 38:13We've had an explosion of remote work,
- 38:14and now it's a bit of a contraction.
- 38:16SPEAKER_00: But I remember before 2020,
- 38:19SPEAKER_00: some of the most innovative companies,
- 38:22SPEAKER_00: when you went into their thing,
- 38:23SPEAKER_00: or startups who were gaining momentum,
- 38:25SPEAKER_00: what they had...
- 38:26SPEAKER_00: is whiteboards and these erasable whiteboards everywhere.
- 38:30SPEAKER_00: And what would happen in these places,
- 38:32SPEAKER_00: actually,
- 38:32I even had one of my older teams where we actually requested a whiteboard,
- 38:36SPEAKER_00: is people,
- 38:37SPEAKER_00: you know,
- 38:37SPEAKER_00: you're just doing your thing.
- 38:39SPEAKER_00: Someone says something, you're like, hold on.
- 38:41And then you go to the whiteboard,
- 38:42you start whiteboarding and,
- 38:44you know,
- 38:44you can erase it.
- 38:45SPEAKER_00: Sometimes you leave it there.
- 38:46SPEAKER_00: Sometimes you photograph it.
- 38:47Basically,
- 38:48it's just like on demand when there's a...
- 38:50It could be any trigger.
- 38:51SPEAKER_00: It could be just mishearing.
- 38:53SPEAKER_00: It can be doing...
- 38:54SPEAKER_00: You just have people come together,
- 38:56SPEAKER_00: do their ideas,
- 38:57SPEAKER_00: and there's something special about,
- 39:00SPEAKER_00: there have been startups who try to replicate this digitally,
- 39:02but there's something special about in-person just getting your
- 39:07ideas out there,
- 39:08especially when we're talking about something like software
- 39:10where boxes and arrows
- 39:12SPEAKER_00: do help.
- 39:13SPEAKER_01: I totally agree.
- 39:14SPEAKER_01: I love whiteboards and I like having meetings that are in person.
- 39:18SPEAKER_01: I've also,
- 39:19SPEAKER_01: over my career,
- 39:19SPEAKER_01: developed a technique for using whiteboards to resolve complex issues,
- 39:25SPEAKER_01: which may or may not even be technical,
- 39:27SPEAKER_01: other kinds of management issues in a company.
- 39:30And what I found is that oftentimes people get in meetings and
- 39:32they just kind of
- 39:33SPEAKER_01: talk past each other,
- 39:34SPEAKER_01: repeat the same arguments and counter arguments.
- 39:37And it just goes round and round and round and never reaches a conclusion.
- 39:41So what I do in these situations is I stand at the whiteboard
- 39:46and basically I list,
- 39:48SPEAKER_01: typically we're arguing for or against something,
- 39:51SPEAKER_01: just list all the arguments for and all the arguments against.
- 39:54And the rule of the discussion is you can make any argument you
- 39:58think is reasonable.
- 40:00SPEAKER_01: No one is allowed to tell you your argument has to be removed.
- 40:03SPEAKER_01: It's a bad argument.
- 40:03SPEAKER_01: Every argument goes on the board.
- 40:06But you are not allowed to repeat an argument that is already
- 40:09on the board.
- 40:11SPEAKER_01: And this is really important.
- 40:12SPEAKER_01: So having the arguments up so everybody can see.
- 40:15SPEAKER_01: Everybody's argument is valid.
- 40:17SPEAKER_01: Everyone's allowed to contribute.
- 40:18SPEAKER_01: No one can stop you from putting your argument on the board.
- 40:21SPEAKER_01: So everybody's arguments goes up.
- 40:23And then the discussion just naturally reaches a point where
- 40:25nobody has anything more to say.
- 40:27SPEAKER_01: And so this shortens the discussion.
- 40:30SPEAKER_01: And then what I do after that is I take a straw poll.
- 40:33SPEAKER_01: And what's amazing to me,
- 40:36SPEAKER_01: you should try this sometime because it's really,
- 40:38SPEAKER_01: it's quite shocking,
- 40:40is that people will be arguing violently on both sides and
- 40:43you'll think there's
- 40:44SPEAKER_01: total disagreement.
- 40:46SPEAKER_01: And then at the end,
- 40:47SPEAKER_01: then we do a straw poll,
- 40:48SPEAKER_01: you tell everybody,
- 40:48you get to weight these arguments in any way that you think is appropriate.
- 40:52SPEAKER_01: You decide which ones you value, which ones you don't value.
- 40:55SPEAKER_01: Should we do A or B?
- 40:57SPEAKER_01: we almost always end up with a really, really strong consensus.
- 41:00SPEAKER_01: It's shocking.
- 41:01Like I said,
- 41:02I'll be in these meetings where I think we have total
- 41:04disagreement here.
- 41:05SPEAKER_01: And then we do the vote and poop, it's unanimous.
- 41:09SPEAKER_00: Well, it sounds, I have not done it.
- 41:10So it's,
- 41:11you know,
- 41:11it sounds one of those things where I don't believe,
- 41:13I wouldn't believe you.
- 41:14SPEAKER_00: I'm sorry.
- 41:14SPEAKER_00: I do believe you.
- 41:16But yeah,
- 41:16as you said,
- 41:17I think,
- 41:17you know,
- 41:17I'm going to try to try this out.
- 41:19SPEAKER_00: It's the whiteboard.
- 41:19SPEAKER_01: It's all about that whiteboard, I think.
- 41:22Yeah,
- 41:22and I think anyone listening or watching,
- 41:24this is why I love these discussions.
- 41:27SPEAKER_00: It's just like getting a tactic that you can try out.
- 41:29And now that more and more companies are doing at least a few
- 41:34days in the office,
- 41:34SPEAKER_00: you get a whiteboard,
- 41:35SPEAKER_00: try it out.
- 41:36SPEAKER_01: By the way,
- 41:36this works best in environments where people are first
- 41:41generally pretty smart and
- 41:42SPEAKER_01: reasonable and goal aligned.
- 41:43SPEAKER_01: Like,
- 41:44SPEAKER_01: you know,
- 41:44SPEAKER_01: in a startup,
- 41:44SPEAKER_01: for example,
- 41:45SPEAKER_01: or an engineering team,
- 41:46SPEAKER_01: you're typically goal aligned.
- 41:47SPEAKER_01: You all want to achieve the same result.
- 41:49SPEAKER_01: You know, would this work in Congress with opposing political parties?
- 41:53SPEAKER_01: No, no, not in political environments.
- 41:56SPEAKER_01: Fortunately, we don't operate mostly in those environments.
- 41:59SPEAKER_00: Well,
- 41:59SPEAKER_00: yeah,
- 41:59SPEAKER_00: and I think,
- 42:00SPEAKER_00: you know,
- 42:01one nice thing about how the tech industry seems to be evolving
- 42:03from my perspective
- 42:04SPEAKER_00: is it's more and more common and accepted,
- 42:07SPEAKER_00: even at large companies,
- 42:08SPEAKER_00: that you do want teams to have clear goals,
- 42:10SPEAKER_00: like have those goals,
- 42:11SPEAKER_00: because if you don't have it,
- 42:12SPEAKER_00: you know,
- 42:13SPEAKER_00: everyone's going to go in different directions.
- 42:14SPEAKER_00: So I think it's becoming more common.
- 42:16SPEAKER_00: Also, companies don't do it.
- 42:17SPEAKER_00: They fizzle out pretty quickly.
- 42:19SPEAKER_00: Yeah.
- 42:20SPEAKER_00: Similar question on design.
- 42:23SPEAKER_00: There's two schools of thoughts when it comes to design.
- 42:26One is let's design up front and the other one is let's not
- 42:28design up front.
- 42:29Let's just do prototyping or just build something and let the
- 42:32code decide.
- 42:33SPEAKER_00: Do you subscribe to either of these approaches?
- 42:36SPEAKER_00: Taking time up front or just dropping into and prototyping?
- 42:39Or have you seen times or types of projects where one just
- 42:43works better than the other?
- 42:45My personal belief is that design permeates the entire
- 42:49development process.
- 42:50SPEAKER_01: You do it upfront,
- 42:51SPEAKER_01: you do it while you're coding,
- 42:52SPEAKER_01: you do it while you're testing,
- 42:54SPEAKER_01: you do it while you're fixing bugs,
- 42:55SPEAKER_01: that you should constantly be thinking about design.
- 43:00SPEAKER_01: I think you should always do at least a little bit of design upfront.
- 43:04SPEAKER_01: Again, not waterfall method.
- 43:08It's important to realize that our software systems are so
- 43:11complicated that we are
- 43:13SPEAKER_01: not able to predict the consequences of our design decisions.
- 43:17SPEAKER_01: We simply can't.
- 43:18But I think it's really important to do some design and to have
- 43:22some hypotheses to work from.
- 43:25SPEAKER_01: And then you start implementing.
- 43:27SPEAKER_01: And of course,
- 43:27SPEAKER_01: once you get in battle,
- 43:28all your plans kind of fall apart and you'll discover lots of
- 43:31problems with it.
- 43:32And so you have to be prepared to revise as soon as you
- 43:35discover problems.
- 43:36SPEAKER_01: But if you don't do any design up front,
- 43:37I think you're wasting your time on code that's just very
- 43:41unlikely to be useful.
- 43:43The only time I'd argue for coding without design is if you're
- 43:46so young and
- 43:47SPEAKER_01: inexperienced that you really have no clue how to do design.
- 43:50SPEAKER_01: Then you may just have to write some code and start learning from it.
- 43:54But in any case,
- 43:55absolutely be prepared to redesign as you discover problems.
- 44:00SPEAKER_00: Yeah.
- 44:01SPEAKER_00: I had one of my colleagues a long time ago, many years ago.
- 44:05He said something super interesting because we were talking
- 44:07about why software is hard.
- 44:09SPEAKER_00: And we were experienced engineers at this point.
- 44:11Why do some projects take a lot longer even if we do proper
- 44:14planning up front?
- 44:15SPEAKER_00: Why are some projects actually pretty easy?
- 44:18SPEAKER_00: And he said something interesting.
- 44:18SPEAKER_00: He's like, software...
- 44:20Like building software is a little bit like we're in a terrain
- 44:24and we need to march
- 44:26SPEAKER_00: to that location.
- 44:28SPEAKER_00: We see the target, but the terrain is unknown.
- 44:31SPEAKER_00: And sometimes you just walk there and it's exactly how you'd expect.
- 44:34SPEAKER_00: Other times you're walking and oh,
- 44:36suddenly there's a big kind of boulder appears out of nowhere
- 44:39and you kind of climb
- 44:40SPEAKER_00: over it.
- 44:40SPEAKER_00: Then another one comes.
- 44:41SPEAKER_00: Sometimes you walk and like a mine explodes right in front of you.
- 44:44And suddenly you have this massive hole and you didn't know
- 44:47this was a minefield.
- 44:49SPEAKER_00: And he said,
- 44:50and this analogy kind of resonated with me because I realized a
- 44:55lot of it is about
- 44:57SPEAKER_00: like how,
- 44:58SPEAKER_00: how much unknowns are unknowns.
- 45:00SPEAKER_00: And the approach is just very different, right?
- 45:02Like if you're building a tech stack or product that you've
- 45:04done before versus
- 45:06SPEAKER_00: something that is completely new,
- 45:07SPEAKER_00: if are using new technology,
- 45:09SPEAKER_00: are using a beta version of a framework that could have issues,
- 45:12SPEAKER_00: but maybe it'll work and so on.
- 45:14Yeah,
- 45:15I think a lot of it has to do whether you're in a domain you've
- 45:18been in before or not.
- 45:20SPEAKER_01: It's not that you got lucky and there was a flat field.
- 45:23SPEAKER_01: I think it's more that,
- 45:24SPEAKER_01: oh,
- 45:25I've actually walked through this mountain range before and so
- 45:27I know the right paths.
- 45:29SPEAKER_01: And so,
- 45:30SPEAKER_01: you know,
- 45:30if you're building a driver for a new device and you've built
- 45:34drivers for five
- 45:35SPEAKER_01: devices before that,
- 45:36SPEAKER_01: you kind of know what the main problems are and the process is much more
- 45:40SPEAKER_01: predictable and smooth.
- 45:42SPEAKER_01: If you're in a new environment...
- 45:44SPEAKER_01: Well, I don't know.
- 45:45SPEAKER_01: Maybe I'm just unlucky,
- 45:46but I don't think I've ever had a smooth experience when I'm in
- 45:49a new environment.
- 45:50SPEAKER_01: It's just too hard to predict.
- 45:52SPEAKER_00: Neither have I.
- 45:53SPEAKER_00: The only kind of new environment,
- 45:55SPEAKER_00: but it's not really a new environment,
- 45:56like a new version of the framework and it's not a big change
- 45:59or a new language release,
- 46:02which is backwards compatible with all the important stuff and
- 46:05you're not using the
- 46:05SPEAKER_00: new features,
- 46:06SPEAKER_00: that kind of stuff.
- 46:06SPEAKER_00: But it's kind of fake, right?
- 46:07SPEAKER_00: It's kind of the same as before.
- 46:12SPEAKER_00: One thing I'd like to get into is the writing of this book.
- 46:15SPEAKER_00: Because again,
- 46:16SPEAKER_00: this book,
- 46:17SPEAKER_00: it feels to me,
- 46:17SPEAKER_00: it has just a lot of really kind of practical insights.
- 46:21SPEAKER_00: Now,
- 46:22SPEAKER_00: first of all,
- 46:23I haven't seen many books written about software design or
- 46:26software architecture specifically.
- 46:28How did you get the idea to even start writing a book about
- 46:32this pretty hard to tangle domain?
- 46:37It's kind of a long process,
- 46:38but the path leads through the course I taught at Stanford.
- 46:42SPEAKER_01: So the background for this is, as I mentioned earlier, I love coding.
- 46:46SPEAKER_01: I'm one of the few professors that still writes large amounts of code.
- 46:50SPEAKER_01: I try to write 5,000 or 10,000 lines of code a year, at least.
- 46:52SPEAKER_01: It's been a significant fraction of my time coding.
- 46:55SPEAKER_01: And I love design.
- 46:56SPEAKER_01: I think design is one of the most amazing, creative...
- 47:01SPEAKER_01: forms that has ever existed in the history of humankind.
- 47:04SPEAKER_01: It's just really fascinating, beautiful, challenging domain.
- 47:09SPEAKER_01: And so I've often, I thought, think about it.
- 47:12I try to think what is a good design and how do I get to,
- 47:15how do I design software that's good?
- 47:16SPEAKER_01: What are the techniques for that?
- 47:19SPEAKER_01: But over time I noticed to my shock, nobody teaches it.
- 47:24SPEAKER_01: Literally other than the course I eventually started at Stanford,
- 47:27SPEAKER_01: I don't think there's a single course anywhere in the world
- 47:30SPEAKER_01: where software design,
- 47:32SPEAKER_01: not tools or processes,
- 47:33SPEAKER_01: but the act of software design is the primary element of the course.
- 47:36And so this just kind of graded on me for,
- 47:39I don't know,
- 47:40a decade or more.
- 47:41SPEAKER_01: And once I got back to academia at Stanford,
- 47:44SPEAKER_01: and now I'd had this experience in industry,
- 47:46so I'd had a lot more software development experience and more
- 47:48ideas myself,
- 47:50SPEAKER_01: I started thinking about this,
- 47:51SPEAKER_01: and I finally decided I'm just going to,
- 47:54SPEAKER_01: who knows what's going to happen,
- 47:55SPEAKER_01: but I'm just going to try teaching a course and see what I can do.
- 47:58And so that forced me to start thinking about my ideas and try
- 48:01and capture them in
- 48:03SPEAKER_01: simple principles.
- 48:04SPEAKER_00: You said no one teaches design.
- 48:06SPEAKER_00: I'll tell you the perspective from someone working at a tech company.
- 48:12Usually we don't interview new grads or people with a few years
- 48:16of experience on
- 48:17SPEAKER_00: software architecture topics.
- 48:18Usually there's interviews coding and then software
- 48:20architecture or design a complex system.
- 48:22SPEAKER_00: And the reason being,
- 48:23SPEAKER_00: well,
- 48:24you need to work in the industry for several years to start to
- 48:27get a sense for this thing.
- 48:29SPEAKER_00: But I have a feeling you kind of, you know, you turned this upside down.
- 48:32SPEAKER_00: You've kind of proven or,
- 48:34SPEAKER_00: well,
- 48:34you're attempting to do with the class that design can be
- 48:38taught even for students
- 48:41SPEAKER_00: who have recently learned to code.
- 48:44What was your approach and what has your response been from the
- 48:47people who've done it,
- 48:48SPEAKER_00: especially now that,
- 48:49SPEAKER_00: you know,
- 48:49some of those folks have been out in the industry for years and
- 48:52I'm sure they're
- 48:53coming back with some of their experience because they now have
- 48:55a skill set that,
- 48:56SPEAKER_00: you know,
- 48:56SPEAKER_00: a lot of their peers do not.
- 48:58SPEAKER_01: Yeah, so I decided to teach this class.
- 49:00SPEAKER_01: And then the question is, well, how do I teach it?
- 49:02SPEAKER_01: And the model I used was my English writing classes from high school.
- 49:07SPEAKER_01: I don't know if this is the way it's still done today.
- 49:08SPEAKER_01: But back when I took English,
- 49:10SPEAKER_01: the way you learn to write is you would get an assignment,
- 49:12SPEAKER_01: you'd write something,
- 49:13SPEAKER_01: your teacher would mark it up.
- 49:14SPEAKER_01: And then you would rewrite it and submit it again.
- 49:16SPEAKER_01: And you might do several iterations on it.
- 49:19SPEAKER_01: And I think the key elements are first getting feedback.
- 49:23SPEAKER_01: So you have somebody that can criticize your work.
- 49:27SPEAKER_01: And then second, redoing to incorporate that feedback.
- 49:30SPEAKER_01: And it's the process of redoing something,
- 49:33SPEAKER_01: I think,
- 49:34SPEAKER_01: where you really internalize the feedback and the concepts.
- 49:39SPEAKER_01: So that's the way the class is taught.
- 49:40SPEAKER_01: It's over a course of a quarter.
- 49:42SPEAKER_01: People do basically three stages where they build something significant.
- 49:45SPEAKER_01: And then we do extensive code reviews.
- 49:46SPEAKER_01: For example,
- 49:47SPEAKER_01: I read every line of code from all the teams in the class,
- 49:49SPEAKER_00: which means that- And what do people build?
- 49:51SPEAKER_00: What is the project?
- 49:52SPEAKER_00: Or what was one of the projects?
- 49:54SPEAKER_01: So actually,
- 49:55the first two projects happen to be the Raft consensus protocol
- 49:57divided up into two phases.
- 49:58And that actually turns out to have some really interesting
- 50:01design problems that
- 50:02SPEAKER_01: confound students and lead to lots of mistakes.
- 50:04So it's this process of,
- 50:06and when they start off,
- 50:07I give them no clues,
- 50:08no hints,
- 50:09no structure.
- 50:10SPEAKER_01: They have to do it completely from scratch.
- 50:12This is the first time in their lives they've ever done
- 50:14anything like that.
- 50:15SPEAKER_01: So it's actually both very fun and very scary for the students.
- 50:20And then we do this extensive code review where they review it
- 50:23in class and other
- 50:24SPEAKER_01: students read their projects and give feedback.
- 50:27And then I read every line of code and I spend about an hour
- 50:29with each team.
- 50:30They typically get 50 to 100 comments from me on their 2,000 to
- 50:343,000 lines of code
- 50:35SPEAKER_01: they've written.
- 50:36SPEAKER_01: And then they go back and they rework.
- 50:38SPEAKER_01: And I think that's when the aha moments come from students,
- 50:41SPEAKER_01: when they get the feedback from me where I can point out
- 50:45SPEAKER_01: code that's complicated.
- 50:46SPEAKER_01: People generally know that code is complicated.
- 50:48SPEAKER_01: But then I can point out, here's why it's complicated.
- 50:50SPEAKER_01: Because you didn't follow this principle that we've been talking about.
- 50:54SPEAKER_01: And here's how, if you apply the principle, you can make it simpler.
- 50:59And then they come back with their second projects,
- 51:01and the second projects are so much better.
- 51:03And you can tell the students are really excited because they
- 51:08can kind of feel their power.
- 51:10SPEAKER_01: They can feel that I was able to make this a lot better.
- 51:14And so,
- 51:15you know,
- 51:16I was worried about how the students would react to the class.
- 51:18SPEAKER_01: So it's an extremely positive experience for the students.
- 51:21SPEAKER_01: You can tell over the course of the quarter,
- 51:23SPEAKER_01: the way they think about software has changed really in significant ways.
- 51:27SPEAKER_01: And actually, I warned them at the end of the quarter.
- 51:30SPEAKER_01: I say,
- 51:31SPEAKER_01: I just want to warn you,
- 51:31SPEAKER_01: when you go into companies,
- 51:33you're going to find you know a lot of stuff that people in the
- 51:35companies don't know,
- 51:36SPEAKER_01: even much more senior engineers.
- 51:38So then we talk about how do you deal with that because as a
- 51:40junior employee,
- 51:41SPEAKER_01: you may not have much ability to change the company.
- 51:43SPEAKER_01: But anyhow, so I totally, totally believe design can be taught.
- 51:49SPEAKER_01: Now, you still need experience.
- 51:50It's not like you're not going to be a world-class programmer
- 51:53after one quarter in my course.
- 51:54SPEAKER_01: Oh, yeah.
- 51:55But I think they can start the process in motion and give you a
- 51:59new way of thinking
- 51:59about software that you've never thought about in your classes
- 52:02up till now.
- 52:03SPEAKER_00: Yeah,
- 52:03SPEAKER_00: and I think you can probably,
- 52:04SPEAKER_00: like,
- 52:05SPEAKER_00: my sense is that the students who go through this class and,
- 52:09SPEAKER_00: you know,
- 52:10SPEAKER_00: they build up their experience.
- 52:11SPEAKER_00: They also learn about themselves.
- 52:13SPEAKER_00: They learn how they can challenge themselves, how they can talk about it.
- 52:18SPEAKER_00: Other software developers take,
- 52:20SPEAKER_00: you know,
- 52:20SPEAKER_00: like when you enter the industry,
- 52:22SPEAKER_00: like in the first few years,
- 52:23SPEAKER_00: you're just going to like learn the hard way.
- 52:25SPEAKER_00: Like I remember that when I was a new grad or a junior developer,
- 52:30SPEAKER_00: you know,
- 52:30SPEAKER_00: started out of college,
- 52:31SPEAKER_00: right?
- 52:32SPEAKER_00: I was actually still doing college,
- 52:33but I was working at a workplace and a senior developer told me
- 52:37I need to do this.
- 52:37SPEAKER_00: You know, did the planning.
- 52:39SPEAKER_00: We're going to use this technology.
- 52:40SPEAKER_00: You need to implement this and this.
- 52:42SPEAKER_00: And I just had a bad feeling about it, but I did it.
- 52:46SPEAKER_00: And it just became worse and worse and more and more complicated.
- 52:49And the solution that it was some in-house database and it had
- 52:53performance issues,
- 52:54SPEAKER_00: it got really bad.
- 52:56SPEAKER_00: And the senior developers stepped away.
- 52:59SPEAKER_00: And in the end...
- 53:01SPEAKER_00: Weeks into the project,
- 53:02SPEAKER_00: the customer is frustrated because like a page load took 15 seconds,
- 53:07SPEAKER_00: which is like it's not it was not OK.
- 53:10SPEAKER_00: And then I just like over a weekend, I worked.
- 53:13SPEAKER_00: I must have worked for like, I don't know, 20 plus hours.
- 53:15SPEAKER_00: I just rewrote the whole thing the way I would have done it.
- 53:19SPEAKER_00: And it all of the things were fixed, etc.
- 53:21SPEAKER_00: But.
- 53:23It felt to me like I was kind of like,
- 53:25I was thinking like,
- 53:26am I being crazy?
- 53:27SPEAKER_00: Like, like this experienced person told me to do this.
- 53:30SPEAKER_00: I just didn't really have the vocabulary.
- 53:31SPEAKER_00: I didn't have the, the faith in myself as well that, that I can do this.
- 53:37SPEAKER_00: So, and yeah,
- 53:38SPEAKER_00: Everyone goes through these things eventually, right?
- 53:40SPEAKER_00: Like you kind of learn,
- 53:41SPEAKER_00: you burn yourself,
- 53:42but I feel you might be giving those students a bit of a
- 53:45shortcut to maybe avoid
- 53:47SPEAKER_00: some of these pitfalls.
- 53:49SPEAKER_01: I suspect that experience was really good for you.
- 53:52SPEAKER_01: Oh, it was really good, totally.
- 53:53The opportunity to do it the wrong way and see your gut feeling validated.
- 54:00So next time around,
- 54:01you can probably kind of put some words to that and talk more...
- 54:07SPEAKER_01: with more authority about why that's a problem,
- 54:10and then going back and doing it the right way and seeing how
- 54:12much better it is.
- 54:12SPEAKER_01: I mean, that must have been a really great experience for you.
- 54:15SPEAKER_00: The cool thing is that I think all these things are really good learning.
- 54:19SPEAKER_00: Salvation through suffering, maybe.
- 54:21SPEAKER_00: Yeah, but I feel sometimes that's the most memorable learning, no?
- 54:25SPEAKER_01: Honestly, I think almost all learning is about making mistakes.
- 54:31That the way you learn,
- 54:32the most powerful ways to learn are to make mistakes,
- 54:37SPEAKER_01: see, understand why there are mistakes and then fix them.
- 54:40SPEAKER_01: And to me,
- 54:41SPEAKER_01: education,
- 54:42it's about basically creating a safe space where people can
- 54:46make mistakes and learn
- 54:47SPEAKER_01: from them.
- 54:48SPEAKER_01: And I tell the students in the class about this.
- 54:50I tell them,
- 54:50you know,
- 54:50you're going to get a tremendous amount of criticism.
- 54:52SPEAKER_01: I tell them, I am going to pick every single knit with your coat.
- 54:57SPEAKER_01: You're going to probably be mad at me for things I'm picking,
- 54:59but I'm going to show you every single thing that's wrong
- 55:01because I want you to be
- 55:02SPEAKER_01: aware of that.
- 55:03And one of the things I hope students get out of the class is
- 55:06realizing that's a
- 55:07SPEAKER_01: really productive experience.
- 55:09SPEAKER_01: It's actually good for me to have people come in and challenge me,
- 55:12SPEAKER_01: scrutinize my code,
- 55:13SPEAKER_01: and give me feedback.
- 55:13SPEAKER_01: Because I think a lot of developers out there are kind of sensitive.
- 55:18SPEAKER_01: Maybe they worry that if somebody criticizes their code,
- 55:22SPEAKER_01: maybe that means they weren't such a good coder.
- 55:24Or maybe they think if I have to come up with a second idea,
- 55:27maybe I'm not that smart.
- 55:29SPEAKER_01: Only dumb people have to do things twice.
- 55:31SPEAKER_01: Smart people always get things right the first time.
- 55:33And so then you latch onto this,
- 55:34I can't ever admit that my first idea isn't great.
- 55:37SPEAKER_01: And so I think it's really important.
- 55:38SPEAKER_01: The whole idea of making mistakes is so important and so constructive.
- 55:43SPEAKER_01: We need to honor that, I think, as engineers.
- 55:47slightly different topic but you and uncle bob robert martin
- 55:51had an interesting
- 55:52discussion about his book clean code online where you you you
- 55:55both like wrote uh
- 55:58your thoughts on different parts and there were a few parts
- 56:01where you your opinions
- 56:03diverged and i was interested in getting into some of these so
- 56:07first was on short
- 56:09SPEAKER_00: methods and the methods doing just one thing you know
- 56:12SPEAKER_00: Robert Martin is a big fan of doing so.
- 56:15He's saying this will lead to cleaner code,
- 56:17clear responsibility,
- 56:18and so on.
- 56:19SPEAKER_00: And you had a slightly different take on this.
- 56:23SPEAKER_01: Boy, I sure do.
- 56:24SPEAKER_01: So I mentioned earlier on that design is about trade-offs.
- 56:28And if you take any idea and take it to the extreme,
- 56:32you end up in a bad place.
- 56:34SPEAKER_01: And so I think clean code has done that in many places.
- 56:38SPEAKER_01: This was my biggest overall concern.
- 56:41SPEAKER_01: Method size is one of them.
- 56:43SPEAKER_01: Of course,
- 56:43I think we agree that really long methods are probably harder
- 56:47to understand and
- 56:48SPEAKER_01: deal with than shorter methods.
- 56:50There's some value in shortness,
- 56:54but it isn't the method length per se that's most important.
- 56:57SPEAKER_01: To me, it's this notion of depth.
- 56:59SPEAKER_01: Are we hiding complexity?
- 57:01And so what happened in clean code is that shortness was taken
- 57:06as an absolute good
- 57:08SPEAKER_01: with no limits on it.
- 57:09SPEAKER_01: The shorter, the better.
- 57:11And so a three-line method is better than a five-line method,
- 57:14according to clean code.
- 57:16SPEAKER_01: And the problem with that is that
- 57:19SPEAKER_01: Well,
- 57:20SPEAKER_01: maybe that one method is a little bit easier to understand,
- 57:23SPEAKER_01: but by having shorter methods,
- 57:25SPEAKER_01: you now have a lot more methods.
- 57:27SPEAKER_01: And so you have a lot more interfaces.
- 57:29And now the complexity of the interfaces ends up actually
- 57:33making the system more
- 57:34SPEAKER_01: complicated than it was before.
- 57:37SPEAKER_01: And in particular, his style...
- 57:40SPEAKER_01: He is comfortable if methods are entangled,
- 57:44SPEAKER_01: having multiple short methods where,
- 57:46SPEAKER_01: in fact,
- 57:46they're so entangled that you can't understand one method
- 57:50without actually looking
- 57:50SPEAKER_01: at the code of the other methods at the same time.
- 57:53SPEAKER_00: Yeah, so this might as well.
- 57:54SPEAKER_01: To me, I see no benefit of that.
- 57:55SPEAKER_01: I think, to me, that has made things worse, not better.
- 57:58That if things are really related,
- 58:00you're better off pulling them together.
- 58:02So the thing about the notion of depth is it kind of captures
- 58:06the trade-offs.
- 58:07SPEAKER_01: That we want to have a lot of functionality,
- 58:10SPEAKER_01: but it needs to have a relatively simple interface.
- 58:13And so I think that notion will keep you from going astray in
- 58:19either one direction or the other.
- 58:20SPEAKER_01: Whereas this,
- 58:21SPEAKER_01: for example,
- 58:22SPEAKER_01: the single responsibility principle,
- 58:25SPEAKER_01: the do one thing principle,
- 58:26that just pushes you relentlessly in one direction without any
- 58:29bounds and you get
- 58:30SPEAKER_01: in trouble that way.
- 58:32SPEAKER_00: And it's interesting how you talked about methods being short,
- 58:38SPEAKER_00: doing one thing,
- 58:38SPEAKER_00: and you can have a lot of them,
- 58:40SPEAKER_00: or you can group them and have bigger methods that do more things,
- 58:43SPEAKER_00: but they're more sensible.
- 58:44SPEAKER_00: I was thinking,
- 58:45SPEAKER_00: as you're talking about this,
- 58:47SPEAKER_00: in the industry,
- 58:47SPEAKER_00: we've had a similar thing with microservices.
- 58:50So I happened to work at Uber at the time where it was
- 58:52popularized that the company
- 58:54SPEAKER_00: had more than 5,000 microservices.
- 58:56SPEAKER_00: And we had a lot of really small microservices.
- 58:58SPEAKER_00: And what happened over the years is,
- 59:01SPEAKER_00: at least in my,
- 59:02SPEAKER_00: I cannot speak for the whole company,
- 59:03SPEAKER_00: but I can talk about the domain I was,
- 59:04SPEAKER_00: which was in the payments domain.
- 59:06SPEAKER_00: We had a lot of small services because they were easy to spin up.
- 59:09SPEAKER_00: They did like one thing or two things or a few things.
- 59:11SPEAKER_00: And after a while, we realized like, huh, it's,
- 59:14SPEAKER_00: It's just really tough to maintain,
- 59:16SPEAKER_00: to know which lives there,
- 59:18SPEAKER_00: a lot of communication back and forth.
- 59:19SPEAKER_00: So we started to just pull them together and create,
- 59:21SPEAKER_00: I would say,
- 59:23SPEAKER_00: mid-sized services that kind of had a domain responsibility.
- 59:28SPEAKER_00: And it wasn't either extreme, but I think we saw that one extreme.
- 59:32SPEAKER_00: It sounds good.
- 59:33SPEAKER_00: It sounded really good, by the way, initially, and it has benefits.
- 59:36SPEAKER_00: But over time, it just wasn't as practical.
- 59:38SPEAKER_00: So it's pretty...
- 59:39somewhat similar to what to what you say like extremes on one
- 59:43end are not great
- 59:44it's not great to have like one massive service that does
- 59:46everything you know we
- 59:48uber used to have that it was called api and it did everything
- 59:51and then it got
- 59:51broken into smaller things and then it came back into like kind
- 59:54of domains or
- 59:55reasonably sized one so so you could actually keep track in
- 59:58your head you could
- 59:59understand here are the different parts that are there okay you
- 1:00:02can go inside and
- 1:00:04SPEAKER_00: then you can understand the part so there's i think there's a level of
- 1:00:08SPEAKER_00: When does it make sense?
- 1:00:10SPEAKER_00: How can you follow those kind of things as well?
- 1:00:12SPEAKER_01: I think there's a,
- 1:00:13SPEAKER_01: you know,
- 1:00:15SPEAKER_01: again,
- 1:00:15SPEAKER_01: you can err on both sides,
- 1:00:16SPEAKER_01: but I think these days people often err on the side of over decomposing.
- 1:00:20SPEAKER_01: And I think,
- 1:00:22SPEAKER_01: so clean code,
- 1:00:23SPEAKER_01: for example,
- 1:00:24advocates that what I consider to be over decomposing that
- 1:00:26causes problems.
- 1:00:28And so one of the things I tell my students is often you can
- 1:00:32make something deeper
- 1:00:33SPEAKER_01: by actually combining things together.
- 1:00:36SPEAKER_01: If they were closely related,
- 1:00:39you may discover that if you bring them together into one class
- 1:00:41or one method or
- 1:00:42SPEAKER_01: one module or one subsystem,
- 1:00:44you end up with the combined functionality but with a simpler
- 1:00:47overall API and
- 1:00:50without having two separate things with a lot of dependencies
- 1:00:52between them,
- 1:00:52SPEAKER_01: which is really bad.
- 1:00:54SPEAKER_01: Again, you can overdo this.
- 1:00:57SPEAKER_01: Everything is trade-offs,
- 1:00:58but you can often make things better by making the units a
- 1:01:01little bit larger.
- 1:01:02Another area of disagreement was test-driven development that
- 1:01:06we touched on a little bit.
- 1:01:09SPEAKER_00: Robert Martin is a big fan of using TDD as a way to write code,
- 1:01:13SPEAKER_00: write the test first,
- 1:01:14SPEAKER_00: then write the code that makes it pass.
- 1:01:16SPEAKER_00: This method was also pretty popular in the early 2000s.
- 1:01:20SPEAKER_00: It's kind of gotten a little bit out of style.
- 1:01:22SPEAKER_00: Your take was different as well.
- 1:01:25SPEAKER_01: Yeah, I'm not a fan of TDD because I think it works against design.
- 1:01:30SPEAKER_01: So again, to me, tests are important.
- 1:01:32SPEAKER_01: I love unit tests.
- 1:01:33SPEAKER_01: I write them for everything I do.
- 1:01:34SPEAKER_01: They're essential.
- 1:01:35If you're a responsible developer,
- 1:01:37you write unit tests with very high coverage.
- 1:01:39SPEAKER_01: So let's agree on that.
- 1:01:42SPEAKER_01: But we want the development process to be focused on design.
- 1:01:45I think that should be the center of everything we do in
- 1:01:48development should be
- 1:01:49SPEAKER_01: organized towards getting the best possible design.
- 1:01:52And I think TDD works against that because it encourages you to
- 1:01:56do a little tiny
- 1:01:57SPEAKER_01: increment of design.
- 1:01:58I write one test and then I implement the functionality to make
- 1:02:02that test pass.
- 1:02:03SPEAKER_01: Then I write one more test.
- 1:02:06SPEAKER_01: and write the functionality to make that test pass.
- 1:02:08There's no point in the process where you're encouraged to step
- 1:02:11back and think
- 1:02:12SPEAKER_01: about the overall task,
- 1:02:14SPEAKER_01: the big picture.
- 1:02:16SPEAKER_01: How do all these pieces fit together?
- 1:02:18SPEAKER_01: What's the most pleasing,
- 1:02:19SPEAKER_01: simple,
- 1:02:20clean architecture that will solve 10 problems rather than
- 1:02:24coming up with 10 point
- 1:02:26SPEAKER_01: solutions to individual problems?
- 1:02:28And so it results in what I believe the risk is you can end up
- 1:02:32in an extremely
- 1:02:33SPEAKER_01: tactical style of development that produces just a horrible mess.
- 1:02:37SPEAKER_01: So that's my concern.
- 1:02:39SPEAKER_01: And we had this long back and forth about it.
- 1:02:40And I think the main reason that Bob likes TDD is it ensures
- 1:02:45that the tests get
- 1:02:46SPEAKER_01: written because you have to write the test before the code.
- 1:02:49SPEAKER_01: And so I agree the test should be written.
- 1:02:51But I don't think there's anything – he was not able to
- 1:02:53convince me that there's
- 1:02:54SPEAKER_01: any particular advantage
- 1:02:56in writing the test before the code other than ensuring that
- 1:02:59the tests get written.
- 1:03:01SPEAKER_01: I can't see any reason that makes the design better.
- 1:03:03SPEAKER_01: And I can see a lot of reasons why it might make the design a lot worse.
- 1:03:07I think an interesting question is,
- 1:03:08what should be your units of development?
- 1:03:10SPEAKER_01: Development is always in chunks of work.
- 1:03:12SPEAKER_01: What should those chunks be?
- 1:03:13And I would argue those chunks should be abstractions,
- 1:03:17not individual tests.
- 1:03:18SPEAKER_01: That's too small of a chunk again.
- 1:03:20SPEAKER_01: You want to think in a big enough chunk that you can consider trade-offs
- 1:03:26and try and come up with a fairly general purpose solution that
- 1:03:29will solve many problems.
- 1:03:32SPEAKER_01: By the way,
- 1:03:33SPEAKER_01: one of the most important elements of design,
- 1:03:36SPEAKER_01: I think,
- 1:03:36is pushing yourself towards general purpose to avoid
- 1:03:39specialization as much as you
- 1:03:40SPEAKER_01: possibly can.
- 1:03:42And so the TDD approach encourages you to do something very
- 1:03:45specialized to pass
- 1:03:46each test rather than thinking about the general purpose thing
- 1:03:49that solves many
- 1:03:50SPEAKER_01: problems in one place.
- 1:03:51SPEAKER_00: Oh, all right.
- 1:03:53SPEAKER_00: Yeah, that is true.
- 1:03:54SPEAKER_00: That is true.
- 1:03:54SPEAKER_00: In fact,
- 1:03:55I remember at some point when we did some TDD mobbing where we
- 1:03:59would pass the
- 1:03:59SPEAKER_00: keyboards around and someone would write a test,
- 1:04:02SPEAKER_00: someone would make it pass.
- 1:04:03It felt a bit artificial because when you wrote more code that
- 1:04:07you needed to come,
- 1:04:08SPEAKER_00: they're like,
- 1:04:08SPEAKER_00: no,
- 1:04:09SPEAKER_00: don't write that.
- 1:04:09SPEAKER_00: That doesn't make, just make the test pass.
- 1:04:11SPEAKER_00: So it almost felt a little bit of artificial.
- 1:04:14SPEAKER_00: And again,
- 1:04:15SPEAKER_00: I'm sure there are times and cases where it could be useful,
- 1:04:18SPEAKER_00: maybe in a more formal way,
- 1:04:20SPEAKER_00: maybe where it's more about adding,
- 1:04:23SPEAKER_00: extending additional code where it's like very heavy in business logic.
- 1:04:26SPEAKER_00: Maybe that could be a good fit, but...
- 1:04:30There might be a reason that it kind of slowly became less
- 1:04:33popular and we're not
- 1:04:34SPEAKER_00: talking about it too much these days.
- 1:04:35The one place where I'd recommend writing the test first is
- 1:04:40when you're fixing a bug.
- 1:04:42SPEAKER_01: I would argue write the test that will detect the bug and then fix it.
- 1:04:47Although actually what I typically do is I honestly I kind of
- 1:04:50cheat on this one.
- 1:04:52SPEAKER_01: I write the fix and then I write the test for the fix.
- 1:04:57SPEAKER_01: And then I back out the fix and make sure the test fails.
- 1:05:02But anyhow,
- 1:05:03that's one place where I think doing the test early can be useful.
- 1:05:08SPEAKER_00: Now, one more area that you disagreed is comments.
- 1:05:11So Uncle Bob says,
- 1:05:15unsurprisingly,
- 1:05:16that you should have as few comments in the code.
- 1:05:18SPEAKER_00: The code should speak for itself.
- 1:05:21SPEAKER_00: You also did not fully subscribe to this one.
- 1:05:24SPEAKER_01: If the code could fully speak for itself, that would be wonderful.
- 1:05:27SPEAKER_01: I would have no objection.
- 1:05:29SPEAKER_01: But it can't, and it never will, as far as I'm concerned.
- 1:05:32SPEAKER_01: There's just so much stuff that can't be described in the code itself.
- 1:05:37SPEAKER_01: And we ended up discussing examples where he said, look at this code.
- 1:05:40SPEAKER_01: It needs no comments, right?
- 1:05:41And then I said,
- 1:05:43well,
- 1:05:43here's five questions people have that I don't see answered in
- 1:05:45this code.
- 1:05:48SPEAKER_01: Then he kind of hedged about that.
- 1:05:49SPEAKER_01: I don't know.
- 1:05:52SPEAKER_01: He's very, very biased against comments.
- 1:05:54SPEAKER_01: I'm not sure why, if he has some scarring experience.
- 1:05:59I believe he basically said he thinks that people lose more
- 1:06:04time by being misled by
- 1:06:06comments that are out of date than time lost because you
- 1:06:11haven't had adequate comments.
- 1:06:13SPEAKER_01: That certainly is not my experience.
- 1:06:16SPEAKER_01: Occasionally there are comments that are out of date,
- 1:06:18SPEAKER_01: but rarely and even then there's usually useful information.
- 1:06:22SPEAKER_01: And then he also argued that,
- 1:06:24SPEAKER_01: well,
- 1:06:24SPEAKER_01: if you're working on a project that you and other developers work,
- 1:06:27you don't need any comments because everybody's got it all
- 1:06:29loaded into their minds.
- 1:06:31SPEAKER_01: And I just don't agree with that.
- 1:06:33SPEAKER_01: Now,
- 1:06:33SPEAKER_01: maybe his mind is better than my mind,
- 1:06:35SPEAKER_01: but,
- 1:06:36SPEAKER_01: you know,
- 1:06:36I can't keep everything in my mind that I forget code within a
- 1:06:39few weeks of when
- 1:06:40SPEAKER_01: I've written it.
- 1:06:40SPEAKER_01: So I need those comments.
- 1:06:42So the bottom line is there's just a lot of stuff that you
- 1:06:45can't get from the code.
- 1:06:46SPEAKER_00: And then what is your kind of approach on like, how do you do comments?
- 1:06:51SPEAKER_00: What do you like to put into comments?
- 1:06:53Or is it just like whenever you feel like it just put there
- 1:06:55because it's going to
- 1:06:57SPEAKER_00: be additional information that could help later?
- 1:06:58SPEAKER_00: Yeah.
- 1:07:00SPEAKER_01: Well,
- 1:07:00SPEAKER_01: again,
- 1:07:01the number one rule is comments should tell you things that
- 1:07:04aren't obvious from the code.
- 1:07:08SPEAKER_01: There are a lot of bad comments out there where people are basically just
- 1:07:11SPEAKER_01: duplicating stuff that's obvious from the code.
- 1:07:13SPEAKER_01: So no need for comments in those situations.
- 1:07:16SPEAKER_01: In my student projects in my class,
- 1:07:18SPEAKER_01: I often take comments out,
- 1:07:19SPEAKER_01: tell students,
- 1:07:19SPEAKER_01: this comment just repeats the code.
- 1:07:20SPEAKER_01: You don't need it.
- 1:07:22SPEAKER_01: I think where comments are most important is for interfaces.
- 1:07:25SPEAKER_01: This is where they're really, really important because...
- 1:07:29The assumption of interface is you don't want people to have to
- 1:07:31read the code of
- 1:07:32SPEAKER_01: the thing that you're communicating with,
- 1:07:35SPEAKER_01: talking with.
- 1:07:35SPEAKER_01: You just want to look at the interface.
- 1:07:38It is impossible in the functional signatures of a module to
- 1:07:44provide all the
- 1:07:44SPEAKER_01: information people need to use that module.
- 1:07:47SPEAKER_01: That's where comments are most important there.
- 1:07:49SPEAKER_01: To me, that's the most important.
- 1:07:51The second most important thing is documenting the member
- 1:07:54variables of classes.
- 1:07:56SPEAKER_01: That needs really extensive documentation.
- 1:07:58SPEAKER_01: And then I tend to find that inside methods,
- 1:08:02I don't tend to need a lot of comments because if you know what
- 1:08:05the method's trying
- 1:08:06SPEAKER_01: to do,
- 1:08:06SPEAKER_01: the code typically speaks for itself pretty well there.
- 1:08:11I tend to have comments where things are tricky or where there
- 1:08:13was unexpected stuff
- 1:08:14SPEAKER_01: I'd only discovered when there were bugs and things like that.
- 1:08:17SPEAKER_01: But often my methods won't have any internal comments.
- 1:08:20SPEAKER_01: They'll just be the interface comment.
- 1:08:22SPEAKER_00: I think comments are going to have a bit of a resurgence of this debate,
- 1:08:26SPEAKER_00: potentially,
- 1:08:27SPEAKER_00: because AI tools increasingly generate more code.
- 1:08:30SPEAKER_00: They often generate whole methods.
- 1:08:33SPEAKER_00: And what I'm noticing is when I'm telling one of these AI assistants,
- 1:08:38SPEAKER_00: like generate something that does this for me,
- 1:08:40SPEAKER_00: it generates the code,
- 1:08:40SPEAKER_00: but it often adds inline methods,
- 1:08:42SPEAKER_00: which explains what it does.
- 1:08:44SPEAKER_00: And actually,
- 1:08:45SPEAKER_00: in that case,
- 1:08:45SPEAKER_00: because it's just coming so quickly,
- 1:08:47SPEAKER_00: it actually kind of helps me because I'm
- 1:08:50SPEAKER_00: I know these tools hallucinate,
- 1:08:52and I actually want to make sure what it does so it kind of
- 1:08:54helps me understand.
- 1:08:56SPEAKER_00: At the same time, it's a good question of why it's doing it.
- 1:08:58SPEAKER_00: You know,
- 1:08:58SPEAKER_00: these are trained on typically code that's out there,
- 1:09:01SPEAKER_00: either open source or who knows what kind of licensing.
- 1:09:04SPEAKER_00: So it probably is copying however it's seen it.
- 1:09:08SPEAKER_00: But this,
- 1:09:10SPEAKER_00: you know,
- 1:09:11SPEAKER_00: usually I would agree with you,
- 1:09:12SPEAKER_00: but in this case,
- 1:09:13SPEAKER_00: maybe comments are not a bad thing.
- 1:09:15SPEAKER_00: Who knows?
- 1:09:16SPEAKER_00: It's an interesting area.
- 1:09:17SPEAKER_01: Yeah, so I...
- 1:09:19I'm a little hesitant to say this because I'm fearing I may be
- 1:09:22justifying bad habits.
- 1:09:23But one thing I found is that AI tools can,
- 1:09:28to some degree,
- 1:09:29compensate for the lack of comments.
- 1:09:31So I've been working in the Linux kernel,
- 1:09:34building a new network transport.
- 1:09:36SPEAKER_01: And you know,
- 1:09:38SPEAKER_01: Linux kernel is not a bad piece of software,
- 1:09:40SPEAKER_01: but it's pretty significantly under commented in my view.
- 1:09:43And I spent a lot of my time just trying to figure out what is
- 1:09:46going on in Linux.
- 1:09:47SPEAKER_01: What are the interfaces?
- 1:09:48SPEAKER_01: How do I hook into this?
- 1:09:49SPEAKER_01: ChatGPT has become my very best friend.
- 1:09:53It's amazingly capable at answering questions about the Linux
- 1:09:57kernel that I can't
- 1:09:58SPEAKER_01: answer via Google search or any other way.
- 1:10:01SPEAKER_01: It's not always correct.
- 1:10:02SPEAKER_01: Sometimes it hallucinates, but it's often right.
- 1:10:05SPEAKER_01: And even when it's wrong,
- 1:10:07it typically gets me in the right vicinity and helps me to
- 1:10:10figure out where to look
- 1:10:11SPEAKER_01: to figure out how to answer my questions.
- 1:10:13SPEAKER_01: So I think the AI tools may be able to help.
- 1:10:18SPEAKER_01: But even saying that,
- 1:10:20SPEAKER_01: if the Linux had just spent a little,
- 1:10:22SPEAKER_01: a tiny amount of time putting comments in,
- 1:10:24it would have made things so much easier than using ChatGPT to
- 1:10:28try and figure it out.
- 1:10:29SPEAKER_01: So I don't think the need for comments is going to go away completely.
- 1:10:33And we shouldn't use AI tools as an excuse for people not to
- 1:10:36write comments.
- 1:10:36SPEAKER_01: At least not yet.
- 1:10:40SPEAKER_00: So before the podcast,
- 1:10:41one interesting thing that you mentioned is you are actively
- 1:10:44writing code.
- 1:10:44In fact,
- 1:10:45after this podcast,
- 1:10:46I think you're going to be getting back to writing code.
- 1:10:49SPEAKER_00: What are you working on right now?
- 1:10:51SPEAKER_00: You mentioned something with the Linux kernel.
- 1:10:53SPEAKER_01: Yeah.
- 1:10:54SPEAKER_01: So one of my PhD students,
- 1:10:56SPEAKER_01: Ben Montessori,
- 1:10:57SPEAKER_01: as his PhD dissertation six or eight years ago,
- 1:11:01SPEAKER_01: developed a new transport protocol called HOMA,
- 1:11:03SPEAKER_01: H-O-M-A.
- 1:11:05SPEAKER_01: which is intended for use in data centers.
- 1:11:07SPEAKER_01: And the results he got in his dissertation are really fabulous.
- 1:11:10It's 10 to 100 times faster than TCP for a whole lot of
- 1:11:13interesting cases.
- 1:11:15SPEAKER_01: And so rather than let this just come and go as a
- 1:11:20SPEAKER_01: PhD project that nobody ever cares about.
- 1:11:21I've taken it as my own personal project to see if it is
- 1:11:25actually possible to bring
- 1:11:26this into widespread use and displace some of the TCP traffic
- 1:11:30in data centers.
- 1:11:31So I have developed a Linux kernel implementation of that,
- 1:11:34which I'm continuing to enhance.
- 1:11:36SPEAKER_01: And I'm now in the process of upstreaming that into the kernel.
- 1:11:40And so actually what I'm really dealing with is a whole bunch
- 1:11:41of comments I've
- 1:11:42gotten from the Linux kernel developers about this and trying
- 1:11:44to fix all the
- 1:11:45SPEAKER_01: problems they pointed out.
- 1:11:46SPEAKER_01: Here's another example of code reviews and the benefits of all of that.
- 1:11:50SPEAKER_01: And indeed,
- 1:11:50SPEAKER_01: this afternoon,
- 1:11:51I'm getting ready to submit my next round of patches to the
- 1:11:55NetDev mailing list.
- 1:11:56SPEAKER_00: How are you finding,
- 1:11:57is this your first contribution to a Linux kernel or have you
- 1:11:59previously worked on it?
- 1:12:01SPEAKER_01: Yeah, this is my first involvement with a Linux kernel.
- 1:12:04SPEAKER_00: How are you finding the process?
- 1:12:05SPEAKER_00: Because we just had an episode on Linux.
- 1:12:09SPEAKER_00: with one of the main Linux kernel maintainers.
- 1:12:13SPEAKER_00: And I'm curious, is it overwhelming?
- 1:12:16SPEAKER_00: Is it easier?
- 1:12:17SPEAKER_00: Is it harder than what you thought?
- 1:12:18So I've been warned that it might be difficult and painful and
- 1:12:22take a long time.
- 1:12:25SPEAKER_01: It's taking a fair amount of time.
- 1:12:27I think it's been,
- 1:12:29we may be coming up on six months since I made my first
- 1:12:31submission of this.
- 1:12:32SPEAKER_01: But I have to say that the people have been very reasonable.
- 1:12:37SPEAKER_01: And the feedback I've gotten has been high quality feedback.
- 1:12:40SPEAKER_01: So I've had to fix a lot of things.
- 1:12:42But these were all things where either I misunderstood
- 1:12:45something about the kernel
- 1:12:47or they show me better ways to do it or pointed out
- 1:12:50complexities in my design,
- 1:12:51SPEAKER_01: which there were plenty of.
- 1:12:53SPEAKER_01: And so I have no objection to the process so far.
- 1:12:56SPEAKER_01: And I'm actually pretty happy with it.
- 1:12:59SPEAKER_01: And HOMA is getting a lot better because of this.
- 1:13:01I hope will eventually reach closure and it'll find its way
- 1:13:04into the kernel.
- 1:13:05SPEAKER_01: But it has seemed pretty reasonable to me so far.
- 1:13:09SPEAKER_00: This is really encouraging to hear and good luck with that.
- 1:13:13What are ideas from the history of software design or even
- 1:13:16software engineering
- 1:13:17that you think might make a renaissance in the near future as
- 1:13:20we're looking at
- 1:13:22SPEAKER_00: focus on tooling,
- 1:13:22SPEAKER_00: distributed systems,
- 1:13:24SPEAKER_00: obviously AI tooling?
- 1:13:26I'm not sure I can think of any idea that has come and gone and
- 1:13:30is going to come back again.
- 1:13:31SPEAKER_01: So I think,
- 1:13:34SPEAKER_01: you know,
- 1:13:34I think there are ideas that have come and gone because we've
- 1:13:37learned how to do
- 1:13:38SPEAKER_01: things better.
- 1:13:41SPEAKER_01: But hopefully we're getting better and better at this.
- 1:13:44SPEAKER_01: We're not just oscillating from good to bad, good to bad, back and forth.
- 1:13:47SPEAKER_01: So I can't think of,
- 1:13:50SPEAKER_01: there's no idea I can think of,
- 1:13:52SPEAKER_01: you know,
- 1:13:52SPEAKER_01: that people have forgotten about,
- 1:13:53SPEAKER_01: wants to do and forgot about this,
- 1:13:54SPEAKER_01: going to come back into play again.
- 1:13:57And then the book,
- 1:14:00this was first published in 2018,
- 1:14:02so that's coming up seven years now.
- 1:14:05SPEAKER_00: If you were to write this book today,
- 1:14:08are there parts that you would add to it that you would rewrite
- 1:14:11or even remove?
- 1:14:13SPEAKER_01: Yeah.
- 1:14:14SPEAKER_01: So first of all, I never actually finished the explanation of the book.
- 1:14:16SPEAKER_01: So the book came about after the class.
- 1:14:18When I started giving talks about the class,
- 1:14:19people said,
- 1:14:20you should write a book about this.
- 1:14:22SPEAKER_01: And so I had a sabbatical in whatever it was, 2017, 2018.
- 1:14:25SPEAKER_01: I used my sabbatical to write the book.
- 1:14:29SPEAKER_01: So feedback on those.
- 1:14:30SPEAKER_01: So first of all,
- 1:14:31there have been some things where I've adjusted my opinion
- 1:14:34since writing the book,
- 1:14:35but there's already been a second edition of the book where I
- 1:14:37fixed most of those.
- 1:14:40SPEAKER_01: And the
- 1:14:41SPEAKER_01: And hopefully the book you have is actually the second edition,
- 1:14:43SPEAKER_01: in fact,
- 1:14:44SPEAKER_01: if you've gotten it in the last couple of years.
- 1:14:46SPEAKER_00: It is first edition.
- 1:14:47SPEAKER_00: I need to update the book.
- 1:14:48SPEAKER_00: OK.
- 1:14:49SPEAKER_01: It has not changed dramatically.
- 1:14:51But the biggest change is more emphasis on this notion of being
- 1:14:55general purpose and
- 1:14:57SPEAKER_01: eliminating specializations.
- 1:14:59And that's something I learned actually not from the book but
- 1:15:01from the class,
- 1:15:02SPEAKER_01: from observing student projects in the class over a period of years.
- 1:15:05I realized this idea is really fundamental to teaching students
- 1:15:09how to write less
- 1:15:09SPEAKER_01: complicated code.
- 1:15:11SPEAKER_01: So that's already in the book.
- 1:15:14SPEAKER_01: There's no big thing that I would want to change right now.
- 1:15:20SPEAKER_01: As I mentioned earlier,
- 1:15:21I think the part of the book that is most dangerous is this
- 1:15:26part of exception handling,
- 1:15:27SPEAKER_01: which,
- 1:15:27SPEAKER_01: as I mentioned,
- 1:15:28is easy for people to misinterpret and apply in ways that I
- 1:15:31actually wouldn't agree with.
- 1:15:33SPEAKER_01: So if I were rewriting the book from scratch –
- 1:15:38I might think about that more carefully to make sure I choose
- 1:15:41my wording more
- 1:15:42SPEAKER_01: carefully to help people avoid misinterpretation of that.
- 1:15:46SPEAKER_01: Now,
- 1:15:47SPEAKER_01: one thing I hoped when I wrote the book,
- 1:15:49one thing I was hoping was that people would come in with new
- 1:15:51ideas that I hadn't
- 1:15:51thought of and that I would learn from that and then get more
- 1:15:55ideas and gradually,
- 1:15:56SPEAKER_01: you know,
- 1:15:56SPEAKER_01: I'd be adding more and more stuff to the book.
- 1:15:59SPEAKER_01: So that has not happened very much so far.
- 1:16:03SPEAKER_01: I would have been delighted to have more.
- 1:16:05SPEAKER_01: I'd love for people to come and say, you are totally wrong.
- 1:16:08SPEAKER_01: This idea here in the book is totally wrong.
- 1:16:09SPEAKER_01: Here's why.
- 1:16:10SPEAKER_01: Here's how you should do it instead.
- 1:16:11And there's not actually been as much of that as I had actually
- 1:16:15hoped for when I wrote the book.
- 1:16:18I have a theory about why this might happen,
- 1:16:22which is that your class is so unique.
- 1:16:25SPEAKER_00: Software design in the wild is typically,
- 1:16:27SPEAKER_00: you have a problem,
- 1:16:29SPEAKER_00: you build a solution,
- 1:16:30SPEAKER_00: you might explore some different trade-offs on the whiteboard,
- 1:16:33SPEAKER_00: but then you build it,
- 1:16:34SPEAKER_00: and then you move on,
- 1:16:35SPEAKER_00: and then you might go back and fix it,
- 1:16:37SPEAKER_00: you might have to maintain it,
- 1:16:38SPEAKER_00: you're going to learn about it.
- 1:16:40What you don't have is you don't have this ideal situation
- 1:16:43where let's say you have
- 1:16:43like two or three different teams building different things and
- 1:16:46then you compare it
- 1:16:47SPEAKER_00: because in the industry or in tech companies,
- 1:16:49SPEAKER_00: you just don't have that luxury.
- 1:16:50SPEAKER_00: And even if it's a bit wasteful.
- 1:16:54SPEAKER_00: So you never really have a situation where you can repeat something.
- 1:16:57SPEAKER_00: My sense was that with your class, you actually could do this.
- 1:17:00SPEAKER_00: You could have a group of students go through.
- 1:17:03SPEAKER_00: Well, actually in the class.
- 1:17:06SPEAKER_00: Same problem, people solve it different ways.
- 1:17:08SPEAKER_00: You can now see the differences, they can see the differences.
- 1:17:11And I'm wondering if it's just a thing that maybe this setup
- 1:17:16needs to happen in
- 1:17:17SPEAKER_00: some level of either academia or nonprofit or somewhere where it is...
- 1:17:22doable I'm not sure because I have been thinking of because
- 1:17:26this this makes this
- 1:17:27book really special like your observation was not just like a
- 1:17:30lot of software
- 1:17:30architecture books are like oh here's stuff that I found over
- 1:17:33working on these
- 1:17:34projects which are all one-offs but I learned these things and
- 1:17:37you're saying I've
- 1:17:38seen this thing work better across the students and those who
- 1:17:43did it you know had
- 1:17:45SPEAKER_00: better outcome repeatedly
- 1:17:47Yeah,
- 1:17:47that's something we can do in academia,
- 1:17:49I think,
- 1:17:50better than industry.
- 1:17:51SPEAKER_01: Because in industry, you don't have time for the revision.
- 1:17:55SPEAKER_01: And you're right.
- 1:17:55One of the things about the class I think that is really good
- 1:17:58is there are nine teams,
- 1:17:59SPEAKER_01: nine two-person teams in the course.
- 1:18:01SPEAKER_01: They all do the same projects.
- 1:18:05SPEAKER_01: And then they review each other's projects.
- 1:18:07SPEAKER_01: So during the code reviews,
- 1:18:09SPEAKER_01: each student will read not the whole project,
- 1:18:12SPEAKER_01: but a big chunk of two other projects and then review them in class.
- 1:18:16SPEAKER_01: And so your partner is reviewing two different projects also.
- 1:18:20So between the two of you,
- 1:18:21you've seen basically half of the rest of the work in class.
- 1:18:25SPEAKER_01: And I think that's also a really great source of learning from students.
- 1:18:27SPEAKER_01: They really enjoy looking at each other's code and thinking about it.
- 1:18:31SPEAKER_01: And then after the first project,
- 1:18:32SPEAKER_01: they ask me,
- 1:18:32SPEAKER_01: they say,
- 1:18:34am I allowed to use ideas from this other project when I revise
- 1:18:37my project?
- 1:18:38Because normally in classes,
- 1:18:39you can't use anybody else's ideas in your work.
- 1:18:41SPEAKER_01: And I say, oh, absolutely.
- 1:18:43SPEAKER_01: You are encouraged to steal and cannibalize all the best ideas.
- 1:18:47SPEAKER_01: So that's something I think,
- 1:18:49SPEAKER_01: yeah,
- 1:18:49SPEAKER_01: where I think actually doing it in academia,
- 1:18:52SPEAKER_01: we can probably do a better job in industry.
- 1:18:54SPEAKER_01: In industry, you don't have enough time.
- 1:18:56SPEAKER_01: You can't let a student,
- 1:18:57SPEAKER_01: a person spend whatever it is,
- 1:18:59SPEAKER_01: 15 hours a week for 10 weeks going through an exercise like this.
- 1:19:03SPEAKER_01: You have too much other stuff for them to do.
- 1:19:06SPEAKER_00: But the outcome has been really nice.
- 1:19:08SPEAKER_00: So as closing,
- 1:19:10what are one or two books you'd recommend for software
- 1:19:12engineers to get better at
- 1:19:13SPEAKER_00: their craft?
- 1:19:14SPEAKER_00: Well, obviously, we have your book, but outside of these.
- 1:19:18So unfortunately,
- 1:19:20there's not a lot of other stuff out there that I really like.
- 1:19:24SPEAKER_01: There are a couple of things.
- 1:19:25SPEAKER_01: Unfortunately, I don't remember the names of them.
- 1:19:28SPEAKER_01: But if people go to my homepage on the web and look,
- 1:19:31SPEAKER_01: there's a link from there that will take you to the software design book.
- 1:19:34SPEAKER_01: And there's a short web page there.
- 1:19:36And that has some other recommendations at the bottom that
- 1:19:38people can look at.
- 1:19:40SPEAKER_00: We're going to link this in the show notes below.
- 1:19:43SPEAKER_00: And how could listeners be helpful to you or help you?
- 1:19:46SPEAKER_01: Well, I'm always interested in constructive criticism.
- 1:19:50SPEAKER_01: I don't claim to have all of the answers.
- 1:19:52SPEAKER_01: I have my experiences and things I think I've learned,
- 1:19:55SPEAKER_01: but we're not done with software design yet.
- 1:19:59SPEAKER_01: I'm sure there's a lot more to learn about that.
- 1:20:01So I'd love to hear if people have ideas or if you think
- 1:20:04something I say is wrong,
- 1:20:06SPEAKER_01: I'd like to hear about it.
- 1:20:06SPEAKER_01: I'd love to hear...
- 1:20:08SPEAKER_01: What you think is wrong and why you think that's wrong.
- 1:20:11SPEAKER_01: The main thing,
- 1:20:12SPEAKER_01: you know,
- 1:20:12SPEAKER_01: both in the class and in the book,
- 1:20:14what I'm hoping to do is to encourage more awareness and
- 1:20:19consciousness about
- 1:20:20SPEAKER_01: software design in the developer community.
- 1:20:22SPEAKER_01: Get people thinking and talking about it.
- 1:20:25SPEAKER_01: And if we do that,
- 1:20:26I'm hoping that we can raise the overall level of design in the
- 1:20:29software that we build.
- 1:20:31SPEAKER_00: Yeah,
- 1:20:31SPEAKER_00: and I'm thinking,
- 1:20:33especially now that we're going to see more code generated just
- 1:20:36by nature.
- 1:20:36SPEAKER_00: As you mentioned,
- 1:20:38SPEAKER_00: design will be more important at all levels,
- 1:20:41SPEAKER_00: not just like the senior engineering level,
- 1:20:43SPEAKER_00: but as you're like creating your own thing.
- 1:20:45SPEAKER_00: So hopefully we'll see more of this.
- 1:20:47SPEAKER_00: Well, John, this was really nice and really interesting discussion.
- 1:20:51SPEAKER_00: And thank you so much for spending your time on this.
- 1:20:53SPEAKER_00: Thank you for inviting me.
- 1:20:54SPEAKER_00: I really enjoyed the discussion as well.
- 1:20:56SPEAKER_00: I hope you enjoyed this conversation as much as I did.
- 1:20:58SPEAKER_00: Thanks very much to John for sitting down with us.
- 1:21:01If you've not read his book,
- 1:21:02A Philosophy of Software Design,
- 1:21:03I can very much recommend it.
- 1:21:05SPEAKER_00: For more in-depth reading on software design,
- 1:21:07SPEAKER_00: design docs and related topics,
- 1:21:09SPEAKER_00: check out the Pragmatic Engineer Deep Dives,
- 1:21:10SPEAKER_00: which are linked in the show notes below.
- 1:21:13SPEAKER_00: If you've enjoyed this podcast,
- 1:21:14SPEAKER_00: please do subscribe on your favorite podcast platform and on YouTube.
- 1:21:18SPEAKER_00: A special thank you if you also leave a rating.
- 1:21:20SPEAKER_00: Thanks and see you in the next one.