In some random bout of boredom-leads-to-something, triggered by an equally random YouTube short about hot new AI-based IDE (Cursor), I decided that it was time to upgrade from my VS Code + Copilot setup and have a taste of whatever the hype-train was around these new-age VS Code-forks that promised better developer experience through seamless AI-integration.
Afsheen had spoken briefly about using Cursor a while ago and I remembered nothing of that so I pinged her to get some first-hand experience reports of the IDE. The discussion led me down a side-quest of YouTube videos (because who doesn't like to watch others use a tool?) and out popped another tool (Windsurf) that a few random strangers were declaring to be better than Cursor. Confusion ensued: should I try Cursor or Windsurf? (Not-so-spoiler alert: I have decided to try both).
I imagine (and hope) this to be an ongoing series of my comparative experiences with Windsurf and Cursor.
For my first trick, I had to add some frontend functionality to an existing legacy-looking codebase that has some of the most convoluted React code I've seen in recent times. Having only recently been shifted to this team at work, I am quite new to the codebase and have had about a week's worth of exposure to it in total. All that preamble to say if you asked me where to make the change, it would take me a few minutes to find out the exact file and then some to decipher the internal monologue and logic of the developer who wrote the code.
The plan was to just use Windsurf and get the job done but it was a Friday evening and the battering rains foiled any plans of going out so I decided to repeat the feat with Cursor and compare. This is what I found so far.
Windsurf is/feels faster
With Claude 3.5 Sonnet as the main LLM in both, Windsurf felt faster both in generating responses and getting things done. Responses to the global chat (Cmd + L, which Windsurf calls Cascade) came real quick in Windsurf, but there is a perceptible lag in Cursor.
Not that there's a need for speed (correctness is more preferable), but the slowness is tolerable if the eventual answers and suggestions were more taut and correct but as it turned out in this specific escapade, Cursor's suggestions were just on-par with Windsurf's, never better, sometimes worse.
Windsurf's "Write" mode beats Cursor + Verifying code suggestion in a smaller frame is hard!
Cursor is polite — when tasked with explicit instructions (in the main chat window) that can be taken as "here, modify my files", Cursor still only offers suggestions in its chat sidebar (which, of course, you can expand for convenience) which you then verify and commit by clicking on the tiny "Apply" option atop every code-block. Windsurf, on the other hand, is bold: with the "Write" mode in the chat, it will go ahead and take decisions for you, be it creating new files in directories colocated near where the action takes place or be it modifying existing files. (note: I am told Cursor's Pro plan has a similar behavior but I haven't verified that yet.)
This boldness makes the experience of introducing change into your codebase quicker. And better too, because verifying large snippets of code in a small sidebar is painful at best and almost impossible at worst. By writing out the changes into the file, Windsurf lets you verify/check the code suggestion right in the main window that makes for a better experience.
It's easier to add file contexts in Cursor
It is relatively easy to add file contexts in Cursor. Want to instruct it to use the whole codebase? @codebase
does the trick. Want to combine two open files from the editor? Just @files
will show you the recent ones (while also allowing you to include other files that aren't open). This simple act is hard to perform in Windsurf (that or I haven't found the way to do it). The [docs] suggest that Windsurf's context includes the open files by default and it anyway has the context of the whole codebase which probably explains why Windsurf was able to locate the right files better than Cursor could. But Cursor's explicit context addition in the chat window gives a lot more confidence in what the AI is asked to see before conjuring up solutions.
Windsurf was more often right
One of the earliest steps in my approach to implementing the feature was to know where to make the edits. I asked both Windsurf and Cursor to tell me where to make the change. Windsurf found the file in the first try; Cursor needed additional prodding and keywords before it could land on the right file.
In a subsequent step, I asked the IDEs to write me a form involving a date-time picker. Windsurf, even on the first try, used an existing, custom date-time picker component that the project uses. Cursor, even after multiple tries, could not. At first, it used a native component. When I asked it to look for a custom datepicker within the codebase and use that, Cursor decided that I had to install a date-picker component from npm
and use it. Finally, after a couple more tries, I decided to point the file to it and only then Cursor was able to figure out the right code I was looking for.
Windsurf "took initiative" and went the whole nine yards
The feature that I was tasked to add, which I was outsourcing to the AI, was a simple little menu item which then calls a GraphQL mutation. Now, my instructions to the IDEs did not have me talking about the mutation at all. Instead, I just said something along the lines of "hey, I need to add this menu item which does this action." and then proceeded to ask the IDE to iterate incrementally.
Cursor did manage to add the menu item and the modal and the form in the model (which is where the datepicker shenanigan happened) but it could not supply a suitable ending to the episode in that, it couldn't figure out how to tie the menu item with (even if wrong) a GraphQL call.
Windsurf, on the other hand, seemed to remember the main goal of the feature and came up with an almost right implementation finishing with the GraphQL call too. Since I started with Windsurf, it almost felt feature-complete by the time I had done with it.
Was it a matter of different token sizes or was it something else? I can't yet know.
—
For now, Windsurf seems to have taken the lead. The UX is definitely better than that of Cursor. I feel a lot more productive in it. In the coming days, I hope to have a lot more development requirements covered in both the IDEs to get a better sense of how each works and who's better in what.
Top comments (0)