Даже обезьяны агенты напишут шедевр, если мы наложим ограничения и напишем тесты
Я тут в последнее время занимаюсь закручиванием гаек подготовкой проектов к SDD. Базовая идея простая - цельнометаллические солдатики Урфин Джюса даже самых мощных моделей штука недетерминированная. Поэтому имеет смысл наложить на них максимум ограничений и проверок. Агент что-то там наковырял -> более умная моделька сделала ревью -> с помощью хуков запустил линтеры -> запустил тесты и так до победного.
Собственно шпаргалкой с такими "ограничениями" для Python/Django-проекта я сегодня и поделюсь.
1. Линтеры и статические анализаторы. По классике беру mypy и ruff. Только суть в том чтобы настроить их максимально строго. За основу можно взять wemake-python-styleguide и дальше подкручивать в зависимости от уровня киберпсихоза.
2. Линтеры и тесты миграций. Миграции эта та штука, которая одним неловким движением спокойно взорвет вам прод. Поэтому обязательно берем django-migration-linter и django-test-migrations. У меня еще есть ряд навайбкоженых самописных линтеров, под определенные кейсы. Вам в целом тоже ничего не мешает сделать свои.
3. Тесты (unit, интеграционные, e2e). Если на вашем проекте тесты никогда не запускались, то время оживлять т.к. именно TDD-флоу хорошо показывает себя в связке с агентами. Тут без откровений - pytest из-за добротных фикстур и плагинов. Ковередж не панацея, но выставить его все-таки стоит.
4. Property-based тесты API. Вместо пяти придуманных разработчиком кейсов мы получаем тысячи комбинаций. И это не просто случайные значения, а сформулированные нами инварианты и свойства. В дивном новом мире подгона тестов агентами это настоящая находка и реальное тестирование. Schemathesis кандидат от народа.
5. Мутационные тесты. Повышаем степень надежности тестов - проверять не просто наличие тестов, а то, насколько хорошо они действительно проверяют код, который написали AI-агенты. Я остановился на mutmut.
6. Линтер импортов между модулями и пакетами. Проверяем, что код соответствует заданной архитектуре, и не допускает появления нежелательных зависимостей, циклических импортов, протекания слоев и т.д. Кажется, лучше import-linter здесь еще ничего не придумали.
7. DI. Самый спорный пункт. В контексте агентской разработки он помогает удерживать архитектуру в порядке, особенно когда AI-агенты генерирует много классов, сервисов и use cases. Для Litestar и FastAPI, я офк рекомендую dishka. Для Django он местами избыточен. Но если уже делаем, то я останавливаюсь на Punq (спасибо Никите Соболеву и Александру Кондратьеву за приглашение в секту).
Линтеры и тесты должны прогоняться как локально агентами с помощью хуков, так и в CI/CD (позаботьтесь заранее об оптимизации, чтобы ваши тесты не шли по 20 минут😅)
Конечно это не все. В дивном новом мире обязательно надо помнить про security-джобы по типу osv, bandit, не игнорировать инфраструктурные литеры (hadolint, tflint). Но это совсем другая история, для отдельного поста.
P.S. Если вам интересно побольше почитать про всякие AI-штуки и держать руку на пульсе, то подписывайтесь на канал нашего друга FastNews. Я сам оттуда черпаю много всякого интересного по нейронным движениям.
Я стремлюсь к тому, чтобы, когда меня настигнет киберпсихоз, я не бросился под первую попавшуюся машину, а заставил город выслать за мной не меньше пяти отрядов МаксТака