Remove language comparison, stats, and code taste slides from intro
Torey Heinz
committed Feb 17, 2026
commit a8f53887b07518ee9e61a230176a638ea1752340
Showing 1
changed file with
0 additions
and 124 deletions
slides/01-intro.html
+0
-124
| @@ | @@ -255,130 +255,6 @@ Response sent |
| </aside> | |
| </section> | |
| - | <!-- SLIDE 11: Language Comparison --> |
| - | <section> |
| - | <h2>How Languages Handle This</h2> |
| - | |
| - | <div class="compare-grid"> |
| - | <div class="compare-item fragment"> |
| - | <h4>Node.js — Event Loop</h4> |
| - | <p>Great for I/O, but one long computation blocks everything. No true parallelism for CPU work.</p> |
| - | </div> |
| - | <div class="compare-item fragment"> |
| - | <h4>Ruby / Python — GIL</h4> |
| - | <p>Global Interpreter Lock limits concurrency. Threads are expensive (~1MB). Compensate with multiple processes.</p> |
| - | </div> |
| - | <div class="compare-item fragment"> |
| - | <h4>Java / Go — Better Primitives</h4> |
| - | <p>Goroutines & virtual threads are lightweight. But no built-in fault tolerance or supervision.</p> |
| - | </div> |
| - | <div class="compare-item elixir fragment"> |
| - | <h4>Elixir / BEAM — Purpose-Built</h4> |
| - | <p>~2KB processes (millions possible). Preemptive scheduling. Built-in fault tolerance. All I/O non-blocking by default — no async/await needed.</p> |
| - | </div> |
| - | </div> |
| - | |
| - | <aside class="notes"> |
| - | Node uses a single-threaded event loop — great for I/O but one heavy computation blocks everything. Ruby and Python have the GIL limiting true concurrency. Java and Go have better concurrency primitives, but no built-in supervision. Elixir was purpose-built for exactly this problem. Lightweight processes, preemptive scheduling, fault tolerance baked in, and all I/O is non-blocking by default. You don't need async/await — everything just works concurrently. |
| - | </aside> |
| - | </section> |
| - | |
| - | <!-- SLIDE 12: Real Impact at Vianet --> |
| - | <section> |
| - | <h2>Real Impact at Vianet</h2> |
| - | <p class="small muted"> |
| - | Migrated from <strong>Ruby on Rails on AWS</strong> → <strong>Elixir on Render</strong> |
| - | </p> |
| - | |
| - | <div class="stats-row"> |
| - | <div class="stats-item fragment"> |
| - | <div class="stat">3x</div> |
| - | <div class="stat-label">Faster response times</div> |
| - | </div> |
| - | <div class="stats-item fragment"> |
| - | <div class="stat">⅓</div> |
| - | <div class="stat-label">The infrastructure</div> |
| - | </div> |
| - | <div class="stats-item fragment"> |
| - | <div class="stat">$10k</div> |
| - | <div class="stat-label">/month infrastructure savings</div> |
| - | </div> |
| - | </div> |
| - | |
| - | <p class="fragment small" style="color: #555; max-width: 700px; margin: 0.5em auto;"> |
| - | This isn't because Rails is bad — I built my career on Rails and I still respect it deeply. |
| - | It's because <strong>Elixir's concurrency model is a natural fit for what web apps actually do.</strong> |
| - | </p> |
| - | |
| - | <aside class="notes"> |
| - | Real numbers from Vianet. We migrated from Rails on AWS to Elixir on Render. Faster response times because the BEAM handles concurrent requests naturally. Fewer resources because one Elixir instance does the work of several Rails workers. And ten thousand dollars a month in infrastructure savings. That's not a typo. This isn't Rails bashing — I love Rails. It's that Elixir is built for exactly what web apps do: handle lots of concurrent I/O. |
| - | </aside> |
| - | </section> |
| - | |
| - | <!-- SLIDE 13: A Quick Taste — Code --> |
| - | <section> |
| - | <h2>A Quick Taste</h2> |
| - | <p class="small muted">If you've written Ruby or JavaScript, this should feel familiar.</p> |
| - | |
| - | <pre><code class="language-elixir" data-trim data-line-numbers="1-4|6-7"> |
| - | # Variables, strings, basic data types |
| - | name = "GR Web Dev" |
| - | year = 2026 |
| - | attendees = ["Alice", "Bob", "Charlie"] |
| - | |
| - | IO.puts("Welcome to #{name}, #{year}!") |
| - | IO.puts("We have #{length(attendees)} people here tonight") |
| - | </code></pre> |
| - | |
| - | <pre class="fragment"><code class="language-elixir" data-trim data-line-numbers="1|3-7"> |
| - | languages = ["JavaScript", "Ruby", "Python", "Elixir", "Go"] |
| - | |
| - | # The pipe operator |> chains functions (like Unix pipes) |
| - | languages |
| - | |> Enum.filter(fn lang -> String.length(lang) > 4 end) |
| - | |> Enum.sort() |
| - | |> Enum.join(", ") |
| - | </code></pre> |
| - | |
| - | <aside class="notes"> |
| - | Before we jump into LiveBook, here's what Elixir looks like. First block: variables, strings, string interpolation — feels just like Ruby. Second block: the pipe operator. This is one of my favorite things about Elixir. Data flows left to right, top to bottom, just like you'd read English. It's like Unix pipes for your code. |
| - | </aside> |
| - | </section> |
| - | |
| - | <!-- SLIDE 13b: More Code --> |
| - | <section> |
| - | <h2>A Quick Taste</h2> |
| - | |
| - | <pre><code class="language-elixir" data-trim data-line-numbers> |
| - | # Maps (like JavaScript objects or Ruby hashes) |
| - | talk = %{ |
| - | title: "Elixir in the Real World", |
| - | speaker: "Torey Heinz", |
| - | meetup: "GR Web Dev", |
| - | duration_minutes: 50 |
| - | } |
| - | </code></pre> |
| - | |
| - | <pre class="fragment"><code class="language-elixir" data-trim data-line-numbers> |
| - | # Pattern matching + guard clauses |
| - | defmodule Math do |
| - | def factorial(0), do: 1 |
| - | def factorial(n) when n > 0, do: n * factorial(n - 1) |
| - | end |
| - | |
| - | Math.factorial(10) # => 3628800 |
| - | </code></pre> |
| - | |
| - | <p class="fragment small" style="color: #555;"> |
| - | That's already using <strong>pattern matching</strong> and <strong>guard clauses</strong> — |
| - | two features we'll explore in depth next. |
| - | </p> |
| - | |
| - | <aside class="notes"> |
| - | Maps are like JavaScript objects or Ruby hashes. And this factorial function — notice we define it twice with different arguments. The BEAM tries them in order. factorial(0) returns 1, and factorial(n) does the recursion. That's pattern matching, and it's one of Elixir's superpowers. We'll dig deep into this in the LiveBook section. |
| - | </aside> |
| - | </section> |
| - | |
| <!-- SLIDE 14: Let's Dive In --> | |
| <section class="section-divider" data-transition="zoom"> | |
| <h2>Let's Dive In</h2> | |