Files

1069 lines
47 KiB
HTML
Raw Permalink Normal View History

2026-03-31 18:48:40 +02:00
<!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>