Full transcript
Introduction
0:07[music]
The Thesis of AI Engineering
0:15>> Yeah, we're good.
0:17Okay, folks.
0:18We're at capacity.
0:20Let's kick off. I don't want you waiting
0:22here for 25 more minutes before we some
0:24arbitrary deadline.
0:26So,
0:27welcome.
0:28My name's Matt,
0:30I'm a teacher, and I suppose now I teach
0:32AI.
0:33Um
0:35We have a link up here, if you've not
0:37already been to this, which is has the
0:38exercises for the um stuff we're going
0:41to do today.
0:41This is going to be around 2 hours, so
0:43we might just sort of kick off 2 hours
0:45from now. Is that all right, Mike?
0:47Yeah, perfect.
0:49Um and
0:51the theory behind this talk, or at least
0:52the thesis under which I've been
0:53operating for the last kind of 6 months
0:55or so, is that
0:59we all think that AI is a new paradigm,
1:01right? AI is obviously changing a lot of
1:03things. You guys are obviously
1:04interested in this, and that's why
1:05you've come to this talk.
1:07And
1:09I feel that
1:12when we talk about AI being a new
1:14paradigm, we forget that actually
1:17software engineering fundamentals, the
1:19stuff that's really crucial to working
1:21with humans, also works super well with
1:24AI.
1:25And this is what my keynote is on
1:27tomorrow, really. I'm going to sort of
1:28be fleshing that out a lot more.
1:30And in this workshop, I'm hopefully
1:32going to be able to direct your
1:33attention to those things, and
1:35uh hopefully show you
1:38that I'm right. But we'll see.
1:40Um can I get a quick heads-up first? How
1:43many of you guys um are coding have ever
1:46coded with AI? Raise your hand if you've
1:48ever coded with AI. Perfect. Okay. Uh
1:51keep your hand raised.
1:53Uh
1:54let's all uh share those armpits with
1:56the world. Um
1:58how many of you code every day with AI?
2:01Cool. Okay. Uh right, keep your hand
2:04raised if you've ever been frustrated
2:05with AI.
2:07Okay, very good.
2:09You can put your hands down.
2:11Thank you for that show of obedience. I
2:12really appreciate that. And we are also
2:14being live-streamed to the Gilgood room
2:16as well. I've not
2:17uh
2:18Did we send someone up to the Gilgood
2:19room to just check they're okay?
2:21Don't know.
2:22But I see you,
2:24and there is a way that you can
2:25participate, which is we have the um a
2:28Q&A. We're going to be doing kind of
2:30have a sort of hatred of Q&As cuz
2:31they're not very democratic. They're
2:33mostly the sort of
2:34um most talkative people get to um
2:37get to participate and share. And so,
2:40we're going to be going through this um
2:42Q&A here. So, why do we have to wait
2:43till 3:45? The room is packed, the doors
2:45are closed. 100% agree.
2:47And so, if you want to uh ask a
2:49question, we're going to be I would like
2:50you to pile into this async, and then we
2:53can vote on each other's questions, and
2:54hopefully get the best questions
2:56surfaced so the for the entire room to
2:58enjoy.
3:00So, I want to talk about first the kind
3:02of weird constraints that LLMs have.
3:06And
3:07those weird constraints are sort of what
3:09we have to base a lot of our work
3:11around.
3:12Now,
3:14there's a guy called Dex Hardy who runs
3:16a company called Human Layer, and he
3:17came up with this idea, which is that
3:21when you're working with LLMs, they have
3:23a smart zone
3:25and a dumb zone.
3:27When you're first kind of like
3:29working with an LLM, and it's like
3:31you've just started a new conversation,
3:33you start from nothing, that's when the
3:35LLM is going to do its best work.
3:37Because in that situation, the attention
3:38relationships are the least strained.
3:40Every time you add a token to an LLM,
3:43it's kind of like you're adding a team
3:44to a football league. You think of the
3:46number of matches that get added every
3:49time you add a team to a football
3:50league, it just goes
3:52it scales quadratically. And that's
3:54because you have attention relationships
3:55going from essentially each token to the
3:57other that are positional and the sort
4:00of meaning of the individual token.
4:02And so, this means that by around sort
4:04of 40% or around I would say around 100K
4:07is kind of my new marker for this. Cuz
4:09it doesn't matter whether you're using 1
4:11million
4:12uh context window or 200K,
4:15it's always going to be about this.
4:17It starts to just get dumber.
Phase 1: Research & Prototyping
4:20So, as you continually keep adding stuff
4:22to the same context window, it just gets
4:24dumber and dumber until it's making kind
4:26of stupid decisions. Raise your hand if
4:27that feels familiar to you.
4:30Yeah, cool.
4:31So, this means that we kind of want to
4:33size our tasks in a way that sticks
4:37within the smart zone.
4:38Right? We don't want the AI to bite off
4:41more than it can chew. This goes back to
4:43old advice like Martin Fowler in
4:45refactoring. Uh like uh the pragmatic
4:48programmer talks about this. Don't bite
4:49off more than you can chew. Keep your
4:51tasks small so that you as a developer,
4:54a human developer, don't freak out and
4:56don't start acting and going into the
4:58dumb zone.
5:01But
5:02how do you tackle big tasks? How do you
5:04take a large task like I don't know,
5:07cloning a company or something, or just
5:09doing something crazy,
5:11and how do you break it into small tasks
5:13so they all fit into the dumb zone?
5:16One way, of course, you could do is I
5:17mean, kind of what the AI companies
5:19maybe want you to do, or the natural way
5:21of doing it is just keep going and going
5:22and going, you end up in the dumb zone,
5:24charging you tons of tokens per request.
5:26You then compact back down.
5:28We'll talk about compacting properly in
5:29a minute. And you keep going, keep
5:31going, keep going, compact back down,
5:33keep going, keep going, keep going.
5:35And I think that's doesn't really work
5:37very well because the more sediment I
5:39we'll talk about that in a minute.
5:41So, the theory here is then, and this is
5:43what I was doing for a while,
5:45is I would use these kind of
5:47um multi-phase plans.
5:49Where I would say, "Okay, we have this
5:51sort of number four thing here, this
5:53large large task. Let's break it down
5:55into small sections so that we can then
5:57kind of chunk it up and do each little
6:00bit of work in the smart zone." Raise
6:02your hand if you've ever used a
6:03multi-phase plan before.
6:05Yeah, really common practice, right?
6:07This is kind of how we've been doing it.
6:09Certainly, this is how I was doing it up
6:11until December last year, really.
6:14And any developer worth their salt will
6:16look at this and go, "This is a loop."
6:19Right? This is a loop. We've just got
6:21phase one, phase two, phase three, phase
6:23four. Why don't we just have phase N?
6:27Right?
6:29Phase N. Where we essentially just say,
6:31"Okay,
6:32we have, let's say, a plan operating in
6:34the background, and then we just loop
6:35over the top of it, and we go through
6:37until it's complete."
6:38And this is where um
6:40Raise your hand if you've heard of Ralph
6:41Wiggum as a software practice.
6:44Okay, cool. Raise your hand if you've
6:45not heard of Ralph Wiggum as a software
6:46practice, actually. That's more like it.
6:48Okay. So, there's this idea called Ralph
6:49Wiggum, uh which is kind of um
6:52sort of based on this,
6:54which is essentially
6:56all you need to do is sort of specify
6:58the end of the journey,
7:00where you just say, "Okay, we create a
7:01PRD, a product requirements document, to
7:03say, 'Whoa, okay, let's describe where
7:05we're going.'" And then we just say to
7:07the AI, "Just make a small change. Make
7:10a small change that gets us closer and
7:11closer to that."
7:13And
7:14Ralph works okay, but I prefer a little
7:15bit more structure.
7:17So, that's kind of where we got to in
7:19terms of thinking about the smart zone,
7:21and that's
7:22kind of where I want you to first start
7:25thinking about here.
7:27Another weird constraint of LLMs is LLMs
7:29are kind of like the guy from Memento,
7:31right? They just continually forget.
7:32They could just keep resetting back to
7:34the base state.
7:36Let me pull up this diagram.
7:38I sort of I
7:39I I really should use slides, but I just
7:41prefer just like randomly scrolling
7:43around a
7:44uh infinite uh TL draw canvas. Thank
7:46you, Steve.
7:48Um
7:49So, let's say another concept I want you
7:52to have is that every session with an
7:53LLM kind of goes through the same
7:55stages.
7:56You have, first of all, the system
7:57prompt here. This gray box here is
8:00essentially the stuff that's always in
8:02your context. You want this to be as
8:04small as possible. Cuz if you have a ton
8:07of stuff in here, if you have 250K
8:09tokens, like I have seen people put in
8:11there, then that you're just going to go
8:13straight into the dumb zone without even
8:15being able to do anything.
8:17So, you want this to be tiny.
8:19>> [snorts]
8:19>> You then go into a kind of exploratory
8:21phase. This blue sort of where the
8:23coding agent is going out and exploring
8:25the code base.
8:26Then you go into implementation.
8:28And then you go into testing.
8:30And sort of making sure that it works,
8:32running your feedback loops and things
8:33like this.
8:34Raise your hand if that feels familiar
8:36based on what you've done. Yeah. Sort of
8:38the like the the main cornerstones of
8:40any session.
8:42And when you clear the context, you go
8:44right back to the system prompt.
8:46Oof, you go right back there. So, you
8:48delete everything that's come before.
8:51And
8:53raise your hand if you've heard of
8:54compacting, as well.
8:56Yeah, okay. There are some people who've
8:57not heard of compacting. So, let's just
8:58quickly show what that means.
9:00For instance,
9:02I've just been having a little chat with
9:03my LLM.
9:06Uh
9:07I want to make sure we sort of, you
9:09know, just cover the basics so we're all
9:10sort of on the same wavelength here.
9:12I've just been having a chat with my
9:13LLM.
9:14I've been talking about a thing that I
9:16want to build. How's the font size?
9:17Should I bump it up?
9:19Folks in the back?
9:20Bump. Bump.
9:22Bump. Bump. Bump. Oh.
9:24I'm using Claude Code for this session,
9:25but you don't need to use Claude Code.
9:27Uh
9:28in fact, it's often nice not to use
9:29Claude Code.
9:30Um
9:32so, I've been having a chat with the
9:33LLM, just sort of planning out what I'm
9:34going to do next. It's asking me a bunch
9:35of questions, and I can
9:38I highly recommend you do this.
9:40There's this tiny little status line
9:42here that tells me how many tokens I'm
9:44using, the exact number of tokens I'm
9:46using. Um I have a article on my website
9:49AI Hero if you want to copy this. This
9:52is
9:53Oh, wow, that is that shakes, doesn't
9:54it? Um
9:56this is essential information on every
9:59coding session cuz you need to know
10:00exactly how many tokens you're using so
10:02that you know how close you are to the
10:03dumb zone.
10:05Absolutely essential.
10:06And so let's watch it.
10:08So I've got two options. I can either
10:09clear
10:11wrong and go back to nothing or I can
10:14compact.
10:15And when I compact then it's going to
10:18squeeze all of that conversation, which
10:19admittedly isn't very much, into a much
10:22smaller space.
10:24And this in diagram terms kind of looks
10:26like this.
10:27Where you take all of the information
10:28from the session and you essentially
10:30create a history out of it, a written
10:32record of what happened.
10:36And devs love compacting for some
10:37reason, but I hate it.
10:40I much prefer my AI to behave like
10:43uh the guy from Memento because this
10:45state
10:46is always the same. Always the same
10:48every time you do it. You clear and you
10:50go back to the beginning. And so if
10:51you're able to do that and you're able
10:53to optimize for that then you're in a
10:54great spot.
10:56So that's kind of the two things I want
10:58you to think about with LLMs, the two
10:59constraints that we're working with.
11:01They have a smart zone and a dumb zone
11:03and they're like the guy from Memento.
11:06So let's take a look at the first
11:08exercise.
11:09And I'm while I'm doing this, the way I
11:11want this to work is I'm going to sort
11:13of show you how um I'm going to be sort
11:15of walking through it up here and I want
11:17you folks to be kind of like tapping
11:19away and doing things as well. So that
11:21was just a little lecture bit. Let's now
11:23actually get and do some coding.
11:25For anyone who arrived late or anyone in
11:27the Gilgud room uh go to this link
11:32this link up here
11:35to see the exercises and clone the repo.
11:38You absolutely do not have to, you can
11:39just watch me do it if you fancy it.
11:41But let's go there myself and let's see
11:42what exercises await us.
11:45So essentially I've built a um this is
11:47from my course.
11:49This is a uh a course management
11:52platform essentially, a kind of CMS for
11:55instructors, for students, and this is
11:56what we're going to be building a
11:57feature in. So I'm going to take you
12:00from essentially the idea for the
12:02feature all the way up to building a PRD
12:04for the feature, all the way up to
12:06implementing the feature.
12:08And hopefully you can take inspiration
12:09from this process and use it in your own
12:11work.
12:12So
12:14uh let's kick off. So
12:17we're going to start by using a a skill
12:19which is very close to my heart.
12:21It's the grill me skill.
12:23And this grill me skill is wonderfully
12:27small wonderfully tiny and it helps
12:30prevent one of I think the main issues
12:32when you're working with an AI, which is
12:34misalignments.
12:37The uh
12:39the sort of silent idea that I'm talking
12:41against here, that I'm arguing against,
12:43is the specs to code movement. Has
Phase 2: The Grill Session
12:45anyone heard of the specs to code
12:46movement? Raise your hand. It's not
12:48really a movement I suppose, it's just
12:49sort of people saying specs to code.
12:51Um
12:53what it is is people say, "Okay, you can
12:55write a program or you want to build an
12:57app the best way to build that app is to
13:00take some specifications
13:02so to write some sort of like document
13:05and then turn that document into code."
13:09So they just turn it into code. How do
13:10you do that? You pass it to AI. If
13:12there's something wrong with the
13:13resulting code, you don't look at the
13:15code, you look back at the specs. You
13:17change the specs and you sort of just
13:19keep going like this. This is kind of
13:21like vibe coding by another name where
13:22you're essentially ignoring the code.
13:25You don't need to worry about the code.
13:27You just sort of keep editing the specs
13:28and eventually you just keep going. And
13:30I tried this. I really tried it. And it
13:32sucks. It doesn't work.
13:34Because you need to keep a handle on the
13:36code. You need to understand what's in
13:38it. You need to shape it because the
13:40code is your battleground. And so
13:44this is again is where we're going.
13:45Let's let's get some exercises.
13:47So
13:48what I'd like you to do is go to this
13:49page, the the grill me skill.
13:51And inside the repo here
13:54we have a slack message
13:56from our pal. Uh where is it? It's in
13:59the root of the repo and it's under
14:03bur bur bur bur
14:04Oh, where is it?
14:06Mhm mhm client brief.md.
14:09It's a slack message from Sarah Chen.
14:11For some reason the Claude always
14:12chooses Sarah Chen as the name. I don't
14:13know why.
14:14Um it's saying that in cadence, our um
14:18course platform, our retention numbers
14:20are not great. Students sign up to a few
14:22lessons then they drop off. I'd love to
14:24add some gamification to the platform.
14:26And so when you're presented with an
14:28idea like this, you need to find some
14:30way of turning it into reality. Let's
14:31say Sarah Chen is your client, you're on
14:33a tight budget, you need to get this
14:34done fast. How do you go and do it?
14:37Um
14:38raise your hand if you would um
14:40enter plan mode when you're doing this.
14:43Anyone a big user of plan mode? Yep.
14:45Um let's actually shout out quickly any
14:47other ideas about what you would do with
14:49this or any Raise your hand if you
14:51what what would be your first port of
14:52call?
14:54Yep. Ask for more info.
14:55Sorry? Ask for more
14:57info to verify what is the purpose and
14:59where our current standing is. Yes,
15:00exactly. Let's imagine that Sarah Chen's
15:02gone on holiday, you have no idea,
15:03right? Uh she's just posted this thing,
15:05you need to action it before you go.
15:07Well, my first port of call is I go for
15:10this particular skill. I'm going to
15:11clear my context.
15:15I'm going to
15:16uh get rid of
15:18you, you don't need to be there.
15:20And I'm going to say
15:22um I'm going to invoke a skill
15:25which is the grill me skill. Let's
15:27quickly check.
15:28Raise your hands if you don't know what
15:29this is.
15:31Cool.
15:32Oh, sorry sorry. Let me be more
15:33specific. Raise your hands if you don't
15:36know what I'm doing here when I
15:38uh do a forward slash and then type
15:40something.
15:41Anyone Everyone kind of understand what
15:43that is?
15:44I'm invoking a skill. I'm invoking the
15:45grill me skill.
15:47And what I'm going to do is I'm going to
15:49say grill me and I'm going to pass in
15:51the client brief.
15:54So now
15:55the LLM really has only a couple of
15:58things here. It just has the skill and
16:00it has the description of what I want to
16:01do.
16:04And this is virtually how I start every
16:06piece of work with AI.
16:08And while it's exploring the code base
16:11I'm just going to show you what the
16:12grill me skill does.
16:14So this is inside the repo so you can
16:15check it out.
16:17It's extremely short.
16:19"Interview me relentlessly about every
16:21aspect of this plan until we reach a
16:22shared understanding. Walk down each
16:24branch of the decision tree resolving
16:26dependencies one by one. For each
16:28question provide your recommended
16:29answer.
16:30Ask the questions one at a time uh blah
16:33blah blah."
16:34What this does and what I noticed when I
16:36was working with AI, especially in plan
16:38mode actually
16:40is it would
16:42really eagerly try to produce a plan for
16:44me.
16:45It would say, "Okay, I think I've got
16:46enough. I'm just going to poof plan
16:48plan."
16:49And what I found was that
16:53I was really trying to find the words
16:55for this, for for what I wanted instead
16:57of that.
16:58And Frederick P. Brooks in The Design of
17:01Design, he has a great quote uh talking
17:03about the design concept.
17:05When you're working on something new
17:07with someone
17:08when you're uh all trying to build
17:10something together
17:12then there's this shared idea that's
17:14shared between all participants and that
17:16is the design concept. And that's what I
17:18realized I needed with Claude. I needed
17:22I needed to reach a shared
17:24understanding. need an asset, I didn't
17:26need a plan, I needed to be on the same
17:28wavelength as the AI, as my agent. And
17:31this is an extremely effective way of
17:33doing it. So hopefully
17:35Here we go. Nice. It has done its
17:37exploration first of all.
17:39It's invoked a sub agent which spent
17:4297 93.7k tokens
17:45on Opus.
17:47Um
17:48and it's asked me the first question.
17:50Cool.
17:51We can see that even though the sub
17:53agent burned a a ton of tokens I haven't
17:55actually um
17:57uh increased my token usage that much.
17:59Raise your hand if you don't know what
18:01sub agents are. It's important question.
18:04Everyone kind of clear what sub agents
18:05are? Okay, I'll give a brief definition.
18:07Which is that this this sub agents thing
18:10here, this explore sub agent it has
18:12essentially gone and called another LLM
18:14which has an isolated context window.
18:18And then that LLM has reported a summary
18:20back. So a sub agent is kind of like a
18:22delegation. You're delegating a task to
18:24a sub agent. It goes eagerly does all
18:26the thing, explores a ton of stuff and
18:28then just drip feeds the important stuff
18:30back up to the orchestrator agent.
18:33To the parent agent. So okay. So
18:35hopefully you guys have seen the same
18:36thing. It's done an explore.
18:38And we now have our first question.
18:41Points economy. What actions earn points
18:43and how much? Ooh, okay.
18:45At this point you can ask it by the way
18:47questions to um deepen your
18:49understanding of the repo. I obviously
18:50know this repo really well cuz I wrote
18:52it, but you might not um
18:54know what's going on.
18:55So let's say my recommendation, keep it
18:58simple, two point sources to start.
19:00What's so nice about this is that not
19:02only does it give us a question that
19:04kind of aligns us here, we get a
19:06recommendation too. And often what I'll
19:08find is the AI's recommendations are
19:09really good.
19:11And so I'll just say
19:12skip video watch events, they're noisy
19:14and gameable. I agree.
19:16Sarah's asked we'll keep the lessons in
19:17the bread and butter.
19:20Yeah.
19:21Looks good, pal.
19:24>> [snorts]
19:25>> Now what I usually do is I usually
19:26dictate to the AI. I'm usually actually
19:28chatting to the AI instead of uh typing
19:31here, but uh this is a relatively new
19:33laptop and I couldn't get my dictation
19:35software working on it um because
19:37Windows is crap. Um
19:40So, should points be retroactive? There
19:43are existing lesson progress records
19:45with completion at timestamps. This is a
19:47really nasty question, right? Should we
19:49actually go back and backfill all of the
19:51lesson progress events? This is a kind
19:53of question that you need to be aligned
19:55on if you're going to fulfill the
19:57feature properly. This is not something
19:58I considered and Sarah Chen certainly
19:59didn't consider.
20:01Do I want it to be retroactive? Hmm.
20:04Let's actually do a vote inside here.
20:07Should we go back and backfill all the
20:08records? Raise your hand if you think we
20:09should backfill all the records.
20:13Raise your hand if you think we
20:14shouldn't backfill all the records.
20:17There are a lot of fence-sitters in the
20:19room. I'm going to say
20:22you know, this is the kind of discussion
20:23you're sort of having with the AI.
20:24You're getting further aligned. Yes, I'm
20:25just going to go with his recommendation
20:27cuz I'm lazy.
20:31Notice too how I'm able to keep in the
20:33loop here with AI. I'm not you know,
20:35it's it's pinging me these questions
20:36pretty quickly.
20:39I'm not having to go off and check
20:40Twitter or something.
20:42Levels. What's the progression curve?
20:44Yeah, that looks about right. For
20:46instance, yes, okay.
20:47So hopefully you should be able to go
20:49and um
20:50kind of work through this with the AI.
20:52>> [clears throat]
20:52>> And essentially
20:54try to reach an alignment. And this
20:56grill me skill, this can last a long
20:58time. This can I've had it ask me 40
21:00questions. I've had it ask me 80
21:02questions. I've had some people that
21:03asks 100 questions too. Literally you're
21:06sat there for an hour chatting to the
21:08AI.
21:09And what you end up with is essentially
21:11this conversation history
21:13that works really nicely and works
21:15really nicely as an asset of the design
21:17concept that you're creating.
21:19This can also function like this. You
21:21can
21:22have a meeting with someone who's a
21:24maybe a domain expert. Maybe I have a
21:25meeting with Sarah. I feed that meeting
21:28transcript into
21:30I don't know, Gemini meetings or
21:32whatever you guys are using. You take
21:34that, you feed it into a grilling
21:36session and you grill through the
21:37assumptions that you didn't have.
21:39So this ends up being a really nice kind
21:41of
21:41um
21:43a really nice way of just taking inputs
21:45from the world and then just turning and
21:47validating them.
21:49So okay.
21:51Let's see. I really want to get to the
21:53end of this, but I also don't want to
21:54just like be sat here talking to the AI
21:56in front of you for uh
21:58a thousand days. So I'm just going to
21:59say yes.
22:03Let's see what happens.
22:05So I'll tell you what, um while you guys
22:07sort of have a little fiddle with this
22:08locally, let's start a little Q&A
Phase 3: Writing the PRD
22:10session now.
22:11And
22:13let's see. How's this going to work?
22:15Can we keep the door closed or turn up
22:16the microphone? It's quite noisy.
22:19Uh
22:20let's see. Mike, can we uh
22:22door closed. Oh it has been closed. Mark
22:24has answered. Beautiful.
22:26So what I'd like you to do
22:28is there any air con? Yeah, there is
22:30some air con, I think.
22:32There is some air con.
22:34You guys aren't being lit here. I'm
22:35being fro I'm being fried alive here.
22:38Uh so what I'd like you to do is go on
22:40to the Slido, which you can join here.
22:42Have a if if you're not taking the
22:44exercise, go on to the Slido, have a
22:46little fiddle and vote on some good
22:47questions. I'm just going to chat to the
22:49AI for a second
22:51uh until we reach a stopping point. So
22:53do streaks earn points?
22:56Um
22:57streaks are standalone.
23:06Let's see what else it comes up with.
23:13Where does gamification UI live?
23:15Let's have it in the dashboard.
23:19I'm just going to scan these and blast
23:20through them basically.
23:21So how are we doing with our Slido?
23:24Okay.
23:26Have I tried Spec Kit, Open Spec or
23:28Taskmaster instead of the Grill Me
23:30skill? Do I find them more verbose or a
23:32structured alternative? This is a great
23:33question. So there are a ton of
23:35different frameworks out there that
23:36allow you to um sort of build up this
23:39planning process for you. I personally
23:42believe you at at this stage, when
23:44there's no clear winner, when there's no
23:46kind of like one true way and when
23:48things are changing all the time, you
23:50need to own as much of your planning
23:52stack as you possibly can.
23:54What I've noticed and a lot of my
23:56students
23:57is
23:59they tend to overuse a certain stack.
24:03They get into trouble
24:05and they because they don't own the
24:06stack and they don't have observability
24:08over the whole thing, they just go
24:10this isn't working. This sucks. Whereas
24:13if
24:14um
24:14if you have control over the whole
24:16thing, then at least you know how to fix
24:19it or potentially know how to fix it.
24:21So I'm even though I'm sort of giving
24:24you uh a stack basically, I believe in
24:28inversion of control and you should be
24:29in control of the stack.
24:32So bur bur bur.
24:33Can I press zero, please?
24:38Sorry?
24:40Sorry, that was a lot of sort of
24:41mumbling. Can I
24:48Thank you.
24:50I'm so sorry.
24:50>> [laughter]
24:51>> What you didn't want to give Claude good
24:53feedback? What is what is wrong with
24:54you?
24:57Uh okay, cool.
24:59Uh many of the questions asked by the
25:01Grill Me skill are not necessarily
25:02appropriate for a developer, rather a
25:03PO. In larger teams, who should use it?
25:05Yeah.
25:06Um
25:07Raise your hand if um
25:10you've ever done pair programming.
25:12Anyone ever done pair programming?
25:13Right. I keep Put your hands down and
25:16raise your hand again if you've ever
25:17done a pair programming session with an
25:18AI.
25:20Right.
25:21How did it go? Was it good? You enjoy
25:23it? I think pair programming sessions
25:25with AI is a great idea because you've
25:27got a third person in the room who will
25:28relentlessly quiz you and ask you
25:30questions. It should If you don't know
25:32the answer, it should be you, the domain
25:33expert and the AI in the same room. If
25:36you're have a question about
25:37implementation, it should be you, a
25:39fellow developer and the AI in the same
25:41room, you know. You can be sort of
25:42working through these questions in your
25:44team. And I think actually
25:47we're going to look at implementation in
25:48a bit and we're going to see how you can
25:50make implementation so much faster.
25:52And but I think the really crucial
25:54decisions, the ones you need humans for
25:57you actually need a lot of humans and it
25:59doesn't really matter how many humans
26:00are in there. You can actually throw a
26:02bunch like a kind of like mob
26:04programming with AI essentially.
26:07Uh what's my favorite meta prompting
26:08tool? I think I kind of answered that.
26:10Uh there's no air con. Let's just live
26:12with it. Uh
26:14how do I use the conversation as an
26:15asset after the Grill Me session? Well,
26:18we're going to get there.
26:20Um okay, so I really want to
26:24I want to speed this up sort of
26:25artificially.
26:28Just what
26:29I This is the thing. So someone just
26:31said okay, Ralph loop this. But this is
26:33crucial because I can't loop over this,
26:36right? I can't um
26:39I think of there is being two types of
26:41tasks in the AI age.
26:43Where you have human in the loop tasks,
26:46where a human needs to sit there and do
26:48it.
26:49Which is this.
26:50We are the human in the loop, with
26:51multiple humans in the loop. And there
26:53are AFK tasks. There are tasks where the
26:55human can be away from the keyboard and
26:57it doesn't matter. Implementation, as
26:59we'll see, can be turned into an AFK
27:01task. But planning, this alignment
27:04phase, has to be human in the loop. Has
27:07to be.
27:09So I've got to do it, unfortunately.
27:11Um
27:12I don't know.
27:13Uh
27:14give me a long list of all your
27:18recommendations.
27:20I'm running a workshop right now.
27:24So I artificially
27:26need you to
27:28pull more weight.
27:31So let's see what it does.
27:33Uh let's answer a couple more questions
27:34while it's doing its thing.
27:37What is my opinion on PMs or other
27:39non-dev roles vibe coding task?
27:42Hmm.
27:45Um I'm going to return to this later, I
27:48think. I'm going to leave this
27:48unanswered.
27:51A bit of mystery.
27:53I notice I'm not using the ask user
27:55questions UI for Grill Me. Why? Um
27:57there's a specific uh
27:59UI that you can bring up in Claude Code.
28:01I'll answer this just quickly.
28:03Uh ask me a question using the ask user
28:08question tool.
28:10>> [snorts]
28:10>> And this UI um is just sort of broken in
28:13Claude and I really hate it.
28:17You notice I'm using Claude, but I don't
28:19like Claude very much. Like you you
28:20really are free with this method to
28:22choose any um system you like. And this
28:24is what the UI looks like.
28:26It's very pleasing when you first
28:27encounter it, but then you realize it is
28:28actually broken in a ton of different
28:29ways.
28:32All right, what did it come back with?
28:33Oh blimey.
28:35Oh no.
28:37So
28:40while this is doing its thing, let me do
28:41some teaching in the meantime.
28:43The plan here is that we take our Grill
28:46Me skill
28:47and we need to essentially find some way
28:49of turning it into
28:51a destination.
28:53We need to go down to the
28:56uh
28:57We essentially need to
28:58we're figuring out the shape of this.
29:01That's what we're doing. We're figuring
29:02out the shape of the tasks during the
29:03grilling session.
29:05And in order to
29:08turn it into a bunch of actionable
29:10actions for the AI
29:12we essentially need to figure out the
29:13destination. We need to know where we're
29:15going. We need to know the shape of this
29:16entire thing.
29:18So I think of there is being two
29:20essential documents that we need.
29:22We need a document that
29:24documents the destination.
29:27Oh no.
29:29It's so not bright enough. There we go.
29:33Still not brighter. There we go.
29:35We need something to document the
29:36destination.
29:38And we need something to document the
29:39journey.
29:41In other words, we need something a
29:42document that's going to
29:44figure out what this even looks like in
29:46all of its user stories and figure out a
29:48definition of done
29:50and then we need to figure out what the
29:51split looks like.
29:53So, that's where we're going to go to
29:54next.
29:55So, once we finish with the grilling
29:57session,
29:59yeah, it looks great. Fantastic. I love
30:01it. It answered
30:02it answered 22 of its own questions.
30:04There you go. That's quite
30:05representative of what a grilling
30:06session looks like.
30:09So, at this point now,
30:12I have used 25k tokens and all of that
30:16or loads of that stuff is gold. I want
30:18to keep that around. I've I've got 25k
30:22great tokens there.
30:24And what I want to do is kind of
30:25summarize it in some kind of destination
30:27documents.
30:28So, this is um the next exercise
30:31where we're going to
30:35uh we're going to write a product
30:37requirements document.
30:39And the the product requirements
30:40documents or the PRD
30:43is essentially
30:44that's its function. It's the
30:46destination documents. And it's sort of
30:48doesn't matter what shape it is. I've
30:51got a shape that I prefer and I quite
30:53like.
30:54But, you can just choose your own shape
30:56or whatever your company uses.
31:00And all we're really doing is I'm not
31:03too worried about that.
31:05All we're really doing is summarizing
31:07the design concept that we have so far.
31:10And
31:12the So, let let's try this.
31:15So, I'm going to initiate this. I'm
31:16going to say
31:17zoom all the way to the bottom.
31:19All I'm going to do is just say write a
31:20PRD.
31:23And we can take a look at that skill
31:24now.
31:26Write a PRD.
31:29So, this skill
31:31it does a few things.
31:34It first asks the user for a long
31:35detailed description of the problem. You
31:36can use write a PRD without grilling
31:38first, but I just like to grill first
31:40and then write the PRD afterwards.
31:42Then you can um get it to install the
31:45repo which we've kind of already done.
31:47Then we get it to
31:49interview the user relentlessly so we
31:50have a kind of grilling session again
31:52and then we start um putting together a
31:55PRD template. So, this is available in
31:57the repo if you want to check it out.
31:59And essentially this is what it looks
32:00like. We've got some problem statements,
32:02the problem the user is facing, the
32:04solution to the problem and a set of
32:06user stories. And these user stories
32:08sort of define what this is. You know,
32:10as
32:11you you guys have probably seen things
32:12like this if you've been a developer at
32:13all. Um you know, there are cucumber is
32:16a language you can use to write these in
32:17or we just sort of
32:18um
32:20uh write them ourselves essentially.
32:22Then we have a list of implementation
32:23decisions that were made and list of
32:25crucially testing decisions, too.
32:28So,
32:31I'm going to run this. Okay. And so,
32:33it's finished its thing.
32:35Ah!
32:37Windows, let me close the thing. Thank
32:39you.
32:40I don't know why I bought a Windows
32:41laptop. I think I just
32:43I like the challenge. Um
32:46>> [clears throat]
32:46>> So, the first thing that it's going to
32:47give me
32:49are a set of proposed modules it wants
32:51to modify.
32:54Now, there's a deep reason why I'm
32:55thinking about this. So, this is
32:58at this stage
33:00we have an idea, we have sort of specked
33:02out the idea, we've reached a sort of
33:05understanding of what we're trying to do
33:07and then we need to start thinking about
33:09the code
33:10because at this point we need to
33:13this is not specs to code. This is not
33:15where we're ignoring the code. We
33:17actually keep the code in mind
33:18throughout the whole process.
33:20And
33:21the way I like to do this is I like to
33:23just sort of think about a set of
33:24proposed modules to modify. We're going
33:26to return to this this idea of
33:28continually designing your system and
33:31keeping your system in mind.
33:33So, it's it's saying recommend tests for
33:34the gamification service is the only
33:36deep module with meaningful logic. These
33:38modules look right. Yeah.
33:41Looks good.
33:44And it's going to hang out a PRD.
33:48Now, for ease of setup
33:50I've got it so that it creates a set of
33:52issues locally.
33:54So, it's just going to create
33:55essentially a PRD inside this issues
33:57directory.
33:59But, the way I usually do it
34:01and you can check this out yourself is
34:04you can go to my um essentially what I
34:05consider my work repo
34:07which is GitHub um dot com forward slash
34:10Matt Pocock forward slash course video
34:13manager up here.
34:15And in here, this is essentially a app
34:17that I create um that I use all the time
34:20to record my videos and things like
34:21this. I think I've recorded like
34:24I pulled out the stats. I think I've
34:25recorded like a thousand videos in here
34:27or something nuts.
34:28Um and you can see here that it's got
34:30744 closed issues.
34:32And this is essentially all of the uh
34:35PRDs and all of the implementation
34:37issues that I've put into here. So, this
34:39is how I usually like to do it.
34:40>> [clears throat]
34:42>> So, that's what I'm doing with the There
34:45we go. Yeah, I'm just going to say yes
34:47and uh
34:49and get that issue out.
34:51Let's see. It is inside here.
34:53So, we've got the problem statements.
34:55People signing up for courses.
34:57Uh the solution, the user stories, uh 18
35:00user stories looks nice, some
35:02implementation decisions, level
35:03thresholds, etc. This is enough
35:05information. We've kind of clarified
35:07where we're going and what we're doing.
35:09So, that's what we do. We essentially
35:11have a grilling session and we've
35:12created an asset out of it. Now, raise
35:14your hand.
35:16Should I be reviewing this document?
35:19Raise your hand if you think I should be
35:20reviewing the documents.
35:23Yeah, I don't I don't look at these.
35:24I don't look at these.
35:26The reason I don't look at these is
35:27because what am I testing at this point?
35:30What am I Like when I read it,
35:33what am I testing? What am I What are
35:34the failure modes I'm trying to test
35:35for?
35:36I know that LLMs are great at
35:37summarization
35:39cuz they are. They're really good at
35:40summarization.
35:41I have reached the same wavelength as
35:44the LLM, right? Using the grill me
35:45skill, we have a shared design concept.
35:48So, if I have a shared design concept,
35:49all I'm doing
Phase 4: Slicing Work into Issues
35:51is I'm just essentially checking the
35:53LLM's ability to summarize.
35:56So, I don't tend to read these.
36:00Let's have Let's have a Q&A cuz I can
36:02feel you guys are itching for it. And I
36:03think we might have like
36:05I don't know, just a 5-minute comfort
36:07break just to uh rest my voice and so
36:08you can catch up with the exercises for
36:09a minute if that's all right. So, let's
36:11have a little Q&A sesh.
36:14Uh
36:15If I don't like Claude Code, which one
36:16do I actually like? Um
36:19uh
36:20Have you ever heard the phrase um
36:23uh democracy is the worst way to run a
36:24country apart from all the other ways?
36:27That's how I feel about Claude Code.
36:30Uh we've answered that one.
36:33Uh
36:34What's your thoughts on developers
36:36needing to very deeply understand
36:37TypeScript now that fix the TS make no
36:40mistakes exist? I don't understand the
36:42phrasing of this,
36:43but I think I understand meaning,
36:46which is that
36:48I believe that code is very important
36:50and this is kind of going to feed
36:52through the whole session and that bad
36:54code bases make bad agents. If you have
36:57a garbage code base, you're going to get
36:59garbage out of the agent that's working
37:01in that code base. We'll talk more about
37:02that in a bit.
37:03And so, I think understanding these
37:05tools very deeply, understanding code
37:07deeply is going to make you a much much
37:10better developer and get more out of AI.
37:14Uh and that answers that question, too.
37:16Sweet.
37:19Uh
37:20Get out of there. There you are.
37:24Now that we have 1 million tokens
37:25available, do we ever actually want to
37:27take advantage of that?
37:30I've noticed that the dumb zone has
37:31become less dumb lately. Okay, great
37:33question. This goes back to our kind of
37:35initial idea on the dumb zone.
37:41Uh
37:43I am I recorded my Claude Code course
37:46using a 200k context window and on the
37:48day that I launched the course they
37:50announced the 1 million context window.
37:53My take on this is that what Claude Code
37:54did is they essentially just did this.
37:56Wee!
37:58They shipped a lot more dumb zone to you
38:01essentially. Now, this is good for tasks
38:03where you want to retrieve things from a
38:05large context window. If you want to
38:07pass five copies of War and Peace or
38:09something to it and you want to find out
38:11all the things that uh
38:14uh I can't remember a character from War
38:15and Peace. Uh
38:17Why did I start with that?
38:18It's good for retrieval.
38:19It's less good for coding.
38:21So, I consider that it is about 100k at
38:26the moment is the smart zone. The smart
38:28zone will get bigger and that will be a
38:31really nice improvement.
38:33So, folks, we're going to take it like a
38:345-minute comfort break if that's all
38:36right just for my voice and to maybe you
38:38can have a little move around or
38:39something or grab a drink. I can just
38:41notice some sleepy eyes and I want to
38:42make sure that we're awake for the next
38:44bit if that's all right. So, we'll take
38:455 minutes and I will see you back here
38:49then. All right?
38:51So, we have
38:53our PRD
38:55which I'm not going to read, our kind of
38:56destination document. Let's quickly scan
38:58for any good questions before we zoom
39:00ahead.
39:02And
39:05Rediscovering the role of software
39:06engineering today's world, top three
39:08disciplines you recommend.
39:10Um
39:11Taekwondo is good, I've heard. I've no
39:13I've no idea how to answer this
39:14question. Um
39:16thank you for asking it though. Um Top
39:18three disciplines I recommend.
39:20I mean
39:21Sorry? Plumbing. Plumbing is a good one.
39:23Yeah, yeah, yeah. I don't know if that's
39:25a discipline. I the plumbers I've hired
39:26are not usually very disciplined.
39:28Um
39:30Right.
39:32So, okay. We now have our destination,
39:34okay? Um
39:37Perfect.
39:38So, how do we actually get to our
39:40destination? How do we We have a sort of
39:42vague PRD? How do we split it so that we
39:46don't put things into the dumb zone?
39:48In other words, we have our number four,
39:50how do we split it into this kind of
39:52multi-phase plan? Well, probably what
39:54you would do at this point is you would
39:55say, "Okay, Claude, give me a
39:57multi-phase plan that gets me to this
39:59destination, right?" That sort of makes
40:00sense. This is what we've been doing
40:01before.
40:03But I have um
40:04a sort of better way of doing it now,
40:05which is that
40:08I like
40:10creating a Kanban board out of this.
40:13Raise your hand if you don't know what a
40:15Kanban board is.
40:17Mm, cool. Okay. A Kanban board is
40:19essentially just a set of tickets that
40:21you put on the wall that have blocking
40:23relationships to each other. So, we're
40:25going to see what it kind of looks like
40:26here. This is how we've worked um
40:29as developers for a long time, really
40:31since Agile came around. And what it
40:34does, we can see it here,
40:36it has proposed that we split this setup
40:39into
40:41um five different tasks here.
40:43We have the first one, which is the
40:44schema and the gamification service.
40:47Yeah, well, that looks pretty good. This
40:48is blocked by nothing.
40:50And we can even see here that it's a
40:52it's given it a type of AFK, too. You
40:54remember I talked about human in the
40:55loop and AFK earlier? This is an AFK
40:57task. This is something we can just pass
40:59off to an agent to do its thing.
41:01Streak tracking, okay, that looks good.
41:04Uh
41:05then wire points and streaks into
41:07lessons quiz completion. This is blocked
41:08by one and two.
41:10Retroactive backfill. This is blocked
41:11only by one.
41:13And then this one here is blocked by all
41:15of the tasks. Cool.
41:19Hmm.
41:20Now, I consider this you could say, "Why
41:23don't we just make this sort of
41:24generation of the issues, why don't we
41:26just hand that over to the AI? Why do I
41:28need to be involved here, right?" Cuz
41:30it's given us quite a good selection of
41:31tools here. Why do I need to review this
41:34and sort of
41:35figure out what's next?
41:37Now, my take here is that this is really
41:39cheap to do, like very quick to do once
41:42I've done the PR, and I can immediately
41:43see some issues here.
41:47There's a really, really important
41:49technique when you're kind of figuring
41:51out what the shape of this journey
41:53should look like.
41:55And
41:57it sort of comes to this very classic
42:00idea, uh which comes from the Pragmatic
42:02Programmer called traceable bullets or
42:04vertical slices.
42:07And traceable bullets really transformed
42:09the way I think about actually
42:11getting AI to pick its own tasks.
42:14Systems have layers, right?
42:17There are layers in your system.
42:19These might be different deployable
42:20units. You might have a database that
42:22lives somewhere. You might have an API
42:23that lives maybe close to the database
42:25but in a separate bit. You might have a
42:27front end that lives somewhere totally
42:28different like a CDN.
42:30Or within these deployable units, you
42:32might have different layers within
42:34those. In for instance, the code base
42:36that we're working in, we have a ton of
42:38different services. Service. We have a
42:41quiz service, a team service, a user
42:43service, coupon service, core service.
42:45And these services have dependencies on
42:47each other. So, they're kind of like
42:48individual layers.
42:50Well,
42:51what I noticed is that AI loves to code
42:55horizontally.
42:57So, it loves to code layer by layer.
43:00So, in other words, in phase one, it
43:01will do all of the database stuff, all
43:03of the schema, all of the you know, all
43:05the stuff related to that unit. Then it
43:08will go into phase two and do all of the
43:10API stuff. Then it will add the front
43:12end on top of that.
43:14Does Can anyone tell me what's wrong
43:16with that picture? Why is that not a
43:18good thing to do? Raise your hand if you
43:20have an answer.
43:21Yeah.
43:21>> have that whole feedback loop.
43:23Exactly. You don't get feedback on your
43:26work until you've
43:28really started or completed phase three.
43:32So,
43:33what you really need to do is you you're
43:34not until you get to phase three, you're
43:36not actually testing that all the layers
43:38work together.
43:41You haven't got an integrated system
43:42that you can test against.
43:44And so,
43:45instead you need to think about vertical
43:47layers. You need to think about thin
43:49slices of functionality that cross all
43:52of the layers that you need to.
43:54And this is a much better way to work,
43:57much better way for the AI to work, too,
43:59because it means at the end of phase one
44:00or during phase one it can get feedback
44:02on its entire flow.
44:04So, what this means to me
44:07is inside the PRD to issues skill up
44:11here,
44:12I have got break a PRD into
44:15independently grabbable issues using
44:17vertical slices traceable bullets
44:18written as local markdown files.
44:19[snorts]
44:21We first locate the PRD.
44:23Uh again, explore the code base if this
44:25is a fresh session. We draft vertical
44:27slices.
44:28So, we break the PRD into traceable
44:30issues. A traceable bullet, by the way,
44:32is uh
44:34essentially when you're like an
44:35anti-aircraft gunner. It's quite a
44:37violent idea, actually. Uh
44:39and you're looking up in the sky and
44:40it's night. If you're just shooting
44:42normal bullets, you have no idea what
44:44you're firing at, right? You could just
44:45be you know, you you see the plane but
44:47you don't see where your bullets are
44:48going.
44:48Traceable bullets is they attach a tiny
44:50bit of phosphorescence or phosphor or
44:52something to make it glow as it goes.
44:55So, this means that every sixth bullet
44:57or something you actually see a line in
44:58the sky. So, you have feedback on where
45:01you're aiming. So, this is what this is
45:03the idea here is that we increase our
45:05level of feedback and we get near
45:07instant feedback on what we're building.
45:09Cuz without that the AI is kind of
45:11coding blind until it reaches the later
45:12phases.
45:14We got some vertical slice rules. We
45:15quiz the user.
45:17And then we create the issue files. So,
45:20what I see here
45:21is that even though
45:23I've I've told it to do vertical slices,
45:26it's proposing to
45:29create the gamification service
45:32first on its own. That's just one slice
45:34there. And that to me feels like a
45:36horizontal slice. What I want to see in
45:38the first vertical slice especially is I
45:40want to see the schema changes or some
45:42schema changes. I want to see some new
45:45service being created and I want a
45:46minimal representation of that on the
45:48front end. So, I want it to go through
45:50the vertical slices, not just the
45:52horizontal. Does that make sense?
45:54Okay. So, I'm going to give the AI
45:57a rollicking.
45:58Uh bad boy. No, I'm not.
46:01I'm not going to waste tokens just being
46:04just naming. Um
46:06So, the first slice is too horizontal.
46:10I'll just start with that and see if it
46:11picks it up.
46:12Does that make sense as a concept?
46:14And I think having that um
46:17what I really like about going back to
46:18those old books is that we're really
46:21trying to in this day and age like get
46:24uh
46:25verbalize best software practices in
46:27English.
46:29And these books, 20-year-old books, have
46:31already done that. And it's an absolute
46:33gold mine if you want to throw that into
46:34prompts. But even with that, it's not
46:36going to um not going to do a perfect
46:38job each time.
46:39So,
46:40award points for lesson completion
46:42visible on dashboard. Yes, that's a
46:44beautiful vertical slice because it's
46:47definitely a big chunk of stuff. It's
46:48doing a lot of stories there, but we're
46:51going to see something visible at the
46:52end and the AI will then just be able to
46:54add to that. You see why that's
46:56preferable to the first one. Cool.
46:58Uh looks great.
47:01So, we're getting closer now. Anyone
47:03following at home as well, you know, not
47:05at home but you get the idea.
47:06Um will hopefully see the same thing,
47:09too, and start developing the same
47:10instincts.
47:11Let's open up for questions just while
47:13I'm still creating these GitHub issues.
47:16Uh ba ba ba ba Oh, not GitHub issues. Uh
47:18local issues.
47:20When will I stop using Windows? Never.
47:22What is your Okay, we'll get to that
47:24later.
47:25How does AI um decide when to stop
47:27grilling? Cuz AI can ask incessantly,
47:30can we have a smarter way to decide the
47:31stop point? Yeah, it does tend to really
47:34um
47:34those grilling sessions can be super
47:35intense. And the thing about these
47:37skills is you can tune them if you want
47:39to. If you feel like the AI is just
47:41absolutely hammering you, hammering you,
47:42hammering you, then you can just
47:44tell it to just pull back a little bit
47:46or get it to do, you know, stop points
47:48and that kind of thing. So, if that's a
47:49failure mode that you run into a lot,
47:51then you just, you know, change the
47:52skill.
47:55Uh do I still use uh be extremely
47:57concise, sacrifice grammar for the sake
47:58of concision? Um there was a tip that I
48:00gave folks um
48:035 months ago, which is that
48:05to basically increase the readability of
48:07your plans. So, when you're using plan
48:09mode,
48:10then you can put it in your Claude.md
48:13and you can say, "Okay, yeah, approve
Phase 5: Implementation with AI Agents
48:15that."
48:17Let's open up Claude.md.
48:21Uh do I have a Claude.md? Maybe I don't.
48:23I I really don't use Claude.md very
48:24much. I'm just going to put a dummy
48:26inside here.
48:28Um when
48:30No.
48:31When talking to me,
48:33uh sacrifice grammar for the sake of
48:34concision.
48:40And this um prompt was uh really useful
48:43to me when I was reading the plans
48:45because it meant that the plans would
48:46come out and they would be very concise,
48:48really nice, easy to read, often very
48:50concise. But I've
48:53since dropped this idea in preference to
48:56a grilling session because what I
48:57noticed with it just I didn't want to
48:59read the plans. I wanted to get on the
49:01same wavelength as the LLM. I wanted it
49:03to ask aggressive questions to me. And
49:04when I stopped reading the plans, I
49:06stopped needing them to be concise.
49:08So, I think of the plans really in the
49:09destination document as uh the end
49:12state. And I don't need that end state
49:13to be concise.
49:15Hopefully that answers your question.
49:19Uh
49:20What do I think will be the outcome of
49:22the Mexican standoff of future roles of
49:23PMs and other roles converging? Uh I've
49:25no idea. I'm not a pundit. I've no idea.
49:29Uh okay.
49:31So, we should
49:33uh after a couple of approvals,
49:37uh end up with a set of issues.
49:39Now,
49:40these issues that we're creating,
49:42they're designed to be independently
49:44grabbable,
49:45which means that this Kanban board ends
49:48up looking kind of like this.
49:51Where you have
49:53essentially a set of tickets with a
49:55whole load of independent relationships.
49:57So, this one needs to be done before
49:58this one. This one needs to be done
50:00before this one.
50:01And this one, let's say we got another
50:03one over here.
50:05This one needs to be done before this
50:05one.
50:06This means that you can start to
50:09parallelize.
50:10You can start to get agents working at
50:13the same time on these tasks. Because
50:15yeah, this one needs to be done first.
50:18And then
50:19these two
50:21can be grabbed at the same time by
50:24independent agents.
50:26Raise your hand if you've done any kind
50:27of parallelization work with agents.
50:30Okay, cool. So, this allows you
50:33um to turn those plans into to optimally
50:35kind of like into a directed acyclic
50:38graphs essentially, where you just are
50:40able to um
50:42essentially have three phases here.
50:45Where you have
50:46phase one.
50:48Uh let me grab move that.
50:51Uh
50:52above this line here,
50:55you do this one.
50:56Then phase two, you do the two below it.
50:58And then phase three, you do this third
51:00one and add it onto that.
51:02And when you think about there could be
51:04This could This is a relatively simple
51:06plan, but you could have many different
51:08plans operating all at once. It means
51:10that you can do really nice
51:11parallelization. And we'll talk more
51:12about that in a bit. But that's why I
51:14prefer a Kanban board set up like this
51:18to a sequential plan. Because a
51:20sequential plan can really only be
51:21picked up by one agent.
51:24So, this
51:26Where did it go? Over here.
51:29Yeah, this plan here
51:31This is really only one loop, right?
51:33Only one agent can work on these because
51:36we have numbered phases and they're not
51:38parallelizable. Does that make sense?
51:40Cool.
51:42So, we've got our issues. Ah, come on.
51:44Stop asking me for I know it's creating
51:46them on GitHub. I really don't want
51:47that.
51:49Oh, no.
51:51You fool.
51:53Create them in issues instead.
51:57No.
51:58That's not precise enough.
52:00Uh you fool.
52:01Create them in local markdown files
52:05instead, referencing the local version.
52:11Sorry about this.
52:15So, once we get to this point,
52:17we [clears throat] have a bunch of
52:18issues locally
52:20that we can start um looping over and
52:24implementing. And it's at this point
52:26that the human leaves the loop.
52:28So, so far
52:31Let me pull up a a proper overview of
52:33this kind of flow that we're exploring
52:35here.
52:37So far
52:40we have taken an idea.
52:43I'll zoom this in a bit for the folks at
52:44the back.
52:46And we've grilled ourselves about the
52:49idea.
52:51We can skip over research and prototype,
52:52but we turn that into a PRD, into a
52:54destination document.
52:56We then turn that PRD into a Kanban
52:59board. And all of those steps
53:01are human reviewed.
53:03And now
53:05the implementation stage, we step back.
53:08And we let an agent um work through that
53:10Kanban board or multiple agents work
53:12through the Kanban board.
53:15Now, what this means is that yeah, we
53:17spent a lot of time planning here, but
53:19it means that we've queued up a lot of
53:20work for the agent. We can think of this
53:23as kind of like the day shift and the
53:24night shift. This is the day shift for
53:26the human, right? Planning everything,
53:28getting all the all the stuff ready. And
53:30then once we kick it over to the night
53:32shift, the AI can just work AFK. But
53:35what does that look like?
53:37Well,
53:39so I'm just going to Oh, yeah. Just
53:40allow it. It's perfect.
53:42So, this looks like
53:44if we head to the next exercise,
53:47which is
53:51uh in fact, the last exercise here,
53:52running your AFK agent.
53:55Now,
53:57I've called this uh Ralph really cuz it
53:59is a it is essentially a Ralph loop.
54:02And this prompt here, I want to walk
54:04through this really closely.
54:06The first thing it's doing here is we're
54:08essentially going to run Claude
54:10and we're going to basically try to
54:11encourage it to work um
54:14completely AFK.
54:16I'll show you what the sort of script
54:17for this looks like in a minute.
54:19But you say, "Okay, local issue files
54:21from issues are provided at the start of
54:22context."
54:24The way we do that is if you look inside
54:26once.sh here inside the repo,
54:29we have
54:31uh it's essentially just a bash script,
54:34where we grab all of the issues,
54:36um [clears throat] which are inside
54:38markdown files, and we cat them into a
54:40local variable. So, that issues variable
54:42contains all of the issues that are in
54:45our entire backlog.
54:47Then we grab the last five commits. I'll
54:50explain why in a minute.
54:52And then we grab the prompt and we just
54:54run Claude code with permission mode
54:56accept edits.
54:57And then just essentially just pass it
55:00all of the information.
55:02This is what the implementer looks like.
55:04So, that's what a very very simple
55:05version of this sort of loop looks like.
55:08And of course, this is not a loop. This
55:09is just running it once.
55:12The loop
55:13is in the AFK version up here,
55:15which is uh a fair bit more complicated.
55:18And the crucial part here is we're
55:20running it in Docker sandbox as well.
55:22So, I I don't want you to install Docker
55:25on your laptops because we're just going
55:26to be like, "You need to download a
55:28special image and we're going to tank
55:29the conference Wi-Fi if we do that." So,
55:31I'm I am going to demo this to you, but
55:33you um
55:34won't need to run this yourself, but
55:35I'll talk through this in a minute. But
55:37essentially, this once loop here,
55:41and ba ba ba ba boom.
55:44We're just essentially running one
55:46version of the thing that we're going to
55:48loop again and again and again. So, this
55:50is kind of like the human in the loop
55:51version. And this is essential. Running
55:54this again and again is essential
55:55because you're going to see what the
55:56agent does and see how it ends up
55:58working. And any tuning that you need to
56:01add to the prompt, then you can do that.
56:03Let's go to the prompt.
56:06Um
56:09So, local issue files are being passed
56:11in.
56:12You're going to work on the AFK issues
56:13only. That makes sense.
56:15If all AFK tasks are complete, output
56:17this no more tasks thing.
56:19And then the next thing, pick the next
56:21task.
56:23So,
56:26what we're doing here is we're
56:27essentially running a backlog or
56:30curating a backlog that our AFK agent is
56:32going to pick up. That's the purpose of
56:34all of these um setups in the beginning.
56:38In this uh
56:39all the way to this Kanban board here,
56:41we're just essentially creating a
56:43backlog of tasks for the night shift to
56:45pick up.
56:46And the night shift, this sort of Ralph
56:49prompt here, it's got its own idea about
56:52what a good task looks like to next pick
56:54up.
56:56I'm I did talk about parallelization. I
56:58will show you this later, but this is
56:59essentially a sequential loop here.
57:01We're just going to run one coding agent
57:03at a time. This is a good way to just
57:04sort of um get your feet wet
57:06essentially.
57:08So, it's prioritizing critical bug
57:10fixes, development infrastructure, then
57:12trace bullets,
57:14then polishing quick wins and refactors.
57:17And then we just have a very simple kind
57:19of instruction on how to complete the
57:20task.
57:21So, we explore the repo.
57:23Use TDD to complete the task. I'll get
57:25to that later.
57:27And
57:28we then run some feedback loops. So,
57:30let's let's just try this and let's just
57:31see what happens.
57:33So, good. It's created the issue files.
57:34We should be good to go. I'm going to
57:36cancel out of this.
57:38I'll clear and I'm going to run
57:40uh
57:41Where is it? Ralph
57:43once.sh. And you can feel free if you're
57:45following along to do the same thing.
57:48So, we can see it's just running Claude
57:50inside here
57:51with the prompt and with all of the
57:53issues that have been passed in.
57:56And while it's doing its thing,
57:59you probably have some questions about
58:01this setup and about the decisions that
58:03I've made to essentially
58:05delegate all of my coding to AI, right?
58:08So, let's let's do a quick Q&A while
58:10it's getting its feet under it.
58:14Uh okay. Ba ba ba ba ba.
58:17I'm going to just
58:19remove those.
58:23How do you retain negative decisions,
58:25things that you decided against, and
58:26rationales when persisting the results
58:28from the grill me session? Uh great
58:30question.
58:31There's a very simple answer, which is
58:33the in the PRD uh write a PRD section,
58:37there is a stuff at the bottom, a
58:39section of the things that are out of
58:40scope. So, the things we're not going to
58:42tackle in this PRD, which is very
58:44important for giving a definition of
58:45done.
58:47Feel free to ping on the Slido if you've
58:48got any more questions.
58:51Uh what's my front end workflow? Okay,
58:53it's a great question. I'm going to I'm
58:55going to answer that in a minute, I
58:56think.
58:58How to deal with agents producing more
59:00code that we can review? How to properly
59:02parallelize and use multiple agents
59:05separate way. Okay, that's That's two
59:06questions there.
59:08Um
59:09Raise your hand
59:10if you feel like you're doing more code
59:12review now than you used to.
59:16Yeah, definitely.
59:18Um
59:18I don't think there's a way to avoid
59:20this.
59:22If we delegate all of our coding to
59:25agents,
59:27you notice that the implementation here
59:29is really the only AFK bit. We then also
59:32need to QA the work and code review the
59:34work, right?
59:36And if we are
59:38running these loops where it's
59:39essentially going to implement four
59:40issues in one,
59:42it's hard to pair that with the dictum
59:45that you should keep pull requests small
59:47and self-contained, right? Like small
59:49self-contained pull requests means
59:52you're needing to do fewer loops or
59:55shorter loops or something.
59:57Or maybe you do like a big stack of PRs,
59:58but that seems horrible as well. That's
1:00:00still just more separated code to
1:00:02review. I don't honestly know what the
1:00:04answer to this yet.
1:00:06I think we just need to be ready to be
1:00:07doing more code review, essentially.
1:00:10Which is not fun. That's not fun thing
1:00:11to say. That's not like I don't know. I
1:00:13don't feel good saying that, but I do
1:00:15think it's probably the
1:00:17the way things are going.
1:00:18It's a great question.
1:00:21Uh
1:00:23Can we grab a couple of questions from
1:00:25the room as well? Let's not We won't do
1:00:27the mic, but uh raise your hand if
1:00:28you've got a question for me
1:00:29immediately.
1:00:31Yeah.
1:00:32So, the approach is very linear from an
1:00:34idea to uh QA code review. Of course,
1:00:38the real world is a lot more messy. So,
1:00:40you have all these ideas that are in
1:00:42parallel and
1:00:43nobody has the full picture. And
1:00:46uh while you're working on something,
1:00:47something else comes in as
1:00:49a bug. Yeah. How do you deal with the
1:00:50messiness? How do you tighten that
1:00:52feedback loop? Great question. So, the
1:00:54question was
1:00:55if this all looks great if you're a solo
1:00:57developer, but actually how do you
1:00:58implement this in a team? How do you
1:01:00gather team feedback on this?
1:01:02And my answer to that is that if you
1:01:04have an idea up there
1:01:06and
1:01:07essentially the sort of journey from the
1:01:10idea to the destination
1:01:12is something you need to figure out with
1:01:13the team, right? So, all of this stuff
1:01:16up here, this is kind of like team
1:01:17stuff, you know what I mean? This So, if
1:01:20you have an idea and you do a grilling
1:01:22session on it and you have a question
1:01:23that you don't know how to answer, then
1:01:25you need to loop in your team as we
1:01:27described before. Then you might need to
1:01:29go, "Okay, like we just need to build a
1:01:30prototype of this. We need to actually
1:01:32hash this out. We need something that
1:01:33the domain experts can fiddle with."
1:01:36Or okay, we might need to integrate a a
1:01:38third-party library into this. We might
1:01:39need to do some research. We might need
1:01:41to actually kind of like um
1:01:44ping this back and forth and find a
1:01:45third-party service that we can get the
1:01:46most out of. We might need to go back
1:01:49with the information that we gathered
1:01:50there to the idea phase. So, all the way
1:01:53up to the sort of PRD in the journey,
1:01:55that's something you need to involve
1:01:56your team with. That's something where
1:01:58these assets are going to be shared over
1:02:01and you're going to have requests for
1:02:02comments on them and that that loop is
1:02:05going to just keep grinding and grinding
1:02:07until you figure out where you're going.
1:02:09Once you figure out where you're going,
1:02:11then you can start doing the Kanban
1:02:12board implementation. But this is
1:02:14essentially super arguable and the
1:02:16you'll be bouncing back and forth
1:02:17between the phases. Does that make
1:02:18sense? Yeah.
1:02:20Would you not need a
1:02:21PRD for your prototype?
1:02:23Say again, sorry. Would you not want to
1:02:24have a PRD for your prototype? The
1:02:26question was, do you want to go through
1:02:27this whole session just to sort of
1:02:29create a prototype? You don't need a PRD
1:02:31for your prototype as well. Let's just
1:02:33quickly talk about prototypes for a
1:02:34second.
1:02:35Um there was a question about how do you
1:02:36make this work for front end?
1:02:39Like how do you cuz front end is like
1:02:41really sensitive to human eyes. You need
1:02:43human eyes looking at the front end all
1:02:45the time to make sure that it looks
1:02:47good.
1:02:48AI doesn't really have any eyes. It can
1:02:51look at code,
1:02:52but it front end is multimodal.
1:02:55And so my experiences with trying to
1:02:58plug AI into um let's say agent browser
1:03:02or Playwright MCP to give it
1:03:04You can give it tools to allow it to
1:03:06look through a front end and sort of
1:03:07look at images, but in my experience the
1:03:10um it's not very good at that yet and it
1:03:12can't create a nice front end in a
1:03:15mature code base. It can sort of spit
1:03:17one out. But what it can do is you say,
1:03:20"Okay, uh I want some ideas on how uh
1:03:22this front end might look. Give me three
1:03:24prototypes um that I can click between
1:03:27in a throwaway uh
1:03:29throwaway route that I can decide which
1:03:31one looks best." And you take the asset
1:03:33of that prototype and you then feed it
1:03:35back into the grilling session or you
1:03:37get feedback on it, blah blah blah blah
1:03:38blah.
1:03:39Answer your question kind of thing?
1:03:41The prototype is just, you know, it's
1:03:42messy. It's supposed to give you
1:03:44feedback earlier on the process.
1:03:46So, that's a great way of working with
1:03:47front end code, great way of looking at
1:03:48software architecture in general. Let's
1:03:50go one more question here. Yes.
1:03:52>> [clears throat]
1:03:52>> In your system, how do you integrate
1:03:54respecting an architecture and design
1:03:57with API contracts and fitting with your
1:03:59larger system?
1:04:01Uh security constraints, all kinds of
1:04:03constraints like that.
1:04:04Yeah.
1:04:05There's a lot in that question. The
1:04:07question was, how do you conform with
1:04:08existing architecture? How do you do um
1:04:12how do you make it conform to the code
1:04:13standards
1:04:14like of your code base or Yeah, the
1:04:17architecture design APIs, Yeah. security
1:04:19rules that constrain your design. Yeah.
1:04:23I'm going to answer that in a bit.
1:04:25That's okay.
1:04:26So, hopefully we have started to get
1:04:28some stuff cook cooking. Uh it's just
1:04:32pinging on the explore phase here.
1:04:36Hmm, tempted to just start running it
1:04:38AFK.
1:04:40Maybe I will, maybe I won't.
1:04:43Um
1:04:44What it's essentially doing is it's
1:04:45exploring the repo. It's going to then
1:04:47start implementing based on what we
1:04:48wanted.
1:04:49Let's actually have one more question
1:04:50just while it's running. Yeah.
1:04:52Why not AI
1:04:54QA everything
1:04:58Yeah.
1:04:59So, the question was, why do you not get
1:05:02AI to QA?
1:05:05AI to QA.
1:05:06I just got uh jargon overload for a
1:05:08second. Um why do you not get AI to uh
1:05:11test its own code? Now, of course, you
1:05:13absolutely can. And I think while it's
1:05:16doing while it's cooking here,
1:05:18okay, it's got a clear picture of the
1:05:19code base. It's assessing the issues.
1:05:22It's doing issue 02 as the next task.
1:05:24I'm again going to show you that in a
1:05:25bit, I think. The sort of uh cuz you
1:05:28definitely should do an automated review
Phase 6: Human-in-the-Loop Review
1:05:31step as part of implementation.
1:05:33So, you have your implementation, you
1:05:35should then, because tokens are pretty
1:05:37cheap and AI is actually really good at
1:05:38reviewing stuff, you should get it to
1:05:40review its own code before you then QA
1:05:42it.
1:05:43I found that that catches a ton of
1:05:44different bugs
1:05:46and
1:05:47the way that works is I will just do a
1:05:50little diagram is if you have, let's
1:05:52say, an implementation that sort of like
1:05:54used up a bunch of tokens in the smart
1:05:56zone,
1:05:57if you get it to sort of try to
1:06:00do its reviewing, it's going to be doing
1:06:01the reviewing in the dumb zone.
1:06:05And so, the reviewer will be dumber than
1:06:06the thing that actually implemented it.
1:06:08If we imagine this is the
1:06:11uh let's be consistent. That's the
1:06:12review.
1:06:13That's the implementation.
1:06:15Whereas if you clear the context,
1:06:19then
1:06:21you're essentially going to be able to
1:06:22just review in the smart zone, which is
1:06:24where you want to be.
1:06:27Let's see how our implementation is
1:06:28doing.
1:06:29Okay, good. It's generating a migration.
1:06:31That looks pretty nice.
1:06:32We're getting some code spitting out.
1:06:37And
1:06:38while I'm sort of like Aha, here we go.
1:06:42TDD.
1:06:43Let's talk about TDD and then I think
1:06:45we'll have a little another little
1:06:46break.
1:06:48TDD I found is absolutely essential for
1:06:51getting the most out of agents. Uh raise
1:06:53your hand if uh you know what TDD is.
1:06:56Cool. Okay. TDD is test-driven
1:06:58development. What it's essentially doing
1:07:00is it's doing a something called red
1:07:03green refactor. And if you look in the
1:07:05code base, you'll be able to find a um a
1:07:07skill which really describes how to do
1:07:10red green refactor and teaches the AI
1:07:12how to do it.
1:07:13So, what it's doing is it's writing a
1:07:15failing test first. So, it's saying,
1:07:18"Okay, I've broken down the idea of what
1:07:20I'm doing and I'm just going to write a
1:07:22single test that fails and then I need
1:07:25to make the implementation pass."
1:07:27I have found that
1:07:30first of all, this adds tests to the
1:07:31code base and these this tends to add
1:07:33good tests to the code base. And so,
1:07:35we've got this kind of gamification
1:07:37service.
1:07:38It looks like it's
1:07:39using some existing stuff to create a
1:07:41test database. Test fails because the
1:07:43module doesn't exist yet. Okay, we've
1:07:45confirmed red. And then it goes and
1:07:48hopefully runs it and it passes.
1:07:51I found that uh raise your hand if
1:07:54you've ever had AI write bad tests.
1:07:58Yeah.
1:07:59It tends to try to cheat at the tests
1:08:01because it's sort of doing it in layers.
1:08:03It will do the entire implementation and
1:08:05then it will do the entire test layer
1:08:07just below it.
1:08:08Uh
1:08:09I'm just going to say yes, you're
1:08:10allowed to use NPX V test.
1:08:12And using this technique, it generally
1:08:15is a lot harder to
1:08:18cheat because it's
1:08:20sort of instrumenting the code before
1:08:22it's then writing the code. So, I find
1:08:24that TDD is so so good for places where
1:08:28you can pull it off. In fact, it's so
1:08:29good that I sort of warped my whole uh
1:08:32technique around getting TDD to work
1:08:34better.
1:08:35I can see some dripping eyes. It is so
1:08:37hot in here.
1:08:38You can't imagine how hot it is up here.
1:08:40Let's take another 5-minute comfort
1:08:41break. Let's come back at quarter to, I
1:08:45think. Have a nice generous one.
1:08:47And we'll be back in about 6 7 minutes
1:08:50and I'll talk about how
1:08:52uh I think about modules, think about
1:08:54constructing a code base to make this
1:08:55possible.
1:08:57I've just been sort of fiddling with the
1:08:58AI here and we have ended up with some
1:09:00with a commit.
1:09:02So, we have something to test. Issue
1:09:04number two is complete. Here's what was
1:09:06done.
1:09:07This is kind of what it looks like when
1:09:09a Ralph loop completes is you end up
1:09:10with a little summary.
1:09:12Um and we have now something we can QA.
1:09:15Because we did the feedback loops
1:09:17because we did the trace bullets because
1:09:19we were uh said, "Okay, give us
1:09:21something reviewable at the end of
1:09:22this." We can immediately go and QA it.
1:09:24Now, there's nothing uh less exciting
1:09:26than watching someone else QA something.
1:09:29But, hopefully we can have a little
1:09:30play.
1:09:31Let's just check that it uh works at
1:09:33all.
1:09:34In fact, before I go there, I just want
1:09:36to sort of work through what just
1:09:38happened.
1:09:39Which is we see that it's created some
1:09:42stuff on the dashboard.
1:09:45And it then ran the feedback loops. So,
1:09:47it then ran the tests and the types.
1:09:51Now, TDD is obviously really important.
1:09:53And it's really important because these
1:09:55feedback loops are essential to AI,
1:09:58essential to get AI to produce anything
1:10:01reasonable.
1:10:02Because without this, AI is totally
1:10:04coding blind, right?
1:10:06You have to have to um
1:10:09If if your code base doesn't have
1:10:10feedback loops, you're never ever ever
1:10:13going to get decent AI decent output out
1:10:15of AI. And often what you'll find is
1:10:18that the quality of your feedback loops
1:10:21influences how good your AI can code,
1:10:24essentially. That is the ceiling. So, if
1:10:26you're getting bad outputs from your AI,
1:10:28you often need to increase the quality
1:10:30of your feedback loops.
1:10:32We'll talk about how to do that in a
1:10:33minute.
1:10:35Now, so it ran NPM run test, NPM run
1:10:39type check. It got one type error, and
1:10:41it needed to fix it with a nice bit of
1:10:43TypeScript magic. Very good. Yeah, type
1:10:45of level threshold number. Okay.
1:10:48Uh you see why I stopped teaching
1:10:50TypeScript cuz just AI knows everything
1:10:51now.
1:10:52Um
1:10:54So, and it ran the tests, and it passed,
1:10:57and it's looking good. So, we now end up
1:10:58with 284 tests in this repo. Pretty
1:11:01good.
1:11:03I I do find uh front end really hard to
1:11:06test here. We're essentially just
1:11:07testing the service. So, we've created a
1:11:09gamification service, if we look up
1:11:11here.
1:11:13And then we have a test for that
1:11:14service. You can see that the service
1:11:16and the test itself.
1:11:17Now, if I was doing code review here, I
1:11:19would then go to I would first go to
1:11:21review the tests, make sure the tests
1:11:23were testing reasonable things,
1:11:25and then go and kind of review the code
1:11:28itself just to make sure that it's it's
1:11:30not doing anything too crazy, right?
1:11:32The essential thing is I need to
1:11:33actually um look at the dashboard.
1:11:36I'm going to log in as a student.
1:11:40Oh, if it'll let me. Maybe it won't let
1:11:42me.
1:11:43Come on, son. There we go.
1:11:45Let's log in as Emma Wilson.
1:11:47Head into courses.
1:11:49Uh let's say I've got an introduction to
1:11:50TypeScript.
1:11:52Continue learning.
1:11:54Uh yes, I completed this lesson.
1:11:57And something went wrong. I imagine it's
1:11:59because I don't have
1:12:02Uh SQLite error. I don't have the right
1:12:05table. So, I need a table point events.
1:12:08Point events is a strange table name.
1:12:09I'm not sure quite what it was thinking
1:12:10there.
1:12:11Uh let's suspend. Let's run uh NPM DB
1:12:15migrate.
1:12:17Push, I think.
1:12:19I can't remember which one it was.
1:12:21But, you kind of get the idea, right? I
1:12:23I'm not going to subject you to uh
1:12:24watching me do QA because it's so dull.
1:12:27Um but at this point, I would
1:12:29essentially go back in. I would um
1:12:31Let me open the project back up.
1:12:35Uh and I would
1:12:36This This is a crucial moment, um and
1:12:39it's so important to um
1:12:41QA it manually here because QA Oh, dear,
1:12:45oh dear. What's going wrong? There we
1:12:46go.
1:12:47QA is how I then um impose my
1:12:51uh
1:12:52opinions back onto the code base, how I
1:12:54impose my taste.
1:12:56What you'll often find is that um there
1:12:58are teams out there who are trying to
1:12:59automate everything, like every part of
1:13:02this process. And they will tend to
1:13:06uh if you try to like automate the sort
1:13:08of creation of the idea, automate
1:13:11uh the QA, automate the research,
1:13:12automate the prototype, you end up with
1:13:15uh apps that I feel just lack taste
1:13:19and are bad.
1:13:21Maybe they just don't work, or they they
1:13:23don't even work as intended, or there's
1:13:25just no
1:13:26You need a human touch when you're
1:13:28building this stuff because without
1:13:29that, you just end up with slop.
1:13:32And we are not producing slop here.
1:13:33We're trying to produce high-quality
1:13:34stuff, and so that's what the QA is for.
1:13:37Mhm.
1:13:39So, I'm going to do two things in this
1:13:41final section.
1:13:43Which is I'm going to first tell you how
1:13:45to
1:13:46There's probably a question in your mind
1:13:48here, which is let's say I have a code
1:13:50base that I'm working on.
1:13:52And it's a bad code base. It's a code
1:13:54base that's like really complicated, uh
1:13:57that AI just never does good work in,
1:13:59and maybe actually most humans that go
1:14:01into that code base don't do good work.
1:14:03How what How do I improve that code
1:14:05base?
1:14:06And the second thing is I'll show you my
1:14:07setup for parallelization.
1:14:10So, let's go with um
1:14:12bad code first.
1:14:14Now,
1:14:16where is it? Where's the diagram? Here
1:14:17it is.
1:14:19In his book, um The Philosophy of
1:14:21Software Design,
1:14:23John Ousterhout talks about
1:14:25the ideal type of module.
1:14:28And let's imagine that you have a code
1:14:30base that looks like this. Each of these
1:14:32uh blocks here are individual files.
1:14:35And these files
1:14:36export things from them. You know, they
1:14:38have um things that you pull from the
1:14:40files that you then use in other things.
1:14:42And so, you might have these weird
1:14:43dependencies where this file over here
1:14:45might rely on this file, or might rely
1:14:47on that file, for instance.
1:14:49Now, if these files are small and they
1:14:51don't kind of ex- like
1:14:54export many things, then John Ousterhout
1:14:56would call these shallow modules,
1:14:58essentially. Where they're not very um
1:15:02They kind of look like uh this, if I No,
1:15:05actually no. I can't can't make a good
1:15:06diagram of it.
1:15:07They're essentially lots and lots of
1:15:09small chunks. Now, this is hard for the
1:15:11AI to navigate
1:15:13cuz it doesn't really understand the
1:15:14dependencies between everything. It
1:15:15can't work out where everything is. You
1:15:17know, it has to sort of manually track
1:15:19through the entire graph and go, "Okay,
1:15:20this relies on this. This one relies on
1:15:22this one. This one relies on this one."
1:15:26And it's then also hard to test this, as
1:15:28well, because where do you draw your
1:15:29test boundaries here?
1:15:31Do you test each module individually?
1:15:35Like just literally draw a test boundary
1:15:36No, don't do that.
1:15:38Around this one?
1:15:40And then maybe another test boundary
1:15:41around the next one, and then the next
1:15:43one?
1:15:45Or should you sort of do big groups of
1:15:48it? Should you say, "Okay, we're going
1:15:49to test all of these related modules
1:15:51together, and just sort of, you know,
1:15:53hope and pray that they work."
1:15:57Now,
1:15:58>> [sighs]
1:15:58>> this means that if I think that bad
1:16:00tests mostly look like that, where the
1:16:04AI essentially tries to sort of wrap
1:16:06every tiny function in its own test
1:16:08boundary, and then just sort of test
1:16:10that those individually work. But, what
1:16:12that does is it means that when, let's
1:16:15say, this module over here calls those
1:16:17two,
1:16:19so it depends on both of these, then
1:16:21this module might miss order the
1:16:23functions, or there might be sort of
1:16:24stuff inside that poor module that's
1:16:27worth testing on its own. And if you
1:16:29then wrap this in a test boundary, what
1:16:31do you do? Do you mock the other two
1:16:32modules? How does that work?
1:16:36So, actually figuring out how to um
1:16:40build a code base that is easy to test
1:16:43is essential here. Because if our code
1:16:46base is easy to test, then our code our
1:16:48feedback loops are going to be better,
1:16:50and the AI is going to do better work in
1:16:52our code base. Does that make sense?
1:16:54So, what does a good code base looks
1:16:55like look like?
1:16:57Well, not like that.
1:17:00It looks like this.
1:17:02Where you have
1:17:05what John Ousterhout calls deep modules.
1:17:07Modules that have a little interface on
1:17:09there that expose a small, simple
1:17:11interface that have a lot of
1:17:13functionality inside them.
1:17:16Now,
1:17:18what this means is that these are easy
1:17:20to test cuz you just Let's say that
1:17:22there's a dependency between this one
1:17:23and this one.
1:17:25My arrow working? Yeah, there we go.
1:17:28Then,
1:17:30what you do is you just wrap a big test
1:17:32boundary around that one module, around
1:17:34this one up here,
1:17:35and you're going to catch a lot of good
1:17:37stuff.
1:17:40Because there's lots of functionality
1:17:41that you're testing, and really the
1:17:43caller, the person calling the module,
1:17:45is going to have a simple interface to
1:17:47work from. So, it's not not too tricky.
1:17:50That makes sense? Deep modules versus
1:17:51shallow modules. This is good.
1:17:54This shallow version is bad. And what I
1:17:56find is that unaided
1:17:59um or if you don't
1:18:02uh
1:18:04if you don't watch AI carefully, it's
1:18:05going to produce a code base that looks
1:18:07like this.
1:18:08So, you need to be really, really
1:18:09careful when you're directing it.
1:18:11And that's why, too,
1:18:13is that if we look inside the PRD,
1:18:16uh where is the PRD gone? It's inside
1:18:18the issues. It's inside the gamification
1:18:20system.
1:18:21Uh not found. Of course, it's not. Here
1:18:23it is.
1:18:25Then I have
1:18:27uh inside here
1:18:29data model the modules.
1:18:31So, it's specifically saying, "Okay,
1:18:33this gamification service is a new deep
1:18:36module, which we're going to test
1:18:37around.
1:18:38It's going to have this particular
1:18:40interface.
1:18:42And it's going to have um Okay, we're
1:18:44modifying the progress service, too.
Phase 7: Deployment & Monitoring
1:18:46We're modifying the lesson route. We're
1:18:47modifying the dashboard route, etc. So,
1:18:50it's I'm being really specific about the
1:18:51modules that I'm editing, and I'm making
1:18:53sure that I keep that module map in my
1:18:56mind at all times, throughout the
1:18:57planning, and then throughout the
1:18:59implementation. Does that make sense?
1:19:01Very, very useful.
1:19:03It's useful for one other reason, too.
1:19:04Not only does it make your app more
1:19:05testable,
1:19:07but you get to do a little mental trick.
1:19:11And I'm going to refill my water while
1:19:13you wait for what that is.
1:19:17Uh let me
1:19:20Let me get a question from you guys. So,
1:19:21raise your hands if you feel like
1:19:26Uh if you feel like you're working
1:19:28harder than ever before with AI.
1:19:32Yeah.
1:19:33Uh raise your hands if you feel like you
1:19:36know your code base less well
1:19:38than you used to.
1:19:40Yeah.
1:19:43This is a real thing. Um
1:19:45because we're moving fast, because we're
1:19:46delegating more things, we end up losing
1:19:49a sense of our code base. And if we lose
1:19:52the sense of our code base, we're not
1:19:54going to be able to improve it, and
1:19:56we're essentially delegating the shape
1:19:57of it to AI.
1:19:59I [snorts] don't think that's good. But
1:20:00then how do we
1:20:03how do we make it so that we can move
1:20:04fast while still keeping enough space in
1:20:06our brains?
1:20:08I think that this is a way to do it.
1:20:10Because what you're doing here is not
1:20:12only are you thinking about creating big
1:20:15shapes in your code base, big services.
1:20:19What I think you should do is
1:20:21design the interface for these modules,
1:20:24but then delegate the implementation.
1:20:27In other words, these modules can become
1:20:28like gray boxes, where you just need to
1:20:31know the shape of them, you need to know
1:20:33what they do, and it's sort of how they
1:20:34behave, but you can delegate the
1:20:36implementation of those modules. I found
1:20:38this is really nice. I don't necessarily
1:20:40need to code review everything inside
1:20:42that module. I don't necessarily need to
1:20:43know everything of what it's doing. I
1:20:45just need to know that it behaves a
1:20:47certain way under certain conditions,
1:20:49and that it does its thing. So, it's
1:20:50kind of like
1:20:52okay, I've got a big overview of my code
1:20:54base, and I understand kind of the
1:20:55shapes inside it, understand what the
1:20:57interfaces all do, but
1:20:59I can delegate what's inside.
1:21:01I found that has been a really nice way
1:21:03to retain my sense of the code base
1:21:06while preserving my sanity.
1:21:08Make sense?
1:21:12And so, you might ask, how do I take a
1:21:14code base
1:21:16that looks like this
1:21:17and then turn it into a code base that
1:21:19looks like this? How do I deepen the
1:21:21modules?
1:21:23Well, we have Hopefully, it's in here.
1:21:25Pretty sure it is. We have a skill.
1:21:28And that skill is called improve code
1:21:30base architecture.
1:21:32Nice and direct.
1:21:35Uh let's run it.
1:21:37What this skill is going to do is it's
1:21:38essentially just going to do it a scan
1:21:40of our code base and looking for what's
1:21:42available here. And feel free to run
1:21:43this yourself if you're um
1:21:45uh
1:21:46running the exercises.
1:21:48And it's exploring the architecture,
1:21:50exploring um
1:21:51essentially how to work within this code
1:21:53base, and it's going to attempt to
1:21:57uh find places to deepen the modules.
1:22:00Pretty simple. One really cool um thing
1:22:04that it found here is part of my uh part
1:22:07of my course video manager app is a
1:22:09video editor. A video editor built in
1:22:11the browser, which is really hardcore.
1:22:13Uh it's a decent bit of engineering. And
1:22:16I wanted a way that I could wrap the
1:22:18entire front end all the way to the back
1:22:21end in like a single big module, so that
1:22:23I could test the fact that I press
1:22:24something on the front end and it goes
1:22:26all the way to the back end. And so, I
1:22:28found a way essentially by using a kind
1:22:30of discriminated union between the two
1:22:32types here by sort of I was able to use
1:22:35this uh skill to essentially have a huge
1:22:39great big module that just tested from
1:22:41the outside, it was testable from the
1:22:43outside, this video editor
1:22:44infrastructure. And it meant that AI
1:22:46could see the entire flow, could act on
1:22:49the entire flow, and test on the entire
1:22:50flow. And honestly, it was just night
1:22:53and day in terms of the uh ability of AI
1:22:56to actually make changes, cuz AI working
1:22:58on a video editor is pretty brutal if
1:23:00you don't give it good tests. So, that
1:23:02is
1:23:03Honestly, I
1:23:04If you take one thing away from today,
1:23:05just try running this skill
1:23:07on your repo and see what happens.
1:23:09Let's go to Slido. Let's ask a
1:23:11check a couple of questions as well this
1:23:13is running.
1:23:15So, let's see. Have you tried Claude's
1:23:17auto mode with Claude enable auto mode?
1:23:19That way you can avoid many of the
1:23:20obvious permission checks. We'll talk
1:23:21about permission checks in a second.
1:23:23Do I keep the markdown plans and issues
1:23:26for later reference?
1:23:28Okay.
1:23:29This is a great question.
1:23:31So,
1:23:34let's say
1:23:35that you uh have a great idea, you turn
1:23:38it into a PRD,
1:23:40raise and you then implement that PRD,
1:23:43and the PRD is essentially done.
1:23:45Raise your hand if you keep that
1:23:47information in the repo, so you turn it
1:23:49into a markdown file. Raise your hand if
1:23:50you want to keep that around.
1:23:53Cool. Okay. And raise your hand if you
1:23:55if you don't want to keep it around. If
1:23:57you want to get rid of it as soon as
1:23:58possible. Yeah, this is I think an
1:24:02a question that doesn't have a clear
1:24:03answer.
1:24:05What I'm really scared of
1:24:08with any documentation decision is that
1:24:11let's say that we have a PRD for this
1:24:13gamification system, we keep it in the
1:24:14repo.
1:24:15We go on, go on, go on. Let's say a
1:24:17month later, we want some edits to the
1:24:19gamification system.
1:24:21And we go in with Claude, and it finds
1:24:23this old PRD and says, yes, I found the
1:24:25original documentation for the PRD
1:24:27system.
1:24:28Well, it turns out that the actual code
1:24:29has changed so much from the original
1:24:31PRD that it's almost unrecognizable. The
1:24:33names of things have changed, the um
1:24:35file structure has changed, even the
1:24:37requirements may have changed. We might
1:24:38have actually tested it with users. This
1:24:40is doc rot, where the documentation for
1:24:43something is rotting away in your repo
1:24:46and influencing Claude badly. Or Claude,
1:24:49agents badly.
1:24:50So, I tend to not keep it around. I tend
1:24:53to get rid of it. And for me, because my
1:24:56setup uses GitHub issues, I just mark it
1:24:58as closed. It can fetch it if it wants
1:25:00to, but it's got a visual indicator that
1:25:02it's done. So, I tend to prefer
1:25:05ditching these.
1:25:07Thoughts on the BEADS framework from
1:25:08Steve. Uh I've not tested it, but it
1:25:10seems like sort of um another way to
1:25:13manage Kanban boards and issues. Seems
1:25:15uh very good, but I've not tried it.
1:25:18Um
1:25:20>> [clears throat]
1:25:22>> Uh let me just quickly check the uh
1:25:24setup here.
1:25:26Let's take a couple of questions from
1:25:27the room. Anybody got any questions at
1:25:29this point about anything that we've
1:25:30covered so far, especially this last
1:25:32bit? Yes.
1:25:33I thought it was
1:25:35interesting your answer about like the
1:25:36markdown files that you delete because
1:25:38they
1:25:39create like doc rot.
1:25:41How about migrations? Like with
1:25:43migration files, would you also squash
1:25:45them after that?
1:25:47Like database migrations? Yeah.
1:25:51I don't know.
1:25:53I hope that answers your question. I'm
1:25:54so sorry. No, no. I think database
1:25:56migrations are a different thing because
1:25:57you have a sort of running record of
1:25:59exactly what changed, and it's more
1:26:00deterministic. And I think
1:26:04Yeah, it's an interesting analogy. I'm
1:26:06not sure. Let's talk about it
1:26:07afterwards.
1:26:08That's a good way of saying I've no
1:26:10idea.
1:26:11Yeah. Yeah. So, you mentioned that you
1:26:12don't delete the PRD. You mentioned you
1:26:14don't review the PRD once it's done.
1:26:16Sorry, guys. Um I'm just trying to
1:26:17listen to this guy's question. Have you
1:26:18considered
1:26:19uh using a deep think like ChatGPT or
1:26:21something
1:26:25to tell it, "Look at this PRD and tell
1:26:26me if it
1:26:29It takes about an hour.
1:26:30Yeah, the question
1:26:32The question here is um
1:26:35should I um in the sort of early
1:26:37planning stage be trying to optimize the
1:26:39plan?
1:26:40This is something I actually see a lot
1:26:41of people doing, and it's a really good
1:26:43um
1:26:44idea. So, when you
1:26:49Let's go back to the phases.
1:26:51So, let's say that you have all of these
1:26:52phases here.
1:26:55And you
1:26:56uh you get to the point where you've
1:26:58sort of figured out everything with the
1:26:59LLM, you understand where you're going,
1:27:01you've created this sort of uh journey
1:27:03destination documents here. How do you
1:27:05then
1:27:06uh
1:27:08Like should you then try to optimize and
1:27:10optimize and optimize that PRD until
1:27:12it's the perfect PRD you can possibly
1:27:13imagine?
1:27:14I don't think there's a lot of value in
1:27:16that.
1:27:17Because I think the journey is really
1:27:20just sort of a hint of where you want to
1:27:21go, and the place that you need to be
1:27:24putting the work is in QA.
1:27:26And you can sort of do that AFK, I
1:27:28suppose, but in my experience, you're
1:27:29not going to get a lot of juice out of
1:27:31it. Like it's the
1:27:33The thing that really matters is getting
1:27:34alignment with the AI, which is you do
1:27:37in the grilling session initially.
1:27:40Let's have one more question. Anyone got
1:27:41any more? Yeah. How do you get in in
1:27:43your workflow to get it to code the way
1:27:46you want it to code it so by the time
1:27:48you get to code review, it's at least
1:27:49familiar, it uses the libraries you
1:27:51wanted to use, Yeah. Um we had this
1:27:53question before, actually, which was
1:27:54like uh how do you uh enforce your
1:27:57coding standards on the agents,
1:27:59essentially? How do you get it to code
1:28:01how you want it to code?
1:28:02Now, there's essentially two different
1:28:04ways of doing it.
1:28:05Um you've got
1:28:08I don't know. Come on. Push.
Designing Codebases for AI Effectiveness
1:28:11And you've got pull.
1:28:14What do I mean mean by push and pull?
1:28:17Um
1:28:18Push is where you push instructions to
1:28:20the LLM.
1:28:22So, you say, okay, if you put something
1:28:24in Claude.md,
1:28:25uh talk like a pirate, that instruction
1:28:27is always going to be sent to the agent,
1:28:30right? So, that is a push, actually.
1:28:32You're pushing tokens to it.
1:28:33Pull is where you give the agent an
1:28:37opportunity to pull more information.
1:28:40And
1:28:42that's for instance like skills. So, a
1:28:44skill is something that can sit in the
1:28:45repo, and it has a little description
1:28:47header that says, okay, agent, you may
1:28:50pull this when you want to.
1:28:52My thinking, my current thinking about
1:28:55code review and about coding standards
1:28:57looks like this.
1:28:59When you have an implementer,
1:29:03What's going on? There we go.
1:29:04Implementer.
1:29:06I'm going to make this less red in a
1:29:07second.
1:29:09Um then
1:29:11you want the coding standards to be
1:29:13available via pull. If it has a
1:29:15question, you want it to be able to sort
1:29:17of answer it.
1:29:18But if you then have an automated
1:29:20reviewer afterwards, then you want it to
1:29:23push. You want to push that information
1:29:25to the reviewer. You want to say, "These
1:29:27are our coding standards. Um make sure
1:29:29that this code um follows them."
1:29:31So if you have skills for instance, then
1:29:33you want to push that stuff to the
1:29:35reviewer so the reviewer has both the
1:29:38code that's written and the coding
1:29:39standards to compare to.
1:29:42Hopefully that answers your question. I
1:29:43can show you an automated version of
1:29:44this as well actually.
1:29:46Um
1:29:47Yeah, let's do that now just while it's
1:29:48fresh in my mind.
1:29:50I recently um spent
1:29:53uh
1:29:54maybe a week or so
1:29:56uh building this thing called
1:29:57Sandcastle.
1:29:58And Sandcastle is a
1:30:01I was sort of unhappy with the options
1:30:03out there for
1:30:04um running agents AFK.
1:30:07And what this does is it's essentially a
1:30:09TypeScript library for running these
1:30:11loops. So you have
1:30:13uh a run function
1:30:15that creates a work tree, um sandboxes
1:30:18it in a Docker container,
1:30:20and then allows you to run a prompt
1:30:22inside that.
1:30:23And in that work tree then, it's just a
1:30:25Git branch and you have that code and
1:30:27you can then merge it later.
1:30:29If I open up
1:30:32um
1:30:33there are some really really nice ways
1:30:35of viewing this and it essentially
1:30:37allows you to run these kind of
1:30:38automated loops and allows you to
1:30:41parallelize across multiple different
1:30:43agents really simply.
1:30:45So I'll go into my Sandcastle file, go
1:30:47into main.ts here.
1:30:49And let's just walk through this.
1:30:51So this is kind of like I showed you um
1:30:54a sort of version of the Ralph loop
1:30:56earlier. This is where we take it from
1:30:58sequential into parallel.
1:31:01We have here first of all a planner
1:31:04that takes in it's has a plan prompt
1:31:06here that looks at the backlog and
1:31:08chooses a certain number of issues to
1:31:11work on in parallel. Remember I showed
1:31:13you that Kanban board where it had all
1:31:14the blocking relationships? It works out
1:31:16all the phases. So this one will say
1:31:18okay, uh let's say we have
1:31:21uh you can ignore all this glue code
1:31:22here. This is essentially
1:31:24just a set of issues, GitHub issues with
1:31:27a title and with a a branch for you to
1:31:30work on.
1:31:32And then for each issue, we create a
1:31:35sandbox
1:31:38and then we run an implementer in that
1:31:40sandbox
1:31:41passing in the issue number, issue
1:31:42title, and the branch. This is like the
1:31:43loop that we ran just before.
1:31:46Then
1:31:47if it created some commits, we then
1:31:49review those commits.
1:31:51This is essentially the loop.
1:31:53What do we do with those commits?
1:31:55We pass those into a
1:31:58merger agent.
1:32:01Which takes in a merge prompt, takes in
1:32:03the branches that were created, takes in
1:32:04the issues, and it just merges them in.
1:32:06If there are any issues with the merge,
1:32:08you know, with the types and tests and
1:32:09that kind of thing, it solves them.
1:32:11And this has been my uh flow for quite a
1:32:13while now for working on most projects.
1:32:15It works super super well. And uh yeah,
1:32:19I recommend you check out Sandcastle if
1:32:20you want to sort of learn more.
1:32:23And to answer your question properly is
1:32:25that in the reviewer
1:32:27uh I would push the coding standards.
1:32:30In the implementer, I would allow it to
1:32:31pull.
1:32:33And I'm actually using uh Sonnet for
1:32:34implementation and Opus for um
1:32:38reviewing cuz I consider reviewing sort
1:32:40of I need I need the smarts then.
1:32:44Any question Actually, let me uh before
1:32:46we do more questions, let's go back
1:32:48here.
1:32:49Okay, where are we at?
1:32:51Okay.
1:32:53We sort of zooming everywhere in this uh
1:32:55talk because I'm kind of having to run
1:32:56things in parallel. So let's go back to
1:32:58the improve code base architecture. It
1:33:01has finally finished running and it's
1:33:02found a bunch of architectural
1:33:04improvement candidates.
1:33:06So it's got essentially a cluster of
1:33:08different modules that are all kind of
1:33:10related that could probably be tested as
1:33:12a unit.
1:33:13Got number one, the quiz scoring
1:33:14service. There's some reordering logic
1:33:16extraction as well.
1:33:19It has arguments for why they're coupled
1:33:21and it has a dependency category as
1:33:23well. So local substitutable in SQL
1:33:25light within memory test DB.
1:33:28Quiz scoring service just currently has
1:33:30zero tests. This is the biggest gap. So
1:33:31this is what it looks like when we come
1:33:33back of
1:33:34uh improve code base architecture.
1:33:37Okay.
1:33:39So
1:33:41we have nominally kind of 17 minutes
1:33:43left.
1:33:44I don't know about you guys, but I'm
1:33:45knackered.
1:33:46>> [laughter]
1:33:47>> Um I want to
1:33:49>> [clears throat]
1:33:50>> Let me let me kind of sum up for you.
1:33:53Cuz I think we're sort of
1:33:54reaching the end of our stamina. I'm
1:33:55going to be available for the full time
1:33:56if you want to um come and ask me
1:33:58questions. Um I might do one more check
1:34:00of the slide over, but let's kind of sum
1:34:01up where we've got to.
1:34:04So
Final Takeaways & Summary
1:34:06this is essentially the flow.
1:34:09Where throughout this whole process,
1:34:12we're bearing in mind the shape of our
1:34:13code base.
1:34:15This is not a spec to code compiler.
1:34:17This is not an AI that's sort of just
1:34:19like churning out code. We are being
1:34:21very intentional with the kind of
1:34:23modules and the shape of the code base
1:34:24that we want. We are making sure that we
1:34:26are as aligned as possible by using the
1:34:28grilling session, by really hammering
1:34:31out our idea. We're not over indexing
1:34:33into the PRD, we're not trying to read
1:34:35every part of it. We're not thinking too
1:34:36much about it even. We're then just
1:34:38turning that into a set of
1:34:39parallelizable issues which can be
1:34:41worked on by agents in parallel.
1:34:44We implement it
1:34:45and we QA and code review the hell out
1:34:47of it and then keep going back to that
1:34:48implementation. One thing I didn't
1:34:50really mention is that in the QA phase
1:34:53what the QA phase is for is creating
1:34:55more issues for that Kanban board.
1:34:57So while it's implementing even, you can
1:34:59be QAing the stuff and going back,
1:35:01adding more issues. And the Kanban board
1:35:02just allows you to add blocking issues
1:35:04kind of um sort of infinitely really.
1:35:07And then once that's all done, once
1:35:08you've got code that you're happy with,
1:35:10once you've got work that you're happy
1:35:11with, then you can share it with your
1:35:12team and you can get a full review.
1:35:15So this is kind of like once you get
1:35:16here, this is kind of one developer or
1:35:18maybe a couple of developers sort of um
1:35:20managing this and then it's kind of up
1:35:21to you to figure out how to merge it
1:35:22back in.
1:35:25>> [sighs]
1:35:27>> Of course
1:35:29all of this can be customized by you.
1:35:31This is just something that I have found
1:35:32works. I'm not trying to like sell you
1:35:35on a kind of approach here. What I
1:35:37recommend if you take one thing away
1:35:39from this session is that you should
1:35:41head back, you should head to Amazon and
1:35:43just buy a ton of those old books
1:35:44because
1:35:46I mean, I just found it so enlightening
1:35:47reading them. Uh
1:35:50you know,
1:35:51pre-AI writing is always like a a really
1:35:53fun to read anyway.
1:35:54And
1:35:56I just on every single page I found that
1:35:58there was something useful and something
1:35:59interesting to to read.
1:36:02So thank you so much. Thank you for
1:36:03putting up with the heat. Um hopefully
1:36:05your body temperatures will reset soon.
1:36:07Uh
1:36:08thank you very much.
1:36:10>> [applause]
1:36:23[music]