Как стать автором
Обновить

TDDx2, BDD, DDD, FDD, MDD и PDD, или все, что вы хотите узнать о Driven Development

Время на прочтение13 мин
Количество просмотров126K
Всего голосов 49: ↑48 и ↓1+47
Комментарии65

Комментарии 65

Имея (прим. given — данное) какой-то контекст,

В голову приходит пара выражений из школьно-институтского описания вводной ситуации в задаче/теореме — «Дано» и «Положим».

FDD это вообще не разработка, это привод гибких дисков!
(/сарказм)

FDD также Frequency-division Duplexing — дуплексирование с частотным разделением.

Угу, а MDD — это major depressive disorder.

Расстроенный депрессивный майор?

Не хватает CDD как быстрого средства прототипирования8)
НЛО прилетело и опубликовало эту надпись здесь
Не знаю, оно почему-то описывается как шуточный метод. Однако я так совсем не считаю. Если я хочу собрать полку из досок, я сначала делаю замеры и разметку карандашом. В программировании все сразу начинают пилить. Делать наборосок с помощью комментариев помогает мне вообще понять, что где будет находиться. Вырисовывается структура. Чаще такой подход я применяю при прототипировании алгоритмов. Можно в словах описать сам рецепт, а потом написать по нему код. Может это только новички так делают. Опытные программисты наверное планируют в голове, а не «на бумаге».
Но тогда таким программистам и тесты не нужны, и все прочие методологии, они сразу пишут готовое приложение, а архитектура у них рождается «на кончике пера».
CDD это шутка, в которой есть доля правды:) Согласен про алгоритмы — бывает удобно сначала накидать комментарии, чтобы оценить будет ли все правильно работать в итоге. Еще один жизненный вариант, как раз приведенный в wiki — записать то, что планируется реализовать в заглушке для интерфейса. В целом, это можно рассматривать как часть вполне серьезного подхода — «proof of concept».
Да, есть подобный метод для создания минимально жизнеспособного продукта (minimum viable product, MVP). Получается своего рода прототип приложения с минимальной функциональностью. В таком продукте заказчики могут изменить все что угодно, поэтому код должен писаться быстро и модульно.

На картинке тем временем некий TTD вместо TDD

BDD — это очередной велосипедный язык программирования, читать код на котором точно так же никто хочет. Большинство языков программиорвания используют ключевые слова естественного языка и мимикрирует под него грамматически. Но чем более язык формален, тем меньше с ним хотят сталкиваться не программисты.

НЛО прилетело и опубликовало эту надпись здесь

Не понял о чём вы.

Не могу согласиться с вами, поскольку BDD вовсе не язык программирования. Это методология. Поэтому ваш аргумент не уместен.

Это методология создания и поддержки языка программирования.

Нет. Это методология, т. е. подход к разработке. Так же как и TDD не является подходом к созданию языка программирования, так и ваше определение BDD неверно.
Вы вероятно имеете в виду Gherkin. Но это частный случай, и ваша критика, таким образом относится к конкретной реализации, и не стоит её эстраполировать на всю концепцию, ведь теоретически реализации могут быть любыми, более или менее формальным, с разной долей эвристики, и какие угодно.
Ваш изначальный аргумент, я признаться до конца не понял, могли бы его развернуть в примерах?

BDD неудобен хотя бы тем, что требует привлечения специалистов тестирования уже на этапе проработки требований, а это удлиняет цикл разработки.
Привлечение тестировщиков на стадии проработки требований удлиняет цикл разработки только в одном случае — когда этапа тестирования нет. В любом другом варианте чем раньше вы привлечете специалистов по тестированию, тем проще и быстрее будет проходить разработка и последующее тестирование проекта.
BDD дорог и неудобен исключительно тем, что его нужно поддерживать — переводить тесты с естественного языка в код. Это очень не слабый оверхед и выгодно это только в случае когда сценарии пишет заметное количество менеджеров. BDD — это инструмент кооперации который позволяет добавить в цикл разработки менеджеров и аналитиков если им больше нечем заняться. Обычно же после первого восхищения у всех этих людей находится уйма дел которые нужно делать еще вчера и никаких тестов вы от них не дождетесь.

Вы правда думаете, что значительно количество менеджером смогут написать непротиворечивые сценарии? С этим и программисты-то не всегда справляются даже водиночку.

А при чем тут что я думаю про их возможности? Я описывал ограничения применения инструмента. Если у вас нет большого количества людей которые пишут тесты, но не умеют программировать, то вам BDD не нужен. Он будет потреблять больше ресурсов чем приносить.
Нет, на самом деле есть еще один кейс когда BDD может пригодиться: он может упрощать задачу отдела продаж добавляя еще одно умное слово к заклинанию которым продажники будут зачаровывать клиентов. Но в таком варианте BDD совершенно необязательно поддерживать и развивать, его достаточно просто иметь где-то в уголке и сдувать с него пыль раз в месяц.
НЛО прилетело и опубликовало эту надпись здесь
большого количества людей которые пишут тесты, но не умеют программировать

написание тестов — это и есть программирование.

BDD дорог и неудобен исключительно тем, что его нужно поддерживать — переводить тесты с естественного языка в код.

Мне всегда казалось, что BDD удобен как-раз тем, что заставляет сначала более-менее человеческим языком описать сценарий, а код теста получается уже как следствие редактирования сценария программистом. И что важно — до программирования кода реализации.

Вот в более-менее основной затык. Слишком менее, чтобы бизнес его писал, и слишком более, чтобы его писали программисты.

Да, ну из моего опыта — если нет чувства "балансирования" — скорее всего — ты и не двигаешься, а стоишь, приперевшись к стенке ;)

НЛО прилетело и опубликовало эту надпись здесь

По поводу первого — соглашусь полностью. Ключевое, кстати — отсутствие слова "должен" и наличие слова "удобен".


По второму пункту — я, видимо, не верю в методики как в единственно правильные алгоритмы поведения, дающие гарантированный результат. Я, даже в инструктаже компьютера не верю в единственный универсальный алгоритм, что уж говорить о сообществах.


Для меня BDD — одна из удобных эвристик, ценность которой не самодостаточна, но может быть очень высокой в каком-то конкретном случае.
Т.е. если прописанный программистом по такой схеме сценарий (или несколько) поможет бизнесу увидеть свои же требования в более чистом и понятном виде — уже хорошо. Есть шанс найти общий язык.
Если получится договориться и пере(на)писать большую часть важных моментов в таком виде — отлично! Тем более, что, как бонус, программист, отредактировав и вернув требования на согласование взаимного понимания с заказчиком, фактически уже написал и код для проверки этих требований.


Так что и со вторым пунктом соглашусь, но замечу, что "договоренности" для людей, а не люди для договоренностей.

Так я оказывается по PDD работаю последние 3 года… Вот это открытие!

Я год работал в компании, которая за 5 лет своего существования по технологии PDD выпустила несколько неплохих, но к сожалению, локальных продуктов. Реальность правда взяла своё и после ухода самого крупного заказчика, компания не смогла остаться на плаву и пару лет назад закрылась. Отчасти и потому, что PDD привело в какой-то момент к срыву сроков на полгода.

Очень редко укладываемся в сроки ) Это прям масштабное событие, которое можно отмечать =D
Мне нравится другая модель — Fun Driven Developmant, это когда вы всей командой кайфуете от новых фич, когда баги такие что штырит их раскопать, задачи такие что на первый взгляд кажется что это невозможно, зато потом когда это работает прям шик. Уже 10 лет так, за небольшими скучными периодами исключениями. Геймдев. Правда при этом я перестал играть в игры, как свои так и чужие.
Fun это круто

Есть ещё другая интерпретация — fu**up driven development.

Наши разработчики подсказали еще CDD — Crunch-Driven Development

Основные постулаты:
Инкостыляция — сокрытие смысла костылей путем неоставления комментариев. Если любой разработчик может изменить твой костыль — это небезопасно и вы должны всеми способами этого избегать.


Наследование костылей — здесь всё ясно. Если вы до сих пор не выделили костыли в иерархию и не написали своей библиотеки костылей — вы ничего не знаете про CDD.


Поликостылизм — принцип написания костылей, которые выглядят одинаково, но решают разные проблемы. Идеальный костыль, который можно скопировать в другое место и он исправит другую проблему.

Costyl Driven Development

А как же SDD StackOverflow-Driver-Development?


TDD — Type Driven Development

Можно TypeDD. Т.е. все, кто пишет на языках со строгой статической типизацией, уже ее используют?

Нет. Если начинаете писать исполняемый код, пока не опишите все типы, то не используете.

НЛО прилетело и опубликовало эту надпись здесь

Но писать-то его все равно надо.

НЛО прилетело и опубликовало эту надпись здесь

Ъ TDD — это, в смысле, труЪ TDD?

НЛО прилетело и опубликовало эту надпись здесь
Нужно большое внимание уделять типам и стараться делать их наиболее точными, тогда вероятность что ваша программа споткнется о них выше. А если что то под тип не подошло значит программа работает не так как следует.
НЛО прилетело и опубликовало эту надпись здесь

На качестве продукта отражается наличие сеттеров в принципе. :) Шутка с долей шутки :(

потому что все равно нужно покрывать юнит-тестами то, что обычно не надо покрывать, например сеттеры.

Мне кажется из TDD этого не следует. Т.е. сеттеры обычно покрываются в любом случае но не специально предназначенными для этого тестами. Что с TDD что без него.

Вам не кажется. В нормальных книгах по TDD, в том числе в книгах от его создателей, всегда пишется что не нужно писать тесты на вообще весь код. Тесты пишутся перед кодом, но только перед тем, для которого они нужны. Если у вас обычный сеттер без логики — вы пишете сеттер безо всяких тестов. И даже если в будущем вам понадобится такой код отрефакторить, то по TDD вам всего лишь нужно будет написать тесты перед рефакторингом, нет необходимости иметь тесты изначально если они не были нужны. Я даже видел, правда цитату вряд ли смогу найти, что и на код с логикой тесты нужны далеко не всегда, но тут граница конечно сильно размыта.
Если у вас обычный сеттер без логики — вы пишете сеттер безо всяких тестов.

В моем предcтавлении в классическом TDD не пишут код, пока не упал тест. То есть сеттер я не могу написать без упавшего теста.
Но обычно сеттер нужен не для того, чтобы установить какое-то значение и радоваться этому. А чтобы это как-то повлияло на поведение.


Т.е. я пишу тест "если превышена максимальная глубина стека то выдается эксепшн" а не "если я задаю максимальную глубину стека, то она задана"

Цитату я сходу найти не могу, но то что видел по этой теме я — куча копированных методичек «Тесты всегда, никаких исключений» и цитаты от авторитетных программистов, в том числе создателей собственно TDD о том, что вполне можно написать простой код и без тестов. Суть не в том что без упавшего теста не пишется никакой код, суть в том, что без упавшего теста не пишется только относительно сложный код для которого в принципе тесты нужны. Я не претендую на истину в последней инстанции, но мне такой подход кажется гораздо более разумным и практичным. Но приходится иногда думать нужны ли для этого куска кода тесты и дописывать их если ошибся и решил что не нужны.

С моей точки зрения, если для чего-то не пишутся тесты, то для разработки этого не используется TDD.

Ну это уже философия. Если вы для 3х методов класса тесты пишете, а для 4го, который, например, всего лишь однострочная обертка библиотечной функции — нет, то используете ли вы для разработки TDD? А если вы именно по принципам TDD которые описывают его применимость определили что для этого метода тесты не нужны, то использовали ли вы его для разработки?
На самом деле я не вижу практической пользы от ответов на эти вопросы. И я точно знаю что фанатизм до добра не доводит и нужно понимать где и как применять методики.
Если вы для 3х методов класса тесты пишете, а для 4го, который, например, всего лишь однострочная обертка библиотечной функции — нет, то используете ли вы для разработки TDD?

Да. Если я использовал для гвоздя молоток, а для шурупа отвертку, то я использую молоток.


А если вы именно по принципам TDD которые описывают его применимость определили что для этого метода тесты не нужны, то использовали ли вы его для разработки?

А вот тут я бы хотел ссылочку. Я слышал принцип "Тестировать надо то, что может сломаться". В моем представлении тестировать надо то, тестирование чего окупается (легко тестировать или выигрыш от предотвращения багов и влияния на дизайн большой).

The programmer must not write code that is beyond the functionality that the test checks.

https://en.wikipedia.org/wiki/Test-driven_development#Test-driven_development_cycle п.3


Понятно, что вам бы хотелось цитаты авторов методики, но под рукой нет

Я если и тестирую геттеры/сеттеры то косвенно, при тестировании других фич. Ну типа в тесте на глубину стека пишу сначал $obj->setStackSize(0); $obj->doSomething(); и т.д. ТО есть без сететра код теста просто не запустится, а без нормальной реализации остальные тесты буду падать

не хватает ещё Bug Driven Development wiki
хотя это похоже на PDD.
А про Money Driven Development напишет кто-нибудь? Ведь реально работающий паттерн!

Очень мало разработчиков по нему работает в наших широтах: большинство на окладе и в коммерческой успешности разрабатываемого продукта заинтересованы поскольку постольку.

Может тест, а потом код это и хорошо, но когда заказчик за 3 часа меняет 8 раз все что он себе напридумывал, то как говорил Хой: — Я замучился тесты переделывать!
TDD очень замедляет разработку, скорее всего из-за отсутствия навыков. Имхо, нужно пару лет, чтобы привыкнуть к TDD. Ну это мелочь по сравнению постоянным напряжением, что твоё приложение в любой момент может отказать, например из-за рефакторинга или из-за изменения зависимостей.

Кент Бек в своей книге «скромно» хвалится, что может построить чистую архитектуру на тестах с лёгкостью и достаточно быстро.

В какой из них?

TDD by Example.

А вижу, dpereverza уже ответил (+1 Вам :)
Да это верно. Есть специальные инструменты упрощающие и ускоряющие тестирование. Если не про TDD то можно подобрать подходящие виды тестов. Для фронта, например, юнит тестирование не так важно как интеграционное или E2E.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории