003 - Phoenix Adoption, Sobelow, and Whether AI Is Making Us Worse Developers

Welcome to another episode of Macro Mayhem. My name is Peter

Ullrich. Today is Tuesday the 18th of August. We record at 11:38

local time in Amsterdam. And with me, I have my good friend Gus Workman.

How are you doing today, Gus? Oh, I'm excellent. Coming back from vacation

this week and got a lot of energy, so that's been good. How are

you, Peter? I'm good. I come back from a sickness,

so a different story last week, but yeah,

I'm feeling slightly better. But did you see the eclipse?

I did. It was, um, a great experience.

It was also unexpected because I didn't have the eclipse glasses.

Yeah, but I was with someone who had them, so I gotta,

gotta check it out. Smart. Yeah, it's always good for the— because I also

couldn't find any glasses, so I had to rely on others. But yeah, it was

good. All right, first of all, we got a couple follow-ups from last

week. First one, right? So we got a couple comments on

audio, um, particularly my audio was very quiet. We hope

that we've made some changes that make this better.

If it's better, let us know, reach out to us, give us a shout out.

But, um, if it's not, we also— let us know so

that we can do better. Yeah, probably get a mic upgrade, but yeah, we'll see.

Yeah, and I uploaded actually another version to our podcast

app, so if, uh, with slightly better audio. So if you couldn't listen to

last week's or 2 weeks ago because you didn't hear Gus,

if you want to re-listen to it now, you can, and you might be able

to hear him actually. So hopefully. Yeah, hopefully.

So the other item is I got approached by quite a few people

about doing interviews on this podcast, which I appreciate, and thank you

for reaching out. However, right now we don't do interviews. At least we're not planning

on doing interviews. This podcast is more meant for news and blog

articles and then short discussions, but not

that much hour-long interviews. So thank you for reaching

out, but again, no interviews. And if you have something to share,

just send me a blog post, for example, or a YouTube talk,

like a talk that's on YouTube, and we can feature it on the feed.

What are we? We are a podcast. Yes. We're a podcast. So we can feature

it on this podcast, which is called Macro Mayhem.

That's the one. And it doesn't have to be your blog

post. I mean, of course you can send us your blog posts, but we're also

interested in what everyone else is reading. And if there's something that you thought was

interesting, send it to us. Exactly. Yes, please. We might make it on the show.

Exactly. All right. Uh, first news item. There were 2 really,

really interesting blog posts by Praia Labs.

They were about the Phoenix version and Bandit adoption.

And these 2 blog posts, the author looked at the

download numbers of Phoenix and Bandit,

of the libraries on HACS, and then kind of made really nice graphs

about the adoption. And what we can see there a little bit is

that Phoenix 1.7 eventually got upgraded

to 1.8, and you can really see in the graphs the adoption curve.

There's still a couple of projects running 1.6

and 1.5 out there. And even some 1.7. And all

of those are by now, I think they have major CVEs.

So if it's important, these projects,

please upgrade. And then the second blog post was

about the Bandit adoption versus Cowboy. And that

was really interesting for me as well because we are now slightly

more than 2 years, maybe 2 and a half years after Bandit was released and

the adoption has reached 50% of projects. So There's

still a way to go. And if you haven't upgraded to Bandit yet, I think

it's a good option to do that soon. And the difference

between those 2, Peter, Cowboy is Erlang,

right? And Bandit was rewriting the plug spec

interface in Elixir, right? Exactly. So Bandit is Elixir-based

HTTP web server, and Cowboy is Erlang-based.

Cool. Next up, we have Sobelow,

the security audit tool that you can run in

your— as a mixed task in your project,

had a new version, version 0.15.

This one brings a whole host of changes. The changelog is pretty

big, so go take a look at it. We will link it in the description.

But a couple of big things are it has— some good speed improvements and

some nice dev experience improvements. So thanks

to Tyler Young for tagging us on this one and highlighting some of those changes.

There's, um, Sobolo skip comments. So if you have

a known non-issue that keeps getting flagged by Sobolo,

you can inline those comments and skip them.

And again, the performance has improved. So, uh,

Sobolo is a great tool. Should be using it in your projects for

security scanning, anything that's critical. Um, even things that aren't critical,

it's good for catching LLM mistakes. So take

a look at it. Good. And next up— oh,

you, you say what's next? All right, what's next?

Next up, we have friends of the show Alex Koutmos, Hugo Barana,

and Dr. Dmitri Kutmos have released

their— it's the final version, right, of Financial Elixir?

It's not the final version. It's the first version. It's their

first released version. Yes. Right. So it's

financialexir.dev. The book title is Elixir for Finance.

They have a lot of experience in

economics and financial world. I think Dr.

Dimitris Koupmos is an economics professor.

Alex and Hugo are prolific book writers

and contributors to the Elixir ecosystem.

So this is a really— it's a good resource if you're interested in

finance, Elixir, using LiveBook for visualizations,

using graphing, different types of financial graphs.

It's, yeah, it's a good resource for the community. And it's

good to see that there's still more books being published in the age of AI.

Exactly. So this is, I think, this is the 3rd book of Alex and Hugo.

They first released Elixir Patterns, and then now Programming Nerds

in Elixir. And now I know that Alex, he teamed up with his brother,

Dimitrios Koutmos, and yeah, they wrote Elixir for Finance.

So it mostly uses LiveBook and

Explorer and these kinds of libraries to do data science. Ish on

financial data. So if you're interested in financial analysis

and you want to use Elixir, this book is for you.

Next, I wanted to pitch a little small library that I saw on Elixir

Forum, which I quite enjoyed. It's called ll-amex,

and it's a Credo plugin to clean up Ash-related LLM-isms.

And I quite like it because I use Ash in my latest

project, and I do see that LLMs do certain

things that are not quite conventional, and they like to do them

a lot. For example, just to create a new query inside a

query in like an Ash filter.

Well, don't quote me on the exact key terms here, but if you have like

a filter in Ash, and then inside that filter query, they might create another

query, which is, you shouldn't be doing that. You should have a separate

filter that you can use. So these kind of LLM-isms

this Credo plugin flags, and then you can just tell your LLM, fix them and

don't do that again. And that one was Ash-specific

though, right? There's other ones? So this one is Ash-specific,

but there are also 2 other ones that I like to use a lot.

One of them is from Jump. It's called Credo Checks. Also, I think it's Tyler

Young who mostly maintains this, and they're really nice to

catch stuff that, you know, Credo doesn't catch by itself. And then they're a

little bit, opinionated Credo checks. So you can just enable

what you like and disable what you don't. But the Jump Credo checks are really

useful. And then another one is called ex-slop.

It's, again, a Credo plugin you can add to your Credo checks.

And that also kind of catches some of the LLM-isms generally

in Elixir and Phoenix. So I personally run all 3 plus

Credo, and that helps me a lot with keeping the code quality up

or higher generally.

Now, the next item is something— it's a YouTube video. It's not

necessarily Elixir or Beam related, but I thought it was so interesting that

I wanted to mention it. And it's the Black Hat USA '26

OpenAI Hugging Face incident video by 2

researchers from OpenAI. And they walk through the entire timeline of

the OpenAI Hugging Face incident. Where an OpenAI model not

only hacked Hugging Face, they also hacked the entire OpenAI infrastructure

twice. It's quite funny when you listen

to that video and they're like, yeah, so, you know, the model

escaped and they basically took over the entire internal infrastructure,

but we fixed it and then we released it. And yeah, well, 2 weeks later,

the model did the same again. It also hacked Hugging Face

and you're like, Maybe you should be learning from your mistakes, but okay.

But yeah, this was a very funny slash interesting video. And I thought,

you know, if you are just interested in what happened with all the OpenAI,

Matter, Anthropic, and even

the ASAI hacks, you know,

watch this 30-minute video and it gives you a great overview of what

has been happening there with these hacks by models escaping containment.

Last up, sorry that I do 3 in a row, but the last one is

also a tip from myself.

This was recommended to me by my good friend Marcel

Fahle, who's working on Bolt Video. And it is also,

again, not Elixir related. Sorry, this week is a little light on the Elixir news.

But this library of skills, of LLM skills,

I found so absolutely useful that I wanted to mention it.

And it's called Impeccable. And these are

a bunch of skills designed by a designer to help

your LLM create better designs, UI designs, UX designs.

And I've been using it again on my latest project. And it's absolutely stunning on

which design issues the LLM finds and corrects.

So I run everything, I do all my UI designs through Impeccable now.

So, you know, if you are doing web app, UI design,

if you have to create that, use the Impeccable skill set to

improve it. Nice. That's a good tip. I'll have

to check that one out. Next up, last up for the

news, a kind of follow-up on last week.

Last, what was that, 2 weeks ago? We're not consistent yet.

Last episode. Last episode is that Dockploy,

the deployment solution that we were discussing, had version 0.30

released, which had a bunch of nice-to-haves,

including they now support secrets

management through external secrets providers. So before that, some of

the environment variables were— and secrets were just stored as environment

variables and not in a dedicated secret environment.

So that's an interesting one. There was a little bit of discussion on on using

that. And maybe we'll revisit this at some point as we— as

members of the community go ahead and upgrade and use it.

So— Dockploy. Yeah. We had that discussion about Coolify versus

Dockploy. And this is your choice.

Yeah. That was my choice. Good. Working on you.

We're going to convert you. Maybe. Let's see. All right.

Next section, blog posts. Yep. So, a couple

of cool blog posts this past couple weeks.

One, first one we want to highlight is Andrea Leopardi, one of

the Elixir core team members,

shared a blog post on genstage demand visualized.

So, it was an interactive blog post because there was a bunch of little widgets

inside that helped you visualize how Genstage works

under the hood. Now, if you don't know what Genstage is, it is one

of the— it's not in

the Elixir core library, standard library, but it

is one of the, like, core— one of the things the core team works on.

And it's a job processing, queue processing system

with backpressure. And so For

some, it is maybe not super intuitive how all that

works, but this blog post does a great job of breaking it down,

showing how in Elixir we have concurrency, we can have concurrent processing

of these jobs or events, and how it kind

of keeps the system in check without overloading things using backpressure.

So that was a really cool blog post. Go check it out.

Yeah. The coolest thing about this was that Andrea,

he added a lot of visualizations where you can play around with parameters and

they really show you nicely how the back pressure sometimes doesn't work

when it's misconfigured and, you know, why it's useful. So it's not just text,

it's also really cool graphs. Yeah. And I also got to

say huge kudos to Andrea for making this because the first

time I opened this link, I was on mobile and it still looks stunning.

So that's amazing. That's not easy. Maybe he used

Impeccable, who knows? Who knows? Yeah. All right. Next blog

post is by Arjun Gilliat. Uh, he is

a recruiter actually in the Elixir and Beam space,

and he gave a lightning talk at the ElixirConf EU in '26

in Malaga, where he's talking about the Elixir hiring paradox.

And he also wrote a blog post about his experience at ElixirConf and particularly

about the hiring paradox, as he calls it.

And in the lightning talk and in the blog, he covers the 3 mistakes

that he sees that companies make when they hire for Elixir developers,

and Beam developers, I assume, in general.

And the 3 mistakes, I'm just going to spoil them for you, because then,

you know, you can go off and read the rest of the blog post.

The first mistake that he sees companies making is that they don't give the

candidates a clear overview of what is expected from them

in the first 90 days. So, how does success look to the company

in the first 90 days. And that is important for the candidate as well

to understand, what am I getting into? What is, you know, asked of

me? Do they want me to ramp up super fast and start

contributing? Or do they want me to first take my time and understand the architecture

and the codebase, that kind of stuff? Yeah, so the first 90 days also

gives a good overview to the candidate of how the job will

look like once they're hired. So yeah, Arjun,

he didn't see a lot of companies do that, so he pointed it out.

The second one is that companies mistake volume of applicants

for momentum, which is, yeah, you get 1,000 applications

on your job position and you think, oh,

we're doing a good job, but actually you're

not. You should filter out with your requirements already. If you get thousands

of applicants, So applications doesn't mean that these are individual applicants.

You just didn't filter well enough. Maybe you just said,

oh, I'm looking for a backend developer, and then you have PHP people

coming to you, although you need an Elixir developer. That's an obvious mistake, but these

kind of things. So he's saying, no, you should filter, you should have

better filtering criteria.

And if they're too weak, you get too many applications.

And then the last part is also, especially for Elixir,

ecosystem, where Arjun says,

screening for years in the stack rather than reasoning.

So when you do a candidate interview, you might do a whiteboard

exercise where you ask them, can you write me a LiveView with a handle_event and

whatnot? So you kind of test them for the syntax of the language

and different libraries. But honestly, if you're, you know,

if you're especially interviewing senior candidates, they might

just walk away. I would walk away if you would put me in a whiteboard

exercise, because I'm like, first of all, who writes code these days anymore?

You know, that's now also a thing of the past, maybe.

Second of all, like, are you looking for a junior developer?

Because just writing a LiveView, like me proving to you that I know how to

write a LiveView out of my head, which I by now would also not know

too well, maybe I could do some stuff, but I would definitely trip somewhere.

But, you know, why aren't they talking about senior stuff like architecture, software design,

you know, understanding the pros and cons of different approaches to,

you know, handling demand? You know, maybe we should use GenStage, as Andreas says,

like these kind of questions, like, why do we even bother with

doing whiteboard exercises instead of talking about

the senior stuff? So, Arjun, he says, you should rather look

at Elixir thinking, which also includes, you know, when should

you use a GenServer? When shouldn't you use a GenServer? These kind of specifics

about using Elixir instead of another language. So you should rather

test for that instead of just asking, do you know the syntax of a LiveView?

That kind of stuff. So I found it was a quite interesting blog

post from a different perspective, from a recruiter's perspective.

And also one other thing I didn't know, that the number of

Elixir developers that have shipped significant products

in the European Union is in the low thousands. So,

you know, 2,000, 3,000 developers

in Europe, which is not a lot if you think about it. You know,

this is really like— PHP is like, what, hundreds of thousands?

Java, even more. And we're .NET.

Yeah, like, you know, we are a few thousands. And yeah,

exclusive club, kind of exclusive. But the point here in the blog post

is if you screwed up Word goes around, word gets

around. And that is true. I heard that also from others who interviewed for

a company that they just didn't like. The interview was like, the process was terrible.

And I also didn't apply to them then, you know, and word gets around.

So you— and you're talking about the, if you screw

up, the you in that statement is the company. Yes. If companies

have a terrible hiring process, that gets around. Yes.

But also for candidates, I gotta say. So You know,

if you just really appear to be a bad candidate and

you make it public, yeah, you might have an issue with finding another job

because even companies talk. Yeah. All right. Enough about that.

Cool. Let's move on to Tidewave. There's an update

to Tidewave, which is a paid tool.

There's a free version adding an MQTT server.

It's free. You have like 20 prompts. But it's €10,

$10 a month. So it's basically free.

Well, there's a couple parts to it. I know there's the free MCP and then

there's the Tidewayve tool. And the Tidewayve tool got some

updates that are pretty nice. So there's a Tidewayve

toolbar, which is a minimal toolbar that sits inside

your app. So you don't have to load the whole Tidewayve UI with

the chat bar on the side. You have this small toolbar and it

is more limited in functionality. It gives you a couple

of features that allow you to click and ask for UI variants,

analyze accessibility, some diagnostic stuff.

But it's a nice way to minimally integrate Tidewave with your development

process. And then Tidewave Connect, which as I understand

is an MCP kind of similar to the

Claude in Chrome or Playwright MCP, where it

allows Tidewave to then drive the browser and

interact with your web page and test everything, make sure things are working as

it expects. So if you're a Tidewave user or you've never tried it

and want to give it a try, this is a cool update. And yeah,

nix-deps.update tidewave.

Exactly. I think with Tidewave Connect, the, the issue they're solving here is

that previously, you could only connect your LLM to the browser

or to the website in the browser if you would use

the Tightwave UI. So you couldn't see your full website and it's

an iframe inside the Tightwave UI. This is

how I use it all the time. But yeah, the issue sometimes is you just

want to have your full website in front of you without an iframe

and something. And if you run your LLM in a

terminal session, separate from your browser, you could not connect that

session to the browser and let it drive the browser,

do browser eval. You couldn't click on certain elements

and say, hey, change the color of this element. So Tightwave Connect

and the toolbar, they kind of make it so that you can run your terminal

in your session in a terminal somewhere, and it can connect to

your browser through the Tightwave Connect MCP. And then you can use the

Tightwave toolbar to kind of click on certain elements and tell your LLM,

hey, you know, change these HTML elements.

So, right. And this was a blog post. So there's more details

in the blog post. And plenty of YouTube videos. Yeah. So, oh yeah,

they're very good about making those. It's very helpful.

It's, they're really good at marketing, aren't they? Yeah.

So the next blog article is by Mike Zonick.

Yeah, he also has been writing quite a bit in the last couple of weeks,

which I appreciate a lot. Thank you, Mike. And he wrote a skill

for updating your dependencies. And I found this extremely

useful because in these days where someone, someone who

we shall not name, is finding a lot of vulnerabilities

in popular libraries. And if these vulnerabilities then

get announced, you know, you either have to upgrade to the

latest version or you have to live with the warnings in your

terminal and then maybe you're crashing CI/CD. Forever. And the issue here is

when you upgrade a dependency, you previously

would have to go manually into the changelog, understand what the changes are,

what the breaking changes are, that kind of stuff. And it takes

time. So Mike, he wrote a skill, an agent

skill that does all of that for you. It looks at the changelog,

it tries to understand what needs to be changed in your

application. And then it proposes these changes.

So, you know, you can always go and double-check.

But at least this, you know, gives you a jump ahead of upgrading

to the latest version and making sure that, you know, the breaking change

doesn't affect you because you made sure that, yeah, it's not breaking

for you, basically.

Yeah. Right. Next up,

we have a blog post by João Paulo

Abreu. I think I got your name right, but I'm

sorry if I didn't. Learning Elixir: Alias, Import,

Require, and Use. So, this was a nice overview on more

of a beginner blog post on what are the differences between some of the keywords

in Elixir, the alias, import, require, and use, and how

you can use them differently to achieve

the goals of of your code.

So, using different modules, essentially. I— for

longtime Elixir developers, these are very familiar. You use them

in most modules. But it's a really good

overview of— also, it goes into some of the deeper details

of what happens with a couple of gotchas when you can alias and

you can change the alias name using the as keyword, what happens

when you have conflicting imports,

things like that. And so, it's a good read,

especially if you're new to Elixir. And,

yeah. What I found useful here is that he goes into details

about the differences between, especially, import, require, and use.

Because, yeah, what's the difference between import and use,

right? I think, but don't quote me on this, I think quote is a compile-time

dependency. So if you change your use module, you have to recompile all

the other modules that use it. Whereas import,

I don't think you have to recompile the other modules. So read

the blog post and tell me.

We shall make it a follow-up next week. Maybe we need

a session on macros because those are the Elixir magic, huh? I think there's

a whole book written about it, Macro Programming.

Probably. There is, there is, I think. Yeah.

All right. Uh, second to last item in the blog section. Uh,

it's a blog post, again, not related to Elixir. Sorry about

that, but it's, I thought, really interesting for 2 reasons. It's called

How AI Text Watermarking Works, and it's written by dClaude,

which I think is a product for, you know, rewriting Claude's

text output. Again, not that interested in the product, but the blog post was very

interesting because the European Union now since

a week or two ago requires all AI-generated content

that includes images, videos, and text to be watermarked.

And surprisingly, or maybe not surprisingly, OpenAI and

Anthropic have been watermarking the text output that the

LLMs generate in a very, very interesting way,

in a statistical way. In a way that this blog

post explains, which is basically if you know the weights between,

yeah, in your model, you know, and then the model predicts the

next word in a sentence, like that next word could

be, you know, let's say 1 out of 4, and you have different probabilities for

each of these 4 words to appear next.

So if you would write

normal text as a human, you know, we don't have these mathematical probabilities

of choosing the next word. We might choose a word that we think

sounds better or correct or flows better in the text.

But an LLM, it's purely mathematical probabilities,

right? So the watermarking here is basically

checking the text that you have and

then the words that appear in the text against your weights

in the model. And because only you know the weights in your

model, it's not something that somebody else can change or imitate.

Right. But yeah, what you basically do is you count

the words that come next and then you make statistical

analysis of that and say, well, in 30% of the cases, the next word is

module or task. And then you check against your weights.

Does that match our weights. And this way they

have been basically watermarking the output text, which I found really interesting.

But again, if you want to understand this in more depth, go read

the blog post. And this was also another

good blog post, a really interesting one, because it had the interactive widget

that let you visualize and see how they do that watermarking. Exactly.

And so you can play around with that tool. That was, it was very cool.

I like the deep dive there, but it also makes me wonder,

um, I guess maybe not wonder, but it's probably a bit

of a feature for the big LLM labs that only they can tell if

it was watermarked by their model. So I guess if you as a user want

to see if something was AI text, then you'd have to dump it

into a whole bunch of different LLM providers.

Yeah, they do expose such tools now, or they want to expose these because that's

also required by the European Union that you as a model provider

provide a way to check whether something was generated with your model.

So yeah, you send your text to Anthropic and they give you like a thumbs

up or thumbs down whether it was generated by Claude, for example.

Yeah. Right. And as a user, you'd have

to send that to Claude, to Codex too.

DeepSeek to all the labs. Exactly.

But that also brings me to a little PSA, which is you should not be

using AI to generate blog posts. That is my official

and unapologetic opinion on this topic.

I don't think AI should be in any creative output,

to be honest. And I don't include code because whether code

is art or not, it very much depends. But if you think about music,

writing, image generation, you know,

that kind of stuff. And yeah, I also have generated blog posts, like blog post

images myself, just very small thumbnails. But generally, I'm not a fan of

using LLMs for generating this kind of output, this kind of content,

and especially not blog posts, right? And the thing here is because in

doing the research for this podcast, I click on links on Elixir Forum

and they take me to like a dev 2 or something blog post. And I

start reading it and I just immediately can spot that this is an AI-generated blog

post. And the second I realize it, I drop off, I don't read the

rest of the blog post. And I will also, you know, hold it against

you as an author, like me personally, but I think generally your

reputation is damaged if you just push out AI-generated blog

posts because they're just simply slop, honestly. I don't want

to read them. Nobody wants to read them. And especially if you didn't bother writing

them, why should I be bothered reading them.

And I just wanted to make this clear, like, I will also not, you know,

put any blog post here and feature them that I think were AI generated.

And I think by now you can kind of spot it. Right.

I like, there was a phrase going

around a little while back, but human attention requires human

effort. So if you didn't put the effort in to write your post, then why

should we put in the effort to read it? Exactly. So yeah, just don't

do it. I mean, I use AIs to proofread everything I write, or most of

what I write. So, you know, you can definitely use it in your flow,

but don't just say, hey Claude, write me a blog post about this topic.

You know, you won't improve your writing skills. You won't understand as well

what you're writing about and you will, it will hurt

your reputation. It just doesn't give you anything. Like,

just don't do it. Yeah. All right, enough ranting.

Now, Gus, are you ready to do a speedrun,

1 minute or less? Yes. Through all the meetups

and conferences coming up in the next 2 to 3 months.

I'm gonna time you. All righty. Start your timer. Ready, set,

go. Go. All righty. Meetups and conferences.

We have ElixirConf US on September 9th for

workshops and 10th and 11th for the conference. Prior to that, also on September

9th, if you're not going to the workshop, check out the Unconference organized by the

Erlang Ecosystem Foundation. They always have a great time at

the Unconference. We talked about them last time, our experience at the last

Unconference. Go check it out. GOTOmire, AshConf,

and Hackathon. The whole week of Elixir Fest

happening in Varberg, Sweden is happening on September 30th

to October 2nd/3rd for

the, the AshConf and hackathon. So check out goatmeier.com

and AshConf. There's a Luma that we will link in the description.

And the hackathon also at the same time as AshConf, you can kind

of mix and match between those throughout the day if you like, also in the

description. There is Code Bean EU, which is on October

20th for workshops and October 21st,

22nd for the actual conference. Again,

Erlang Ecosystem Foundation is organizing an unconference before

that on October 20th. There's a Luma in the description that

you can go check out and codebeameurope.com for the conference.

Both of those are going to be great events. All of those are going to

be great events. Conferences, workshops,

meetups, they're the great way to interact with the community. Go check them out.

How did I do? Very good. I think that has been 1

minute. I didn't, I didn't time the seconds, but it's been

less than 2 minutes. So very good. Cool. All right.

Well, that was some hard work, Peter. I missed this

last week, but you're again known for delivering dad jokes

at the beginning of all your blog posts. So do you have a dad joke

for us? I do, just to lighten the mood a little bit, to decompress.

So, um, I don't usually brag about my finances,

But my bank calls me every day to tell me my balance is outstanding.

Very good. A good chuckle.

That's what I'm going for. That's a good one. You got a chuckle. Good chuckle.

You got a chuckle. All right. Now we're decompressed

and relaxed. We go into the second part of this podcast,

which is the discussion section. Again, if you're not interested in listening

to us ramble on about topics,

feel free to come back next episode. And thank you for listening. But if

you're interested, what are we talking about this week, Peter? We're going

to talk about something that has been on my mind

for a while now. And I think on many people's minds,

which is, how will we as especially senior developers

work in 2 years' time from now, or, you know,

going forward with LLMs now doing most

of our job? You know, like, that's my question. So because

there are 2 things here. First of all, I want to say this first,

you know, if you code on hobby projects in your free

time, non-professionally, you know, there's absolutely

no necessity to use LLMs if you don't want to. If you want to be

the artisanal and write code by hand and understand something in depth,

be my guest. There's no pressure at all. It's kind of like just

taking your time to paint a beautiful painting in your backyard instead of printing

something out with OpenAI or generating something with OpenAI, right?

So that is not what I

want to talk about. In your free time, do whatever feels best to you.

But when it comes to the professional experience, to us professional developers,

I think the trend is pretty strong that in

a year or 2 or 3, if you don't know how to use LLMs,

or if you don't use LLMs in your workflow, you might not be employable

anymore. That is, I think, a hard fact that we

can't ignore. I think LLMs and AI in general

is here to stay. I don't think there is a big financial

bubble that's going to pop and then everything's going to just

go away. There might be a bubble that will pop and there will be companies

who have negative consequences in maybe a recession.

That might happen, but it's not going to take away this technology because

it has been proven so useful and it's so ubiquitous by now.

So my personal grief or my personal

struggle with this is very much, what does it mean for me in

2 years' time? How will my job, my daily work look like? Would I

just be prompting LLMs all the time or not? You know, and if,

and then let's say I am just doing everything through LLMs,

which honestly I'm already doing today. Like I haven't written a single

line of code in 6 months, maybe manually.

So it's not because, you know, I,

I'm super on the scale of I want to use LLMs for everything. It's more

like I find them super useful. I'm more of a product person than a person

who enjoys writing code by hand.

I rather want to build stuff. I'm a builder, right? So anyway,

my big question, what's struggling,

what's my struggle a little bit is asking, how will

I as an engineer also keep on developing if

the LLM writes everything for me,

right? How will I understand the

architecture, the codebase? Will I understand the codebase or not?

You know, and how can I, if I have to use LLMs, how can

I still make sure that I understand the codebase going forward? You know,

so these are a lot of questions that roam my mind. And that's what I

wanted to bring into this discussion. I don't have any answers for it yet.

I just have some tangents, some ideas,

but no answers. And just to base the discussion

on some other content, other stuff

that we have found in the last week or two, there have been 2

very interesting blog posts, one of them by Brett,

brettcoates.com. He wrote, I'm Done Using AI.

And I found this blog post extremely interesting.

Because it goes through his experience of first going

all in on LLMs after, you know, like 15,

20 years of being a developer and then just doing everything through LLMs,

kind of burning out with it. And then going back to writing

everything by hand because he understood that he

doesn't develop as much anymore as an engineer. Like he gets

stuff done, but he doesn't learn from doing these kinds of things.

That was his first struggle. And the second one is also that he doesn't feel

as connected with the product he's building,

you know, if an LLM builds it for him. So these

2 things, and then he decided for himself, I'm just gonna go back to writing

everything by hand. And then also ending with,

I know that for him, it means or might mean that he

won't be employable in a year or 2 from now. Because, you know,

the trend just goes towards employers wanting

people who know how to use LLMs. So that blog post made

me think a little bit. And then there was one that you mentioned,

Gus, by Groen. Right, by Niklas Groen.

It was more of a— I like the title and I like

the message, but the

body was a bit more about how you shouldn't, um, how you shouldn't

just copy-paste LLM responses. But the title was Don't Be a Meat Proxy.

And I think that's a good way of, of, um,

also conveying how it kind of feels like we're living in this day and

age, is that if you're just the one that

refreshes the page, confirms the changes, and the

LLM is doing all the work, are you just a meat proxy?

Is that all it is? And so I think it

kind of goes into that arc as well about how, where does

LLM fit in your workflow? Where do you fit in

your workflow? Exactly. Yeah. And his point here was,

you know, don't just copy paste the answer that Claude gave

you into, you know, like an issue on GitHub or like a pull request on

GitHub, especially when the author comes to you and asks, your question,

can you explain this to me? And then you just take the question, put it

into Claude, and copy the output and put it back into the— don't do that.

That is just bad for everyone. I feel this myself when

I'm working with NeRFs and hardware, is that this

really resonates because I feel like sometimes I have a

throwaway project I don't really care about, and I'm not really paying that

close attention to what Claude is doing, but all of a sudden it prompts

me and says, hey, can you plug the board in? I can't access it right

now. I really feel like I need proxy then. Yeah,

but, uh, so it's interesting because I think what

you're also talking about here is that,

is that you don't go through the process of learning and discovery.

You might learn about the answers, and again, I'm going to relate this

back to NURBS a little bit here, is that I feel like LLMs have

exposed me to a lot more,

um, techniques and maybe also more understanding

of how embedded Linux works, and again in

the NURBS context. But I, I don't feel like at the same time I

have the same understanding of how the

process of determining issues like debug

debugging embedded Linux works, because Claude is very good at

generating all of those commands to say, oh hey,

this bit wasn't set in the driver, and so now the whole thing's not

working. You just need to patch this one line of code. I was like,

oh great, I understand what's not working, I understand the issue,

but I did not get the understanding of how

we got there. So I've been trying to be more intentional about about how

I use it and being in that loop and learning these tools.

Yeah. What were your techniques there? Because it's the

same issue here, right? Like you, you have your NURBS device or hardware and

you tell Claude, build me this. And it goes off and builds it and

you test it and it works, you know, and you might review the code or

not, but in the end you haven't done the whole thinking process,

you know? So Do you have any, like,

takeaways from how to understand your, uh, how to improve your understanding of it?

Well, I think so. And this comes from the embedded

Linux side. So maybe not all of this is applicable, but being

not just in the loop, but not, not letting there

be a loop is part of it. I think you can definitely use

LLMs to discover, uh, things and techniques. I think

it is very hard to search for information. About best

techniques, especially with specific situations when you have error messages and things like that for

debugging embedded Linux. The tools all exist. They've been around for the last 25

years. But the discovery, what is the name of that

tool called? What is— if some of them you type like

Valgrind --help and it spits out the giant list of

all the arguments because there's a bajillion of them that have been added over the

last 25 years. And then you get a little overwhelmed and say, well, now am

I using this one? Am I using that one? But no, you can also take

that and dump that output into an LLM to figure out exactly how you

need to use that tool to debug the issue that you're doing. But as long

as you're typing the commands, it's kind of like writing. When you're— when I was

a student, I always wrote my notes by hand because that helped me remember it

better. But in this case, instead of copy pasting, typing out the commands myself,

going through the process myself, not letting Claude be

the one that's driving the session, the debugging,

whatever. That really helps. Then you're learning what's

happening. And I think the same applies to Elixir. Yeah, that's,

that was my next question because, um, like, that's interesting that

you, you know, you'll want to learn a CLI that you can use to debug

stuff and you want to understand how to use the CLI to debug stuff and

which arguments to use, right? That's interesting. But the

learning of it is kind of like a small part of it where you now

know that there is such a CLI and you know which arguments to set

to look at certain things you want to debug. Right. But then,

for example, when it comes to the code of writing your NURBS application,

like, do you need to know how to, you know, write all

these functions in a single module when you know what the module will do?

So, you know, where do you Where do you draw the line? Where do you

draw the line? Yeah. Yeah. That is, that is more

interesting because again, I'm comfortable with writing a

gen server. I'm comfortable with writing a LiveView. I am

more results-oriented in that sense. But as you

said earlier, it's about the architecture. It's more about the understanding

of your application, your codebase, your your—

how the entire thing works together, right? And so,

I think, I mean, even then,

understanding dependencies, like, maybe instead of the

whole debugging embedded Linux example, you could say, learning how to

improve your compile times and using— understanding how to use

mix xref and getting the graph of your compile time dependencies.

That's an example of tools in the Elixir ecosystem that that you would

benefit from. And then you go back and that kind of helps you understand

how all your modules are linked together

from a compile sense. And then you can decide

how to extract them.

I think I really like your last statement,

which is that there shouldn't be a loop. Like, or at least, I mean,

if there's a loop, that it always ends with you to make

and then to give the next impetus for the next loop.

Right. I think that might be a very interesting thing because I've also experienced that

now myself where I'm like, yeah, if you

take, for example, compile time, right? If you want to improve the compile time of

your application, you might just tell Claude or Codex, go off

and improve the compile time and come back when it's 50% faster, you know?

And then afterwards you review the code and you try to understand some stuff and

then you might ask questions about it. And actually, just as a side note,

There is a skill. I don't know what the name of it is, but if

you Google for it, you might find it. There's a skill that teaches

the LLM to ask you questions about the PR. So it's

kind of like a test where— Isn't that the Grill Me skill? Grill Me.

Yeah, it's called Grill Me. So it's like you tell Claude,

ask me questions about the PR to make sure I understand the PR.

So that is maybe a good— if you're at the end already and you

have the PR ready and you realize, I don't understand what the heck's going on

here. Use GrillMe and then just until

you understand it. That's one aspect. But then getting there,

I think that's a really interesting part there that you said, which is that

you're always the driver and the LLM executes on your behalf,

but then it comes back to you and asks like, okay, so what's next,

basically? But another

part here is also you are intentional

about slowing down the process, right? Because if

you wanted to go for maximum velocity, you would just, this is my problem,

Codex, go off and fix it and come back when it's fixed,

right? And then you might review it a little bit, and then you could

maybe understand the design choice or

the architectural choice it made. You could criticize some code conventions,

use Credo checks or yourself go in and say, I don't want to use

these kind of things. Add that to your agent's MD file.

But I think if, yeah, I think the major thing here is the

intention of slowing it down so that

you are always in control and understanding what's happening. And then you can

still have the LLM write the actual code. You know what I mentioned earlier,

you can still have it write the module, but then come back to you

and say, I'm done. What's next? You know?

Right. Or on the flip side, I think that LLMs

are, and our unnamed friend,

uh, of all people certainly knows this, are great at reviewing code,

identifying potential issues. And I think also writing the tests to

confirm those issues and then confirm that they've been fixed

once you have been flagged of them and kind of determine

what to, how to, how to proceed. That is what I use

it the most for, which is code review, and Claude

has a /code-review, but I improved it a little bit because that

one also just gives you a list of issues that

you don't understand as a human. If you paste it back into

Codex, it might understand it. But the issues I had with it is

that I, first of all, don't understand the issues it flagged. So I wrote

my own skill based on it that says, give me always kind of like a

one-paragraph explanation of what the issue is. What the impact

might be and what potential solutions could be. And the

other thing is that if you just do this code review in a loop

and you have, you know, like I have Codex write the code and then Claude

review it, and then that's the loop that I do 10 times until Claude

doesn't spit out any bugs anymore. But sometimes

there are decisions that I should be making so that

Codex doesn't flip-flop from one side of a problem to the other side and

then back again, you know? So sometimes it doesn't check something and then it checks

it too much and like, That's what I've experienced in 10 review

cycles. It went from A to B and back 5 times.

So then I told in this skill, it's like, whenever there's a bug

that does this flip-flop that goes from one extreme to the other,

when it happens more than 2 times, or when it happens 2 times,

flag that to me and let me make the decision,

and then record the decision and give it back to Codex to

implement. And that, again, this is a bit more of a hand— this

is the code review part of the process. But even here, you can

put yourself back into the loop, you know, and you always have to

nowadays prompt the LLM and say, give me enough context for me to understand

the issue, right? Again, it's intention.

Yeah. Right. Well, let me ask

you this and kind of move our discussion forward is how much

do you enjoy that process? A lot.

I got to say, I'm very happy with this because again,

I am more of a product person. I'm more of a builder and I am

more of a software design and architecture person. You know,

I love designing how the system works

on a high level architecturally and then also inside the

code in one application like software design. You know, where do I put a cache

in front of some stuff where I don't put a cache?

Gen servers, especially active schemas.

I like to drill down on those to make sure that we don't

have too many fields or duplicate fields or too many

schemas, too few schemas, that kind of stuff. So the database model is important to

me. But yeah, again, that means I'm more of

a high-level person and I just want to have things work and be done and

be ideally bug-free. And then for everything that comes after, I also

have Sentry or AppSignal that send me,

you know, that track exceptions and tell me, hey, there was a bug, for example.

So that's why I'm less of a, I need to write every single line of

code myself, because building web applications,

honestly, like 98% of that code is just boilerplate code,

and you don't want to write it yourself, you know?

So Anyway, one last part I

wanted to mention here, and I think that's important, even if you disagree with

us in this discussion, if you want to kind of have affirmation that

you're not alone, there is a very nice project

by the Syntax FM podcast, and they had a questionnaire

that they sent out, and 1,500 developers have answered

so far, and you can also answer it. It's still open, and it's

anonymous, and they ask developers questions like, how much genuine enjoyment

or flow do you get from coding now compared to before

you started using AI heavily? As a former

psychology research student, I also got to tell you, this question is not

super optimal, but it gets the point across.

But yeah, so how much genuine enjoyment do you now get compared

to before? And 54% of the respondents said that they have

now less or somewhat less enjoyment,

which I found striking. That is, yeah, 1 in

2 people say now they enjoy working less with

LLMs than before. Only 26%,

so 1 in 4, said more or somewhat more.

So still 1/4 of people have more enjoyment

now. Another question, I think this

one's the most striking one, is, do you feel your actual coding skills are

sharpening, holding steady, or diminishing? You know,

now that you're using AI. 60% of people said

their coding skills are diminishing or somewhat diminishing.

60%. Only 13% said

they're sharpening or somewhat sharpening. Right. So that is striking.

Like 1 in 8, maybe 1 in 9 said,

I'm actually improving. However, again, you know, as a former psychology research student,

I also mentioned this to them. What are coding skills? Right.

Because for me, coding skills is literally writing code, like,

you know, the lines of code. But, and I personally, yeah,

that is atrophying. That is a skill that's atrophying, literally my fingers,

you know, my fingers atrophying. But what I'm learning, what I'm

gaining is better understanding of software design architecture.

I can focus on the bigger picture, right? So that's why this question,

I think, could have been split into 2. Like, do you understand your product more

or your software more? Or do you have that kind of stuff?

The last 2 aspects of this questionnaire were, another question

was, how often do you feel you should be producing more because

AI makes it possible? Even when you don't want to?

This is kind of this FOMO, like how much FOMO do you have now

that everyone is going at light speed and building products left and right?

65% said often or even daily they feel pressured

or they feel like they have to produce more. Again, that's the FOMO.

18% said never or rarely. So that's also a small amount that people

who kind of held steady and said, I don't need to be more productive

now. I might do the same job or more on my same job,

but not more than 8 hours a day. I'm not going to do 12 and

14 hours. And lastly, and I think this is the core

point of the whole questionnaire that we can discuss, is there was the strongest

correlation between answers on these questions was between

coding enjoyment and perceived coding skill change.

And this was particularly striking in people who said that

they enjoy coding less, way less.

And they also perceive that their coding skills are atrophying

or diminishing. And these kinds of things, they went

together. So, you know, correlation, causation,

like we can't say which causes what, but If

you are feeling that your coding skills are diminishing, you will also have

less enjoyment. Or if you enjoy coding less, you might

also put, oh, I'm also atrophying in my skills here, right?

Yeah. So what I found striking about this questionnaire is that it's very much,

well, it's not black and white. It's not like everyone

hates it and loses their skills, right? There are also like 1

in 4 people who enjoy it more. But, you know, the picture

is that it definitely isn't skewed towards the, yeah, I'm learning

more, I'm being more productive, I'm super happy. More people are unhappy than

are happy about this. So, Gus, first impressions,

what are your thoughts? I think, I mean,

I think it's understandable. Now, you and I, we both kind

of work in more of an independent situation, but I think if

I was in a corporate environment, at this stage,

I think I would also feel more

pressure. I would feel like it's— I mean,

this is also very dependent on what your corporate culture

is like, but I think I would feel more pressure to be productive while

at the same time feeling like I'm coding less. I think

those kind of go hand in hand, and I probably wouldn't be too happy about

it because I would feel my coding skills are atrophying.

So, yeah, I completely get it.

I think you and I are probably, again, similar in

that regard that we're more of the results-oriented.

And I mean, we want to be invested and involved in

the process, but we don't want to be writing the JavaScript. I mean, that's why

we do LiveView, right? So For us,

I think there is more intrinsic

enjoyment out of the process, even if LLMs

have their problems and, you know, there's things that you don't like about them.

But, um, it does feel in

a way that you're able to speed up the

parts that you may not enjoy as much, like writing the

tests, doing the reviews. Things like that.

I don't know. Yeah, I agree with you. I think also the independent versus

employment situation is important. Like, I am also a contractor,

you're a contractor, so we're a bit more free on choosing,

you know, what we work on, how much we work on it, and then

how we work on it. Like, what, which tools do we use?

Yeah, I think if I was, again, if you're employed and you don't

quite enjoy the work, now you have AI to just take care of for you.

But yeah, I think just to wrap up this discussion,

because we're also getting close to the 1-hour mark. For me personally,

my takeaway now is, because the initial question was like,

how are we going to work in 2 years' time as senior developers?

I think again, LLMs are here to stay. So we kind of need to make

friends with them and see how they are useful to us.

I think it's a realistic risk that

our skills might atrophy or diminish, that we're

either plateauing or diminishing in our professional

expertise, especially in the long term when you

don't then understand the projects you worked on,

the solutions you found to technical problems, and you

can't explain that in the next job interview basically. Right?

Right. So I think Yeah, that is a realistic risk.

So how can we mitigate it? I think what you said was really interesting,

which is put yourself back into the loop, make yourself

the driver, not the co-driver, the passenger.

Eliminate the loop. Yeah, eliminate the loop. There's no

loop, but there's like a request-response kind of thing where

you send something off and then it comes back to you and says, okay,

what's next? And also planning,

I agree with you, you can plan ahead.

Have a plan, but you are executing, you're the driver on the plan.

Yeah. And I think this will help you to still be more efficient

because you don't write the code, but you still get the gains

of understanding what's happening and why.

But I also think an important part is here for you personally to

decide where do you draw the line? Do you want to

understand every single line of code? Do you want to understand everything on a

module level? Do you want to understand it on an even higher level than that?

Again, I think it's for you, what feels best for you and what's

most important for your job. If you're an architect, you wouldn't go into lines of

code anyway. You would understand applications and the large

system. Yeah. And I

think to be intentional, that is the most important part, to be intentional

about your use of AI. And understand the downsides and

the benefits that it can give you. Yeah. Is that— do

you share this or? Well, I share that, but I think I would also add

the— I think that this is a— of

course, it's a time of disruption that we're seeing across the industry,

across a lot of industries. And that can feel

scary. It can feel You

can have a lot of feelings about it. And I think what ultimately

comes down to is that we shouldn't just

be talking to the machines. The communities that have built open source software

are the most valuable

resource in our industry, I would say. And the human-to-human connections

that we've made from those interactions, from those communities,

from the conferences, from the meetups, from interacting face to

face, even if the face is on a screen, interacting face

to face when that's in person, or even just over the PRs.

I think that is really where there is a

lot of sense of value and that we should try to still encourage that

while also limiting the LLM from those spaces,

right? Like, like, um, everyone knows that

LLM pull requests are a major burden on, on maintainers

right now. And I think in these community projects,

especially when it's something more fun, not like load-bearing,

to quote Claude, um, but where

there's, uh, something that brings you enjoyment,

you can be part of a community, um,

be yourself in these spaces. Don't be the meat

proxy. Um, and so join the

meetups, join the conferences, talk with other people. I think we have a

shared— um, you'll find that you'll talk

with a lot of people that share similar values and opinions on AI and are

going through similar experiences because, you know, this is disrupting everyone.

So I think my ultimate message and takeaway

is go out there and join the communities,

find the communities. It doesn't even have to be in tech, you know.

Yeah, true. Just also, you know, find something else.

If, you know, it's always fine to pick up another hobby that is

not tech related, and we don't need to make money with it. Just, you know,

pick up whatever art or theater or music,

whatever you like. But I want to say, just maybe to close this off,

make 2 other statements that I think it's also, which is

where you need to be realistic about the situation, you know, like, first of all,

I don't think you can close your eyes and just make it to, like,

wish that it goes away. I think, you know, you need to

face it and you need to find a way for you that works in this

new world. However that looks to you, that's fine. It's your

personal opinion, your preference, right?

Just, yeah, make sure that you're true to yourself and

find something. But I do think you need to face it and find

an answer for yourself. Um, and, and the, the second

aspect that I, uh, I now forgot.

Uh, what was it now? It was so important on my mind.

Yeah, maybe I will, I will follow up in,

in next week. Yeah, very good.

Well, all right, it has been a fun discussion, Peter. We will save it for

next week. We'll update you on, on what Peter's last thought was.

If he remembers it. I will remember it probably in 2 minutes from now,

and then we already hung up. But anyway, all right everyone,

well, thank you very much for listening to us ramble on.

And this has been Macro Mayhem on August 18th.

We will be back in 2 weeks' time. And again, if you have

anything you would like to— yeah, probably. If you have anything that you would like

us to feature on the podcast, always tag us or send us a message.

And, uh, yeah, thank you very much for listening and talk to you next time.

003 - Phoenix Adoption, Sobelow, and Whether AI Is Making Us Worse Developers
Broadcast by