Как и многие команды, мы разбираемся, где агенты кодинга на базе ИИ действительно помогают, а где только мешают. Честный ответ заключается в том, что это зависит от задачи. Некоторые задачи слишком неопределенны или новы, чтобы агент с ними справился. Но мы нашли одну область, которая подходит необычайно хорошо: портирование открытого ПО на QNX.
Эта статья отчасти о том, «почему портирование подходит для ИИ», а отчасти — «вот реальный порт, который мы сделали». Мы находимся на начальном этапе, поэтому воспринимайте это скорее как полевой отчет, а не как готовое руководство. Но первые результаты обнадеживают настолько, что этим стоит поделиться.
Почему портирование хорошо подходит для ИИ
Портирование имеет специфическую структуру, которая соответствует сильным сторонам агента.
Проблемы повторяются. На сотнях пакетов одни и те же типы проблем возникают снова и снова: библиотека, требующая явного флага компоновки, сборка, предполагающая наличие заголовков только для Linux, стандарт компилятора, не соответствующий системным заголовкам целевой платформы. Человек учится этому медленно. Агент, которому об этом рассказали, может применить знания немедленно.
Обратная связь конкретна. В отличие от многих других задач разработки ПО, у порта есть однозначный оракул: он собирается или нет, тесты проходят или нет, пакет устанавливается или падает с ошибкой. Здесь нет расплывчатого вопроса «достаточно ли это хорошо?», есть компилятор и набор тестов, дающие ответ «да» или «нет». Этот жесткий, объективный цикл — именно то, что нужно агенту для реального прогресса без того, чтобы человек контролировал каждый шаг.
Теперь это работает нативно, и за этим можно наблюдать. С помощью QNX Self-Hosted Developer Desktop целевая система QNX собирает собственное ПО с использованием утилит abuild и apk от Alpine, работая нативно на QNX. Никакой кросс-компиляции, никакого SDP, никаких файлов цепочки инструментов. Агент работает на нашей рабочей станции, обращается к целевой системе по SSH, а также редактирует и собирает прямо на машине, которая будет запускать результат. Мы наблюдаем за выводом процесса сборки точно так же, как если бы делали это вручную.
Обучение агента тому, что мы знаем
Больше всего мы экспериментируем с тем, как передать агенту специфические знания о QNX, которые обычно хранятся в голове опытного специалиста по портированию.
Наш подход заключается в использовании набора файлов навыков: простых документов Markdown, хранящихся в репозитории Git, которые агент читает перед началом работы. Они охватывают то, с чем сталкиваются при портах на QNX: сокеты находятся в libsocket, а не в libc, стек потоков по умолчанию мал, uname -m возвращает x86pc и так далее, плюс сам рабочий процесс: как адаптировать рецепт Alpine, как правильно сделать патч, как выполнить валидацию перед объявлением победы.
Поверх этого действуют несколько правил, и именно они делают результат заслуживающим доверия, а не просто правдоподобным:
- Подтверждайте утверждения выводом команд. Агент не может просто заявить, что сборка прошла успешно; он должен показать команду, которая это доказывает.
- Никогда не пишите патч на основе не протестированного изменения. Сначала протестируйте в дереве исходного кода, затем зафиксируйте патч.
- Git управляется человеком. Агент редактирует, собирает и отчитывается. Человек проверяет и делает push.
- Записывайте то, чему научились. Когда агент узнает что-то новое о QNX, он записывает это обратно в навыки, чтобы следующий порт уже обладал этими знаниями.
Последнее правило вызывает у нас наибольший интерес. В принципе, это означает, что система становится лучше с каждым использованием. Посмотрим, насколько хорошо это проявится в масштабе, но первые признаки хорошие.
Реальный порт: cJSON
Чтобы сделать это наглядным, вот порт, который мы выполнили от начала и до конца. Мы направили агента на cJSON, небольшой и широко используемый парсер JSON. Это хороший тестовый пример именно потому, что он небольшой, но не тривиальный: ему нужен настоящий патч исходного кода, а не просто смена флага, поэтому он задействует весь цикл, не погружая нас в гигантский граф зависимостей.
Инструкция заключалась просто в портировании cJSON на QNX. Агент вытащил рецепт Alpine, адаптировал его (включая небольшую замену зависимостей: samurai в Alpine становится ninja на QNX, а также удаление блока кросс-компиляции, который не нужен для нативных сборок) и начал сборку.
Он столкнулся с одной реальной ошибкой. Сборка cJSON принудительно задает стандарт C — -std=c89. В QNX 8.0 системные заголовки используют статические определения inline, требующие C99 или новее, поэтому компиляция с ними в режиме C89 завершается ошибкой внутри самих заголовков QNX. Агент диагностировал это, и исправление получилось максимально чистым для патча:
Код самого cJSON совместим с C89 и отлично компилируется в режиме C99, поэтому повышение стандарта в соответствии с заголовками целевой системы — это правильное и минимальное изменение. Одна обнаруженная ошибка, одна целевая строка.
Затем была выполнена валидация, и вот что имеет значение:
Получился логичный набор из трех пакетов: динамическая библиотека времени выполнения, пакет -dev с заголовочными файлами и файлами CMake/pkg-config, а также статический архив -static.
Доказательство того, что это действительно работает
Успешная сборка и набор тестов — это здорово, но cJSON — это библиотека, а не программа, которую можно просто запустить. Поэтому агент сделал еще одну вещь, которая нам очень нравится: он написал небольшую программу на C, которая компонуется с установленным пакетом и тестирует его в реальных условиях: создает объект JSON, выводит его, обратно парсит текст JSON, проверяет типы полей, перебирает массив и освобождает все ресурсы.
В этом разница между «оно скомпилировалось» и «пакет, который вы действительно установили, работает с реальной программой-потребителем». Агент дошел до этого шага самостоятельно, и это тот момент, когда порт переходит из разряда правдоподобных в доказанные: чистая сборка, полный набор пройденных тестов и реальная программа, использующая установленную библиотеку на QNX.
Где по-прежнему нужен человек
Мы не запускаем ничего из этого без присмотра, и мы этого не хотим.
Агент останавливается на границе Git. Он выполняет портирование, сборку, тестирование и пишет структурированный отчет о том, что именно он изменил и почему, но он никогда не делает commit и никогда не делает push. Человек проверяет diff, отчет и результаты тестов, а затем принимает решение. Для cJSON эта проверка происходит быстро, поскольку изменение представляет собой одну строку с четким обоснованием и проходящим набором тестов. Для более сложного пакета человек взвешивает, является ли обходное решение надежным или отключенный тест что-то скрывает. В любом случае, решение о релизе остается за человеком.
Эта граница установлена намеренно. Агент быстр, неутомим и, при наличии правильных знаний, действительно хорош в механической основе портирования. Но вопрос «должно ли это попасть в дерево исходного кода?» — это решение человека, и сохранение такого порядка делает опору на эту скорость безопасной.
Ранние дни, многообещающие знаки
Мы хотим смотреть на вещи трезво: кодирование наших навыков портирования в виде понятных для агента инструкций — это новшество, и мы все еще учимся тому, в чем он хорош, а в чем у него есть недостатки. Но структуру результатов на данный момент трудно игнорировать. Повторяющийся, конкретный и тестируемый характер портирования действительно отлично сочетается с тем, что эти агенты делают хорошо, а нативный QNX Developer Desktop превращает весь этот процесс в нечто, за чем можно наблюдать и чему можно доверять.
Самое захватывающее — это вовсе не какой-то отдельный порт. Самое главное — это то, что знания перестают испаряться. Каждый пакет, который раскрывает что-то новое о том, чем QNX отличается от Linux, делает систему немного умнее для следующего пакета и следующего инженера.
Навыки доступны на GitHub и готовы к добавлению в проект: клонируйте их, укажите путь к вашему QNX Developer Desktop (образ QEMU или Raspberry Pi) и поручите агенту перенести пакет. Нам будет очень интересно узнать, что вы создадите с их помощью и чему научите агента в процессе.
- Присоединяйтесь к нашему сообществу в Discord
- Reddit: r/qnx






