Edited by humans. Written by AI. How our editing works
All articles

Effect-Oriented Programming: Making Side Effects Safe

Three authors explain how effect-oriented programming brings type safety to the messy, unpredictable parts of code—without the intimidating math.

Zara Chen

Written by AI. Zara Chen

February 25, 20265 min read
Share:
Four men in professional headshots against a blue gradient background with "gjoto;" branding and red wave design at bottom

Photo: GOTO Conferences / YouTube

Here's the thing about functional programming that nobody wanted to admit: it had a massive blind spot. The pure functions, the elegant compositions, the mathematical guarantees—all of that fell apart the moment your code needed to talk to a database, hit an API, or do literally anything in the real world.

Bill Frasure, Bruce Eckel, and James Ward spent years figuring out how to fix that. Their [new book, Effect Oriented Programming, tackles the problem head-on: how do you bring the benefits of functional programming—composability, type safety, compiler checking—to the messy, unpredictable parts of code where things actually happen?

The Side Effect Problem

The functional programming community has historically treated side effects like that relative you don't invite to Thanksgiving. "Don't worry about those," they'd say. "Just push them to the edges." Cool advice, except when your entire job is building systems that do things—send emails, process payments, update records.

"Everything I do is side effects," is how Andrew Harmel-Law, the interviewer, put it during the GOTO Book Club discussion. And he's not wrong. Most real software lives in that territory.

Effect-oriented programming offers a different approach: instead of avoiding side effects, encapsulate them. As Bruce Eckel explains, "Effects are operations that can be composed. Rather than objects, these are operations, and you can compose them, and when you do, you get a new operation that can be composed."

The key insight? An effect isn't executed immediately. It's a description of something that will happen when you explicitly tell it to. This deferred execution changes everything.

What Makes It Actually Work

Here's where it gets interesting: effects don't just encapsulate side effects—they track them through your type system. In ZIO, the effect system the authors use as their reference implementation, every effect carries three types: what it outputs, how it can fail, and what environmental dependencies it needs.

This means the compiler can tell you things like: "Hey, you composed these two operations, and one can timeout while the other can have a network failure. You need to handle both." Or conversely: "You're trying to handle an error that can't actually happen here."

Bill Frasure describes the forcing function: "When you are actually going to execute this, if you have not handled your errors, you have to explicitly call something like orDie... it forces your hand at every point to say, hey, you are making a choice here."

It's not that effect-oriented programming makes the unpredictable predictable. It gives you better tools to manage unpredictability—timeouts, retries, error handling—at both the small scale and when you're composing complex operations.

The Accessibility Problem

What's remarkable about this book is what it doesn't do. It doesn't start with category theory. It doesn't require you to understand monads. It doesn't assume you've read Haskell papers.

"How much knowledge and background seem to be required to get into functional programming and effects in particular... it was always these very intimidating texts with all sorts of assumed knowledge," Frasure notes. "Our goal was to really just lower that as much as we could."

The book went through radical trimming—from about 250 pages down to 100. Not because they dumbed it down, but because they found the essential core. "What can we strip out of this?" became an addictive question. James Ward puts it clearly: "The mission that we have is to teach people the value of effects, why they should use them, why they're better than what you're currently doing."

Scala became the vehicle, not the destination. Which leads to an interesting development.

Beyond Scala

Effect-oriented programming is spreading. The TypeScript community already has a port of ZIO that's gained rapid traction. The authors are working on a TypeScript version of their book. The JetBrains Kotlin team just designed their new AI workflow framework using effect-oriented principles—isolating side effects from workflow definitions.

Then there are the new languages building effects directly into their design: Unison and Roc use algebraic effects, a different implementation of the same core concepts. Even Python might get there eventually, though as Eckel notes, "you need a reliable type system to pull this off."

The pattern is expanding because the problem is universal. Every language community eventually hits the same wall: how do you write reliable, testable, composable code when you need to interact with the outside world?

The Compiler as Safety Net

What keeps striking me about this approach is the role of the compiler. In most programming paradigms, the compiler checks syntax and types but leaves error handling to developer discipline. Effect-oriented programming extends that safety net.

Your composed operations automatically accumulate their possible failure modes. The compiler tracks them. You can't accidentally ignore an error—you have to explicitly tell the system "let this crash" if that's what you want. And if you're being overly defensive, handling errors that can't occur? The compiler catches that too.

This isn't about making programming harder. It's about making certain classes of bugs impossible and making the implicit explicit. When Frasure talks about effects, he emphasizes: "Once you have sent a message out into the world, you have kicked off the butterfly—its wings have flapped. You don't know what is going to come out of that. So that's why you need to treat these things with special care."

Effect-oriented programming gives you handles on that chaos—not to eliminate it, but to manage it systematically.

The functional programming community spent decades building beautiful abstractions for pure computation. Effect-oriented programming is what happens when you finally bring those tools to the part of code that actually matters: the part that changes the world.

—Zara Chen

From the BuzzRAG Team

We Watch Tech YouTube So You Don't Have To

Get the week's best tech insights, summarized and delivered to your inbox. No fluff, no spam.

Weekly digestNo spamUnsubscribe anytime

More Like This

Four software developers posed against a blue backdrop with a book cover displayed on the left showing "Effect Oriented…

Effect-Oriented Programming: A New Hope?

Exploring Effect-Oriented Programming: simplifying complexity and enhancing reliability in software development.

Mike Sullivan·6 months ago·3 min read
Two professional headshots of men against a blue background with "BEN SMITH • JAMES BESWICK" and "gjoto;" branding…

Workflows vs. Code: Navigating Tech Regulations

Explore how workflows in software development impact tech regulations and industry standards.

Samira Barnes·6 months ago·3 min read
Priest standing before a church during day contrasts with a programmer coding at night, representing the creator's dual life

The Episcopal Priest Building Rust's Hottest Web Framework

Reverend Greg Johnston creates Leptos, a popular Rust web framework with 19K GitHub stars, while serving full-time in ministry. His unlikely path reveals something.

Zara Chen·5 months ago·7 min read
Man with surprised expression surrounded by cloud service provider logos including AWS, Azure, and others against a dark…

Where to Deploy Your App in 2026: A Reality Check

Developer Theo breaks down serverless vs VPS deployment options for 2026, from Vercel's ease to Cloudflare's cost traps. Here's what actually matters.

Zara Chen·5 months ago·6 min read
Developer at multi-monitor workstation with neon purple and orange lighting, GitHub logo visible in top right corner

December's Top GitHub Projects: Innovation Unleashed

Explore December 2025's trending GitHub projects, from AI tools to coding frameworks, revolutionizing software development.

Zara Chen·6 months ago·3 min read
Evolution from apes to modern programmer shown alongside programming language logos (USP, C, Paintbrush, Python,…

From Binary to AI: Coding's Evolutionary Tale

Explore the evolution of programming, from binary beginnings to AI's coding revolution. Where does the future lead?

Zara Chen·6 months ago·3 min read
Man with serious expression next to Claude Design by Anthropic Labs logo on black background

I Tested Claude Design: Here's What Happened to My UI

Developer OrcDev spent hours testing Anthropic's Claude Design AI tool. The results reveal what AI can—and critically can't—do for interface design.

Zara Chen·3 months ago·5 min read
Silver laptop with Arm logo next to exposed computer motherboard with cooling fan on wooden surface

Framework 13 Gets ARM—But Should You Actually Want It?

MetaComputing's new ARM mainboard for Framework 13 promises modular computing's future. Tech journalist Jeff Geerling tests whether it delivers.

Zara Chen·3 months ago·5 min read

RAG·vector embedding

2026-04-15
1,251 tokens1536-dimmodel text-embedding-3-small

This article is indexed as a 1536-dimensional vector for semantic retrieval. Crawlers that parse structured data can use the embedded payload below.