[{"data":1,"prerenderedAt":813},["ShallowReactive",2],{"/de-de/blog/refactor-code-into-modern-languages-with-ai-powered-gitlab-duo":3,"navigation-de-de":42,"banner-de-de":456,"footer-de-de":466,"blog-post-authors-de-de-Michael Friedrich":700,"blog-related-posts-de-de-refactor-code-into-modern-languages-with-ai-powered-gitlab-duo":714,"blog-promotions-de-de":751,"next-steps-de-de":803},{"id":4,"title":5,"authorSlugs":6,"authors":8,"body":10,"category":11,"categorySlug":11,"config":12,"content":16,"date":20,"description":17,"extension":26,"externalUrl":27,"featured":14,"heroImage":19,"isFeatured":14,"meta":28,"navigation":29,"path":30,"publishedDate":20,"rawbody":31,"seo":32,"slug":13,"stem":36,"tagSlugs":37,"tags":40,"template":15,"updatedDate":25,"__hash__":41},"blogPosts/de-de/blog/refactor-code-into-modern-languages-with-ai-powered-gitlab-duo.yml","Code mit KI-gestütztem GitLab Duo in moderne Sprachen refaktorisieren ",[7],"michael-friedrich",[9],"Michael Friedrich","Egal, ob es deine Aufgabe ist, die Codebase oder das Framework zu modernisieren, indem du zu einer neuen Programmiersprache wechselst, oder ob du mehr über neue Funktionen in dieser Sprache erfahren möchtest: das KI-gestützte [GitLab Duo](https://about.gitlab.com/gitlab-duo-agent-platform/) kann dir dabei helfen. Hier erfährst du anhand von Beispielen aus meiner 20-jährigen Berufserfahrung als Programmier(in), wie du Herausforderungen beim Code-Refactoring am besten meisterst.\n\nDie Prompts und Beispiele in diesem Artikel werden in verschiedenen IDEs gezeigt: VS Code und JetBrains (IntelliJ IDEA, PyCharm und CLion) mit den jeweiligen installierten (GitLab-Duo-Erweiterungen/Plugins]https://docs.gitlab.com/user/project/r/ epository/code_suggestions/supported_extensions.html). Die Entwicklungsumgebung nutzt GitLab.com, darunter Updates auf Anthropic Claude 3.5 als großes Sprachmodell (LLM) für [Codevorschläge](https://docs.gitlab.com/user/gitlab_duo/#code-suggestions) und den [Chat](https://docs.gitlab.com/user/gitlab_duo/#gitlab-duo-chat) von GitLab Duo. Spoiler: Sie sind noch leistungsstärker und effizienter.\n\nDu kannst zu den einzelnen Abschnitten dieses Artikels springen oder ihn von Anfang bis Ende lesen. Der Quellcode und die Herausforderungen mit den jeweiligen Übungen sind zum Selbststudium geeignet.\n\n- [Code in moderne Programmiersprachen-Standards refaktorieren](#refactor-code-to-modern-programming-language-standards)\n    - [Java 7 generieren und zu Java 8 refaktorisieren](#generate-java-7-and-refactor-to-java-8)\n    - [Über C++-Standards refaktorisieren](#refactor-across-c%2B%2B-standards)\n        - [Migration: C++03 zu C++14 refaktorisieren](#migration-refactor-c%2B%2B03-into-c%2B%2B14)\n        - [Downgrade: C++23 zu C++11 refaktorisieren](#downgrade-refactor-c%2B%2B23-to-c%2B%2B11)\n    - [COBOL erklären und refaktorisieren](#explain-and-refactor-cobol)\n- [Eine Sprache in eine andere refaktorisieren](#refactor-a-language-into-another-language)\n    - [C zu Rust refaktorisieren](#refactor-c-to-rust)\n    - [Perl zu Python refaktorisieren](#refactor-perl-to-python)\n- [Weitere Tipps zum Refaktorisieren](#more-refactoring-hands-on)\n    - [JavaScript refaktorisieren](#refactor-javascript)\n    - [Bash zu ZSH oder SH refaktorisieren](#refactor-bash-to-zsh-or-sh)\n    - [Weitere Anwendungsfälle und Tutorials](#more-use-cases-and-tutorials)\n- [Wichtige Erkenntnisse](#key-takeaways)\n\n## Code in moderne Programmiersprachen-Standards refaktorisieren\n\nIm nächsten Abschnitt erfährst du, wie du die sprachspezifischen Unterschiede einer Programmiersprache refaktorisierst, erklärst und verstehst.\n### Java 7 generieren und auf Java 8 refaktorisieren\nEin Kunde wollte wissen, ob GitLab Duo Java 7 unterstützt. Beim Testen von Codevorschlägen und Chat-Prompts, um spezifischen Code für Java 7 zu erstellen, dachte ich auch über Hilfe bei der Migration nach. Anthropic Claude 3.5 kann die sprachspezifischen Unterschiede verstehen, ebenso wie GitLab Duo.\n\nDas folgende Beispiel zeigt eine Aufforderung zum Generieren von Java-7-Code mit Codevorschlägen.\n\n```java\n// Generate a new class for a File Manager. Use Java 7 features only.\nimport java.io.*;\nimport java.nio.file.*;\nimport java.util.*;\n\npublic class FileManager {\n    private Path rootDirectory;\n\n    public FileManager(String rootPath) throws IOException {\n        this.rootDirectory = Paths.get(rootPath);\n        if (!Files.exists(rootDirectory)) {\n            Files.createDirectories(rootDirectory);\n        }\n    }\n\n    public void createFile(String fileName, String content) throws IOException {\n        Path filePath = rootDirectory.resolve(fileName);\n        Files.write(filePath, content.getBytes(), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);\n    }\n\n    public String readFile(String fileName) throws IOException {\n        Path filePath = rootDirectory.resolve(fileName);\n        return new String(Files.readAllBytes(filePath));\n    }\n\n    public void deleteFile(String fileName) throws IOException {\n        Path filePath = rootDirectory.resolve(fileName);\n        Files.delete(filePath);\n    }\n\n    public List\u003CString> listFiles() throws IOException {\n        List\u003CString> fileList = new ArrayList\u003C>();\n        try (DirectoryStream\u003CPath> stream = Files.newDirectoryStream(rootDirectory)) {\n            for (Path file : stream) {\n                fileList.add(file.getFileName().toString());\n            }\n        }\n        return fileList;\n    }\n\n    public void copyFile(String sourceFileName, String destinationFileName) throws IOException {\n        Path sourcePath = rootDirectory.resolve(sourceFileName);\n        Path destinationPath = rootDirectory.resolve(destinationFileName);\n        Files.copy(sourcePath, destinationPath, StandardCopyOption.REPLACE_EXISTING);\n    }\n\n    public void moveFile(String sourceFileName, String destinationFileName) throws IOException {\n        Path sourcePath = rootDirectory.resolve(sourceFileName);\n        Path destinationPath = rootDirectory.resolve(destinationFileName);\n        Files.move(sourcePath, destinationPath, StandardCopyOption.REPLACE_EXISTING);\n    }\n\n    public long getFileSize(String fileName) throws IOException {\n        Path filePath = rootDirectory.resolve(fileName);\n        return Files.size(filePath);\n    }\n\n    public boolean fileExists(String fileName) {\n        Path filePath = rootDirectory.resolve(fileName);\n        return Files.exists(filePath);\n    }\n}\n```\n\nDu kannst mit folgenden Schritten in deinem IDE fortfahren:\n\n1. Lerne und verstehe den generierten Code: Wähle den Code im Editor aus (im Screenshot blau), wechsle zum GitLab-Duo-Chat und sende den Slash-Befehl `/explain` als Prompt.\n\n![Validiere den generierten Code mit dem Slash-Befehl `/explain` im GitLab-Duo-Chat](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/Blog/Content%20Images/intellij_java7_generate_refactor.png)\n\n2. Wandle den Java-7-Code in Java 8 um: Wähle den Code im Editor aus, wechsle zum Chat und sende `/refactor using Java 8 features` als detaillierteren Prompt.\n3. Übe eine Alternative zum Refactoring: Erstelle die neue Datei `java8.java` und generiere Java-8-spezifischen Code mit Codevorschlägen mit dem Prompt `// Generate a new class for a File Manager. Use Java 8 features only.`.\n4. Schreibe weiter Java-8-Code im gleichen Kontext mit KI-basierter Code-Vervollständigung.\n\nDu kannst dir alle Schritte in dieser Aufnahme ansehen.\n\n\u003C!-- blank line -->\n\u003Cfigure class=\"video_container\">\n  \u003Ciframe src=\"https://www.youtube.com/embed/XKRv6uBkD2I\" frameborder=\"0\" allowfullscreen=\"true\"> \u003C/iframe>\n\u003C/figure>\n\u003C!-- blank line -->\n\nDer Quellcode ist in der [GitLab-Duo-Challenge – Java 7 generieren und auf Java 8 refaktorisieren](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-generate-refactor-java-7-to-8) verfügbar.\n\n### Über C++-Standards refaktorisieren\n\nDer C++-Standard hat eine lange Geschichte und gilt als stabil und ausgereift. Je nach Zielarchitektur und Plattformen hängt der unterstützte Standard vom Compiler des Host-Betriebssystems ab.\n\nIn meiner Karriere musste ich bereits 25 verschiedene Linux- und Windows-Distributionen in Open-Source-Projekten supporten und habe unterschiedlichsten Compiler-Support für neuere Sprachfunktionen und C++-Standards erlebt. Im Jahr 2015 haben wir uns für C++11-Funktionen entschieden und später C++14 oder C++17 nie mehr angerührt.\nDie Refaktorisierung von Funktionen und Algorithmen zu einem neuen C++-Standard wäre zu aufwändig gewesen und es wäre Hilfe beim Erklären der Unterschiede nötig gewesen. Damals haben wir in Büchern, über Online-Suche, Stack Overflow und manchmal Tools Hilfe zum Refactoring gesucht.Mit KI-basierten Assistenten und GitLab Duo hat sich das alles geändert: Du kannst Codevorschläge und den Chat nutzen, um Quellcode in einem bestimmten C++-Standard bereitzustellen. Dann ist es auch möglich, die verschiedenen Ausgaben zu vergleichen.\nDas folgende Beispiel verwendet einen Prompt, um speziell Quellcode für den C++03-Standard zu generieren. Es implementiert einen einfachen Konfigurations-Parser für das Konfigurationsformat `.ini`.\n\n```c++\n/* Create a config parser which can parse an ini format\nUse C++03 standard only\n */\n\n#include \u003Ciostream>\n#include \u003Cfstream>\n#include \u003Cstring>\n#include \u003Cmap>\n#include \u003Csstream>\n\nclass ConfigParser {\nprivate:\n    std::map\u003Cstd::string, std::map\u003Cstd::string, std::string> > config;\n\npublic:\n    ConfigParser() {}\n\n    bool parse(const std::string& filename) {\n        std::ifstream file(filename.c_str());\n        if (!file.is_open()) {\n            return false;\n        }\n\n        std::string line;\n        std::string currentSection;\n\n        while (std::getline(file, line)) {\n            // Trim whitespace\n            size_t first = line.find_first_not_of(\" \\t\");\n            size_t last = line.find_last_not_of(\" \\t\");\n            if (first == std::string::npos) continue; // Skip empty lines\n            line = line.substr(first, (last - first + 1));\n\n            if (line[0] == '[' && line[line.length() - 1] == ']') {\n                // This is a section\n                currentSection = line.substr(1, line.length() - 2);\n            } else {\n                // This is a key-value pair\n                size_t delimiterPos = line.find('=');\n                if (delimiterPos != std::string::npos) {\n                    std::string key = line.substr(0, delimiterPos);\n                    std::string value = line.substr(delimiterPos + 1);\n                    config[currentSection][key] = value;\n                }\n            }\n        }\n\n        file.close();\n        return true;\n    }\n\n    std::string getValue(const std::string& section, const std::string& key) const {\n        std::map\u003Cstd::string, std::map\u003Cstd::string, std::string> >::const_iterator sectionIt = config.find(section);\n        if (sectionIt != config.end()) {\n            std::map\u003Cstd::string, std::string>::const_iterator keyIt = sectionIt->second.find(key);\n            if (keyIt != sectionIt->second.end()) {\n                return keyIt->second;\n            }\n        }\n        return \"\";\n    }\n\n    void printConfig() const {\n        std::map\u003Cstd::string, std::map\u003Cstd::string, std::string> >::const_iterator sectionIt;\n        for (sectionIt = config.begin(); sectionIt != config.end(); ++sectionIt) {\n            std::cout \u003C\u003C \"[\" \u003C\u003C sectionIt->first \u003C\u003C \"]\" \u003C\u003C std::endl;\n            std::map\u003Cstd::string, std::string>::const_iterator keyIt;\n            for (keyIt = sectionIt->second.begin(); keyIt != sectionIt->second.end(); ++keyIt) {\n                std::cout \u003C\u003C keyIt->first \u003C\u003C \" = \" \u003C\u003C keyIt->second \u003C\u003C std::endl;\n            }\n            std::cout \u003C\u003C std::endl;\n        }\n    }\n};\n\nint main() {\n    ConfigParser parser;\n    if (parser.parse(\"config.ini\")) {\n        std::cout \u003C\u003C \"Config file parsed successfully.\" \u003C\u003C std::endl;\n        parser.printConfig();\n\n        std::cout \u003C\u003C \"Value of 'key1' in 'section1': \" \u003C\u003C parser.getValue(\"section1\", \"key1\") \u003C\u003C std::endl;\n    } else {\n        std::cout \u003C\u003C \"Failed to parse config file.\" \u003C\u003C std::endl;\n    }\n    return 0;\n}\n```\n\nThe same prompts can be applied to [explaining code](https://docs.gitlab.com/user/gitlab_duo_chat/examples/#explain-code-in-the-ide), [generating tests](https://docs.gitlab.com/user/gitlab_duo_chat/examples/#write-tests-in-the-ide), and even [refactoring code](https://docs.gitlab.com/user/gitlab_duo_chat/examples/#refactor-code-in-the-ide): `/explain focus on C++03 features`, `/tests for C++03 features`, `/refactor into C++03`.\nDie folgenden C+ -Standards wurden für die Arbeit mit GitLab Duo Codevorschläge getestet:\n\n- C++03\n- C++11\n- C++14\n- C++17\n- C++20\n- C++23\n\nDen Quellcode findest du in der [Challenge –  Cpp-Standards Konfigurations-Parser refaktorisieren](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-refactor-cpp-standards-config-parser).\nEs gibt viele verschiedene Kombinationen, um den Quellcode zwischen den C++-Standards zu refaktorisieren. Die folgenden Beispiele zeigen eine Modernisierung des C++-Codes mit Versionsupgrades, testen aber auch ein Downgrade, als ambitionierte Entwickler(innen) C++20 verwenden wollten, aber C++11 verwenden mussten, um den Umgebungen ihrer Geschäftskund(inn)en zu entsprechen.#### Migration: C++03 in C++14 refaktorisieren\nDas Ziel ist es, den Code zu modernisieren und die Veränderungen zwischen C++03 und C++14 zu verstehen. Öffne den [03.cpp](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-refactor-cpp-standards-config-parser/-/blob/main/03.cpp?ref_type=heads)-Quellcode in der IDE, wähle ihn aus und gib den folgenden Chat-Prompt ein:\n```markdown\n/refactor into C++14 and explain the changes\n```\n\nPotentielle Antwort des Chats:\n```markdown\n…\n\nExplanations of the changes:\n\n1. Default constructor: Changed `ConfigParser() {}` to `ConfigParser() = default;` to use the default constructor.\n2. File opening: Removed `.c_str()` when opening the file, as C++11 and later support `std::string` directly.\n3. Lambda functions: Introduced a lambda function trim to handle string trimming, making the code more readable and reusable.\n4. Auto keyword: Used `auto` for type deduction in various places, improving code readability.\n5. Range-based for loops: In the `printConfig` method, replaced traditional for loops with range-based for loops, which are more concise and less error-prone.\n6. Structured bindings: Used structured bindings in the range-based for loops to directly access key-value pairs.\n7. If statements with initializers: In the `getValue` method, used if statements with initializers to combine the find operation and the check in a single line.\n8. String member functions: Used `front()` and `back()` instead of array-style access for the first and last characters of strings.\n9. Uniform initialization: Used uniform initialization `{}` instead of parentheses `()` for object creation.\n10. Removed `std::endl`: Replaced `std::endl` with `'\\n'` for better performance, as `std::endl` forces a flush of the output buffer.\n\nThese changes make the code more modern, concise, and potentially more efficient while maintaining the same functionality.\n\n```\n\n![Änderungen im Code](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/Blog/Content%20Images/duo_refactor_cpp_clion_chat_cpp03_to_14_01.png)\n\n![Änderungen im Code 2](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675060/Blog/Content%20Images/duo_refactor_cpp_clion_chat_cpp03_to_14_02.png)\n\n#### Downgrade: C++23 zu C++11 refaktorisieren\n\nManchmal starten Entwickler(innen) einen neuen Proof of Concept in einem modernen C++-Standard wie C++20. Die aktuell unterstützten Versionen für Geschäftskundenumgebungen erfordern ältere Compiler mit C++11-Unterstützung. Ein Downgrade der Versionen ist mit Kosten verbunden und erfordert eine Bewertung, welche Sprachfunktionen noch unterstützt werden und welche anderen Nachteile auftreten könnten.\n\nÖffne den [23.cpp](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-refactor-cpp-standards-config-parser/-/blob/main/23.cpp?ref_type=heads)-Quellcode in der IDE, wähle ihn aus und gib den folgenden Chat-Prompt ein:\n```markdown\n/refactor into C++11, explain the necessary changes and potential problems\n```\n\nPotenzielle Antwort des Duo Chat:\n```markdown\nThe main changes required to make this code compatible with C++11 are:\n\n1. Remove the C++23 standard comment, as it's no longer applicable.\n2. Replace `std::string::find_first_not_of` and `std::string::find_last_not_of` with C++11 compatible alternatives in the trim function.\n3. Use `const auto&` instead of `auto` for loop variables to avoid unnecessary copying.\n\nPotential problems in the original code:\n\n1. The original code used C++23 features, which might not be widely supported yet.\n2. The `trim` function used `std::string::find_first_not_of` and `std::string::find_last_not_of`, which are not available in C++11.\n3. The use of `auto` instead of `const auto&` in some loops could lead to unnecessary copying of complex objects.\n\nThese issues have been addressed in the refactored version. The `trim` function now uses `std::find_if_not` with lambda functions to achieve the same result in a C++11 compatible way. The use of `const auto&` ensures that no unnecessary copying occurs when iterating over the config map.\n```\n\n![The `trim` function now uses `std::find_if_not` with lambda functions to achieve the same result in a C++11 compatible way](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/Blog/Content%20Images/duo_refactor_cpp_clion_chat_cpp23_to_11_01.png)\n\n![The use of `const auto&` ensures that no unnecessary copying occurs when iterating over the config map](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/Blog/Content%20Images/duo_refactor_cpp_clion_chat_cpp23_to_11_02.png)\n\n**Asynchronisierungsübung**: Teste weitere Refactoring-Szenarios.\n\n### COBOL erklären und umgestalten\n\nDu kannst GitLab Duo verwenden, um den Quellcode zu erklären, zu analysieren, zu reparieren und für COBOL-Programme zu refaktorisieren. Ich habe COBOL nie geschrieben oder gelernt und fand diesen [COBOL-Programmierkurs](https://github.com/openmainframeproject/cobol-programming-course) mit vielen Beispielen hilfreich.\n\nIch habe dann den Chat gefragt, wie man mit COBOL beginnt, ein COBOL-Programm erstellt und ein COBOL-Programm auf macOS kompiliert.\n\n```markdown\nPlease explain what COBOL is and its syntax\n\nPlease create a COBOL program that shows the first steps\n\nTell me more about the COBOL compiler. Which system do I need? Can I do it on my macOS?\n\n```\n\n![Bitte an GitLab Duo Chat, die Sprache und ihre Syntax zu erklären](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/Blog/Content%20Images/vscode_chat_cobol_generate_example.png)\n\nÖffne ein COBOL-Programm, wähle den Quellcode aus, gehe zum Duo Chat und sende den Prompt `/explain`, um Zweck und Funktion des Codes zu erklären.\nDu kannst die Prompts auch verfeinern, um allgemeinere Zusammenfassungen zu erhalten, zum Beispiel:\n\n```markdown\n/explain like I am five\n```\n\n> Tipp: Programmiersprachen haben ähnliche Algorithmen und Funktionen. Für COBOL bot der Chat an, es mit Python zu erklären. Deshalb habe ich die folgenden Prompts angepasst, um in Python nach einer Erklärung zu fragen.\n\n```markdown\n/explain in a different programming language\n```\n\nDu kannst auch den Slash-Befehl `/refactor` im Chat verwenden, um die Codequalität zu verbessern, potenzielle Probleme zu beheben und zu versuchen, COBOL in Python zu refaktorisieren.\n\n```markdown\n/refactor fix the environment error\n\n/refactor fix potential problems\n\n/refactor into Python\n```\n\nDie Aufzeichnung [GitLab Duo Coffee Chat – Herausforderung: COBOL-Programme erklären und refaktorisieren](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-explain-refactor-cobol-program) zeigt die Schritte, die ich oben erklärt habe, anhand eines praktischen Beispiels. Hier siehst du auch, wie man einen fehlenden Punkt finden kann:\n\u003C!-- blank line -->\n\u003Cfigure class=\"video_container\">\n  \u003Ciframe src=\"https://www.youtube.com/embed/pwlDmLQMMPo\" frameborder=\"0\" allowfullscreen=\"true\"> \u003C/iframe>\n\u003C/figure>\n\u003C!-- blank line -->\n\n## Eine Sprache in eine andere Sprache refaktorisieren\n\nModernisierung und Verbesserungen der Codequalität erfordern manchmal den Wechsel einer Programmiersprache. Ähnliche Refactoring-Prompts mit GitLab Duo können den Migrationsprozess beschleunigen. Das COBOL-Beispiel mit Python ist nur eine von vielen Anforderungen in Unternehmensumgebungen. Sehen wir uns nun weitere Anwendungsfälle an.\n\n### C in Rust refaktorisieren\n\nAnfang 2024 wurden mehrere Programmiersprachen, darunter C, als nicht speichersicher bezeichnet. Die Empfehlungen für zukünftige Projekte umfassen [speichersichere Sprachen](https://about.gitlab.com/blog/memory-safe-vs-unsafe/) wie Rust. Aber wie startet man eine Migration und welche Herausforderungen gibt es dabei?\n\nVersuchen wir es mit einem einfachen Beispiel in C. Der Code wurde mithilfe von Codevorschlägen generiert und sollte die grundlegenden Betriebssysteminformationen wie Name, Version und Plattform ausdrucken. Der C-Code kompiliert plattformübergreifend unter Windows, Linux und macOS.\n\n```c\n// Read OS files to identify the platform, name, versions\n// Print them on the terminal\n#include \u003Cstdio.h>\n#include \u003Cstdlib.h>\n#include \u003Cstring.h>\n\n#ifdef _WIN32\n    #include \u003Cwindows.h>\n#elif __APPLE__\n    #include \u003Csys/utsname.h>\n#else\n    #include \u003Csys/utsname.h>\n#endif\n\nvoid get_os_info() {\n    #ifdef _WIN32\n        OSVERSIONINFOEX info;\n        ZeroMemory(&info, sizeof(OSVERSIONINFOEX));\n        info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);\n        GetVersionEx((OSVERSIONINFO*)&info);\n\n        printf(\"Platform: Windows\\n\");\n        printf(\"Version: %d.%d\\n\", info.dwMajorVersion, info.dwMinorVersion);\n        printf(\"Build: %d\\n\", info.dwBuildNumber);\n    #elif __APPLE__\n        struct utsname sys_info;\n        uname(&sys_info);\n\n        printf(\"Platform: macOS\\n\");\n        printf(\"Name: %s\\n\", sys_info.sysname);\n        printf(\"Version: %s\\n\", sys_info.release);\n    #else\n        struct utsname sys_info;\n        uname(&sys_info);\n\n        printf(\"Platform: %s\\n\", sys_info.sysname);\n        printf(\"Name: %s\\n\", sys_info.nodename);\n        printf(\"Version: %s\\n\", sys_info.release);\n    #endif\n}\n\nint main() {\n    get_os_info();\n    return 0;\n}\n```\n\nÖffne den Quellcode in [`os.c`](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-refactor-c-to-rust/-/blob/897bf57a14bb7be07d842e7f044f93a61456d611/c/os.c), beispielsweise in JetBrains CLion. Wähle den Quellcode aus und gib den Chat-Prompt `/explain` ein, um Zweck und Funktion erklären zu lassen. Gib als Nächstes `/refactor` in den Chat ein, um den C-Code zu refaktorisieren, und gehe dann einen Schritt weiter: `/refactor into Rust`.\nInitialisiere ein neues Rust-Projekt (Tipp: Frage den Duo Chat) und kopiere den generierten Quellcode in die Datei `src/main.rs`. Führe `cargo build` aus, um den Code zu kompilieren.\n\n![Initialisiere ein neues Rust-Projekt und kopiere den generierten Quellcode in die Datei `src/main.rs`. Führe `cargo build` aus, um den Code zu kompilieren.](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/Blog/Content%20Images/jetbrains_clion_c_rust.png)\n\nIn der Aufzeichnung von [GitLab Duo Coffee Chat: Herausforderung – C zu Rust refaktorisieren](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-refactor-c-to-rust) lernst du alle Schritte kennen und siehst außerdem einen Kompilierungsfehler, der mithilfe des Chats und des Slash-Vefehls `/refactor` behoben wird. Die Aufzeichnung zeigt auch, wie man die Wartbarkeit des neuen Rust-Codes verbessern kann, indem man mehr Fehlerbehandlung hinzufügt.\n\u003C!-- blank line -->\n\u003Cfigure class=\"video_container\">\n  \u003Ciframe src=\"https://www.youtube.com/embed/nf8g2ucqvkI\" frameborder=\"0\" allowfullscreen=\"true\"> \u003C/iframe>\n\u003C/figure>\n\u003C!-- blank line -->\n\n### Perl zu Python refaktorisieren\nDieses eine Skript, das auf Produktionsservern läuft, seinen Job macht und dessen Autor(in) schon seit zehn Jahren nicht mehr im Unternehmen arbeitet – und das niemand anfassen will. Dieses Problem kann es auch für mehrere Skripte oder sogar für eine ganze Anwendung geben. Dann wird beschlossen, alles auf das moderne Python 3 zu migrieren, mit dem Ziel, den Code zu modernisieren und die Veränderungen zwischen Perl und Python zu verstehen.\n\nEin(e) Kund(in) hat kürzlich in einem GitLab-Duo-Workshop gefragt, ob eine direkte Migration mit GitLab Duo möglich ist. Die kurze Antwort: Ja, das ist es. Die längere Antwort: Du kannst mithilfe verfeinerter Chat-Prompts Perl-Code in Python refaktorisieren, ähnlich wie bei anderen Beispielen in diesem Artikel.\n\nÖffne den Quellcode `script.pl` in der IDE, wähle ihn aus und öffne den Chat.\n\n```perl\n#!/usr/bin/perl\nuse strict;\nuse warnings;\n\nopen my $md_fh, '\u003C', 'file.md' or die \"Could not open file.md: $!\";\n\nmy $l = 0;\nmy $e = 0;\nmy $h = 0;\n\nwhile (my $line = \u003C$md_fh>) {\n  $l++;\n  if ($line =~ /^\\s*$/) {\n    $e++;\n    next;\n  }\n  if ($line =~ /^#+\\s*(.+)/) {\n    print \"$1\\n\";\n    $h++;   }\n}\n\nprint \"\\nS:\\n\"; print \"L: $l\\n\";\nprint \"E: $e\\n\"; print \"H: $h\\n\";\n```\n\nYou can use the following prompts to:\n\n1. `/explain` its purpose, and `/refactor` to improve the code.\n2. `/refactor into Python`, um ein funktionierendes Python-Skript zu erhalten.\n\n![Refaktorisierung in Python](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/Blog/Content%20Images/pycharm_duo_refactor_perl_python.png)\n\n> Tipp: Du kannst Perl-Code in mehrere Zielsprachen refaktorisieren. Die Aufzeichnung von [GitLab Duo Coffee Chat: Herausforderung – Perl zu Python refaktorisieren](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-refactor-perl-python) zeigt Refaktorisierungen zu PHP, Ruby, Rust, Go, Java, VB.NET, C# und mehr.\n> > Wenn du Perl-Skripts weiterhin verwenden möchtest, kannst du [Perl als zusätzliche Sprache](https://docs.gitlab.com/user/project/repository/code_suggestion/ s/supported_extensions.html#add-support-for-more-languages) in Duo Codevorschläge konfigurieren. Der Chat versteht bereits Perl und kann bei Fragen und Slash-Befehlen helfen, wie du in der folgenden Aufnahme sehen kannst.\n\n\u003C!-- blank line -->\n\u003Cfigure class=\"video_container\">\n  \u003Ciframe src=\"https://www.youtube.com/embed/03HGhxXg9lw\" frameborder=\"0\" allowfullscreen=\"true\"> \u003C/iframe>\n\u003C/figure>\n\u003C!-- blank line -->\n\n## Weitere Tipps zum Refaktorisieren\n### JavaScript refaktorisieren\nEddie Jaoude zeigt in einem praktischen Beispiel, wie er JavaScript refaktorisiert, um die Codequalität zu verbessern oder Funktionen hinzuzufügen.\n\u003C!-- blank line -->\n\u003Cfigure class=\"video_container\">\n  \u003Ciframe src=\"https://www.youtube.com/embed/mHn8KOzpPNY\" frameborder=\"0\" allowfullscreen=\"true\"> \u003C/iframe>\n\u003C/figure>\n\u003C!-- blank line -->\n\n### Bash zu ZSH oder SH refaktorisieren\n\nIch benutze Bash seit 20 Jahren als Shell und bin zuletzt auf macOS auf ZSH umgestiegen. Dies führte dazu, dass das Skript nicht funktionierte oder unbekannte Fehler in meinem Terminal auftraten. Ein weiterer Anwendungsfall für das Refactoring sind Shell-Einschränkungen – einige Betriebssysteme oder Linux-/Unix-Distributionen bieten kein Bash, sondern nur SH, z. B. Alpine.\n\n![Shell-Skripte refaktorisieren](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/Blog/Content%20Images/intellj_refactor_shell_scripts.png)\n\nDer [GitLab Duo Coffee Chat: Herausforderung – Shell-Skripte refaktorisieren](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-refactor-shell-scripts) zeigt ein Beispiel mit einem C-Programm, das Syslog-Dateien bearbeiten kann, und einem in Bash geschriebenen Build-Skript. Während der gesamten Challenge wird der Chat mit den Prompts `/explain` und `/refactor` abgefragt, um den Code zu verbessern. Es ist auch möglich, Bash in POSIX-konformes SH oder ZSH zu refaktorisieren. Die Sitzung endet mit der Bitte an den Chat, fünf verschiedene Shell-Skriptimplementierungen bereitzustellen und die wichtigsten Zusammenfassungen zu erläutern.\n\u003C!-- blank line -->\n\u003Cfigure class=\"video_container\">\n  \u003Ciframe src=\"https://www.youtube.com/embed/mssqYjlKGzU\" frameborder=\"0\" allowfullscreen=\"true\"> \u003C/iframe>\n\u003C/figure>\n\u003C!-- blank line -->\n\n### Weitere Anwendungsfälle und Tutorials\n\n- [Dokumentation: GitLab-Duo-Anwendungsfälle](https://docs.gitlab.com/user/gitlab_duo/use_/ cases.html)\n- [Tutorial: Top-Tipps für effiziente KI-basierte Codevorschläge mit GitLab Duo](https://about.gitlab.com/blog/top-tips-for-efficient-ai-powered-code-suggestions-with-gitlab-duo/)\n- [Tutorial: 10 Best Practices für den Einsatz des KI-basierten GitLab Duo Chat](https://about.gitlab.com/blog/10-best-practices-for-using-ai-powered-gitlab-duo-chat/)\n\n## Wichtigste Erkenntnisse\n1. GitLab Duo bietet effiziente Hilfe beim Erklären und Refaktorisieren von Code. 1. Du kannst Code zwischen den Sprachstandards refaktorisieren und im Chat weitere Fragen stellen.\n1. Prompts für Codevorschläge können bestimmte Sprachstandards generieren, und die Code-Vervollständigung geht auf den aktuellen Codekontext ein. 1. Das Refaktorisieren von Code in neue Programmiersprachen hilft bei längerfristigen Migrations- und Modernisierungsvorhaben.\n1. Code kann auf die unterstützten Sprachstandards älterer Systeme „herabgestuft“ werden.\n1. GitLab Duo kann komplexe Code- und Programmiersprachen mit Beispielen in verschiedenen Programmiersprachen erklären.\n1. Das Update auf Anthropic Claude 3.5 auf GitLab.com hat die Qualität und Geschwindigkeit der Codevorschläge und des Chats noch einmal verbessert (Self-Managed-Upgrade auf 17.3 empfohlen).\n1. Es gibt keine Grenzen, außer deiner Vorstellungskraft und deinen Produktionsschwierigkeiten.\n\nErfahre mehr über effiziente Codevorschläge und Chat-Workflows und beginne jetzt deine KI-basierte Code-Refactoring-Reise mit GitLab Duo!\n\n> [Starte deine kostenlose Testversion von GitLab Duo!](https://about.gitlab.com/solutions/gitlab-duo-pro/sales/?type=free-trial&toggle=gitlab-duo-pro_)\n","ai-ml",{"slug":13,"featured":14,"template":15},"refactor-code-into-modern-languages-with-ai-powered-gitlab-duo",false,"BlogPost",{"title":5,"description":17,"authors":18,"heroImage":19,"date":20,"body":10,"category":11,"tags":21,"updatedDate":25},"In diesem detaillierten Tutorial erfahren Entwickler(innen), wie sie Code mithilfe von KI modernisieren können, indem sie zu einer neuen Programmiersprache wechseln und mehr über neue Funktionen in dieser Sprache lernen.",[9],"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749662465/Blog/Hero%20Images/GitLab_Duo_Workflow_Unified_Data_Store__1_.png","2024-08-26",[22,23,24],"AI/ML","tutorial","DevSecOps","2024-11-13","yml",null,{},true,"/de-de/blog/refactor-code-into-modern-languages-with-ai-powered-gitlab-duo","seo:\n  title: 'Code mit KI-gestütztem GitLab Duo in moderne Sprachen refaktorisieren '\n  description: >-\n    In diesem detaillierten Tutorial erfahren Entwickler(innen), wie sie Code\n    mithilfe von KI modernisieren können, indem sie zu einer neuen\n    Programmiersprache wechseln und mehr über neue Funktionen in dieser Sprache\n    lernen.\n  ogTitle: 'Code mit KI-gestütztem GitLab Duo in moderne Sprachen refaktorisieren '\n  ogDescription: >-\n    In diesem detaillierten Tutorial erfahren Entwickler(innen), wie sie Code\n    mithilfe von KI modernisieren können, indem sie zu einer neuen\n    Programmiersprache wechseln und mehr über neue Funktionen in dieser Sprache\n    lernen.\n  noIndex: false\n  ogImage: >-\n    https://res.cloudinary.com/about-gitlab-com/image/upload/v1749662465/Blog/Hero%20Images/GitLab_Duo_Workflow_Unified_Data_Store__1_.png\n  ogUrl: >-\n    https://about.gitlab.com/blog/refactor-code-into-modern-languages-with-ai-powered-gitlab-duo\n  ogSiteName: https://about.gitlab.com\n  ogType: article\n  canonicalUrls: >-\n    https://about.gitlab.com/blog/refactor-code-into-modern-languages-with-ai-powered-gitlab-duo\ncontent:\n  title: 'Code mit KI-gestütztem GitLab Duo in moderne Sprachen refaktorisieren '\n  description: >-\n    In diesem detaillierten Tutorial erfahren Entwickler(innen), wie sie Code\n    mithilfe von KI modernisieren können, indem sie zu einer neuen\n    Programmiersprache wechseln und mehr über neue Funktionen in dieser Sprache\n    lernen.\n  authors:\n    - Michael Friedrich\n  heroImage: >-\n    https://res.cloudinary.com/about-gitlab-com/image/upload/v1749662465/Blog/Hero%20Images/GitLab_Duo_Workflow_Unified_Data_Store__1_.png\n  date: '2024-08-26'\n  body: \"Egal, ob es deine Aufgabe ist, die Codebase oder das Framework zu\n    modernisieren, indem du zu einer neuen Programmiersprache wechselst, oder ob\n    du mehr über neue Funktionen in dieser Sprache erfahren möchtest: das\n    KI-gestützte [GitLab Duo](https://about.gitlab.com/gitlab-duo-agent-platform/) kann dir\n    dabei helfen. Hier erfährst du anhand von Beispielen aus meiner 20-jährigen\n    Berufserfahrung als Programmier(in), wie du Herausforderungen beim\n    Code-Refactoring am besten meisterst.\n\n\n    Die Prompts und Beispiele in diesem Artikel werden in verschiedenen IDEs\n    gezeigt: VS Code und JetBrains (IntelliJ IDEA, PyCharm und CLion) mit den\n    jeweiligen installierten\n    (GitLab-Duo-Erweiterungen/Plugins]https://docs.gitlab.com/user/project/r/\n    epository/code_suggestions/supported_extensions.html). Die\n    Entwicklungsumgebung nutzt GitLab.com, darunter Updates auf Anthropic\n    Claude 3.5 als großes Sprachmodell (LLM) für\n    [Codevorschläge](https://docs.gitlab.com/user/gitlab_duo/#code-suggestio\\\n    ns) und den\n    [Chat](https://docs.gitlab.com/user/gitlab_duo/#gitlab-duo-chat) von\n    GitLab Duo. Spoiler: Sie sind noch leistungsstärker und effizienter.\n\n\n    Du kannst zu den einzelnen Abschnitten dieses Artikels springen oder ihn von\n    Anfang bis Ende lesen. Der Quellcode und die Herausforderungen mit den\n    jeweiligen Übungen sind zum Selbststudium geeignet.\n\n\n    - [Code in moderne Programmiersprachen-Standards\n    refaktorieren](#refactor-code-to-modern-programming-language-standards)\n\n    \\    - [Java 7 generieren und zu Java 8\n    refaktorisieren](#generate-java-7-and-refactor-to-java-8)\n\n    \\    - [Über C++-Standards\n    refaktorisieren](#refactor-across-c%2B%2B-standards)\n\n    \\        - [Migration: C++03 zu C++14\n    refaktorisieren](#migration-refactor-c%2B%2B03-into-c%2B%2B14)\n\n    \\        - [Downgrade: C++23 zu C++11\n    refaktorisieren](#downgrade-refactor-c%2B%2B23-to-c%2B%2B11)\n\n    \\    - [COBOL erklären und refaktorisieren](#explain-and-refactor-cobol)\n\n    - [Eine Sprache in eine andere\n    refaktorisieren](#refactor-a-language-into-another-language)\n\n    \\    - [C zu Rust refaktorisieren](#refactor-c-to-rust)\n\n    \\    - [Perl zu Python refaktorisieren](#refactor-perl-to-python)\n\n    - [Weitere Tipps zum Refaktorisieren](#more-refactoring-hands-on)\n\n    \\    - [JavaScript refaktorisieren](#refactor-javascript)\n\n    \\    - [Bash zu ZSH oder SH refaktorisieren](#refactor-bash-to-zsh-or-sh)\n\n    \\    - [Weitere Anwendungsfälle und\n    Tutorials](#more-use-cases-and-tutorials)\n\n    - [Wichtige Erkenntnisse](#key-takeaways)\n\n\n    ## Code in moderne Programmiersprachen-Standards refaktorisieren\n\n\n    Im nächsten Abschnitt erfährst du, wie du die sprachspezifischen\n    Unterschiede einer Programmiersprache refaktorisierst, erklärst und\n    verstehst.\\\n\n\n    ### Java 7 generieren und auf Java 8 refaktorisieren\\\n\n\n    Ein Kunde wollte wissen, ob GitLab Duo Java 7 unterstützt. Beim Testen von\n    Codevorschlägen und Chat-Prompts, um spezifischen Code für Java 7 zu\n    erstellen, dachte ich auch über Hilfe bei der Migration nach. Anthropic\n    Claude 3.5 kann die sprachspezifischen Unterschiede verstehen, ebenso wie\n    GitLab Duo.\n\n\n    Das folgende Beispiel zeigt eine Aufforderung zum Generieren von Java-7-Code\n    mit Codevorschlägen.\n\n\n    ```java\n\n    // Generate a new class for a File Manager. Use Java 7 features only.\n\n    import java.io.*;\n\n    import java.nio.file.*;\n\n    import java.util.*;\n\n\n    public class FileManager {\n\n    \\    private Path rootDirectory;\n\n\n    \\    public FileManager(String rootPath) throws IOException {\n\n    \\        this.rootDirectory = Paths.get(rootPath);\n\n    \\        if (!Files.exists(rootDirectory)) {\n\n    \\            Files.createDirectories(rootDirectory);\n\n    \\        }\n\n    \\    }\n\n\n    \\    public void createFile(String fileName, String content) throws\n    IOException {\n\n    \\        Path filePath = rootDirectory.resolve(fileName);\n\n    \\        Files.write(filePath, content.getBytes(),\n    StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);\n\n    \\    }\n\n\n    \\    public String readFile(String fileName) throws IOException {\n\n    \\        Path filePath = rootDirectory.resolve(fileName);\n\n    \\        return new String(Files.readAllBytes(filePath));\n\n    \\    }\n\n\n    \\    public void deleteFile(String fileName) throws IOException {\n\n    \\        Path filePath = rootDirectory.resolve(fileName);\n\n    \\        Files.delete(filePath);\n\n    \\    }\n\n\n    \\    public List\u003CString> listFiles() throws IOException {\n\n    \\        List\u003CString> fileList = new ArrayList\u003C>();\n\n    \\        try (DirectoryStream\u003CPath> stream =\n    Files.newDirectoryStream(rootDirectory)) {\n\n    \\            for (Path file : stream) {\n\n    \\                fileList.add(file.getFileName().toString());\n\n    \\            }\n\n    \\        }\n\n    \\        return fileList;\n\n    \\    }\n\n\n    \\    public void copyFile(String sourceFileName, String destinationFileName)\n    throws IOException {\n\n    \\        Path sourcePath = rootDirectory.resolve(sourceFileName);\n\n    \\        Path destinationPath = rootDirectory.resolve(destinationFileName);\n\n    \\        Files.copy(sourcePath, destinationPath,\n    StandardCopyOption.REPLACE_EXISTING);\n\n    \\    }\n\n\n    \\    public void moveFile(String sourceFileName, String destinationFileName)\n    throws IOException {\n\n    \\        Path sourcePath = rootDirectory.resolve(sourceFileName);\n\n    \\        Path destinationPath = rootDirectory.resolve(destinationFileName);\n\n    \\        Files.move(sourcePath, destinationPath,\n    StandardCopyOption.REPLACE_EXISTING);\n\n    \\    }\n\n\n    \\    public long getFileSize(String fileName) throws IOException {\n\n    \\        Path filePath = rootDirectory.resolve(fileName);\n\n    \\        return Files.size(filePath);\n\n    \\    }\n\n\n    \\    public boolean fileExists(String fileName) {\n\n    \\        Path filePath = rootDirectory.resolve(fileName);\n\n    \\        return Files.exists(filePath);\n\n    \\    }\n\n    }\n\n    ```\n\n\n    Du kannst mit folgenden Schritten in deinem IDE fortfahren:\n\n\n    1. Lerne und verstehe den generierten Code: Wähle den Code im Editor aus (im\n    Screenshot blau), wechsle zum GitLab-Duo-Chat und sende den Slash-Befehl\n    `/explain` als Prompt.\n\n\n    ![Validiere den generierten Code mit dem Slash-Befehl `/explain` im\n    GitLab-Duo-Chat](https://res.cloudinary.com/about-gitlab-com/image/upload/v\\\n    1749675059/Blog/Content%20Images/intellij_java7_generate_refactor.png)\n\n\n    2. Wandle den Java-7-Code in Java 8 um: Wähle den Code im Editor aus,\n    wechsle zum Chat und sende `/refactor using Java 8 features` als\n    detaillierteren Prompt.\n\n    3. Übe eine Alternative zum Refactoring: Erstelle die neue Datei\n    `java8.java` und generiere Java-8-spezifischen Code mit Codevorschlägen mit\n    dem Prompt `// Generate a new class for a File Manager. Use Java 8 features\n    only.`.\n\n    4. Schreibe weiter Java-8-Code im gleichen Kontext mit KI-basierter\n    Code-Vervollständigung.\n\n\n    Du kannst dir alle Schritte in dieser Aufnahme ansehen.\n\n\n    \u003C!-- blank line -->\n\n    \u003Cfigure class=\\\"video_container\\\">\n\n    \\  \u003Ciframe src=\\\"https://www.youtube.com/embed/XKRv6uBkD2I\\\"\n    frameborder=\\\"0\\\" allowfullscreen=\\\"true\\\"> \u003C/iframe>\n\n    \u003C/figure>\n\n    \u003C!-- blank line -->\n\n\n    Der Quellcode ist in der [GitLab-Duo-Challenge – Java 7 generieren und auf\n    Java 8\n    refaktorisieren](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/git\\\n    lab-duo-challenges/code-challenges/challenge-generate-refactor-java-7-to-8)\n    verfügbar.\n\n\n    ### Über C++-Standards refaktorisieren\n\n\n    Der C++-Standard hat eine lange Geschichte und gilt als stabil und\n    ausgereift. Je nach Zielarchitektur und Plattformen hängt der unterstützte\n    Standard vom Compiler des Host-Betriebssystems ab.\n\n\n    In meiner Karriere musste ich bereits 25 verschiedene Linux- und\n    Windows-Distributionen in Open-Source-Projekten supporten und habe\n    unterschiedlichsten Compiler-Support für neuere Sprachfunktionen und\n    C++-Standards erlebt. Im Jahr 2015 haben wir uns für C++11-Funktionen\n    entschieden und später C++14 oder C++17 nie mehr angerührt.\\\n\n\n    Die Refaktorisierung von Funktionen und Algorithmen zu einem neuen\n    C++-Standard wäre zu aufwändig gewesen und es wäre Hilfe beim Erklären der\n    Unterschiede nötig gewesen. Damals haben wir in Büchern, über Online-Suche,\n    Stack Overflow und manchmal Tools Hilfe zum Refactoring gesucht.Mit\n    KI-basierten Assistenten und GitLab Duo hat sich das alles geändert: Du\n    kannst Codevorschläge und den Chat nutzen, um Quellcode in einem bestimmten\n    C++-Standard bereitzustellen. Dann ist es auch möglich, die verschiedenen\n    Ausgaben zu vergleichen.\\\n\n\n    Das folgende Beispiel verwendet einen Prompt, um speziell Quellcode für den\n    C++03-Standard zu generieren. Es implementiert einen einfachen\n    Konfigurations-Parser für das Konfigurationsformat `.ini`.\n\n\n    ```c++\n\n    /* Create a config parser which can parse an ini format\n\n    Use C++03 standard only\n\n    \\ */\n\n\n    #include \u003Ciostream>\n\n    #include \u003Cfstream>\n\n    #include \u003Cstring>\n\n    #include \u003Cmap>\n\n    #include \u003Csstream>\n\n\n    class ConfigParser {\n\n    private:\n\n    \\    std::map\u003Cstd::string, std::map\u003Cstd::string, std::string> > config;\n\n\n    public:\n\n    \\    ConfigParser() {}\n\n\n    \\    bool parse(const std::string& filename) {\n\n    \\        std::ifstream file(filename.c_str());\n\n    \\        if (!file.is_open()) {\n\n    \\            return false;\n\n    \\        }\n\n\n    \\        std::string line;\n\n    \\        std::string currentSection;\n\n\n    \\        while (std::getline(file, line)) {\n\n    \\            // Trim whitespace\n\n    \\            size_t first = line.find_first_not_of(\\\" \\\\t\\\");\n\n    \\            size_t last = line.find_last_not_of(\\\" \\\\t\\\");\n\n    \\            if (first == std::string::npos) continue; // Skip empty lines\n\n    \\            line = line.substr(first, (last - first + 1));\n\n\n    \\            if (line[0] == '[' && line[line.length() - 1] == ']') {\n\n    \\                // This is a section\n\n    \\                currentSection = line.substr(1, line.length() - 2);\n\n    \\            } else {\n\n    \\                // This is a key-value pair\n\n    \\                size_t delimiterPos = line.find('=');\n\n    \\                if (delimiterPos != std::string::npos) {\n\n    \\                    std::string key = line.substr(0, delimiterPos);\n\n    \\                    std::string value = line.substr(delimiterPos + 1);\n\n    \\                    config[currentSection][key] = value;\n\n    \\                }\n\n    \\            }\n\n    \\        }\n\n\n    \\        file.close();\n\n    \\        return true;\n\n    \\    }\n\n\n    \\    std::string getValue(const std::string& section, const std::string&\n    key) const {\n\n    \\        std::map\u003Cstd::string, std::map\u003Cstd::string, std::string>\n    >::const_iterator sectionIt = config.find(section);\n\n    \\        if (sectionIt != config.end()) {\n\n    \\            std::map\u003Cstd::string, std::string>::const_iterator keyIt =\n    sectionIt->second.find(key);\n\n    \\            if (keyIt != sectionIt->second.end()) {\n\n    \\                return keyIt->second;\n\n    \\            }\n\n    \\        }\n\n    \\        return \\\"\\\";\n\n    \\    }\n\n\n    \\    void printConfig() const {\n\n    \\        std::map\u003Cstd::string, std::map\u003Cstd::string, std::string>\n    >::const_iterator sectionIt;\n\n    \\        for (sectionIt = config.begin(); sectionIt != config.end();\n    ++sectionIt) {\n\n    \\            std::cout \u003C\u003C \\\"[\\\" \u003C\u003C sectionIt->first \u003C\u003C \\\"]\\\" \u003C\u003C std::endl;\n\n    \\            std::map\u003Cstd::string, std::string>::const_iterator keyIt;\n\n    \\            for (keyIt = sectionIt->second.begin(); keyIt !=\n    sectionIt->second.end(); ++keyIt) {\n\n    \\                std::cout \u003C\u003C keyIt->first \u003C\u003C \\\" = \\\" \u003C\u003C keyIt->second \u003C\u003C\n    std::endl;\n\n    \\            }\n\n    \\            std::cout \u003C\u003C std::endl;\n\n    \\        }\n\n    \\    }\n\n    };\n\n\n    int main() {\n\n    \\    ConfigParser parser;\n\n    \\    if (parser.parse(\\\"config.ini\\\")) {\n\n    \\        std::cout \u003C\u003C \\\"Config file parsed successfully.\\\" \u003C\u003C std::endl;\n\n    \\        parser.printConfig();\n\n\n    \\        std::cout \u003C\u003C \\\"Value of 'key1' in 'section1': \\\" \u003C\u003C\n    parser.getValue(\\\"section1\\\", \\\"key1\\\") \u003C\u003C std::endl;\n\n    \\    } else {\n\n    \\        std::cout \u003C\u003C \\\"Failed to parse config file.\\\" \u003C\u003C std::endl;\n\n    \\    }\n\n    \\    return 0;\n\n    }\n\n    ```\n\n\n    The same prompts can be applied to [explaining\n    code](https://docs.gitlab.com/user/gitlab_duo_chat/examples/#explain\\\n    -code-in-the-ide), [generating\n    tests](https://docs.gitlab.com/user/gitlab_duo_chat/examples/#write-\\\n    tests-in-the-ide), and even [refactoring\n    code](https://docs.gitlab.com/user/gitlab_duo_chat/examples/#refacto\\\n    r-code-in-the-ide): `/explain focus on C++03 features`, `/tests for C++03\n    features`, `/refactor into C++03`.\\\n\n\n    Die folgenden C+ -Standards wurden für die Arbeit mit\n    GitLab Duo Codevorschläge getestet:\n\n\n    - C++03\n\n    - C++11\n\n    - C++14\n\n    - C++17\n\n    - C++20\n\n    - C++23\n\n\n    Den Quellcode findest du in der [Challenge –  Cpp-Standards\n    Konfigurations-Parser\n    refaktorisieren](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/git\\\n    lab-duo-challenges/code-challenges/challenge-refactor-cpp-standards-config-\\\n    parser).\\\n\n\n    Es gibt viele verschiedene Kombinationen, um den Quellcode zwischen den\n    C++-Standards zu refaktorisieren. Die folgenden Beispiele zeigen eine\n    Modernisierung des C++-Codes mit Versionsupgrades, testen aber auch ein\n    Downgrade, als ambitionierte Entwickler(innen) C++20 verwenden wollten, aber\n    C++11 verwenden mussten, um den Umgebungen ihrer Geschäftskund(inn)en zu\n    entsprechen.#### Migration: C++03 in C++14 refaktorisieren\\\n\n\n    Das Ziel ist es, den Code zu modernisieren und die Veränderungen zwischen\n    C++03 und C++14 zu verstehen. Öffne den\n    [03.cpp](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-\\\n    challenges/code-challenges/challenge-refactor-cpp-standards-config-parser/-\\\n    /blob/main/03.cpp?ref_type=heads)-Quellcode in der IDE, wähle ihn aus und\n    gib den folgenden Chat-Prompt ein:\\\n\n\n    ```markdown\n\n    /refactor into C++14 and explain the changes\n\n    ```\n\n\n    Potentielle Antwort des Chats:\\\n\n\n    ```markdown\n\n    …\n\n\n    Explanations of the changes:\n\n\n    1. Default constructor: Changed `ConfigParser() {}` to `ConfigParser() =\n    default;` to use the default constructor.\n\n    2. File opening: Removed `.c_str()` when opening the file, as C++11 and\n    later support `std::string` directly.\n\n    3. Lambda functions: Introduced a lambda function trim to handle string\n    trimming, making the code more readable and reusable.\n\n    4. Auto keyword: Used `auto` for type deduction in various places, improving\n    code readability.\n\n    5. Range-based for loops: In the `printConfig` method, replaced traditional\n    for loops with range-based for loops, which are more concise and less\n    error-prone.\n\n    6. Structured bindings: Used structured bindings in the range-based for\n    loops to directly access key-value pairs.\n\n    7. If statements with initializers: In the `getValue` method, used if\n    statements with initializers to combine the find operation and the check in\n    a single line.\n\n    8. String member functions: Used `front()` and `back()` instead of\n    array-style access for the first and last characters of strings.\n\n    9. Uniform initialization: Used uniform initialization `{}` instead of\n    parentheses `()` for object creation.\n\n    10. Removed `std::endl`: Replaced `std::endl` with `'\\\\n'` for better\n    performance, as `std::endl` forces a flush of the output buffer.\n\n\n    These changes make the code more modern, concise, and potentially more\n    efficient while maintaining the same functionality.\n\n\n    ```\n\n\n    ![Änderungen im\n    Code](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/\\\n    Blog/Content%20Images/duo_refactor_cpp_clion_chat_cpp03_to_14_01.png)\n\n\n    ![Änderungen im Code\n    2](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675060/Blo\\\n    g/Content%20Images/duo_refactor_cpp_clion_chat_cpp03_to_14_02.png)\n\n\n    #### Downgrade: C++23 zu C++11 refaktorisieren\n\n\n    Manchmal starten Entwickler(innen) einen neuen Proof of Concept in einem\n    modernen C++-Standard wie C++20. Die aktuell unterstützten Versionen für\n    Geschäftskundenumgebungen erfordern ältere Compiler mit C++11-Unterstützung.\n    Ein Downgrade der Versionen ist mit Kosten verbunden und erfordert eine\n    Bewertung, welche Sprachfunktionen noch unterstützt werden und welche\n    anderen Nachteile auftreten könnten.\n\n\n    Öffne den\n    [23.cpp](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-\\\n    challenges/code-challenges/challenge-refactor-cpp-standards-config-parser/-\\\n    /blob/main/23.cpp?ref_type=heads)-Quellcode in der IDE, wähle ihn aus und\n    gib den folgenden Chat-Prompt ein:\\\n\n\n    ```markdown\n\n    /refactor into C++11, explain the necessary changes and potential problems\n\n    ```\n\n\n    Potenzielle Antwort des Duo Chat:\\\n\n\n    ```markdown\n\n    The main changes required to make this code compatible with C++11 are:\n\n\n    1. Remove the C++23 standard comment, as it's no longer applicable.\n\n    2. Replace `std::string::find_first_not_of` and\n    `std::string::find_last_not_of` with C++11 compatible alternatives in the\n    trim function.\n\n    3. Use `const auto&` instead of `auto` for loop variables to avoid\n    unnecessary copying.\n\n\n    Potential problems in the original code:\n\n\n    1. The original code used C++23 features, which might not be widely\n    supported yet.\n\n    2. The `trim` function used `std::string::find_first_not_of` and\n    `std::string::find_last_not_of`, which are not available in C++11.\n\n    3. The use of `auto` instead of `const auto&` in some loops could lead to\n    unnecessary copying of complex objects.\n\n\n    These issues have been addressed in the refactored version. The `trim`\n    function now uses `std::find_if_not` with lambda functions to achieve the\n    same result in a C++11 compatible way. The use of `const auto&` ensures that\n    no unnecessary copying occurs when iterating over the config map.\n\n    ```\n\n\n    ![The `trim` function now uses `std::find_if_not` with lambda functions to\n    achieve the same result in a C++11 compatible\n    way](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/B\\\n    log/Content%20Images/duo_refactor_cpp_clion_chat_cpp23_to_11_01.png)\n\n\n    ![The use of `const auto&` ensures that no unnecessary copying occurs when\n    iterating over the config\n    map](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/B\\\n    log/Content%20Images/duo_refactor_cpp_clion_chat_cpp23_to_11_02.png)\n\n\n    **Asynchronisierungsübung**: Teste weitere Refactoring-Szenarios.\n\n\n    ### COBOL erklären und umgestalten\n\n\n    Du kannst GitLab Duo verwenden, um den Quellcode zu erklären, zu\n    analysieren, zu reparieren und für COBOL-Programme zu refaktorisieren. Ich\n    habe COBOL nie geschrieben oder gelernt und fand diesen\n    [COBOL-Programmierkurs](https://github.com/openmainframeproject/cobol-progr\\\n    amming-course) mit vielen Beispielen hilfreich.\n\n\n    Ich habe dann den Chat gefragt, wie man mit COBOL beginnt, ein\n    COBOL-Programm erstellt und ein COBOL-Programm auf macOS kompiliert.\n\n\n    ```markdown\n\n    Please explain what COBOL is and its syntax\n\n\n    Please create a COBOL program that shows the first steps\n\n\n    Tell me more about the COBOL compiler. Which system do I need? Can I do it\n    on my macOS?\n\n\n    ```\n\n\n    ![Bitte an GitLab Duo Chat, die Sprache und ihre Syntax zu\n    erklären](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675\\\n    059/Blog/Content%20Images/vscode_chat_cobol_generate_example.png)\n\n\n    Öffne ein COBOL-Programm, wähle den Quellcode aus, gehe zum Duo Chat und\n    sende den Prompt `/explain`, um Zweck und Funktion des Codes zu erklären.\\\n\n\n    Du kannst die Prompts auch verfeinern, um allgemeinere Zusammenfassungen zu\n    erhalten, zum Beispiel:\n\n\n    ```markdown\n\n    /explain like I am five\n\n    ```\n\n\n    > Tipp: Programmiersprachen haben ähnliche Algorithmen und Funktionen. Für\n    COBOL bot der Chat an, es mit Python zu erklären. Deshalb habe ich die\n    folgenden Prompts angepasst, um in Python nach einer Erklärung zu fragen.\n\n\n    ```markdown\n\n    /explain in a different programming language\n\n    ```\n\n\n    Du kannst auch den Slash-Befehl `/refactor` im Chat verwenden, um die\n    Codequalität zu verbessern, potenzielle Probleme zu beheben und zu\n    versuchen, COBOL in Python zu refaktorisieren.\n\n\n    ```markdown\n\n    /refactor fix the environment error\n\n\n    /refactor fix potential problems\n\n\n    /refactor into Python\n\n    ```\n\n\n    Die Aufzeichnung [GitLab Duo Coffee Chat – Herausforderung: COBOL-Programme\n    erklären und\n    refaktorisieren](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/git\\\n    lab-duo-challenges/code-challenges/challenge-explain-refactor-cobol-program)\n    zeigt die Schritte, die ich oben erklärt habe, anhand eines praktischen\n    Beispiels. Hier siehst du auch, wie man einen fehlenden Punkt finden kann:\\\n\n\n    \u003C!-- blank line -->\n\n    \u003Cfigure class=\\\"video_container\\\">\n\n    \\  \u003Ciframe src=\\\"https://www.youtube.com/embed/pwlDmLQMMPo\\\"\n    frameborder=\\\"0\\\" allowfullscreen=\\\"true\\\"> \u003C/iframe>\n\n    \u003C/figure>\n\n    \u003C!-- blank line -->\n\n\n    ## Eine Sprache in eine andere Sprache refaktorisieren\n\n\n    Modernisierung und Verbesserungen der Codequalität erfordern manchmal den\n    Wechsel einer Programmiersprache. Ähnliche Refactoring-Prompts mit\n    GitLab Duo können den Migrationsprozess beschleunigen. Das COBOL-Beispiel\n    mit Python ist nur eine von vielen Anforderungen in Unternehmensumgebungen.\n    Sehen wir uns nun weitere Anwendungsfälle an.\n\n\n    ### C in Rust refaktorisieren\n\n\n    Anfang 2024 wurden mehrere Programmiersprachen, darunter C, als nicht\n    speichersicher bezeichnet. Die Empfehlungen für zukünftige Projekte umfassen\n    [speichersichere\n    Sprachen](https://about.gitlab.com/blog/memory-safe-vs-unsafe/) wie Rust.\n    Aber wie startet man eine Migration und welche Herausforderungen gibt es\n    dabei?\n\n\n    Versuchen wir es mit einem einfachen Beispiel in C. Der Code wurde mithilfe\n    von Codevorschlägen generiert und sollte die grundlegenden\n    Betriebssysteminformationen wie Name, Version und Plattform ausdrucken. Der\n    C-Code kompiliert plattformübergreifend unter Windows, Linux und macOS.\n\n\n    ```c\n\n    // Read OS files to identify the platform, name, versions\n\n    // Print them on the terminal\n\n    #include \u003Cstdio.h>\n\n    #include \u003Cstdlib.h>\n\n    #include \u003Cstring.h>\n\n\n    #ifdef _WIN32\n\n    \\    #include \u003Cwindows.h>\n\n    #elif __APPLE__\n\n    \\    #include \u003Csys/utsname.h>\n\n    #else\n\n    \\    #include \u003Csys/utsname.h>\n\n    #endif\n\n\n    void get_os_info() {\n\n    \\    #ifdef _WIN32\n\n    \\        OSVERSIONINFOEX info;\n\n    \\        ZeroMemory(&info, sizeof(OSVERSIONINFOEX));\n\n    \\        info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);\n\n    \\        GetVersionEx((OSVERSIONINFO*)&info);\n\n\n    \\        printf(\\\"Platform: Windows\\\\n\\\");\n\n    \\        printf(\\\"Version: %d.%d\\\\n\\\", info.dwMajorVersion,\n    info.dwMinorVersion);\n\n    \\        printf(\\\"Build: %d\\\\n\\\", info.dwBuildNumber);\n\n    \\    #elif __APPLE__\n\n    \\        struct utsname sys_info;\n\n    \\        uname(&sys_info);\n\n\n    \\        printf(\\\"Platform: macOS\\\\n\\\");\n\n    \\        printf(\\\"Name: %s\\\\n\\\", sys_info.sysname);\n\n    \\        printf(\\\"Version: %s\\\\n\\\", sys_info.release);\n\n    \\    #else\n\n    \\        struct utsname sys_info;\n\n    \\        uname(&sys_info);\n\n\n    \\        printf(\\\"Platform: %s\\\\n\\\", sys_info.sysname);\n\n    \\        printf(\\\"Name: %s\\\\n\\\", sys_info.nodename);\n\n    \\        printf(\\\"Version: %s\\\\n\\\", sys_info.release);\n\n    \\    #endif\n\n    }\n\n\n    int main() {\n\n    \\    get_os_info();\n\n    \\    return 0;\n\n    }\n\n    ```\n\n\n    Öffne den Quellcode in\n    [`os.c`](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-\\\n    challenges/code-challenges/challenge-refactor-c-to-rust/-/blob/897bf57a14bb\\\n    7be07d842e7f044f93a61456d611/c/os.c), beispielsweise in JetBrains CLion.\n    Wähle den Quellcode aus und gib den Chat-Prompt `/explain` ein, um Zweck und\n    Funktion erklären zu lassen. Gib als Nächstes `/refactor` in den Chat ein,\n    um den C-Code zu refaktorisieren, und gehe dann einen Schritt weiter:\n    `/refactor into Rust`.\\\n\n\n    Initialisiere ein neues Rust-Projekt (Tipp: Frage den Duo Chat) und kopiere\n    den generierten Quellcode in die Datei `src/main.rs`. Führe `cargo build`\n    aus, um den Code zu kompilieren.\n\n\n    ![Initialisiere ein neues Rust-Projekt und kopiere den generierten Quellcode\n    in die Datei `src/main.rs`. Führe `cargo build` aus, um den Code zu\n    kompilieren.](https://res.cloudinary.com/about-gitlab-com/image/upload/v174\\\n    9675059/Blog/Content%20Images/jetbrains_clion_c_rust.png)\n\n\n    In der Aufzeichnung von [GitLab Duo Coffee Chat: Herausforderung – C zu Rust\n    refaktorisieren](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/git\\\n    lab-duo-challenges/code-challenges/challenge-refactor-c-to-rust) lernst du\n    alle Schritte kennen und siehst außerdem einen Kompilierungsfehler, der\n    mithilfe des Chats und des Slash-Vefehls `/refactor` behoben wird. Die\n    Aufzeichnung zeigt auch, wie man die Wartbarkeit des neuen Rust-Codes\n    verbessern kann, indem man mehr Fehlerbehandlung hinzufügt.\\\n\n\n    \u003C!-- blank line -->\n\n    \u003Cfigure class=\\\"video_container\\\">\n\n    \\  \u003Ciframe src=\\\"https://www.youtube.com/embed/nf8g2ucqvkI\\\"\n    frameborder=\\\"0\\\" allowfullscreen=\\\"true\\\"> \u003C/iframe>\n\n    \u003C/figure>\n\n    \u003C!-- blank line -->\n\n\n    ### Perl zu Python refaktorisieren\\\n\n\n    Dieses eine Skript, das auf Produktionsservern läuft, seinen Job macht und\n    dessen Autor(in) schon seit zehn Jahren nicht mehr im Unternehmen arbeitet –\n    und das niemand anfassen will. Dieses Problem kann es auch für mehrere\n    Skripte oder sogar für eine ganze Anwendung geben. Dann wird beschlossen,\n    alles auf das moderne Python 3 zu migrieren, mit dem Ziel, den Code zu\n    modernisieren und die Veränderungen zwischen Perl und Python zu verstehen.\n\n\n    Ein(e) Kund(in) hat kürzlich in einem GitLab-Duo-Workshop gefragt, ob eine\n    direkte Migration mit GitLab Duo möglich ist. Die kurze Antwort: Ja, das ist\n    es. Die längere Antwort: Du kannst mithilfe verfeinerter Chat-Prompts\n    Perl-Code in Python refaktorisieren, ähnlich wie bei anderen Beispielen in\n    diesem Artikel.\n\n\n    Öffne den Quellcode `script.pl` in der IDE, wähle ihn aus und öffne den\n    Chat.\n\n\n    ```perl\n\n    #!/usr/bin/perl\n\n    use strict;\n\n    use warnings;\n\n\n    open my $md_fh, '\u003C', 'file.md' or die \\\"Could not open file.md: $!\\\";\n\n\n    my $l = 0;\n\n    my $e = 0;\n\n    my $h = 0;\n\n\n    while (my $line = \u003C$md_fh>) {\n\n    \\  $l++;\n\n    \\  if ($line =~ /^\\\\s*$/) {\n\n    \\    $e++;\n\n    \\    next;\n\n    \\  }\n\n    \\  if ($line =~ /^#+\\\\s*(.+)/) {\n\n    \\    print \\\"$1\\\\n\\\";\n\n    \\    $h++;\\\n\n    \\  }\n\n    }\n\n\n    print \\\"\\\\nS:\\\\n\\\";\\\n\n    print \\\"L: $l\\\\n\\\";\n\n    print \\\"E: $e\\\\n\\\";\\\n\n    print \\\"H: $h\\\\n\\\";\n\n    ```\n\n\n    You can use the following prompts to:\n\n\n    1. `/explain` its purpose, and `/refactor` to improve the code.\n\n    2. `/refactor into Python`, um ein funktionierendes Python-Skript zu\n    erhalten.\n\n\n    ![Refaktorisierung in\n    Python](https://res.cloudinary.com/about-gitlab-com/image/upload/v174967505\\\n    9/Blog/Content%20Images/pycharm_duo_refactor_perl_python.png)\n\n\n    > Tipp: Du kannst Perl-Code in mehrere Zielsprachen refaktorisieren. Die\n    Aufzeichnung von [GitLab Duo Coffee Chat: Herausforderung – Perl zu Python\n    refaktorisieren](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/git\\\n    lab-duo-challenges/code-challenges/challenge-refactor-perl-python) zeigt\n    Refaktorisierungen zu PHP, Ruby, Rust, Go, Java, VB.NET, C# und mehr.\n\n    >\\\n\n    > Wenn du Perl-Skripts weiterhin verwenden möchtest, kannst du [Perl als\n    zusätzliche\n    Sprache](https://docs.gitlab.com/user/project/repository/code_suggestion/\n    s/supported_extensions.html#add-support-for-more-languages) in\n    Duo Codevorschläge konfigurieren. Der Chat versteht bereits Perl und kann\n    bei Fragen und Slash-Befehlen helfen, wie du in der folgenden Aufnahme sehen\n    kannst.\n\n\n    \u003C!-- blank line -->\n\n    \u003Cfigure class=\\\"video_container\\\">\n\n    \\  \u003Ciframe src=\\\"https://www.youtube.com/embed/03HGhxXg9lw\\\"\n    frameborder=\\\"0\\\" allowfullscreen=\\\"true\\\"> \u003C/iframe>\n\n    \u003C/figure>\n\n    \u003C!-- blank line -->\n\n\n    ## Weitere Tipps zum Refaktorisieren\\\n\n\n    ### JavaScript refaktorisieren\\\n\n\n    Eddie Jaoude zeigt in einem praktischen Beispiel, wie er JavaScript\n    refaktorisiert, um die Codequalität zu verbessern oder Funktionen\n    hinzuzufügen.\\\n\n\n    \u003C!-- blank line -->\n\n    \u003Cfigure class=\\\"video_container\\\">\n\n    \\  \u003Ciframe src=\\\"https://www.youtube.com/embed/mHn8KOzpPNY\\\"\n    frameborder=\\\"0\\\" allowfullscreen=\\\"true\\\"> \u003C/iframe>\n\n    \u003C/figure>\n\n    \u003C!-- blank line -->\n\n\n    ### Bash zu ZSH oder SH refaktorisieren\n\n\n    Ich benutze Bash seit 20 Jahren als Shell und bin zuletzt auf macOS auf ZSH\n    umgestiegen. Dies führte dazu, dass das Skript nicht funktionierte oder\n    unbekannte Fehler in meinem Terminal auftraten. Ein weiterer Anwendungsfall\n    für das Refactoring sind Shell-Einschränkungen – einige Betriebssysteme oder\n    Linux-/Unix-Distributionen bieten kein Bash, sondern nur SH, z. B. Alpine.\n\n\n    ![Shell-Skripte\n    refaktorisieren](https://res.cloudinary.com/about-gitlab-com/image/upload/v\\\n    1749675059/Blog/Content%20Images/intellj_refactor_shell_scripts.png)\n\n\n    Der [GitLab Duo Coffee Chat: Herausforderung – Shell-Skripte\n    refaktorisieren](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/git\\\n    lab-duo-challenges/code-challenges/challenge-refactor-shell-scripts) zeigt\n    ein Beispiel mit einem C-Programm, das Syslog-Dateien bearbeiten kann, und\n    einem in Bash geschriebenen Build-Skript. Während der gesamten Challenge\n    wird der Chat mit den Prompts `/explain` und `/refactor` abgefragt, um den\n    Code zu verbessern. Es ist auch möglich, Bash in POSIX-konformes SH oder ZSH\n    zu refaktorisieren. Die Sitzung endet mit der Bitte an den Chat, fünf\n    verschiedene Shell-Skriptimplementierungen bereitzustellen und die\n    wichtigsten Zusammenfassungen zu erläutern.\\\n\n\n    \u003C!-- blank line -->\n\n    \u003Cfigure class=\\\"video_container\\\">\n\n    \\  \u003Ciframe src=\\\"https://www.youtube.com/embed/mssqYjlKGzU\\\"\n    frameborder=\\\"0\\\" allowfullscreen=\\\"true\\\"> \u003C/iframe>\n\n    \u003C/figure>\n\n    \u003C!-- blank line -->\n\n\n    ### Weitere Anwendungsfälle und Tutorials\n\n\n    - [Dokumentation:\n    GitLab-Duo-Anwendungsfälle](https://docs.gitlab.com/user/gitlab_duo/use_/\n    cases.html)\n\n    - [Tutorial: Top-Tipps für effiziente KI-basierte Codevorschläge mit\n    GitLab Duo](https://about.gitlab.com/blog/top-tips-for-efficient-ai-powered\\\n    -code-suggestions-with-gitlab-duo/)\n\n    - [Tutorial: 10 Best Practices für den Einsatz des KI-basierten\n    GitLab Duo Chat](https://about.gitlab.com/blog/10-best-practices-for-using-\\\n    ai-powered-gitlab-duo-chat/)\n\n\n    ## Wichtigste Erkenntnisse\\\n\n\n    1. GitLab Duo bietet effiziente Hilfe beim Erklären und Refaktorisieren von\n    Code.\\\n\n    1. Du kannst Code zwischen den Sprachstandards refaktorisieren und im Chat\n    weitere Fragen stellen.\n\n    1. Prompts für Codevorschläge können bestimmte Sprachstandards generieren,\n    und die Code-Vervollständigung geht auf den aktuellen Codekontext ein.\\\n\n    1. Das Refaktorisieren von Code in neue Programmiersprachen hilft bei\n    längerfristigen Migrations- und Modernisierungsvorhaben.\n\n    1. Code kann auf die unterstützten Sprachstandards älterer Systeme\n    „herabgestuft“ werden.\n\n    1. GitLab Duo kann komplexe Code- und Programmiersprachen mit Beispielen in\n    verschiedenen Programmiersprachen erklären.\n\n    1. Das Update auf Anthropic Claude 3.5 auf GitLab.com hat die Qualität und\n    Geschwindigkeit der Codevorschläge und des Chats noch einmal verbessert\n    (Self-Managed-Upgrade auf 17.3 empfohlen).\n\n    1. Es gibt keine Grenzen, außer deiner Vorstellungskraft und deinen\n    Produktionsschwierigkeiten.\n\n\n    Erfahre mehr über effiziente Codevorschläge und Chat-Workflows und beginne\n    jetzt deine KI-basierte Code-Refactoring-Reise mit GitLab Duo!\n\n\n    > [Starte deine kostenlose Testversion von\n    GitLab Duo!](https://about.gitlab.com/solutions/gitlab-duo-pro/sales/?type=\\\n    free-trial&toggle=gitlab-duo-pro_)\\n\"\n  category: ai-ml\n  tags:\n    - AI/ML\n    - tutorial\n    - DevSecOps\n  updatedDate: '2024-11-13'\nconfig:\n  slug: refactor-code-into-modern-languages-with-ai-powered-gitlab-duo\n  featured: false\n  template: BlogPost\n",{"title":5,"description":17,"ogTitle":5,"ogDescription":17,"noIndex":14,"ogImage":19,"ogUrl":33,"ogSiteName":34,"ogType":35,"canonicalUrls":33},"https://about.gitlab.com/blog/refactor-code-into-modern-languages-with-ai-powered-gitlab-duo","https://about.gitlab.com","article","de-de/blog/refactor-code-into-modern-languages-with-ai-powered-gitlab-duo",[38,23,39],"aiml","devsecops",[22,23,24],"cmvnh7fu3jVKg3J2Vk6nP7XukgiI6RzHgiJ3p1moeMU",{"data":43},{"logo":44,"freeTrial":49,"sales":54,"login":59,"items":64,"search":374,"minimal":408,"duo":426,"switchNav":435,"pricingDeployment":446},{"config":45},{"href":46,"dataGaName":47,"dataGaLocation":48},"/de-de/","gitlab logo","header",{"text":50,"config":51},"Kostenlose Testversion anfordern",{"href":52,"dataGaName":53,"dataGaLocation":48},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de&glm_content=default-saas-trial/","free trial",{"text":55,"config":56},"Vertrieb kontaktieren",{"href":57,"dataGaName":58,"dataGaLocation":48},"/de-de/sales/","sales",{"text":60,"config":61},"Anmelden",{"href":62,"dataGaName":63,"dataGaLocation":48},"https://gitlab.com/users/sign_in/","sign in",[65,92,189,194,295,355],{"text":66,"config":67,"cards":69},"Plattform",{"dataNavLevelOne":68},"platform",[70,76,84],{"title":66,"description":71,"link":72},"Die intelligente Orchestrierungsplattform für DevSecOps",{"text":73,"config":74},"Die Plattform erkunden",{"href":75,"dataGaName":68,"dataGaLocation":48},"/de-de/platform/",{"title":77,"description":78,"link":79},"GitLab Duo Agent Platform","Agentische KI für den gesamten Software-Lebenszyklus",{"text":80,"config":81},"Lerne GitLab Duo kennen",{"href":82,"dataGaName":83,"dataGaLocation":48},"/de-de/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":85,"description":86,"link":87},"Warum GitLab?","Erfahre, warum sich Unternehmen für GitLab entscheiden",{"text":88,"config":89},"Mehr erfahren",{"href":90,"dataGaName":91,"dataGaLocation":48},"/de-de/why-gitlab/","why gitlab",{"text":93,"left":29,"config":94,"link":96,"lists":100,"footer":171},"Produkt",{"dataNavLevelOne":95},"solutions",{"text":97,"config":98},"Alle Lösungen anzeigen",{"href":99,"dataGaName":95,"dataGaLocation":48},"/de-de/solutions/",[101,126,149],{"title":102,"description":103,"link":104,"items":109},"Automatisierung","CI/CD und Automatisierung zur Beschleunigung der Bereitstellung",{"config":105},{"icon":106,"href":107,"dataGaName":108,"dataGaLocation":48},"AutomatedCodeAlt","/de-de/solutions/delivery-automation/","automated software delivery",[110,114,117,122],{"text":111,"config":112},"CI/CD",{"href":113,"dataGaLocation":48,"dataGaName":111},"/de-de/solutions/continuous-integration/",{"text":77,"config":115},{"href":82,"dataGaLocation":48,"dataGaName":116},"gitlab duo agent platform - product menu",{"text":118,"config":119},"Quellcodeverwaltung",{"href":120,"dataGaLocation":48,"dataGaName":121},"/de-de/solutions/source-code-management/","Source Code Management",{"text":123,"config":124},"Automatische Softwarebereitstellung",{"href":107,"dataGaLocation":48,"dataGaName":125},"Automated software delivery",{"title":127,"description":128,"link":129,"items":134},"Sicherheit","Entwickle Code schneller ohne Abstriche bei der Sicherheit",{"config":130},{"href":131,"dataGaName":132,"dataGaLocation":48,"icon":133},"/de-de/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[135,139,144],{"text":136,"config":137},"Anwendungssicherheitstests",{"href":131,"dataGaName":138,"dataGaLocation":48},"Application security testing",{"text":140,"config":141},"Schutz der Software-Lieferkette",{"href":142,"dataGaLocation":48,"dataGaName":143},"/de-de/solutions/supply-chain/","Software supply chain security",{"text":145,"config":146},"Software-Compliance",{"href":147,"dataGaName":148,"dataGaLocation":48},"/de-de/solutions/software-compliance/","software compliance",{"title":150,"link":151,"items":156},"Auswertung",{"config":152},{"icon":153,"href":154,"dataGaName":155,"dataGaLocation":48},"DigitalTransformation","/de-de/solutions/visibility-measurement/","visibility and measurement",[157,161,166],{"text":158,"config":159},"Sichtbarkeit und Auswertung",{"href":154,"dataGaLocation":48,"dataGaName":160},"Visibility and Measurement",{"text":162,"config":163},"Wertstrommanagement",{"href":164,"dataGaLocation":48,"dataGaName":165},"/de-de/solutions/value-stream-management/","Value Stream Management",{"text":167,"config":168},"Analysen und Einblicke",{"href":169,"dataGaLocation":48,"dataGaName":170},"/de-de/solutions/analytics-and-insights/","Analytics and insights",{"title":172,"items":173},"GitLab für",[174,179,184],{"text":175,"config":176},"Enterprise",{"href":177,"dataGaLocation":48,"dataGaName":178},"/de-de/enterprise/","enterprise",{"text":180,"config":181},"Kleinunternehmen",{"href":182,"dataGaLocation":48,"dataGaName":183},"/de-de/small-business/","small business",{"text":185,"config":186},"Öffentlicher Sektor",{"href":187,"dataGaLocation":48,"dataGaName":188},"/de-de/solutions/public-sector/","public sector",{"text":190,"config":191},"Preise",{"href":192,"dataGaName":193,"dataGaLocation":48,"dataNavLevelOne":193},"/de-de/pricing/","pricing",{"text":195,"config":196,"link":198,"lists":202,"feature":282},"Ressourcen",{"dataNavLevelOne":197},"resources",{"text":199,"config":200},"Alle Ressourcen anzeigen",{"href":201,"dataGaName":197,"dataGaLocation":48},"/de-de/resources/",[203,236,254],{"title":204,"items":205},"Erste Schritte",[206,211,216,221,226,231],{"text":207,"config":208},"Installieren",{"href":209,"dataGaName":210,"dataGaLocation":48},"/de-de/install/","install",{"text":212,"config":213},"Kurzanleitungen",{"href":214,"dataGaName":215,"dataGaLocation":48},"/de-de/get-started/","quick setup checklists",{"text":217,"config":218},"Lernen",{"href":219,"dataGaLocation":48,"dataGaName":220},"https://university.gitlab.com/","learn",{"text":222,"config":223},"Produktdokumentation",{"href":224,"dataGaName":225,"dataGaLocation":48},"https://docs.gitlab.com/","product documentation",{"text":227,"config":228},"Best-Practice-Videos",{"href":229,"dataGaName":230,"dataGaLocation":48},"/de-de/getting-started-videos/","best practice videos",{"text":232,"config":233},"Integrationen",{"href":234,"dataGaName":235,"dataGaLocation":48},"/de-de/integrations/","integrations",{"title":237,"items":238},"Entdecken",[239,244,249],{"text":240,"config":241},"Kundenerfolge",{"href":242,"dataGaName":243,"dataGaLocation":48},"/de-de/customers/","customer success stories",{"text":245,"config":246},"Blog",{"href":247,"dataGaName":248,"dataGaLocation":48},"/de-de/blog/","blog",{"text":250,"config":251},"Remote",{"href":252,"dataGaName":253,"dataGaLocation":48},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":255,"items":256},"Vernetzen",[257,262,267,272,277],{"text":258,"config":259},"GitLab Services",{"href":260,"dataGaName":261,"dataGaLocation":48},"/de-de/services/","services",{"text":263,"config":264},"Community",{"href":265,"dataGaName":266,"dataGaLocation":48},"/community/","community",{"text":268,"config":269},"Forum",{"href":270,"dataGaName":271,"dataGaLocation":48},"https://forum.gitlab.com/","forum",{"text":273,"config":274},"Veranstaltungen",{"href":275,"dataGaName":276,"dataGaLocation":48},"/events/","events",{"text":278,"config":279},"Partner",{"href":280,"dataGaName":281,"dataGaLocation":48},"/de-de/partners/","partners",{"background":283,"textColor":284,"text":285,"image":286,"link":290},"#2f2a6b","#fff","Perspektiven für die Softwareentwicklung der Zukunft",{"altText":287,"config":288},"The Source Promo-Karte",{"src":289},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758208064/dzl0dbift9xdizyelkk4.svg",{"text":291,"config":292},"Aktuelles",{"href":293,"dataGaName":294,"dataGaLocation":48},"/de-de/the-source/","the source",{"text":296,"config":297,"lists":299},"Unternehmen",{"dataNavLevelOne":298},"company",[300],{"items":301},[302,307,313,315,320,325,330,335,340,345,350],{"text":303,"config":304},"Über",{"href":305,"dataGaName":306,"dataGaLocation":48},"/de-de/company/","about",{"text":308,"config":309,"footerGa":312},"Karriere",{"href":310,"dataGaName":311,"dataGaLocation":48},"/jobs/","jobs",{"dataGaName":311},{"text":273,"config":314},{"href":275,"dataGaName":276,"dataGaLocation":48},{"text":316,"config":317},"Geschäftsführung",{"href":318,"dataGaName":319,"dataGaLocation":48},"/company/team/e-group/","leadership",{"text":321,"config":322},"Team",{"href":323,"dataGaName":324,"dataGaLocation":48},"/company/team/","team",{"text":326,"config":327},"Handbuch",{"href":328,"dataGaName":329,"dataGaLocation":48},"https://handbook.gitlab.com/","handbook",{"text":331,"config":332},"Investor Relations",{"href":333,"dataGaName":334,"dataGaLocation":48},"https://ir.gitlab.com/","investor relations",{"text":336,"config":337},"Trust Center",{"href":338,"dataGaName":339,"dataGaLocation":48},"/de-de/security/","trust center",{"text":341,"config":342},"AI Transparency Center",{"href":343,"dataGaName":344,"dataGaLocation":48},"/de-de/ai-transparency-center/","ai transparency center",{"text":346,"config":347},"Newsletter",{"href":348,"dataGaName":349,"dataGaLocation":48},"/company/contact/#contact-forms","newsletter",{"text":351,"config":352},"Presse",{"href":353,"dataGaName":354,"dataGaLocation":48},"/press/","press",{"text":356,"config":357,"lists":358},"Kontakt",{"dataNavLevelOne":298},[359],{"items":360},[361,364,369],{"text":55,"config":362},{"href":57,"dataGaName":363,"dataGaLocation":48},"talk to sales",{"text":365,"config":366},"Support-Portal",{"href":367,"dataGaName":368,"dataGaLocation":48},"https://support.gitlab.com","support portal",{"text":370,"config":371},"Kundenportal",{"href":372,"dataGaName":373,"dataGaLocation":48},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":375,"login":376,"suggestions":383},"Schließen",{"text":377,"link":378},"Um Repositorys und Projekte zu durchsuchen, melde dich an bei",{"text":379,"config":380},"gitlab.com",{"href":62,"dataGaName":381,"dataGaLocation":382},"search login","search",{"text":384,"default":385},"Vorschläge",[386,388,393,395,400,405],{"text":77,"config":387},{"href":82,"dataGaName":77,"dataGaLocation":382},{"text":389,"config":390},"Codevorschläge (KI)",{"href":391,"dataGaName":392,"dataGaLocation":382},"/de-de/solutions/code-suggestions/","Code Suggestions (AI)",{"text":111,"config":394},{"href":113,"dataGaName":111,"dataGaLocation":382},{"text":396,"config":397},"GitLab auf AWS",{"href":398,"dataGaName":399,"dataGaLocation":382},"/de-de/partners/technology-partners/aws/","GitLab on AWS",{"text":401,"config":402},"GitLab auf Google Cloud",{"href":403,"dataGaName":404,"dataGaLocation":382},"/de-de/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":85,"config":406},{"href":90,"dataGaName":407,"dataGaLocation":382},"Why GitLab?",{"freeTrial":409,"mobileIcon":414,"desktopIcon":419,"secondaryButton":422},{"text":410,"config":411},"Kostenlos testen",{"href":412,"dataGaName":53,"dataGaLocation":413},"https://gitlab.com/-/trials/new/","nav",{"altText":415,"config":416},"GitLab-Symbol",{"src":417,"dataGaName":418,"dataGaLocation":413},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":415,"config":420},{"src":421,"dataGaName":418,"dataGaLocation":413},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":204,"config":423},{"href":424,"dataGaName":425,"dataGaLocation":413},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de/get-started/","get started",{"freeTrial":427,"mobileIcon":431,"desktopIcon":433},{"text":428,"config":429},"Mehr über GitLab Duo erfahren",{"href":82,"dataGaName":430,"dataGaLocation":413},"gitlab duo",{"altText":415,"config":432},{"src":417,"dataGaName":418,"dataGaLocation":413},{"altText":415,"config":434},{"src":421,"dataGaName":418,"dataGaLocation":413},{"button":436,"mobileIcon":441,"desktopIcon":443},{"text":437,"config":438},"/Option",{"href":439,"dataGaName":440,"dataGaLocation":413},"#contact","switch",{"altText":415,"config":442},{"src":417,"dataGaName":418,"dataGaLocation":413},{"altText":415,"config":444},{"src":445,"dataGaName":418,"dataGaLocation":413},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":447,"mobileIcon":452,"desktopIcon":454},{"text":448,"config":449},"Zurück zur Preisübersicht",{"href":192,"dataGaName":450,"dataGaLocation":413,"icon":451},"back to pricing","GoBack",{"altText":415,"config":453},{"src":417,"dataGaName":418,"dataGaLocation":413},{"altText":415,"config":455},{"src":421,"dataGaName":418,"dataGaLocation":413},{"title":457,"button":458,"config":463},"Sieh dir an, wie agentische KI die Softwarebereitstellung transformiert",{"text":459,"config":460},"GitLab Transcend jetzt ansehen",{"href":461,"dataGaName":462,"dataGaLocation":48},"/de-de/events/transcend/virtual/","transcend event",{"layout":464,"icon":465,"disabled":29},"release","AiStar",{"data":467},{"text":468,"source":469,"edit":475,"contribute":480,"config":485,"items":490,"minimal":691},"Git ist eine Marke von Software Freedom Conservancy und unsere Verwendung von „GitLab“ erfolgt unter Lizenz.",{"text":470,"config":471},"Quelltext der Seite anzeigen",{"href":472,"dataGaName":473,"dataGaLocation":474},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":476,"config":477},"Diese Seite bearbeiten",{"href":478,"dataGaName":479,"dataGaLocation":474},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":481,"config":482},"Beteilige dich",{"href":483,"dataGaName":484,"dataGaLocation":474},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":486,"facebook":487,"youtube":488,"linkedin":489},"https://x.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[491,536,587,629,656],{"title":190,"links":492,"subMenu":507},[493,497,502],{"text":494,"config":495},"Tarife anzeigen",{"href":192,"dataGaName":496,"dataGaLocation":474},"view plans",{"text":498,"config":499},"Vorteile von Premium",{"href":500,"dataGaName":501,"dataGaLocation":474},"/de-de/pricing/premium/","why premium",{"text":503,"config":504},"Vorteile von Ultimate",{"href":505,"dataGaName":506,"dataGaLocation":474},"/de-de/pricing/ultimate/","why ultimate",[508],{"title":356,"links":509},[510,512,514,516,521,526,531],{"text":55,"config":511},{"href":57,"dataGaName":58,"dataGaLocation":474},{"text":365,"config":513},{"href":367,"dataGaName":368,"dataGaLocation":474},{"text":370,"config":515},{"href":372,"dataGaName":373,"dataGaLocation":474},{"text":517,"config":518},"Status",{"href":519,"dataGaName":520,"dataGaLocation":474},"https://status.gitlab.com/","status",{"text":522,"config":523},"Nutzungsbedingungen",{"href":524,"dataGaName":525,"dataGaLocation":474},"/terms/","terms of use",{"text":527,"config":528},"Datenschutzerklärung",{"href":529,"dataGaName":530,"dataGaLocation":474},"/de-de/privacy/","privacy statement",{"text":532,"config":533},"Cookie-Einstellungen",{"dataGaName":534,"dataGaLocation":474,"id":535,"isOneTrustButton":29},"cookie preferences","ot-sdk-btn",{"title":93,"links":537,"subMenu":546},[538,542],{"text":539,"config":540},"DevSecOps-Plattform",{"href":75,"dataGaName":541,"dataGaLocation":474},"devsecops platform",{"text":543,"config":544},"KI-unterstützte Entwicklung",{"href":82,"dataGaName":545,"dataGaLocation":474},"ai-assisted development",[547],{"title":548,"links":549},"Themen",[550,554,559,564,569,572,577,582],{"text":111,"config":551},{"href":552,"dataGaName":553,"dataGaLocation":474},"/de-de/topics/ci-cd/","cicd",{"text":555,"config":556},"GitOps",{"href":557,"dataGaName":558,"dataGaLocation":474},"/de-de/topics/gitops/","gitops",{"text":560,"config":561},"DevOps",{"href":562,"dataGaName":563,"dataGaLocation":474},"/de-de/topics/devops/","devops",{"text":565,"config":566},"Versionskontrolle",{"href":567,"dataGaName":568,"dataGaLocation":474},"/de-de/topics/version-control/","version control",{"text":24,"config":570},{"href":571,"dataGaName":39,"dataGaLocation":474},"/de-de/topics/devsecops/",{"text":573,"config":574},"Cloud-nativ",{"href":575,"dataGaName":576,"dataGaLocation":474},"/de-de/topics/cloud-native/","cloud native",{"text":578,"config":579},"KI für das Programmieren",{"href":580,"dataGaName":581,"dataGaLocation":474},"/de-de/topics/devops/ai-for-coding/","ai for coding",{"text":583,"config":584},"Agentische KI",{"href":585,"dataGaName":586,"dataGaLocation":474},"/de-de/topics/agentic-ai/","agentic ai",{"title":588,"links":589},"Lösungen",[590,593,595,600,604,607,610,613,615,617,619,624],{"text":136,"config":591},{"href":131,"dataGaName":592,"dataGaLocation":474},"Application Security Testing",{"text":123,"config":594},{"href":107,"dataGaName":108,"dataGaLocation":474},{"text":596,"config":597},"Agile Entwicklung",{"href":598,"dataGaName":599,"dataGaLocation":474},"/de-de/solutions/agile-delivery/","agile delivery",{"text":601,"config":602},"SCM",{"href":120,"dataGaName":603,"dataGaLocation":474},"source code management",{"text":111,"config":605},{"href":113,"dataGaName":606,"dataGaLocation":474},"continuous integration & delivery",{"text":162,"config":608},{"href":164,"dataGaName":609,"dataGaLocation":474},"value stream management",{"text":555,"config":611},{"href":612,"dataGaName":558,"dataGaLocation":474},"/de-de/solutions/gitops/",{"text":175,"config":614},{"href":177,"dataGaName":178,"dataGaLocation":474},{"text":180,"config":616},{"href":182,"dataGaName":183,"dataGaLocation":474},{"text":185,"config":618},{"href":187,"dataGaName":188,"dataGaLocation":474},{"text":620,"config":621},"Bildungswesen",{"href":622,"dataGaName":623,"dataGaLocation":474},"/de-de/solutions/education/","education",{"text":625,"config":626},"Finanzdienstleistungen",{"href":627,"dataGaName":628,"dataGaLocation":474},"/de-de/solutions/finance/","financial services",{"title":195,"links":630},[631,633,635,637,640,642,644,646,648,650,652,654],{"text":207,"config":632},{"href":209,"dataGaName":210,"dataGaLocation":474},{"text":212,"config":634},{"href":214,"dataGaName":215,"dataGaLocation":474},{"text":217,"config":636},{"href":219,"dataGaName":220,"dataGaLocation":474},{"text":222,"config":638},{"href":224,"dataGaName":639,"dataGaLocation":474},"docs",{"text":245,"config":641},{"href":247,"dataGaName":248,"dataGaLocation":474},{"text":240,"config":643},{"href":242,"dataGaName":243,"dataGaLocation":474},{"text":250,"config":645},{"href":252,"dataGaName":253,"dataGaLocation":474},{"text":258,"config":647},{"href":260,"dataGaName":261,"dataGaLocation":474},{"text":263,"config":649},{"href":265,"dataGaName":266,"dataGaLocation":474},{"text":268,"config":651},{"href":270,"dataGaName":271,"dataGaLocation":474},{"text":273,"config":653},{"href":275,"dataGaName":276,"dataGaLocation":474},{"text":278,"config":655},{"href":280,"dataGaName":281,"dataGaLocation":474},{"title":296,"links":657},[658,660,662,664,666,668,670,675,680,682,684,686],{"text":303,"config":659},{"href":305,"dataGaName":298,"dataGaLocation":474},{"text":308,"config":661},{"href":310,"dataGaName":311,"dataGaLocation":474},{"text":316,"config":663},{"href":318,"dataGaName":319,"dataGaLocation":474},{"text":321,"config":665},{"href":323,"dataGaName":324,"dataGaLocation":474},{"text":326,"config":667},{"href":328,"dataGaName":329,"dataGaLocation":474},{"text":331,"config":669},{"href":333,"dataGaName":334,"dataGaLocation":474},{"text":671,"config":672},"Nachhaltigkeit",{"href":673,"dataGaName":674,"dataGaLocation":474},"/sustainability/","Sustainability",{"text":676,"config":677},"Vielfalt, Inklusion und Zugehörigkeit",{"href":678,"dataGaName":679,"dataGaLocation":474},"/de-de/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":336,"config":681},{"href":338,"dataGaName":339,"dataGaLocation":474},{"text":346,"config":683},{"href":348,"dataGaName":349,"dataGaLocation":474},{"text":351,"config":685},{"href":353,"dataGaName":354,"dataGaLocation":474},{"text":687,"config":688},"Transparenzerklärung zu moderner Sklaverei",{"href":689,"dataGaName":690,"dataGaLocation":474},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":692},[693,695,698],{"text":522,"config":694},{"href":524,"dataGaName":525,"dataGaLocation":474},{"text":696,"config":697},"Cookies",{"dataGaName":534,"dataGaLocation":474,"id":535,"isOneTrustButton":29},{"text":527,"config":699},{"href":529,"dataGaName":530,"dataGaLocation":474},[701],{"id":702,"title":9,"body":27,"config":703,"content":705,"description":27,"extension":26,"meta":709,"navigation":29,"path":710,"seo":711,"stem":712,"__hash__":713},"blogAuthors/en-us/blog/authors/michael-friedrich.yml",{"template":704},"BlogAuthor",{"name":9,"config":706},{"headshot":707,"ctfId":708},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659879/Blog/Author%20Headshots/dnsmichi-headshot.jpg","dnsmichi",{},"/en-us/blog/authors/michael-friedrich",{},"en-us/blog/authors/michael-friedrich","lJ-nfRIhdG49Arfrxdn1Vv4UppwD51BB13S3HwIswt4",[715,728,740],{"content":716,"config":726},{"title":717,"description":718,"authors":719,"heroImage":721,"date":722,"body":723,"category":11,"tags":724},"GitLab und Anthropic: Governed AI für die Unternehmensentwicklung","GitLab vertieft die Anthropic-Integration – KI-Governance, Auditierbarkeit und Cloud-Flexibilität für regulierte Unternehmen und den öffentlichen Sektor.",[720],"Stuart Moncada","https://res.cloudinary.com/about-gitlab-com/image/upload/v1776457632/llddiylsgwuze0u1rjks.png","2026-04-28","Für Führungskräfte in Unternehmen und im öffentlichen Sektor ist die Spannung\nvertraut: Softwareteams müssen mit KI schneller werden, während Sicherheits-,\nCompliance- und regulatorische Anforderungen weiter steigen. GitLab vertieft\ndie Integration mit Anthropic Claude, sodass Unternehmen Zugang zu neu\nveröffentlichten Claude-Modellen innerhalb von GitLabs intelligenter\nOrchestrierungsplattform erhalten – dort, wo Governance, Compliance und\nAuditierbarkeit bereits verankert sind.\n\nClaude treibt Funktionen der gesamten GitLab Duo Agent Platform als\nStandardmodell an – für Anwendungsfälle von Code-Generierung und -Review bis\nhin zu agentischem Chat und Vulnerability Resolution. Wer GitLab Duo bereits\nnutzt, hat bereits erlebt, wie Duo-Agenten Workflows über den gesamten Software\nDevelopment Lifecycle (SDLC) automatisieren.\n\nDas beschleunigt die Integration von Claudes Fähigkeiten in GitLab, erweitert\ndie Deployment-Optionen für Unternehmen und unterstreicht, was GitLab als\nPlattform für Softwareentwicklung grundlegend unterscheidet: Governance,\nCompliance und Auditierbarkeit, die in jede KI-Interaktion eingebaut sind.\n\n> \"GitLab Duo hat beschleunigt, wie unsere Teams Software planen, bauen und\n> ausliefern. Die Kombination aus Anthropics Claude und GitLabs Plattform\n> bedeutet, dass wir leistungsfähigere KI erhalten, ohne zu ändern, wie wir\n> arbeiten oder wie sie kontrolliert wird.\"\n>\n> – Mans Booijink, Operations Manager, Cube\n\n\n## Der entscheidende Unterschied: Governed AI\n\nBei GitLab sind Governance-Kontrollen und Auditing in den SDLC eingebaut. Wenn\nClaude über die GitLab Duo Agent Platform eine Codeänderung vorschlägt, durchläuft\ndieser Vorschlag denselben Merge-Request-Prozess, dieselben Freigaberegeln,\ndasselbe Security Scanning und denselben Audit-Trail wie jede andere Änderung.\nKI erhält keine Ausnahme von den bestehenden Kontrollen. Sie operiert innerhalb\ndieser Kontrollen.\n\nJe weiter GitLab in die agentische Softwareentwicklung vordringt – bei der KI\nklar definierte Aufgaben autonom übernimmt – desto wichtiger wird die\nGovernance-Schicht. Ein KI-Agent, der einen Merge Request öffnen, eine\nSchwachstelle beheben oder einen Service refaktorieren kann, muss auditierbar\nund zuordenbar sein und denselben Richtliniendurchsetzungen unterliegen wie ein\nmenschlicher Entwickler. Diese Anforderung ist eine architektonische Entscheidung,\ndie GitLab von Beginn an getroffen hat – und die umso bedeutsamer wird, je mehr\nVerantwortung KI-Agenten übernehmen.\n\n\n## Deployment-Flexibilität für Unternehmen\n\nDie Integration erweitert auch, wie Unternehmen über GitLab auf die neuesten\nClaude-Modelle zugreifen. Claude ist innerhalb von GitLab über Google Cloud\nVertex AI und AWS Bedrock verfügbar – Unternehmen können KI-Workloads über die\nHyperscaler-Commitments und Cloud-Governance-Frameworks leiten, die bereits\nbestehen. Kein separater Anbietervertrag, keine neuen Fragen zur Datenresidenz.\nDie bestehende GCP- oder AWS-Beziehung ist der Einstiegspunkt.\n\nGitLab ist jetzt auch im [Claude Marketplace](https://claude.com/platform/marketplace)\nverfügbar. Kunden können dort GitLab Credits erwerben und auf bestehende\nAnthropic-Ausgaben-Commitments anrechnen – KI-Ausgaben konsolidieren und die\nBeschaffung von GitLab neben Anthropic-Investitionen vereinfachen.\n\n\n## Auf dem Weg in eine agentische Zukunft\n\nGitLabs Vision für agentische Softwareentwicklung – bei der KI definierte\nAufgaben autonom über Planung, Coding, Testing, Security und Deployment hinweg\nübernimmt – setzt Modelle mit starkem Reasoning, Zuverlässigkeit und\nSicherheitseigenschaften voraus. Und sie setzt eine Plattform voraus, auf der\ndiese autonomen Aktionen vollständig kontrolliert werden.\n\nAgentische Workflows erfordern Modelle mit starkem Reasoning, Zuverlässigkeit\nund Sicherheitseigenschaften – Kriterien, die die Auswahl und Integration von\nKI-Modellpartnern bei GitLab leiten. GitLabs Governance-Framework stellt sicher,\ndass Unternehmen bei zunehmendem KI-Einsatz in der Entwicklung vollständige\nTransparenz und Kontrolle darüber behalten, was diese Agenten tun, wann sie es\ntun und wie Änderungen nachverfolgt werden.\n\n\n## Was das für GitLab-Kunden bedeutet\n\nWer GitLab Duo Agent Platform bereits einsetzt, erhält Zugang zu Claude-Modellen\nund tieferer KI-Unterstützung über den gesamten Software Development Lifecycle –\ninnerhalb des Governance-Frameworks, auf das bereits vertraut wird.\n\nWer KI-gestützte Softwareentwicklungsplattformen evaluiert, sollte nicht zwischen\nfortschrittlichen KI-Fähigkeiten und Unternehmenskontrolle wählen müssen. Diese\nstrategische Integration ist darauf ausgelegt, beides zu liefern.\n\n> Mehr über GitLab Duo Agent Platform erfahren?\n> [Demo anfragen oder kostenlose Testversion starten](https://about.gitlab.com/de-de/gitlab-duo-agent-platform/).\n",[22,725,281],"product",{"featured":29,"template":15,"slug":727},"gitlab-and-anthropic-governed-ai-for-enterprise-development",{"content":729,"config":738},{"title":730,"description":731,"authors":732,"heroImage":734,"date":735,"body":736,"category":11,"tags":737},"glab CLI: Strukturierter GitLab-Zugriff für KI-Agenten","Das GitLab CLI (glab) gibt KI-Agenten strukturierten Zugriff auf Projekte via MCP. Tutorial: Code-Reviews und Issue-Triage mit glab beschleunigen.",[733],"Kai Armstrong","https://res.cloudinary.com/about-gitlab-com/image/upload/v1776347152/unw3mzatkd5xyfbzcnni.png","2026-04-27","Wenn Teams GitLab Duo, Claude, Cursor und andere KI-Assistenten einsetzen,\nläuft ein wachsender Teil des Entwicklungs-Workflows über einen KI-Agenten,\nder im eigenen Auftrag handelt – Issues liest, Merge Requests prüft, Pipelines\nausführt und dabei hilft, schneller zu liefern. Die meisten Entwickler(innen) nutzen\n`glab` bereits vom Terminal aus, um mit GitLab zu interagieren. Beides zu\nkombinieren ist der naheliegende nächste Schritt.\n\nDas Problem: Ohne die richtigen Werkzeuge rät ein KI-Agent im Wesentlichen,\nwenn es um GitLab-Projekte geht. Er könnte die Details eines Issues\nhalluzinieren, den er nie gesehen hat, einen Merge Request auf Basis veralteter\nTrainingsdaten zusammenfassen statt anhand seines tatsächlichen Zustands – oder\nverlangen, dass Kontext manuell aus einem Browser-Tab kopiert und in ein\nChat-Fenster eingefügt wird, bevor überhaupt begonnen werden kann. Jede dieser\nUmgehungslösungen ist Reibung: Sie verlangsamt die Arbeit, eröffnet\nFehlermöglichkeiten und setzt eine harte Obergrenze dafür, was der Agent\ntatsächlich leisten kann. Das GitLab CLI (`glab`) ändert das, indem es Agenten\neine direkte, zuverlässige Schnittstelle zu Projekten gibt.\n\nMit `glab` ruft der Agent das Benötigte direkt von GitLab ab, handelt darauf\nund meldet das Ergebnis zurück – sodass weniger Zeit damit verbracht wird,\nInformationen weiterzugeben, und mehr Zeit für die eigentliche Arbeit bleibt.\n\nIn diesem Tutorial wird gezeigt, wie `glab` KI-Agenten strukturierten,\nzuverlässigen Zugriff auf GitLab-Projekte ermöglicht – und wie das einen\nschnelleren, leistungsfähigeren Entwicklungs-Workflow freischaltet.\n\n\n## KI-Agent über MCP mit GitLab verbinden\n\nDer direkteste Weg, KI-Workflows deutlich leistungsfähiger zu machen, besteht\ndarin, dem KI-Agenten nativen Zugriff auf `glab` über das Model Context\nProtocol ([MCP](https://about.gitlab.com/topics/ai/model-context-protocol/))\nzu geben.\n\nMCP ist ein offener Standard, der KI-Werkzeugen ermöglicht, externe Fähigkeiten\nzur Laufzeit zu entdecken und zu nutzen. Nach der Verbindung kann der\nKI-Assistent Issues lesen, Merge Requests kommentieren, Pipeline-Status prüfen\nund zurück in GitLab schreiben – ohne etwas aus der UI zu kopieren oder auch\nnur einen einzigen API-Aufruf selbst zu schreiben.\n\nEinstieg mit:\n\n```shell\n# MCP-Server von glab starten\nglab mcp serve\n```\n\nSobald der MCP-Client konfiguriert ist, kann die KI Fragen wie *„Was ist der\nStatus meiner offenen MRs?\"* oder *„Gibt es fehlgeschlagene Pipelines auf\nmain?\"* beantworten, indem sie GitLab direkt abfragt – nicht durch Scraping der\nWeb-UI, nicht durch veraltete Trainingsdaten. Die\n[vollständige Setup-Dokumentation](https://docs.gitlab.com/cli/) enthält\nKonfigurationsschritte für Claude Code, Cursor und andere Editoren.\n\nEin wichtiges Detail: `glab` fügt automatisch `--output json` hinzu, wenn es\nüber MCP aufgerufen wird – für jeden Befehl, der das unterstützt. Der Agent\nerhält saubere, strukturierte Daten, ohne dass über Ausgabeformate nachgedacht\nwerden muss. Und da `glab` das offizielle MCP SDK verwendet, bleibt es\nkompatibel, wenn sich das Protokoll weiterentwickelt.\n\nWir haben bewusst entschieden, *welche* Befehle über MCP zugänglich sind.\nBefehle, die interaktive Terminalausgabe erfordern, sind absichtlich\nausgeschlossen – der Agent bleibt nie in einem Wartezustand für Eingaben, die\nnie kommen. Was zugänglich ist, funktioniert zuverlässig im Agenten-Kontext.\n\n\n## KI am Code-Review beteiligen\n\nDie meisten Entwickler(innen) haben einen Rückstand an MRs, die auf Review warten.\nDas ist einer der zeitintensivsten Teile der Arbeit – und einer der besten\nAnsatzpunkte für KI. Mit `glab` beobachtet der Agent die Review-Queue nicht\nnur, sondern arbeitet sie gemeinsam durch.\n\n### Genau sehen, was noch offen ist\n\nEinstieg mit:\n\n```shell\nglab mr view 2677 --comments --unresolved --output json\n```\n\nDieser Befehl gibt den vollständigen MR zurück: Metadaten, Beschreibung und\njede ungelöste Diskussion als einzelnes strukturiertes JSON-Payload. Das gibt\nder KI alles, was sie braucht: welche Threads offen sind, was der Reviewer\nangefragt hat und in welchem Kontext. Kein Tab-Wechsel, kein manuelles Kopieren\neinzelner Kommentare.\n\n```json\n{\n  \"id\": 2677,\n  \"title\": \"feat: add OAuth2 support\",\n  \"state\": \"opened\",\n  \"author\": { \"username\": \"jdwick\" },\n  \"labels\": [\"backend\", \"needs-review\"],\n  \"blocking_discussions_resolved\": false,\n  \"discussions\": [\n    {\n      \"id\": \"3107030349\",\n      \"resolved\": false,\n      \"notes\": [\n        {\n          \"author\": { \"username\": \"dmurphy\" },\n          \"body\": \"This error handling will swallow panics — consider wrapping with recover()\",\n          \"created_at\": \"2026-03-14T09:23:11.000Z\"\n        }\n      ]\n    },\n    {\n      \"id\": \"3107030412\",\n      \"resolved\": false,\n      \"notes\": [\n        {\n          \"author\": { \"username\": \"sreeves\" },\n          \"body\": \"Token refresh logic needs a test for the expired token case\",\n          \"created_at\": \"2026-03-14T10:05:44.000Z\"\n        }\n      ]\n    }\n  ]\n}\n```\n\nStatt jeden Thread selbst durchzulesen, lässt sich der Agent fragen:\n*„Was muss ich in MR 2677 noch beheben?\"* – und erhält eine priorisierte\nZusammenfassung mit Änderungsvorschlägen. Das alles aus einem einzigen Befehl.\n\n### Den Kreislauf programmatisch schließen\n\nSobald der KI geholfen hat, das Feedback zu adressieren, kann sie Diskussionen\nauflösen:\n\n```shell\n# Alle Diskussionen auflisten – strukturiert, bereit für den Agenten\nglab mr note list 456 --output json\n\n# Diskussion auflösen, sobald das Feedback adressiert wurde\nglab mr note resolve 456 3107030349\n\n# Wieder öffnen, wenn etwas erneut geprüft werden muss\nglab mr note reopen 456 3107030349\n```\n\n```json\n[\n  {\n    \"id\": 3107030349,\n    \"body\": \"This error handling will swallow panics — consider wrapping with recover()\",\n    \"author\": { \"username\": \"dmurphy\" },\n    \"resolved\": false,\n    \"resolvable\": true\n  },\n  {\n    \"id\": 3107030412,\n    \"body\": \"Token refresh logic needs a test for the expired token case\",\n    \"author\": { \"username\": \"sreeves\" },\n    \"resolved\": false,\n    \"resolvable\": true\n  }\n]\n```\n\nNote-IDs sind direkt in der GitLab-UI und der API sichtbar – kein zusätzlicher\nLookup nötig. Der Agent kann die vollständige Liste durcharbeiten, jeden Fix\nprüfen und dabei auflösen.\n\n\n## Mit der KI effektiver über Code sprechen\n\nAuch ohne laufenden MCP-Server gibt es eine einfachere Umstellung, die einen\ngroßen Unterschied macht: `glab` einsetzen, um der KI bessere Informationen zu\nliefern.\n\nBeim letzten Mal, als ein KI-Assistent bei der Issue-Triage oder beim Debuggen\neiner fehlgeschlagenen Pipeline geholfen hat, wurde wahrscheinlich etwas Text\naus der GitLab-UI kopiert und in den Chat eingefügt. Das ist es, womit der\nAgent tatsächlich arbeitet:\n\n```text\nopen issues: 12 • milestone: 17.10 • label: bug, needs-triage ...\n```\n\nIm Vergleich dazu, was er mit `glab` erhält:\n\n```json\n[\n  {\n    \"iid\": 902,\n    \"title\": \"Pipeline fails on merge to main\",\n    \"labels\": [\"bug\", \"needs-triage\"],\n    \"milestone\": { \"title\": \"17.10\" },\n    \"assignees\": []\n  },\n  ...\n]\n```\n\nStrukturiert, typisiert, vollständig – keine Mehrdeutigkeit, kein\nInterpretationsaufwand beim Parsen. Das ist der Unterschied zwischen einem\nAgenten, der handeln kann, und einem, der Rückfragen stellen muss.\n\nMit dem MCP-Server passiert das automatisch: `glab` fügt `--output json` für\njeden Befehl hinzu, der das unterstützt. Beim direkten Arbeiten im Terminal\neinfach das Flag selbst ergänzen:\n\n```shell\n# Offene Issues für Triage abrufen\nglab issue list --label \"needs-triage\" --output json\n\n# Pipeline-Status prüfen\nglab ci status --output json\n\n# Vollständige MR-Details abrufen\nglab mr view 456 --output json\n```\n\nDie JSON-Ausgabe wurde in letzten Releases erheblich erweitert. Sie deckt jetzt\nCI-Status, Milestones, Labels, Releases, Schedules, Cluster-Agenten, Work\nItems, MR-Genehmiger, Repository-Mitwirkende und mehr ab. Was `glab` abrufen\nkann, kann die KI sauber verarbeiten.\n\n### Ein echter Workflow\n\n```shell\n$ glab issue list --label \"needs-triage\" --milestone \"17.10\" \\\n--output json\n```\n\n```text\nAgent: I found 2 unassigned bugs in the 17.10 milestone that need triage:\n1. #902 — Pipeline fails on merge to main (opened 5 days ago)\n2. #903 — Auth token not refreshing on expiry (opened 4 days ago)\nBoth are unassigned. Want me to draft triage notes and suggest assignees based on recent commit history?\n```\n\n\n## Der Agent ist keineswegs auf eingebaute Befehle beschränkt\n\nDie nativen Befehle von `glab` decken die gängigsten Workflows ab – aber der\nAgent ist nicht darauf beschränkt. Über `glab api` hat er authentifizierten\nZugriff auf die vollständige GitLab REST- und GraphQL-API-Oberfläche, mit\nderselben Session, ohne zusätzliche Credentials oder Konfiguration.\n\nDas ist ein wesentlicher Unterschied. Die meisten CLI-Werkzeuge beschränken\nsich auf das, was ihre Befehle abbilden. Mit `glab` gilt: Wenn GitLabs API es\nunterstützt, kann der Agent es tun – immer aus einem vertrauenswürdigen,\nauthentifizierten Kontext heraus.\n\nEin praktisches Beispiel: nur die Liste der geänderten Dateien in einem MR\nabrufen, bevor entschieden wird, welche Diffs vollständig geladen werden:\n\n```shell\n# Geänderte Dateipfade abrufen – leichtgewichtig, noch kein Diff-Inhalt\nglab api \"/projects/$CI_PROJECT_ID/merge_requests/$CI_MERGE_REQUEST_IID/diffs?per_page=100\" \\\n| jq '.[].new_path'\n\n# Dann nur die spezifische Datei laden, die der Agent benötigt\nglab api \"/projects/$CI_PROJECT_ID/merge_requests/$CI_MERGE_REQUEST_IID/diffs?per_page=100\" \\\n| jq '.[] | select(.new_path == \"path/to/file.go\")'\n```\n\n```text\n\"internal/auth/token.go\"\n\"internal/auth/token_test.go\"\n\"internal/oauth/refresh.go\"\n```\n\nFür alles, was die REST API nicht abdeckt (Epics, bestimmte Work-Item-Abfragen,\nkomplexe projektübergreifende Daten), bietet `glab api graphql` die vollständige\nGraphQL-Schnittstelle:\n\n```shell\nglab api graphql -f query='\n{\n  project(fullPath: \"gitlab-org/gitlab\") {\n    mergeRequest(iid: \"12345\") {\n      title\n      reviewers { nodes { username } }\n    }\n  }\n}'\n```\n\n```json\n{\n  \"data\": {\n    \"project\": {\n      \"mergeRequest\": {\n        \"title\": \"feat: add OAuth2 support\",\n        \"reviewers\": {\n          \"nodes\": [\n            { \"username\": \"dmurphy\" },\n            { \"username\": \"sreeves\" }\n          ]\n        }\n      }\n    }\n  }\n}\n```\n\nEin einziger, authentifizierter Einstiegspunkt zu allem, was GitLab\nbereitstellt – ohne Token-Jonglieren, separate API-Clients oder\nKonfigurationsaufwand.\n\n\n## Was als Nächstes kommt – und Feedback\n\nZwei Verbesserungen, an denen aktiv gearbeitet wird, werden `glab` für\nAgenten-Workflows noch nützlicher machen:\n\n**Auf Agenten abgestimmter Hilfetext.** Heute ist die `--help`-Ausgabe für\nMenschen am Terminal geschrieben. Sie wird aktualisiert, um für jeden\ninteraktiven Befehl die nicht-interaktive Alternative anzuzeigen, Befehle mit\n`--output json`-Unterstützung zu kennzeichnen und Hilfe generell zu einer\nnützlichen Ressource für Agenten zu machen, die Fähigkeiten zur Laufzeit\nentdecken – nicht nur für Menschen.\n\n**Besser maschinenlesbare Fehlermeldungen.** Wenn heute etwas schiefläuft,\nerhalten Agenten dieselben menschenlesbaren Fehlermeldungen wie\nTerminal-Nutzende. Das wird geändert: Fehler im JSON-Modus geben strukturierte\nAusgaben zurück, die dem Agenten die Informationen liefern, die er braucht, um\nFehler sauber zu behandeln, intelligent zu wiederholen oder den richtigen\nKontext zurückzugeben.\n\nBeide Punkte sind in aktiver Entwicklung. Wer `glab` bereits mit einem\nKI-Werkzeug einsetzt, ist genau die Zielgruppe, deren Erfahrungen uns\ninteressieren.\n\n* **Welche Reibungspunkte gibt es?** Befehle, die sich in Agenten-Kontexten\n  nicht gut verhalten, Fehlermeldungen ohne Handlungsanleitung, Lücken in der\n  JSON-Ausgabe. Feedback ist willkommen.\n\n* **Welche Workflows wurden erschlossen?** Reale Nutzungsmuster helfen dabei,\n  Prioritäten für die weitere Entwicklung zu setzen.\n\nDie Diskussion findet im\n[Feedback-Issue](https://gitlab.com/gitlab-org/cli/-/issues/8177) statt –\ndort wird die Roadmap für Agenten-Freundlichkeit gestaltet, und Beiträge haben\ndort den direktesten Einfluss. Wer eine spezifische Lücke gefunden hat,\nkann ein [Issue öffnen](https://gitlab.com/gitlab-org/cli/-/issues/new). Wer\neinen Fix im Sinn hat: Beiträge sind willkommen. Details unter\n[CONTRIBUTING.md](https://gitlab.com/gitlab-org/cli/-/blob/main/CONTRIBUTING.md).\n\nDas GitLab CLI stand schon immer dafür, Entwickler(inne)n mehr Kontrolle über ihren\nWorkflow zu geben. Da KI ein immer größerer Teil der täglichen Arbeit wird,\nbedeutet das, `glab` zur bestmöglichen Schnittstelle zwischen KI-Werkzeugen\nund GitLab-Projekten zu machen. Wir stehen am Anfang – und freuen uns darauf,\nden nächsten Teil gemeinsam zu gestalten.\n",[22,725,23],{"featured":29,"template":15,"slug":739},"give-your-ai-agent-direct-structured-gitlab-access-with-glab-cli",{"content":741,"config":749},{"title":742,"description":743,"authors":744,"heroImage":734,"date":746,"body":747,"category":11,"tags":748},"GitHubs neue Copilot-Richtlinie: Was regulierte Unternehmen jetzt prüfen müssen","Warum GitLabs Datenverwaltungsansatz strukturell anders ist – und was GitHubs neue Copilot-Richtlinie für regulierte Unternehmen bedeutet.",[745],"Allie Holland","2026-04-20","GitHub hat kürzlich angekündigt, wie Interaktionsdaten von Copilot-Nutzenden\nkünftig verwendet werden. Ab dem 24. April 2026 werden Daten aus Copilot Free,\nPro und Pro+ standardmäßig zum Training von KI-Modellen genutzt, sofern\nNutzende nicht aktiv widersprechen. Betroffen sind Eingaben, Ausgaben,\nCode-Snippets und zugehöriger Kontext. Copilot Business und Enterprise sind\naufgrund bestehender Vertragskonditionen ausgenommen.\n\nFür Unternehmen in regulierten Branchen wirft diese Änderung Fragen auf, die\nüber individuelle Entwicklerpräferenzen weit hinausgehen. Sie zwingt zu einer\ngrundlegenden Prüfung, die Führungskräfte aus Engineering und IT-Sicherheit\njedem KI-Anbieter in ihrem Stack stellen sollten: Werden unsere Daten für\nKI-Training verwendet?\n\nGitLabs Antwort lautet: Nein. GitLab trainiert KI-Modelle nicht mit\nKundendaten – auf keiner Preisstufe. KI-Anbieter sind vertraglich verpflichtet,\nKundeneingaben und -ausgaben nicht für eigene Zwecke zu verwenden. Das\n[GitLab AI Transparency Center](https://about.gitlab.com/de-de/ai-transparency-center/)\nmacht diese Zusage prüfbar. Eine zentrale Dokumentation zeigt, welche Modelle\nwelche Funktionen betreiben, wie Daten verarbeitet werden, welche\nUnterauftragsverarbeiter beteiligt sind und wie lange Daten gespeichert werden.\nDas AI Transparency Center dokumentiert außerdem den Compliance-Status jeder\nFunktion – einschließlich der Bestätigung, dass GitLabs aktuelle KI-Funktionen\nnicht als Hochrisikosysteme im Sinne des EU AI Act eingestuft werden. Diesen\nStandard hat GitLab-CEO Bill Staples\n[wiederholt bekräftigt](https://www.linkedin.com/posts/williamstaples_gitlab-1810-agentic-ai-now-open-to-even-activity-7443280763715985408-aHxf)\n– er spiegelt GitLabs Unternehmensmission und das\n[Trust Center](https://trust.gitlab.com/) wider.\n\n\n## Was die Richtlinienänderung tatsächlich bedeutet\n\nGitHub gibt zudem an, dass die Daten mit verbundenen Unternehmen – darunter\nMicrosoft – für KI-Entwicklungszwecke geteilt werden können.\n\nQuellcode zählt häufig zum sensibelsten geistigen Eigentum eines Unternehmens.\nEr kann proprietäre Geschäftslogik abbilden, interne Systemarchitekturen\noffenlegen oder Datenflüsse berühren, die strengen Aufbewahrungs- und\nZugriffsrichtlinien unterliegen. Wenn dieser Code einen KI-Assistenten\ndurchläuft und zum Training von Modellen verwendet wird, die auch Wettbewerbern\ndienen, werden Anbieterdatenpraktiken zu einem konkreten IP-Risiko. Regulierte\nBranchen weltweit – von Finanzdienstleistungen über Gesundheitswesen bis zum\nöffentlichen Sektor – operieren unter Compliance-Anforderungen, die genau\ndiesen Punkt adressieren: dokumentierte, prüfbare Kontrolle über den Umgang\nDritter mit sensiblen Daten.\n\nEine Anbieterrichtlinie, die Datenstandardeinstellungen ändert, ein aktives\nWiderspruchsrecht erfordert und je nach Vertragsstufe unterschiedliche\nSchutzstandards bietet, erzeugt genau die Art unkontrollierbarer Variablen,\ndie Compliance-Teams nicht akzeptieren können. Der\n[Digital Operational Resilience Act (DORA)](https://eur-lex.europa.eu/eli/reg/2022/2554/oj/eng)\n– seit Januar 2025 für europäische Finanzinstitute verbindlich – macht dies\nexplizit: Wesentliche Änderungen an IT-Drittanbieterbeziehungen erfordern\ndokumentierte Bewertung und Nachverfolgung.\n\n\n## Was regulierte Unternehmen von KI-Anbietern tatsächlich benötigen\n\nRegulierte Unternehmen diskutieren nicht mehr grundsätzlich, ob KI in\nEntwicklungs-Workflows eingesetzt werden soll. Der Fokus liegt darauf, dies so\nzu tun, dass es gegenüber Aufsichtsbehörden, Vorständen und Kunden vertretbar\nist. Dabei sind branchenübergreifend konsistente Anforderungen sichtbar\ngeworden.\n\n**Vertragliche Klarheit.** Regulierte Unternehmen benötigen spezifische,\ndokumentierte und bedingungslose Zusagen darüber, was mit ihren Daten geschieht\n– nicht etwas, das je nach Vertragsstufe variiert oder eine Handlung vor einem\nStichtag erfordert.\n\n**Prüfbarkeit.** IT-Risikomanagement-Frameworks verlangen von Unternehmen, die\neingesetzten KI-Systeme zu verstehen und zu validieren: die Trainingsdaten\nhinter diesen Modellen und die beteiligten Drittparteien. Anbieter, die diese\nFragen nicht beantworten können, erzeugen Dokumentationsrisiken für die\nOrganisationen, die sich auf sie stützen.\n\n**Trennung von Anbieterinteressen.** Wenn ein KI-Anbieter Modelle auf Basis\nvon Kundennutzungsdaten trainiert, werden Code und Workflows zu Eingaben für\nein System, das auch Wettbewerbern dient. Für Institutionen mit proprietären\nHandelsalgorithmen, Underwriting-Modellen oder Betrugserkennungssystemen ist\ndas ein konkretes IP-Risiko.\n\n\n## GitLabs Position zur KI-Datenverwaltung\n\nGitLab verwendet Kundendaten nicht zum Training von KI-Modellen. Diese Zusage\ngilt auf jeder Preisstufe; KI-Anbieter sind vertraglich verpflichtet, Eingaben\nund Ausgaben, die mit GitLab-Kunden verbunden sind, nicht für eigene Zwecke zu\nverwenden.\n\nDies ist eine bewusste architektonische und richtlinienbezogene Entscheidung –\nkein Merkmal einer bestimmten Preisstufe. Wie GitLabs\n[Beitrag zur Enterprise-Unabhängigkeit](https://about.gitlab.com/de-de/blog/why-enterprise-independence-matters-more-than-ever-in-devsecops/)\nfesthält, ist Datenverwaltung zu einem \"zunehmend kritischen Faktor bei\nUnternehmensentscheidungen\" geworden – getrieben durch nationale und regionale\nDatenschutzgesetze und wachsende Bedenken hinsichtlich der Kontrolle über\nsensibles geistiges Eigentum.\n\nGitLab ist cloud-neutral und modell-neutral und unterstützt\nSelf-Hosted-Deployments ohne kommerzielle Bindung an einen einzelnen\nCloud-Anbieter oder ein Large Language Model. Diese Unabhängigkeit ist für\nregulierte Unternehmen relevant, die Risiken durch Anbieterkonzentration\nbewerten. Der\n[AI Continuity Plan](https://handbook.gitlab.com/handbook/product/ai/continuity-plan/)\ndokumentiert, wie Anbieterveränderungen gehandhabt werden – einschließlich\nwesentlicher Änderungen daran, wie KI-Anbieter Kundendaten behandeln. Er ist\neine direkte Antwort auf die Governance-Anforderungen unter Frameworks wie\n[DORA](https://handbook.gitlab.com/handbook/legal/dora/).\n\n\n## Die Governance-Lücke, die KI-Teams schließen müssen\n\nGitHubs Richtlinienaktualisierung macht deutlich: Für Unternehmen in\nregulierten Branchen ist das genaue Verständnis des Datenumgangs eines\nKI-Werkzeugs eine Voraussetzung für dessen Einsatz. Das bedeutet, Anbietern\nklare, dokumentierte Antworten auf folgende Fragen abzuverlangen:\n\n1. Werden unsere Daten zum Training von KI-Modellen verwendet?\n2. Wer sind Ihre KI-Modell-Unterauftragsverarbeiter?\n3. Was geschieht, wenn ein Anbieter seine Datenpraktiken ändert?\n4. Lässt sich ein Deployment realisieren, das alle KI-Verarbeitung innerhalb\n   der eigenen Infrastruktur hält?\n5. Welche Haftungsübernahme wird für KI-generierte Ausgaben angeboten?\n\nAnbieter, die diese Fragen klar beantworten und die Antworten in prüfbarer\nForm dokumentieren, sind Anbieter, auf die sich aufbauen lässt.\n**Wer das nicht kann, schafft Compliance-Risiken bei jedem Policy-Update.**\nWenn ein Anbieter Datenpraktiken mit 30 Tagen Ankündigungsfrist ändern kann,\nist das kein partnerschaftlicher Rahmen für regulierte Unternehmen – das ist\nein strukturelles Compliance-Risiko.\n\n> Mehr zu GitLabs Ansatz für KI-Governance im\n> [GitLab AI Transparency Center](https://about.gitlab.com/de-de/ai-transparency-center/).\n",[22,725],{"featured":14,"template":15,"slug":750},"github-copilots-new-policy-for-ai-training-is-a-governance-wake-up-call",{"promotions":752},[753,766,777,789],{"id":754,"categories":755,"header":756,"text":757,"button":758,"image":763},"ai-modernization",[11],"Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":759,"config":760},"Get your AI maturity score",{"href":761,"dataGaName":762,"dataGaLocation":248},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":764},{"src":765},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":767,"categories":768,"header":769,"text":757,"button":770,"image":774},"devops-modernization",[725,39],"Are you just managing tools or shipping innovation?",{"text":771,"config":772},"Get your DevOps maturity score",{"href":773,"dataGaName":762,"dataGaLocation":248},"/assessments/devops-modernization-assessment/",{"config":775},{"src":776},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":778,"categories":779,"header":781,"text":757,"button":782,"image":786},"security-modernization",[780],"security","Are you trading speed for security?",{"text":783,"config":784},"Get your security maturity score",{"href":785,"dataGaName":762,"dataGaLocation":248},"/assessments/security-modernization-assessment/",{"config":787},{"src":788},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":790,"paths":791,"header":794,"text":795,"button":796,"image":801},"github-azure-migration",[792,793],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Is your team ready for GitHub's Azure move?","GitHub is already rebuilding around Azure. Find out what it means for you.",{"text":797,"config":798},"See how GitLab compares to GitHub",{"href":799,"dataGaName":800,"dataGaLocation":248},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":802},{"src":776},{"header":804,"blurb":805,"button":806,"secondaryButton":811},"Beginne noch heute, schneller zu entwickeln","Entdecke, was dein Team mit der intelligenten Orchestrierungsplattform für DevSecOps erreichen kann.\n",{"text":807,"config":808},"Kostenlosen Test starten",{"href":809,"dataGaName":53,"dataGaLocation":810},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/de-de/","feature",{"text":55,"config":812},{"href":57,"dataGaName":58,"dataGaLocation":810},1777493554919]