Blog: Latest Entries (15):


Agentur-Probleme: Verantwortung ist immer nach unten gerichtet

bbcode-image


Agenturen haben gerade viele Probleme, und es müssen neue Wege gefunden werden, wie man mit der sich verändernden Wirtschaft, Gesellschaft und Weltsituation umgeht. Ein riesiges Problem ist, dass bisher niemand einen funktionierenden Ansatz gefunden hat – oder auch nur eine Idee, wie man überhaupt einen solchen Ansatz entwickeln könnte. Ich habe es selbst versucht und musste mir eingestehen: Ich hatte nicht nur keine gute Idee, sondern nicht einmal eine schlechte.

Fehlende Kunden, KI, schlechte Wirtschaftslage – das alles lässt sich grob zusammenfassen mit: „Es fehlt das Geld, um etwas zu tun.“
Um als Agentur weiter existieren zu können, braucht man Kunden, die nicht nur den Status quo bezahlen, sondern auch genug Geld mitbringen, um Freiräume zu schaffen – um neue Wege zu gehen, Risiken einzugehen, auch mal zu scheitern. Aber genau dieses Geld ist bei den Kunden heute nicht mehr vorhanden. Gleichzeitig ist ihre Kompetenz gestiegen – sie stellen plötzlich unangenehme, weil sehr gezielte und berechtigte Fragen.

Vor fünf Jahren hat man eben 2000 € für etwas bezahlt, ohne dass ganz klar war, warum – weil es lief und das Geld da war.

Heute ist der Kampf um Kunden voll entbrannt. Jetzt muss man sich kompetent, professionell und innovativ präsentieren. Auch Verträge müssen so formuliert werden, dass nicht bei einem Problem gleich das ganze Projekt oder gar die Firma scheitert.

Das Sales-Department ist gefragt – und soll liefern. Was viele vergessen: In Agenturen spielen die Entwickler eine zentrale Rolle bei der Kundenakquise. Warum? Weil der Kunde mit seinem eigenen IT-Menschen kommt – und der zerlegt jeden Sales-Mitarbeiter argumentativ in der Luft. Sales können verkaufen, aber haben oft keine tiefere Ahnung vom Produkt oder der Dienstleistung. Deshalb sprechen am Ende meist Entwickler mit Entwicklern – oder mit Leuten, die selbst mal programmiert haben.

So kommt man auf einen gemeinsamen Stand, mit dem beide Seiten leben könnten.
Aber: Der Entwickler entscheidet nichts. Dann kommt wieder Sales – und es wird kompliziert. Die wollen mehr Geld, bessere Positionen. Wenn Entwickler verhandeln, kommt selten ein Deal dabei raus, der den Kunden „über den Tisch zieht“. Aber wenn mit ehrlicher Arbeit kein Geld mehr verdient wird, entsteht Druck – und dann sucht man eben doch Wege, irgendwie Geld rauszuholen. Auch wenn es nicht ganz sauber ist.

Sales gibt die Richtung vor. Das C-Level will: mehr Geld bei weniger Aufwand. Entwickler? Die kündigen womöglich, wenn der Druck zu groß wird. Verzögerungen? Möglich. Wenn schon die letzten Projekte nur „okay“ liefen, weil der Kunde über Probleme hinweggesehen hat und man Features nachliefern durfte, will man nicht an einen Kunden geraten, der vor Gericht um sein Geld kämpfen würde.

Also wird umformuliert, Zeiten angepasst. Nicht das Ergebnis soll bezahlt werden, sondern die Arbeit. Entwickler werden aus der Kommunikation genommen – weil sie zu ehrlich waren, sich zu gut mit dem Kunden verstanden haben.
Stattdessen schickt man eine Welle aus Inkompetenz los, um dem Kunden zu „zeigen“, dass er keine Ahnung hat und es für ihn besser sei, mehr für weniger zu zahlen. Aussagen wie: „Ein Pflichtenheft ist nur zum Nachteil des Kunden, weil er dann nicht mehr flexibel genug ist.“ – als ob es die letzten Male der Kunde gewesen wäre, der die Probleme verursacht hat.

Kommen wir zurück zum Punkt: Kunden sind kompetenter und stellen gute Fragen.
Sie wissen, dass nicht sie sich um die Agentur bemühen müssen, sondern umgekehrt – und das machen sie auch deutlich.

Plötzlich ist der Entwickler wieder gefragt, weil er sich ehrlich mit dem Kunden auseinandergesetzt hat. Wenn man in so einer Situation landet: Nicht mitmachen!
Es gibt einen Grund, warum plötzlich wieder Leute zurückgeholt werden, die schon raus waren oder nie dabei sein wollten. Es ist bereits zu spät – jetzt geht es nur noch darum, zu erklären, was der Kunde sehen will und warum er Recht hat.

Sales sagt nein.
Der Entwickler antwortet: „So geht es nicht weiter – genau deshalb sind wir jetzt in dieser Situation.“
Wenn man so weitermacht, verliert man den Kunden.

Und dann passiert etwas, das ich so noch nie erlebt habe:
Der Sales-Mitarbeiter sagt, es sei ihm egal – er würde für nichts, was er getan, gesagt oder noch sagen wird, die Verantwortung übernehmen.
Alle im Meeting nehmen das hin. Kein Widerspruch. Weiter im Text.

Was soll nun geschehen? Soll der Entwickler noch mal versuchen, den Kunden mit Argumenten zurückzuholen?
Auf keinen Fall!
Der Entwickler würde an allem Schuld sein.
Der Kunde würde das Problem allein bei ihm sehen – schließlich hat er auf das vertraut, was der Entwickler ihm vermittelt hat. Und das wurde nicht geliefert. Unter dem Subtext: „Eigentlich müsste man dich feuern.“

Wenn man wirklich, wirklich unfassbares Glück hat, merkt der Abteilungsleiter irgendwann, dass man nur das getan hat, was Sales gefordert hat – und er war dabei, als alle Bedenken vom Tisch gewischt wurden. Man hatte sich bewusst gegen die Wünsche des Kunden entschieden.

Und dann erkennt man:
Der Abteilungsleiter hat einfach nicht mitgespielt beim Spiel der Verantwortungsschieberei.
Die Verantwortung wandert immer nach unten.
Der Klassiker „Das war der Azubi“ ist bittere Realität – blöd nur, wenn man keinen Azubi hat. Dann bist du schuld.

Aber zum Glück ist das kein Problem, mit dem man leben muss – also nicht das Weiterreichen von Verantwortung an sich, sondern solche Abteilungsleiter. Wozu braucht man die überhaupt? Sie stehen nur im Weg, wenn das C-Level, das längst keinen Bezug mehr zum Alltag hat, seinen Frust direkt auf die Entwickler abregnen will. Und Entwickler? Die beschweren sich nicht – und wenn doch, sind sie zum Glück in einer Gehaltsklasse, auf die man nicht hören „muss“.

Am Ende bleibt die alte Erkenntnis:
Du HAST nicht Schuld.
Du BEKOMMST die Schuld.

KI: Schon tot, bevor es richtig losging?

bbcode-image


Ich beziehe mich hier hauptsächlich auf diesen Artikel bei Heise:
[url]https://www.heise.de/meinung/KI-Agenten-Tisch-reservieren-ist-lahm-10494271.html[url]

OpenAI hat seinen AI-Agenten vorgestellt, und für viele ist das der Beweis, dass KI schon jetzt in einer Sackgasse steckt. Es gebe keine sinnvolle Verwendung für KI, sie sei eine Lösung für ein Problem, das noch nicht gefunden wurde. Wenn man sich die Kommentare zu skeptischen Meinungen im Internet durchliest, ist die Haltung zu KI sehr eindeutig. Die Argumente sind klar: KI könne niemals etwas liefern, das für einen Menschen von echtem Nutzen sei.

Einige würden sagen, diese Leute seien einfach zu „deutsch“ und hätten nicht verstanden, wie KI (insbesondere LLMs) funktioniert. Sie hätten eine völlig falsche Vorstellung davon, was eine KI leisten kann. Aber ist es wirklich so einfach? Kurz gesagt: Ja! Doch wenn man etwas genauer hinsieht, merkt man, dass die Frage doch nicht ganz so simpel zu beantworten ist. Ich gehe mal auf ein paar Punkte ein:

Was bringt mir eine KI, die mir einen Tisch reservieren kann?
Zuerst wird sich darüber lustig gemacht, dass die KI ja „nur“ einen Tisch reservieren könne und nicht einmal richtig buche – obwohl das im Alltag zu 100 % deckungsgleich ist. Dann kommt die große Frage: Woher soll die KI wissen, was ich gerade will?

Die KI sucht irgendein Restaurant aus, reserviert zu einer beliebigen Zeit, zu der mein Kalender frei ist – und dann soll ich da hingehen, obwohl ich vielleicht gar keinen Hunger habe oder lieber Pizza statt asiatisch gegessen hätte. Genau so wäre es, wenn man der KI den Wocheneinkauf überlassen würde: Man hätte immer das Gleiche, vielleicht in völlig falschen Mengen – Woche für Woche. KIs liefern eben das, worauf sie trainiert wurden, und da jeder Mensch einzigartig ist, ist die Wahrscheinlichkeit, dass die KI etwas Passendes liefert, sehr gering. KI produziert also nur Dinge, die kaum jemand wirklich mögen kann?

KI fehlt einfach die Fantasie?
Wie jemand in den Kommentaren schrieb: KI fehlt einfach die Fantasie, um für Menschen interessante Dinge zu generieren. Egal ob Bilder, Videos, Texte oder Musik – die KI generiert nur das, worauf sie trainiert wurde, und was sie für den allgemeinen Geschmack hält.

Wenn ich die KI bitte, mir eine Geschichte zu schreiben, wird sie mir sicher nicht gefallen – denn ich lese ja am liebsten Fantasy-Romane. Eine Antwort darauf war: Die KI steckt deshalb in einer Sackgasse und könne erst dann wirklich hilfreich sein, wenn man ihr die eigenen Wünsche und Vorlieben mitteilen kann.

Und hier wird es seltsam…
Einen Weg finden, um der KI etwas mitzuteilen? Hat diese Person jemals mit einem LLM oder einer anderen generativen KI gearbeitet?

Wenn ich schreibe: „Schreib mir eine Geschichte“, mich wundere, dass mir das Ergebnis nicht gefällt, und mich dann über die KI beschwere – dann liegt das Problem wohl woanders. Viele Menschen, die KI für völlig sinnlos halten und befürchten, dass dadurch alles zum Einheitsbrei wird, betrachten KI wie ein Fernsehgerät – nur eben ohne Fernbedienung. Man müsse eben gucken, was gerade läuft. Sie erwarten, dass sie genau das bekommen, was sie sich wünschen – ohne aktiv zu kommunizieren, sondern nur passiv zu konsumieren.

Natürlich muss ich der KI sagen, was ich will. Wenn ich total unspezifisch bleibe, kommt auch nur etwas Unspezifisches heraus. Die KI kann keine Gedanken lesen.

Beschweren ist Volkssport?
Es wird sich beschwert. Sich zu beschweren ist für bestimmte Menschengruppen – oft aus dem gehobenen Alter – fast schon ein Hobby. Der Fernseher ist ein gutes Beispiel: Ältere Menschen sitzen davor, beklagen sich über das schlechte Fernsehprogramm (früher war natürlich alles besser) und sagen, sie wären lieber ins Bett gegangen (tun es aber nicht und schauen trotzdem weiter). Dabei gäbe es auf anderen Sendern durchaus Vielfalt – aber die emotionale Blockade, den gewohnten Bereich zu verlassen, verhindert das.

Eine KI kann ihre Stärken nur im Zusammenspiel entfalten. Wenn man aber selbst keine Initiative zeigt, wird auch keine brauchbare Reaktion kommen.

Kommunikationsschwäche als Kernproblem?
Viele Menschen sind nicht in der Lage, eine klare, zielgerichtete Kommunikation zu führen. Wenn jemand sagt: „Die Musik ist doof, ich mag so was nicht“, wäre die naheliegende Gegenfrage: „Was für Musik magst du denn?“ Doch viele Menschen würden daraufhin nur irritiert reagieren, lang überlegen und dann womöglich gereizt und laut entgegnen, was einen das überhaupt angehe. Man solle gefälligst selbst wissen, was man mag, und andere damit in Ruhe lassen. Auf so eine „dumme“ Frage habe man keine Lust.

Gefühlt ist diese Gruppe nicht klein. Dass diese Menschen eine KI weder verstehen noch richtig bedienen können, ist logisch. Wer seine Wünsche nicht formulieren kann, ist mit einer KI überfordert.

Heute werden KIs meist über Prompts gesteuert. Wer es nicht schafft, seine Erwartungen in einem Prompt zu formulieren, und auf eine Schnittstelle wartet, die genau das ermöglicht (was der Prompt ja bereits ist), der hat derzeit einfach keine Möglichkeit, mit einer KI sinnvoll zu interagieren.

Das eigentliche Problem ist also nicht die KI – sondern die Unfähigkeit vieler Menschen zur klaren Kommunikation. Die KI könnte fast alles liefern – wenn man ihr nur den richtigen Input gibt.

Fazit
Wenn OpenAI zeigt, dass ihr Agent einen Tisch reservieren kann, dann ist das für viele offenbar schwer als Beispiel zu erkennen. Sie nehmen es wortwörtlich – und denken nicht weiter. Dabei könnte man noch tausend andere Dinge mit der KI tun. Aber man muss eben selbst denken. Leider ist das auch nicht jedermanns Stärke.

Agentur-Probleme: Wenn das Kundenprojekt zur Geisel wird

bbcode-image


Kunden sind manchmal unzufrieden. Das ist normal. Manchmal ist es berechtigt, und in manchen Fällen liegt es eher am Kunden selbst. Oft ist es aber einfach so, dass Agentur und Kunde nicht zueinander passen. Dann ist es völlig in Ordnung, getrennte Wege zu gehen.

Problematisch wird es nur, wenn zu viele Kunden gehen wollen – und man lieber einen ungeliebten Kunden behält als gar keinen. Ich habe vor vielen Jahren zum ersten Mal gehört, dass Kunden sich zwar von Agenturen trennen möchten, aber Angst haben, dabei ihre Website oder Domain zu verlieren. Die Agentur hat die Domain gekauft – nicht im Namen des Kunden, sondern sie lediglich zur Verfügung gestellt. Das Hosting läuft auf einem Agenturserver, oft nicht sauber von anderen Projekten und Kunden getrennt, sodass ein Zugriff für den Kunden unmöglich ist.

Ich bin ein großer Verfechter davon, dass der Kunde alles selbst besitzen soll. Ich berate und helfe gerne überall, aber am Ende sollte alles wirklich dem Kunden gehören. Der Kunde muss mir Zugriff auf seine Sachen geben – nicht ich ihm auf Dinge, die ihm eigentlich ohnehin gehören.

Eine Trennung zwischen Agentur und Kunde muss nicht negativ verlaufen. Vielleicht wurde die Firma des Kunden verkauft, oder der Agenturinhaber kann den Kunden aus gesundheitlichen Gründen nicht mehr betreuen. In jedem Fall ergibt es Sinn, das Kommen genauso einfach zu gestalten wie das Gehen.

Viele Agenturen sehen das leider anders. Sie nehmen die Entscheidung des Kunden, zu gehen, persönlich – selbst wenn es vorher bereits Streit gab und eigentlich keiner der beiden Seiten mehr Lust auf die Zusammenarbeit hat. Dann wird es schwierig: Der Kunde will gehen, möchte aber natürlich seine Website, seinen Shop oder sonstige Projekte mitnehmen. Weder eine Domain zu übertragen noch ein Git-Repository zu öffnen oder zu exportieren, ist wirklich schwer oder zeitaufwendig. Das sollte innerhalb von zwei Stunden erledigt sein.

Doch manche Agenturen verhalten sich dann so, dass man schon von einer Art Geiselnahme sprechen könnte (andere würden es als Nötigung bezeichnen). Die Domain kann nicht einfach übertragen, sondern nur zu einem hohen Preis verkauft werden. Der Quellcode wird als ZIP-Datei übergeben – was angeblich so aufwendig ist, dass es natürlich teuer wird. Datenbankkopien sind angeblich nur zu ganz bestimmten Zeiten möglich – und dass der Kunde einfach auf „Exportieren“ klickt, sei ihm nicht zumutbar.

Ein besonders extremes Beispiel habe ich kürzlich erlebt: Ein Kunde, zwei Agenturen. Bei der einen Agentur geht Know-how verloren, und der Entwickler der zweiten Agentur soll Zugriff auf Code und Server erhalten, um im Notfall etwas fixen zu können. Teile des Codes stammen ohnehin von ihm, und vor 1,5 Jahren hatte er bereits Zugriff auf das Projekt. Also nichts Neues, sondern eigentlich nachvollziehbar.

Doch die Angst der ersten Agentur war: „Wenn die den Code haben, sind sie ganz weg.“ Ja – das wird passieren. Und es hat auch seine Gründe. Zugänge sauber einzurichten und den Kunden beim Übergang zu unterstützen, wäre eigentlich die beste Lösung. Das kann man auch abrechnen – und niemand würde sich beschweren. Selbst wenn noch ein bis zwei Stunden bei der Agentur verbleiben, um intern alles zu koordinieren, wird das gerne bezahlt – solange alles sauber abgewickelt wird.

Aber plötzlich 5.000 Euro zu fordern und dem Kunden mitzuteilen, dass es ein Vertragsbruch sei, wenn der andere Entwickler einen Bugfix macht – und man gegen den Kunden vorgehen würde, falls dieser nicht zahlt –, das ist einfach nur extrem. Es ging um Plugins, die speziell für diesen einen Kunden entwickelt wurden, und die sich nicht sinnvoll für andere Kunden weiterverwenden lassen, ohne nochmal viel Zeit zu investieren. Der Agentur bringt dieser Code also gar nichts.

Ich verstehe nicht, warum Agenturen lieber auf etwas sitzen bleiben (spezialisierter Code, ungenutzte Domains etc.), anstatt sich fair und professionell zu verhalten. Einen Streit mit dem Kunden zu beginnen – der womöglich in schlechten Bewertungen endet – bringt niemandem etwas.

Eine Agentur sollte in der Lage sein, professionell zu agieren – ruhig, lösungsorientiert und kompromissbereit. Selbst wenn der Kunde sich danebenbenimmt (ich wurde auch schon wegen meines Stundensatzes beleidigt…), sollte man als Dienstleister einen kühlen Kopf bewahren.

AI übernimmt die Jobs von Entwicklern

bbcode-image


Microsoft entlässt 9.000 Entwickler und ersetzt sie durch AI. Das ist mal eine Aussage – und zeigt, wie schwer es für Entwickler geworden ist. Die AI kommt und nimmt ihnen die Jobs weg. Klingt ein wenig zu einfach, um wahr zu sein ... ist es natürlich auch.

Erstens ist es bei amerikanischen Firmen immer wieder erstaunlich, wie viele Angestellte sie beschäftigen. „Hire and Fire“ führt dazu, dass man lieber mal zu viele Entwickler einstellt als zu wenige – ein Fehler, den man schnell korrigieren kann. Da werden mal eben 20 Entwickler für ein Projekt eingestellt, bis der Kunde doch abspringt – und schon werden die Entwickler einfach wieder entlassen. Der feuchte Traum eines jeden deutschen Agentur-Chefs. Dass man viele einstellt und dann in gewissen Wellen die Low Performer entlässt, ist auch nicht neu. Auch hier ist AI nicht das eigentliche Problem, sondern nur ein verstärkender oder beschleunigender Faktor.

Wenn man sich die Kommentare zu solchen News durchliest, kommt schnell der Einwand, dass die Firmen bald merken werden, dass eine AI keinen komplexen Code erzeugen kann – und dann die entlassenen Entwickler teuer zurückholen müssen. Gefühlt stammen solche Aussagen oft von Menschen, die nicht mit AI arbeiten, und deshalb eine etwas verzerrte Vorstellung davon haben, wie man mit AI-Agents arbeitet.

Jeder meiner Versuche, eine vollständige Anwendung mit Junie oder gemini-cli erstellen zu lassen, war nicht wirklich erfolgreich. Sich jedoch eine Boilerplate-Anwendung generieren zu lassen, in der man dann Schritt für Schritt seine Anwendung implementiert, lief dagegen echt gut. Ich brauchte ein winziges CMS für ein paar Seiten, ein paar Webhooks und einen AI-Agenten, bei dem sich Benutzer anmelden können. Grave war schon zu groß, also hat mir gemini-cli auf Basis meiner requirements.md genau das gebaut – und es funktionierte super. Auch der Code war ziemlich gut. Ich selbst hätte dafür sicher 3–4 Stunden gebraucht und die meiste Zeit nur primitiven Code geschrieben oder mir etwas aus alten Projekten kopiert. So war alles in 30 Minuten durch, und ich konnte direkt mit der eigentlichen Anwendung beginnen.

Brauche ich noch Designer, die mir nach meinen Beschreibungen Skizzen und Storyboards erstellen, wenn die AI das kann – und ich nach zwei Minuten einen angepassten Prompt eingebe und so in einer Stunde bis zu 30 Iterationen habe, wo ich mit einem Menschen vielleicht zwei oder drei geschafft hätte?

Im Zusammenhang mit den Microsoft-Kündigungen las man, dass sich Level-Designer ein AI-Tool gebaut haben, um das Leveldesign zu beschleunigen – und dann durch genau dieses Tool ersetzt wurden. Genauer gesagt ging es um Candy Crush und ähnliche Spiele. Mein Gefühl sagt mir, dass die Schöpfungshöhe solcher Level recht gering ist und festen Mustern folgt. Perfekt also, um sich so etwas von AI erzeugen zu lassen. Es scheint also auch vorher eher Fleißarbeit als Denkarbeit gewesen zu sein.

Am Ende werden Menschen nicht durch AI ersetzt, sondern durch Menschen, die AI möglichst effizient einsetzen. Menschen, deren Arbeit immer darin bestand, Dinge nach festen Vorgaben abzuarbeiten und strukturierten Output zu liefern, sind leichter zu ersetzen. Programmierer gehören oft dazu – denn selbst in der Zeit vor AI war die eigentliche Programmierung selten die Herausforderung. Meist wusste man, was man tun wollte, hatte den Code schon im Kopf und saß dann zwei Stunden da, um alles niederzuschreiben und zu testen. Das nimmt einem jetzt die AI ab. Auch wenn ein AI-Agent manchmal selbst länger braucht und 30 Minuten benötigt, um alles anzulegen und zu befüllen, spart man dennoch viel Zeit. Ich hatte auch schon Meetings, bei denen mir die AI nebenbei etwas gebaut hat – und ich konnte nach dem Meeting sofort testen und meine kleinen Verbesserungen oder Funktionen einbauen.

2004 in der Berufsschule haben wir gelernt, dass Entwickeln und Programmieren zwei unterschiedliche Dinge sind. Entwickeln ist die eigentliche Leistung, Programmieren ist der stupide, zeitraubende Teil der Aufgabe. Heute ist das deutlicher denn je.

Gleichzeitig zu diesen Entlassungen wird in Deutschland diskutiert, ob man die Arbeitszeiten verlängern sollte – vielleicht sogar einen Feiertag opfern sollte. Gerade für alle, die von AI betroffen sind, klingt das vollkommen realitätsfern. Die Menschen werden ja nicht entlassen, weil sie nicht in der Lage wären, mit AI-Tools mehr in weniger Zeit zu schaffen, sondern weil jetzt alle mehr schaffen – aber nicht mehr Arbeit da ist. Arbeit ist der limitierende Faktor, der es erlaubt, Leute freizustellen.

In Kommentaren regt man sich darüber auf, dass Firmen Millionengewinne einfahren und trotzdem so viele Angestellte entlassen. Aber es bringt auch nichts, Leute rumsitzen zu lassen, die keinen Mehrwert erbringen. Rumsitzen und nichts zu tun haben macht keinen Spaß und verursacht auch viel Stress. Die wenigsten Leute würden sich hinsetzen und einfach ein neues Produkt entwickeln. Wenn das so wäre, würde man sie liebend gern behalten – weil sie durch ihre Anwesenheit Mehrwert schaffen. Kaffee trinken und im Internet surfen zählt aber nicht dazu.

Die große Herausforderung für die Zukunft wird sein, dass Menschen lernen, wenig bis nichts mehr zu tun zu haben – weil weniger Menschen dieselbe Menge an Arbeit erledigen können, aber nicht mehr Arbeit entsteht. Auch die Gesellschaft muss einen Weg finden, den Menschen aufzuzeigen, wie sie einen Mehrwert schaffen können. Das Problem ist dann die Bezahlung, weil das bisherige Konzept nicht mehr passt. Das, was heute Geld einbringt, wird von AI übernommen – und der Mensch arbeitet noch, um sich selbst und die Gesellschaft zu verbessern.

AI: Vibe-Coding vs. Context-Engineering

bbcode-image


Vibe-Coding war ein Begriff, der vor einiger Zeit einen regelrechten Hype auslöste und in aller Munde war. Wenn man heute noch mit Vibe-Coding kommt, schauen einen viele mitleidig an und fragen, ob man nicht Context-Engineering meint. Vibe-Coding ist eben schon sowas von letzte Woche … gefühlt ist es gerade mal drei Tage her, dass Context-Engineering als der neue heiße Shit gilt.

Als bei meinem Ex-Arbeitgeber Vibe-Coding der breiten Masse der Entwickler vorgestellt wurde (es ist tatsächlich schon ganze vier Wochen her – Ewigkeiten in AI-Zeit, heute wechseln AI-Dev-Konzepte so schnell wie früher Nvidia neue GeForce-Karten herausgebracht hat), gab es folgenden Tipp: Alle Anforderungen in eine Datei schreiben und im Prompt lediglich auf diese Datei verweisen. Die Dokumentation sollte in einem Unterverzeichnis liegen – man sollte sich nicht darauf verlassen, dass das LLM schon alles Nötige weiß. Also: Weniger in die Prompts und mehr Struktur direkt im Projekt.

Am Ende ist das nichts anderes als: „Erst denken, dann Code schreiben.“ Also nicht einfach drauflos coden, sondern zuerst Anforderungen und Konzepte überlegen.

Context-Engineering ist genau das. Den „Vibe“ rausnehmen, erst nachdenken, Informationen sammeln und strukturiert ordnen. Vibe-Coding eignet sich hervorragend, um Prototypen und Ideen schnell zu entwickeln. Diese lassen sich dann sauber dokumentieren und als Kontext in ein Projekt einbinden – ideal, wenn daraus später ein echtes Produkt entstehen soll.

Man kann also sagen: Vibe-Coding als kreative Vorstufe, Context-Engineering als methodischer Feinschliff.
Jedenfalls ist das meine Auffassung von dem, was gerade passiert. Aber vielleicht ist nächste Woche ja schon wieder alles anders.

N8N: Setup mit Traefik

bbcode-image


N8N auf einem eigenen Server einrichten inkl. Traefik, damit man auch andere Dinge noch auf dem Server laufen lassen kann.


networks:
netintern:
external: false
web:
external: false

services:
traefik:
image: traefik:v3.4
container_name: traefik
restart: unless-stopped
logging:
driver: "json-file"
options:
max-size: "250m"
max-file: "1"
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.letsencrypt.acme.email=myemail+n8n@gmail.com"
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge=true"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./le:/letsencrypt
networks:
- web
- netintern

n8n:
image: docker.n8n.io/n8nio/n8n
container_name: n8n
logging:
driver: "json-file"
options:
max-size: "250m"
max-file: "1"
environment:
- N8N_HOST=n8n.mydomain.de
- N8N_PORT=443
- N8N_PROTOCOL=https
volumes:
- n8n_data:/home/node/.n8n
restart: unless-stopped
networks:
- netintern
labels:
- "traefik.enable=true"
- "traefik.http.routers.n8n.rule=Host(`n8n.mydomain.de`)"
- "traefik.http.routers.n8n.entrypoints=websecure"
- "traefik.http.routers.n8n.tls.certresolver=letsencrypt"
- "traefik.http.services.n8n.loadbalancer.server.port=443"
- "traefik.http.routers.n8n-http.rule=Host(`n8n.mydomain.de`)"
- "traefik.http.routers.n8n-http.entrypoints=web"
- "traefik.http.routers.n8n-http.middlewares=redirect-to-https"
- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"

volumes:
n8n_data:
traefik_data:

Agentur-Probleme: Es läuft nicht mehr... AI!

bbcode-image


Viele Agenturen haben momentan ein Problem: So wie es die letzten zwei bis drei Jahre lief, läuft es einfach nicht mehr. Kunden bleiben aus. Bestehende setzen weniger Geld um oder springen komplett ab. Was übrig bleibt, können wenige Mitarbeitende bewältigen – während der Rest darauf wartet, dass neue Kunden kommen. Doch das bindet das Sales-Team und erfordert hohe Investitionen, um überhaupt überschaubare Projekte zu gewinnen.

Aber wer oder was ist schuld an der Situation?

Wenn man den zeitlichen Verlauf betrachtet, fällt auf, dass mit dem Beginn der Probleme auch etwas anderes gewachsen ist: Künstliche Intelligenz. AI ermöglicht es Kunden, viele Dinge selbst zu erledigen. Einfach die AI fragen – und schon bekommt man eine brauchbare Antwort. Kunden sind dadurch mündiger geworden und stellen mehr in Frage. Das macht es schwerer, ihnen etwas zu verkaufen. Klar, die wirtschaftliche Lage spielt auch eine Rolle, aber AI scheint der Haupttreiber zu sein.

So einfach ist es dann aber doch nicht.

AI ist großartig, gerade im generativen Bereich. Aber: Kein Kunde ersetzt seine Agentur durch AI und generiert einfach selbst Code. Vielmehr wird AI in Produkte integriert und macht diese zugänglicher und einfacher in der Bedienung. Gleichzeitig wird es aber auch komplexer, diese Systeme zu erweitern – denn die AI muss diese Anpassungen auch „verstehen“. Ja, AI hat sicherlich Entwicklungen beschleunigt, aber viele Probleme gab es schon vorher – und sie wären auch ohne AI irgendwann sichtbar geworden.

Corona ist nun endgültig vorbei. Damals konnte man sich auf die Straße stellen, einmal laut rufen: „Ich bin Programmierer“ – und 20 Minuten später hatte man fünf neue Kunden. Webshops und Homepages waren plötzlich kein Hype mehr wie zu Dotcom-Zeiten, sondern überlebensnotwendig, um mit Kunden in Kontakt zu bleiben und weiterhin verkaufen zu können. Wer keinen Webshop hatte, war raus. Und wer einen hatte, wollte plötzlich wieder vorne mitspielen. Es brauchte Beratung. Sales sprach mit Kunden, als wären sie "dumm". Man konnte ihnen viel verkaufen, denn sie hatten weder Ahnung noch Erfahrung. Lieber zu viel investieren, als unterzugehen.

Diese Zeit ist vorbei. Jeder, der einen Webshop brauchte, hat längst einen. Der Rest hat überlebt – oder sich bestätigt gefühlt, dass es auch ohne geht. Diese kleinen, unerfahrenen Kunden in Massen? Verschwunden. Manche Sales-Abteilungen haben sich nicht angepasst. Heute steht dir ein potenzieller Kunde gegenüber, der Geld für ein Upgrade seines Shops hat – nicht, weil er bisher etwas falsch gemacht hat, sondern weil er vieles richtig gemacht hat. Wer den behandelt wie einen Anfänger, verliert ihn sofort. Warum sollte sich jemand von einem erklären lassen, wie das eigene – erfolgreiche – Geschäft funktioniert?

#1: Die Zeit, in der man Kunden wie Idioten behandeln konnte, ist vorbei!

Auch der Mangel an Entwicklern ist vorbei. Man muss nicht mehr in Osteuropa suchen oder in Asien einkaufen. Entwickler gibt es wieder überall: gute, mittelmäßige und schlechte – also genau wie es sein sollte.

Kein Kunde baut sich mit AI selbst ein Shopware-Plugin. Tools wie Cursor und Junie ermöglichen das theoretisch erst seit wenigen Monaten. Kunden sind auch nicht mehr dankbar, dass eine Agentur überhaupt Zeit für sie hat. Wenn eine Agentur nicht liefert – in Qualität oder Quantität – sucht man sich eine andere oder stellt eben direkt Entwickler ein. Gerade für Firmen mit IT-Abteilung, SAP-Beratern und ERP-Know-how ist es kein weiter Schritt, auch einen Shopware-Entwickler ins Team zu holen. Der kann dann auch direkt an der Middleware mitarbeiten – ohne großen Overhead.

Ich kenne zwei Fälle, in denen der Ansprechpartner beim Kunden selbst aus der IT kam – und entschied: „Das machen wir jetzt intern.“ Eine Vollzeitkraft ist produktiver als eine Agentur, weil kaum Overhead entsteht. Die Codequalität? Ausreichend.

Und dann höre ich von Agenturen:
„Der Kunde hat zwei Entwickler eingestellt, um unseren einen zu ersetzen… Die werden schon sehen, dass das nichts wird!“
Falsch! Der Kunde hat genug Arbeit für zwei Leute – und die Agentur konnte schlicht nicht genug liefern.

#2: Angestellte Entwickler sind eine echte Alternative zu Agenturen!

Entwickler haben in den letzten Jahren sehr gute Arbeit geleistet. Ich habe mal zu einem Arbeitgeber gesagt:
„Ich bin gut, wenn ich mich selbst überflüssig gemacht habe – wenn die Software so einfach ist, dass ihr mich nicht mehr braucht.“

Und genau das haben viele Entwickler geschafft: intuitive Oberflächen, einfache Bedienung, modular aufgebaut, wiederverwendbar. Kunden sind nicht so individuell, wie sie glauben. Zwei, drei Konfigurations-Flags – und ein Plugin funktioniert für mehrere. Viele Shops kann man heute zu 90 % aus bestehenden Plugins zusammenstellen – ohne eine einzige Codezeile.

Dieses "Zusammenklicken" lässt sich super in einfache Oberflächen gießen. Dazu automatisiertes Deployment – und zack, hat man einen Cloud-Service. SAP behauptet, es gäbe keine Standardschnittstellen – aber am Ende bauen sie doch bei jedem Kunden das Gleiche. 90 % gibt es schon, 10 % sind individuelle Anpassungen – theoretisch auslagerbar in eine JSON-Datei.

Webshops funktionieren seit 20 Jahren nach dem gleichen Prinzip: Listing, Produktseite, Warenkorb, Checkout, Account. Wer so lange entwickelt hat, hat alles schon mal gebaut. Der Punkt ist erreicht: Kunden finden fast alles, was sie brauchen, bereits fertig.

#3: Es gibt fast alles schon – es muss nicht mehr neu entwickelt werden!

Natürlich zahlt ein Kunde heute nicht denselben Preis, wenn jemand einfach einen Shop zusammenklickt, wie damals, als alles individuell programmiert werden musste. Für echtes Custom-Development zahlt man noch immer gut – aber es ist seltener nötig.

Ein weiteres Thema ist der Overhead. Kunden wollen für Impact zahlen – nicht für Projektmanagement. Viele Kunden wären zufrieden, wenn man den Projektmanager streicht. Spart Geld, spart Zeit.

Natürlich gibt es sehr gute Projektmanager – die wissen, was der Kunde will, die auch mal einen Shopware-Flow anpassen, damit der Entwickler sich auf Code konzentrieren kann. Aber genauso gibt es viele, die teure Projekte verkaufen und managen wollen – aber nicht mal den Admin-Bereich bedienen können. Kunden, die täglich mit dem System arbeiten, merken schnell, wenn sie es besser verstehen als die Agentur.

#4: Kenne dein Produkt – und sei ein echter Experte!

Heute haben wir Kunden, die Profis sind. Und wir haben Tools, die fast alles können. Jedes Ticket ist schnell erledigt. Weniger Aufwand, weniger Stunden – weniger Geld. Gleichzeitig wächst der Druck: Tickets sollen schneller fertig werden. Und wenn du gut bist und brauchst statt 8 nur 4 Stunden, super – nur bekommst du dann auch weniger bezahlt.

Zeit gegen Geld ist ein veraltetes Modell. Kunden bezahlen gerne für Impact – und oft auch dafür, es schnell zu bekommen. Warum machen wir Aufwandsschätzungen zum Problem des Kunden?

Der Kunde will ein Ergebnis – das bekommt einen Preis. Ob das nun schon fertig rumlag oder neu entwickelt wird, ist egal. Wenn der Entwickler freitags mittags geht, weil er fertig ist: gut so! Die Leistung ist erbracht, das Geld verdient.

#5: Weg vom Zeitmodell – hin zu Festpreisen für Ergebnisse. Impact zählt, nicht Aufwand.

AI beschleunigt die Entwicklung enorm – vor allem bei neuen Ideen, Prototypen und Design. Dass etwas schneller geht, ist ein Vorteil, den man verkaufen sollte – kein Nachteil!

Fazit: AI ist weder Schuld noch allein die Lösung. Die eigentlichen Probleme reichen tiefer und sind älter als brauchbare AI. Sie kann vieles verbessern – aber nur, wenn das Umfeld mitzieht. „Das haben wir schon immer so gemacht“ ist ein schwaches Argument, wenn es darum geht, warum plötzlich nichts mehr funktioniert.

Agentur-Probleme: Qualität kann nur aus Komplexität entstehen

bbcode-image


Agenturen existieren in einer eigenen sehr speziellen Bubble, in der Gesetze gelten, die sich außerhalb dieser Bubble seit 20 Jahren oft schon überholt haben. Eines dieser Gesetze ist, dass Qualität nur aus Komplexität entstehen kann. Je komplexer eine Lösung ist, desto höher ist deren Qualität. Wenn es darum geht eine vorhandene alte Lösung durch eine schlankere und einfacher Lösung zu ersetzen, kommt neben dem "das haben wir schon immer so gemacht" auch eine reine Beurteilung an Anzahl der Zeilen, Anzahl der Dateien und ob Copy&Paste als Design-Pattern dort zum Einsatz kam. Also wenn die neue Lösung 40 Zeilen lang ist, in eine Datei passt und extends-Funktionalität nutzt ist die Qualität geringer als die alte Lösung aus über 200 Zeilen, 6 Dateien und wo alles per Copy&Paste erstellt wurde und mindestens 2 Dateien per Hand synchron gehalten werden beim verwendeten Docker-Image. Wenn man also noch eine Risikobewertung mit rein nimmt verhält sich Qualität also immer entgegen des Risikos. Das Onboarding eines neuen Developers dauert über eine Stunde und nicht 15min? Das nennt sich Qualität, weil jemand sehr viel mehr dran gearbeitet hat als andere neuen Lösung (die Zeilen und Dateien entstehen ja nicht ohne Arbeit). Viel Arbeit = Viel Qualität.
Das stammt auch aus der Art, wie Abgerechnet wird. Zeit gegen Geld. Somit gilt also: Viel Arbeit = Viel Geld = Viel Qualität.

Interessanter Weise gilt das selbe für die Auswahl bei von der AI generierten Lösungen. Je komplexer die präsentierte Lösung ist, desto besser und als qualitativ hochwertiger wird sie betrachtet, weil die AI darauf ja mehr Rechenleistung verbraten hat.

Shopware 6: HTML Ajax und JavaScript Plugins

Wenn man z.B. ein Product-Box per Ajax von einem Controller nach lädt, wird der "In den Warenkorb" Button nur als normale Form funktionieren und nicht den Off-Canvas Warenkorb nutzen per JavaScript. Weil bei dem initialisieren der Plugins der HTML-Code natürlich noch nicht da war. Das kann man aber einfach nachholen.


document.getElementById('productRecommendation').innerHTML = result.productRecommendation;
window.PluginManager.initializePlugins(document.getElementById('productRecommendation'));


Damit wird der HTML-Code nach Plugin-Markern durch sucht und die Plugins an den Elementen neu initialisiert.

Grav CMS Honeypot

Ein Honeypot in das Kontaktformular einbauen ist recht einfach. Man kann alles am Feld hinterlegen:


form:
name: contact-form
fields:
- name: honeypot
label: "Leave this field empty"
type: text
attributes:
style: "display: none; position: absolute; left: -9999px;"
validate:
required: false # Sicherstellen, dass das Feld nicht ausgefüllt werden muss
message: "Bot detected!" # Fehlermeldung, falls das Feld ausgefüllt wird
rule: empty # Das Feld muss leer bleiben
buttons:
- type: submit
value: Send


Man kann auch eine Rule in user/plugins/form/form.yaml[anlegen] und die rule anstelle von "empty" angeben. Wenn man mehrere Formulare auf der Seite hat, ist das sicher die bessere Methode.


rules:
honeypot:
message: "Bot detected!"
validate: empty

Ollama lokal mit Docker

Nachdem ich feststellen musste, dass ChatGPT nur per API nutzbar ist, wenn man dafür bezahlt und sowie es ja problematisch sein kann Daten wie Telefonnummern oder Adressen dahin zu schicken, habe ich mich nach Alternativen umgesehen. Google Gemini kann man ohne Probleme per API nutzen, auch wenn man nicht bezahlt, aber das Datenschutzproblem bleibt. Also wäre eine lokale Lösung sowie so viel besser.

So kam ich zu Ollama. Das kann man ohne Probleme per Docker starten. Ohne GPU-Beschleunigung war es aber doch recht langsam. Zum Glück installiert der Nvidia-Treiber alles mit, um auch unter Windows GPU-Beschleunigung in Docker-Containern nutzen zu können.

Selbst mit einer GTX 970 ist das llama3 Model recht gut nutzbar. Test mit einem separaten Linux-System und Telsa P4 folgen später, wenn die Karte da ist.

Docker-Container starten:

docker run -d -v ollama:/root/.ollama -p 11434:11434 --gpus=all --name ollama_2 ollama/ollama


Ollama CLI Eingabe starten:

docker exec -it ollama_2 ollama run llama3


Abfrage via API:

POST http://localhost:11434/api/generate
Content-Type: application/json

{
"model": "llama3",
"prompt": "write a short poem about a 1HE server.",
"stream": false
}

Rotations-Prinzip

Menschen kommen, scheitern und gehen. Der nächste wird besser sein. Es ist eine endlose Suche nach dem einen der diesen ewigen Kreislauf durchbricht. Wobei Suche der falsche Begriff ist. Es ist mehr ein warten. Ein passives Warten. Aber ganz sicher kommt irgendwann der eine oder die eine, die alles mitbringt was man haben will. Jemand der nicht auf die Hilfe der anderen angewiesen ist, die keine Zeit für sowas haben und somit das Scheitern für die meisten schon vorprogrammiert ist. Nein! Ein Mensch wird kommen und genau die Person sein, die man schon immer haben wollte.

Die anderen, die durch die Rotation gegangen sind, ziehen weiter. Zur nächsten Firma und durch den nächsten Rotationszyklus bis auch die Firma sie wieder ausspuckt. Diese Menschen sind das Rauschen, dass die gesuchten verdeckt, ihre Aufgabe ist es ausgesiebt zu werden oder bis sie sich ändern. Aber wenn sie sich ändern könnten, wären sie nicht da wo sie sind. Nicht gefangen in einen immer wieder kehrenden Zyklus von Kommen, Scheitern und Gehen gefangen.

Und somit.. mal gucken ob der nächste Projektmanager, die nächste Projektmanagerin ein weiter Zyklus in der Rotation ist oder diese Rotation durchbrechen kann.




Natürlich könnte man mehr Zeit in Auswahl, Förderung und Aufbau eigener Leute stecken.. aber das bezahlt einen eben niemand.

Shopwar 6: DatePicker außerhalb einer Form

In HTML gibt es die Möglichkeit Inputs auch außerhalb einer Form zu haben und diese mit einer Form zu verknüpfen. Dazu nutzt man das form-Attribute. Gerade im Checkout von Shopware 6 ist es echt praktisch. Beim DatePicker besteht aber das Problem, dass das Input, dass man selbst definiert durch ein neues Input-Feld ersetzt wird, wenn Flatpickr sich initialisiert. Diesem neuen Input muss man auch das form-Attribute geben.

Tut man es nicht, funktioniert z.B. das required-Flag am DatePicker nicht.

Hier eine Quick&Dirty Lösung für das Problem:


const observer = new MutationObserver((mutationlist, observer) => {
mutationlist.forEach(mutation => {
if(mutation.type === 'childList') {
const picker = document.querySelector('.hp_shipping_date.form-control');
if(picker) {
picker.setAttribute('form', 'confirmOrderForm');
observer.disconnect();
}
}
});
});

observer.observe(document.querySelector('.hp-shipping-date-container'), {childList: true, subtree: true});

Shopware 6: Custom Storefront Endpoint in Apps

Da ich lange herum probieren und die Dokumentation interpretieren musste hier einmal schnell wie das Mapping zwischen Twig-Fule und URL aussieht.

URL

http:localhost/storefront/script/testscript?value=test


Path

Resources/scripts/storefront-testscript/index.twig


Beispiel

{% set value = hook.query['value'] %}

{% set response = services.response.json({'value': value}) %}
{% do response.cache.disable() %}
{% do hook.setResponse(response) %}


liefert einfach das was man übergibt als JSON zurück (ohne Cache).

Shopware 6: Immer Ärger mit den JWT-Dateien

Bei Deployments die ein per Composer erzeugtes Shopware 6 Projekt als Basis haben (was wohl alle neueren sind) muss man die JWT-Dateien immer noch zusätzlich erzeugen und sie müssen die richtigen Rechte haben.

Man kann auch Env-Variablen (JWT_PUBLIC_KEY und JWT_PRIVATE_KEY) verwenden, was bei mir aber irgendwie nicht korrekt funktionierte und beim Login in die Administration zu einer Exception führt.

Aber es gibt auch einen Weg ganz ohne JWT Keys und der verwendet das APP_SECRET aus der .env Datei.

bbcode-image


Damit klappte auch ein Deployment auf platform.sh dann ohne Probleme.

Older posts:

Möchtest Du AdSense-Werbung erlauben und mir damit helfen die laufenden Kosten des Blogs tragen zu können?