Zwei Jahre KI im Entwickleralltag: Was Copilot wirklich ersetzt hat und was nur Bequemlichkeit ist
Vor zwei Jahren musste ein Entwickler Vorschläge von GitHub Copilot noch umfangreich überarbeiten, damit sie das Code Review passierten. Heute geht die Hälfte seiner Pull Requests mit kaum bearbeitetem KI-Code live, doch ob er dabei den Überblick über den Code verloren hat, ist eine offene Frage.

Veröffentlicht am 9. Oktober • Zuerst erschienen auf tamiz.pro
Vor zwei Jahren konnte ich einen Copilot-Vorschlag nicht an einem Code Review vorbeibringen, ohne ihn umzuschreiben. Heute wird die Hälfte meiner Pull Requests mit KI-generiertem Code ausgeliefert, den ich kaum bearbeitet habe. Die Werkzeuge sind tatsächlich besser geworden. Die Frage, die niemand ehrlich stellt, ist, ob ich bei der eigentlichen Ingenieursarbeit schlechter geworden bin und ob meine Kolleginnen und Kollegen, insbesondere die Junior-Entwickler, stillschweigend ausgehöhlt werden von einem Assistenten, der jede Frage beantwortet, bevor sie sich durch sie durchkämpfen.
Das ist keine KI-kritische Tirade. Es ist eine technische Bestandsaufnahme einer Entwicklerin oder eines Entwicklers dessen, was sich verändert hat, was wirklich ersetzt wurde und was stillschweigend erodiert ist. Die Unterscheidung zwischen diesen beiden Kategorien ist das eigentliche Argument dieser Analyse.
Es gibt echte, messbare Kategorien von Arbeit, die KI-Coding-Assistenten tatsächlich automatisiert haben. Das sind keine Verluste. Das sind Gewinne.
Boilerplate und Grundgerüste. Eine React-Komponente nach Spezifikation generieren, einen CRUD-Endpoint schreiben, ein Dockerfile erstellen, ein Test-Fixture einrichten, das war intellektuell nie interessant. Diese Aufgaben haben Zeit und Aufmerksamkeit verbraucht, die Architekturentscheidungen oder Debugging hätten zukommen können. KI erledigt diese Aufgaben inzwischen gut. Eine Junior-Entwicklerin, die zwanzig Minuten mit einer Boilerplate-Vorlage verbringt, kann diese Zeit stattdessen nutzen, um den Datenfluss des Systems zu verstehen.
Dokumentation und API-Nachschlagen. Vor der KI habe ich mehr Zeit damit verbracht, TypeScript-Typdefinitionen zu lesen, als Code zu schreiben. Ich öffnete die Dokumentation einer Bibliothek, suchte nach der passenden Überladung und stellte fest, dass die Funktionssignatur, an die ich mich erinnerte, aus einer Version vor zwei Releases stammte. KI-Assistenten beantworten diese Fragen heute im Kontext, mit einer Genauigkeit, die sich dramatisch verbessert hat. Das ist reine Zeitersparnis ohne kognitive Kosten.
Regex, Datums-Parsing und String-Manipulation. Das war die Steuer, die Entwickler für die Arbeit mit Text zahlten. KI schreibt Regex-Muster, Datumsformatierungs-Utilities und String-Transformationen, die beim ersten Versuch funktionieren. Das ist eine echte Ablösung, nicht weil die Aufgabe schwer war, sondern weil der kognitive Aufwand, sie korrekt zu erledigen, in keinem Verhältnis zu ihrem Wert stand.
Testgenerierung für unkomplizierte Fälle. Unit-Tests für reine Funktionen, Snapshot-Tests und Grundgerüste für Integrationstests werden heute zuverlässig generiert. Die generierten Tests sind nicht immer aussagekräftig, aber die strukturelle Arbeit des Schreibens ist erledigt.
Wenn Ihre tägliche Arbeit von diesen Kategorien dominiert wird, hat KI Sie produktiver gemacht. Das ist eindeutig. Ich argumentiere nicht dagegen.
Der besorgniserregende Trend ist nicht die Ersetzung. Es ist die Ersetzung von Verständnis durch Vorschläge. Lassen Sie mich konkret beschreiben, was ich in meiner eigenen Arbeit und in der Arbeit der Junior-Entwickler in meinen Teams beobachtet habe.
Debugging ist zu Suchen-und-Einfügen geworden. Wenn ein Fehler auftritt, ist der Reflex nicht mehr: „Lass mich den Call Stack durchgehen und verstehen, warum das passiert ist.“ Sondern: „Lass mich die KI fragen, was dieser Fehler bedeutet und was ich ändern soll.“ Das funktioniert, bis die KI Ihnen eine plausible, aber falsche Erklärung gibt, und Sie sie anwenden, ohne sie zu überprüfen. Ich habe das in meinem Team wiederholt beobachtet. Ein Entwickler fügt einen von der KI vorgeschlagenen Fix für eine Race Condition ein, er scheint in Tests zu funktionieren, und dann tritt er in der Produktion unter Last auf, weil die KI vorgeschlagen hat, ein setTimeout hinzuzufügen, statt den asynchronen Ablauf wirklich zu verstehen. Der Fix war syntaktisch korrekt und semantisch falsch.
Typsicherheit wird umgangen. TypeScript existiert, um ungültige Zustände unrepräsentierbar zu machen. Wenn Sie Code von Grund auf schreiben, setzen Sie sich mit dem Typsystem auseinander. Sie fragen: „Was akzeptiert diese Funktion tatsächlich?“ Wenn Sie KI-generierten Code einfügen, überspringen Sie diese Auseinandersetzung. Der Code kompiliert. Die Typen sind falsch. Der Fehler erscheint drei Ebenen weiter unten in der Produktion. Ich habe Pull Requests geprüft, in denen die KI einen any-Cast generiert hat, um einen Typfehler zum Verschwinden zu bringen, und der Entwickler hat ihn gemerged, ohne zu hinterfragen, warum der Cast nötig war.
Architekturentscheidungen werden an Autocomplete ausgelagert. Das ist der Punkt, der mich am meisten beunruhigt. Wenn eine Junior-Entwicklerin fragt: „Wie sollte ich dieses Modul strukturieren?“ und die KI ein Muster zurückgibt, übernimmt sie es, ohne zu prüfen, ob es zum System passt. Die KI hat keinen Kontext zu den Konventionen Ihres Teams, Ihren Deployment-Beschränkungen oder Ihren Performance-Anforderungen. Sie gibt Ihnen eine Lehrbuchantwort, und Lehrbuchantworten scheitern in der Produktion, weil die Produktion kein Lehrbuch ist. Ich habe das bei Entscheidungen zum State Management, bei Datenbankschema-Designs und bei API-Vertragsentscheidungen gesehen. Der Vorschlag der KI war für sich genommen vernünftig. Er war falsch für das System.
Der Kampf wird übersprungen, und der Kampf war das Lernen. Das ist der philosophische Kern meines Arguments, aber ich werde es in der Technik verankern. Wenn Sie eine Funktion von Grund auf schreiben und sie scheitert, lernen Sie, warum sie gescheitert ist. Sie lernen die Semantik der Sprache, das Verhalten der Bibliothek, die Grenzen des Systems. Wenn Sie Code aus einem Prompt generieren und er funktioniert, lernen Sie nichts. Sie haben ein funktionierendes Feature. Sie haben kein Verständnis. Sechs Monate später, wenn dieses Feature unter anderen Rahmenbedingungen angepasst werden muss, können Sie es nicht anpassen, weil Sie nie das mentale Modell aufgebaut haben. Sie können es nur neu generieren und hoffen, dass der neue Prompt etwas Kompatibles hervorbringt.
Das ist keine Hypothese. Ich habe ein Teammitglied, das seit achtzehn Monaten KI-gestützt entwickelt. Dessen Codeausgabe ist umfangreich und generell funktional. Aber wenn ich es bitte, die Begründung hinter einer nicht offensichtlichen Designentscheidung in seinem eigenen Code zu erklären, kann es das nicht. Es bittet die KI, es ihm zu erklären. Die KI gibt eine plausible Erklärung. Es nickt. Es versteht nicht.
Ich argumentiere nicht, dass KI nicht genutzt werden sollte. Ich nutze sie täglich. Ich argumentiere, dass es ein Spektrum gibt und wir unbemerkt zum falschen Ende desselben abrutschen.
Das produktive Muster: Sie verstehen die Aufgabe. Sie schreiben den Code. Sie bitten die KI, ihn zu prüfen, Verbesserungen vorzuschlagen oder Randfälle zu finden. Die KI ist ein zweites Augenpaar. Sie bleiben der primäre Autor. Dieses Muster erhält die Weiterentwicklung der Fähigkeiten und beschleunigt gleichzeitig die Ausgabe.
Das bequeme Muster: Sie beschreiben, was Sie wollen. Die KI generiert Code. Sie fügen ihn ein. Sie testen ihn. Wenn er funktioniert, liefern Sie aus. Die KI ist der primäre Autor. Sie sind das Zustellvehikel. Dieses Muster erzeugt Ausgabe und baut gleichzeitig Fähigkeiten ab.
Der Unterschied ist nicht im ausgelieferten Code sichtbar. Er wird sechs Monate später sichtbar, wenn das System geändert werden muss oder wenn ein Fehler auftritt, der Verständnis statt Mustererkennung erfordert. Im ersten Fall haben Sie das mentale Modell. Im zweiten Fall nicht.
Ich habe auf der Grundlage dieser Bestandsaufnahme gezielte Anpassungen vorgenommen. Das sind keine Regeln. Es sind Praktiken.
Ich schreibe zuerst und frage dann. Bei allem Nicht-Trivialen, bei jeder Funktion mit Geschäftslogik, bei jeder Architekturentscheidung, bei jedem Code, der geteilten Zustand berührt, schreibe ich die erste Version selbst. Dann bitte ich die KI, ihn zu prüfen. Ich frage, was ich übersehen haben könnte, welche Randfälle existieren, ob mein Ansatz eine bessere Alternative hat. So bleibe ich in der Autorenrolle und nutze die KI als Mitarbeiter.
Ich frage nach dem „Warum“, bevor ich nach dem „Was“ frage. Wenn die KI einen Fix vorschlägt, ist meine erste Frage nicht: „Soll ich das anwenden?“ Sondern: „Warum tritt dieser Fehler auf, und warum behebt dieser Fix die Ursache?“ Wenn die Erklärung der KI nicht mit meinem eigenen Verständnis des Systems übereinstimmt, gehe ich weiter nach. Wenn die Erklärung etwas offenbart, das ich nicht wusste, lerne ich. Wenn sie zeigt, dass die KI das System nicht versteht, ignoriere ich den Vorschlag.
Ich prüfe generierten Code auf Typsicherheit und Annahmen. Jeder KI-generierte Codeblock durchläuft eine Prüfung, die speziell nach any-Casts, impliziter Typumwandlung, unvalidierten Eingaben und versteckten Annahmen über die Umgebung sucht. Die KI kennt Ihr Deployment-Ziel, Ihre Datenbeschränkungen oder die Konventionen Ihres Teams nicht. Sie optimiert auf Code, der korrekt aussieht, nicht auf Code, der im Kontext korrekt ist.
Ich schütze die Lernkurve von Junior-Entwicklern. In meinem Team gilt für die ersten drei Monate einer neuen Mitarbeiterin oder eines neuen Mitarbeiters die Praxis: „Schreibe es zuerst selbst.“ Danach wird KI-gestützte Entwicklung gefördert, aber das Code Review verlangt ausdrücklich, dass die Entwicklerin oder der Entwickler ihr bzw. sein Verständnis des eingefügten Codes erklärt. Wenn sie oder er es nicht erklären kann, wird der Code nicht ausgeliefert. Das ist für uns nicht verhandelbar.
KI hat Entwickler nicht dümmer gemacht. KI hat es Entwicklern ermöglicht, dümmer zu sein und trotzdem funktionale Ausgabe zu erzeugen. Die Werkzeuge sind wirklich besser geworden. Die Produktivitätsgewinne sind real. Die Ersetzung von Boilerplate-Arbeit ist ein klarer Netto-Vorteil.
Aber die Erosion des grundlegenden Verständnisses ist ebenso real, und sie ist in Metriken nicht sichtbar. Sie wird sichtbar, wenn das System weiterentwickelt werden muss, wenn ein neuartiges Problem auftaucht und wenn eine Entwicklerin oder ein Entwickler auf einen Fehler stößt, der keinem Muster in den Trainingsdaten der KI entspricht. Zu diesem Zeitpunkt hat der Entwickler, der zwei Jahre lang Code generiert, ohne ihn selbst zu schreiben, keinen Rückfallpunkt. Sie oder er hat kein mentales Modell. Es bleibt nur das Werkzeug.
Die Entwickler, die erfolgreich sein werden, sind nicht diejenigen, die KI am haeufigsten nutzen. Es sind diejenigen, die sie richtig einsetzen, die zuerst schreiben und dann fragen, die verstehen, bevor sie einfuegen, und die die KI als Mitarbeiter behandeln und nicht als Ersatz fuer ihr eigenes Denkvermoegen.
Die KI ist besser geworden, waehrend ich weg war. Ich glaube nicht, dass wir duemmer geworden sind. Aber ich glaube, dass manche von uns bequemer werden, und Bequemlichkeit im Engineering ist ein langsamer, unsichtbarer Fehlermodus, der sich aufstaut, bis das System zusammenbricht. Die Frage fuer jeden Entwickler lautet nicht, ob er KI nutzen sollte. Sie lautet: Nutze ich KI, um mein Verstaendnis zu erweitern, oder um es zu ersetzen?
Die Antwort auf diese Frage ist in deinen Pull Requests nicht sichtbar. Sie zeigt sich in deiner Faehigkeit zu debuggen, Architekturen zu entwerfen und zu erklaeren, warum der Code so funktioniert, wie er funktioniert. Wenn du diese letzte Frage fuer deinen eigenen Code nicht beantworten kannst, hat dir die KI nicht geholfen. Sie hat nur die Abrechnung aufgeschoben.
Weitere Analysen zu den Auswirkungen von KI auf Entwickler-Workflows und Engineering-Praktiken finden Sie in Tamiz's Insights mit laufender Berichterstattung ueber die Tools und Trends, die das moderne Software-Engineering praegen.
Sollte ich Coding-Assistenten mit KI komplett nicht mehr verwenden?
Nein. Das waere ein schlechter Tausch. KI-Assistenten verbessern die Produktivitaet bei Boilerplate, Dokumentation und Routineaufgaben ganz klar. Das Risiko liegt nicht in der Nutzung von KI, sondern darin, KI so einzusetzen, dass man kein eigenes Verstaendnis aufbaut. Das produktive Muster ist: zuerst schreiben, dann fragen und immer das Generierte pruefen.
Wie erkenne ich, ob ich im bequemen Muster oder im produktiven Muster arbeite?
Der einfachste Test: Koennen Sie den von Ihnen geschriebenen Code einem anderen Entwickler erklaeren, ohne auf die KI zu verweisen? Koennen Sie eine Aenderung an diesem Code aus ersten Prinzipien debuggen? Koennen Sie erklaeren, warum Sie einen bestimmten Ansatz gegenueber Alternativen gewaehlt haben? Wenn die Antwort auf eine dieser Fragen lautet: Ich muesste die KI fragen, dann arbeiten Sie bei dieser Aufgabe im bequemen Muster.
Gilt das auch fuer KI-Tools ueber Coding-Assistenten hinaus?
Ja. Dieselbe Dynamik gilt fuer KI-generierte Dokumentation, KI-gestuetztes Architekturdesign und KI-generierte Testsuiten. Das Muster ist universell: Wenn das Werkzeug die Antwort liefert, bevor Sie das Verstaendnis aufgebaut haben, ueberspringen Sie das Lernen. Die Loesung ist dieselbe: zuerst selbst einsteigen, dann fragen und immer pruefen.
Mit Vorlagen lassen sich haeufige Fragen schnell beantworten oder Snippets zur Wiederverwendung speichern.
Sind Sie sicher, dass Sie diesen Kommentar verbergen moechten? Er wird in Ihrem Beitrag ausgeblendet, bleibt aber ueber den Permalink des Kommentars weiterhin sichtbar.
Fuer weitere Massnahmen koennen Sie diese Person blockieren und/oder einen Missbrauch melden.
Automatisch übersetzt. Das Original auf Englisch ist unten aufklappbar.
Original (Englisch) anzeigen
Posted on Oct 9 • Originally published at tamiz.pro
Two years ago, I could not make a Copilot suggestion pass code review without rewrites. Today, half my PRs ship with AI-generated code that I barely edited. The tooling genuinely got better. The question nobody asks honestly is whether I got worse at the underlying engineering — and whether my colleagues, juniors especially, are being quietly hollowed out by an assistant that answers every question before they struggle through it.
This is not an anti-AI rant. It is a developer's technical audit of what has changed, what has been genuinely replaced, and what has been quietly eroded. The distinction between those two categories is the entire argument.
There are real, measurable categories of work that AI coding assistants have genuinely automated. These are not losses. They are wins.
Boilerplate and scaffolding. Generating a React component from a spec, writing a CRUD endpoint, creating a Dockerfile, setting up a test fixture — these were never intellectually interesting. They consumed time and attention that could have gone to architecture decisions or debugging. AI handles these well now. A junior developer who spends twenty minutes on a boilerplate template can instead spend that time understanding the system's data flow.
Documentation and API lookups. Before AI, I spent more time reading TypeScript type definitions than writing code. I would open a library's docs, search for the right overload, and discover that the function signature I remembered was from two versions ago. AI assistants now answer these questions in context, with accuracy that has improved dramatically. This is pure time savings with zero cognitive cost.
Regex, date parsing, and string manipulation. These were the tax developers paid for working with text. AI writes regex patterns, date formatting utilities, and string transformations that work on the first try. This is a genuine replacement — not because the task was hard, but because the cognitive overhead of getting it right was disproportionate to its value.
Test generation for straightforward cases. Unit tests for pure functions, snapshot tests, and integration test scaffolding are now reliably generated. The generated tests are not always meaningful, but the structural work of writing them is done.
If your daily work is dominated by these categories, AI has made you more productive. That is unambiguous. I am not arguing against that.
The concerning trend is not replacement. It is the substitution of understanding with suggestion. Let me be specific about what I have observed in my own work and in the work of junior developers on my teams.
Debugging has become search-and-paste. When an error occurs, the reflex is no longer "let me trace through the call stack and understand why this happened." It is "let me ask the AI what this error means and what to change." This works — until the AI gives you a plausible but wrong explanation, and you apply it without verifying. I have seen this happen repeatedly on my team. A developer pastes an AI-suggested fix for a race condition, it appears to work in testing, and then it manifests in production under load because the AI suggested adding a setTimeout instead of properly understanding the async flow. The fix was syntactically correct and semantically wrong.
Type safety is being bypassed. TypeScript exists to make invalid states unrepresentable. When you are typing code from scratch, you engage with the type system — you ask "what does this function actually accept?" When you paste AI-generated code, you skip that engagement. The code compiles. The types are wrong. The error appears three layers down in production. I have reviewed PRs where the AI generated a any cast to make a type error go away, and the developer merged it without questioning why the cast was needed.
Architecture decisions are being outsourced to autocomplete. This is the one that worries me most. When a junior developer asks "how should I structure this module?" and the AI returns a pattern, they adopt it without evaluating whether it fits the system. The AI has no context of your team's conventions, your deployment constraints, your performance requirements. It gives you a textbook answer, and textbook answers fail in production because production is not a textbook. I have seen this with state management choices, database schema designs, and API contract decisions. The AI's suggestion was reasonable in isolation. It was wrong for the system.
The struggle is being skipped, and the struggle was the learning. This is the philosophical core of my argument, but I will ground it in engineering. When you write a function from scratch and it fails, you learn why it failed. You learn the language's semantics, the library's behavior, the system's constraints. When you generate code from a prompt and it works, you learn nothing. You have a working feature. You do not have understanding. Six months later, when that feature needs modification under different constraints, you cannot modify it because you never built the mental model. You can only regenerate it and hope the new prompt produces something compatible.
This is not hypothetical. I have a team member who has been on AI-assisted development for eighteen months. Their code output is high volume and generally functional. But when I ask them to explain the reasoning behind a non-obvious design decision in their own code, they cannot. They ask the AI to explain it to them. The AI gives a plausible explanation. They nod. They do not understand.
I am not arguing that AI should not be used. I use it daily. I am arguing that there is a spectrum, and we are sliding toward the wrong end of it without noticing.
The productive pattern: You understand the task. You write the code. You ask the AI to review it, suggest improvements, or catch edge cases. The AI is a second pair of eyes. You remain the primary author. This pattern preserves skill development while accelerating output.
The lazy pattern: You describe what you want. The AI generates code. You paste it. You test it. If it works, you ship. The AI is the primary author. You are the delivery mechanism. This pattern produces output while degrading capability.
The difference is not visible in the code that ships. It is visible six months later when the system needs to change, or when a bug appears that requires understanding rather than pattern matching. In the first case, you have the mental model. In the second case, you do not.
I have made deliberate adjustments based on this audit. These are not rules. They are practices.
I write first, then ask. For anything non-trivial — any function with business logic, any architectural decision, any code that touches shared state — I write the initial version myself. Then I ask the AI to review it. I ask it what I might have missed, what edge cases exist, whether my approach has a better alternative. This keeps me in the author seat while using the AI as a collaborator.
I ask "why" before "what." When the AI suggests a fix, my first question is not "should I apply this?" It is "why does this error happen, and why does this fix address the root cause?" If the AI's explanation does not match my own understanding of the system, I investigate further. If the explanation reveals something I did not know, I learn. If it reveals that the AI does not understand the system, I ignore the suggestion.
I audit generated code for type safety and assumptions. Every AI-generated code block gets a review pass specifically looking for any casts, implicit type coercion, unvalidated inputs, and hidden assumptions about the environment. The AI does not know your deployment target, your data constraints, or your team's conventions. It optimizes for code that looks correct, not code that is correct in context.
I protect junior developers' learning curve. On my team, we have a practice of "write it yourself first" for the first three months of a new hire's tenure. After that, AI-assisted development is encouraged, but code review explicitly asks the developer to explain their understanding of the code they pasted. If they cannot explain it, the code does not ship. This is non-negotiable for us.
AI has not made developers dumber. AI has made it possible for developers to be dumber while still producing functional output. The tooling is genuinely better. The productivity gains are real. The replacement of boilerplate work is a net positive.
But the erosion of foundational understanding is also real, and it is not visible in metrics. It is visible when the system needs to evolve, when a novel problem appears, and when a developer encounters a bug that does not match any pattern in the AI's training data. At that point, the developer who has been generating code for two years without writing it themselves has no fallback. They have no mental model. They have only the tool.
The developers who will thrive are not the ones who use AI the most. They are the ones who use it correctly — who write first and ask second, who understand before they paste, who treat the AI as a collaborator rather than a replacement for their own reasoning.
The AI got better while I was away. I do not think we got dumber. But I think some of us are getting lazier, and laziness in engineering is a slow, invisible failure mode that compounds until the system breaks. The question for every developer is not "should I use AI?" It is "am I using AI to augment my understanding, or to replace it?"
The answer to that question is not visible in your PRs. It is visible in your ability to debug, to architect, and to explain why the code works the way it does. If you cannot answer that last question for your own code, the AI has not helped you. It has delayed the reckoning.
For more analysis on AI's impact on developer workflows and engineering practices, see Tamiz's Insights for ongoing coverage of the tools and trends shaping modern software engineering.
Should I stop using AI coding assistants entirely?
No. That would be a poor trade. AI assistants genuinely improve productivity for boilerplate, documentation, and routine tasks. The risk is not using AI — it is using AI in a way that prevents you from building understanding. The productive pattern is to write first, ask second, and always audit what you generate.
How do I tell if I am in the "lazy pattern" vs. the "productive pattern"?
The simplest test: can you explain the code you wrote to another developer without referencing the AI? Can you debug a modification to that code from first principles? Can you explain why you chose a particular approach over alternatives? If the answer to any of these is "I would need to ask the AI," you are in the lazy pattern for that task.
Does this apply to AI tools beyond coding assistants?
Yes. The same dynamic applies to AI-generated documentation, AI-assisted architecture design, and AI-generated test suites. The pattern is universal: when the tool produces the answer before you have built the understanding, you skip the learning. The fix is the same: engage first, ask second, audit always.