The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:
PDD, или Puzzle Driven Development, - это метод, используемый для разбиения программных задач на более мелкие и обеспечения их параллельной реализации. Метод PDD широко используется в методологии XDSD. Этот метод ожидает патента USPTO (заявка № 12/840,306).
Давайте рассмотрим этот метод на примере. Скажем, вы программист и вам поручено разработать и реализовать Java-класс. Вот формальное описание задачи: “класс DBWriter
должен расширять абстрактный класс java.io.Writer
и сохранять все входящие данные в базе данных”.
У вас есть один час на реализацию этой задачи. Вам ясно, что одного часа недостаточно, потому что проблема гораздо больше и требует больше работы, чем позволяет выделенное время. Кроме того, имеется множество неизвестных:
Что такое схема базы данных? Является ли она SQL или NoSQL базой данных?
Как подключиться к БД? JDBC? JPA? DAO?
Как обрабатывать исключения?
Давайте учтем все эти неизвестные, пытаясь решить проблему на самом высоком уровне абстракции. Конечно же, мы начинаем с теста:
В приведенном выше тесте мы определяем ожидаемое поведение класса. Тест не компилируется, потому что отсутствуют два класса: DataBridge
и DBWriter
. Давайте сначала реализуем мост.
Далее - сам писатель:
С использованием вышеприведенного кода мы решаем проблему. В данном примере мы успешно разработали, реализовали и протестировали необходимый класс DBWriter
. Впоследствии, данный класс теперь может быть непосредственно использован “как есть” другими классами.
Конечно, реализация не завершена, так как мы не записываем ничего в базу данных. Кроме того, мы все еще не отвечаем на большинство вопросов, заданных в примере сценария. Например, мы все еще не знаем точно, как нужно подключаться к базе данных, ее тип (SQL или NoSQL), правильный формат данных и так далее. Однако мы уже сделали ряд важных архитектурных предположений, которые позволили нам реализовать класс и сделать его используемым другими классами.
Теперь пришло время идентифицировать неизвестные моменты в нашем коде и пометить их головоломками. Каждая головоломка - это запрос на уточнение. Мы хотим попросить кого-то другого помочь нам уточнить и исправить наши предположения. Вот первая головоломка, которую нам нужно добавить:
Головоломка состоит из трех элементов: метки @todo
, локатора #123
и комментария. Локатор отображает следующее: “Головоломка была создана при работе с тикетом #123.”
Добавим еще одну головоломку:
Эта головоломка указывает на одну из наших забот, потому что мы не уверены, что архитектурное решение правильное. На самом деле, дизайн в данный момент очень примитивный и, скорее всего, неправильный. Чтобы его усовершенствовать и переработать, нам требуется больше информации от определителя задачи.
Задача завершена. Теперь вы можете интегрировать свою ветку в master
и вернуть тикет тому, кто его вам назначил. Его задача сейчас - найти других людей, которые смогут решить головоломки, которые мы только что создали.
Каждая созданная сейчас головоломка будет порождать другие головоломки, которые будут решаться другими людьми. В результате наша простая задача на час может потенциально породить сотни других задач, которые могут занять дни или даже годы для выполнения. Тем не менее, вашей целью при работе с вашей конкретной задачей является ее как можно скорее завершить и интегрировать свою ветку в master
.
Есть несколько простых правил, которые помогают правильно размещать головоломки.
Во-первых, вы должны размещать свои аннотации @todo
в том месте, где ваш код сталкивается с заглушкой. Например, в модульном тесте. Вы реализуете тест, и он не проходит, потому что класс еще не реализован. Вы пропускаете тест с помощью аннотации @Ignore
и добавляете головоломку @todo
в его JavaDoc.
Во-вторых, ваша головоломка должна оставаться как можно ближе к элементу кода, который сталкивается с заглушкой. Предположим, у вас есть модульный тест с тремя методами тестирования. Все они сейчас не проходят, потому что класс не реализован. Лучшим подходом будет проигнорировать каждый из них и создать три (!) головоломки. Каждая из головоломок должна объяснить, что вы ожидаете от класса и как его следует реализовать.
В-третьих, старайтесь быть максимально описательным. Ваша головоломка вскоре станет задачей для кого-то другого. Поэтому четко объясните, что вы ожидаете от следующего исполнителя, как это сделать, какую документацию использовать и так далее. Должно быть достаточно информации, чтобы следующий исполнитель, назначенный на головоломки, мог реализовать требуемые классы без дополнительной информации от вас!
Кстати, процесс сбора головоломок может быть автоматизирован с помощью нашего PDD Ruby-дополнения и хостингового сервиса 0pdd.com.
Translated by ChatGPT gpt-3.5-turbo/42 on 2023-12-17 at 15:50