Ryan Peterman
AI-assisted summary of Creator of Scala: Comparing Languages And How AI Will Impact Them | Martin Odersky — original source. Check the original for full context.
Source published:
Key ideas
- Martin Odersky warns that human review of machine-generated code is unviable at scale, arguing that type systems must evolve into enforceable capability-based contracts that strictly bound what AI agents can read, write, or leak. (31:00)
- Odersky contends that Rust is currently overused across the software industry, advising teams to default to garbage-collected runtimes whenever hardware memory allows rather than taking on manual memory management as an intellectual exercise. (9:26)
- Future programming language design will de-emphasize human writing ergonomics in favor of formal machine constraints, with Odersky proposing that natural language prompts should become first-class, version-controlled artifacts embedded directly into programs to mitigate non-deterministic code drift. (40:12)
- Software engineering is projected to contract into a smaller, significantly higher-skilled workforce within ten years, shifting away from manual coding toward AI supervision and control engineering anchored in formal logic and mathematics. (43:40)
Detailed notes
## Background Published on YouTube by Ryan Peterman on August 31, 2026, this episode features an in-depth technical interview with Scala creator Martin Odersky. The conversation focuses on comparing modern language design trade-offs across Rust, Zig, Go, Python, and Scala, while evaluating the profound impact artificial intelligence will have on compilers, typing, and software engineering.
## TL;DR Martin Odersky outlines the pragmatic virtues of functional programming, advocating for value transformations while avoiding dogmatic pure-monadic patterns, and compares design choices across systems languages like Rust, Zig, and Go. Reflecting on Scala's history, he examines early JVM decisions, Twitter's critical early adoption, and retrospective regrets around over-abstraction. Addressing AI code generation, Odersky warns that human review of machine-written code cannot scale, arguing instead for stronger type constraints, capability safety, and treating prompts as first-class program artifacts. He concludes that future software engineers will act as high-level supervisory controllers, needing stronger foundations in logic and mathematics.
## Atmosphere & style The dialogue feels like an intimate, intellectually demanding masterclass, pairing Ryan Peterman's structured, systems-oriented inquiries with Odersky's measured academic wisdom and pragmatic industry perspective. Odersky brings an understated, self-effacing humor to polarizing language wars and past design missteps, laughing off doctrinal disputes while treating architectural safety with utter seriousness. The atmosphere transitions smoothly from grounded discussions of compiler pipelines and bytecode to an urgent, philosophically charged warning about humanity retaining control over machine-generated code.
## Bulletin - [31:00](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=1860s) Martin Odersky warns that human review of machine-generated code is unviable at scale, arguing that type systems must evolve into enforceable capability-based contracts that strictly bound what AI agents can read, write, or leak. - [09:26](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=566s) Odersky contends that Rust is currently overused across the software industry, advising teams to default to garbage-collected runtimes whenever hardware memory allows rather than taking on manual memory management as an intellectual exercise. - [40:12](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=2412s) Future programming language design will de-emphasize human writing ergonomics in favor of formal machine constraints, with Odersky proposing that natural language prompts should become first-class, version-controlled artifacts embedded directly into programs to mitigate non-deterministic code drift. - [43:40](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=2620s) Software engineering is projected to contract into a smaller, significantly higher-skilled workforce within ten years, shifting away from manual coding toward AI supervision and control engineering anchored in formal logic and mathematics.
## Key takeaways - [00:45](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=45s) Functional programming is fundamentally 'programming with values', replacing in-place mutation with pure transformations to eliminate undocumented side effects and match mathematical reasoning. - [02:58](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=178s) Pragmatic functional programming follows a 95/5 balance: developers should leverage pure values for the core 95% of a program while utilizing localized imperative escape hatches for side effects rather than imposing complex monadic dogma across everything. - [06:35](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=395s) Scala uniquely unifies functional and object-oriented paradigms by using object-oriented mechanics for module encapsulation, component boundaries, and ergonomic dot-completion while utilizing functional mechanics for core data manipulation. - [09:26](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=566s) Rust is frequently overextended into higher tiers of the application stack where garbage-collected runtimes like the JVM offer superior developer velocity and entirely acceptable pause times. - [12:42](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=762s) Zig's comptime and Scala's typer-level inlining offer superior metaprogramming safety over traditional C++ templates by guaranteeing deterministic inlining without generating cascading post-expansion type errors. - [15:45](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=945s) Mainstream languages have progressively converged toward functional paradigms, adopting core constructs like pattern matching, polymorphic type systems, and type inference that originated in languages like ML and Scala. - [25:03](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=1503s) Compiling to JVM bytecode provides key structural benefits over direct native compilation, including seamless Java library interoperability, battle-tested garbage collectors, and dynamic class loading essential for REPL environments. - [29:19](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=1759s) Twitter's early migration to Scala was sparked by Ruby on Rails scalability bottlenecks, enabling engineers to appease investor mandates for Java stability while retaining modern, functional programming paradigms. - [31:00](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=1860s) The sheer volume of AI-generated code will render human pull-request reviews impossible, creating an existential software crisis unless languages enforce rigid compile-time constraints and safety boundaries. - [32:26](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=1946s) Capability-based type systems provide a mechanism to assign granular, verifiable permissions to autonomous AI agents, mathematically guaranteeing that sensitive resources like file handles or secrets cannot escape their designated scope. - [38:58](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=2338s) While memory safety is a required foundation pioneered in systems programming by Rust, true security requires capability safety that prevents software from either forging new permissions or secretly retaining expired ones. - [40:12](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=2412s) As machines become the primary authors of software, programming languages should elevate prompts into first-class program values to enable precise, version-controlled incremental edits without rewriting entire implementations. - [43:40](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=2620s) The future software engineering workforce will shrink in headcount but rise in qualification requirements, evolving into supervisory control engineers who rely on rigorous mathematical foundations to oversee AI code generators. - [44:34](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=2674s) To develop broad technical depth, developers should study C to understand raw hardware mechanics, Lean or Coq to master formal verification and correctness, and Scala to bridge expressive typing with real-world execution. - [48:28](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=2908s) Scala's early ecosystem suffered significant friction from over-abstraction, where unchecked imports of complex Haskell monadic frameworks resulted in unmaintainable production codebases that aliened teams and managers. - [53:55](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=3235s) Scala achieved unexpected mainstream adoption in the 2000s by serving as a bridge between the fluid ergonomics of dynamic languages and the type safety and runtime performance of the JVM.
## Detailed walkthrough ### [00:00](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=0s) Introduction and Episode Teaser
The episode opens with a series of provocative teasers setting the stakes for the conversation. Martin Odersky warns that humanity is currently at a critical junction regarding artificial intelligence: "We are at a moment where it's essentially very dangerous that we lose control as humans." Host Ryan Peterman introduces Odersky as the creator of Scala, outlining an exploration into the design trade-offs of modern languages and how AI is fundamentally reshaping software development.
The preview highlights several sharp technical opinions: Odersky contends that "Rust is actually overused," argues that Zig possesses a far saner inlining mechanism, and jokes about offending factions to the point where they "promptly declared jihad." Looking ahead to an era where boilerplate implementation is largely machine-generated, Odersky observes that the developer's focus must inevitably shift toward designing precise interfaces and strong type systems. The teaser concludes with Peterman asking whether the world will need more or fewer software engineers a decade from now.
[00:45](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=45s) The Core of Functional Programming: Values, Transformations, and Mathematics
Turning to the fundamentals, Peterman asks how to define functional programming and why an imperative programmer should bother caring about it. Odersky defines functional programming straightforwardly as "programming with values." In contrast to the imperative model, which revolves around mutating in-place state such as mutable variables or modified arrays, functional programs are structured as sets of values and pure functions that transform those values into new ones. While acknowledging that real-world functional languages are pragmatic and impure—eventually needing to execute I/O, mutate state, or write to standard out—the guiding philosophy is to delay side effects as late as possible so that the vast majority of the codebase consists solely of pure value transformations.
The primary benefit of this design discipline is dramatically improved predictability and fewer bugs. Odersky points out that mutating a global variable or altering a field inside a deep object graph produces an "undocumented effect" that is rarely captured in a function's type signature, leaving developers to rely on frail comments. These hidden mutations create immense cognitive overhead, making code exceptionally difficult to hold in one's head and reason about. Functional programming advises stripping these side effects down to the absolute bare minimum. Furthermore, Odersky notes the natural philosophical link between functional programming and mathematics. In mathematical domains such as polynomial theory, string theory, or formal lists, the notion of in-place mutation simply does not exist: one can calculate a transformation on a polynomial to produce a new polynomial, but mutating its third coefficient in-place and pretending it remains the same object violates mathematical logic.
[02:58](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=178s) The Learning Curve, Debugging, and Knowing When to Stop
When asked how to respond to developers who avoid functional programming because it feels inconvenient or awkward, Odersky identifies two distinct issues. The first is simply the initial learning curve. Because most developers learn an imperative language when they are young, their brains become hardwired to think in terms of step-by-step state changes, making it difficult to envision alternative paradigms. However, Odersky insists that pushing through that friction requires only a modest investment of time before the rewards become obvious: code becomes substantially clearer, and developers discover they no longer need to step through lines of code with an interactive debugger. In his own workflow, Odersky notes that he rarely touches a debugger when writing functional code because value transformations can be reasoned about statically.
The second issue stems from ideological dogma within the community. Odersky cautions against dogmatic "pure functional programming," where developers attempt to force absolutely every detail into pure functions and wrap all effects into heavy abstractions like monads:
> "The other thing is to essentially know when to stop... there is a strand of functional programming called pure functional programming which tries to express as much as possible in pure functions and to sort of delay the side effects to and wrap them up in monads or whatnot, and that can get very inconvenient very quickly."
Odersky advocates for pragmatism and moderation: functional programming is outstanding for roughly 95% of a program's logic, but if a developer needs an imperative escape hatch or a straightforward side effect for the remaining 5%, they should use it, provided it is well-documented.
```mermaid flowchart TD accTitle: Pragmatic Functional Architecture accDescr: Diagram illustrating Odersky's 95/5 rule balancing pure functional logic with localized side effects. subgraph PureDomain["Pure Functional Core (~95% of Codebase)"] direction TB InputVal["Input Values"] --> PureFunc["Pure Functions / Transformations"] PureFunc --> ResultVal["New Immutable Values"] end
subgraph ImpureDomain["Imperative Boundary (~5% of Codebase)"] direction TB SideEffect["Explicit Side Effects / I/O"] HardwareState["System State / stdout"] end
ResultVal -->|"Deferred Effects"| SideEffect SideEffect --> HardwareState ```
[04:46](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=286s) Measuring Correctness and Empirical Software Engineering
Peterman asks whether there is any quantitative, empirical evidence demonstrating that functional programming yields superior correctness compared to imperative paradigms. Odersky admits that while academic studies exist—often concluding that languages like Scala produce fewer bugs per thousand lines of code than C or C++—he is reluctant to lean on them too heavily because empirical software engineering research is notoriously difficult to conduct with rigorous methodology.
In small software projects, programming paradigms matter far less: whether one chooses an imperative `while` loop or a recursive function is largely a matter of aesthetic preference, and developers can hold the entire system in their heads. The divergence emerges only as systems grow large. While static types have overwhelmingly demonstrated their value in large systems, Odersky acknowledges that the broader debate remains polarized; dynamic typing proponents and static typing advocates routinely brandish conflicting studies against one another. However, Odersky highlights one decisive domain where correctness is non-negotiable: interactive theorem provers and formal verification tools like Coq and Lean are exclusively built as functional languages, demonstrating that when absolute mathematical correctness and formal proof are required, computer scientists do not even attempt to use languages like C or C++.
[06:35](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=395s) What Sets Scala Apart: The Fusion of Functional and Object-Oriented Programming
Addressing Scala's unique positioning in the programming landscape, Odersky explains that Scala is distinct because it is the only functional language that is simultaneously a fully fledged, highly capable object-oriented language. Rather than bolting the paradigms together as an awkward side-by-side compromise, Scala was conceived from day one to synthesize them into a cohesive whole.
Odersky explains why this dual nature is an essential asset rather than an impurity: - **Object-Oriented Strengths:** Excels at module systems, software components, encapsulation, and clear interfaces—areas where most functional languages have historically had weak stories outside of the complex module systems found in Standard ML or OCaml. - **Functional Strengths:** Provides mathematical rigor, immutable data modeling, and robust algorithmic transformations. - **The Power of the Dot:** Echoing Simon Peyton Jones, Odersky highlights the ergonomic superiority of method chaining (`object.method()`). In an IDE, typing a dot immediately scopes the environment, presenting the developer with the exact methods and fields valid for that object. By contrast, traditional functional programming presents a vast, unorganized "sea of functions" where the programmer must search for functions capable of accepting their data types as arguments.
[08:34](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=514s) Modern Systems Languages: Memory Safety in Rust vs. Go
When Peterman asks Odersky to evaluate systems programming languages such as Rust, Zig, Go, C, and C++, Odersky establishes an uncompromising baseline for modern systems work: in this day and age, a systems language must be guaranteed memory-safe. This requirement immediately disqualifies legacy languages like C and C++, leaving Rust and Go as the leading candidates, though they operate at fundamentally different tiers of the stack.
Go occupies the infrastructure and middleware space. Rather than being a low-level, nuts-and-bolts systems language, Go is optimized for building application servers, cloud infrastructure, and distributed microservices. It is not designed for resource-constrained environments like bare-metal embedded devices. Rust, conversely, operates directly near the hardware, providing zero-cost abstractions, deterministic resource management, and strict memory safety without the runtime overhead of a garbage collector.
[09:26](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=566s) Comparing Rust and Scala: Performance, Garbage Collection, and Overuse
Comparing Rust directly to Scala, Odersky outlines the explicit performance trade-offs inherent in their architectural designs. Rust sits much closer to the metal, offering uncompromising performance guarantees and the ability to operate within tiny, highly restricted memory footprints, making it the ideal choice for embedded systems and low-level engines. Scala, by virtue of running with a garbage collector on the JVM, requires a larger chunk of memory to execute at peak performance. While modern JVM garbage collectors are brilliantly engineered to make pauses virtually imperceptible, the memory footprint requirement remains an immutable reality.
At the same time, Odersky cautions that industry hype has driven an overextension of Rust into domains where its complexity is counterproductive: - **Closer to the Metal:** Rust provides fine-grained hardware control and zero-overhead memory footprints suitable for bare-metal systems. - **Garbage Collection Trade-offs:** JVM garbage collectors have become exceptional with minimal pause times, but they require substantial heap headroom to achieve optimal throughput. - **Industry Overreach:** Odersky argues that Rust is currently "overused," with teams pushing it high up the application stack into domains where automatic garbage collection is entirely sufficient and developer productivity would benefit from the abstractions of languages like Scala.
[10:24](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=624s) The Philosophy of Garbage Collection and the Design Trade-offs of Go
Martin Odersky questions the intellectual urge among developers to write code without garbage collection when it isn't strictly necessary. While skilled engineers certainly possess the "brains" to manually manage memory and avoid a runtime collector, he views doing so purely as an intellectual exercise rather than practical engineering: "if you have the memory for a garbage collector, you should absolutely use one because it makes a lot of things simpler."
Turning to Go, Odersky observes that it feels like a language that "lags behind," largely because it was deliberately designed to be minimal and adhere to the language standards of the 1990s. While adding generics was a significant step forward, Go remains intentionally limited in expressive power. However, he acknowledges that this limitation is Go's greatest strength: by restricting what developers can do, it enforces a uniform programming style and fosters a shared culture. This makes it exceptionally easy to read other people's code and onboard into an unfamiliar codebase.
When asked whether developers can turn off the garbage collector in Scala, Odersky notes that it is not possible in production today: - Research prototypes exist that explore custom memory allocators in Scala, similar to Zig. - The fundamental risk of custom allocators is dangling pointers—freeing memory while references still leak into it, causing "all hell breaks loose" when pointers access undefined state. - Scala has developed advanced static reference tracking in its type system that can prevent dangling pointers at compile time while allowing custom allocators, though this capability has not yet shipped for production use.
---
[12:42](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=762s) Rust vs. Zig: Compile-Time Inlining and Metaprogramming
Examining the ongoing debate between Rust and Zig, Odersky highlights Zig's compile-time evaluation and inlining model (`comptime`) as an exceptionally clean and powerful construct. In contrast, he considers Rust's macro system noticeably more "clunky."
Scala features a compile-time inlining mechanism that operates very similarly to Zig and C++'s `constexpr`, but with an essential architectural safeguard: Scala strictly guarantees that inlining cannot introduce new type errors post-expansion. By contrast, mechanisms like C++ templates can produce bewildering, deeply nested compiler error cascades upon expansion, making them notoriously scary to debug.
```mermaid flowchart TD accTitle: Compile-Time Inlining Comparison accDescr: Flow diagram contrasting compile-time inliner guarantees against optimizer discretion and post-expansion errors.
subgraph Guarantees["Guaranteed Compile-Time Inlining (Scala & Zig)"] A["inline keyword / comptime"] --> B["Compiler replaces call site with function body"] B --> C["Applies targeted AST optimizations"] C --> D["Guaranteed inlining without post-expansion type errors"] end
subgraph Pitfalls["Alternative Approaches"] E["Standard Optimizer Discretion"] -.->|"May arbitrarily skip inlining"| F["Unreliable call overhead"] G["C++ Template Expansion"] -.->|"Expands untyped AST"| H["Massive, complex type errors"] end ```
Inlining in Scala allows the keyword `inline` to precede a function definition. During the typing phase—while looking at the typed abstract syntax tree (AST) prior to code generation—the compiler takes any call site and replaces it directly with the function's body. Because the underlying code is fully revealed, the compiler can optimize aggressively (such as inlining a lambda application directly into a forwarded function call). Unlike runtime optimizers, which retain the discretion to skip inlining, a compile-time typer-level inliner is required to inline deterministically.
---
[15:45](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=945s) Comparing Scala and Python: Dynamic Typing and Feature Convergence
When considering dynamically typed languages, Odersky highlights Python for its clean syntax, readability, and ubiquity, alongside Scheme for its purity and deep foundation in lambda calculus and computer science theory.
He emphasizes that modern programming languages are converging toward a common core of features, the vast majority of which originated in functional programming: - Functional concepts adopted across ecosystems include pattern matching, rich type systems, generics, polymorphism, and closures. - Python has steadily moved closer to Scala by adding features like pattern matching and optional type syntax evaluated by external type checkers. - Syntactically, Scala 3 has also adopted significant indentation and a cleaner visual style, making it look and feel very much like Python.
The critical distinction remains reliability and tooling guarantees. Scala enforces a strong type system that is permanently active, providing rigorous mathematical guarantees that invalid states cannot occur. In Python, types are optional syntax handled by disparate checkers, and the broader Python culture does not prioritize strict typing in the same way. However, Odersky praises Python as an unmatched "glue language" that integrates effortlessly with high-performance C++ libraries like NumPy and Pandas.
---
[18:31](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=1111s) The Lineage of Scala: From Wirth to Pizza and Java Licensing
Reflecting on his personal path, Odersky explains that he is by trade an imperative programmer whose doctoral thesis was advised by Niklaus Wirth, immersing him initially in Pascal and Modula-2. He later underwent a conversion to functional programming through ML, OCaml, and Haskell. Scala was born directly out of that synthesis:
```mermaid flowchart LR accTitle: Evolution and Influences of Scala accDescr: Historical path showing the languages that influenced Martin Odersky leading to Scala.
subgraph Heritage["Foundational Influences"] Wirth["Pascal & Modula-2 (Niklaus Wirth)"] MLFamily["Standard ML, OCaml & Haskell"] end
subgraph Intermediate["Early JVM Experiment"] Pizza["Pizza Language (with Philip Wadler)"] JavaC["Writing javac / Early Java pre-1.0"] end
subgraph Modern["Scala Architecture"] Scala["Scala Language"] end
Heritage --> Pizza Pizza --> JavaC JavaC --> Scala MLFamily -->|"Module system (OCaml) & Stdlib names (Haskell)"| Scala ```
Scala's direct ancestor was Pizza, a research language designed by Odersky and Haskell co-designer Philip Wadler with the goal of bringing functional programming to the widely adopted Java Virtual Machine (JVM). To prepare for that work, Odersky wrote a Java compiler from scratch. Although initially dismissive of Java prior to version 1.0, building its compiler revealed how practical the platform truly was. When designing Scala as Pizza's successor: - Java provided the execution platform, object-oriented foundation, and broad interoperability. - OCaml heavily inspired the module and component system. - Haskell and OCaml together shaped the idioms and naming conventions in the Scala standard library.
Addressing how early JVM experimentation was handled legally, Odersky clarifies that Java's language specification was open, enabling widespread academic and industry experimentation without licensing fees. Sun Microsystems' primary enforcement was around branding and trademark integrity: if software utilized Java technology, Sun strictly demanded it adhere to the Java name rather than being rebranded under proprietary forks (the root cause of Sun's early clashes with Microsoft).
[21:35](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=1295s) Microsoft, Sun Microsystems, and the Origins of the JVM Ecosystem
Reflecting on the late 1990s and early 2000s, Martin Odersky explains the corporate backdrop of the Java ecosystem. Microsoft branched off to build C#, which Odersky describes as essentially "Java on some steroids" because it incorporated several additional features beyond what Java offered at the time. Despite the looming corporate rivalries, Odersky notes that between 1998 and roughly 2004 or 2005, Sun Microsystems was a remarkably open company, so building atop their platform did not feel risky. The genuine hostility in the ecosystem emerged much later, once Oracle acquired Sun and Google opted to create its own clean-room implementation of Java for Android, triggering major legal battles.
[22:16](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=1336s) How Scala Runs on the JVM and Multi-Platform Execution
When asked what it concretely means for Scala to run on the JVM, Odersky explains that the JVM is fundamentally defined by its bytecode format. Bytecode serves as an intermediate representation: source code compiles into this bytecode, which the virtual machine runs initially through an interpreter before handing hot execution paths over to an optimizing Just-In-Time (JIT) compiler. Generating bytecode itself is straightforward; the substantially harder engineering challenge is bidirectional Java interoperability. The Scala compiler must map Java types and concepts into idiomatic Scala equivalents so that developers can seamlessly call Java libraries—even if they have little experience with Java itself.
While Scala was originally born on the JVM, Odersky emphasizes that it has evolved into a full multi-platform language: - **Scala.js**: Runs in browsers and on Node.js. - **WebAssembly (Wasm)**: Targets web and containerized environments. - **Scala Native**: Uses LLVM to compile directly to bare-metal native binaries.
```mermaid flowchart TD accTitle: Scala Multi-Platform Compilation Architecture accDescr: Diagram showing how Scala source code translates through the compiler to multiple target runtimes including JVM, Native, JS, and Wasm. SRC["Scala Source Code"] --> COMP["Scala Compiler"]
subgraph Runtimes ["Execution Targets"] direction TB COMP -->|"Generates Bytecode"| JVM["JVM (Interpreter + JIT)"] COMP -->|"Via LLVM"| NAT["Native Machine Code"] COMP -->|"JS Target"| WEB["JavaScript / Node.js"] COMP -->|"Wasm Target"| WASM["WebAssembly"] end
JVM <-->|"Seamless Interop"| JLIBS["Java Libraries & Ecosystem"] ```
[23:48](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=1428s) Sponsor Break: WorkOS and Jira by Atlassian
The conversation briefly pauses for messages from the episode sponsors: - **WorkOS**: Designed for B2B SaaS and AI developers (adopted by teams like OpenAI, Anthropic, Cursor, and Vercel) who must support enterprise requirements like Single Sign-On (SSO), Directory Sync (SCIM), Role-Based Access Control (RBAC), and Audit Logs via a simple API layer. - **Jira by Atlassian**: Modernized beyond issue tracking to allow teams to assign context-rich tasks directly to AI agents, which can fulfill requirements and surface pull requests automatically.
[25:03](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=1503s) The Architectural Advantages of Bytecode and Garbage Collection
Ryan Peterman asks why a language would target JVM bytecode rather than compiling straight to native machine instructions like C or C++. Odersky explains that Scala Native does provide LLVM-based native compilation, but staying on the JVM provides crucial runtime benefits: 1. **Unrivaled Interoperability**: Instant access to decades of robust Java libraries. 2. **Production-Grade Garbage Collectors**: Modern JVMs feature high-performance, battle-tested garbage collectors. 3. **Dynamic Runtime Loading**: The JVM can compile a one-line code snippet into a tiny chunk of bytecode and dynamically load it into an active JVM process on the fly. This capability makes rich interactive environments—such as a REPL (Read-Eval-Print Loop)—trivial to implement, whereas native binaries have no native equivalent for dynamic snippet execution.
[26:33](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=1593s) Why Compilers Are Hard to Build (and Espresso Java)
Turning to the engineering difficulty of compilers, Odersky notes that compilers are exceptionally intricate because developers place conflicting, heavy demands on them: - Modern type systems require sophisticated **type inference** so the programmer does not have to write verbose type annotations everywhere. - The compiler must generate highly optimized code while simultaneously running fast enough to maintain interactive developer velocity. - On the positive side, compilers are fundamentally deterministic programs. Given the identical input source code, they produce identical outputs, which makes them far easier to debug and replay than non-deterministic cloud environments or distributed systems.
When Peterman asks about Odersky's early Java compiler, **Espresso** (the precursor to Pizza and Sun's javac), Martin recalls writing it in roughly three months of part-time work. He utilized a high-level library to assemble and format JVM bytecode, but hand-wrote the remaining logic from scratch. He cautions that while a v1 compiler can be built quickly, the real complexity accumulates across the 10- or 20-year mark as edge cases, features, and tooling demands multiply.
[29:19](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=1759s) How Twitter's Scaling Pain Triggered Scala's Breakthrough
Peterman inquires how an obscure academic language gained enterprise momentum, specifically recalling Twitter's early migration to Scala. Odersky explains that early Twitter ran on Ruby on Rails and suffered notorious uptime and stability issues—frequently resulting in the "Fail Whale"—largely due to Ruby's memory management and garbage collection bottlenecks under rapid scale.
At the time, Twitter had around 25 employees (including ops). The board of directors and venture capital investors issued an ultimatum: Twitter needed the rock-solid stability of Java. However, several engineers on the team were functional programming enthusiasts who loved OCaml. Because OCaml had no JVM runtime, they discovered Scala. It offered the expressive, functional paradigm of OCaml while running directly on JVM bytecode. As Odersky humorously puts it, the engineers could tell their investors they were adopting Java without lying, because "we do JVM bytecode, that's essentially what it comes down to." Once high-profile Twitter adopted Scala, the "floodgates opened," motivating teams moving away from dynamic scripting languages (Ruby, PHP, and JavaScript) to follow suit.
[31:00](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=1860s) The AI Code Generation Paradigm and the Existential Crisis
Looking ahead to the rising tide of AI-generated code, Odersky observes that the industry is entering an "existential crisis." Large language models generate massive volumes of source code, yet engineering teams are assigning humans the impossible task of reviewing hundreds or thousands of machine-written lines—a model Odersky states "will never work."
Simultaneously, autonomous AI systems are getting remarkably skilled at probing codebases and exploiting subtle vulnerabilities. If humans lose the ability to verify and understand the logic entering production systems, they risk losing control of the software itself. Odersky argues that while programming language design is not a sole silver bullet, languages must fundamentally adapt: as writing code shifts to AI, language systems will need new ways to help humans constrain, verify, and reason about software safety.
[32:26](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=1946s) Stronger Types, High-Level Specifications, and Capabilities for AI Agents
As AI takes over more of the implementation work, Martin expects the focus of programming to shift decisively toward interfaces and types. Types will need to become much stronger and more precise than they are today, serving as "the handle that we can make a contract between the human and the AI that the human can understand and that's concise enough to be reviewed and that essentially the AI can keep to." To achieve this, programming languages have to level up their game considerably. "Let's face it, type systems are mostly recommendations," Martin admits candidly—they mostly hold, but offer no ironclad guarantees because developers or agents can always undermine them using type casts, dirty memory, or other backdoors. Every one of those holes must be closed from the very beginning, because once a hole exists, somebody or something can exploit it.
Alongside stronger high-level types, programmers will need to focus far more on requirements and high-level specifications so they can confidently leave code generation to AI. A key mechanism Martin believes can bridge this gap is **capabilities**—a concept that has existed for a long time in operating systems to grant fine-grained permissions to entities, users, and programs, and whose time has now come for programming languages. Applied to agentic AI, capabilities allow developers to grant agents very precise, fine-grained permissions dictating exactly what they can do, which in turn provides confidence about what they *cannot* do—"like they will not be able to leak my API keys or my email or do other things." While existing languages are not quite there yet, Martin notes that Scala is "halfway there," with capability-based features already developed in his lab and released as an experimental feature.
The absolute baseline prerequisite for any such guarantee is memory safety. Any language that allows access to undefined memory is "immediately out because you can't guarantee anything." While Martin applauds the industry push—even backed by the U.S. government—to adopt Rust as a memory-safe language, he stresses that Rust focuses mostly or solely on memory, whereas true safety requires controlling read permissions, write permissions, and access to secrets. And to skeptics who might tell him, "Martin, you're totally unrealistic because all our software is written in C and C++ and we will not be able to rewrite that," he points out an ironic twist: AIs themselves are great at rewriting software, so once we have the right target languages and safety models, AI can help migrate that legacy code.
[36:17](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=2177s) How Capabilities Work in Scala: Preventing Escaping Resources and Secrets
When Ryan asks what Scala's experimental capability features actually look like in practice, Martin walks through a classic resource-management scenario: a program operation is passed a file—such as a log file—for a limited duration, after which the surrounding environment closes it. In a traditional language, there is no way to guarantee the operation didn't secretly hold on to the file reference after claiming to be finished with it. The function could easily stash the file handle in a side variable or inside a returned closure or stream, only to access it again after it was supposed to be closed.
Scala's experimental capability system prevents this by treating the file itself as a capability restricted to a limited scope, using the type system to ensure that the capability never escapes. If a function returns a lambda or a stream that holds on to that file behind the scenes, "in our language that won't be a secret anymore because the type has to declare that the thing I return does hold on to the file." Because a type cannot hide the capabilities it accesses, the outer scope can enforce a boundary requiring the returned value's type to hold zero capabilities—enforcing via the type system a guarantee that was previously unenforceable. Martin points out that this exact same pattern applies both to memory safety with **arenas**—where you allocate memory in a region and must guarantee no pointers still point into it when freeing the arena—and to protecting sensitive secrets by ensuring code only ever possesses an explicitly defined set of capabilities.
```mermaid flowchart LR accTitle: Enforcing Scoped Capabilities in Scala's Type System accDescr: Shows how an environment passes a file capability into a limited scope and uses the type system to block any return value that secretly retains the file capability.
subgraph Env["Outer Environment"] F["File Capability (Log File)"] Check{"Return Type Declares Capabilities?"} end
subgraph Scope["Limited Operation Scope"] Op["Program Operation"] Lambda["Returned Stream / Lambda"] end
F -->|"Passed for limited time"| Op Op -->|"Creates"| Lambda Lambda -->|"Returned to caller"| Check Check -->|"Holds File Capability"| Reject["Compile Error: Capability Escapes"] Check -->|"No Capabilities Held"| Safe["Safe to Close File"] ```
[38:58](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=2338s) Memory Safety vs. Capability Safety Across Systems Languages
Prompted by Ryan to name which major languages lack memory safety, Martin lists C and C++ as the biggest culprits, alongside newer low-level systems languages like Zig and Nim. He credits Rust with a historic breakthrough in proving that a low-level systems language could be memory safe at all—"nobody sort of thought that that was possible before Rust came." Without memory safety, "essentially you have nothing because you can fake everything." However, building secure systems requires moving beyond memory safety to full **capability safety**, which must prevent two distinct failure modes:
- **Forgetting capabilities:** Holding on to a resource or permission while conveniently omitting from the type signature that you still have access to it. - **Forging capabilities:** Conjuring up or fabricating a capability out of thin air whenever you need one without having been granted it.
[40:12](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=2412s) Designing Languages for Machines: Formal Verification and Prompts as First-Class Values
Ryan raises a fundamental shift in language design philosophy: historically, programming languages were designed to be pleasant for humans to read and write, so what changes when machines are the primary authors and readers of source code? Martin responds that while humans will still occasionally need to read AI-generated code, "easy to write is definitely not a big criterion anymore." Consequently, terse syntactic shortcuts invented to save human keystrokes—like writing `x++` in C instead of a long-form assignment—will matter much less, even if they stick around out of habit.
What will matter far more are high-level mechanisms to **constrain** what a program must *not* do and **specify** what it *should* do. Some researchers herald the AI era as a "golden age for formal verification," because an AI can generate not only the program implementation from a precise specification, but also the formal mathematical proof that the program satisfies that specification. While Martin finds this very exciting for specific domains, he notes a practical catch for software engineering "in the large": most of the time you don't have a formal specification, and writing a complete formal specification is often just as hard as—or even harder than—writing the program itself.
Because of that limitation, developers will continue specifying software in natural language through prompts to AI agents, though Martin expects that workflow to become much more structured. Right now, developers craft elaborate prompts that produce impressive code, "but then we throw away the prompt or it's hidden in the chat history with the agent. So that's really a shame." Instead, future languages designed for agentic programming should treat **prompts as first-class values** embedded directly inside the program—acting, as Ryan puts it, like "meta information about the program." When the prompt lives as a first-class artifact defining what the program is about, modifying the prompt allows the AI to see the exact incremental change in intent and update the underlying code incrementally to match.
[43:02](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=2582s) Prompts as Part of the Program
Discussing the ergonomics of working with AI code generation, Martin Odersky emphasizes the necessity of tracking prompts much like source control. Just as developers rely on `git blame`, there should be a "prompt blame" that preserves the exact context used to create a specific piece of code. Keeping prompts attached to programs is crucial for incremental modifications. If an engineer wants to adjust a tiny detail without altering existing logic, simply asking an LLM to regenerate code from scratch causes nondeterministic drift, potentially breaking parts of the implementation that were already carefully reviewed. Treating prompts as first-class components of the codebase ensures that modifications remain small, targeted, and reproducible.
[43:40](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=2620s) The Future of Software Engineering: Fewer, Higher-Skilled Engineers
Looking a decade ahead, Odersky predicts there will be fewer software engineers rather than more, with the field shifting toward significantly higher qualification standards. Rather than entry-level manual coding, the craft will resemble control engineering in an automated factory:
```mermaid flowchart TD accTitle: Evolution of the Software Engineering Role Under AI accDescr: Diagram contrasting historical manual coding with future AI oversight roles requiring formal logic and high verification standards. subgraph Past["Traditional Paradigm"] A["Manual Code Authoring"] --> B["Broad Range of Skill Levels"] end subgraph Future["AI-Driven Future"] C["High-Level Control & Verification"] --> D["Specialized Workforce"] D --> E["Deep Foundations in Logic & Math"] end Past -.->|"AI Automation"| Future ```
Much as modern factory automation demands operators who are vastly more technically proficient than assembly-line workers from fifty years ago, future programmers will act as supervisors guiding and constraining AI models. The profession will become harder to enter, requiring a solid grounding in logic and mathematics to keep automated generation on track and ensure rigorous correctness.
[44:34](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=2674s) Recommended Languages to Expand the Mind
When asked which languages engineers should explore to broaden their thinking, Odersky highlights two major domains outside of Scala:
- **Systems Programming (C and Rust):** Understanding the bridge between hardware and software is essential. He feels torn between C and Rust: C offers absolute simplicity and sits directly on the metal without layered abstractions, while Rust delivers memory safety at the cost of high abstraction overhead. His advice is to start with C to understand how hardware behaves fundamentally, and then transition to Rust if pursuing systems programming professionally. - **Formal Verification and Theorem Proving (Lean and Coq):** Formal verification languages will gain massive importance in an AI-dominated landscape. Working through a proof assistant like Lean or Coq forces developers to move past vague, fuzzy intuitions and develop a razor-sharp mental model of what program correctness actually means mathematically. - **Scala as the Middle Ground:** Scala remains uniquely positioned between both extremes, uniting high expressivity and strong, verifiable types in a practical development environment.
[46:18](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=2778s) Book Recommendation: SICP
For essential reading, Odersky immediately points to *Structure and Interpretation of Computer Programs* (SICP), the classic MIT introductory textbook by Harold Abelson and Gerald Jay Sussman. He absorbed a tremendous amount from it, noting that the courses he built at EPFL and Coursera draw heavily upon its core pedagogical material—adapted, of course, to use strong static typing rather than Scheme's dynamic typing.
[46:51](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=2811s) Choosing Academia Over Industry
Reflecting on his career, Odersky traces his academic path to an open-ended university research project. He was captivated by working on problems where it was genuinely unknown whether a solution even existed, finding that inherent uncertainty much more compelling than predetermined engineering tasks.
While acknowledging that industry jobs in Silicon Valley or at Google could easily pay tenfold compared to university salaries, he values the long-term independence of academia far more. Corporate priorities frequently pivot, leaving employees vulnerable to sudden layoffs when their work falls out of corporate favor. By contrast, academic tenure grants complete freedom to set one's own research agenda without answering to an engineering manager. Though securing research grants is demanding, mentoring and collaborating with students has proven deeply rewarding.
[48:28](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=2908s) Reflecting on Scala: Culture Clashes and Over-Abstraction
Scala originated as an experimental synthesis designed to unite object-oriented and functional programming. While technically an undisputed success, blending the two paradigms produced severe ecosystem tensions. Odersky chuckles as he recalls James Iry’s satirical essay, *A Brief, Incomplete, and Mostly Wrong History of Programming Languages*, which jokingly described Scala's creation as smashing functional and object-oriented paradigms together like a Reese's Peanut Butter Cup, only for both communities to promptly declare war on each other.
In retrospect, Odersky acknowledges that introducing advanced functional features so completely from day one opened the door to widespread over-abstraction:
- **The Go Contrast:** Unlike Go—which faced early criticism for omitting basic features like generics, but in doing so established a restrained culture of simplicity—Scala gave developers full power immediately, allowing almost any Haskell idiom to be imported directly into the language. - **The Pitfall of "Abstraction Peaks":** Without syntactic guardrails, programmers frequently over-engineered basic logic, abandoning straightforward operations like `.map` in favor of dizzying mathematical abstractions that neither they nor their teammates could fully comprehend. - **Normative Monadic Frameworks:** Prominent libraries imported straight from Haskell compelled users to structure entire applications as monads. While monads shine in purely functional contexts, their heavy adoption created peer pressure within the ecosystem. Teams led by dogmatic Haskell converts would construct impenetrable codebases, leading higher-level managers to scrap entire projects two years down the line because no one else could maintain the software. - **JVM Tight Coupling:** From a technical perspective, Odersky expresses regret over relying so directly on Java's runtime conventions. Inheriting universal OOP methods on `Any`/`Object`—such as `toString`, `equals`, and `hashCode`—proved convenient for interoperability, but lacked the compile-time safety and precision provided by type-class patterns found in Haskell and Rust.
[53:55](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=3235s) Reflecting on Scala’s Unlikely Success
Continuing his reflection on language design regrets, Martin Odersky notes that early Scala adapted Java's notion of what an object is. While inheriting Java's built-in object semantics was undeniably convenient at the time, it ultimately imported unwanted baggage and friction that later proved difficult to unwind. When Ryan asks what Martin would have predicted 20 years ago if asked where Scala would be today, Martin chuckles and admits he would have expected the language to become merely "a footnote in memory." In its infancy, Scala had maybe five external users beyond their research group at EPFL, giving the team zero expectation that adoption would ever explode into an industry standard.
Looking back at why Scala took off so unexpectedly, Martin explains that the language filled a critical historical void. At the time, developers felt torn between two flawed extremes: dynamic languages that felt lightweight and productive to write but were notoriously slow and prone to runtime crashes, versus statically typed languages like Java that ran on robust enterprise platforms but required cumbersome ceremony, verbosity, and boilerplate. Scala served as the ideal bridge. Because of its advanced type inference, types did their job behind the scenes without cluttering the screen, giving developers the fluid feel of a dynamic language while preserving the rock-solid guarantees and execution speed of the JVM. Martin points out that many mainstream languages later copied these exact ergonomic features five to ten years down the line, but Scala broke that ground first.
- **Initial reach**: Scala started with only around five users outside the core academic lab at EPFL. - **The developer dilemma of the 2000s**: Choosing between dynamic languages (fast to write, slow execution, frequent runtime failures) and Java (rock-solid runtime, but tedious ceremony and boilerplate). - **Scala's bridge**: Type inference provided the clean feel of dynamic scripting combined with the safety and performance of a static type system on the JVM. - **Subsequent influence**: Mainstream languages later adopted many of Scala's functional patterns and type inference mechanisms five to ten years later.
---
[55:44](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=3344s) Advice to a Younger Self: Embrace Non-Conformity
Asked what career advice he would give to his younger self fresh out of college, Martin's answer is immediate: be adventurous, take risks, and avoid blindly following the mainstream. In his experience, breaking away from conventional industry consensus to pursue ideas that seem technically unusual or daring pays off far more than sticking to safe, incremental paths.
He cautions that while an engineer still needs to remain grounded and keep their responsibilities on track, they should not over-optimize for safety at the expense of bold exploration. His parting guidance is simple: if a wild or crazy technical idea catches your imagination, make the time to dive into it and cultivate a healthy streak of non-conformism.
---
[56:34](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=3394s) Outro and Ergonomic Keyboard Project
Closing out the interview, Ryan thanks Martin for his time and turns to his audience, encouraging viewers to like, comment, and suggest future guests. He points out that previous landmark podcast guests—including distributed systems and programming pioneer Barbara Liskov, database legend Michael Stonebraker, and AWS VP Marc Brooker—were directly booked because audience members suggested them in the comment section.
Ryan also shares an update on his personal hardware venture: designing and building custom ergonomic split keyboards. Holding up a prototype in its protective casing, he announces that the project recently launched on Kickstarter and funded successfully within just eight hours. With the campaign past its initial target, the team has transitioned into tooling and manufacturing, keeping late pledges open for viewers interested in securing a unit from the upcoming production run.
## Notable quotes > [00:00](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=0s) We are at a moment where it's essentially very dangerous that we lose control as humans. — Martin Odersky
> [02:58](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=178s) The other thing is to essentially know when to stop... there is a strand of functional programming called pure functional programming which tries to express as much as possible in pure functions and to sort of delay the side effects to and wrap them up in monads or whatnot, and that can get very inconvenient very quickly. — Martin Odersky
> [10:24](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=624s) if you have the memory for a garbage collector, you should absolutely use one because it makes a lot of things simpler. — Martin Odersky
> [29:19](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=1759s) we do JVM bytecode, that's essentially what it comes down to. — Martin Odersky
> [32:26](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=1946s) the handle that we can make a contract between the human and the AI that the human can understand and that's concise enough to be reviewed and that essentially the AI can keep to. — Martin Odersky
> [32:26](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=1946s) Let's face it, type systems are mostly recommendations — Martin Odersky
> [36:17](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=2177s) in our language that won't be a secret anymore because the type has to declare that the thing I return does hold on to the file. — Martin Odersky
> [38:58](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=2338s) nobody sort of thought that that was possible before Rust came. — Martin Odersky
> [40:12](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=2412s) easy to write is definitely not a big criterion anymore. — Martin Odersky
> [40:12](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=2412s) but then we throw away the prompt or it's hidden in the chat history with the agent. So that's really a shame. — Martin Odersky
> [53:55](https://www.youtube.com/watch?v=LdN4sPWM-WY&t=3235s) a footnote in memory. — Martin Odersky
## Mentioned Martin Odersky, Ryan Peterman, Simon Peyton Jones, Niklaus Wirth, Philip Wadler, James Iry, Harold Abelson, Gerald Jay Sussman, Barbara Liskov, Michael Stonebraker, Marc Brooker, Scala, Rust, Zig, Python, Go, C, C++, Coq, Lean, Standard ML, OCaml, Haskell, Scheme, Pascal, Modula-2, Pizza, Java, javac, Espresso, Ruby, Ruby on Rails, PHP, JavaScript, Nim, JVM, LLVM, WebAssembly, Scala.js, Scala Native, NumPy, Pandas, Twitter, WorkOS, Jira, Atlassian, OpenAI, Anthropic, Cursor, Vercel, Sun Microsystems, Microsoft, Oracle, Google, EPFL, MIT, Coursera, Kickstarter, Structure and Interpretation of Computer Programs, A Brief, Incomplete, and Mostly Wrong History of Programming Languages
## Video description Martin Odersky is the creator of Scala and I interviewed him to compare different languages designs (Rust vs Zig vs Python vs Scala) and how AI will impact programming languages.
• My ergonomic keyboard project I mentioned, you can follow along here: https://read.compose.llc/ • The Kickstarter page for it: https://www.kickstarter.com/projects/ryanlpeterman/compose-simple-ergonomics-beautifully-done
𝗣𝗼𝗱𝗰𝗮𝘀𝘁 𝗹𝗶𝗻𝗸𝘀:
• Spotify: https://open.spotify.com/episode/0EHxXlNhBNbZuXc876W52m?si=4HTiVaY4S-Cn5-JlycKS8w • Apple: https://podcasts.apple.com/us/podcast/the-peterman-pod/id1777363835 • Transcript: https://www.developing.dev/p/creator-of-scala-comparing-languages?r=n49ky
𝗧𝗵𝗮𝗻𝗸 𝘆𝗼𝘂 𝘁𝗼 𝘁𝗵𝗶𝘀 𝗲𝗽𝗶𝘀𝗼𝗱𝗲'𝘀 𝘀𝗽𝗼𝗻𝘀𝗼𝗿𝘀 𝗳𝗼𝗿 𝘀𝘂𝗽𝗽𝗼𝗿𝘁𝗶𝗻𝗴 𝗺𝘆 𝘄𝗼𝗿𝗸:
• WorkOS: makes your app Enterprise Ready with easy to use APIs to add SSO, SCIM, RBAC, and more in just a few lines of code, check them out at https://workos.com/ • Jira by Atlassian: Get more work done with your favorite agents and models all in one place, check them out at https://jira.dev/
𝗧𝗶𝗺𝗲𝘀𝘁𝗮𝗺𝗽𝘀:
00:00 Intro 00:44 Why care about functional programming 06:35 Why should people learn Scala 09:26 Rust vs Scala 12:42 Rust vs Zig 15:45 Scala vs Python 18:31 The programming languages that influenced him 22:16 How running on the JVM works 26:33 Why writing a compiler is hard 29:19 Why Twitter adopted Scala early on 31:00 How he believes AI will impact programming languages 43:40 Will there be less engineers in ten years 44:34 Top programming languages to learn to grow 46:18 Top technical book recommendation 46:51 Why he chose academia instead of industry 48:28 Reflecting on Scala 55:42 Advice for his younger self 56:33 Outro
𝗪𝗵𝗲𝗿𝗲 𝘁𝗼 𝗳𝗶𝗻𝗱 𝗠𝗮𝗿𝘁𝗶𝗻:
• Wikipedia: https://en.wikipedia.org/wiki/Martin_Odersky • Website: https://people.epfl.ch/martin.odersky • X/Twitter: https://x.com/odersky • GitHub: https://github.com/odersky
𝗪𝗵𝗲𝗿𝗲 𝘁𝗼 𝗳𝗶𝗻𝗱 𝗥𝘆𝗮𝗻:
• Newsletter: https://www.developing.dev/ • X/Twitter: https://x.com/ryanlpeterman • LinkedIn: https://www.linkedin.com/in/ryanlpeterman/ • Threads: https://www.threads.com/@ryanlpeterman • Instagram: https://www.instagram.com/ryanlpeterman • TikTok: https://www.tiktok.com/@ryanlpeterman
𝗥𝗲𝗳𝗲𝗿𝗲𝗻𝗰𝗲𝗱 𝗶𝗻 𝘁𝗵𝗶𝘀 𝗲𝗽𝗶𝘀𝗼𝗱𝗲:
• Structure and Interpretation of Computer Programs: https://web.mit.edu/6.001/6.037/sicp.pdf • A Brief, Incomplete, and Mostly Wrong History of Programming Languages (book): http://james-iry.blogspot.com/2009/05/brief-incomplete-and-mostly-wrong.html
[Source](https://www.youtube.com/watch?v=LdN4sPWM-WY)