<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>YouTube on Random Domain</title><link>https://blog.randomdomain.co.za/youtube/</link><description>Recent content in YouTube on Random Domain</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Mon, 08 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.randomdomain.co.za/youtube/index.xml" rel="self" type="application/rss+xml"/><item><title>WWDC26: Optimize custom machine learning operations with Metal tensors | Apple</title><link>https://blog.randomdomain.co.za/youtube/too9j5nkg0c/</link><pubDate>Mon, 08 Jun 2026 00:00:00 +0000</pubDate><guid>https://blog.randomdomain.co.za/youtube/too9j5nkg0c/</guid><description>&lt;iframe width="720" height="405" src="https://www.youtube.com/embed/toO9j5NKg0c" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;em&gt;64 slides extracted.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="slide-1--004-watch"&gt;Slide 1 — 0:04 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=2s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=2s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_000.png" width="100%" alt="Slide 1"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Hello, my name is Xiao, and I am a GPU software engineer.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-2--016-watch"&gt;Slide 2 — 0:16 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=11s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=11s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_002.png" width="100%" alt="Slide 2"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Today, I will guide you through an exploration of Metal tensors and demonstrate how to write optimized custom ML kernels using tensor operations.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-3--034-watch"&gt;Slide 3 — 0:34 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=21s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=21s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_003.png" width="100%" alt="Slide 3"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Apple platforms offer robust support for running machine learning models across the software stack. High-level frameworks such as Core AI and MLX simplify model deployment with minimal coding. In contrast, lower-level APIs like Metal Performance Shaders grant access to high-performance Metal kernels. All these layers leverage the low-level acceleration provided by Metal performance primitives and the tensor ops library.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-4--052-watch"&gt;Slide 4 — 0:52 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=49s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=49s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_004.png" width="100%" alt="Slide 4"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;There are several reasons to work at the Metal level.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-5--100-watch"&gt;Slide 5 — 1:00 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=56s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=56s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_005.png" width="100%" alt="Slide 5"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;ML research progresses rapidly, so implementing custom operations that integrate with high-level frameworks like Core AI can be beneficial. Additionally, writing Metal kernels may be necessary if you are contributing to an ML framework such as MLX or llama.cpp.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-6--114-watch"&gt;Slide 6 — 1:14 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=71s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=71s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_007.png" width="100%" alt="Slide 6"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;If you are working on a Metal-based application, the easiest way to get started is by using the tensor ops library.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-7--122-watch"&gt;Slide 7 — 1:22 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=80s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=80s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_008.png" width="100%" alt="Slide 7"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Tensor ops is a Metal shading language API that accelerates tensor operations on the GPU, such as matrix multiplication and convolution.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-8--138-watch"&gt;Slide 8 — 1:38 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=91s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=91s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_010.png" width="100%" alt="Slide 8"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;It automatically utilizes any available hardware acceleration across all Apple Silicon GPU generations, eliminating concerns about differences between hardware generations. Specifically, it fully leverages the Neural Accelerator in the M5 chip family.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-9--156-watch"&gt;Slide 9 — 1:56 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=108s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=108s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_011.png" width="100%" alt="Slide 9"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;The Neural Accelerator is a new hardware block in the M5 chip, located directly within each shader core. It operates alongside the other GPU pipelines and is specifically designed to accelerate dense compute-bound tasks, such as the pre-fill stage of a large language model (LLM).&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-10--206-watch"&gt;Slide 10 — 2:06 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=124s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=124s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_012.png" width="100%" alt="Slide 10"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;You can refer to the related sessions to learn the fundamentals of tensor operations.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-11--212-watch"&gt;Slide 11 — 2:12 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=130s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=130s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_013.png" width="100%" alt="Slide 11"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;In this session, I will build on those basics by discussing best practices for working with quantizer data.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-12--222-watch"&gt;Slide 12 — 2:22 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=140s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=140s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_015.png" width="100%" alt="Slide 12"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;I will demonstrate how to build advanced customer operations, including flash attention.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-13--226-watch"&gt;Slide 13 — 2:26 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=145s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=145s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_016.png" width="100%" alt="Slide 13"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Let's dive into the first topic: working with quantizer data.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-14--232-watch"&gt;Slide 14 — 2:32 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=150s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=150s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_017.png" width="100%" alt="Slide 14"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;State-of-the-art machine learning models are increasingly large.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-15--242-watch"&gt;Slide 15 — 2:42 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=159s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=159s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_019.png" width="100%" alt="Slide 15"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;The inference stage is typically limited by memory bandwidth, making it necessary to compress the weights. This compression helps fit models into memory more efficiently and reduces memory bandwidth usage.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-16--252-watch"&gt;Slide 16 — 2:52 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=168s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=168s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_020.png" width="100%" alt="Slide 16"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;The standard approach for compressing weights is quantization. This involves taking higher precision weights and reducing them to lower precision data types.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-17--308-watch"&gt;Slide 17 — 3:08 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=176s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=176s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_021.png" width="100%" alt="Slide 17"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;For example, 16-bit half-precision weights can be compressed to just 4 bits. These quantized weights are accompanied by scale factors, allowing us to scale the quantized values back to the original range during computation. In addition to 16- and 32-bit floating-point types, tensor operations now natively support quantized data types.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-18--334-watch"&gt;Slide 18 — 3:34 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=206s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=206s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_023.png" width="100%" alt="Slide 18"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;We added support for 4- and 8-bit integer types in the update to macOS and iOS 26, and we are extending support to additional data types in macOS and iOS 27. This includes 4- and 8-bit floating-point types, as well as 2-bit integer types.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-19--348-watch"&gt;Slide 19 — 3:48 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=224s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=224s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_024.png" width="100%" alt="Slide 19"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;You can create and pass your IAFS quantizer tensors to tensor operations, which will automatically utilize any available hardware acceleration.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-20--404-watch"&gt;Slide 20 — 4:04 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=234s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=234s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_025.png" width="100%" alt="Slide 20"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Creating a tensor with a quantized data type is similar to creating a regular tensor. You fill in the descriptor's properties as you would for any other tensor, but specify a quantized data type. Then, create the tensor by calling newTensorWithDescriptor on your Metal device.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-21--418-watch"&gt;Slide 21 — 4:18 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=254s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=254s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_026.png" width="100%" alt="Slide 21"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;You can store your quantized element data using this method. Next, we will discuss scale factors.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-22--436-watch"&gt;Slide 22 — 4:36 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=263s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=263s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_027.png" width="100%" alt="Slide 22"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;In macOS and iOS 27, a single MTL tensor object can represent scales alongside the tensor's quantized data as an additional scales plan. This plan supports the FP8 EAM0 block-wide scale factor format. Each element of the scales plan corresponds to a block for each element in the data plan. Declaring the scales plan is similar to declaring a tensor.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-23--504-watch"&gt;Slide 23 — 5:04 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=288s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=288s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_028.png" width="100%" alt="Slide 23"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;First, create a descriptor object for the scales plan. Next, fill in the data type and block factors. Then, create an auxiliary plan map to specify that this plan is for scales. Attach the auxiliary plan map to your original tensor descriptor. The quantized data, scales, and metadata will all be packed into a single tensor object. Now, let's put this into practice by extending a basic matrix multiplication kernel to support quantization.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-24--526-watch"&gt;Slide 24 — 5:26 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=322s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=322s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_029.png" width="100%" alt="Slide 24"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Matrix multiplication is a fundamental operation in machine learning workloads.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-25--534-watch"&gt;Slide 25 — 5:34 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=332s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=332s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_030.png" width="100%" alt="Slide 25"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;LMS performs millions of matrix multiplications during inference.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-26--548-watch"&gt;Slide 26 — 5:48 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=338s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=338s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_031.png" width="100%" alt="Slide 26"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;We discussed the fundamentals of writing a high-performance matrix multiplication kernel using TensorOps in the M5 machine learning talk. The approach involves slicing the input matrices into smaller tiles and performing tile-wise matrix multiplications with TensorOps. This method maximizes parallelism and ensures that data remains in the cache.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-27--602-watch"&gt;Slide 27 — 6:02 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=360s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=360s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_032.png" width="100%" alt="Slide 27"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;We can use quantization to reduce memory traffic and accommodate larger models in memory.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-28--624-watch"&gt;Slide 28 — 6:24 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=367s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=367s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_033.png" width="100%" alt="Slide 28"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;In the kernel, it is beneficial to define type aliases before binding the tensors. We declare a scale factor plan using the FP8 EAM0 data type and a block size of 32 by 1. This configuration means that every 32 elements in the data plan share a single element in the scales plan. Next, we declare a full tensor type, specifying the FP8 data type along with the scales plan. These tensors can then be easily bound to buffer binding points, allowing the kernel to access the tensors allocated on the host side.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-29--646-watch"&gt;Slide 29 — 6:46 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=403s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=403s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_034.png" width="100%" alt="Slide 29"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Alternatively, if you prefer not to create a full mtel tensor on the host, you can create a temporary tensor directly on the shader stack.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-30--654-watch"&gt;Slide 30 — 6:54 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=411s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=411s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_035.png" width="100%" alt="Slide 30"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;The syntax is nearly identical; simply replace the tag tensor handle with tensor inline.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-31--702-watch"&gt;Slide 31 — 7:02 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=419s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=419s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_036.png" width="100%" alt="Slide 31"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Pass your buffer pointers and other metadata to the tensor constructor to create a tensor on the stack.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-32--712-watch"&gt;Slide 32 — 7:12 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=427s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=427s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_037.png" width="100%" alt="Slide 32"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;We will divide the problem among multiple thread groups to enhance parallelism. First, we will slice out the tile for each thread group, and then we will perform the multiplication using tensor operations.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-33--726-watch"&gt;Slide 33 — 7:26 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=439s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=439s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_038.png" width="100%" alt="Slide 33"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;To achieve this, call the slice function on your input and output tensors using the thread group ID. Both the data and the scales plan will be sliced simultaneously based on the block size.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-34--746-watch"&gt;Slide 34 — 7:46 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=453s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=453s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_039.png" width="100%" alt="Slide 34"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Setting up matrix multiplication with a quantizer tensor is the same as with normal tensors. First, configure the matmul2d descriptor by specifying the tile sizes and other parameters. Next, create a matmul2d operation, indicating the number of command groups in the thread group. Finally, pass in your quantizer tensor, and the tensor operations will manage the dequantization automatically.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-35--806-watch"&gt;Slide 35 — 8:06 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=482s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=482s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_040.png" width="100%" alt="Slide 35"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;In most cases, you should input your quantizer data directly into tensor operations to automatically leverage any available hardware acceleration.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-36--812-watch"&gt;Slide 36 — 8:12 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=489s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=489s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_041.png" width="100%" alt="Slide 36"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;If you need to dequantize a custom format, tensor operations can still accommodate this requirement.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-37--828-watch"&gt;Slide 37 — 8:28 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=497s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=497s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_043.png" width="100%" alt="Slide 37"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;The simplest approach involves each thread loading a chunk of quantizer data from device memory and dequantizing it to F16 values in the thread group memory. This data can then be passed as an inline thread group tensor to tensor operations. However, this method necessitates additional load and store operations through thread group memory. Ideally, we should keep all this data in thread registers instead.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-38--844-watch"&gt;Slide 38 — 8:44 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=521s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=521s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_044.png" width="100%" alt="Slide 38"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;You can achieve this by dequantizing the data into a cooperative tensor, which can then be used as the input for the matmul2d operation.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-39--854-watch"&gt;Slide 39 — 8:54 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=527s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=527s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_045.png" width="100%" alt="Slide 39"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Cooperative tensors distribute their storage across the thread-private memory of the threads participating in the matmul operation. If you cannot use the quantizer tensor directly, you can still avoid the round trip through thread group memory.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-40--910-watch"&gt;Slide 40 — 9:10 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=546s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=546s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_047.png" width="100%" alt="Slide 40"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;To recap, Metal tensors natively support a wide range of quantizer data types, including the new MX scaling formats and the EM0 scale factors introduced in iOS and macOS 27.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-41--922-watch"&gt;Slide 41 — 9:22 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=555s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=555s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_048.png" width="100%" alt="Slide 41"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;These new data types have additional alignment requirements compared to larger data types. Be sure to check the Metal documentation for details.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-42--934-watch"&gt;Slide 42 — 9:34 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=571s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=571s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_049.png" width="100%" alt="Slide 42"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Now, let's advance to creating a more complex custom operation using tensor operations.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-43--954-watch"&gt;Slide 43 — 9:54 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=579s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=579s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_050.png" width="100%" alt="Slide 43"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Attention is central to every transformer network, including language models. To compute attention, you first multiply two matrices, Q and K. Then, you calculate the softmax by applying reductions on the rows of the resulting intermediate matrix. Finally, you multiply by a third matrix. The widely used flash attention algorithm combines all these operations into a single kernel.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-44--1018-watch"&gt;Slide 44 — 10:18 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=609s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=609s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_051.png" width="100%" alt="Slide 44"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;To implement this with tensor operations, first set up a custom CMD group mapping, ensuring that each CMD group owns complete rows of the intermediate matrix. This configuration allows you to compute the softmax without the need to exchange data between CMD groups.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-45--1034-watch"&gt;Slide 45 — 10:34 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=628s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=628s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_052.png" width="100%" alt="Slide 45"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;You can achieve this by utilizing the execution CMD group operation scope. Each CMD group will perform independent matrix multiplications in parallel, and you can use the CMD group ID to slice your input tiles accordingly.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-46--1050-watch"&gt;Slide 46 — 10:50 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=640s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=640s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_053.png" width="100%" alt="Slide 46"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;We will use a cooperative tensor to store the intermediate matrix, allowing us to use it as input for the next step without writing it to memory. We will compute the softmax on the result, which requires performing a couple of reductions on the cooperative tensor.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-47--1102-watch"&gt;Slide 47 — 11:02 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=659s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=659s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_054.png" width="100%" alt="Slide 47"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Tensor operations include a reduce rows function to facilitate this process.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-48--1112-watch"&gt;Slide 48 — 11:12 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=666s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=666s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_055.png" width="100%" alt="Slide 48"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Threads will exchange data to calculate the maximum for each row. The result will be returned in another cooperative tensor. Let's set it up.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-49--1126-watch"&gt;Slide 49 — 11:26 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=678s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=678s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_056.png" width="100%" alt="Slide 49"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;First, create a cooperative tensor to store the reduction output. Next, pass the source and destination to the reduce rows function. We will use the max reduction operation with an initial value of negative infinity.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-50--1146-watch"&gt;Slide 50 — 11:46 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=696s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=696s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_057.png" width="100%" alt="Slide 50"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;The two cooperative tensors have different shapes, so to facilitate mapping between them, tensor operations include a map iterator function. This function takes an iterator pointing to an element in the 2D tensor and returns an iterator pointing to the corresponding element in the reduction destination.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-51--1206-watch"&gt;Slide 51 — 12:06 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=716s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=716s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_058.png" width="100%" alt="Slide 51"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;First, set up a loop over the 2D cooperative tensor using iterators. Then, call the map iterator function to map each element to its corresponding row maximum. Finally, dereference these iterators to compute the software maximum and store the result back into the cooperative tensor.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-52--1220-watch"&gt;Slide 52 — 12:20 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=735s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=735s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_059.png" width="100%" alt="Slide 52"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Now we are ready to multiply the cooperative tensor by V.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-53--1228-watch"&gt;Slide 53 — 12:28 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=745s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=745s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_060.png" width="100%" alt="Slide 53"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;In macOS 26, you must first store the cooperative tensor in thread group memory. However, it is now possible to use cooperative tensors directly as inputs for manual operations.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-54--1250-watch"&gt;Slide 54 — 12:50 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=752s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=752s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_061.png" width="100%" alt="Slide 54"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;To use cooperative tensors as inputs to manual operations, call the getLeftInputCooperativeTensor method and pass the source cooperative tensor as an argument. You can then use the result as an input for the second manual operation. However, not every cooperative tensor can be reused as an input due to potential differences in layouts based on data types and other factors. Before proceeding, call the isCompatibleAsLeft or RightInput method to check compatibility. If it returns true, you can continue.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-55--1314-watch"&gt;Slide 55 — 13:14 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=788s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=788s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_062.png" width="100%" alt="Slide 55"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;If the compatibility check returns false, you must store and reload the data through thread group memory to convert it to the correct layout. Regardless of the method used, the call to op.run remains the same.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-56--1322-watch"&gt;Slide 56 — 13:22 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=800s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=800s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_063.png" width="100%" alt="Slide 56"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;These are the key TensorOps features necessary for building an advanced operation like FlashAttention using TensorOps.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-57--1330-watch"&gt;Slide 57 — 13:30 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=807s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=807s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_064.png" width="100%" alt="Slide 57"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Now that we've discussed how to build this operation, let's examine its performance in a real model using Core AI.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-58--1346-watch"&gt;Slide 58 — 13:46 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=816s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=816s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_065.png" width="100%" alt="Slide 58"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Core AI offers tools for Python developers to convert PyTorch models into Core AI models, including support for custom meta kernels. For detailed integration of a meta kernel into a Core AI model, refer to the Deep Dive into Core AI Model Authoring and Organization session.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-59--1424-watch"&gt;Slide 59 — 14:24 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=836s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=836s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_066.png" width="100%" alt="Slide 59"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;I followed the steps from that session to integrate our custom FlashAttention kernel into a SAM3 image segmentation model. We define the body of our custom attention kernel as a string in Python and register the TorchMetalKernel object. Next, we replace the default HuggingFaceAttention implementation with one that calls our kernel. Finally, we load the model from HuggingFace and export it from PyTorch as an optimized Core AI asset. The export will take a moment to finish. Now we're ready for inference. SAM3 performs promptable concept segmentation, so we provide the model with an image and text, and it responds with a segmentation mask indicating where objects are located in the image.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-60--1458-watch"&gt;Slide 60 — 14:58 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=896s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=896s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_067.png" width="100%" alt="Slide 60"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;I am prompting the model to label all pixels in the image that contain a car.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-61--1506-watch"&gt;Slide 61 — 15:06 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=903s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=903s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_068.png" width="100%" alt="Slide 61"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Now I will run the segmentation.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-62--1518-watch"&gt;Slide 62 — 15:18 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=912s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=912s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_069.png" width="100%" alt="Slide 62"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;The final result shows that the model correctly segmented the image. The car is highlighted in blue, indicating that our attention kernel is fully integrated into the model as expected.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-63--1532-watch"&gt;Slide 63 — 15:32 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=925s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=925s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_070.png" width="100%" alt="Slide 63"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Today, I covered the tools available for building optimized custom ML kernels on Apple Silicon. These include quantized data types, advanced TensorOps features such as cooperative tensors and reductions, and integration with Core AI.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-64--1554-watch"&gt;Slide 64 — 15:54 (&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;amp;t=943s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=toO9j5NKg0c&amp;t=943s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/toO9j5NKg0c/slide_072.png" width="100%" alt="Slide 64"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;To go further, explore the Metal Performance Primitive documentation for the complete API reference and programming guide, which provide additional performance optimization guidelines. You can also download the TensorOps sample code to review details that I couldn't cover here. Additionally, be sure to check out the related sessions to learn more about Core AI and Metal. Thank you.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;</description></item><item><title>Building confidence in an always-in-motion distributed streaming system | Frank McSherry | Bug Bash</title><link>https://blog.randomdomain.co.za/youtube/47lcikzc58u/</link><pubDate>Thu, 14 May 2026 00:00:00 +0000</pubDate><guid>https://blog.randomdomain.co.za/youtube/47lcikzc58u/</guid><description>&lt;iframe width="720" height="405" src="https://www.youtube.com/embed/47lCIKzc58U" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;em&gt;151 slides extracted.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="slide-1--016-watch"&gt;Slide 1 — 0:16 (&lt;a href="https://www.youtube.com/watch?v=47lCIKzc58U&amp;amp;t=11s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=47lCIKzc58U&amp;t=11s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/47lCIKzc58U/slide_001.png" width="100%" alt="Slide 1"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Can everyone hear me? Great. Today, I’m Frank McSherry from Materialize, and the title of my presentation is "Bug Batch." When I initially typed the title, I wasn't thinking too deeply about it, but I’ve come to appreciate it. It effectively conveys the topic, particularly the importance of using the right verb tenses, such as the gerund. This presentation will focus on building confidence—what it means and my perspective on it. For me, and I hope for all of you, building confidence is a process rather than a finished product. You are never done building confidence in something.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-2--154-watch"&gt;Slide 2 — 1:54 (&lt;a href="https://www.youtube.com/watch?v=47lCIKzc58U&amp;amp;t=113s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=47lCIKzc58U&amp;t=113s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/47lCIKzc58U/slide_013.png" width="100%" alt="Slide 2"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Building confidence is an ongoing process, not a finished product. It involves various elements that help you and those around you understand and evolve the work you are doing. I want to emphasize that what I share today is largely based on personal opinions, although it does include some technology discussions. You are encouraged to evaluate and reflect on these ideas and determine if they resonate with you. Each presentation today has been a personal journey, and I invite you to consider these insights thoughtfully rather than dismiss them outright.
&lt;p&gt;I also want to mention that I had a conversation with Gary yesterday, where I mentioned having some strong opinions on certain topics. While I decided not to include those hot takes in my slides to avoid controversy, I will share that my organization has seen significant benefits from neurosymbolic AI. I believe that the processes I have found effective for building confidence align well with the recent advancements in AI tools. These tools may not directly assist in building confidence but can facilitate effective implementation once confidence is established.&lt;/p&gt;</description></item><item><title>Nothing has changed about software engineering | Ben Eggers | Bug Bash 2026</title><link>https://blog.randomdomain.co.za/youtube/lxdrdorvfde/</link><pubDate>Thu, 14 May 2026 00:00:00 +0000</pubDate><guid>https://blog.randomdomain.co.za/youtube/lxdrdorvfde/</guid><description>&lt;iframe width="720" height="405" src="https://www.youtube.com/embed/lxDRDORvFdE" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;em&gt;110 slides extracted.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="slide-1--004-watch"&gt;Slide 1 — 0:04 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=3s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=3s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_000.png" width="100%" alt="Slide 1"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;I'm Ben Eggers from OpenAI. To start, could I have a volunteer from the front row?&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-2--010-watch"&gt;Slide 2 — 0:10 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=7s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=7s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_001.png" width="100%" alt="Slide 2"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;What's your name? I tend to get nervous when I speak, so if I'm talking too fast, please let me know. Thank you.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-3--020-watch"&gt;Slide 3 — 0:20 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=19s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=19s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_002.png" width="100%" alt="Slide 3"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;I'm Ben Eggers, and I work at OpenAI. I'm here to explain that nothing has changed in software development.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-4--028-watch"&gt;Slide 4 — 0:28 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=23s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=23s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_003.png" width="100%" alt="Slide 4"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Software development remains unchanged.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-5--038-watch"&gt;Slide 5 — 0:38 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=36s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=36s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_004.png" width="100%" alt="Slide 5"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Nothing has changed. First, let's conduct a poll. Please raise your hand if you have used a large language model (LLM) to develop software.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-6--052-watch"&gt;Slide 6 — 0:52 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=50s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=50s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_005.png" width="100%" alt="Slide 6"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;How many people here believe that we experienced a significant leap in model intelligence a few months ago? How many would trust an LLM to develop all of their software? Let's discuss.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-7--104-watch"&gt;Slide 7 — 1:04 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=59s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=59s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_006.png" width="100%" alt="Slide 7"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;I have a personal question. How many of you are using MacBook Pros that can't connect to Wi-Fi after putting them to sleep and then reopening them? I've been struggling with that issue. Great, I'm Ben.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-8--114-watch"&gt;Slide 8 — 1:14 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=72s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=72s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_007.png" width="100%" alt="Slide 8"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;This slide features a photo of me speaking at Bug Bash last year, alongside a childhood photo of myself that I shared during the event.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-9--126-watch"&gt;Slide 9 — 1:26 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=77s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=77s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_008.png" width="100%" alt="Slide 9"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;I work on infrastructure at OpenAI. Previously, I was the eighth highest seven-day trailing token user at OpenAI, with a spike large enough to trigger rate limiting. I also have several hobbies, so if you're interested in long-distance hiking, jazz, living abroad, or therapy, let's talk.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-10--144-watch"&gt;Slide 10 — 1:44 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=95s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=95s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_009.png" width="100%" alt="Slide 10"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Before I begin this talk, I want to thank these individuals. If any of them apply to work with you, you should hire them immediately. They have significantly contributed to the ideas presented in this talk and have made me a better engineer. These are some of my engineering heroes, most of whom work at OpenAI. I wouldn't feel right giving this talk without acknowledging them and expressing my appreciation for their greatness.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-11--214-watch"&gt;Slide 11 — 2:14 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=123s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=123s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_010.png" width="100%" alt="Slide 11"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Someone once told me that the key to giving a good talk is to outline what you will discuss, present the content, and then summarize what you covered. So, let me outline my main point: all the challenging aspects of building software remain difficult and unchanged. We will address this in two parts. First, I assert that writing code is indeed the hard part of software development, but not for the reasons typically associated with writing code.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-12--226-watch"&gt;Slide 12 — 2:26 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=144s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=144s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_011.png" width="100%" alt="Slide 12"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;In part two, we will discuss how agents facilitate the work and influence your thinking about it, but they do not eliminate the need for the work itself.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-13--232-watch"&gt;Slide 13 — 2:32 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=150s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=150s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_012.png" width="100%" alt="Slide 13"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;All the challenging aspects remain unchanged.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-14--244-watch"&gt;Slide 14 — 2:44 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=157s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=157s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_013.png" width="100%" alt="Slide 14"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;After Will's insightful keynote this morning, I want to emphasize that the process is not just about writing code and testing. I believe it is more accurately represented as 40% thinking, 10% writing code, and 50% testing. This perspective highlights the importance of each phase in the development process.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-15--254-watch"&gt;Slide 15 — 2:54 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=173s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=173s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_014.png" width="100%" alt="Slide 15"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;I would like to provide a disclaimer.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-16--258-watch"&gt;Slide 16 — 2:58 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=176s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=176s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_015.png" width="100%" alt="Slide 16"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;I am referring to deep and narrow systems, which have a limited surface area in terms of the APIs they offer but possess significant implementation complexity. This includes databases, file systems, and infrastructure.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-17--314-watch"&gt;Slide 17 — 3:14 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=192s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=192s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_016.png" width="100%" alt="Slide 17"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;We are not discussing web portals and applications, which typically have a broader feature set. In these cases, each feature does not significantly impact the architecture of the rest of the system.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-18--322-watch"&gt;Slide 18 — 3:22 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=200s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=200s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_017.png" width="100%" alt="Slide 18"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;I cannot definitively say that this does not apply to broad, high surface area systems. My experience with them is limited, so I do not feel qualified to comment extensively.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-19--330-watch"&gt;Slide 19 — 3:30 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=208s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=208s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_018.png" width="100%" alt="Slide 19"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;I believe I am somewhat qualified to discuss the systems on the left, so that will be our focus.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-20--336-watch"&gt;Slide 20 — 3:36 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=211s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=211s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_019.png" width="100%" alt="Slide 20"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Many of you who attended Bug Bash last year might recall that I enjoy games. Last year, we played Guess the Impact. This year, the game is Guess What the Agent Gave Me.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-21--348-watch"&gt;Slide 21 — 3:48 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=222s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=222s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_020.png" width="100%" alt="Slide 21"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;I will describe a system and share the prompt I used with the agent. Then, you will guess the outcome.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-22--356-watch"&gt;Slide 22 — 3:56 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=234s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=234s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_021.png" width="100%" alt="Slide 22"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Let's practice.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-23--402-watch"&gt;Slide 23 — 4:02 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=237s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=237s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_022.png" width="100%" alt="Slide 23"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;I aimed to create a Rust drop-in replacement for Python's RE module. Regular expressions present significant implementation complexity, but there is a clear correctness oracle in the Python RE module. It seems feasible to achieve better performance.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-24--418-watch"&gt;Slide 24 — 4:18 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=256s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=256s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_023.png" width="100%" alt="Slide 24"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Python's RE module is primarily written in Python. This presents an interesting problem to explore in the context of autonomous software engineering.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-25--426-watch"&gt;Slide 25 — 4:26 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=262s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=262s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_024.png" width="100%" alt="Slide 25"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;I built a harness with an essentially empty repository that operated in a while loop.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-26--438-watch"&gt;Slide 26 — 4:38 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=272s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=272s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_025.png" width="100%" alt="Slide 26"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Every four or five loops, the system would instantiate a Codex instance, instructing it to pick something up and move closer to it. Additionally, every fifth or sixth loop, an orchestrator agent could modify the agent harness. The while loop itself was straightforward; it simply called the Python file that the orchestrator agent could manipulate.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-27--452-watch"&gt;Slide 27 — 4:52 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=291s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=291s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_026.png" width="100%" alt="Slide 27"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;What do you think happened here? Any guesses? A Rust wrapper for Python would be even better than what I have. Do we have any other suggestions?&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-28--512-watch"&gt;Slide 28 — 5:12 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=309s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=309s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_027.png" width="100%" alt="Slide 28"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;The codebase consists of one million lines, which is low but morally correct. It contains numerous markdown documents, and that is accurate.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-29--526-watch"&gt;Slide 29 — 5:26 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=318s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=318s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_028.png" width="100%" alt="Slide 29"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;After a few weeks of review, I noticed that it had generated manifests containing hundreds of thousands of lines of JSON. These manifests functioned as test cases, each highly specific, detailing conditions such as "this should match this" and tagged with numerous keywords and features. The result was overwhelming and poorly structured.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-30--550-watch"&gt;Slide 30 — 5:50 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=339s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=339s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_029.png" width="100%" alt="Slide 30"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;I SSH'd in and decided to experiment with autonomous software engineering instead of directly instructing the agent to modify the code. I attempted to modify the harness to avoid using JSON. As a result, it changed all the file types to PY and created a manifest assignment. This repository is available on GitHub for reference. Additionally, it generated everything within a single 24,000-line Rust crate.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-31--618-watch"&gt;Slide 31 — 6:18 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=364s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=364s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_030.png" width="100%" alt="Slide 31"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;You might think that 24,000 lines is a lot, but when you look at the file percentages, it makes sense. The process generated reports that were initially in JSON format but were converted to PY. One of these reports is 6.47 megabytes, indicating that we have large JSON files containing numerous test cases. It appears that the system tested these cases and produced reports detailing the results of each test.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-32--636-watch"&gt;Slide 32 — 6:36 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=392s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=392s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_031.png" width="100%" alt="Slide 32"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;This isn't exactly what I envisioned. I still believe this idea has potential, but I haven't had the time to pursue it further. That's our game, and we have a couple more similar projects in the pipeline.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-33--644-watch"&gt;Slide 33 — 6:44 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=402s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=402s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_032.png" width="100%" alt="Slide 33"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Part one.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-34--646-watch"&gt;Slide 34 — 6:46 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=405s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=405s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_033.png" width="100%" alt="Slide 34"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Writing code has always revealed the most challenging aspects of programming.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-35--652-watch"&gt;Slide 35 — 6:52 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=408s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=408s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_034.png" width="100%" alt="Slide 35"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;My claim is that the bottleneck has never been typing, which I believe is an uncontroversial statement. If you're in this room, you likely type at least 60, and probably 80 to 100 words per minute. When you calculate the number of lines of code produced per day, it's clear that typing is not the bottleneck.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-36--710-watch"&gt;Slide 36 — 7:10 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=429s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=429s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_035.png" width="100%" alt="Slide 36"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Code is relatively inexpensive to produce, even at high typing speeds. In fact, code has historically been considered cheap to create.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-37--726-watch"&gt;Slide 37 — 7:26 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=434s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=434s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_036.png" width="100%" alt="Slide 37"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;My rule of thumb for a productive day or week was shipping a couple thousand lines of code, which translates to about 400 or 500 lines per day during six hours of deep focus time. However, the time spent typing those lines does not account for the necessary design discovery, integration, and correctness processes. I assert that these aspects remain the challenging part of coding.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-38--750-watch"&gt;Slide 38 — 7:50 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=460s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=460s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_037.png" width="100%" alt="Slide 38"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;This image resembles a sci-fi book cover featuring someone writing code. In the past, writing code required deep thought about the task at hand. However, in today's environment, where we can simply issue prompts like "make it better" or "make no mistakes," we tend to think less critically about our objectives. The process of coding used to compel us to uncover the true nature of the problem.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-39--814-watch"&gt;Slide 39 — 8:14 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=491s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=491s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_038.png" width="100%" alt="Slide 39"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;We've all experienced moments when we're struggling with a piece of code, and suddenly realize that a component should be placed differently or that our database indices are incorrect. If you're in this room, you've likely written code with LLMs and experienced that "aha" moment, where you recognize that the shape of the problem differs from your initial perception.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-40--828-watch"&gt;Slide 40 — 8:28 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=501s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=501s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_039.png" width="100%" alt="Slide 40"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;It also forced us to turn those boundaries into contracts. In an era where you can easily rewrite your entire API contract, that was not always the case. Perhaps most importantly, you notice the unusual issues before anyone else does. Will mentioned in his talk this morning that humans have always been unreliable, and AI agents are not necessarily less reliable. While that is true and AI is improving, it seems to me that there was something qualitatively significant about the fact that a human carefully considered every line of code. Now, we are in a situation where, because a human is not thoroughly analyzing each line, we have lost a critical aspect of quality assurance that was previously inherent in our software.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-41--912-watch"&gt;Slide 41 — 9:12 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=550s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=550s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_040.png" width="100%" alt="Slide 41"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;A human would assess whether something was correct, consider the shape of the problem, and review the API contracts. Filling in the code was often the least interesting part of the process.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-42--926-watch"&gt;Slide 42 — 9:26 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=564s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=564s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_041.png" width="100%" alt="Slide 42"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;When writing an algorithm, such as an inverted index, the process of coding itself is not necessarily boring. However, if you frame coding in these terms, filling in the code can be seen as the least interesting part. It's akin to setting up all the boxes and then simply coloring them in.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-43--938-watch"&gt;Slide 43 — 9:38 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=576s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=576s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_042.png" width="100%" alt="Slide 43"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;The slowness was a critical factor. I asked our new image model to provide an illustration of slowness as a load-bearing concept, and this is the result I received.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-44--950-watch"&gt;Slide 44 — 9:50 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=579s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=579s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_043.png" width="100%" alt="Slide 44"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;When using these interfaces regularly, the deficiencies become apparent. As you wire paths end-to-end, you notice the missing cases. You might realize that two cases are actually the same, or that you should consider an error case. This requires careful thought about the various scenarios, whereas a large language model is more likely to make mistakes.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-45--1004-watch"&gt;Slide 45 — 10:04 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=602s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=602s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_044.png" width="100%" alt="Slide 45"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;When writing your queries, it's crucial to carefully consider how you manage your indices and the efficiency of your scans, especially for those of you interested in databases.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-46--1022-watch"&gt;Slide 46 — 10:22 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=611s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=611s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_045.png" width="100%" alt="Slide 46"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;It's important to think critically about your approach when writing queries and conducting tests. Common wisdom suggests focusing on testing your interfaces rather than your implementation, considering potential edge cases. This method remains effective, but when a human is involved, you can be very intentional about your testing strategy.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-47--1100-watch"&gt;Slide 47 — 11:00 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=652s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=652s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_046.png" width="100%" alt="Slide 47"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;I assert that there was once a natural equilibrium in software development, where the speed of writing code matched our capacity to reason about it. Generally, people created code they understood, and if they didn't, it was much more limited than it is today.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-48--1114-watch"&gt;Slide 48 — 11:14 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=668s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=668s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_047.png" width="100%" alt="Slide 48"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;I truly believe that during the golden era of human software engineering, code production was slow enough that we thought more critically about it, resulting in better quality work. Today, we often hear the term "slop" used to describe the current state of software development. This reflects the reality that while humans produce less slop overall, it still exists. I understand the skepticism surrounding this issue, especially the claim that software engineering has become stochastic due to large language models.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-49--1158-watch"&gt;Slide 49 — 11:58 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=717s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=717s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_048.png" width="100%" alt="Slide 49"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Software engineering has always been stochastic. Anyone who has managed a project with interns or new graduates understands this. You might receive anywhere from 100 to 2,000 lines of code, and the quality can vary significantly. This isn't a critique of inexperienced software engineers; rather, it highlights that outsourcing work rarely yields the same level of quality as your original vision. You cannot expect to receive exactly what you had in mind when delegating tasks.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-50--1226-watch"&gt;Slide 50 — 12:26 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=728s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=728s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_049.png" width="100%" alt="Slide 50"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;As a tech lead, you define the constraints and overall architecture of the project. You may not need to detail every aspect of the implementation, as long as the interfaces are correctly implemented, you have confidence in your tests, and the system functions as intended. While code reviews are essential, it's not necessary to understand every line of code or service, provided you have team members who do. Your focus can be on data storage, service communication, and ensuring the correctness of interfaces and types. However, this approach may vary when dealing with particularly complex systems.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-51--1314-watch"&gt;Slide 51 — 13:14 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=788s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=788s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_050.png" width="100%" alt="Slide 51"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Many of us have encountered frustrating database bugs, which reflect a stylized version of the role of a tech lead during the golden era of software engineering. The primary responsibility was to narrow the distribution of possible implementations. You begin with your intent, evaluate various implementations, and select one. To constrain the design, you concentrate on schemas, APIs, tests, and reviews rather than the code within individual modules.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-52--1322-watch"&gt;Slide 52 — 13:22 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=801s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=801s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_051.png" width="100%" alt="Slide 52"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;In summary, the old coding loop compelled design thinking.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-53--1334-watch"&gt;Slide 53 — 13:34 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=808s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=808s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_053.png" width="100%" alt="Slide 53"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Slowness served as a critical rate limiter, and we've essentially always engaged in stochastic software engineering. While not every individual may have practiced this approach, software engineering at a large scale has fundamentally been a stochastic process. Now, let's play another game.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-54--1358-watch"&gt;Slide 54 — 13:58 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=829s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=829s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_054.png" width="100%" alt="Slide 54"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;We have a comprehensive test suite and a legacy storage system that we find unsatisfactory due to its poor performance. We decided to build a better version using modern primitives, specifically object storage and a key-value store provided by OpenAI. We set up the comprehensive test suite and ran it against the legacy storage system, which passed. Following that, we implemented an agent hill climb approach.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-55--1416-watch"&gt;Slide 55 — 14:16 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=855s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=855s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_055.png" width="100%" alt="Slide 55"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;The design of the harness is not particularly noteworthy. We had an agent hill climb to get everything functioning, and after a few weeks, it was successful. My question is, what do you think we achieved? Did it interact with the old storage system?&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-56--1450-watch"&gt;Slide 56 — 14:50 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=880s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=880s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_056.png" width="100%" alt="Slide 56"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;No, it was a better sandbox than that, although a very large S3 bucket would have been amusing. We actually had one key and one value. It worked fine on my machine. Did it perform better? Locally, it performed adequately, but upon deployment, we encountered unexpected issues. This is particularly amusing because this type of bug is something a human would almost never create.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-57--1508-watch"&gt;Slide 57 — 15:08 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=905s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=905s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_057.png" width="100%" alt="Slide 57"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Humans can make unpredictable mistakes, but this particular bug is difficult to envision as something a human would create. When you want to insert multiple keys and values into a key-value store, this is not the typical implementation approach one would choose.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-58--1516-watch"&gt;Slide 58 — 15:16 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=913s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=913s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_058.png" width="100%" alt="Slide 58"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;I haven't had time to review the logs from the harness runs, but I suspect that a performance hack was implemented due to the small data scale. Future iterations likely overlooked this issue, assuming it was intentional and that the human wanted it that way.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-59--1538-watch"&gt;Slide 59 — 15:38 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=937s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=937s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_059.png" width="100%" alt="Slide 59"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;I won't address it because I've seen this happen frequently in my experience. Moving on to part two: agents facilitate the work, but they do not eliminate it. You may have noticed that models can surpass the threshold of usefulness.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-60--1544-watch"&gt;Slide 60 — 15:44 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=940s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=940s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_060.png" width="100%" alt="Slide 60"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;In comparing GPT 4.1 to GPT 4.6, it's clear that 4.1 performs significantly worse on all benchmarks.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-61--1554-watch"&gt;Slide 61 — 15:54 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=949s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=949s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_061.png" width="100%" alt="Slide 61"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;There is also a qualitative difference between GPT 3.7 and GPT 5.4, which is another unfair comparison. Previous generations of models struggled with RKGI2, while current generations are suddenly able to handle it effectively.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-62--1612-watch"&gt;Slide 62 — 16:12 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=971s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=971s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_062.png" width="100%" alt="Slide 62"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;We have model generations that were trained on the training set, but there is also a sense that these models have crossed a qualitative threshold of usefulness. Many of us feel that we can trust them more now, and they perform better in various tasks. This shift has led to discussions about agentic engineering and the concept of an intelligence explosion.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-63--1622-watch"&gt;Slide 63 — 16:22 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=981s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=981s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_063.png" width="100%" alt="Slide 63"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;I feel that a model is often better at my job than I am, and this change occurred about three months ago.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-64--1642-watch"&gt;Slide 64 — 16:42 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=997s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=997s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_064.png" width="100%" alt="Slide 64"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;I maintain that models can write better code when you provide the initial guidance. You must define what success looks like and supply a comprehensive test suite. It’s essential to outline the structure of the solution; simply instructing the model to "build this thing" or "make it better" is insufficient. Additionally, you need to establish in advance how you will evaluate whether the change was effective; guessing is not an option.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-65--1654-watch"&gt;Slide 65 — 16:54 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1008s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1008s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_065.png" width="100%" alt="Slide 65"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;These are the same principles that humans need to build good software, which supports my claim that software engineering has not changed. I consider these aspects when mentoring an intern, writing notes for myself, or when I sit down to do some work.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-66--1710-watch"&gt;Slide 66 — 17:10 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1028s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1028s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_066.png" width="100%" alt="Slide 66"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;I need to consider what the desired outcome looks like and how to achieve it effectively. Therefore, it's essential to make decisions first.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-67--1714-watch"&gt;Slide 67 — 17:14 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1031s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1031s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_067.png" width="100%" alt="Slide 67"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;You define the desired behavior changes, identify what must continue functioning, and specify the trade-offs you are willing to accept.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-68--1726-watch"&gt;Slide 68 — 17:26 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1036s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1036s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_068.png" width="100%" alt="Slide 68"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;For example, avoid placing all keys and values in a singleton within the key-value store. Instead, utilize the key-value store effectively. There is potential for a separate, interesting discussion on this topic. Prompts can be likened to mathematical expressions. Ultimately, you must be extremely specific and detailed in your requests, particularly in distinguishing between terms like "for any," "for all," and "choose one such that."&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-69--1750-watch"&gt;Slide 69 — 17:50 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1068s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1068s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_070.png" width="100%" alt="Slide 69"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;These details are significant for implementation. As we increasingly interact with code and computers through prose, prompts are likely to become more mathematical across the industry. While I believe this topic warrants a separate discussion, it is not the focus of this presentation.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-70--1802-watch"&gt;Slide 70 — 18:02 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1080s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1080s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_071.png" width="100%" alt="Slide 70"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Design is possibly the most important slide in this entire presentation, as it reflects what I have learned about developing with agents.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-71--1810-watch"&gt;Slide 71 — 18:10 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1083s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1083s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_072.png" width="100%" alt="Slide 71"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;I write all of my schemas by hand. For very simple schemas, I might use an agent, but I have spent a week struggling with a 300-line Prisma schema because it needs to be precise. Therefore, I do not let the agent handle it; I write my APIs and interfaces by hand for the same reasons.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-72--1820-watch"&gt;Slide 72 — 18:20 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1096s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1096s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_073.png" width="100%" alt="Slide 72"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;I have coworkers who write all of their tests by hand, which I find excessive. I believe that's the most challenging aspect of software engineering.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-73--1832-watch"&gt;Slide 73 — 18:32 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1111s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1111s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_074.png" width="100%" alt="Slide 73"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;However, I know people who strongly advocate for it.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-74--1836-watch"&gt;Slide 74 — 18:36 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1115s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1115s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_075.png" width="100%" alt="Slide 74"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;There is an interesting perspective that unit testing may be becoming obsolete. We've observed instances where AI-generated unit tests assert unusual values and provide little meaningful information.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-75--1846-watch"&gt;Slide 75 — 18:46 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1123s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1123s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_076.png" width="100%" alt="Slide 75"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;If you are writing unit tests yourself, they can be useful because you, as the human, ensure their correctness. However, simply instructing AI to add more tests is generally not effective. This topic deserves its own discussion, but it is not the focus of this talk.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-76--1902-watch"&gt;Slide 76 — 19:02 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1135s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1135s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_077.png" width="100%" alt="Slide 76"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Correctness requires providing clear guidelines. You should specify the system diagram you want, without concern for the color of the boxes or the programming language used. The internal abstractions and implementation details are generally less important, as long as they are correct.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-77--1916-watch"&gt;Slide 77 — 19:16 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1151s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1151s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_078.png" width="100%" alt="Slide 77"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;If you have a provable correctness harness, the aesthetics of the code become irrelevant. You specify which data models are immutable and provide a comprehensive test harness.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-78--1928-watch"&gt;Slide 78 — 19:28 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1160s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1160s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_079.png" width="100%" alt="Slide 78"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Always implement tests in a different context. This is an important strategy. When you ask an AI to write code and then request unit tests for that code, the AI retains the context of the code it just generated. The most effective workflow I have found is to separate these tasks. First, write your interfaces and a set of tests, then instruct the AI to focus on making the code work without modifying the tests.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-79--1946-watch"&gt;Slide 79 — 19:46 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1184s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1184s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_080.png" width="100%" alt="Slide 79"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;This is the only effective approach to AI-driven, test-driven development, particularly concerning unit tests.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-80--1950-watch"&gt;Slide 80 — 19:50 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1189s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1189s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_081.png" width="100%" alt="Slide 80"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;In summary, here is a checklist for managing your AI agents.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-81--2002-watch"&gt;Slide 81 — 20:02 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1192s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1192s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_082.png" width="100%" alt="Slide 81"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Clearly define the desired behavior change in prose and mathematics. Implement your schemas and interfaces manually or with an agent, which are typically not large relative to the overall system. Create tests for the change, and then allow an agent to fill in the gaps. This process is similar to managing your less motivated self on a Monday at 8 AM.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-82--2020-watch"&gt;Slide 82 — 20:20 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1218s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1218s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_083.png" width="100%" alt="Slide 82"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;That brings us to our final game, Contrafact. I developed a practice journal to track jazz practice.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-83--2028-watch"&gt;Slide 83 — 20:28 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1223s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1223s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_084.png" width="100%" alt="Slide 83"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;The details of the app are not highly specific, but it is important to note that it is not a complex system. Instead, it is a relatively shallow system with many screens.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-84--2044-watch"&gt;Slide 84 — 20:44 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1233s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1233s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_085.png" width="100%" alt="Slide 84"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;I developed my storage models, feature views, and domain model patterns from scratch. I established the core codebase and patterns to ensure they were complete and comprehensive. Then, I would identify a feature I wanted, implement it, and verify that it worked. After each successful implementation, I would repeat the process for the next feature. Eventually, I found myself with 30,000 lines of code and wondered what all that code was doing. Fortunately, there was no markdown involved this time. Did you say time management?&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-85--2140-watch"&gt;Slide 85 — 21:40 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1288s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1288s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_086.png" width="100%" alt="Slide 85"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;That's an interesting guess. There was some problematic clock functionality, but it wasn't a significant part. Duplicated date formatting is the closest guess, so we'll give you that. I requested a practice session with etudes and tunes, which relates to the domain model layer. This layer is not the storage layer; it consists of in-memory abstractions for how we manage and manipulate data. However, what I received was a poorly designed UUID soft look-up layer. In this setup, every entity had a UUID, and each one stored multiple UUIDs. The application performed UUID look-ups in the repository layer, and if it retrieved the wrong type, the entire application would crash.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-86--2156-watch"&gt;Slide 86 — 21:56 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1315s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1315s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_087.png" width="100%" alt="Slide 86"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;During a late-night coding session, I discovered that a change had inadvertently added UUIDs to my data models. While they were correctly linked at the data model layer, they also stored these UUIDs. If those UUIDs became out of sync, the consequences were unclear.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-87--2212-watch"&gt;Slide 87 — 22:12 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1327s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1327s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_088.png" width="100%" alt="Slide 87"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;I completely unraveled the situation because it was problematic. It's crucial to pay attention to your data models.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-88--2220-watch"&gt;Slide 88 — 22:20 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1337s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1337s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_089.png" width="100%" alt="Slide 88"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;I outlined what I intended to convey, and now I've shared that information with you.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-89--2224-watch"&gt;Slide 89 — 22:24 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1342s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1342s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_090.png" width="100%" alt="Slide 89"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Writing code used to require significant design thinking that often occurred implicitly.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-90--2232-watch"&gt;Slide 90 — 22:32 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1347s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1347s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_091.png" width="100%" alt="Slide 90"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Agentic coding requires us to be more explicit in our approach. It does not reduce the need for critical thinking or effort. Now, everyone must take on the responsibilities of a tech lead, which means you are now functioning as a tech lead, while the overall process remains unchanged.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-91--2244-watch"&gt;Slide 91 — 22:44 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1358s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1358s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_092.png" width="100%" alt="Slide 91"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Software engineering is fundamentally unchanged. We prioritize correctness and how we demonstrate that correctness is a fundamentally stochastic process, though it has become faster in some respects.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-92--2252-watch"&gt;Slide 92 — 22:52 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1370s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1370s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_093.png" width="100%" alt="Slide 92"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Code has become inexpensive, but ensuring its correctness remains a challenge.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-93--2254-watch"&gt;Slide 93 — 22:54 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1373s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1373s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_094.png" width="100%" alt="Slide 93"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Thank you.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-94--2324-watch"&gt;Slide 94 — 23:24 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1393s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1393s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_097.png" width="100%" alt="Slide 94"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;I ran a bit over time, but I believe I still have a few minutes for any thoughts, feelings, or questions.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-95--2338-watch"&gt;Slide 95 — 23:38 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1414s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1414s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_098.png" width="100%" alt="Slide 95"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;I have not observed any programmatic enforcement regarding restrictions on modifying schemas or other elements, and I have also seen this approach fail at the prompt level.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-96--2346-watch"&gt;Slide 96 — 23:46 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1422s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1422s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_099.png" width="100%" alt="Slide 96"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;I would like to see a product, open-source library, or VS Code extension that allows you to specify which files the model can or cannot access. This type of guardrail is likely to emerge soon.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-97--2404-watch"&gt;Slide 97 — 24:04 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1437s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1437s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_100.png" width="100%" alt="Slide 97"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;As an inexperienced engineer, you might wonder how to transition to a tech lead role, where the responsibilities differ significantly from those of junior engineers. This is an important question.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-98--2416-watch"&gt;Slide 98 — 24:16 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1455s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1455s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_101.png" width="100%" alt="Slide 98"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;That is one of the key questions in the industry right now.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-99--2424-watch"&gt;Slide 99 — 24:24 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1462s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1462s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_102.png" width="100%" alt="Slide 99"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Tech lead work is qualitatively different from implementation work, which involves writing code and developing a service once a good API contract is established. I believe you can begin practicing tech lead responsibilities directly.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-100--2434-watch"&gt;Slide 100 — 24:34 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1472s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1472s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_103.png" width="100%" alt="Slide 100"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;You can begin by defining what you want to build.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-101--2440-watch"&gt;Slide 101 — 24:40 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1479s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1479s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_104.png" width="100%" alt="Slide 101"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Consider the structure of your database and identify the core entities that are important to you.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-102--2446-watch"&gt;Slide 102 — 24:46 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1484s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1484s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_105.png" width="100%" alt="Slide 102"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Understanding the entire system can be a challenging process initially, as it requires a comprehensive grasp of each component. However, I believe this skill can be developed without the need to spend years meticulously building each part on others' projects before gaining the ability to do it independently.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-103--2508-watch"&gt;Slide 103 — 25:08 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1505s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1505s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_106.png" width="100%" alt="Slide 103"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;People can learn to do this directly. Thank you. I have a quick question. Even if a pattern is abstracted, do you quantify how familiar it is to a model before asking it a question?&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-104--2516-watch"&gt;Slide 104 — 25:16 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1514s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1514s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_107.png" width="100%" alt="Slide 104"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;For a novel concept, you would develop more architecture around it, whereas for something that is relatively standard, you would do less.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-105--2520-watch"&gt;Slide 105 — 25:20 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1519s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1519s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_108.png" width="100%" alt="Slide 105"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;That's a good question.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-106--2524-watch"&gt;Slide 106 — 25:24 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1523s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1523s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_109.png" width="100%" alt="Slide 106"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;There are many aspects of the software world that I am not familiar with.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-107--2530-watch"&gt;Slide 107 — 25:30 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1528s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1528s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_110.png" width="100%" alt="Slide 107"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;Many patterns and practices exist that I am unaware of in places I have never visited.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-108--2544-watch"&gt;Slide 108 — 25:44 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1537s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1537s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_112.png" width="100%" alt="Slide 108"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;In my experience, the models I have encountered tend to produce core patterns that are about 80% reasonable and effective. However, there is often around 20% of their output that may not make much sense.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-109--2552-watch"&gt;Slide 109 — 25:52 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1550s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1550s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_113.png" width="100%" alt="Slide 109"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;When I build a website or engage in tasks where I lack extensive experience, I often encounter a "gel man amnesia" effect. The models provide suggestions that seem reasonable at first, but as I explore further, I realize that certain patterns significantly hinder my development and complicate my work.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="slide-110--2610-watch"&gt;Slide 110 — 26:10 (&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;amp;t=1564s"&gt;watch&lt;/a&gt;)&lt;/h2&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td width="58%" valign="top"&gt;&lt;a href="https://www.youtube.com/watch?v=lxDRDORvFdE&amp;t=1564s"&gt;&lt;img src="https://blog.randomdomain.co.za/youtube/lxDRDORvFdE/slide_114.png" width="100%" alt="Slide 110"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="42%" valign="top"&gt;I make a concerted effort to establish all the core patterns myself and understand their underlying reasons, even when a model is generating the content. Thank you.&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;hr&gt;</description></item></channel></rss>