Files
automatic-coding-intro/index.html
T
2026-03-31 18:48:40 +02:00

1069 lines
47 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Automatic Coding — From autocomplete to AI agents</title>
<style>
/* ── Theme overrides ── */
:root {
--r-background-color: #0d0d0d;
--r-main-color: #e8e8e8;
--r-heading-color: #fff;
--r-link-color: #42b883;
--r-link-color-hover: #6fd5a8;
--r-selection-background-color: #42b883;
--r-selection-color: #0d0d0d;
}
/* ── Fragment highlight ── */
.reveal .slides section .fragment.highlight-green.visible {
color: #42b883;
}
/* ── Phase badge ── */
.phase-badge {
display: inline-block;
background: #42b883;
color: #0d0d0d;
padding: 4px 14px;
border-radius: 20px;
font-size: 0.55em;
font-weight: bold;
vertical-align: middle;
margin-right: 10px;
letter-spacing: 0.05em;
}
.phase-badge.warning {
background: #f0a500;
}
/* ── Cards ── */
.problem-card {
border-left: 4px solid #e74c3c;
padding: 8px 16px;
margin: 10px 0;
background: rgba(231, 76, 60, 0.08);
border-radius: 0 8px 8px 0;
text-align: left;
}
.tip-card {
border-left: 4px solid #42b883;
padding: 8px 16px;
margin: 10px 0;
background: rgba(66, 184, 131, 0.08);
border-radius: 0 8px 8px 0;
text-align: left;
}
/* ── Meme caption ── */
.meme-caption {
font-size: 0.5em;
opacity: 0.7;
margin-top: 8px;
font-style: italic;
}
/* ── Fit-text headings ── */
.reveal h1.r-fit-text,
.reveal .r-fit-text {
line-height: 1.05;
font-weight: 900;
letter-spacing: -0.02em;
}
/* ── Section divider subtle grid texture ── */
.reveal section.section-opener::before {
content: '';
position: absolute;
inset: 0;
background-image:
linear-gradient(rgba(255,255,255,0.03) 1px, transparent 1px),
linear-gradient(90deg, rgba(255,255,255,0.03) 1px, transparent 1px);
background-size: 40px 40px;
pointer-events: none;
z-index: 0;
}
.reveal section.section-opener > * {
position: relative;
z-index: 1;
}
/* ── Context window diagram ── */
.ctx-bar {
display: flex;
width: 90%;
margin: 24px auto;
border-radius: 8px;
overflow: hidden;
height: 54px;
font-size: 0.45em;
font-weight: bold;
letter-spacing: 0.04em;
}
.ctx-seg {
display: flex;
align-items: center;
justify-content: center;
padding: 0 8px;
text-align: center;
}
.ctx-system { background: #2d6a4f; flex: 2; color: #b7e4c7; }
.ctx-history { background: #1d3557; flex: 4; color: #a8dadc; }
.ctx-user { background: #6d4c41; flex: 2; color: #ffccbc; }
.ctx-resp { background: #4a148c; flex: 3; color: #e1bee7; }
/* ── Drake-panel layout ── */
.drake-panels {
display: flex;
gap: 16px;
justify-content: center;
align-items: stretch;
margin: 0 auto;
max-width: 820px;
}
.drake-panel {
flex: 1;
border-radius: 12px;
padding: 28px 20px;
display: flex;
flex-direction: column;
align-items: center;
gap: 14px;
border: 2px solid rgba(255,255,255,0.1);
}
.drake-panel .big-emoji {
font-size: 3.2em;
line-height: 1;
}
.drake-panel .panel-label {
font-size: 0.65em;
line-height: 1.4;
opacity: 0.9;
}
.drake-panel.bad { background: rgba(231,76,60,0.12); border-color: rgba(231,76,60,0.4); }
.drake-panel.good { background: rgba(66,184,131,0.12); border-color: rgba(66,184,131,0.4); }
/* ── Review steps ── */
.review-step {
font-size: 1.1em;
margin: 16px 0;
padding: 12px 24px;
border-radius: 8px;
background: rgba(255,255,255,0.04);
}
/* ── Closing slides ── */
.big-word {
font-size: 2.8em;
font-weight: 900;
letter-spacing: -0.02em;
color: #42b883;
}
/* ── Misc helpers ── */
.emoji-row {
display: flex;
justify-content: center;
gap: 32px;
margin: 20px 0;
}
.emoji-big {
font-size: 4em;
line-height: 1;
}
.quote-block {
border: 2px solid rgba(66,184,131,0.5);
border-radius: 12px;
padding: 20px 32px;
background: rgba(66,184,131,0.06);
font-size: 1.15em;
font-style: italic;
margin: 20px auto;
max-width: 700px;
}
.small-note {
font-size: 0.48em;
opacity: 0.55;
margin-top: 6px;
}
ul.clean {
list-style: none;
padding: 0;
}
ul.clean li {
margin: 12px 0;
font-size: 0.82em;
}
</style>
</head>
<body>
<div class="reveal">
<div class="slides">
<!-- ═══════════════════════════════════════════════
SECTION 1: TITLE
═══════════════════════════════════════════════ -->
<section
data-transition="zoom"
data-background-gradient="linear-gradient(135deg, #0d0d0d 0%, #1a1a2e 50%, #16213e 100%)"
>
<h1 class="r-fit-text">AUTOMATIC CODING</h1>
<p style="font-size:0.75em; color:#a0a0c0; margin-top:16px;">
From autocomplete to AI agents — where are we actually?
</p>
<!-- ADD SPEAKER NAME HERE -->
<p class="small-note"><!-- Speaker name --></p>
<aside class="notes">
Welcome everyone. Today we're going to cut through the hype and look at AI-assisted coding from a practical, engineering perspective.
</aside>
</section>
<!-- ═══════════════════════════════════════════════
SECTION 2: LLM BASICS (vertical group)
═══════════════════════════════════════════════ -->
<section>
<!-- 2a — Section opener -->
<section
class="section-opener"
data-background-gradient="linear-gradient(135deg, #0d1117 0%, #161b22 100%)"
>
<h1 class="r-fit-text">FIRST:<br>WHAT IS AN LLM?</h1>
<aside class="notes">
Before we talk about coding with AI, let's ground ourselves in what these things actually are.
</aside>
</section>
<!-- 2b — MicroGPT interactive explainer -->
<section
data-background-iframe="https://growingswe.com/blog/microgpt"
data-background-interactive
style="height: 100%;"
>
<div style="
position: absolute;
bottom: 0;
left: 0;
right: 0;
background: rgba(0,0,0,0.72);
backdrop-filter: blur(6px);
padding: 5px 16px;
font-size: 0.38em;
color: #aaa;
text-align: center;
pointer-events: none;
">
🔗 growingswe.com/blog/microgpt — interactive walkthrough of Karpathy's 200-line GPT
</div>
<aside class="notes">
This is an interactive breakdown of Andrej Karpathy's minimal GPT — 200 lines, trained on 32,000 human names. Walk the audience through tokenization, softmax, backpropagation, and attention. You can live-demo it right here in the slide.
</aside>
</section>
<!-- 2d — Neural network -->
<section data-auto-animate>
<h3>Neural Network at its core</h3>
<div class="emoji-row">
<span class="emoji-big fragment fade-up">🧠</span>
<span class="emoji-big fragment fade-up"></span>
<span class="emoji-big fragment fade-up">📊</span>
</div>
<ul class="clean">
<li class="fragment fade-up">Trained on massive text corpora</li>
<li class="fragment fade-up">Predicts the <em>next token</em> — one word piece at a time</li>
<li class="fragment fade-up">No memory between calls</li>
</ul>
<aside class="notes">
At the most fundamental level, an LLM is a giant next-token predictor. It's stateless — it doesn't remember your last conversation unless you feed it back.
</aside>
</section>
<!-- 2c — Context window -->
<section data-auto-animate data-background-color="#111827">
<h3>The Memory Problem</h3>
<p style="font-size:0.65em; opacity:0.7; margin-bottom:4px;">What fits inside a "context window"</p>
<div class="ctx-bar">
<div class="ctx-seg ctx-system">System<br>Prompt</div>
<div class="ctx-seg ctx-history">Conversation<br>History</div>
<div class="ctx-seg ctx-user">Your<br>Message</div>
<div class="ctx-seg ctx-resp">Response</div>
</div>
<p class="fragment" style="font-size:0.8em; margin-top:20px;">Run out of context = amnesia 🫥</p>
<p class="fragment" style="font-size:0.8em;">Every call starts fresh 🔄</p>
<aside class="notes">
The context window is everything the model can "see" at once. Past that — it's gone. This is why long conversations degrade and why agents need scaffolding to manage memory.
</aside>
</section>
<!-- 2d — What LLMs don't have -->
<section>
<h3>What LLMs don't have</h3>
<ul class="clean">
<li class="fragment fade-up" style="color:#e74c3c;">❌ Understanding of consequences</li>
<li class="fragment fade-up" style="color:#e74c3c;">❌ Real-time knowledge</li>
<li class="fragment fade-up" style="color:#e74c3c;">❌ A "world model"</li>
<li class="fragment fade-up" style="color:#e74c3c;">❌ Persistent memory (without scaffolding)</li>
<li class="fragment fade-up" style="margin-top:20px; color:#42b883; font-weight:bold;">
✅ Incredible pattern matching &amp; synthesis
</li>
</ul>
<aside class="notes">
These limitations aren't bugs — they're just what the technology is. A hammer is great for nails. Know your tool.
</aside>
</section>
</section><!-- /section 2 -->
<!-- ═══════════════════════════════════════════════
SECTION 3: VIBE CODING (vertical group)
═══════════════════════════════════════════════ -->
<section>
<!-- 3a — Section opener -->
<section
class="section-opener"
data-background-color="#1a0a0a"
>
<h1 class="r-fit-text">VIBE<br>CODING</h1>
<p class="fragment" style="font-size:0.9em; color:#e87c7c; margin-top:12px;">
"Just vibe with it 🎵"
</p>
<aside class="notes">
Andrej Karpathy coined "vibe coding" — where you let the AI do everything and just vibe with the result. Let's talk about what that actually means.
</aside>
</section>
<!-- 3b — What IS vibe coding -->
<section data-auto-animate>
<h3>What IS vibe coding?</h3>
<div class="quote-block">
Human is <strong>NOT</strong> in the loop
</div>
<ul class="clean">
<li class="fragment fade-up">Never read the generated code</li>
<li class="fragment fade-up">Just prompt harder 💪</li>
</ul>
<aside class="notes">
The key defining feature: you don't read the code. You describe what you want, accept what you get, and ship it. Some people have shipped entire apps this way.
</aside>
</section>
<!-- 3c — Meme: this is fine -->
<section data-background-color="#0d0d0d">
<div style="font-size:5.5em; line-height:1; margin-bottom:12px;">🔥</div>
<p style="font-size:1.8em; font-weight:bold; margin:0;">This is fine.</p>
<p style="font-size:0.85em; color:#e8e8a0; margin-top:10px;">
The app is on fire but the tests pass
</p>
<p class="meme-caption">— Every vibe coder, eventually</p>
<aside class="notes">
Tests green. CI green. Production on fire. The AI wrote tests that test the wrong thing. Classic.
</aside>
</section>
<!-- 3d — The Problems -->
<section data-auto-animate>
<h3>🚨 The Problems</h3>
<div class="problem-card fragment fade-up">
🤖 <strong>Hallucinations</strong> — The code looks right but calls an API that doesn't exist
</div>
<div class="problem-card fragment fade-up">
🧩 <strong>Maintainability</strong> — 6 months later, nobody (including the AI) understands it
</div>
<div class="problem-card fragment fade-up">
🔓 <strong>Security</strong> — SQL injection on line 42, shipped to prod
</div>
<div class="problem-card fragment fade-up">
⚖️ <strong>IP Risks</strong> — Did that code come from a GPL repo?
</div>
<div class="problem-card fragment fade-up">
🧠 <strong>Cognitive Decay</strong> — You stop understanding your own codebase
</div>
<div class="problem-card fragment fade-up">
👥 <strong>Team Load</strong> — Junior devs reviewing AI slop they can't evaluate
</div>
<aside class="notes">
Each of these is a real, documented failure mode. I'll elaborate on a couple during the demo section.
</aside>
</section>
<!-- 3e — Engineers are so dramatic -->
<section>
<h2>Engineers are so dramatic! 🎭</h2>
<div style="font-size:4em; margin:16px 0;">🙄</div>
<p class="fragment" style="font-size:0.75em; opacity:0.8;">...or are they?</p>
<p class="fragment" style="font-size:0.7em; color:#42b883; margin-top:12px;">Let's look at the data.</p>
<aside class="notes">
Sure, we can be dramatic. But these concerns have shown up in post-mortems at real companies. Let's be precise about the risks rather than hand-wavy either way.
</aside>
</section>
<!-- cockpit analogy — slide 1: image + question -->
<section
data-auto-animate
data-background-image="./assets/b737_cockpit.jpg"
data-background-size="cover"
data-background-position="center"
>
<div style="
position: absolute;
bottom: 0; left: 0; right: 0;
background: linear-gradient(to top, rgba(0,0,0,0.92) 60%, transparent);
padding: 40px 60px 32px;
text-align: left;
">
<h2 data-id="cockpit-question" style="font-size:1.4em; margin:0; line-height:1.2;">
Would you fly on a<br>fully automatic plane? ✈️
</h2>
</div>
<aside class="notes">
Let this land for a second. Modern commercial planes can fly, navigate, and land almost entirely on autopilot. Yet every flight still has two trained pilots in that cockpit. Why?
</aside>
</section>
<!-- cockpit analogy — slide 2: the analogy revealed -->
<section
data-auto-animate
data-background-image="./assets/b737_cockpit.jpg"
data-background-size="cover"
data-background-position="center"
data-background-opacity="0.25"
>
<h2 data-id="cockpit-question" style="font-size:1em; opacity:0.7; margin-bottom: 24px;">
Would you fly on a fully automatic plane? ✈️
</h2>
<div class="tip-card fragment fade-up">
🤖 <strong>Autopilot can do almost everything</strong> — yet every flight still has two pilots
</div>
<div class="tip-card fragment fade-up">
🧠 <strong>Skills &amp; judgment matter</strong> — when things go wrong, humans take over
</div>
<div class="tip-card fragment fade-up">
📋 <strong>Checklists &amp; procedures</strong> — not because pilots are dumb, but because stakes are high
</div>
<div class="problem-card fragment fade-up">
⌨️ <strong>Same goes for coding with AI</strong> — automation is a tool, not a replacement for understanding
</div>
<aside class="notes">
The analogy is tight: autopilot = AI coding agent. The plane can fly itself — but you need a trained human who understands the system, can read the instruments, and knows when and how to intervene. "Vibe flying" is not a thing. Why should vibe coding be?
</aside>
</section>
</section><!-- /section 3 -->
<!-- ═══════════════════════════════════════════════
SECTION 4: AUTOMATIC CODING PHASES (vertical)
═══════════════════════════════════════════════ -->
<section>
<!-- 4a — Section opener -->
<section
class="section-opener"
data-background-gradient="linear-gradient(135deg, #0f3460, #16213e)"
>
<h1 class="r-fit-text">THE 5 PHASES</h1>
<p style="font-size:0.75em; color:#a0c4ff; margin-top:12px;">
of human-AI collaboration in coding
</p>
<aside class="notes">
Let's map out the spectrum from "AI suggests a word" to "AI ships the whole product." Each phase has a different human-in-the-loop model and different risk profile.
</aside>
</section>
<!-- 4b — Phase 1 -->
<section data-auto-animate>
<p><span class="phase-badge">PHASE 1</span></p>
<h3>Automatic Code Completion</h3>
<p style="font-size:0.72em; color:#a0a0c0; margin:16px 0 24px;">
Copilot, Tabnine, Supermaven — inline suggestions as you type
</p>
<div class="tip-card fragment">
⚡ Fast &amp; low-risk — you review every token before it lands
</div>
<div class="problem-card fragment">
⚠️ Can introduce subtle bugs — sustained attention required
</div>
<aside class="notes">
This is where most developers started. The human is still typing, still in control — the AI just autocompletes. Lowest friction, lowest risk.
</aside>
</section>
<!-- 4c — Phase 2 -->
<section data-auto-animate>
<p><span class="phase-badge">PHASE 2</span></p>
<h3>Chat → Copy → Paste</h3>
<p style="font-size:0.72em; color:#a0a0c0; margin:16px 0 24px;">
ChatGPT, Claude.ai — generate in a chat, copy, paste into your editor
</p>
<div class="tip-card fragment">
✅ You're still in full control of what gets committed
</div>
<div class="problem-card fragment">
⚠️ Context switching cost — the chat has no awareness of your project
</div>
<aside class="notes">
Many developers still live here. It's deliberate — you're choosing what to paste. But the lack of project context means the AI's suggestions can be subtly wrong.
</aside>
</section>
<!-- 4d — Phase 3 -->
<section data-auto-animate>
<p><span class="phase-badge">PHASE 3</span></p>
<h3>IDE-Integrated Agent</h3>
<p style="font-size:0.72em; color:#a0a0c0; margin:16px 0 24px;">
Cursor, Copilot Chat, Claude Code — agent reads your files, writes code inline
</p>
<div class="tip-card fragment">
✅ Project-aware — can refactor across files, understands your codebase
</div>
<div class="problem-card fragment">
⚠️ Trust boundary blurs — review discipline becomes <em>critical</em>
</div>
<aside class="notes">
This is where things get interesting. The agent can now see your whole project. That's powerful — and that's exactly why you need tighter review habits here.
</aside>
</section>
<!-- 4e — Phase 4 -->
<section data-auto-animate>
<p><span class="phase-badge">PHASE 4</span></p>
<h3>Multi-Agent Orchestration</h3>
<p style="font-size:0.72em; color:#a0a0c0; margin:16px 0 24px;">
Parallel agents, tool use, sub-agents — full autonomy pipelines
</p>
<div class="tip-card fragment">
✅ Handles entire workflows end-to-end, parallelizes complex tasks
</div>
<div class="problem-card fragment">
⚠️ Hard to audit — failure modes are non-obvious and can cascade
</div>
<aside class="notes">
This is cutting-edge territory. You might have one agent writing code, another reviewing it, another running tests. The coordination overhead is real and the audit trail can get murky.
</aside>
</section>
<!-- 4f — Phase 5 -->
<section data-auto-animate data-background-color="#1a1a0a">
<p><span class="phase-badge warning">PHASE 5</span></p>
<h3>Spec-Driven Development</h3>
<div style="font-size:2.2em; font-weight:900; margin:20px 0; color:#f0c040;">
Still a myth 🦄
</div>
<p class="fragment" style="font-size:0.68em; color:#c0c080; font-style:italic;">
"Write a spec → AI ships production code → Deploy → ??? → Profit"
</p>
<div class="problem-card fragment">
Reality check: We're not there yet. Maybe never for complex systems.
</div>
<aside class="notes">
Everyone's pitching this. Nobody's shipping it reliably at scale. For simple CRUD apps? Maybe. For systems with complex domain rules, security requirements, and performance constraints? We need humans in the loop.
</aside>
</section>
<!-- Phase 5 — real world case study -->
<section data-auto-animate data-background-color="#0d0f1a">
<p><span class="phase-badge warning">PHASE 5 — IN THE WILD</span></p>
<h3 style="font-size:1em;">Case Study: A C Compiler, Built from Specs</h3>
<div class="tip-card fragment fade-up" style="font-size:0.7em; margin: 16px 0;">
🦀 <strong>106,000 lines of Rust</strong> — 351 files — compiles the Linux kernel
</div>
<div class="tip-card fragment fade-up" style="font-size:0.7em; margin: 16px 0;">
🤖 Generated with <strong>Claude Opus</strong> via iterative spec-driven prompting
</div>
<div class="tip-card fragment fade-up" style="font-size:0.7em; margin: 16px 0;">
🧩 Key insight: <strong>32 phases × ~11 files</strong> — modular decomposition was everything
</div>
<div class="problem-card fragment fade-up" style="font-size:0.7em; margin: 16px 0;">
💸 Cost: <strong>$20,000+</strong> in API calls — and the type checker doesn't work
</div>
<p class="fragment meme-caption" style="margin-top:20px;">
🔗 <a href="https://shape-of-code.com/2026/02/22/investigating-an-llm-generated-c-compiler/" style="color:#42b883;">shape-of-code.com — Investigating an LLM-generated C compiler</a>
</p>
<aside class="notes">
Real experiment, February 2026. Someone used Claude Opus to write a C compiler capable of compiling the Linux kernel — 106K lines of Rust. Cost: over $20,000 in API calls. The trick was breaking it into 32 phases of ~11 files each and regenerating each phase ~13 times. It compiles real programs in 17 seconds. But: no type checking. This is Phase 5 in the wild — impressive, expensive, and not production-grade.
</aside>
</section>
</section><!-- /section 4 -->
<!-- ═══════════════════════════════════════════════
SECTION 5: DEMO CLAUDE CODE
═══════════════════════════════════════════════ -->
<section data-background-gradient="linear-gradient(135deg, #0a1628, #0d2137)">
<h2>🎬 Demo: Claude Code</h2>
<ul class="clean" style="margin-top: 24px;">
<li class="fragment fade-up">
<div class="tip-card">
🔧 <strong>Skills</strong> — OpticOdds fixtures integration
</div>
</li>
<li class="fragment fade-up">
<div class="tip-card">
🪝 <strong>Hooks</strong> — Preventing credentials from leaking into context
</div>
</li>
</ul>
<aside class="notes">
Live demo time. I'll show how Claude Code handles a real task — fetching fixture data — and how hooks intercept sensitive values before they hit the model's context window.
</aside>
</section>
<!-- ═══════════════════════════════════════════════
SECTION 6: AI SLOP (vertical group)
═══════════════════════════════════════════════ -->
<section>
<!-- 5a — Section opener -->
<section
class="section-opener"
data-background-color="#1a0000"
>
<h1 class="r-fit-text">AI SLOP</h1>
<p class="fragment" style="font-size:0.85em; color:#ff8080; margin-top:12px;">
When volume beats quality
</p>
<aside class="notes">
"Slop" is a term gaining traction — low-quality, high-volume AI output that gets merged because nobody has time to really review it.
</aside>
</section>
<!-- 5b — What is AI Slop -->
<section data-auto-animate>
<h3>🗑️ What is AI Slop?</h3>
<div class="problem-card fragment fade-up">
📈 Code <em>creation</em> FAR outpaces code <em>review</em>
</div>
<div class="problem-card fragment fade-up">
📉 Consistency erodes — style, patterns, naming — all drift
</div>
<div class="problem-card fragment fade-up">
🧠 Team expertise declines — nobody owns anything anymore
</div>
<aside class="notes">
The asymmetry is the core problem. AI can generate 500 lines in 30 seconds. A thorough review of 500 lines takes 30 minutes. Something has to give — and usually it's the review.
</aside>
</section>
<!-- 5c — Drake-style panels -->
<section data-background-color="#0d0d0d">
<h3 style="margin-bottom: 24px;">Spot the difference</h3>
<div class="drake-panels">
<div class="drake-panel bad fragment fade-left">
<div class="big-emoji">👎</div>
<div class="panel-label">
<strong style="color:#e74c3c;">Vibe coding this into prod</strong><br>
<span style="opacity:0.7; font-size:0.88em;">No review. No context. No accountability.</span>
</div>
</div>
<div class="drake-panel good fragment fade-right">
<div class="big-emoji">👍</div>
<div class="panel-label">
<strong style="color:#42b883;">Vibe coding this into a pet project</strong><br>
<span style="opacity:0.7; font-size:0.88em;">Learn fast. Break things. Nobody gets paged at 3am.</span>
</div>
</div>
</div>
<aside class="notes">
Context matters completely. Vibe coding is a fantastic way to explore and learn. Vibe coding straight to production is a different thing entirely.
</aside>
</section>
<!-- 5d — Ready to ship without review? -->
<section>
<h3>Ready to ship without review? 🤔</h3>
<div style="font-size:3.5em; font-weight:900; color:#e74c3c; margin:20px 0;">NO.</div>
<ul class="clean">
<li class="fragment fade-up" style="font-size:0.78em;">Even senior engineers miss things under time pressure</li>
<li class="fragment fade-up" style="font-size:0.78em;">AI confidently writes <em>wrong</em> code — the confidence is the bug</li>
<li class="fragment fade-up" style="font-size:0.78em; color:#42b883; font-weight:bold;">The diff is your last line of defense 🛡️</li>
</ul>
<aside class="notes">
The model doesn't know it's wrong. It sounds sure. That confident tone is exactly what makes it dangerous in review.
</aside>
</section>
</section><!-- /section 6 -->
<!-- ═══════════════════════════════════════════════
SECTION 7: WISE STRATEGY (vertical group)
═══════════════════════════════════════════════ -->
<section>
<!-- 6a — Section opener -->
<section
class="section-opener"
data-background-gradient="linear-gradient(135deg, #0d2137, #0a4a3a)"
>
<h1 class="r-fit-text">A WISE<br>STRATEGY</h1>
<aside class="notes">
So what does a responsible, productive approach look like? Let's look at what the best open-source maintainers are already doing.
</aside>
</section>
<!-- 6b — Open Source Maintainers -->
<section data-auto-animate>
<h3>Learn from Open Source Maintainers</h3>
<div class="tip-card fragment fade-up">
🔍 <strong>Add friction to PR review</strong> — slow down intake, not speed up merges
</div>
<div class="tip-card fragment fade-up">
🔗 <strong>Always link to the AI conversation</strong> in the PR description
</div>
<div class="tip-card fragment fade-up">
📋 <strong>No more breadcrumbs</strong> — full context required, or no merge
</div>
<aside class="notes">
Projects like Ruby on Rails, Homebrew, and others are already setting policy: if you used AI to write the code, you must link the conversation. This preserves the decision trail.
</aside>
</section>
<!-- 6c — The Review Contract -->
<section>
<h3>The Review Contract</h3>
<div class="review-step fragment fade-up">
You wrote it with AI?
</div>
<div class="review-step fragment fade-up" style="color:#f0c040;">
Then <strong>YOU</strong> are responsible for it.
</div>
<div class="review-step fragment fade-up" style="color:#e74c3c; font-weight:bold;">
Not the AI. <strong>YOU.</strong>
</div>
<div class="fragment" style="font-size:4em; margin-top:16px;">🫵</div>
<aside class="notes">
This is non-negotiable. The AI is a tool. The engineer who commits the code owns the code. Full stop.
</aside>
</section>
</section><!-- /section 7 -->
<!-- ═══════════════════════════════════════════════
SECTION 8: MY ADVICE (vertical group)
═══════════════════════════════════════════════ -->
<section>
<!-- 7a — Section opener -->
<section
class="section-opener"
data-background-gradient="linear-gradient(135deg, #1a0d2e, #2d1b4e)"
>
<h1 class="r-fit-text">MY ADVICE</h1>
<p style="font-size:0.75em; color:#b0a0d0; margin-top:12px;">
(completely unrequested)
</p>
<aside class="notes">
Nobody asked but here we are. A few things I genuinely believe will help you and your team.
</aside>
</section>
<!-- 7b — Stop Sloppypasta -->
<section>
<h3>New tools, new manners</h3>
<div style="font-size:2.4em; margin:20px 0;">🍝 Stop Sloppypasta</div>
<div class="tip-card">
<a href="https://stopsloppypasta.ai/en/" target="_blank" style="color:#42b883;">stopsloppypasta.ai</a>
— think before you paste AI-generated code
</div>
<p style="font-size:0.6em; opacity:0.6; margin-top:20px;">
New capabilities → new professional norms. The industry hasn't caught up yet. You can lead.
</p>
<aside class="notes">
Stop Sloppypasta is a movement around thoughtful AI usage in code. The name is funny but the point is serious: don't just accept and paste without thought.
</aside>
</section>
<!-- 7c — AI & skill formation paper -->
<section
data-background-image="./assets/arxiv-skill-formation.png"
data-background-size="contain"
data-background-position="top"
style="height: 100%;"
>
<div style="
position: absolute;
bottom: 0;
left: 0;
right: 0;
background: rgba(0,0,0,0.72);
backdrop-filter: blur(6px);
padding: 5px 16px;
font-size: 0.38em;
color: #aaa;
text-align: center;
pointer-events: none;
">
📄 Shen &amp; Tamkin — "How AI Impacts Skill Formation" · arxiv.org/abs/2601.20245 · AI use impairs conceptual understanding without delivering efficiency gains
</div>
<aside class="notes">
Randomized experiment: developers learning a new programming library. AI use impaired conceptual understanding, code reading, and debugging — without significant efficiency gains. The HOW matters: 3 out of 6 interaction patterns preserved learning. Efficiency ≠ competence.
</aside>
</section>
<!-- 7d — Keep coding -->
<section>
<h3>Your coding skills still matter</h3>
<div class="tip-card fragment fade-up">
🏋️ <strong>Exercise them</strong> — build pet projects just for the joy of it
</div>
</section>
<!-- 7e — tsoding channel -->
<section
data-background-image="./assets/tsoding-yt.png"
data-background-size="contain"
data-background-position="top"
style="height: 100%;"
>
<div style="
position: absolute;
bottom: 0; left: 0; right: 0;
background: rgba(0,0,0,0.72);
backdrop-filter: blur(6px);
padding: 5px 16px;
font-size: 0.38em;
color: #aaa;
text-align: center;
pointer-events: none;
">
📺 youtube.com/@TsodingDaily — raw, educational, zero-AI coding streams (C, Rust, Go, and more)
</div>
<aside class="notes">
Tsoding (Alexey Kutepov) live-codes real projects from scratch — compilers, game engines, tools — with no AI assistance. Pure fundamentals, highly entertaining, deeply instructive.
</aside>
</section>
<!-- 7f — The Coding Train channel -->
<section
data-background-image="./assets/codingtrain-yt.png"
data-background-size="contain"
data-background-position="top"
style="height: 100%;"
>
<div style="
position: absolute;
bottom: 0; left: 0; right: 0;
background: rgba(0,0,0,0.72);
backdrop-filter: blur(6px);
padding: 5px 16px;
font-size: 0.38em;
color: #aaa;
text-align: center;
pointer-events: none;
">
📺 youtube.com/@TheCodingTrain — creative coding with p5.js, Daniel Shiffman (1.76M subscribers)
</div>
<aside class="notes">
Daniel Shiffman teaches creative coding — algorithms, simulations, generative art — with infectious enthusiasm. Great for rediscovering the joy of programming from first principles.
</aside>
</section>
<!-- 7g — Keep coding (continued) -->
<section>
<div class="tip-card fragment fade-up">
🤖 <strong>Use AI for exploration</strong> — not as a substitute for understanding
</div>
<p class="fragment small-note" style="margin-top:16px;">
Prediction: in the coming years, many will try to do engineering without engineering knowledge. That gap will be visible. Your fundamentals are your moat.
</p>
<aside class="notes">
The ability to read, write, and reason about code is more valuable now than many think — precisely because it's becoming rarer. It's a superpower when combined with AI tools.
</aside>
</section>
<!-- ═══════════════════════════════════════════════
SECTION: NEXT LEARNING STEPS (vertical group)
═══════════════════════════════════════════════ -->
</section><!-- /advice vertical group -->
</section><!-- /outer section -->
<section>
<!-- NLS-a — Section opener -->
<section
class="section-opener"
data-background-gradient="linear-gradient(135deg, #0a1f3c 0%, #0d3b2e 100%)"
>
<h1 class="r-fit-text">WHAT'S NEXT?</h1>
<p class="fragment" style="font-size:0.75em; color:#42b883; margin-top:12px;">
Going deeper: AI features, local inference &amp; model training
</p>
<aside class="notes">
Now that we've covered the coding-agent layer, let's look one level deeper — how do you actually integrate AI into your own apps, run it locally, and eventually train your own models?
</aside>
</section>
<!-- NLS-b — Adding AI to your app -->
<section data-auto-animate>
<p><span class="phase-badge">LEVEL 1</span></p>
<h3>Adding AI features to your app</h3>
<div class="tip-card fragment fade-up">
☁️ <strong>Hosted APIs</strong> — Anthropic, OpenAI, Gemini — drop-in inference, no infra
</div>
<div class="tip-card fragment fade-up">
🔀 <strong>HuggingFace Inference API</strong> — proxy to hundreds of open-weight models, same REST interface
</div>
<div class="tip-card fragment fade-up">
🧩 <strong>Patterns:</strong> chat completion · embeddings · structured output · tool use
</div>
<div class="problem-card fragment fade-up">
⚠️ You are now responsible for <strong>prompt injection</strong>, <strong>data leakage</strong> and <strong>cost runaway</strong>
</div>
<aside class="notes">
The entry point for most developers. Pick a hosted provider, grab an SDK, start with a chat completion. The hard part isn't calling the API — it's building the guardrails around it.
</aside>
</section>
<!-- NLS-c — Local inference -->
<section data-auto-animate>
<p><span class="phase-badge">LEVEL 2</span></p>
<h3>Local inference</h3>
<div style="display:flex; gap:16px; margin: 18px 0; font-size:0.72em;">
<div class="tip-card" style="flex:1;">
🦙 <strong>Ollama</strong><br>
<span style="opacity:0.8">Run Llama, Mistral, Gemma locally — one command</span>
</div>
<div class="tip-card" style="flex:1;">
<strong>llama.cpp</strong><br>
<span style="opacity:0.8">CPU inference, quantised GGUF models, minimal deps</span>
</div>
<div class="tip-card" style="flex:1;">
🤗 <strong>HF Transformers</strong><br>
<span style="opacity:0.8">Python, full control, GPU/MPS acceleration</span>
</div>
</div>
<div class="tip-card fragment fade-up">
🔒 <strong>Why bother?</strong> — data stays on-device, zero cost per token, works offline
</div>
<div class="problem-card fragment fade-up">
⚠️ Hardware matters — a 70B model needs ~40 GB VRAM. Start with 7B8B quantised.
</div>
<aside class="notes">
Local inference is now surprisingly accessible. Ollama is the easiest on-ramp — one brew install, one command to pull a model. HuggingFace Transformers gives you full Python control for more advanced use cases.
</aside>
</section>
<!-- NLS-d — RAG -->
<section data-auto-animate data-background-color="#0d1a0d">
<p><span class="phase-badge">LEVEL 3</span></p>
<h3>RAG — Retrieval-Augmented Generation</h3>
<div style="font-size:0.68em; margin: 14px 0; display:flex; gap:10px; align-items:center; justify-content:center;">
<div style="background:#1a2e1a; border:1px solid #42b883; border-radius:8px; padding:10px 16px;">📄 Your docs</div>
<div style="color:#42b883; font-size:1.4em;"></div>
<div style="background:#1a2e1a; border:1px solid #42b883; border-radius:8px; padding:10px 16px;">✂️ Chunk &amp; embed</div>
<div style="color:#42b883; font-size:1.4em;"></div>
<div style="background:#1a2e1a; border:1px solid #42b883; border-radius:8px; padding:10px 16px;">🗄️ Vector store</div>
<div style="color:#42b883; font-size:1.4em;"></div>
<div style="background:#1a2e1a; border:1px solid #42b883; border-radius:8px; padding:10px 16px;">🔍 Retrieve</div>
<div style="color:#42b883; font-size:1.4em;"></div>
<div style="background:#1a2e1a; border:1px solid #42b883; border-radius:8px; padding:10px 16px;">🤖 LLM</div>
</div>
<div class="tip-card fragment fade-up">
🧠 Gives the model <strong>your private knowledge</strong> without fine-tuning
</div>
<div class="tip-card fragment fade-up">
🛠️ Stack: <strong>LangChain / LlamaIndex</strong> · <strong>ChromaDB / pgvector / Qdrant</strong>
</div>
<div class="fragment" style="font-size:0.6em; color:#42b883; margin-top:10px; font-style:italic;">
→ Currently experimenting with this 🧪
</div>
<aside class="notes">
RAG is the practical answer to "how do I give the model knowledge of my codebase / docs / database?" without the cost and complexity of fine-tuning. Chunk your data, embed it, store vectors, retrieve at query time.
</aside>
</section>
<!-- NLS-e — Training open-weight models -->
<section data-auto-animate>
<p><span class="phase-badge warning">LEVEL 4</span></p>
<h3>Training an open-weight model</h3>
<div style="display:flex; gap:14px; margin: 16px 0; font-size:0.68em;">
<div class="tip-card" style="flex:1;">
🎯 <strong>Fine-tuning</strong><br>LoRA / QLoRA — adapt a base model on your task with minimal GPU
</div>
<div class="tip-card" style="flex:1;">
📊 <strong>Datasets</strong><br>HuggingFace Datasets — thousands of ready-to-use training sets
</div>
<div class="tip-card" style="flex:1;">
🚂 <strong>Training</strong><br>HF Transformers + PEFT · Unsloth for fast LoRA
</div>
</div>
<div class="tip-card fragment fade-up">
🤗 <strong>HuggingFace</strong> — one-stop shop: models · datasets · papers · inference API · model hub
</div>
<div class="fragment" style="font-size:0.6em; color:#42b883; margin-top:10px; font-style:italic;">
→ Currently experimenting with local training + inference 🧪
</div>
<aside class="notes">
You don't need to train from scratch. LoRA lets you fine-tune a 7B model on a consumer GPU in hours. HuggingFace is the center of gravity for the open-weight ecosystem — models, datasets, papers (via ArXiv integration), and inference all in one place.
</aside>
</section>
<!-- NLS-f — HuggingFace -->
<section data-auto-animate data-background-color="#0d0d1a">
<h3 style="margin-bottom:18px;">🤗 HuggingFace as your AI platform</h3>
<div style="display:grid; grid-template-columns: 1fr 1fr; gap:12px; font-size:0.65em;">
<div class="tip-card">
🏗️ <strong>Model Hub</strong><br>500,000+ open-weight models, filterable by task, size, license
</div>
<div class="tip-card">
📦 <strong>Datasets</strong><br>Curated training data for every domain — ready to fine-tune on
</div>
<div class="tip-card">
📄 <strong>Papers</strong><br>Daily ML papers with linked code &amp; models — stay on the frontier
</div>
<div class="tip-card">
<strong>Inference Providers</strong><br>Proxy to hosted open models — same API, swap models freely
</div>
</div>
<p class="fragment" style="font-size:0.58em; color:#42b883; margin-top:16px;">
huggingface.co — the GitHub of AI models
</p>
<aside class="notes">
Think of HuggingFace as the npm registry + GitHub + ArXiv for AI. The inference provider proxy is particularly useful: one API key, access to Llama, Mistral, Falcon and more — no individual provider accounts needed.
</aside>
</section>
</section><!-- /next learning steps -->
<section><!-- re-open advice vertical group for closing slide -->
<!-- 7d — Closing -->
<section
data-background-gradient="linear-gradient(135deg, #0d0d0d, #1a1a2e)"
>
<h1 class="r-fit-text" style="color:#42b883;">EXPERIMENT.</h1>
<h1 class="r-fit-text fragment" style="color:#f0c040;">REVIEW.</h1>
<h1 class="r-fit-text fragment" style="color:#e8e8e8;">UNDERSTAND.</h1>
<p class="fragment" style="font-size:0.65em; opacity:0.7; margin-top:20px;">
In that order. 😉
</p>
<aside class="notes">
That's the message. Experiment boldly. Review rigorously. Never ship what you don't understand. Thank you.
</aside>
</section>
</section><!-- /section 8 -->
</div><!-- /.slides -->
</div><!-- /.reveal -->
<script type="module" src="/main.js"></script>
</body>
</html>