Featured image of post Cursor Is Brilliant—And Here's Why I Still Hate Using It
Technology Software Engineering Developer Tools AI-Assisted Development Engineering Productivity

Cursor Is Brilliant—And Here's Why I Still Hate Using It

When you need control over fanciness: why the smartest AI IDE fights serious engineering work, and what actually matters for pragmatic developers.

Let me tell you about the $600 burnout.

Two-thirds through the month, I’d already exhausted my Cursor quota. Not because I was being careless—I was just doing my job. Eight hours a day of building features, reviewing code, tweaking implementations. The kind of work that requires a senior engineer who cares about type-strict Python, modular architecture, and maintainable systems.

I sat there, staring at the “upgrade to pay-as-you-go” prompt, feeling something I hadn’t expected: exhaustion mixed with resentment. Cursor is brilliant. Its retrieval system finds scattered dependencies across your codebase like magic. Its context understanding makes other tools feel prehistoric. It rarely fails.

And yet, in that moment, I realized I’d been fighting it for weeks.

This isn’t a typical tool review. I’m not here to crown a winner or tell you what to buy. I’m a full-stack engineer running an AI startup, with a master’s in ML and strong opinions about code quality. I need tools that respect my judgment, not override it. What I learned using Cursor, Windsurf, and Claude Code for months revealed something more interesting than “which is best”—it exposed two fundamentally different philosophies about what AI-assisted development should be.

The Problem Nobody Talks About: Cognitive Predictability

Here’s what every review misses about pricing.

Cursor shows you token burn in real-time. Seems transparent, right? Except I had no idea what it actually meant. How much does a refactor cost? A feature implementation? A complex architectural change? The numbers were visible but meaningless.

I’d hesitate before exploring ideas. “Should I ask it to try this approach, or will that burn through my quota?” That hesitation—that’s the real cost. Not the dollars, but the cognitive overhead of constantly calculating whether a thought is “expensive enough” to pursue.

Then I tried Windsurf again.

Their pricing model is almost boring in its clarity. Every model has an explicit credit multiplier. Opus uses 3x credits. The million-token Sonnet? 10x credits. You know before you ask whether something will be expensive. Within a week, I’d internalized the pattern: roughly $10 per day of normal development work.

I set up auto top-up and stopped thinking about it entirely.

The psychological difference was striking. Not because Windsurf was cheaper—at similar usage intensity, they cost about the same. But because I could predict it. My brain could offload that worry and focus on the actual work. Cursor’s opacity created a constant background anxiety that I didn’t even notice until it was gone.

Opaque pricing doesn’t just affect your budget. It affects your thinking.

When Smart Tools Fight Smart Developers

I need to be precise about something: Cursor rarely makes mistakes. Its code is usually correct. Its suggestions are often clever. This isn’t about technical failure—it’s about something more subtle.

Let me show you what I mean.

My entire codebase uses single-line docstrings. Every function, every class—just a concise description of what it does. I’m strict about type hints at the function signature level, no type decorations cluttering the docstrings. When I use Pydantic models, that’s the pattern everywhere. The codebase is screaming its conventions at you.

Windsurf sees this and follows it. New code matches existing patterns. If the codebase uses Pydantic, the new feature uses Pydantic. If docstrings are single-line, they stay single-line. It treats your codebase as the source of truth.

Cursor sees this and… ignores it.

Unless I explicitly prompt “use single-line docstrings,” it generates multi-line ones. Even when literally every surrounding function uses single-line format. It wants to write tests. It wants to generate summary documentation. It has opinions about how code should look, and those opinions override what your project is telling it.

You can fight this with prompting. Every time I carefully articulate what I want to build, I also have to remember to say: “Follow the existing code style. Use single-line docstrings. Use Pydantic. Match the type hint patterns.” It’s like having a brilliant colleague who needs to be constantly reminded that they’re not working on their own project.

This creates an exhausting loop. I word my intent carefully, expecting a thoughtful proposal. Instead, Cursor immediately jumps to code editing, applying its global style defaults. I have to stop it, reassert constraints that should be obvious from the codebase, and restart. The tool itself becomes part of my cognitive load.

Here’s what makes this particularly frustrating: this behavior makes sense for beginners. If you’re learning, opinionated defaults teach good practices. The problem is that Cursor optimizes for the median developer—someone who needs guardrails. For senior engineers with established patterns and strong preferences, those same guardrails become chains.

I don’t want my tools to have opinions about my code style. I want them to learn mine.

The One Thing Cursor Actually Gets Right

I need to be fair here, because Cursor’s retrieval system is genuinely impressive.

When you ask Cursor a question about your codebase, it shows you its search in action. That “searching…” indicator isn’t just UI polish—it’s reflecting a powerful RAG system finding relevant context. It’s explicit, visual, and frequent. You can almost watch it think.

This makes Cursor exceptional at project-wide planning. Need to implement a feature that touches multiple services? Cursor finds the scattered pieces, understands the dependencies, and gives you a coherent proposal. It’s like having a colleague who’s memorized your entire codebase.

Windsurf has “Quick Context,” but it’s rarely invoked automatically. You have to explicitly ask for it, and even then, it feels more like keyword search than semantic retrieval. Fast, yes. But less powerful. Sometimes it traces files instead of actually searching for concepts.

The frustrating part? Cursor’s strength is also its weakness. Because the search is so opinionated and automatic, you can’t always tell when to trust it. I’ve had Cursor confidently delete code because its search didn’t find a feature—even though that feature existed and was important. When I catch this happening, I have to tell it: “Read the whole file, don’t search.” But sometimes it searches anyway.

This perfectly captures Cursor’s philosophy. The system is smart enough to be useful and opinionated enough to override you. For exploration and architecture planning, that’s valuable. For careful implementation of critical code, it’s dangerous.

The Mental Load You Don’t Notice Until It’s Gone

There’s a specific kind of frustration that’s hard to articulate. Not anger—more like background static.

With Cursor, I’m always aware I’m using Cursor. Will this prompt be expensive? Did it follow my style? Is it about to apply its defaults? Should I stop it before it generates tests I didn’t ask for?

With Windsurf, I think about the code.

That’s it. That’s the difference.

Windsurf occasionally hangs on tool calls—running multiple commands in parallel sometimes causes the first few to never stop. That’s a real bug, purely in their execution engine. But you know what? It doesn’t frustrate me the same way Cursor’s behavior does.

Because when Windsurf fails, it’s failing while trying to do what I asked. When Cursor frustrates me, it’s succeeding while doing something I didn’t ask for.

There’s a principle here: reliability without respect isn’t helpful. Cursor is more reliable technically—I rarely see it actually crash or error out. But Windsurf respects my intent more deeply. Given the choice between a tool that works perfectly but fights me constantly, and a tool that occasionally stumbles but fundamentally aligns with my goals… I’ll take the latter.

What Actually Matters: The Model, Not the Wrapper

Here’s something that took me months to realize: code quality comes from the model, not the IDE.

Claude Opus generates excellent code. Clear structure, proper types, handles edge cases well. Usually one or two iterations to get exactly what you want—assuming your prompt is clear. (Nothing can save you from bad prompting, by the way.)

Claude Sonnet is faster but noticeably weaker on complex type systems. It struggles with Python generics. Makes more syntax errors. For planning and proposals, it’s fine. For implementation of type-strict, high-quality code, it’s inadequate.

The IDE’s job should be simple: stay out of the model’s way. Let Opus be Opus. Let Sonnet be Sonnet. Provide context, handle tooling, then step back.

Cursor doesn’t step back. It wraps the model in layers of prompt orchestration. Forces conventions, generates extra artifacts, enforces style. Sometimes this improves the output for beginners. For experts, it degrades what the model could have produced on its own.

This is why I find myself switching back to Windsurf when I need serious, production-quality code. Not because Windsurf is smarter—it’s not. But because it trusts the model enough to mostly leave it alone. I get closer to what Claude Opus is actually capable of, without an IDE’s opinions interfering.

Why I Use Both (And Why You Might Too)

After months of frustration, experimentation, and honest assessment, here’s what I’ve learned:

I use Cursor for exploration. When I’m starting a new feature, trying to understand how different parts of the codebase connect, planning architecture—Cursor’s RAG system is unmatched. It’s worth the mental overhead for that initial phase. I get a clear map of what needs to change and why.

Then I switch to Windsurf for implementation. When I know what needs to be built and I need it done right—clean types, consistent style, modular structure—Windsurf respects my codebase’s patterns. The code it generates fits naturally into what already exists.

And when I’ve burned through quotas on both? Claude Code becomes the fallback. All-or-nothing interaction, but at least it’s thinking is sharp. I can’t edit incrementally, but for architectural decisions or complex reasoning, it still delivers.

This isn’t indecision. It’s pragmatism. Different tools for different phases of work.

The uncomfortable truth is that neither Cursor nor Windsurf is “better.” They represent fundamentally different philosophies about what AI assistance should be. Cursor is productized intelligence—heavily orchestrated, optimized for consistency across millions of users, opinionated by design. Windsurf is model-first intelligence—thinner abstraction, codebase-driven behavior, fewer guardrails.

If you’re a beginner or working on unfamiliar territory, Cursor’s opinions help you. If you’re a senior engineer with strong preferences and established patterns, those same opinions fight you.

The IDE I Actually Want to Use in Five Years

Right now, we’re in the hype phase. Everyone’s building “AI agents” and treating prompts like trade secrets. Cursor hides its orchestration entirely. Windsurf is more transparent but still opaque. We’re supposed to trust these black boxes because AI is magic and mysterious.

But the hype will fade. It always does. And when developers start caring more about productivity than novelty, something will shift.

The winning IDE won’t be the smartest. It’ll be the most honest.

I want an IDE that completely exposes its agent prompts. Not just makes them accessible if you hack around—actually shows them to you. In the UI. As first-class configuration. “Here’s what I’m telling the model. Here’s the context I’m injecting. Here’s the style guidance I’m applying. Change any of it.”

Full customizability. Per-project preferences. Per-user behavior profiles. Even AI-assisted prompt tuning—let me tell the IDE “be more like Windsurf” and have it adjust its orchestration accordingly.

This isn’t radical. It’s just taking developers seriously. We’re the users. We understand prompts. We can handle complexity. Stop treating us like consumers who need hand-holding and start treating us like engineers who need control.

The best AI IDE won’t have opinions. It will learn yours.

What This Means for You

If you’re evaluating these tools, here’s what actually matters:

Choose Cursor if:

  • You’re learning or working in unfamiliar domains
  • You need powerful project-wide context and planning
  • You’re okay with opinionated defaults and can work within them
  • You have predictable, moderate usage patterns

Choose Windsurf if:

  • You’re a senior engineer with strong style preferences
  • You prioritize code quality and codebase consistency
  • You want transparent, predictable pricing
  • You’re willing to manually invoke context when needed

Choose both if:

  • You do complex, multi-phase development work
  • You can afford the cognitive overhead of switching
  • You value exploration (Cursor) and implementation (Windsurf) differently

But here’s the deeper insight: don’t evaluate AI IDEs like you evaluate programming languages or frameworks. Evaluate them like you evaluate working relationships. Does this tool respect your expertise? Does it impose cognitive overhead or reduce it? Does it amplify your thinking or fight your intent?

Because we’re not just choosing tools anymore. We’re choosing collaborators. And the best collaborators aren’t the smartest—they’re the ones who know when to lead and when to follow.


I still use Cursor. I still get frustrated by it. I still pay the bills.

But I know now what I’m paying for: powerful intelligence that comes with the cost of constant negotiation. Some days, that’s worth it. Other days, I need a tool that just… builds what I asked for, the way I asked for it.

The future of AI-assisted development isn’t about building smarter agents. It’s about building more honest ones. Tools that expose their assumptions, respect our preferences, and understand that control isn’t the opposite of intelligence—it’s a requirement for trust.

Until then, I’ll keep both IDEs open. And keep fighting for the code I actually want to write.

(Written by Human, improved using AI where applicable.)

© 2022 - 2025 Shane Zhang

All Rights Reserved