No Rest for the Vibe Coders

A university instructor recounts building an Android exam grading app through 'vibe coding' with Claude AI, discovering that while AI handles simple tasks well, it produces architecturally flawed code and cannot replace genuine programming understanding.

Introduction

I'm a university instructor, and I'm tired of paper grade sheets. They fall, they get lost, and entering data manually is a chore from another century. So I decided to test this whole "vibe coding" phenomenon on myself — building applications by talking to AI instead of writing code.

My weapon of choice: Claude AI through the Cursor IDE. My mission: an Android application for managing exam grade sheets.

The First 40 Minutes

The first version of the app was created in just 40 minutes. That's the hook, the seductive promise of vibe coding. You describe what you want in natural language, and the AI generates working code. The app could create exams with a scoring system, manage a student list, assign grades from 2 to 5 with comments, filter students by status, and schedule retakes.

For a prototype, it was impressive. The total development time, including all the iterations and bug fixes that followed, was about 6 hours.

When Things Get Real

The problems started when I actually tried to use the app during a real exam.

The generated code had shoved all logic into a single MainActivity file. Composable functions were mixed indiscriminately. While the application used the Room database framework and basic MVC patterns, it completely lacked proper module organization. Alert dialogs for data entry were embedded directly in the main activity rather than separated into logical components.

But the real showstopper was a critical bug that appeared during an actual exam: grades were mysteriously disappearing after applying filters.

The Critical Bug

Investigation revealed the culprit: a foreign key constraint configured with onUpdate = ForeignKey.CASCADE. This caused grade records to be deleted whenever exam records were updated — which happened every time a student's machine IP address was recorded.

// The problematic code:
@Entity(
    foreignKeys = [ForeignKey(
        entity = Exam::class,
        parentColumns = ["id"],
        childColumns = ["examId"],
        onUpdate = ForeignKey.CASCADE  // THIS was the problem
    )]
)

The fix was simple — changing to ForeignKey.NO_ACTION — but it was something the AI hadn't anticipated. And discovering the root cause required actual debugging skills and understanding of how Room's foreign key constraints work.

The Vibe Coding Paradox

Here's the fundamental paradox I discovered: to effectively use AI for coding, you need to already know how to code.

When the application needs to do something real — not just display a prototype — you can't avoid technical terminology and platform-specific knowledge. You need to know what an Activity is, what a ToggleButton does, how a ToolBar works. Natural language descriptions become insufficient the moment complexity rises above trivial.

Architecture Requires Human Design

AI cannot independently break a system into logical modules. It doesn't think about separation of concerns, about which components should be isolated, about how the application will evolve over time. Architecture requires human judgment — the kind that comes from experience building and maintaining systems.

The Professional Pyramid Problem

Replacing junior and mid-level developers with AI undermines the entire career progression pathway. Software architects don't appear out of thin air — they emerge from years of experience at earlier levels. Eliminate junior positions, and you create a future shortage of qualified architects and senior engineers.

Where's the App Explosion?

Despite enthusiastic claims about AI democratizing development, where is the actual "Cambrian explosion" of specialized applications in the app stores? Highly specialized niche applications remain economically unviable for professional developers yet too complex for non-technical users to build independently — even with AI.

The promise was that everyone would build custom apps for their specific needs. The reality is that the gap between "working prototype" and "reliable production application" remains as wide as ever.

The Historical Parallel

I compare the current state of vibe coding to the courses on "proper internet searching" that were popular in the early 2000s. Back then, knowing how to use Google effectively was a marketable skill. Today, it's so basic it's invisible. The same will happen with AI-assisted coding — once the baseline competency becomes universal, the skill stops being a differentiator.

Current vocational training in "prompt engineering" and "vibe coding" resembles those early internet courses — it will become irrelevant faster than anyone expects.

Conclusion

Vibe coding works for simple tasks. For anything beyond that, it requires a programmer who understands the fundamentals. The AI is a tool, not a replacement.

If you don't understand how to develop applications, then for now, all these promises are just marketing fairy tales.

Vibe coding will truly win only when ordinary people can create applications "for themselves" without any deep knowledge of architecture, platforms, or programming patterns. We're not there yet. And given the critical bug I encountered during a real exam, I'd argue we're further from that future than the hype suggests.