Beyond Vibe Coding

28/09/2025 << back to Debugging Myself

In the summer of 2021, developers observed the technical preview of GitHub Copilot with a mixture of curiosity and skepticism. Some were already predicting that to secure our livelihood as programmers, we would have to incorporate it into our daily routines, and although I was among the last of that first wave of early adopters, I have to admit that to a certain extent, I have become convinced that they were right. The initial enthusiasm for the tool's potential and the first concerns about the possible negative repercussions for our jobs have given way to a kind of collective psychosis in which the prevailing narrative is one of a disruptive technology that will eliminate the need for human labor in programming.

"Probably in 2025, we at Meta, as well as the other companies that are basically working on this, are going to have an AI that can effectively be a sort of midlevel engineer that you have at your company that can write code." - Mark Zuckerberg, CEO of Meta

The claims made by major tech leaders seem to point in that direction; it is true that all companies have directed their investments towards areas, if not totally dedicated to artificial intelligence, at least related in some way. AI is on everyone's lips, and uncertainty breeds fear. All this has occurred in a very specific context: the mass layoffs of 2022. Following the hiring boom that occurred during the pandemic in 2020 and 2021, fueled by optimistic growth forecasts that were ultimately unsustainable in the long term, a very turbulent readjustment was necessary when investors and boards of directors demanded to streamline the over-inflated tech workforces.

The global economy had taken a turn, but the blame was not AI's.

From 2022 onwards, global monetary policies shifted, the demand for digital services stopped growing, and the temporal coincidence with the "AI revolution" provided a perfect scapegoat to build the narrative of a "restructuring for efficiency driven by AI." This was simpler than acknowledging they had simply made a calculation error in their previous hiring strategy.

What is certain is that, as mentioned before, a massive investment has been made in everything related to AI. We see news of the "wars" between big tech companies vying for the best talent to secure their dominance, while smaller companies also rush to grab a piece of the pie (or at least attract investors' attention). All this has created enormous pressure on workers. As programmers, we hear that "AI can do your job," so we are torn between adopting the tools to avoid becoming obsolete or fighting tooth and nail to justify the value we provide.

"I'm less interested in that question [total replacement/100% automation] than when a coder becomes 10 times more productive. And I think that could happen this year, next year, or something like that." - Sam Altman, CEO de OpenAI

Faced with the panic raised by some voices in the sector, the industry consensus is that AI will behave as an enhancer of engineers' capabilities, and its limits are recognized. The tasks that are easy for humans, such as perception or movement, are difficult for AI, while the tasks that are difficult for humans, such as abstract reasoning, are easy for AI. In the Moravec's Paradox, we find the potential for human-machine symbiosis, where each part of the binomial will be able to supplement the deficiencies of the other.

No more vibe coding.

In the debate about how to use AI—we have already moved past the discussion of whether to use it or not, let's focus on the how—my focus (and that of many others in the industry) is on automatic code generation. Eliminating the repetitive work of manually inputting code is a win for programmers. In my experience, thanks to assistants like Copilot, I can spend more time in the reviewer role, reading and thinking about code design, looking for ways to make it easier to understand and maintain, rather than dedicating it to the initial effort of getting it to work.

And this is what generative AI can do very well at the programming level: handle all the boilerplate and help create prototypes, generate unit tests, and fix minor defects. However, it should never fully replace the human intervention that ultimately ensures the code is comprehensible and maintainable by the specific team it works with and that it fits into the overall system it needs to function within. The concept of "vibe coding" focuses on achieving value very quickly, minimizing the initial effort, but it forgets that keeping maintenance effort to a minimum is just as, or more, important:

"It is more important to reduce the effort of maintenance than it is to reduce the effort of implementation" - Code Simplicity by Max Kanat-Alexander.

Code Simplicty: The Equation of Software Design

The software engineer must dedicate themselves to tasks of maximum added value that ensure systems can endure over time. This means reducing their maintenance effort and complexity, for example, with tasks that involve:

  • Architectural and Strategic Design: Ensuring the system can grow and be robust long-term (choosing design patterns, defining microservice boundaries, planning scalability, fault tolerance, and complete system security).
  • Requirements Analysis and User Experience (UX): Ensuring the correct problem is solved in the simplest way. This involves relating with stakeholders to understand the real need and translating it into clear and complete technical specifications.
  • High-Level Optimization and Performance: Improving system efficiency and reducing operational costs. Identifying and resolving the most complex algorithmic or infrastructure bottlenecks.
  • Integration and System Testing: Increasing confidence in deployment. While an AI can help create unit tests, designing complex test scenarios that simulate real user behavior and system failures is a human task.

In addition to these obvious technical points, we must not forget a key factor: mentorship. Not all value lies in the results; there is a very important part of experimentation, learning, and discovery during the process that leads to experience and innovation. Transmitting experience to other humans is difficult. Mentoring, in-depth code review that provides feedback to aid not only the development of peers as engineers but also the raising of new questions, ensuring the quality not only of the technical part of the system but also the human part—these are aspects that could hardly be replaced by machines and are essential.

It's not all about quantity production; let's talk about quality.

Faced with the idea of achieving "10 times more productive" professionals, we must ask ourselves if that is truly what we want. Firstly, this productivity must not be at the expense of quality, and we must ask ourselves: do we really need software faster? Perhaps the focus should be on producing increasingly better software, not only in terms of technical quality but also one that adds real value to humans: greater impact.

"Network tools are distracting us from work that requires unbroken concentration, while simultaneously degrading our capacity to remain focused." - Cal Newport, author of Deep Work

Deep Work in the Age of AI (Deep Questions Ep. 370)

To achieve the maximum benefit from AI tools, we must use them to eliminate toilthat manual, repetitive, low-value work that must be done to keep the system running—so that the engineer can dedicate themselves to tasks where the value contributed by a human is essential:

  • Automating Plumbing and Boilerplate:
    • Creation of files, folder structures, mocks, templates, etc.
    • Translation of schemas between technologies.
    • Mechanical refactoring: mass renaming, syntax migration, adding logs, etc.
  • Testing Assistance: Generation of basic unit tests.
  • Research and Documentation: Summarizing unknown code, generating initial documentation, or conducting searches among code repositories.

All these areas cover tasks that do not add value to an engineer's work, but upon their automation, they also do not cause a significant disruption in focus; quite the opposite: they allow one to maintain total concentration for longer periods.

In conclusion, in my experience, AI tools have allowed me to improve the quality of the code I produce: I work slower, but the result is higher quality, more maintainable, and during the process, I usually learn more than before. This is because by reducing the boilerplate and the time cost of prototyping ideas to test them, I can spend more time delving into details of how the code works and how to improve the code.

exit(0);

<< back to Debugging Myself