Imagine programming to be like a process of mining a flat-surface by digging straight down. The desired program behavior is somewhere below the surface, and the further down you dig, the more complexity you can mine.
So to dig downwards and add complexity, you need a shovel. But you can’t live in a hole; you need to be able to build ladders to get back out.
In this metaphor, I’m loosely equating “shoveling” with “the application of code” and “building ladders” with “the comprehension of code”.
(I suppose you could also compare it to “speaking a language” vs. “understanding a language”)
All ladder, no shovel
This could be more practically called “tutorial hell.” A dev who has done a zillion or two coding exercises and has a general understanding of what the various parts of a body of code mean. Perhaps you can even read existing code and more or less understand what it’s doing. You’ve spun up a zillion or two projects by following a tutorial.
But you still feel stuck. What do you do with this knowledge? Other than serving as a QA person for a tutorial generating company, people don’t typically get paid to just follow tutorials.
So this user is really good at building ladders, but has no shovel.
All shovel, no ladder
This is typically the metaphor I use to describe folks that are purely vibe coders. These are the users that have the vision, they have an instinct that the gold they’re mining is beneath their feet and they just need to dig far enough to get it. You’re skilled prompt-writers and are comfortable with various tools to generate sites and apps at a quick pace.
But maybe you’re introducing bugs and don’t know it. Or you do know it, but can’t seem to get the LLM to remove / resolve the bugs. Maybe the apps you’re handing off are wrought with technical debt / ugly code that is not extensible / maintainable. More typically, what I see quite a lot is “how do I fix this code?” – users that have dug themselves into a hole with no exit. Or “I’ve generated a site, how do I get it onto the Internet?”
This user is really good at digging, but they’re in over their head and can’t get out.
A measured hybrid approach
I really don’t mean this to sound like “old man yells at cloud,” or “back in my day…”, but:
Before LLMs, before passive video tutorials, we used books, documentation, and iteration.
One of the first websites I ever made was using HTML I wrote in a text editor, saved to file, and uploaded via an FTP client to my webhost, back when your ISP would give you 1MB of free space. Every “Hello World” program involves compilation/execution of the program to complete the lifecycle. This is a fundamental part of the process – we learned how to dig and how to get back out.
This is one of the reasons I advise against beginners using LLMs at all – it’s far too tempting to hop on that LLM excavator and start digging before you’ve learned how to get back out, or to even realize that this is something you’ll eventually have to do.
On the other side of things, you can’t only do tutorials – it’s fine to copy a “Hello World” program because the point is to show you “here’s how you dig a hole and then also climb out of it.” But following a tutorial on making a Tasklist, or a Bookmark manager, or a Phone directory – this is akin to following a map to a digsite and being told that “digging a hole that is 35’ deep” is the goal; you’re missing out on both understanding the how to dig and also the why.
If you’ve got a shovel but need to learn how to build ladders (Vibes only!)
Set the LLM aside for just a minute, or at least start a new session and start with a much simpler approach: How do you make a Hello World and get it where you want it to be?
For web development this means writing a perfunctory page, deploying it somewhere, and seeing it in your browser at a public URL.
For application development this means writing a Hello World program, running the compiler and executing the compiled binary.
Once you’ve got that, start chunking off pieces of your Shovel-ready-program and integrating it into your Hello World. Maybe it uses an external library or collects input or displays a dataset. Start small. This how you learn how to build a ladder, one rung at a time.
Avoid using your LLM at all for this part. It may feel frustrating (at first!), but I promise it will make you a stronger developer.
If you’ve got all the ladders but no shovel for digging (Tutorial hell!)
The typical answer I see (and likely have given) is to “identify a problem and spell out the behavior, then start iterating on it.” But this is maybe a bit too much hand-waving.
If you’ve already done some tutorials, pause on starting any new ones. Go dig up an old codebase and read back through it. What does it do? Run it. What is it missing? If you were a user, would you use it? What additional features does it need to actually be useful? Can you make it look different? Can you add new behaviors?
Example: You have a Tasklist / To-Do app. Add deadlines. Add handle prerequisite tasks (task A cannot be started until task B is completed). Add a task archive for completed tasks but hide them from the main interface. Add priority values and add ranked sorting based on different traits.
You want to have an objective that is just a few feet deeper from where you are right now. It needs to have some depth where you have to evaluate the problem and devise a solution, but you don’t want it to be so deep that it feels impossibly exhausting.
If you’re starting completely fresh and aren’t sure where to begin
In all seriousness, find a book on the language you want to learn. There are still many that are relevant today, and even if it’s a little outdated, programming hasn’t changed that much, so the information will still be transferrable. Ideally, a book that has exercises throughout the chapters or at the end are best – the chapter itself helps you learn how to build ladders, and the exercises teach you how to dig.
If you don’t have access to a library or your library doesn’t have the books (most libraries can do Interlibrary loans, ask your circulation / reference desk person!), look for online resources that both offer instruction and exercises. I personally like Exercism but there are other similar resources. You want to have both instruction and exercises, though, and you will want to do the exercises without looking up how to do it. Definitely do not ask the LLM to do it for you, if you use one.
If you are deadset on using an LLM, then try giving it this prompt:
> I am a new programmer who is trying to learn ___ language. Please give me 5 appropriately-difficult exercises I can do. I want to ask you questions about these exercises but I want you not to give me solutions, so that I can learn to write the programs myself.
Then dig in to the first exercise.