Минимальный воспроизводимый пример – это в мире кода то же самое, что показать механику одну дребезжащую деталь вместо того, чтобы пригнать ему всю машину. Вы убираете всё, что не нужно для возникновения проблемы, а затем убеждаетесь, что оставшееся по-прежнему даёт сбой, когда его запускает кто-то другой. Сделайте эти две вещи правильно – минимальный и воспроизводимый – и большинство вопросов решатся сами собой.
Одна и та же идея под четырьмя названиями
Вы встретите эту концепцию под разными аббревиатурами в зависимости от сообщества. Все они означают одно и то же:
- reprex – распространено в мире R и tidyverse (от пакета
reprex). - MCVE – Minimal, Complete, and Verifiable Example (минимальный, полный и проверяемый пример), термин, который популяризировал Stack Overflow.
- MWE – Minimal Working Example (минимальный рабочий пример), активно используется в кругах LaTeX и TeX.
- SSCCE – Short, Self-Contained, Correct (Compilable) Example (короткий, самодостаточный, корректный (компилируемый) пример), давно прижился в сообществе Java.
Если кто-то просит любую из этих вещей, ему нужно одно и то же: кратчайший запускаемый фрагмент, который показывает баг.
До
Мой конвейер данных постоянно падает. Вот все 600 строк моего скрипта. Вчера он работал. Что не так?
Никто не сможет запустить 600 строк, привязанных к данным и учётным данным, которых у него нет. Увидеть сбой невозможно, а значит, и помочь невозможно.
После
Этот скрипт из 12 строк воспроизводит падение на Python 3.12. Он строит DataFrame из 3 строк прямо в коде (без внешнего файла) и выбрасывает
KeyError: 'price'на последней строке. Я ожидал, что он выведет итог. Что я упускаю?import pandas as pd df = pd.DataFrame({"item": ["a", "b", "c"], "cost": [1, 2, 3]}) print(df["price"].sum()) # KeyError here
Теперь любой может вставить его, запустить и увидеть точную ошибку за секунды. Исправление (столбец называется cost, а не price) становится очевидным в тот момент, когда пример можно запустить.
Как его составить
- Начните с чистого листа. Скопируйте сбоящий код в новый, пустой файл.
- Удаляйте всё лишнее, пока удаление ещё одной строки не привело бы к исчезновению ошибки.
- Встройте данные прямо в код. Замените файлы, базы данных и секреты несколькими захардкоженными строками.
- Запустите его сами в чистом окружении, чтобы убедиться, что он по-прежнему сбоит таким же образом.
- Укажите ожидаемое и фактическое поведение и ваши версии.
Когда вы сообщаете о баге, а не задаёте вопрос «как сделать», вставьте свой MRE прямо в шаблон отчёта о баге – поля «Шаги для воспроизведения» и «Окружение» созданы именно для этого.
Полное руководство по техническим вопросам смотрите в нашей статье о том, как задавать хорошие вопросы на Stack Overflow.