<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:georss="http://www.georss.org/georss">
<channel>
<title>Код и разработка - Вопросы и ответы про нейросети без магии askmeai.ru</title>
<link>https://askmeai.ru/</link>
<language>ru</language><item>
<title>Ревью кода с приоритетами</title>
<link>https://askmeai.ru/prompts/topics/code/106-revyu-koda-s-prioritetami.html</link>
<pdalink>https://askmeai.ru/prompts/topics/code/106-revyu-koda-s-prioritetami.html</pdalink>
<guid>https://askmeai.ru/prompts/topics/code/106-revyu-koda-s-prioritetami.html</guid>
<pubDate>Wed, 26 Aug 2026 10:28:25 +0300</pubDate>
<category>index</category>

<content:encoded><![CDATA[<h3>Когда использовать</h3><p>Перед коммитом или при разборе чужого кода. Без структуры модель смешивает опечатки с логическими багами.</p><h3>Промт</h3><pre>Проверь код ниже. Язык: [ЯЗЫК]. Что код должен делать: [ОЖИДАЕМОЕ ПОВЕДЕНИЕ]. Окружение: [ВЕРСИЯ, ФРЕЙМВОРК].<br><br>Раздели замечания на три группы:<br>A. Ошибки — код работает неверно. Для каждой: строка, входные данные, при которых ломается, исправление.<br>B. Риски — безопасность, утечки, гонки, необработанные ошибки.<br>C. Читаемость — только там, где меняется смысл; косметику пропусти.<br><br>Не переписывай файл целиком. Если ошибок нет, так и напиши.<br><br>Код:<br>[КОД]</pre><h3>Что подставить</h3><ul><li>ОЖИДАЕМОЕ ПОВЕДЕНИЕ — без него модель угадывает замысел и выдумывает баги.</li><li>Версия языка и фреймворка — иначе получите советы для другой мажорной версии.</li></ul><h3>Пример ответа (фрагмент)</h3><blockquote>A1, строка 42: проверка срока действия токена использует строгое меньше. Токен, истекающий ровно в текущую секунду, считается действительным. Исправление: сравнение с включением границы.</blockquote><h3>Рекомендуемые модели</h3><p>Qwen3 Coder 480B, DeepSeek V3.1, GPT-OSS 120B.</p><h3>Как улучшить</h3><p>Добавьте требование: «пункт A принимается только если ты можешь назвать конкретный вход, ломающий код» — резко падает число выдуманных замечаний.</p>]]></content:encoded>
</item><item>
<title>Объясни чужой код построчно</title>
<link>https://askmeai.ru/prompts/topics/code/107-obyasni-chuzhoy-kod.html</link>
<pdalink>https://askmeai.ru/prompts/topics/code/107-obyasni-chuzhoy-kod.html</pdalink>
<guid>https://askmeai.ru/prompts/topics/code/107-obyasni-chuzhoy-kod.html</guid>
<pubDate>Wed, 26 Aug 2026 10:28:25 +0300</pubDate>
<category>index</category>

<content:encoded><![CDATA[<h3>Когда использовать</h3><p>Достался легаси, чужая библиотека или сниппет со Stack Overflow, который страшно вставлять вслепую.</p><h3>Промт</h3><pre>Объясни код ниже. Мой уровень: [НОВИЧОК / СРЕДНИЙ / ЗНАЮ ЯЗЫК, НЕ ЗНАЮ ФРЕЙМВОРК].<br><br>Порядок:<br>1. Одно предложение: что делает код целиком.<br>2. Разбей на смысловые блоки, по 1–2 предложения на блок.<br>3. Отдельно: строки, где легко ошибиться при правке, и почему.<br>4. Что сломается, если убрать [КОНКРЕТНАЯ СТРОКА].<br>5. Три вопроса, которые стоит задать автору кода.<br><br>Не предлагай улучшений — только объясняй.<br><br>Код:<br>[КОД]</pre><h3>Что подставить</h3><ul><li>Уровень — определяет глубину: новичку нужны основы синтаксиса, среднему — только идиомы фреймворка.</li><li>Пункт 4 — точка, которую вы собираетесь трогать.</li></ul><h3>Пример ответа (фрагмент)</h3><blockquote>Строка 17 выглядит как копия строки 12, но работает с другим индексом массива. При рефакторинге их часто объединяют — и цикл начинает пропускать последний элемент.</blockquote><h3>Рекомендуемые модели</h3><p>Qwen3 Coder 480B, DeepSeek V3.1, Qwen2.5 Coder 32B.</p><h3>Как улучшить</h3><p>Запрет на улучшения принципиален: иначе объяснение подменяется переписыванием, и вы так и не поймёте исходник.</p>]]></content:encoded>
</item><item>
<title>Разбор ошибки по стектрейсу</title>
<link>https://askmeai.ru/prompts/topics/code/108-razbor-oshibki-po-stektreysu.html</link>
<pdalink>https://askmeai.ru/prompts/topics/code/108-razbor-oshibki-po-stektreysu.html</pdalink>
<guid>https://askmeai.ru/prompts/topics/code/108-razbor-oshibki-po-stektreysu.html</guid>
<pubDate>Wed, 26 Aug 2026 10:28:25 +0300</pubDate>
<category>index</category>

<content:encoded><![CDATA[<h3>Когда использовать</h3><p>Есть ошибка и трейс, причина неочевидна. Опасность в том, что модель уверенно называет первую попавшуюся причину.</p><h3>Промт</h3><pre>Помоги найти причину ошибки.<br>Что делал: [ДЕЙСТВИЕ]. Ожидал: [ОЖИДАНИЕ]. Получил: [ФАКТ].<br>Окружение: [ЯЗЫК, ВЕРСИИ, ОС].<br>Последнее изменение перед поломкой: [ЧТО МЕНЯЛ].<br><br>Текст ошибки:<br>[СТЕКТРЕЙС ЦЕЛИКОМ]<br><br>Код вокруг места падения:<br>[КОД]<br><br>Дай 3 гипотезы, отсортированные по вероятности. Для каждой: почему подходит под трейс, какая проверка её подтвердит или опровергнет за одну минуту, как чинить. Не предлагай правку раньше, чем назовёшь проверку.</pre><h3>Что подставить</h3><ul><li>Стектрейс целиком, не только последнюю строку.</li><li>«Что менял» — самый сильный сигнал, чаще всего причина именно там.</li></ul><h3>Пример ответа (фрагмент)</h3><blockquote>Гипотеза 1 (высокая): переменная окружения не подхватилась в новом окружении. Проверка: вывести её значение перед вызовом. Если пусто — причина подтверждена.</blockquote><h3>Рекомендуемые модели</h3><p>DeepSeek R1 (бесплатная), Qwen3 Coder 480B, GPT-OSS 120B.</p><h3>Как улучшить</h3><p>Пока не выполнили проверку — не давайте модели чинить. Иначе получите правку под неверную гипотезу.</p>]]></content:encoded>
</item><item>
<title>Тесты к функции</title>
<link>https://askmeai.ru/prompts/topics/code/109-testy-k-funkcii.html</link>
<pdalink>https://askmeai.ru/prompts/topics/code/109-testy-k-funkcii.html</pdalink>
<guid>https://askmeai.ru/prompts/topics/code/109-testy-k-funkcii.html</guid>
<pubDate>Wed, 26 Aug 2026 10:28:25 +0300</pubDate>
<category>index</category>

<content:encoded><![CDATA[<h3>Когда использовать</h3><p>Нужны тесты к готовой функции. Прямая просьба «напиши тесты» даёт три банальных проверки счастливого пути.</p><h3>Промт</h3><pre>Напиши тесты для функции ниже. Язык: [ЯЗЫК]. Фреймворк тестов: [НАЗВАНИЕ И ВЕРСИЯ].<br>Контракт функции: [ЧТО ПРИНИМАЕТ, ЧТО ВОЗВРАЩАЕТ, ЧТО СЧИТАЕТСЯ ОШИБКОЙ].<br><br>Шаг 1. Перечисли случаи таблицей: обычный вход, границы, пустые значения, некорректные типы, очень большой вход, повторный вызов. Отметь, какие из них сейчас не покрыты.<br>Шаг 2. Напиши тесты только для непокрытых случаев.<br><br>Без моков там, где можно обойтись без них. Названия тестов — на английском, описания — на русском.<br><br>Код:<br>[КОД]</pre><h3>Что подставить</h3><ul><li>Контракт — иначе модель сама решит, что считать ошибкой, и протестирует не то поведение.</li><li>Уже имеющиеся тесты добавьте в промт, чтобы не плодить дубли.</li></ul><h3>Пример ответа (фрагмент)</h3><blockquote>Не покрыто: пустая строка на входе, дата на границе часового пояса, повторный вызов с тем же идентификатором.</blockquote><h3>Рекомендуемые модели</h3><p>Qwen3 Coder 480B, DeepSeek V3.1, Codestral 2508.</p><h3>Как улучшить</h3><p>Таблица случаев полезна и сама по себе: часто по ней видно дыры в самой функции, а не в тестах.</p>]]></content:encoded>
</item><item>
<title>SQL-запрос по описанию задачи</title>
<link>https://askmeai.ru/prompts/topics/code/110-sql-zapros-po-opisaniyu.html</link>
<pdalink>https://askmeai.ru/prompts/topics/code/110-sql-zapros-po-opisaniyu.html</pdalink>
<guid>https://askmeai.ru/prompts/topics/code/110-sql-zapros-po-opisaniyu.html</guid>
<pubDate>Wed, 26 Aug 2026 10:28:25 +0300</pubDate>
<category>index</category>

<content:encoded><![CDATA[<h3>Когда использовать</h3><p>Нужна выборка из нескольких таблиц, а под рукой нет времени вспоминать порядок соединений.</p><h3>Промт</h3><pre>Напиши SQL-запрос. СУБД: [MySQL 8 / PostgreSQL 16 / другая].<br><br>Схема (таблица: колонки, ключи):<br>[СХЕМА]<br><br>Задача: [ЧТО НУЖНО ПОЛУЧИТЬ, ЗА КАКОЙ ПЕРИОД, В КАКОМ РАЗРЕЗЕ].<br>Объём данных: примерно [СТРОК] в главной таблице.<br><br>Верни:<br>1. Запрос.<br>2. Построчное объяснение соединений.<br>3. Предупреждение, где возможно задвоение строк и как его убрать.<br>4. Какие индексы нужны, чтобы запрос не читал таблицу целиком.<br><br>Не используй конструкции, недоступные в указанной версии СУБД.</pre><h3>Что подставить</h3><ul><li>Схема — с типами и ключами; по одним названиям колонок модель угадывает связи неверно.</li><li>Объём данных — влияет на выбор подхода: подзапрос или соединение.</li></ul><h3>Пример ответа (фрагмент)</h3><blockquote>Соединение с таблицей платежей даст задвоение, если у заказа больше одного платежа. Либо агрегируйте платежи заранее, либо считайте сумму через подзапрос.</blockquote><h3>Рекомендуемые модели</h3><p>DeepSeek V3.1, Qwen3 Coder 480B, GLM 4.6.</p><h3>Как улучшить</h3><p>Всегда прогоняйте полученный запрос сначала с ограничением на несколько строк — модель не видит ваших данных.</p>]]></content:encoded>
</item><item>
<title>Промт для ревью кода: находим баги и уязвимости за 30 секунд</title>
<link>https://askmeai.ru/prompts/topics/code/61-promt-revyu-koda.html</link>
<pdalink>https://askmeai.ru/prompts/topics/code/61-promt-revyu-koda.html</pdalink>
<guid>https://askmeai.ru/prompts/topics/code/61-promt-revyu-koda.html</guid>
<pubDate>Tue, 25 Aug 2026 21:20:55 +0300</pubDate>
<category>index</category>

<enclosure url="/uploads/posts/promt-revyu-koda.jpg" type="image/jpeg" />
<content:encoded><![CDATA[<figure class="story-cover"><img src="/uploads/posts/promt-revyu-koda.jpg" alt="Ревью кода с помощью ИИ" width="1600" height="900" loading="lazy"></figure><p>ИИ-ревью полезно ровно в одном сценарии: как первый проход перед человеческим. Он ловит то, на чём взгляд замыливается — необработанный край диапазона, забытую проверку, состояние гонки в очевидном месте. И совершенно не заменяет ревьюера, потому что не знает, зачем этот код написан.</p><p>Главная проблема запроса «проверь код на ошибки» в том, что модель не может сказать «здесь всё в порядке». Она обучена быть полезной, поэтому найдёт что-нибудь: предложит переименовать переменную, добавить типы, разбить функцию. Вы получите список стилистических замечаний и пропустите настоящую ошибку в третьей строке.</p><h2>Промт, который ищет конкретное</h2><pre>Ты — ревьюер. Проверь код ниже. Ищи ТОЛЬКО перечисленные классы проблем. ЧТО ИСКАТЬ: 1. Обращение к данным, которых может не быть: null, пустая коллекция, отсутствующий ключ, необязательное поле. 2. Границы: пустой вход, один элемент, максимальный размер, отрицательное число, ноль. 3. Ресурсы: незакрытые файлы, соединения, транзакции; утечки при исключении. 4. Конкурентность: общее изменяемое состояние, проверка-и-действие без атомарности. 5. Данные извне: отсутствие валидации, конкатенация в запрос, путь из пользовательского ввода. 6. Обработка ошибок: проглоченные исключения, потеря контекста, откат наполовину. ЧЕГО НЕ ДЕЛАТЬ: - Не предлагать переименования, форматирование и стилистику. - Не переписывать работающий код ради красоты. - Не выдумывать поведение вызываемых функций. Если оно неизвестно — так и пиши. ФОРМАТ ОТВЕТА: Для каждой находки: строка, класс проблемы, конкретный сценарий, при котором она проявится, и минимальная правка. Отдельным блоком: «Не могу проверить без контекста» — что именно нужно увидеть. Если по какому-то классу проблем не нашлось — напиши, что не нашлось. КОД: [вставить]</pre><p>Последние два требования делают половину работы. Список «не могу проверить» показывает, где ревью неполно, а разрешение сказать «не нашлось» снимает давление, из-за которого модель выдумывает проблемы.</p><h2>Что дать вместе с кодом</h2><table><tr><th>Контекст</th><th>Что без него теряется</th></tr><tr><td>Сигнатуры вызываемых функций</td><td>Модель придумает их поведение</td></tr><tr><td>Откуда приходят данные</td><td>Не отличит доверенный вход от пользовательского</td></tr><tr><td>Версия языка и библиотек</td><td>Предложит несуществующий или устаревший API</td></tr><tr><td>Что уже проверено выше по стеку</td><td>Потребует дублирующих проверок</td></tr><tr><td>Ожидаемая нагрузка</td><td>Не отличит важное от теоретического</td></tr></table><h2>Про уязвимости отдельно</h2><p>Заголовок статьи обещает поиск уязвимостей за тридцать секунд, и здесь нужна честность: за тридцать секунд находится только очевидное. Инъекции через конкатенацию строк, путь из пользовательского ввода, отключённая проверка сертификата, секрет в коде — это ИИ видит хорошо. Логические дыры в правах доступа, ошибки в бизнес-логике, проблемы, возникающие только в связке нескольких сервисов, он не увидит: у него нет всей системы перед глазами.</p><pre>Проверь код на уязвимости, ограничившись тем, что видно в этом фрагменте. Для каждой находки укажи: как её проэксплуатировать в этом коде, что должно быть верно снаружи, чтобы эксплуатация сработала, и минимальная правка. Не приводи общих рекомендаций по безопасности. Только то, что следует из этих строк. В конце: какие классы уязвимостей по этому фрагменту проверить невозможно.</pre><h2>Как проверять результат ревью</h2><ol><li><strong>Требуйте сценарий.</strong> На каждую находку — конкретные входные данные, при которых сломается. Нет сценария — скорее всего, ложное срабатывание.</li><li><strong>Пишите тест.</strong> Настоящий баг воспроизводится тестом. Если тест написать не получается, находка сомнительна.</li><li><strong>Не принимайте правки пачкой.</strong> Каждая — отдельный коммит с объяснением, иначе через месяц никто не поймёт, зачем это.</li><li><strong>Сверяйте API.</strong> Названия методов и параметров модель путает уверенно.</li></ol><h2>Где это встроить</h2><p>Разумное место — перед тем, как отправлять пул-реквест человеку. Прогоняете свой диф, чините очевидное, и коллега тратит внимание на архитектуру и смысл, а не на забытую проверку на пустой список. Автоматизировать ИИ-ревью в CI и требовать его прохождения не стоит: ложных срабатываний хватит, чтобы команда научилась его игнорировать за неделю.</p>]]></content:encoded>
</item><item>
<title>Генерация SQL-запросов сложной структуры: промт с ER-диаграммой</title>
<link>https://askmeai.ru/prompts/topics/code/62-promt-slozhnye-sql-zaprosy.html</link>
<pdalink>https://askmeai.ru/prompts/topics/code/62-promt-slozhnye-sql-zaprosy.html</pdalink>
<guid>https://askmeai.ru/prompts/topics/code/62-promt-slozhnye-sql-zaprosy.html</guid>
<pubDate>Tue, 25 Aug 2026 21:20:55 +0300</pubDate>
<category>index</category>

<enclosure url="/uploads/posts/promt-slozhnye-sql-zaprosy.jpg" type="image/jpeg" />
<content:encoded><![CDATA[<figure class="story-cover"><img src="/uploads/posts/promt-slozhnye-sql-zaprosy.jpg" alt="Генерация SQL-запросов" width="1600" height="900" loading="lazy"></figure><p>SQL — один из немногих случаев, где ИИ действительно экономит часы. Написать оконную функцию с правильным фреймом или собрать запрос с четырьмя джойнами и агрегацией по нескольким уровням — задача, где легко ошибиться и долго отлаживать. Модель делает это быстро. При одном условии: она должна знать структуру.</p><p>Без схемы происходит предсказуемое: модель придумывает таблицу <code>users</code> с полем <code>created_at</code>, потому что так бывает чаще всего. Запрос выглядит убедительно и не работает.</p><h2>Как передать схему</h2><p>Не описывайте словами. Дайте DDL — это самый компактный и точный способ.</p><pre>Вот структура базы: [вывод SHOW CREATE TABLE для каждой таблицы, или CREATE TABLE из миграций] Дополнительно: - объёмы: [таблица - примерное число строк] - какие поля индексированы: [из DDL видно, но подтверди явно] - СУБД и версия: [PostgreSQL 16 / MySQL 8 / другое] - что означают неочевидные поля: [status = 0 черновик, 1 опубликовано] ЗАДАЧА: [описание нужного результата словами, с примером желаемых строк] ТРЕБОВАНИЯ: - Используй только существующие таблицы и поля. Если чего-то не хватает — скажи, а не придумывай. - Учитывай диалект указанной СУБД. - Объясни выбор типа соединения для каждого JOIN. - Предупреди, если запрос даст дубликаты строк из-за связи «один ко многим».</pre><p>Предупреждение о дубликатах стоит требовать всегда. Это самая частая и самая тихая ошибка в сложных отчётах: суммы удваиваются, а никто не замечает, пока не сойдутся цифры с бухгалтерией.</p><h2>Проверка результата</h2><ol><li><strong>Сначала COUNT.</strong> Запустите с <code>COUNT(*)</code> вместо полей и без агрегации. Если строк больше, чем ожидали, — размножение по джойну.</li><li><strong>Потом LIMIT 20.</strong> Глазами посмотрите на данные. Некорректные джойны видны сразу.</li><li><strong>Потом EXPLAIN.</strong> Полное сканирование большой таблицы или вложенный цикл по миллионам строк — повод переписать.</li><li><strong>Сверьте с известным числом.</strong> Возьмите один день или одного клиента, посчитайте отдельным простым запросом, сравните.</li></ol><h2>Промт для оптимизации</h2><pre>Вот запрос и его план выполнения: ЗАПРОС: [текст] ПЛАН: [вывод EXPLAIN ANALYZE] ОБЪЁМЫ: [строки в задействованных таблицах] СУЩЕСТВУЮЩИЕ ИНДЕКСЫ: [список] Найди узкие места по плану, а не по виду запроса. Для каждого: что именно дорого, почему, и три варианта решения — переписать запрос, добавить индекс, изменить схему. Для предложенного индекса укажи: по каким полям, в каком порядке, почему такой порядок, и чем этот индекс обойдётся при вставках. Не предлагай индексы, которые дублируют существующие по префиксу.</pre><p>Требование опираться на план, а не на внешний вид запроса, отсекает советы уровня «замените подзапрос на JOIN» — они часто не дают ничего, а иногда делают хуже.</p><h2>Что модель делает плохо</h2><ul><li><strong>Путает диалекты.</strong> Синтаксис оконных функций, работа с датами, конкатенация, upsert — везде различия. Указывайте СУБД и версию явно.</li><li><strong>Оценивает производительность на глаз.</strong> Утверждения «этот вариант быстрее» без плана считайте гипотезой.</li><li><strong>Игнорирует NULL.</strong> Классическая ловушка: <code>NOT IN</code> с NULL внутри подзапроса возвращает пустоту. Попросите отдельно проверить поведение при NULL в каждом сравнении.</li><li><strong>Не знает о блокировках.</strong> Запрос, который на тестовой базе летает, на боевой может встать в очередь.</li></ul><h2>Про ER-диаграмму</h2><p>Если схема большая, полезно попросить обратное — не запрос из схемы, а схему из запросов: «по этим двадцати запросам восстанови связи между таблицами и нарисуй их в текстовом виде». Так находятся неявные связи, о которых знали только авторы, и места, где внешние ключи существуют в головах, но не в базе. Это, пожалуй, самый недооценённый способ применить ИИ к чужой базе данных.</p>]]></content:encoded>
</item><item>
<title>Промт для создания REST API на Python с FastAPI и документацией</title>
<link>https://askmeai.ru/prompts/topics/code/63-promt-rest-api-fastapi.html</link>
<pdalink>https://askmeai.ru/prompts/topics/code/63-promt-rest-api-fastapi.html</pdalink>
<guid>https://askmeai.ru/prompts/topics/code/63-promt-rest-api-fastapi.html</guid>
<pubDate>Tue, 25 Aug 2026 21:20:55 +0300</pubDate>
<category>index</category>

<enclosure url="/uploads/posts/promt-rest-api-fastapi.jpg" type="image/jpeg" />
<content:encoded><![CDATA[<figure class="story-cover"><img src="/uploads/posts/promt-rest-api-fastapi.jpg" alt="REST API на FastAPI" width="1600" height="900" loading="lazy"></figure><p>FastAPI — удачный выбор для работы с ИИ: типы в сигнатурах и схемы Pydantic дают модели строгий каркас, в который трудно написать ерунду. Документация при этом генерируется сама, что снимает целый класс задач.</p><p>Но по умолчанию модель выдаёт учебный пример: один эндпоинт, словарь вместо базы, никакой обработки ошибок. Чтобы получить работающий код, каркас надо задать в промте.</p><h2>Промт для ресурса целиком</h2><pre>Ты — backend-разработчик. Напиши CRUD для ресурса [название] на FastAPI. КОНТЕКСТ: Python [версия], FastAPI, SQLAlchemy [версия], PostgreSQL. Аутентификация уже есть, зависимость get_current_user возвращает объект User с полями [перечислить]. МОДЕЛЬ: [поля, типы, обязательность, ограничения] ТРЕБОВАНИЯ: 1. Отдельные схемы Pydantic: Create, Update, Response. В Response не отдавать внутренние поля [перечислить]. 2. Валидация на границе: длины строк, диапазоны чисел, форматы. Ошибка валидации — 422 с указанием поля. 3. Коды ответов явно: 201 на создание, 204 на удаление, 404 если нет, 409 на конфликт уникальности, 403 если чужой объект. 4. Список — с пагинацией через limit/offset, максимум limit = 100, и с общим количеством в ответе. 5. Частичное обновление через PATCH, не подменяя незаданные поля на None. 6. Никаких блокирующих вызовов в async-функциях. Работа с БД — через сессию, переданную зависимостью. 7. Каждый эндпоинт с описанием и примером в docstring — они попадут в OpenAPI. ЧЕГО НЕ ДЕЛАТЬ: - не изобретать структуру проекта, использовать: routers/, schemas/, models/, services/; - не писать бизнес-логику в обработчике маршрута, выносить в сервис; - не ловить голый Exception.</pre><p>Пункт пятый ловит частую ошибку: наивная реализация PATCH затирает поля, которые клиент не присылал. В Pydantic это решается через <code>exclude_unset</code>, и об этом надо попросить прямо.</p><h2>Что попросить следом</h2><table><tr><th>Запрос</th><th>Что получаете</th></tr><tr><td>«Опиши ошибки единым форматом»</td><td>Общий обработчик исключений и предсказуемое тело ошибки</td></tr><tr><td>«Добавь фильтры и сортировку в список»</td><td>Параметры запроса с валидацией допустимых полей сортировки</td></tr><tr><td>«Напиши тесты через TestClient»</td><td>Проверка кодов, валидации и прав доступа</td></tr><tr><td>«Что сломается при 100 запросах в секунду»</td><td>Список узких мест: N+1, отсутствие индексов, синхронные вызовы</td></tr></table><h2>Документация</h2><p>OpenAPI FastAPI собирает сам, но по умолчанию она бедная. Отдельный промт:</p><pre>Дополни эндпоинты метаданными для OpenAPI: summary и description для каждого маршрута, description для каждого поля схем, примеры запроса и ответа через Field(examples=...), описание всех возможных кодов ответа через responses=, теги для группировки маршрутов. Тексты пиши так, чтобы их читал сторонний разработчик, не знакомый с нашей предметной областью.</pre><p>Последняя фраза важна. Без неё описания получаются в стиле «Создаёт объект» — то есть повторяют название метода и не добавляют ничего.</p><h2>Что проверять руками</h2><ul><li><strong>N+1 в списке.</strong> Модель почти всегда забывает про <code>selectinload</code> для связанных объектов.</li><li><strong>Права на чужой объект.</strong> Проверка владельца часто оказывается только в GET и отсутствует в PATCH и DELETE.</li><li><strong>Транзакции.</strong> Где начинается и заканчивается — модель об этом обычно не думает.</li><li><strong>Версии библиотек.</strong> Синтаксис Pydantic и SQLAlchemy заметно менялся между мажорными версиями; несоответствие даёт код, который не запустится.</li></ul><p>И общее правило: сгенерированный эндпоинт — это черновик, который надо прочитать целиком. Он выглядит законченным гораздо раньше, чем становится таковым, и в этом основная ловушка.</p>]]></content:encoded>
</item><item>
<title>Автоматизация тестирования: промт для генерации unit-тестов</title>
<link>https://askmeai.ru/prompts/topics/code/64-promt-generaciya-unit-testov.html</link>
<pdalink>https://askmeai.ru/prompts/topics/code/64-promt-generaciya-unit-testov.html</pdalink>
<guid>https://askmeai.ru/prompts/topics/code/64-promt-generaciya-unit-testov.html</guid>
<pubDate>Tue, 25 Aug 2026 21:20:55 +0300</pubDate>
<category>index</category>

<enclosure url="/uploads/posts/promt-generaciya-unit-testov.jpg" type="image/jpeg" />
<content:encoded><![CDATA[<figure class="story-cover"><img src="/uploads/posts/promt-generaciya-unit-testov.jpg" alt="Генерация unit-тестов" width="1600" height="900" loading="lazy"></figure><p>Есть ловушка, в которую попадают почти все, кто начинает генерировать тесты. Модель смотрит на код и пишет тесты по нему. Получается зеркало: тесты повторяют логику реализации, включая её ошибки, и зелёные всегда. Формально покрытие выросло, фактически защиты нет.</p><p>Лечится сменой источника. Тесты пишутся не по коду, а по <em>ожидаемому поведению</em>. Значит, и в промт надо давать не реализацию, а контракт.</p><h2>Промт по контракту, а не по коду</h2><pre>Ты пишешь тесты. Вот описание функции — реализацию я намеренно не показываю. СИГНАТУРА: [имя, параметры с типами, возвращаемое значение] ЧТО ДЕЛАЕТ: [в двух-трёх фразах, на языке предметной области] ПРЕДУСЛОВИЯ: [что гарантирует вызывающий] ПОСТУСЛОВИЯ: [что гарантирует функция] ОШИБКИ: [какие исключения и когда] Напиши тесты на [pytest / unittest], покрывающие: 1. Обычный случай — 2 теста с разными данными. 2. Границы: пустое, один элемент, максимум, ноль, отрицательное. 3. Некорректный вход: каждый описанный класс ошибок отдельным тестом. 4. Инварианты: что должно оставаться верным при любых входных данных. ПРАВИЛА: - Одна проверка на тест. Имя теста описывает сценарий, а не функцию. - Никаких моков там, где можно обойтись реальными объектами. - Не подстраивай ожидаемые значения под удобство — считай их по описанию. - Отдельно перечисли случаи, которые ты не смог протестировать, и почему.</pre><p>Скрыть реализацию — самый действенный приём во всём этом тексте. Тесты, написанные вслепую по контракту, регулярно вскрывают расхождение между тем, что код делает, и тем, что от него ждали.</p><h2>Проверка самих тестов</h2><p>Тест бесполезен, если проходит и на сломанном коде. Проверяется это просто: сломайте код нарочно.</p><pre>Вот функция и тесты к ней. Предложи 7 мелких изменений в функции, которые её ломают: сдвиг границы на единицу, замена < на <=, перестановка аргументов, пропуск проверки, возврат вместо исключения, неверный порядок операций, отсутствие обработки пустого входа. Для каждого скажи, упадёт ли хоть один тест. Изменения, которые тесты не заметят, — это дыры. Перечисли их отдельно.</pre><p>Это ручная версия мутационного тестирования, и она честнее любого процента покрытия. Покрытие показывает, какие строки выполнились, а не какие ошибки поймаются.</p><h2>Что стоит и не стоит тестировать</h2><table><tr><th>Стоит</th><th>Не стоит</th></tr><tr><td>Логику с ветвлениями и вычислениями</td><td>Геттеры, сеттеры и обёртки в одну строку</td></tr><tr><td>Границы диапазонов и разбор форматов</td><td>Работу сторонней библиотеки</td></tr><tr><td>Обработку ошибок и откаты</td><td>Приватные детали реализации</td></tr><tr><td>Места, где уже находили баги</td><td>Код, который вы завтра удалите</td></tr></table><h2>Отдельный приём: тест из бага</h2><p>Каждый найденный баг — готовое техзадание на тест. Промт короткий и окупается быстрее всех остальных:</p><pre>Вот описание бага: [что сделали, что ожидали, что получилось]. Вот исправление: [диф]. Напиши тест, который падал бы до исправления и проходит после. Тест должен проверять поведение, а не конкретные строки исправления — чтобы он остался осмысленным после рефакторинга.</pre><h2>Чего не надо ждать</h2><ul><li><strong>Интеграционных сценариев.</strong> Модель не знает, как ваши части соединяются в реальности.</li><li><strong>Реалистичных данных.</strong> Она сгенерирует «test@example.com» и «Иван Иванов», а падает всё обычно на данных с пробелами, эмодзи и апострофами в фамилии.</li><li><strong>Понимания, что важно.</strong> Она распределит внимание равномерно по всем функциям, включая те, что никогда не ломались.</li><li><strong>Правильных ожидаемых значений в сложных расчётах.</strong> Их считайте сами: если модель ошиблась в ожидании, тест закрепит ошибку.</li></ul><h2>Разумный режим работы</h2><p>Тесты на новую логику — писать самому, хотя бы каркас: пока формулируешь, что проверять, обычно и находишь дыры в замысле. А вот дополнить набор скучными краевыми случаями, размножить параметризацию, написать тест на найденный баг — тут генерация экономит реальное время и не портит качество.</p>]]></content:encoded>
</item><item>
<title>Промт для рефакторинга легаси-кода: от спагетти до чистой архитектуры</title>
<link>https://askmeai.ru/prompts/topics/code/65-promt-refaktoring-legasi.html</link>
<pdalink>https://askmeai.ru/prompts/topics/code/65-promt-refaktoring-legasi.html</pdalink>
<guid>https://askmeai.ru/prompts/topics/code/65-promt-refaktoring-legasi.html</guid>
<pubDate>Tue, 25 Aug 2026 21:20:55 +0300</pubDate>
<category>index</category>

<enclosure url="/uploads/posts/promt-refaktoring-legasi.jpg" type="image/jpeg" />
<content:encoded><![CDATA[<figure class="story-cover"><img src="/uploads/posts/promt-refaktoring-legasi.jpg" alt="Рефакторинг легаси-кода" width="1600" height="900" loading="lazy"></figure><p>Соблазн понятный: скормить модели тысячестрочный файл и попросить переписать красиво. Результат тоже понятный — красивый код, который делает не то же самое. В легаси всегда есть поведение, о котором никто не помнит, и оно кому-то нужно: обработка кривого формата от старого клиента, обход бага в библиотеке, тихое приведение типов, на которое завязан отчёт.</p><p>Поэтому порядок обратный: сначала зафиксировать текущее поведение, потом менять форму, не трогая смысл.</p><h2>Шаг 1. Понять, что код делает</h2><pre>Вот функция из легаси-проекта. Не предлагай улучшений. Объясни: 1. Что она делает — по шагам, на языке предметной области, а не на языке кода. 2. Какие у неё входы, включая неявные: глобальные переменные, состояние объекта, файлы, окружение, время. 3. Какие побочные эффекты: что она пишет, отправляет, меняет. 4. Какие ветки выглядят как обработка редких, но реальных случаев. 5. Что выглядит мёртвым кодом, и по какому признаку это можно проверить. КОД: [вставить]</pre><p>Пункт про неявные входы обычно даёт неприятный сюрприз: функция, которая по сигнатуре принимает два аргумента, на деле зависит ещё от четырёх вещей.</p><h2>Шаг 2. Характеризующие тесты</h2><p>Это тесты, которые фиксируют поведение <em>как есть</em>, включая странности. Их задача не проверить правильность, а поймать момент, когда рефакторинг что-то изменил.</p><pre>Напиши характеризующие тесты для этой функции. Задача — зафиксировать текущее поведение, даже если оно кажется неправильным. Покрой: типичный вход, каждую ветку условий, каждый ранний выход, поведение при пустом и некорректном входе. Если поведение выглядит как баг — всё равно закрепи его тестом и пометь комментарием «поведение под вопросом». Для неявных зависимостей предложи минимальный способ их подставить, не переписывая функцию.</pre><h2>Шаг 3. Разбор на части</h2><pre>Теперь предложи разбить функцию на части. Условия: - каждый шаг — отдельное, самостоятельно работающее изменение; - после каждого шага код компилируется и тесты проходят; - шаги упорядочены от самого безопасного к самому рискованному; - ни один шаг не меняет поведение. Для каждого шага: что делаем, почему это безопасно, какой тест это подтвердит. Начни с выделения чистых вычислений — без ввода-вывода и без состояния. Отдельно назови изменения, которые нельзя сделать безопасно, и что нужно сделать до них.</pre><p>Требование маленьких шагов — не педантизм. Большой рефакторинг, сломавший поведение, невозможно отладить: непонятно, какое из тридцати изменений виновато.</p><h2>Порядок, который работает</h2><ol><li>Зафиксировать поведение тестами.</li><li>Вынести чистые вычисления в отдельные функции.</li><li>Сделать неявные зависимости явными — передавать параметрами.</li><li>Разделить чтение данных, вычисление и запись.</li><li>Дать осмысленные имена — теперь их видно.</li><li>И только теперь обсуждать архитектуру.</li></ol><p>Пункты 2 и 3 дают больше всего пользы за единицу риска. Часто после них необходимость в «чистой архитектуре» отпадает: код становится читаемым и без неё.</p><h2>Ограничения модели на легаси</h2><table><tr><th>Ограничение</th><th>Следствие</th></tr><tr><td>Видит только переданный фрагмент</td><td>Не знает, кто ещё вызывает эту функцию</td></tr><tr><td>Не знает истории</td><td>Примет обход бага за лишний код</td></tr><tr><td>Не различает мёртвый и редкий код</td><td>Предложит удалить нужное</td></tr><tr><td>Оптимистична к рискам</td><td>Назовёт безопасным то, что таковым не является</td></tr></table><p>Отсюда правило: прежде чем удалять что-либо по совету модели, ищите вызовы по всему проекту сами. И проверяйте логи: ветка, которая срабатывает раз в квартал, в логах видна, а в коде выглядит мёртвой.</p><h2>Когда не рефакторить</h2><p>Если код работает, никто его не трогает и менять там ничего не планируется — оставьте. Рефакторинг оправдан там, где вы собираетесь вносить изменения: он окупается будущими правками. Приводить в порядок код, к которому не вернутся, — трата времени с ненулевым риском что-нибудь сломать.</p>]]></content:encoded>
</item></channel></rss>