The Skills That Still Matter
Every technological shift produces a version of the same anxious question: what human skills survive? When spreadsheets arrived, accountants asked whether arithmetic skill still mattered. When GPS arrived, drivers asked whether spatial navigation still mattered. The honest answer in each case was nuanced: some skills became less necessary in their original form; others became more valuable precisely because the technology changed what was scarce. Vibe coding is no different. The skills that survive — and in several cases become more valuable — are worth understanding precisely.
Systems Thinking
Systems thinking is the ability to understand how components of a complex system interact, how data flows through a system, how failures in one part affect others, and how the system behaves under conditions its designers did not explicitly plan for. It is the opposite of thinking about software one function at a time. In traditional programming, systems thinking was important but partially supported by the act of writing code — you encountered the interactions as you wrote them. In vibe coding, you skip the code-writing step, which means you must hold the system model in your head more explicitly. The AI generates individual components on request; it does not automatically ensure those components fit together, share consistent data formats, or handle failures gracefully across their boundaries. Consider a realistic scenario: a small team vibe-codes three components separately — a user authentication module, a data-entry form, and an export function. Each works in isolation. But the authentication module stores user IDs as integers; the data-entry form assumes user IDs are strings; the export function assumes user IDs follow a UUID format. None of these assumptions were specified in the prompts. The components fail when connected — not because any individual component is wrong in isolation, but because the system was not thought through as a whole. Systems thinking is the skill that prevents this. A builder with strong systems thinking defines the data contracts between components before prompting for any of them. They ask: what does component A produce that component B consumes? What format? What range of values? What error states? These questions precede the prompts.
Syntax errors are immediately visible — the program fails to run. Integration failures between components are subtle — the program runs but produces wrong results, or fails only under specific conditions. As AI handles more syntax work, the remaining sources of failure are increasingly systemic. The builder who understands systems finds more of the remaining bugs; the builder who does not misses them.
Problem decomposition is the ability to take a complex goal and break it into sub-problems that are small enough to be well-specified, independently solvable, and recombineable into the whole. It is a prerequisite for good vibe coding rather than a downstream artifact of it. An AI given a vague large prompt — 'Build me a project management app' — will generate something: probably a generic scaffold that resembles other project management apps in its training data. That output may not match what you need at all, because 'project management app' covers an enormous space of possible software. The builder who decomposes first prompts something like this hierarchy: 1. A data model for projects (with fields: id, name, owner, status, deadline) 2. A data model for tasks (with fields: id, project_id, assignee, description, status, priority) 3. An API endpoint to create a project 4. An API endpoint to list tasks for a project, filterable by status 5. A UI component that displays a project's tasks as a kanban board Each sub-problem is well-specified, independently testable, and the full system emerges from assembling them. This decomposition is entirely the human's work — the AI cannot do it for you without you having already done it implicitly. Judgment — knowing when to trust the AI's output and when to scrutinize it, when a generated approach is reasonable and when it is wrong for your context — is perhaps the hardest skill to teach and the most valuable to possess. Judgment is the synthesis of everything else: domain knowledge, systems understanding, risk awareness, and experience with the AI's failure modes.
Match each skill to the vibe coding situation where it is most critical.
Terms
Definitions
Drag terms onto their definitions, or click a term then click a definition to match.
Reading, Testing, and Verifying
Two practical skills that remain entirely necessary — and that many new vibe coders undervalue — are the ability to read code and the discipline of testing. Reading code you did not write is covered fully in the next lesson, but the principle bears stating here: ownership of a piece of software requires the ability to understand it well enough to assess whether it is correct. A builder who cannot read generated code cannot evaluate it; they can only run it and hope. Hope is not a quality-assurance strategy. Testing means deliberately probing software with inputs designed to reveal failures. Not just 'does it run?' but 'does it produce the right output for typical inputs? For boundary inputs? For malformed inputs? For inputs a malicious user might submit?' Testing is a skill with its own techniques — boundary value analysis, equivalence partitioning, negative testing — and it is entirely the builder's responsibility. The AI does not test its own output. Finally, version control — the practice of tracking changes to code over time so that earlier states can be recovered — remains essential even in vibe coding. When an AI-generated change breaks something that worked before, version control is what lets you recover. Many vibe coders who skip version control eventually lose working code they cannot reconstruct.
Think of vibe coding skills as a hierarchy. At the base: systems thinking and decomposition (prerequisite for good prompting). In the middle: intent specification and evaluation (the primary daily work). At the top: judgment (knowing when to trust, when to verify, when to reject). The AI handles syntax. Everything above syntax remains yours.
Why does systems thinking become more valuable, not less, as AI handles more syntax work?
A vibe coder skips problem decomposition and prompts: 'Build me a full e-commerce site.' The AI generates something, and the coder deploys it. What is the most likely outcome?
Decompose Before You Prompt
- Step 1: Choose one of these complex software goals: (a) a homework tracker for students, (b) a local event calendar for a neighborhood, (c) a simple point-of-sale system for a school store.
- Step 2: Before writing any prompts, decompose the goal into its component pieces. List every sub-problem you would need to solve. Aim for at least 8 distinct components.
- Step 3: For each component, write: what data it takes as input, what it produces as output, and what its error conditions are.
- Step 4: Draw a simple diagram showing how the components connect — which component's output becomes which component's input.
- Step 5: Identify the two components where an integration failure (mismatched data format, incompatible assumption) would be hardest to detect. Explain why.
- This decomposition document is what you would use to guide a real vibe coding session.