Вы когда-нибудь мержили код, который выглядел идеально, а в проде падал с таинственной ошибкой? В Go и Rust, где конкурентность и безопасность памяти — краеугольные камни, такие баги особенно коварны. Гонки данных, утечки памяти, deadlock'и — они часто не проявляются на тестовых нагрузках, но выстреливают под нагрузкой. Хорошая новость: современные LLM (ChatGPT, Claude) могут стать вашим первым эшелоном обороны, если дать им правильные промты. В этой статье — 15 конкретных, проверенных промтов, которые я использую в своей работе, с примерами и разбором результатов. Это не магия, а инженерия: каждый промт спроектирован так, чтобы выжать из AI максимум пользы.
Почему AI-код-ревью — это не замена, а усилитель
Прежде чем перейти к промтам, давайте расставим точки. AI не заменит опытного ревьюера, но он отлично справляется с рутинным поиском паттернов, которые ведут к багам. По данным исследования GitClear (2024), количество проблем с качеством кода, вызванных AI-ассистентами, растёт, но это скорее аргумент за то, чтобы использовать AI для проверки AI. LLM обучены на огромном количестве открытого кода, включая реальные баги и их исправления, поэтому они могут выявлять проблемные места, которые человек пропустил бы.
Как правильно „скормить“ код AI
Ключ к эффективному промту — контекст. Не просто вставляйте код и спрашивайте „найди баги“. Дайте AI роль, определите цель и ограничения. Используйте технические термины, но добавляйте пояснения. Например, вместо „проверь на гонки“ напишите „ищи data race, когда две горутины обращаются к одной переменной без синхронизации, используя go run -race или sync.Mutex". Такой промт задаёт правильный фокус.
15 промтов для Go и Rust: от гонок до утечек
1. Универсальный разведчик: первичный анализ
Промт:
Ты — эксперт по code review для Go. Проанализируй следующий код. Найди:
- потенциальные гонки данных (data races) и проблемы с конкурентностью
- утечки памяти (например, горутины, которые никогда не завершаются)
- ошибки обработки ошибок (игнорирование, неправильная передача)
- проблемы с производительностью (лишние аллокации, блокировки)
Для каждой проблемы укажи: строку кода, тип проблемы, объяснение и предлагаемое исправление. Если проблем нет, так и скажи.
Код:
[вставьте код]
Пример: Вы вставляете функцию, которая обрабатывает запросы через WaitGroup. AI может указать, что Add(1) вызывается внутри горутины, что может привести к гонке с Wait().
2. Охотник за гонками данных в Go
Промт:
Код на Go ниже использует конкурентность. Используя go run -race (детектор гонок), найди все data races. Объясни, почему каждый из них возникает, и предложи исправление с помощью sync.Mutex, atomic или каналов.
Код:
[вставьте код]
Пример: Код с инкрементом счетчика в нескольких горутинах. AI сразу укажет на отсутствие атомарности и предложит atomic.AddInt64.
3. Специалист по утечкам памяти в Go
Промт:
Проведи анализ кода на Go на предмет утечек памяти. Особое внимание удели:
- бесконечным циклам с select{} без выхода
- горутинам, которые ждут в канале, но никто не отправляет
- отсутствию вызова cancel() для context.WithCancel
- утечкам через глобальные переменные или кэши без ограничения размера
Для каждого найденного места предложи конкретное исправление.
Код:
[вставьте код]
Пример: В коде есть горутина, которая читает из канала, но канал никогда не закрывается. AI предложит использовать context или закрыть канал.
4. Анализ конкурентности в Rust
Промт:
Ты — Rust-разработчик с глубоким знанием конкурентности. Проанализируй этот код на Rust. Ищи:
- гонки данных (невозможны в безопасном Rust, но возможны при использовании unsafe)
- deadlock'и при использовании std::sync::Mutex и RwLock
- проблемы с Send/Sync, которые могут привести к ошибкам компиляции или неопределённому поведению
- утечки памяти через std::mem::forget или циклические ссылки с Rc/RefCell
Предложи исправления.
Код:
[вставьте код]
Пример: Код с Mutex, который блокируется в двух местах с разным порядком, что может привести к deadlock. AI предложит согласовать порядок блокировок.
5. Поиск утечек памяти в Rust (безопасный и unsafe)
Промт:
Найди утечки памяти в этом Rust-коде. Проверь:
- использование Box::leak, mem::forget
- циклические ссылки через Rc<RefCell<T>>
- неправильное управление памятью в unsafe коде (например, ручное освобождение)
Для каждой найденной утечки объясни, как она возникает, и предложи альтернативу (например, Weak, Arc).
Код:
[вставьте код]
Пример: Код создаёт Rc-цикл, который никогда не освобождается. AI предложит использовать Weak для одного из узлов.
6. Проверка безопасности: уязвимости OWASP
Промт:
Проведи security review этого кода на Go. Сверься с OWASP Top 10 (2021). Ищи:
- SQL-инъекции (например, конкатенация строк в запросах)
- XSS (отсутствие экранирования вывода)
- небезопасную обработку ввода (path traversal)
- утечки чувствительных данных в логах
Для каждой уязвимости предложи конкретное исправление (например, использование database/sql с параметрами, html/template).
Код:
[вставьте код]
Пример: В коде есть SQL-запрос, построенный через fmt.Sprintf. AI укажет на инъекцию и предложит использовать параметризованные запросы.
7. Рефакторинг с умом: улучшение читаемости и производительности
Промт:
Предложи рефакторинг этого кода на Go/Rust, чтобы улучшить читаемость и производительность без изменения функциональности. Обрати внимание на:
- избыточные аллокации (например, создание среза в цикле)
- неправильное использование интерфейсов (Go) или трейтов (Rust)
- возможность заменить циклы на итераторы (Rust) или функции высшего порядка (Go, если уместно)
Для каждого изменения объясни причину.
Код:
[вставьте код]
Пример: Код на Go, который строит строку в цикле через +=. AI предложит использовать strings.Builder.
8. Сравнение конкурентных паттернов
Промт:
В этом коде используется паттерн worker pool на Go. Сравни его с альтернативными подходами (например, errgroup, каналы с контекстом). Оцени:
- сложность
- вероятность ошибок (гонки, дедлоки)
- производительность при большом количестве задач
Дай рекомендацию, какой паттерн лучше использовать в продакшене, и покажи пример кода.
Код:
[вставьте код]
Пример: Код с пулом воркеров, который не обрабатывает ошибки. AI предложит errgroup для автоматической отмены.
9. Исправление ошибок компиляции с объяснением
Промт:
Этот код на Rust не компилируется. Объясни ошибки компиляции, которые выводит компилятор, и исправь код. После исправления покажи, как можно улучшить код с использованием идиоматичных конструкций Rust (например, Option::map, Result::?)
Код:
[вставьте код]
Пример: Код, где заимствование конфликтует с перемещением. AI объяснит правила заимствования и покажет правильный вариант.
10. Анализ сложности: поиск O(n^2) и других проблем
Промт:
Проанализируй этот код на Go/Rust на предмет алгоритмической сложности. Найди участки с неоптимальной сложностью (например, вложенные циклы там, где можно использовать map). Предложи оптимизации и оцени изменение сложности.
Код:
[вставьте код]
Пример: Код, который ищет дубликаты в срезе через вложенные циклы. AI предложит использовать map.
11. Генерация тестов для конкурентного кода
Промт:
Сгенерируй unit-тесты для этого кода на Go, которые проверяют корректность при конкурентном доступе. Используй go test -race и t.Parallel(). Для Rust — cargo test с -- --test-threads=... . Тесты должны воспроизводить потенциальные гонки и проверять отсутствие утечек.
Код:
[вставьте код]
Пример: Для функции с мьютексом AI сгенерирует тест, который запускает множество горутин и проверяет итоговое значение.
12. Проверка на идиоматичность (Go и Rust)
Промт:
Оцени идиоматичность этого кода на Go. Укажи на отступления от Effective Go и common practices. Например:
- неправильная обработка ошибок (не через if err != nil)
- излишнее использование интерфейсов
- игнорирование возвращаемых значений
Для Rust: проверь соответствие Rust API Guidelines.
Код:
[вставьте код]
Пример: В Go код использует panic для обработки ошибок. AI предложит возвращать ошибку.
13. Поиск проблем с областью видимости и замыканиями
Промт:
Найди проблемы, связанные с областью видимости переменных и замыканиями в этом коде на Go/Rust. Особое внимание удели:
- захвату переменных цикла в замыканиях (Go: до Go 1.22 это была классическая ошибка)
- случайному изменению внешних переменных
- утечкам через замыкания, которые хранят большие объекты
Предложи исправления.
Код:
[вставьте код]
Пример: В Go до 1.22 цикл с горутинами, которые захватывают переменную цикла, приводит к тому, что все горутины видят последнее значение. AI предложит создать локальную копию.
14. Сравнение Go и Rust для конкурентной задачи
Промт:
Вот задача: [опишите задачу, например, обработка событий с таймаутами]. Напиши решение на Go и Rust. Сравни подходы: управление памятью, обработка ошибок, конкурентность. Выдели, какие ошибки могут возникнуть в каждом языке, и как их избежать.
Пример: AI покажет, что в Go проще использовать goroutine и select, а в Rust — tokio и async/await, и обсудит различия в обработке ошибок.
15. Финальное ревью перед мержем
Промт:
Ты — строгий ревьюер. Этот код готовится к мержу в основную ветку. Проведи финальное ревью с акцентом на:
- безопасность (все вводы валидированы, нет SQL-инъекций)
- конкурентность (нет гонок, дедлоков)
- память (нет утечек)
- производительность (нет очевидных узких мест)
Оцени код по шкале от 1 до 10 и дай вердикт: можно ли мержить, или что нужно исправить.
Код:
[вставьте код]
Пример: AI находит, что не закрывается файл, и предлагает добавить defer.
Как извлечь максимум пользы
Не полагайтесь на один ответ AI. Всегда перепроверяйте его предложения, особенно в unsafe коде Rust. Используйте промты итеративно: сначала общий анализ, потом углублённый по конкретной проблеме. И, конечно, не забывайте про стандартные инструменты: go vet, go test -race, cargo clippy, cargo miri. AI — ваш ассистент, а не замена.
Заключение
Эти 15 промтов — не волшебная таблетка, но они реально экономят часы ручного ревью. В моей практике они ловили гонки в Go, которые не замечали даже опытные разработчики, и утечки в Rust, которые всплыли бы только под нагрузкой. Начните с промта №1 или №15, вставьте свой код и посмотрите, что выдаст AI. Вы удивитесь, насколько глубоким может быть анализ. А если у вас есть свои любимые промты — делитесь в комментариях, давайте соберём базу знаний!
Эта статья написана при поддержке AI-ассистента ASI Biont, который помогает разработчикам автоматизировать рутину и учиться новому.
Комментарии