People often pause to think when I criticize LLMs, specifically programming with LLMs (I will not start using this new stupid term for it).
Either they disagree with me or think I'm out of touch with the progressive world of LLM-driven development, that I don't know how to do prompt "engineering". I don't know 🤷♂️
A couple of times people have already DM'd me asking - which model am I actually using in Cursor, maybe I'm clicking something wrong here, and instead of Sonnet 3.7, default is selected?
I perfectly understand the mainstream excitement about LLM-driven development, it's easy to reconstruct, and for the most part, I sincerely share it.
Cursor (with Anthropic models) greatly speeds up development, routine coding, generating large fixtures based on models, simple functions "in a vacuum" and so on. It helps to factorize code chunks faster, and move them around better than just renaming in an IDE and manual copying.
Dear colleagues, I criticize LLMs mostly to spark in you the desire to think with your head, a spark that's already absolutely priceless nowadays.
I sincerely wish that you wouldn't "become stupid at breakneck speed" and catch yourself spending 20 minutes poking at prompts when the LLM doesn't understand you, trying this way and that to stuff files into the context - instead of finally writing code yourself properly, according to your understanding.
Furthermore, I strive for you not to forget that starting from middle+ and especially from a senior belly size position at work, your activities will consist less and less of writing code and more and more of making architectural decisions and puzzling out processes.
Tasks will become increasingly complex in terms of their systemic nature and dependencies, they will involve more and more other agents, people or bots - it doesn't matter, these tasks won't get particularly easier.
If you think that most of an engineer's job (especially if the engineer is adept at systems engineering) is just writing code, drawing UML/Mermaid diagrams, making architectural decisions, and so on – it is not.
The less you are a coder-programmer-individual-contributor, and the more you are an engineer, the more your work will resemble that of a professional detective in some good psychological thriller.
Dude, we've got a body, could be murder.
The main engineering work, if we're talking about mature, result-oriented, and reasonable engineering – feels like detective work, in a quite a mystically complicated case.
You need to interrogate all witnesses, and you also need to interrogate the main suspect (oh, I mean the main stakeholder), whom, by the way, you still have to find because it's not always clear who it is in each specific case.
Besides, you probably have a bunch of "police officers" working with you, some of whom are alcoholics and drug addicts might be extremely inconsistent in their beliefs and difficult to communicate with.
But even if everything is in perfect order with subordinates, each of them individually finds common ground with you – they all see the world in their way, have their own opinion on the project, opinion on who the main suspect is, opinion on what the solution and the ultimate goal should be, while rarely finding this common ground with each other as well as they do with you.
It turns out that the job of such an engineer-detective is not only to punch faces in alleys and drink single malt whiskey with tormented eyes but primarily to make all strategic decisions on solving the case, get all colleagues and suspects to talk to each other in common language, put them in their places, in the sense that the case successfully moves toward resolution and everyone is happy with their work, and the bosses with the clearance rate.
LLMs are simply not capable of such detective work, and in my stupidity, working with Cursor for some time, I stubbornly tried to communicate with it in such an engineering language (well, it's interesting to test the limits, right?), because it seems that's why they gave the ability to add different files for context in the chat... 🤔
After adding all related modules, describing architectural issues in quite detail, Cursor too often starts to seriously drizzle.
Interestingly, switching to the tab with regular Sonnet, and asking a question in almost the same format, but apparently without some "project context" (that Cursor might somehow collect under the hood) often gives sensible answers.
For this reason, I stopped struggling and tried to ask flatter, more specific requests, more and more often in chat mode, not "composer/agent", just the same way I was working with Sonnet, before I had started to use Cursor.
Besides that, and this is very important – an LLM will never "argue" with you.
All your instructions, right or wrong, the LLM happily takes to work, leading you down an increasingly crooked path. So if we don't have a circuit braking mechanism in our mind for self-reflection, to at least somehow try to check our hypotheses regarding some piece of project design before blindly giving them to the LLM to work on - we're completely screwed.
Here I had the thought that I maybe could stuff something like - NEVER AGREE RIGHT AWAY with my hypotheses in `.cursorrules`, but I sense that this might only make things even worse.
If you ask the LLM very specifically, as flat as possible, precisely, but moderately detailed (roughly as a good senior assigns a task to a good junior) - the results are almost always impressive.
Enthusiastic moans might scare with the potential volume of new shit code and the new speed of generating this crappy code. But they don't scare, because there's already more than enough of such code. We did train LLMs on something after all :)
Everyone is happy - both programmers, who now have to think even less, and business owners, who don't care about clean architecture, technical debt, and stuff – as long as the features are delivered faster and more money flows in.
My line is very simple, and not even bent – in both the old and new LLM world, the one who trains their main "muscle" won't be lost.
You need to think.