← все видео

Full Walkthrough: Workflow for AI Coding — Matt Pocock

AI Engineer · 2026-04-24 · 1ч 36м · 1 214 812 просмотров · YouTube ↗

Топики: ai-loop-engineering, ai-agent-orchestration

🎧 Аудио

📝 Summary

model=deepseek-v4-flash · prompt=summary-v7 · 21 086→3 055 tokens · 2026-07-20 11:57:22

🎯 Главная суть

Matt Pocock утверждает, что по‑настоящему эффективная работа с AI‑кодингом строится не на «спецификации → код» или пассивной передаче контроля AI, а на старых добрых инженерных принципах: маленькие задачи, тесная обратная связь, глубокие модули и тесты. Вместо того чтобы пытаться «перекормить» AI гигантским контекстом, нужно держать каждый сеанс в «умной зоне» (smart zone) и жёстко разделять человеческое планирование (human‑in‑the‑loop) и автоматическую имплементацию (AFK).

🔥 Ограничения LLM: smart zone и эффект Memento

LLM работают тем хуже, чем больше токенов уже накопилось в окне контекста. Каждый новый токен создаёт квадратично растущее количество attention‑связей — как добавление команды в футбольную лигу. Примерно после 100k токенов модель вползает в «тупую зону» (dumb zone), где начинает совершать глупые ошибки. Даже на 1‑миллионном контексте граница smart zone не расширяется пропорционально — просто прибывает больше «тупого» пространства. Кроме того, LLM похожи на героя фильма «Memento»: каждый новый сеанс они полностью забывают предыдущий. Поэтому Matt предпочитает не «компактить» (compact) историю в одно большое резюме, а каждый раз очищать контекст и начинать с нуля. Это гарантирует, что состояние всегда одинаково, и можно оптимизировать процесс под чистый запуск.

🧩 Grill Me — как достичь shared understanding, а не плана

Когда приходит сырая идея (например, Slack‑сообщение от Sarah Chen о геймификации платформы), Matt не включает Plan Mode и не просит AI сразу набросать многофазный план. Вместо этого он запускает skill grill me — набор инструкций, которые заставляют AI агрессивно опрашивать разработчика. AI задаёт вопросы по одному: «Как работает экономика очков?», «Нужна ли ретроактивная выдача?», «Какой прогресс уровней?» — и даёт свои рекомендации. Это не попытка получить готовый документ, а создание общего дизайн‑концепта (design concept) между человеком и AI. Сессия может длиться от 10 до 100 вопросов и занимает час. Важно, что это human‑in‑the‑loop: разработчик отвечает на каждый вопрос, внося свой доменный опыт. В результате рождается не просто план, а глубокая согласованность, которую невозможно заменить одним PRD.

📄 PRD как destination document — но его не нужно читать

После grilling session Matt формирует Product Requirements Document (PRD) — текстовый файл с описанием проблемы, решения, пользовательских историй и границ (out of scope). Он использует skill write a PRD, который переспрашивает ключевые моменты и генерирует документ. Однако он не читает готовый PRD — потому что на этапе grilling он уже достиг полного согласия с AI, и чтение PRD превращается в проверку навыков суммаризации у AI, а не в контроль содержания. PRD нужен исключительно как «destination document» для следующего этапа — разбивки на задачи. В этом смысле Matt сознательно идёт против популярного движения «specs‑to‑code», где правки вносятся только в спецификации, а код рассматривается как побочный продукт.

🎯 Вертикальные срезы (tracer bullets) вместо горизонтальных

AI по умолчанию любит кодировать «горизонтально»: сначала все схемы БД, потом все API, потом весь фронтенд. Это приводит к тому, что обратная связь приходит только в конце третьей фазы — когда выясняется, что слои не стыкуются. Matt рекомендует старую практику из книг «Pragmatic Programmer» и «Refactoring»: вертикальные срезы (tracer bullets). Задача должна проходить через все уровни (БД → API → UI) в минимально работающем виде. Тогда уже на первой задаче (например, «начисление очков за завершение урока, отображаемое на дашборде») AI получает мгновенную обратную связь от типов, тестов и визуального результата.

📌 Kanban board и DAG — параллельная работа AFK‑агентов

После PRD Matt использует skill prd to issues, который генерирует локальные маркдаун‑файлы с задачами. Задачи организованы не в линейную последовательность, а в направленный ациклический граф (DAG) с блокирующими связями. Это позволяет определять фазы, где несколько независимых задач выполняются параллельно. В отличие от многофазного плана (фаза 1 → фаза 2 → …), который можно отдать только одному агенту, Kanban‑доска даёт возможность запускать несколько агентов одновременно, экономя время.

🔁 TDD как основа работы AI‑агента

При реализации Matt настаивает на классическом Red‑Green‑Refactor. AI сначала пишет один падающий тест (red), потом реализует минимальный код, чтобы тест прошёл (green), и при необходимости рефакторит (refactor). Такой подход заставляет AI:

Matt делает TDD настолько важным, что даже «изгибает» свою архитектуру под него, а в репозитории есть соответствующий skill.

🔄 AFK‑агент: RALF‑цикл и Sandcastle

Ключевая идея — после того как человек спланировал, он может делегировать реализацию AI‑агенту, работающему полностью автономно (away from keyboard). Matt реализует это через скрипт ralf.sh, который:

Для продвинутой параллелизации он написал библиотеку Sandcastle на TypeScript. Sandcastle создаёт Docker‑контейнеры (песочницы) для каждого issue, запускает их параллельно, затем объединяет ветки через merger‑агента, который разрешает конфликты и проверяет типы/тесты. В промпте implementer используются pull‑методы (skills), а в промпте reviewer — push‑методы (жёсткие кодинг‑стандарты). Для ревью применяется Opus (более умная модель), для имплементации — Sonnet (более быстрая).

🧱 Deep modules vs shallow modules — архитектура, удобная для AI

Matt ссылается на книгу Джона Оустерхаута «A Philosophy of Software Design». Shallow modules — это много маленьких файлов с тонкими экспортами; AI с трудом навигирует по таким зависимостям, не понимает границы тестирования и в результате пишет много мелких тестов вокруг каждой функции. Deep modules — это модули с простым интерфейсом и большой внутренней логикой. Их легко тестировать одной тестовой «границей», а AI достаточно знать только сигнатуру модуля. Matt рекомендует на этапе планирования явно указывать, какие новые deep modules создаются (например, GamificationService), и держать в голове карту модулей. Для улучшения существующего кода есть skill improve codebase architecture — он сканирует репозиторий и предлагает кандидаты на объединение в глубокие модули.

🧪 QA и code review — где остаётся человек

Matt подчёркивает: какой бы умной ни была автоматизация, QA и code review остаются за человеком. Без человеческого глаза приложение теряет «вкус» (taste) и превращается в «slop». После того как AFK‑агент выполнил задачу, разработчик обязан:

🗂 DocRot: почему не стоит хранить PRD после реализации

После завершения всех задач Matt удаляет или закрывает PRD (в GitHub‑issues). Если оставить старый документ, через месяц AI может наткнуться на него и посчитать актуальным, хотя код уже ушёл вперёд — возникнет DocRot (гниение документации). Вместо этого он доверяет коду и не висит на устаревших спецификациях.

🧭 Push vs Pull для кодинг‑стандартов

Matt рекомендует для implementer использовать pull — дать AI возможность самому подтягивать информацию через skills (например, skill с описанием кодстайла). А для reviewer — push: передать код и жёсткие требования к стандартам в одном контексте. Так reviewer оказывается «умнее» implementer, потому что видит и код, и правила одновременно.

📚 Главный вывод: возвращение к классическим книгам

Matt завершает словами: самые полезные знания для работы с AI находятся в старых книгах (Martin Fowler «Refactoring», «Pragmatic Programmer», «The Design of Design», «A Philosophy of Software Design»). Они уже сформулировали принципы, которые позволяют держать AI под контролем: маленькие задачи, вертикальные срезы, глубокие модули, обратная связь. Применяя эти фундаментальные практики, можно получать от AI качественный код, не скатываясь в «slop».

📜 Transcript

en · 16 365 слов · 190 сегментов · flagged: word_run (1 dropped, q=0.99)

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

⚙️ Pipeline jobs

StageStatusAtt.UpdatedError
download done 1/3 2026-07-20 11:55:44
transcribe done 1/3 2026-07-20 11:56:44
summarize done 1/3 2026-07-20 11:57:22
embed done 1/3 2026-07-20 11:57:25

📄 Описание YouTube

Показать
Matt will be back on stage at the World's Fair next week! see https://ai.engineer/wf and use YOUTUBEPROMO for new tickets only. Join 6000 AI engineers at the "Superbowl of AI"!

---

A hands-on workshop covering the full lifecycle of AI-assisted development, from turning ambiguous requirements into agent-ready plans to running autonomous coding agents that ship production features.

You'll learn to stress-test vague briefs into structured PRDs, slice work into thin "tracer bullet" vertical slices, and run an AI agent with TDD. You'll watch it select tasks, write tests, implement code, and commit. You'll then refine your prompts based on where it struggles, graduate to fully autonomous (AFK) runs, and learn to design codebases that maximize agent effectiveness.

You'll walk away knowing how to:

- Turn ambiguous requirements into agent-ready issues
- Slice work into vertical tracer bullets an agent can grab independently
- Run AI agents human-in-the-loop and autonomously with TDD
- Design codebase architectures that AI agents love to work in

For: Engineers ready to move beyond chat-based AI assistance and build a real workflow for shipping features with autonomous coding agents.

Speaker info:
- https://x.com/mattpocockuk
- https://www.linkedin.com/in/mapocock/
- https://youtube.com/@mattpocockuk

Timestamps:
00:00:00 - Introduction
00:00:14 - The Thesis of AI Engineering
00:04:20 - Phase 1: Research & Prototyping
00:12:45 - Phase 2: The Grill Session
00:22:10 - Phase 3: Writing the PRD
00:35:50 - Phase 4: Slicing Work into Issues
00:48:15 - Phase 5: Implementation with AI Agents
01:05:30 - Phase 6: Human-in-the-Loop Review
01:18:45 - Phase 7: Deployment & Monitoring
01:28:10 - Designing Codebases for AI Effectiveness
01:34:06 - Final Takeaways & Summary