Explore how software engineers use Effect to build reliable, production-ready software in TypeScript.
In an age in which like you can make code
for free by pushing buttons.
What matters is the shape of the
primitives and how they snap together
to solve problems and Effect
TS has that it's those primitives that
can be used to efficiently solve
a huge range of problems in building
reliable cloud software.
You know, not only do the primitives
matter, still matter.
The primitive is the product as Amplify
would say, but also even if there's
a ramp up curve to learning the
primitives, it doesn't
really matter anymore.
And that is to say we can choose better
primitives in the era of agentic
coding than we could before, because
before you had to convince a bunch
of humans to learn stuff and you don't
have to convince agents to learn stuff.
Snap your fingers
and they already know it.
And that's what's Effect TS: better
primitives for
building reliable software.
And you can make your coding agent use
it, even if it's never seen them before.
Welcome, John and Mike. Very, very
excited to have you
both on the show today.
John is the absolute foundation that
has led to Effect as it is today.
So is Mike. I think we'll revisit later
the way how John put it
best at the Effect Days 2024,
I believe it was, with like a little fish
of like Haskell, ZIO and Effect.
But we will come back to that later. But
John is the creator of ZIO,
which was the intellectual
foundation for what became Effect later
due to Mike's work. And so
today I'm very delighted to
have you both on the show to talk about
where Effect is coming
from, where it's going, and
which weird time we're in today with AI.
So welcome to the two of
you. And John, if you want
to briefly introduce yourself, that would
be great. Thank you so
much. And also thank you for the
invitation to be here on the podcast.
It's a pleasure. So
currently I am CEO of Ziverge.
And Ziverge used to be a Scala
development shop doing Scala
consulting and training and team
extension. But now we're increasingly
getting into the Effect TS
ecosystem, and trying to help
build stuff there as well as training
developers on Effect TS, do a lot more in
TypeScript. And we're
also doing more in Rust these days. And
then I'm also CEO of a company called
Golem Cloud, which is
a tiny little startup incubated from
Ziverge, which is building
a durable runtime for agents
and their tools. And then at nights and
weekends, I spend coding
some open source pretty much,
and I'll do some Scala development in
the ZIO ecosystem, and then miscellaneous
stuff here and there.
That's awesome. And Mike, everyone knows
presumably who you are in the Effect
ecosystem. But for those
two who don't know, would you mind
briefly introducing yourself?
Sure. I'm Mike. I'm the original author
of Effect. I've been a
software developer for
the good part of the past 20 years. I
always worked in startups,
always kind of at the edge
of what's possible within a language. And
it just so happens that
about six years ago, I found
ZIO in Scala. That point in time I was
dipping my toes into other languages.
I mean, extra TypeScript to see if I
could bring something to
TypeScript that would make it
possible to build production grade
systems at scale. And I found the ideas
of ZIO, which I later
found that it was the project that John
was authoring at that
point in time. And I took a lot
of inspiration that became the version
zero of what Effect later
evolved in. And my personal
relationship with John dates back to
about six years ago, and we've been in
touch since. And now,
as we've announced a few weeks ago, we've
partnered officially for John
to have to date the position
as the official trainer for Effect. I
think he's a great
teacher. I've enjoyed his
workshops in the past. And I'm so excited
that he's now joining
the TypeScript evil side.
Yes. Happy to be here. Thank you.
And yeah, I just want to reflect on that
little time travel. Six years ago is also
when I started my journey on like,
rediscovering the joys
of functional programming,
where I've done a lot of like Haskell in
the past, but it always you
always kind of felt stuck in
between like, okay, here the right ideas,
but like, no one is using it. This is
like, like, all like
academia, like esoteric land, or like
you're using a programming language,
everyone is using like,
the industry is here.
But there was like, not no
overlap. And like, in 2020, I started
looking for that overlap. I found it in
ZIO and Scala. I didn't
want to have anything to do anymore with
the JVM. So I looked around for like,
where are those ideas
in TypeScript? And sure enough, a crazy
scientist named Michael Arnaldi was
already exploring that.
This is where we then teamed up to work
on Effect. And very
shortly after, we actually came to
to see you in person in Malaga, where we
went to the the ZIO conference. Yes.
Exactly. And this is where like the early
Effect team was like coming
together, we met the first
in person. And we sat in the the ZIO
talks, like been like simultaneously
hacking on TypeScript,
talking to other like Scala developers
like, hey, have you like, are you also
using this TypeScript
thing? And everyone was just like
laughing about it. Yes.
And we were absolutely outsiders
well, we should have had a real time
TypeScript translator,
you know, for you guys.
But, well, so the tables have turned a
little bit. And now we're sitting at the
same
tables. And I couldn't be more excited
because like, we're we're
caring about the same, the same
intellectual things have like,
tickled our neurons before. And now we're
now we're working on
the exact same thing, which is so
awesome. But before
getting lost in nostalgia land,
I actually want to bring back the
conversation into today. And like, six
years ago, we could have
never imagined which of a weird situation
we're all in today. Like for
basically, as long as I can
remember my experience as an engineer,
just kind of like compounded over time
and added up. And like
my relevance as a senior
engineer has kind of been
like, as time progressed has just
become more valuable. And with
coding agents, etc. I would argue the
that is still equally
value, if not more valuable, my
experience, but also 99% of my experience
can now be replicated
by someone with no experience through
coding agents. So it's such
a weird time, I think it's
everyone, me included is trying to like
figure out like wrap their
head around like, what is like,
what is it worth learning? Which sort of
things just don't matter
anymore. And so I'd be very
curious to frame this conversation with,
like, what the two of you think
programming or software
engineering as such would look like in a
year or two years from now?
Yeah, I think that's a great question.
And one we're all trying to
figure out. I think we know
what it's not going to look like. It's
not going to look like
people typing into IDEs anymore. I
think we're already past that for the
most part, at least the
people who have gotten AI, which is
still a small fraction, I think of the
overall space developers,
you know, it's not that we're
on typing code into an ADI. Are we still
prompting? Are we like Elon
Musk's vision is almost prompt
enter in a prompt and you get assembly. I
don't think it looks like
that. I think he's totally
wrong on that. I think we're still going
to be using programming
languages. I think we're still
going to be directing steering agents. I
think we still have to be
involved in these kinds of
decisions. The type of technology that we
have in AI is, I think best
understood is mining training
data for intelligence rather than sort of
de novo intelligence. And I think
implications for that,
for our career, mean that our job as high
level thinker, systems
thinker, is still so critically
important. We have to be there and we
have to find ways, I think,
and invent ways to understand,
deeply understand the structure and
quality of code, even in a
world where every poll request
has 20,000 lines of code. And I think
that's a very interesting
question. What are we going to be
doing a year from now? Or we're going to
have ways, I hope, of
understanding our software systems
without having to review every single
line of code, macroscopic
structure of our program and
quality, quality metrics. How is this
thing actually running?
And probably a feedback loop
is going to be tightened between the
moment when a defect
happens and the fix is introduced.
We're going to have to narrow that down
as we attempt to try to
get a handle on the quality
issues with today's models, which of
course have gotten a lot better. We have
a lot more work to do.
Michael, what do you think? I couldn't
agree more. I feel like
the role of programming languages is
changing over time. They
used to be the way we express
concepts. Now they might be an
intermediate
representation of those ideas.
But I don't see a future where we become
irrelevant. Of
course, we are very close to
the software engineering aspects of it.
So it might be that we are
too internal to see it from
the outsider perspective. And I usually
like to look at other
fields that I'm close, closely
attached to, but I'm not so deeply
entrenched in. Mathematics has been a
great passion of mine for
the good part of my life. And I'm a
mathematician by training
even though I never finished the university.
I know, John, you share the evil aspects
of being a mathematician by training. And
recently there has been a huge influx of
conjectures that have
been proven with AI.
And first of all, I never expected that
to be the case. Even if you asked me a
year ago, I would say
completely crazy. The AI cannot prove
something like, you know,
I think recently the Jacobian conjecture
had a counter example
found the area does you need
distance conjecture, but I think that
there are probably other three or four
conjectures that have
been either proven or disproven with AI
assistance. But I
went deep on that on that
rabbit hole and I tried to replicate the
findings by myself and do it
by myself. Of course, I'm not
I'm not an expert in algebra. I'm not an
expert in differential
geometry. I could go nowhere.
I would stumble. I could never
find the counter example. And then
Terence Tao, which is like a God in
mathematics terms have
published his own chat with chat
GPT his own chat history discussing the
conjecture. I was like,
okay, the model is insanely
powerful, but only only that level of a
human can can make the model
do that type that kind of stuff.
So I feel like the relationship between
the driver and the model
is is a is an essential part
of the equation here. And I think you've
probably seen as well as I have that
AI is like it's almost in a sense the
world's greatest tool and
tools exist as amplifiers of
human potential. And so like the
difference between mediums
sort of skill, but you know,
not exceptional engineer using AI and an
exceptional engineer
using AI is night and day
and exceptional like I have one person in
my Golem team, for example,
who is is just like coding
probably like a full team, right with
with quality and code ownership and good
architecture and all
of that. And it's astounding to see that
because AI is the only way
that that person could have
gotten to that level of productivity. But
I've also given AI to other
people and they do see some
improvement, but it's like,
okay, you know, 20% better.
So to lean into that a little bit more,
how do you think the like
quantity of software engineers
like professional software engineers,
people who make a living
through software engineering,
how do you project that to evolve over
time? So, Mike, your
reference in regards to mathematics,
there's only so many people who can like
even still understand what
all of that means. And the
floor of like how good a coding model is
constantly keeps rising.
So that said mean like if
one interpretation what we've been just
talking about is basically
only humans that are both
that floor can actually still
successfully wield coding models and
coding agents. And that's
like fragment of the software engineer
population basically
keeps like narrowing.
Like how do you think about that? It's
almost to me, it's almost
like a paradox where you could
in theory have a lot more people that
could now do successful software
engineering just because
there are no more to have more
capabilities through those
more powerful tools. And yet,
at the same time, the pool of engineers
who are like above that
floor, kind of keeps shrinking.
So, do you share that perspective? How do
you make sense of this?
So, I've been thinking about this just
I talk to people all the time from
all sorts of different
industries. And for example, this very
small marketing agency
had started to go into the
business of website design. Why? Because
they can now with coding
agents. So, they had the ability to
create a beautiful design and brand
colors and all that before in the old
world and the new world,
they can actually build out a full
website. And so, they're
doing that. And they're doing that
at cost points that like old fashioned
shops, website development
firms would not be able to
attain. So, they are legitimately they
have moved into
software engineering. In a way,
there's more software engineers, right?
Through all of not
just marketing agencies,
but I see this everywhere. More people
are building more
things. So, I think the number
of software engineers is increasing, but
also those software
engineers, the new ones who are
vibe coding, they're not making the same
amount that I'm making or
that you're making or any of us
are making. And also like in Silicon
Valley, right? You have these software
engineers who are making
$2 million a year in annual salary.
Ridiculous. How can you do that? Well,
you can only do that
at a very few companies and only if you
have the right background
and demonstrate the right level
of productivity. And I'm sure these
people do. I'm sure they're worth it
because otherwise they
would be replaced by someone else. But
that spread, I think, is
probably a trend line for
the future is that there's going to be
more software
developers, at least in some sense,
of being able to actually use a coding
agent to build things that previously
only like the computer
science guys could build. But the spread
of the salaries is going
to be greater than ever.
And the people who are old school and you
train on old school
methods, you know, I think,
have deep expertise and successfully
migrated to the new world can actually
make a great living.
And then lots of other people will be
doing software engineering
at rates so that we never
would have gone into the profession for
right, because we could
just do something else that
maybe we wanted to do just as much. So I
think more software
engineers, but also more spread
and salary, that would be my guess.
Well, I definitely share
the perspective and the gap is widening
massively. I see
old people in a sense
that stopped coding years ago, that are
now back full speed coding because they
enjoy welcome back uncle Bob.
Thinking of other other people that but
the the point stands and the fact that
software engineering is becoming more fun
and more accessible is
gonna inherently attract
more of the curious people. And I've also
seen like juniors who
joined the field a year or two ago
that are making exceptional progress at a
rate that would have
been completely unfeasible.
I think it is a new tool. The new tool
allows you to maximize for the for the
direction you want to
maximize on. I feel though there I've
made a chart that went viral
on x.com a few weeks ago,
where basically my statement was the the
top developers are
becoming even more top and the
bottom developers are becoming even more
bottom. Because if you don't
have the mindset of wanting
to improve your risk is you're gonna
saturate your you feel like
you're productive you feel
like you know what you're doing and
you're gonna do a lot.
But you're never gonna cross
any boundary of understanding or go deep
in any sense. And that's
not the fault of the model.
That's the fault of you as a developer.
But as a junior is very hard
not to fall for these traps.
I remember when I was a junior one of the
traps was I felt the need to
watch every single conference
talk at every single conference in the
world and I've lost hundreds
and hundreds and hundreds of
hours consuming content that was
completely irrelevant to me. And I
started thinking, oh,
I should use this database because Google
engineers are using this database. When,
it makes no sense for my use case. It
took me years to realize
what I was supposed to do as
an engineer to become better. I feel like
AI gives you a boost. But
if the boost is used wrongly,
you can boost yourself to your death
spiral. I really like that
perspective. And I think that
also helps reconcile something that a lot
of people are worried
about, which is like that with
that raising floor of like how good
coding agents are, that
it could be almost like a
perspective where only if you have so
many like years or decades
worth of experience already,
then you're good with AI and people
before that are going to struggle. But I
think it's much more
about like, what is your learning
velocity? And coding agents also
help you learn things
faster. I think it's not just a great
time to build, but it's an even better
time to learn right now.
It's almost like in the Olympics or
like any sort of like field, typically,
the level of like what great looks like
also steadily climbs
over time. And I think there
we're also in terms of like how fast you
can make progress with
like what accident looks like.
That ceiling is like growing at an
exponential rate as well. So
I think the field of like for professional
software engineers, I think the new
normal has to be that you're
like growing in a similar rate.
And I think that kind of helps
reconcile that. So the
current level of experience, yes,
that's a great starting point. But I
think to stay competitive, I think you
just need to like be
as fast as a learner as like the best
current learners are. I
think that's all that's going to matter.
And that's how we make new people,
new really good software engineers.
I also want to share the perspective that
was recently shared by
two pioneering in our industry that
Salvatore Sanfilippo being
the author of Redis,
who is now old, who's now
antirez, of course, he's an icon
in our field. Yes. And
he's been recently sharing his
takes about AI. He has an interesting
project about local AI
running model locally. And the
perspective I wanted to share goes along
the lines of the average
engineer cannot feel the difference
between Fable, Kimi K3 or GLM 5.2. Yeah.
The expert engineer feels
a world of difference. Yes.
So when we think in terms of model
capabilities, they're
biased from our own experience,
we might feel a model is way better than
another model. But it's
actually because we can
leverage that model. That's right. The
average engineer is not that
capable in a sense. And I'm
not saying they cannot become that
capable. I'm just saying that
it requires a lot of skills to
use those new generation models at scale.
And even us, we're like,
with Johannes we've
been having conversations over the past
year or two. And they were like, we
change patterns every
few months. Now I treat the agents this
way. Now I treat it the
other way. How do I get it
the most out of it? And it's a very
evolving ecosystem. So
yeah, I just wanted to share his
and curious perspective on this because I
think it's very true.
So maybe to slightly shift the
perspective, the two of you are among the
greatest minds that can
think of new abstractions that give
engineers and now by
extension also coding agents
more leverage. The abstractions that come
to mind here is clearly
what ZIO has given us,
what the effect type is, layers, streams,
all of that. And those
are, based on years worth
of pain and suffering, of having to deal
with a lot of Scala,
having to deal with a lot of
JavaScript and TypeScript. And this
emerges out of a lot of
complexity and through osmosis,
spending a lot of time with that and
thinking, "Ah, this can be better
expressed in a more elegant way
also based on actual academical
research," etc. And so this
was made for the materials
of that given time, like programming
languages, systems, trade-offs,
affordances. And now we have
this fundamentally new gravitational
field of things that matter
and things that don't matter anymore
one lens I like to use when looking at a
new technology, a new
framework, a new practice,
it's like it's half-life time in the age
and acceleration of
AI. Should I even bother
learning that? Will this be like learning
a Webpack config thing
that doesn't matter anymore,
like in a year from now? Now learning a
thing might not matter
in a week or two from now.
So this is a whole range of questions I
want to ask from here.
One of it is which things
do matter, which things are worth it,
really investing into,
getting better at, which
category of things might no longer be the
best field to invest your
time into. And then maybe
at a later point of the conversation, do
you have a hunch of an
abstraction of or something
that gives us even more leverage for how
we construct and define
software? But maybe starting
with the first one first, what are your
rubrics on thinking about
categories of things where it's
worthwhile to spend your time and
attention and energy on
versus categories of things to
avoid because the half-life times are so
short? Yeah, I think
that's a great question. And I
think that there's a huge number of
things in our education as software
engineers that even if they
don't apply literally to the new world,
still they train us in ways
of thinking about information.
And algorithms and architecture that is
so incredibly useful when
you're building software
through coding agents. Example is just
like the better debugger you
are, right, if and I'm talking
low-level debugging skills, firing up
debugger, loglines, all
this stuff, distributed system,
you know, complicated, only reproduces an
AWS, the East one or
whatever, that sort of level of like
insane ability to find a problem. Even
though you're not going
to do that now, your coding
agent is going to do that now, right?
Probably, but still having the
ability to think in terms of,
okay, I need a hypothesis and I need to
either validate or reject
that and I need to iterate on
this cycle and I need information, right?
That's one of the things
about debugging that debugging
teaches you is that in order to make a
hypothesis about malfunctioning software,
you need information
and the more information is better. I
mean, you need to be able to
sift through that and maybe
the wrong type of information is bad, but
you need feedback from
the system. And so this
knowledge that you gain from becoming a
good debugger is useful
when you go into coding
agents and your coding agent produced the
wrong thing. And now you
have a hundred more things
like that one thing that it produced and
you wanted to have it produce
it, but the prompt you're using
or the workflow or the plan, whatever
your system of agentic software
engineering is, it didn't work.
Okay, you're debugging something. You're
not using the same print
lines anymore, but like, you know,
you need information from the system. So
you have the conversation
history, you have all this stuff
and then you're like, okay, well, I need
a hypothesis and you form
the hypothesis and you test it.
So I think like ways to think better are
always in vogue and you
know, math and computer science
and abstract hours or all this stuff
here, it teaches you how to
think. And so these thinking
skills and reasoning about systems are
never going to go out of
style, at least, you know,
not in the next few years for sure, maybe
in the far future, but for now,
we have to know how to think. And I think
learning how to think is
useful. And also like an analogy
that my mind keeps coming back to his
matrix where like you plug
in and you download Kung Fu.
Okay, that's the new era we're entering,
right? Is our agent needs
to learn Kung Fu. So we just
push the button and now our agent knows
Kung Fu. But like, how do
you know how to choose Kung Fu?
You might not want your
agent to learn Kung Fu.
They can only learn like 20
things, right? Before it runs out of
context. So like you have to
become an expert, you know,
in Kung Fu per se, but in knowing when to
choose boxing over Kung Fu.
Okay, so I think that I love those two,
like analogies or like
perspectives how to think
about it, I actually want to push back
against the first one and
like widely underscore the
second one. So like the first one you've
mentioned, I think is like
really, really broadly applicable
to the I would say the majority of like
what software engineering
budgets are currently spent
on. And I would make the case that maybe
here's actually not the
best use of our time to like
trying to absorb the entire problem
ourselves. Like this is pre coding
agents, you could basically
just observe maybe like maybe you're
building Uber and like
you're getting those sort of like
reports. And then like you can kind of
like track over time, okay,
we're getting all of those
reports there were being triaged. And
then you say, okay, this is worthwhile
looking into like a team,
starts looking into that. It's not
obvious. So you start like
looking for logs, maybe you
realize you don't have enough logs, you
like add more logs, you see,
like you try to reproduce it
somehow load in your head. So I think you
now have like two paths
with coding agents, how you can
pursue that. One approach is basically
just collaboratively with
the coding agent, trying to make sense
of the entire thing and
always like having it, even like
still trying to attempt
to load the entire problem in your head.
I think that's one approach.
The other approach, I think
is much more of like what I would call
like closing the loop. Basically, what
prevents a coding agent
to like address the entire thing just
with high confidence just
by itself. And I think the
addressing it just by itself with high
confidence is very similar
to what Mike described before,
with like the now solved math problem.
Like this is where like
the verification loops etc.
is already closed. So it's just a
matter of like, a very
inefficient way would be like to
brute force to go to the solution. So
like clearly here intelligence
pays off. So with that second
approach, I'm kind of posing the approach
to say, actually, we don't even try to
attempt to understand
the problem. All we care about is like
working through checklists
of like, do we have maximum
observability here? Are we following like
those distributed systems
best practices? Do we have
proper test coverage for that and
basically just like building, enhancing
the machine that looks
into it. And so I think that part is
going to be widely automated and like
also through systems
like effect is almost like automating the
bulk of this. I think
where it matters more is like
knowing like, okay, here I need control
here. I need like
whatever I need to be a diver.
Yeah, and that's what I was saying in the
first part was really that ultimately,
whether you're working with agents or
you're doing work
yourself, you need to understand
system thinking, and information flow and
all these other things
that like, once you understand
that, they translate from doing it
yourself to applying that
like closing the loop in AI.
Why do you do that? Well, you need a
feedback mechanism. Why do
you need a feedback mechanism?
It goes back to the scientific
hypothesis, right? You need to be able to
create a hypothesis that
can be falsified. And then once you have
that, you're in business
and the agentic and analog
of that is some mechanism, whether that's
running the TypeScript
compiler or whether that's, you
know, it depends on the domain, but you
create that mechanism and
feedback and then suddenly
you can get an agent to fix its problem.
And I do think that like on a
day to day basis, that's what
our job looks like right now is getting
the agent to fix its own problem by
engineering the system
in which the agent runs. Exactly. And I
think this is what it's
going to be all about. Like,
how can you think of like what you're
building as a closed loop? Like what is
like the most elegant,
like we're still like going for like
elegance and like we're
trying to build the entire thing as
efficiently and as simply as possible.
But I think it's more of
like how do you express and
compose the entire thing so that it can
be self verified. And
this could be through like
invariants through like a clever
architecture. And this is
like the, this is where like,
knowing Kung Fu, this could hear me
like you want to use an event source
architecture or like,
an actor style system. This is like
what it means to know Kung
Fu. I would even make the point
that like, if you have more tokens to
spend, you can
basically just like try it all.
And see like, what works best. Yes. But I
think this is also
sort of like the window
ahead of us, the time window ahead of us
where us knowing when to
choose Kung Fu versus something
else is like that, that gives us the
right to be software engineers.
Yeah. I think If I were to challenge a
little bit the
perspective, I think that works
because both of your minds are already
trained in this specific way. Going
through years of debugging yourself, understanding
systems yourself and so on and so forth.
I'm not sure it can work equally as well
for a non-trained mind is I can make a
very recent and concrete example.
I'm trying to stretch the, to find the
boundaries of the
capabilities of the models,
of new generation models like Kimi K3.
And recently as a
weekend project, I was like,
I have effect in TypeScript. I like it
more than Python, of course. But the
whole AI stack is in
Python. Trainers, Tensor mathematics, and
so on and so forth. I say, okay, let's
build the equivalent
of a PyTorch in TypeScript. It's not
something I would have ever
done before, because obviously
it would have taken me months and months
of work to even architect
that. And in a weekend
I'm already at a point where
I can specify a model, I
can specify a trainer, I
can specify an evaluator,
its performance comparable to the PyTorch
implementation. It's fantastic. But this
morning, I run a very small training job.
I see that it slows down over time. Okay,
what why does it slow down? And like, I
tell my agent, hey
let's make a benchmark.
So let's close the feedback loop. Let's
prove that it is slowing
down. And then you investigate why
it is slowing down. And the agent
crunches numbers for two hours in a row
and makes 100 different
hypotheses. Disproves the 100
hypotheses and was in
a loop, in a concert.
At some point, my engineering mind was
like, let's stop the
agent, let's tell the agent,
check the memory allocator, because I
have a back end in Rust,
and I have a basically an
interface in TypeScript, which is a
garbage collected
language, that the memory layout
of how JavaScript allocates and
deallocates objects doesn't quite map the
Rust infrastructure.
And two minutes later, it found a bug in
the library that I was
using on the Rust side,
which is candle from from Hugging Face,
fix that bug, my program now runs
correctly with the right
input, it took the agent two minutes.
Yeah, by itself, it crunched
number for like an hour and
a half, absolutely going nowhere. And may
never have solved it. It
may never have had solved it I'm
not sure. Yeah, maybe I try on on an
experiment, let it run for 24 hours, see
if it can get to the
same. But I think this is where like the
the engineering mindset
and the ability of like
choosing kung fu is essential. And I'm
not sure how I would have
done it without my level of
knowledge. I'm not sure that's just
enough. What closing loop I
feel like you still have to be in
the loop you close? I think that's that's
a great example. And I
think still just trying to think
through what would it mean to close the
loop here is probably
still like a very interesting
thought exercise since for this
particular scenario now, you could
basically build yourself
like a higher level harness that has like
that goal. And then maybe
you have a separate supervisor
agent who just constantly looks for like
a bag of evidence like
what are we looking at here,
formulates hypothesis of like, what
could be the problem, spawns off like
swarms of agents that
like look for that, maybe one of them
strikes gold says like,
aha, like stops that one like,
and so if you have enough tokens to
spend, I think you can get further
there's probably like
new problems you're now running into.
Well, that's what I did though. I did
exactly that and ended
up spending $1,000 in in in tokens on
Kimi k3. So I was doing
exactly that. I'm sure like if I
if I had $100,000 in tokens, maybe that
would have been the
solution. But we even the middle.
Yeah, yeah, at the very least having that
knowledge of all these different systems,
knowing software hardware sort of end to
end enabled you to take a
shortcut that dramatically
completion of this feature. But I think
that there's still
something in here where,
before coding agents, it would be
unthinkable, like we would be the only
way how those solutions could be
attempted. And I think now
there's like a very credible path,
how those solutions can be worked out is
just a matter of like
something being economically
like not useful to even attempt and or to
even attempt yet. So like
coding agents are getting
more capable at like a comparable price
point. So there might be
like very real problems that
might be not feasible or economically
useful to attempt today that
you could attempt in a year
from now and get a different outcome. But
I think just like
coming to terms with that,
that's like also another form of like the
bar is raising in in terms
of like what is feasible and
in relation to that, like what is our
role, but maybe bringing
back the conversation to
what are like timeless skills to invest
into or like timeless
things. So like
general system thinking, like I
definitely, definitely
agree. I mean, even like one
hypothetical way to think about this is
in the same way as like how
we automated like a lot of
physical labor to an extent that anything
that's like we have
excavators or like we have
things that are no longer only depending
on our muscle power,
but like we have machines
that help with that. And to offset for
that, a lot of people now
go to the gyms. So you could
basically say like, okay, we're getting
good as like some system
level thinking as an equivalent
for like the gym for the mind just to
like not like, like,
ostrafy too much. But yeah,
I'm curious, like, how
are you thinking about that?
Yeah, I think gyms for the mind, I think
I've heard a lot of people
talk about this, which is
like I'm, I've been using coding agents
for months, and I feel like my
skills are atrophying. And if
someone stuck me in front of a computer
and asked me to do anything,
I would get stuck and not be
in progress because I don't have my
coding agent with me. So I
think we are in a way becoming
addicted to our coding agents. What is a
gym for the mind look like? And what
sorts of things might
we do there? I don't know exactly. But I
do think that like, there
are skills that are independent
and independent of the tools that you're
using. And the example is
like, debugging is just an
example of like the scientific
hypothesis. How do you learn? How do you
learn information in an
uncertain environment? And that is
fundamental, like rational, logical
thinking. The notion of
experiments parallelism, right? That's
another example of
something that's not going to change
and knowledge of parallelism is going to
be useful. Hardware
hasn't changed that much. And
learning a lot about hardware can help
inform you when you're directing coding
agents to solve some
problem that might involve trade offs
between several different
dimensions. And it can't pick
you up. It can't be used for you.
Otherwise you're going to get
something that's not useful.
So I feel like there is a number of
topics that are probably not
going to go out of style and
that is still going to benefit you from
understanding. And
probably there's going to be
things that we can do to keep those
skills up to date. An example is
actually, I'm not even sure
how long or how much longer this will be
relevant. But I went to, I
wanted to do an async version of
streams for a new library in ZIO blocks.
And I wanted this to be
as close as your allocation
as possible because allocation has such a
high cost in the JVM. And I had a
specific idea in mind.
I told my coding agent do this. And you
know, it spins around
and looks all the files and
figures up, comes back to me and says,
sorry, it can't be done. I'm
like, yeah, okay. And I argue
with it back and forth. And it's like,
okay, I'll go off and do it.
It goes off and tries to do it.
And it comes back later, an hour or two
later, it's like, sorry, it can't be
done. Yes, it can be
done fine. And I type out the Scala code
inside the chat and I'm
like, do it exactly this way.
Don't vary. And then it goes off and does
it and it succeeds. And
then, you know, I've got the
benchmark in place. So of course, I use
that to just iterate for
some number of iterations until
things stop improving. And then I'm
goal, right? Something
that's super fast, but that never
would have happened. Probably never. I
mean, like you say, maybe
spinning off a hundred, but like
that type of knowledge is not going to be
known by software engineers
in the future. They're not
going to know that. So what's going to
happen? Well, I guess the
models have to get better,
right? Because the junior software
developers who are learning by coding
agents are never going to
be able to do what I did in that case.
And that's probably
Michael, your experience that you
mentioned before is like, there's some
things that the new way of
programming is not going to teach
you. And we can hope and cross our
fingers that the agents will eventually
get there or parallelism,
spend more tokens solves these problems.
But we don't know that for certain.
And that there's a very nice parallelism
to something that I
think Mitchell Hashimoto said
recently where he was. Maybe it wasn't
him. I don't want to necessarily
attribute a quote to
the wrong person, but someone of the
level of Mitchell was
working on a, on a problem and
told the agent to optimize it as much as
possible. And it was like the agent
actually found a 5x.
Which is quite impressive, except that I
already know how to make
it 20x and the way that the
agent started. There's no way it could
have ended. There's no
path from here to there.
Local optimum.
Local optimum. And I feel like all these
levels of skills, let's not be completely
doomers and say that maybe some junior
engineers will reach that
level. But I, if I were to do so,
I would not know how cause that that
literally comes from years of fighting
with coding and coding
paradigms and so on and so forth. I think
like some interesting
takeaways from this though,
is that the, even the five X improvement
is already great. And
for like most systems,
that's probably just going to be totally
fine. Let's say
Mitchell has given that statement
and let's put that in the context of like
ghosty or like any sort of
things that he's working on.
This is for having software feel that
premium. Yes, you don't want
to be stuck at a local maximum.
You want to be at a global maximum. You
also want to like, since
complexity kind of compounds over
time, typically in an exponential way,
you also want to
simplify the system as much as
possible. So as much as matters that is
like at the global
maximum in terms of performance,
maybe it matters even more that in the
process, you don't 10 or
100 X the complexity of your
system. So I think kind of figuring out
what is like
a measurement for
complexity. I think that is something
that I'm very curious
whether we'll find more credible
answers for that. So this could be almost
like a different definition
of like what it means to be
a software engineer is kind of like you
fight accidental
complexity. This is like you're trying
to put the system as simply as possible.
And yes, that something works
the way
You want it to work. That's already
great. But if you do that a lot of times
in the context of a team,
you're going to have so much more
complexity at your hand if you had a
little bit more resistance
while you're working on this and like you
fight maybe harder. So I
think this is like another
kind of quality. And I think a worthwhile
like framing of what, why
it still matters to gain
that experience that you can basically
push back and say like, yes, it can be
simpler. John, like you
said, like when the coding agent says
like, this is not possible. And you say
like, yes, it is possible.
Even just like, like maybe not
everyone has the exact solution in their
heads, but maybe they
hunch that it can be more simplified.
Like I think this is where
it really matters to
go with that and keep overall systems as
simple as possible. And I
think this is also a nice way
to bring it back to ZIO and Effect. So
it's like, this is the
material that allows us to define
and build and compose a system out of
that overall, I think gets us
much closer to a global maximum
in terms of how simple a system can be
expressed compared to other kind of
material. So maybe this
is, well, I'm sure we have like plenty of
other areas that we could
indulge in in AI land. But
maybe let's use that as like as a segue
back in into the realms
of like Effect and ZIO.
I'm very curious to hear your thoughts,
John, as the author of
ZIO who've like you've
very, you've sweated each detail about
ZIO, about each abstraction,
etc. And now you're entering
the House of Effect and like trying out,
trying on clothes that are
kind of like similar to the ones
designed, but they might feel different.
So I'm very curious, what
does that feel like? Where do
you feel like, oh, like those shoes are
actually nicer, but like man, those
pants, they're not like
the ones I've made. Yeah, well, honestly,
I think that the real
breakthrough of, or at least one of
the real breakthroughs of Effect TS is
taking some of the ideas in ZIO and
making them accessible
in a way that's idiomatic in TypeScript.
Because, before I started
digging into Effect TS
and looking at how it's made, how its
pieces fit together, the type
signatures, what programs in it
look like, I would have thought that it
would be different than it
is. And then in every single
case where like, oh, why didn't they do
it that way? I'm like, oh, that's why
it's that the usability,
the DX would have been horrible. And
probably for the final finished polished
product that I'm seeing,
Michael you, or you know, another
contributor explored like five or 10
different iterations,
and you found all the dead ends. And I
can't see all those dead
ends, I just see the finished
product. But in most cases, I've been
able to release in the most in
the cases where I've actually
pursued my idea for, oh, why isn't it
like this way? I found out, oh, actually,
there really is a good,
there's a good reason for that. And this
is why Effect TS has the
adoption it does is because
it's not just a one to one port, it is
its own way of doing things. And some of
those design decisions,
you know, I like like, for example,
schema went in a different
direction than ZIO schema,
I mean, not radically different, but
different enough to be noticeable. And
actually, it's quite
nice. And comparing that to ZIO schema,
like, okay, well, ZIO schema gives us
this, but this is like
out of the box thinking here, this is
someone who took the goal of
ZIO schema, but not the details
and arrived at a totally different design
that actually is quite
interesting. And you know,
you can imagine that existing in Scala,
maybe it would be great.
And yeah, probably even 100 different
iterations, not just 10.
A lot.
Of mistakes.
It's obvious that there was like, and I
love it, because you can't
find a global optimum until you
find a lot of local optimums and throw
them away. And you've, I
think, come very close to that in
Effect TS maybe even gotten there.
And I think look, to me, the reason I
like ZIO and I took
inspiration from ZIO is not really
the language element or how I read the
code. It's rather what that paradigm
gives me. At that point
in time, I was running a FinTech as a CTO
and we had a very small
team. It was very challenging
because in FinTech, you are highly
regulated. You need to build solutions
that are proven to work.
You're just not, you cannot just hope
that they work. Like, it
works on my machine there,
doesn't really work. You have to prove
that it works in the
deployment in US East One,
in AWS, in all the regions and so on and
so forth. And what the
ideas of ZIO gave me,
like this high level representation of
code very close to human
that could be transformed and
refined, made dealing with errors
exceptionally easy, dealing with
testability exceptionally easy,
dealing with telemetry completely
different story compared to the other
forms of code that I ever
wrote in my life. If we go back to like
today in the age of AI and
looking maybe even into the future a year or two
in advance of like, what are we looking
at when we look at software?
For sure
we should read code. And I know this is a
controversial take,
but it's not enough to
just look at code when you're about to
merge a 2000 line or a
20,000 lines of code PR,
like John, you mentioned before, what are
we looking at? And I
think things like telemetry,
things like system diagrams and so on and
so forth are essential
to the future of software
development and heading a high level
representation of code such as ZIO in
Scala or Effect in TypeScript
gives you those things for free.
The code that your agents
produce is automatically observable
is automatically testable
you don't have to infuse your own
experience as an engineer to make them
testable at this level.
I feel like this is what I really like
about this way of programming.
It gives you the right primitives. And
once you use these
primitives, a whole host of problems
are solved for you. And that reminds me
of that post by Amplify Partners,
The primitive is the product
by Lenny Pruss, which sounds like
an ad for Effect TS. I
mean, among other things,
did you put them up to that, Michael? I
think it was a different
ad for a different company,
while it applies very well to Effect too.
It does. And it's like
in an age in which like,
you can make code for free by pushing
buttons, what matters, it's
the shape of the primitives
and how they snap together to solve
problems. And Effect TS has
that. It's those primitives
that can be used to efficiently solve a
huge range of problems in building
reliable cloud software.
Not only do the
primitives still matter,
the primitive is the product, as Amplify
would say. But also,
even if there's some ramp up
curve to learning the primitives, it
doesn't really matter
anymore. And that is to say,
we can choose better primitives in the
era of agentic coding
than we could before, because
before you had to convince a bunch of
humans to learn stuff. And
you don't have to convince
agents to learn stuff. I can snap your
fingers and they already know
it. So you can choose better
primitives. And that's what's Effect TS,
better primitives for
building reliable software. And you can
make your coding agent use it, even if it's
never seen them before. And
I think that is like it's,
even though functional programming often
has said to have failed,
even though the way it succeeded
was Effect TS, right? And other similar
things like that, the way that it
succeeded. It's like,
this principled approach to building
things with primitives is
actually more feasible now,
because you don't have to convince
developers to do it.
I think it's almost like a way of like,
if you study the emergent
behavior of those systems,
like when you build with Effect, do you
as an emergent property, do
you end up with a giant mess?
Or do you end up with something that's
like, I like to look at
this kind of like through the
lens of like a fractal. Like when you
look at a fractal, no
matter which like zoom level
like that, like you can still sort of
like into it the shape and
the complexity of the overall
system like what you can currently look
into. And then you zoom
in like a given situation.
And then you can still like make sense of
this. And I think Effect
has like that sort of property
to it, that no matter which level of the
system you're currently
like exposed to, you can make
sense of it. And like it doesn't give you
like a false story of the
like oversimplification,
you basically something looks like a
pure function, it definitely isn't.
And so I think that matters even more.
Because like in the same way,
it helps you to kind of like
trust what you have here. It matters
equally, if not more for a coding agent,
because now they can
work on their stuff with like their
assumptions, kind of like playing out.
And I think that's like
one of the most beautiful like properties
of Effect that go
hand in hand with like how
compositional it is. Yeah, exact
composition. That's the keyword
compositional, right, which
leads to that fractal structure, and
snapping together solutions
from building blocks. And that
was my old argument for selling
functional programming is learn
functional programming,
because it's compositional. And the fact
that it's compositional
will help you understand the
software you write better. And people
were like, why would I
ever want to understand it?
And that's why FP failed. But actually,
agents, they do a much better job of
maintaining code that
they quote unquote understand. So it's,
it's a killer argument for
an agent, whereas for humans,
you know, humans are lazy. So I want to
see whether you have
maybe pointers or advice
for engineers that now have this new
power of effect. Maybe I
think there's like a wide set
of engineers that squarely fit into that
bucket, where they were
aware of effect before they
maybe like intellectually liked it. But
they were just like they couldn't be
bothered to spend the
well, sizable amount of time it
takes to get really good at it. Now they
have the magic ones,
the catalyst is like, they don't need to
get good at it. They just need to tell
the agent like, hey,
we're doing this. And the same goes for
colleagues, maybe someone is like really
excited about effect,
the rest of their team isn't. And so
effect adoption doesn't
happen. I think now we're
basically with coding agents, we get like
that catalyst for
everything. And I think there's still
need to somehow fight the like
cancerous pattern of like,
coding agents, like adding more and more
and more stuff, and
doing it the right way. So I'm
wondering whether you have thoughts on
that. Things like good linter
tooling, etc, comes to mind.
But also other practices that I found to
work really well, such
as property based testing.
And so I'm just curious whether you have
any sort of advice or any
sort of patterns that
maybe you've always practiced
those, but you knew that it
would be too much for other
practitioners. But now it's actually you
can have the cake and eat it too. So
curious what you have
in mind. Yeah, well, for I think we're in
a situation where I
think a lot of people are
new to Effect TS, right? And they don't
necessarily have a background in FP, or
should they have to in
order to use it. But they might not be
in a position where they
can look at Effect TS code
and say that's idiomatic. And that's not
this needs some work, this
needs some simplification,
or it doesn't. So I think, you know, some
of my learnings from using coding agents,
are that first off, we need better big
picture metrics. And an
example is, like you can do
cyclo matter complexity, and you can do
all this other stuff. And that helps
somewhat. But we need
like bigger picture, it should be
possible for an agent to see without
looking at tokens, I mean,
like average length of a method, or a
function. And like all this
other stuff that we can see by
looking at it, but it's harder for an
agent, it's harder to make
that tangible for an agent, you
can't just sell an agent go out there and
write best practice
idiomatic Effect TS, and have it do
that, because it doesn't know what that
means. And so inserting that in your
agents.md and expecting
anything useful to come out of that is,
you know, it's a joke. So
what we need is we need to codify
what it what it is we mean, when we say,
best practice Effect TS,
and turn that into metrics
that can be analyzed, most likely not at
the level of tokens, but
at the level of the abstract
syntax tree, right, this might be
compiler plugin, I don't know if you've
done anything like this,
Michael, but like compiler plugin to like
capture all this stuff,
expose that in a compact form to an
agent and say, well, this is what good
Effect TS software looks like. And and
that tangible feedback
can be used to iterate and improve. But
one of the things that I've done is
obviously turn on linting
to the max turn on all the linters, take
advantage of very powerful
type system that TypeScript has
in trying to model things precisely make
illegal states
unrepresentable, all these sort of FP stuff
that now you can do for free more or
less. And then also letting you turn on
all this stuff. And so
the agent will find problems and fix
problems. But that's not enough.
Ultimately, you cannot make the
agent write good quality software. So you
have to have skills to
fix up bad quality software.
And fortunately, like in any given
domain, like Effect TS, for example, an
agent will make certain
kinds of mistakes that it keeps on making
again and again, as it solves new
problems. And so you go
and you have skill files, multiple skill
files or one depending on
what domain you're working in.
And you say, okay, you think you're done
now go back and execute
these, you know, commands,
right or scales, whatever, same thing.
And it goes back and it will
find all these anti patterns
that you know that it produces and it
will fix them up. And then
another thing, another technique
you can do is part of your sort of post
production and review process, your
automated review process
to have it go through the diff and say,
what had to change versus
what did change and go back and
delete all the stuff that changed, even
though it shouldn't. And that will help
maintain more stable
architecture by discarding all the stuff
that's not actually necessary. And
there's lots of like code
review commands out there you can use
that work reasonably well. But
if you're working with effect
TS, you're going to probably want to
customize them or like any
given stack, right? You want to
customize to your stack. And all of these
techniques, let the
agent write slop, clean it
up afterwards, give it big picture
feedback, make sure it's not making more
changes than necessary
and do spot checks for reviews. Test is
another big thing. I think
the way that we have of writing
tests has changed. And in the old days,
you would say write tests
so that they're maintainable.
And these days you would say write tests
so that it's very obviously
the case that they're correct,
even if you see no context and don't look
up any functions. So make
the test to be duplicated,
no helpers like minimal helpers, if any,
and be verbose and
impossible to get wrong. If you look
at it and spot check that test, and you
know, it's right, even if it's
horrible, and you would never
maintain this yourself, that's actually a
good test in the age of
agents. So just to like underscore
the last point, since I think it's
somewhat non obvious and
flies a little bit in the phase of
the traditional like dry methodology. And
I think this is really
something that has now been
flipped with with coding agents, and
maybe also just to
look at that lens of like,
which advice or practices have been
flipped with coding agents,
which sort of trade offs are
changing. Here, the dry principled has
really, like we can
renegotiate it, I think it's still
it's not like squarely, like now always
bad, like you should still
in a lot of cases still keep
things dry. But for a lot of places, for
example, in tests, where like the the
test itself has sort
of like a different kind of lifecycle and
maintainability horizon
as like the the source code
itself, we can now renegotiate that like
us like a lot of like the
best practices we came up with
was like
the human
suffering of like having to write lines
of code. Now that
doesn't matter anymore. Now it's much
more about like reading code and like
that straight off is
now broken up, where like it's now
easier, less burden to read
something and not having to like
follow like the referential points where
you basically have to
jump to that variable and
that variable. But like it's all in one
place. So I think it's just very
interesting to kind of like
revisit a lot of like our assumptions
that we've learned maybe over experience
over like the course
of like decades, or maybe academia, or
like patterns from previous
jobs. So to linger on that a
little bit, which sort of patterns do you
think we should like
revisit almost flip with with the
advent of coding agents? All right, I
think the dry one is a good one. Because
don't repeat yourself
makes sense when humans are doing the
typing and actually is is
working against you when agents are
doing the typing in some cases. I think
another one that's related to that is
boilerplate. So there's
a lot of really great best practices that
we don't do and haven't
done or moved away from simply
because of the boilerplate involved. How
many language features
have been added to programming
languages so that a human developer did
not have to write a
manual schema, right? java.lang.reflect
it's a reflection and all
it go, etc. They don't have
reflection. Why was that added?
Basically, so that no one has to write a
JSON serializer or
deserializer or the equivalent in
terms of describing the schema structure.
So in a world in which that code is
written for us and kept
up to date, and by the way, coding agents
are flawless at that,
they basically don't make
sense that that's hyper work. And you
can trust them to generate massive
numbers of schemas or
codecs in any direction. That actually is
a far better approach than
doing it with reflection,
which is going to break when someone
renames an identifier, right? All sorts
of things will break
if you change your code, if it's built on
if your codecs are built on
reflection. And that shouldn't
be the case. And it's a trade off. We
consciously said, okay, well,
we're going to do it anyway,
because humans are not going to be able
to write and maintain this boilerplate.
So I think boilerplate
is like it's almost like a superpower in
the new age. More
boilerplate is better, right? In many
cases, more boilerplate is better than
less boilerplate, just because it makes
things more explicit,
or like the days of having, as some
companies did, 44 versions of a strut or
a record. Why? So that
they could migrate back and forth between
any of them. And like
for sort of inter-service
communication and microservice space
architectures, being able to handle sort
of upgrading and still
living with different versions of a
service at a given time, all of those
things people moved away
from, they moved to JSON and runtime
validation, all that. But actually, we
can do a lot of that
stuff today. We can actually have
explicit schema migrations. We can
maintain schemas around for
older structures, as long as we want. And
it comes at virtually no
cost to us. And we can do that
reliably. So I think boilerplate is
definitely a superpower. And
we should look for more ways
we can take advantage of our ability to
generate and maintain
massive amounts of boilerplate
that are nonetheless going to keep our
applications on
track, probably at runtime,
because a lot of this
stuff has runtime benefits.
You've done a lot of Rust. And
like in Rust, one concept, I
think, is very interesting,
like the zero cost abstractions, right?
Like you get an abstraction, and the
compiler does all of
the heavy lifting for you, or different
means. I'm almost
wondering whether we should explore
a parallel aspect to that, maybe calling
it zero cost practices. What are
practices we can do now
with coding agents that are clearly the
right approach, that is
facilitated through idiomatic
patterns? So for example, instead of just
like using JSON.stringify,
or like just trusting that
data comes in the exact right shape, it
could be almost like an
interesting way to like,
enlist all of the different patterns that
maybe in the past,
you've
decided against them just
because you knew like, yeah, that's the
right thing to do. Like,
we got to ship this feature,
we're not doing that. And all of those
like, like make the right
things easy. And now they're
the right thing is like basically free.
And so we should like rewire
our brain and biases around
that. So it's like the way how coding
agents by default are
trained, is that basically just
follow like the bell curve of like,
whatever is in the training
data and the training data,
you don't have the most like maximally
principled patterns,
but you have like just
whatever is like typically
easiest and gets the job done.
Absolutely. It's an opportunity to
reinvent best practices for the age of
agents. And you know,
tailor that to even the Effect TS,
or tailor to a technology stack order
best practices for his
stack, and educating the agent rather
than necessarily the
developer. And that's where
I think tooling can help tremendously is
if there's some something
that you run, and obviously,
there's the go linter for Effect TS
right. Something that you run or
your agent runs and it
says, Oh, well, actually, you need to use
a schema here, you need a type
definition, and you need a
schema, stop trying to parse this from
JSON, or parse this from a
string into JSON, and then
manually doing dot whatever, because it's
an any that should be an
anti pattern, that should fail,
the agent should not be able to continue
at that point, giving it the
guardrails necessary to say,
I'm going to do it the right way. And I
know what the right way is,
because it's informed to me in
these best practices.
Funny enough, we've been working on a
tool that will become public
at some point in the future, not not too,
not too far. We we call
this an effect companion.
Which is a basic process that that you
run together with your
whatever coding agent you use,
that process ends up indexing the full of
your repository and
running linting in any type of
checks. But the the most interesting
element to it is that we
use the TypeScript compiler to
basically turn your codes into a tree of
types. We index
everything through embeddings.
So your agent can do semantic searches.
And you can ask the model
query such as, hey, tell me
where this error originates and the story
of the error through your application.
And it gives you the full trace, not even
a stack trace, but literally every single
line where the type was changed, where
you handle the error, where the error
turns into a defect,
and so on and so forth. And we link that
to telemetry. So you
can run a telemetry server
locally in the same process. If something
blows up, you have full
traces from the telemetry and
through semantic search and type
based indexing, you can understand
exactly what happens
in your code base. I think this type of
thing right now that
you're doing, which is very,
I think, forward thinking is going to
beat the difference
between frameworks that fail
and frameworks that succeed. Because
someone will say, Oh, I had a great
experience. I built all my
stuff with Effect TS. And how are you
helping them be successful in
doing it? How are you making
sure that everyone who uses a coding
agent to build anything with
Effect TS is ultimately has
a wonderful experience and ends up being
successful. It's through
things like this companion. And I
think frameworks that don't have anything
like this, you know, unless they're
they've been around for
20 years. And so the agents are just good
at them based on
training data alone. And even
that approach has its limits. Right. I
think ultimately, it's
it's going to come back to
are you shipping not just software, but
actually a process, a living breathing
process that has your
domain specific knowledge is embedded in
it that helps people's coding
agents be successful solving
the business problems they have. I think
that's exactly it, like
helping your coding agents to be
successful. And basically like this, this
is like two sided coin, like
one of it is we need to find
best technology that is best for humans
to like, have like just
survive in like the ocean of
complexity, where you can just like
fit the entire thing in
your in your head. And like you
can basically look at it, make sense
of it, say like, yes, that's
the way how how it's supposed
to be. Or like you recognize how it
should be improved and why.
And then the other side is like
that the underlying system, like does as
much of the heavy lifting,
by default, that is
basically, by far the the most
competitive, successful
system that like, if you give it a
certain job, it will always gravitate, it
will always converge to
the exact right answer. And
I think effect has the best shot right
now of like being the winner in both
categories. And I think
this is what makes I was excited about
like that just the first aspect at all,
like just that effect
is the best medium to just like make
sense of systems pre coding
agents. And I was also excited
about like how TypeScript helps with
this. But now all of those
superpowers just get like,
multiplied by by so much through
coding agents. And I think
that's exactly the direction
to go for. I think you've seen a little
bit of that, I assume in
the past, I guess it was like
three or four months ago, we were talking
about doing a partnership. And your
download numbers for
Effect TS for around 5 million, and now
they're 14 million or
higher. And now okay, we've been
three months, three times. 28. Oh, my,
that's crazy. So right
there. And and that's, I assume,
not entirely humans, it's got to be a
good chunk of agents that are now
incorporating effect.
Otherwise, there's some very weird human
that keeps downloading, repeatedly.
Yes. Great success
story. Wonderful to see that.
But yeah, maybe to round out a little
bit, like, you're, you're now going to
teach a lot of people
about Effect through Ziverge, etc. Like
anything there in
particular, you're looking forward to
anything in particular, you have plans
for do you are you planning
to like do an official course,
what can people look
forward to and maybe book you for?
Yeah, so that's a great question. And
first off, it's a joy to me to
return to teaching. I haven't
done teaching in a long time, and I love
it. And if it paid better, I
would be a full time teacher,
doesn't pay, but that's okay. I still
enjoy it. And I'm having a lot of fun
learning and working
with Effect TS 4. But one of my
challenges is trying to figure out what
do workshops look like
in the new era? Because I recently did
internal training, and I
just adopted a little bit,
sort of hybrid approach. And it was clear
from that internal
training I did with Ziverge
engineers, I needed to iterate in the old
days. And Michael can
tell you this, because he was
in many of them, and I had a bunch of
exercises, and we all worked on them
together, I would explain
concepts in this sort of pedagogical
portion of that and teach them. And then
we would work through
these different exercises to cement
skills, because people who
just watch me talk, or present
information on a screen, they just don't
retain it. And if they
actually go through with their
fingers and type these things into their
computers, then they actually
come out of that with having
skills and concepts cemented. And where
is that going? Well,
obviously, people are not going to be
typing into their computer unless they're
telling coding agents what
to do. And also, I think like,
in the old days, there was something to
be said for memorizing
details. And so repetition in
certain types of exercises could teach
you to memorize things.
And that's no longer super
relevant. And also the modern audience,
they're like, do you have
any cool skill files that I can
use, man? And Kit Langton shared his
skill files and got like
300, 400 likes on that, right? People
They want the little chip that you
install into your agent that
makes your agent do things.
And so I've had to rethink, what does a
workshop even mean in an
era where your coding agent is
actually doing the work? And I don't know
if I have a final answer.
I know I don't have a final
answer, but my current answer is, let me
focus on teaching humans
the high level part of this,
the big picture stuff, the gotchas and edge
cases to look out for if
your agent's struggling,
or maybe if it did something that's not
really considered best
practice in Effect TS.
So let me teach you the big picture and
also the concept, the primitives, right?
What is an effect? What is a layer? What
is a schema? Like all the
primitives that are going
to help you look at code and also direct
your agent to do things,
you might not have those
APIs memorized, right? You probably
don't. And I'm not going to spend a lot
of time helping people
memorize different APIs, but I'm going to
teach them the high level
theoretical concepts and how
they fit together so they can talk at a
high level, even if
they're not really programmers.
You should be able to talk about what
schema is for, even if
you're not a programmer.
And that's a useful level of knowledge.
And then also, rather than
like either me typing a lot or
them typing a lot, I'm providing
lightweight instructor
notebooks, which just go through and
have a little bit of pedagogy. And then I
just enter in tiny little
snippets. So you can go from
not seeing something to seeing something.
And that transition that you
see from a whole to something
that's filled in will help teach you some
things. And then I'm also
doing two other things. One is,
I'm almost shipping a mini book. It's a
mini book on Effect TS 4. And it's
structured in a totally
different way. It's structured that you
could read it in like two
or three hours. It's not a
traditional book. And it's designed to
teach you the high level
concepts, but also why this thing
exists and when you would turn to it. And
also the top two or three
gotchas. And the idea is you can
read this and you'll have like a
manager's level of understanding about
Effect TS. And you'll be
able to manage agents. But also you can
have your coding agent as
well. And I'm using partially
and other stuff to come up with a catalog
series of skills. I know
Michael, that's not your favorite
thing with Effect TS, but I still
personally like commands and skills. So
I'm going to be shipping
some commands and skills with the coding
workshop. So the idea is it's not just
for you. I mean, take
it two days, you'll have a high level
manager's understanding of how
this works and best practices
and why these things exist when you use
them. But also like you're
going to have some deliverable,
you can take out of this and plug into
your agent's brain so that
it can be more successful
in you develop them. And then I did one
more thing just because like I can,
right? I used to spend,
I would say probably four weeks
developing a workshop and four weeks
multiplied by a coding
agent is like, you know, a lot. It's a
year. So I have this game, actually, it's
a role playing game,
Zelda like role playing game where you
walk around to different characters and
they give you quests
and you learn bit by bit different parts
of the effect API to sort
of, you know, level up. And
those are your powers in the game. Oh, I
know how to, you know,
create an effect that succeeds.
And so you solve different challenges and
there's a total of 18
levels. And you just go through
screen after screen solving exercises.
That's if you want, it's not
going to be required. But if
you do that, then you're actually going
to be able to have, I think,
the mid to low level knowledge necessary
to actually write effect yourself if you
had to. So it's like
next level understanding.
I love that. And I want to underscore
like, I never would have
tried that in a, you know,
pre AI era, building a role playing game
just to have fun with effect.
I think it's so spot on that we need to
like rethink,
learning and teaching
altogether and not just like for
this for the scope of
like an effect course here,
but like broadly also for academia, etc.
But I think there's also
like we have a precedent
for that, right? Like we have
calculators we have for quite a long
time, but we have not
decided to like give calculators to kids
like right away and skip
that part. But like you
kids still like learn how to do like
basic math by hands in their head, like
on paper, etc. And so
I'm like wondering, what is the
equivalent? Are we going for the
equivalent here in teaching or not?
Or are we leaning more into like,
you get like the
calculator on day one. But I think
an underexplored mechanism to like to
learn and absorb is to
almost like flip it and say, okay,
like in coding age, like you get to like
drive from day one. But
later, what you need to do,
like your hard work is like prove that
you've understood it. Like
the the point of like you
understanding is not like, okay, the
program finally executes
the way how you want, like the
coding agents going to do that is rather
like you're going to get
quizzed later on like some
aspects of this, that only by
understanding you can answer
or maybe as a variant of that,
you need to explain to another workshop
attendee how something
works. But I think those sort of
mechanisms, I think will will play a
bigger role. And I love the
gamification aspect of it.
And then the final thing I'm doing is I'm
actually having people build
a sort of capstone project as
they go. And the idea is it's very simple
application, it's
called b can watch. And what
it does is it just probes a URL, and sees
how healthy it is. And you
can add all sorts of really
fun stuff around that. But but if you're
following along, right, and,
you know, a coding agent gives
you so much time because you're not
actually solving any
exercises yourself, you're just there
to understand, right. So also in the
background, as you're learning
about new concepts in effect,
go refactor your app, have your coding
agent go off and refactor and add this
new thing to improve
its architecture. And then by the end,
like you'll have used your coding agent
to layer on all these
different effect things, you'll go from,
you know, parsing JSON as a
string into a JSON structure
any to actually using schema and all
these other things, you know, retries,
etc, are going to be
layered in step by step. So if you follow
along, if you're learning
these concepts, you can actually
use some of your time in the workshop to
actually build something
concrete. And in doing it like
you're proving that you've mastered
enough to be competent
directing coding agents to solve
problems in a very specific way.
I also particularly love the
the point of like setting the expectation of
learning effect enough to be on like a
manager level. Since I
think this is the in like, 90%
of the cases, this will be sufficient.
Like it's, it's rare that you build
like a library grade
code where you need to care about exactly
the like we're using this combinator
instead of that one,
because it's like more efficient in this
scenario. It's much more
of like, hey, here, like our
features, like the features we want to
build, roughly having an
understanding of the
architecture. And that's of like, you're
much more trying to build an intuition
for it. And then that
like deeper experience that can be
layered on on top, but you can very well
also just build that
deeper experience in that moment where
you need to understand stream
processing a bit more. But I
think that makes you lazy in depth
knowledge. Yes. But if you have the map,
you can always zoom in.
But if you have the map, you don't even
know where to zoom into. But
at least if you have the map in
your head, lazily evaluated experience. I
love it. Yes. That's
right. I have to say two things.
The first I want to buy a
ticket to your first workshop.
I'm so curious to see, because it is a
problem I've been thinking myself and
obviously I'm nowhere
close to teaching capability at the same
level you have, but teaching in a new
world where you're not
coding. Yeah, it's crazy. It's a whole,
wholly different game. And
I think you're approaching
it from the correct angle. I'm sure once
you've done this workshop
five or 10 times, it's going
to be an absolute banger. Exactly. And
the second comment I wanted to say is
funny enough, I think
converged to a similar intuition around
skills. What I didn't like
about skills was the fact that
people perceived skills as just part of
context engineering to
give access to more context,
while instead they really work well when
you explain the how in
the skill, not the what.
So you explain that some modules exist,
the reason they're there,
but then you explain how
can use and kind of a small cookbook of
patterns and things that you can repeat.
And I've been tapping the waters in
developing this myself.
So I'm so curious to see your skill and
maybe kind of what joint effort on that.
I assume the skill will be open source.
I don't know.
I really don't know about that because
things are just changing, right?
So I tweeted the other day something like
in the old world, like software
cost money and knowledge
or information was free.
And in the new world, it's the opposite.
The software is free, but the knowledge
actually costs money.
So thinking about this is like, okay,
well, maybe if we really are entering a
world, a matrix like world where like you
download something into your agent and
now it can be an expert in that.
And that thing, by the way, wouldn't
necessarily be a skill or a command.
Could be an MCP server, could be another
agent that they call an A to A protocol.
It could be anything.
But like, as long as we have that ability
to take actual knowledge and information
and embedded, then like that single thing
can be quite valuable in and of itself.
So a real question for that I don't know,
have the answer to is my initial
inclination was open source, all that.
But then I'm like, well, you know, what
would a company pay for?
Would a company license these things?
Like what would they license?
Like you could actually see like a big
bank that has 20 developers all using
Effect TS, you could see them licensing
some sort of tool or knowledge base or
something that they can immediately prove
makes a difference in success rate and
quality and all this other stuff.
They will pay money for that.
So should it be closed source?
Should it be open source?
I don't know yet.
I will find out.
I think there's
certainly something to this.
I've been recently also in conversation
with different kind of consulting firms
that are now particularly focused on like
agent enablement, where they go into
larger enterprises and effectively the
deliverable they give those companies
is a bunch of markdown files.
That's a deliverable.
And it is well, while I don't know
whether this will still be the same
in two years, probably not.
There's clearly a
moment for that right now.
And so it's worth the moment.
Well, I feel like we've
covered a lot of ground.
I have probably a number of questions
that would take the same amount of time
again, but I think we should cut that
into a multi-part series and follow up
on that hopefully in a couple of months
from now, hopefully by then you've
already have gotten a lot of experience
and feedback on your teaching.
We're a few chapters deeper into this
entire AI saga and like who knows what
you'd like at that point, but it's
changed fast already.
Oh yeah.
But at this point, I can't thank you
enough for the work that you've done
in the past, without that
I'm pretty sure there would be, well,
certainly no ZIO today.
Most likely also no Effect today, at
least in its current form.
It's great to see it because like,
Effect TS is my legacy
in some way, like to
know that I had some small influence on
the design of Effect TS because obviously
Scala has done what academic languages
do, which is academic
things, which leads to
academic outcomes and Effect TS is just,
I looked at stats the
other day and it looks
like 4% of JavaScript developers don't
use TypeScript in any capacity.
That means 96% do.
Wow.
That's a big market.
And it's just amazing how big Effect TS
has the potential to
be and also the impact
that it can have, like how did functional
programming succeed?
The historians will ask of our era.
People will say Effect TS.
I know that makes the Haskell developer
super mad, but ultimately
that's the correct answer.
Well, there's also like spreadsheets and
React, which I guess is also function
programming in disguise.
Yes.
That's right.
Well, John, Mike, thank you so much for
spending this time together.
I've learned a lot and I'm sure all our
listeners have learned a lot as well.
And so I'm looking
forward to having you back soon.
Fantastic.
Thanks so much again for the invitation.
Thank you so much for being here.
Cheers.
Cheers.
Bye.
Thank you for listening to the
Cause & Effect Podcast.
If you've enjoyed this episode, please
subscribe, leave a review
and share it with your friends.
If you haven't done so already, you can
join our Discord community.
And if you have any questions, feedback
or suggestions about this episode or
about Effect in general,
don't hesitate to get in touch.
See you in the next episode.