DEV Community

Carl
Carl

Posted on • Originally published at bytelearn.dev

Foundations First: Why AI Assistants Still Need a Human Driver

I went through a phase where I thought I could skip learning SvelteKit properly. I had an LLM. I'd describe what I wanted, paste the output into my project, and move on. Components, routes, database queries. It all looked right.

Then something broke. A page was loading data on the server but the component wasn't reactive. The LLM kept suggesting fixes using $: syntax. Svelte 5 doesn't use $: anymore. It uses runes. The LLM didn't know the difference, and neither did I.

That's when it hit me. I wasn't building anything. I was assembling code I couldn't debug.

The Framework Problem

Here's the thing about modern web stacks. They move fast. Svelte 5 rewrote its entire reactivity model. Tailwind 4 dropped the JavaScript config file for a CSS-based one. Drizzle ORM has its own schema syntax that looks nothing like Prisma. These aren't small changes.

LLMs are trained on older data. They mix up versions constantly. I've seen an LLM generate a perfectly valid Tailwind 3 config and present it with total confidence, even though my project was running Tailwind 4. If you don't know what version you're using and what changed, you'll paste that config in, wonder why nothing works, and waste an hour.

Same with Svelte. The LLM will hand you a component using $: doubled = count * 2 when it should be let doubled = $derived(count * 2). Both look reasonable. Only one works.

Can you tell which is correct without already knowing the framework? That's the question.

It Goes Deeper Than Frameworks

Frameworks are just layers. Underneath all of them is JavaScript, TypeScript, and Node.js. And honestly, these matter more.

Every SvelteKit load function is an async function. If you don't understand Promises and await, you'll stare at undefined for twenty minutes before realizing you forgot to await a database call. The LLM won't catch that because the syntax is technically valid.

TypeScript errors are famously unreadable. When Drizzle infers types from your schema and something doesn't line up, you get a wall of red text. The LLM's instinct is to slap any on it and move on. That "fixes" the error and kills the entire point of using TypeScript.

Node.js runs your server-side code. Your +page.server.ts files, your API routes, your database connections. If you don't understand the difference between what runs on the server and what runs in the browser, you'll accidentally expose database queries to the client. Or you'll try to use window in a server file and get a crash you can't explain.

These aren't framework problems. They're language and runtime problems. And they come up every single day.

The Debugging Gap

This is where the whole thing falls apart. Building is the easy part. Debugging is where you actually need to know things.

When your page renders blank, is it a routing issue? A data loading issue? A reactivity issue? A hydration mismatch? Each one has a completely different fix. The LLM will guess. Sometimes it guesses right. Sometimes it sends you down a rabbit hole that makes things worse.

I've watched this happen in real time. Someone pastes an error into an LLM, gets a suggestion, applies it, gets a new error, pastes that one in, gets another suggestion. Thirty minutes later they've changed six files and the original problem is buried under five new ones.

If they'd understood the error message in the first place, it would've been a two-minute fix.

So What's the Right Approach?

I'm not saying don't use AI. I use it constantly. It's incredible for scaffolding, for generating boilerplate, for exploring APIs I haven't used before. It saves me hours every week.

But I use it like GPS. It tells me where to turn. I'm the one driving. And if it says "turn left into a lake," I know not to.

Here's what actually works:

Learn JavaScript first. Not just syntax. Understand async/await, closures, how this works, array methods. This is the foundation everything else sits on.

Pick up TypeScript. Read the errors yourself. Understand what generics do and why Drizzle uses them. Don't let the LLM any its way out of type safety.

Understand Node.js basics. Server vs client. Environment variables. Modules. How your SvelteKit app actually runs.

Then learn your frameworks. Once you know the language, picking up SvelteKit or Tailwind or Drizzle is just learning an API. The concepts transfer.

Use AI to go faster, not to skip steps. Ask it to generate a component, then read every line. Ask yourself: do I understand why this works? If the answer is no, that's your cue to learn, not to move on.

Follow up more on https://bytelearn.dev/blog

The Multiplier Effect

Here's what I keep coming back to. AI doesn't replace knowledge. It multiplies it.

If you understand your stack, AI makes you two or three times faster. You can describe exactly what you want, evaluate what you get back, and course-correct in real time. That's a genuine superpower.

If you don't understand your stack, AI gives you code you can't evaluate, can't debug, and can't maintain. You'll ship it. It'll break. And you'll be stuck.

The developers who invest in actually learning the fundamentals are the ones AI makes dangerous. Everyone else is just along for the ride.

So yeah. You still need to learn the thing. The tools got better. The job didn't get easier. It got different.

Top comments (0)