LINUX.ORG.RU

TDDшники, а расскажите про свою религию?

 , ,


4

2

Мя тут немного почитал, немного посмотрел и немного поговнокодил, и что-то не складывается каменный цветок. Выглядит оно это ваше TDD как учебная методика, форсирующая приобретение навыков создания тестируемого дизайна и на своём примере показывающая, насколько больно поддерживать хрупкие тесты, но не как реальный способ разрабатывать сложный функционал.

В целом, вопросные тезисы и тезисные вопросы таковы:

  • С чего начинать? Как выбрать фичу, к написанию теста на которую приступить в первую очередь? Как не попасть в ситуацию «написал приёмочный тест вместо красивого чёткого TDD, ну ты лох», о которой многие упоминают, но не рассказывают, как правильно? Практически все мануалы показывают написание теста сразу для фичи верхнего уровня, что, КМК, приёмочным/дымовым тестом и является.
  • Написание теста для функционала, решение которого нетривиально, вынуждает писать тонны заглушек просто чтобы «скомпилируйся наконец уже пожалуйста». Количество заглушек умножается на количество «baby steps» при рефакторинге и добавлении новых тестов, генерируя адский объём механической работы. Определённо, значительная часть таких затыков порождена моей дизайнерской криворукостью, но мя не вижу способа полностью избежать этого рака.
  • Как TDD предлагает «пробивать» инкапсуляцию, когда функционал под тестом оказывается нетривиальным и требует вынесения части функционала в новую сущность? Многие статьи демонстрируют погрузку болта на внутреннюю сложность реализации, тестируя только контракт, что выглядит очевидно неправильным. Имеет ли концептуально реализация право порождать новый тест? Нужно ли, когда в ходе рефакторинга или позеленевания тестов требуется создать что-то новое, откладывать текущую работу над реализацией и идти писать новый тест для свежеобозначившейся проблемы? Что делать, когда поймёшь, что погряз в огромном объёме некомпилируемого кода и незапускающихся тестов?
  • Некоторые авторы предлагают следующий рекурсивненький жизненный цикл: ставим задачу верхнего уровня, решаем её. Если не удаётся за вменяемое время написать тест/реализацию, дропаем текущие наработки, собираем митап и распиливаем её на подзадачи, далее работаем с ними. Это выглядит минимально-рабочим, но вызывает вопросы: как планировать время на реализацию фичи, как рефакторить функционал более верхнего уровня, если он окажется концептуально неправильным, как избежать лавинообразного рефакторинга с проблемой кучи некомпилируемого кода, чем безумно дорогая по времени перековка какашки в конфетку лучше, классического предварительного планирования с UML и быстрого написания прототипов отдельных штуковин.

TLDR: «под капотом» TDD очень сильно напоминает наивное «не надо ничего планировать, щас что-нибудь в процессе выдумаю», прикрытое сверху идеологией тестирования и горстью баззвордов. При попытке использовать его на не-совсем-тривиальном-проекте, который уже нельзя полностью держать в памяти, количество забытых нереализованных фунций и количество неожиданно всплывающей работы по рефакторингу и реимплементации превышают все мыслимые пределы. Это выглядит полезным для обучения, но не для реальной разработки.

Change my mind, как говорится, если есть желание. Мя ещё не зафиксировал какого-то конечного мнения о сабже, но первые впечатления смешанные.

Ответ на: комментарий от anonymous

И где тут правильное что-либо? Такая задача неправильна, так как правильного алгоритма для неё не существует.

monk ★★★★★
()
Ответ на: комментарий от anonymous

Кстати, обычно задачи все такие :)

Это где так печально? У меня в бухгалтерии существование решения, возможное при помощи десятка человек с ручками и листочками, практически постулируется. Необходимо только его автоматизировать.

monk ★★★★★
()
Ответ на: комментарий от monk

апологет тестирования про неё не вспомнил

Неправильно поставлена задача: на определена операция «сумма», его свойства?

anonymous
()
Ответ на: комментарий от Shadow

Вообще, сначала пишется ТЗ с алгоритмами, и не программистом.

Если на момент начала кодирования есть готовый алгоритм, то зачем по TDD писать вместо него муть (Важно писать код, предназначенный именно для прохождения теста. Не следует добавлять лишней и, соответственно, не тестируемой функциональности.)?

Просто переводим алгоритм с русского на язык программирования. И по TDD будет один тест на один алгоритм.

monk ★★★★★
()
Ответ на: комментарий от anonymous

Так «правильно» или «неправильно»?

Правильность алгоритма в соответствию постановке задачи. Правильность постановки задачи в её непротиворечивости. Правильность электрона не определена. Правильность без объекта не существует.

monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от monk

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

Зачем переводить, есть же русский язык программирования!

anonymous
()
Ответ на: комментарий от anonymous

Зачем переводить, есть же русский язык программирования!

Тоже вариант. Сразу алгоритмы в ТЗ на нём писать и отдельный программист не нужен.

monk ★★★★★
()
Ответ на: комментарий от monk

Тоже вариант. Сразу алгоритмы в ТЗ на нём писать и отдельный программист не нужен.

@monk телепат … /так и будет/ …

anonymous
()
Ответ на: комментарий от monk

Это не про TDD, а про тесты и регрессионное тестирование.

Не вижу противоречия. Я говорю о том, что TDD - это не то, что позволит найти все ошибки в уже имеющейся функции. Далее кратко объясняю почему.

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

Kogrom
()
Ответ на: комментарий от Kogrom

Только я комментировал конкретную ситуацию, в которой Stanson «срезал городского выскочку», соответственно такие рассуждения там были не нужны.

Тогда согласен.

monk ★★★★★
()

TDDшники, а расскажите

Шо тут рассказывать.
Еще не разработаны спецификации к алгоритмам, которые позволили бы проверить правильность логики алгоритма …
Вот и плодят TDD.

Языков спецификаций много, но о них почему-то на ЛОР

ЗАПРЕТ НА ОБСУЖДЕНИЕ? ...
anonymous
()
Ответ на: комментарий от anonymous

Почему умничать, в бухгалтерию - только за зарплатой!

anonymous
()
Ответ на: комментарий от monk

Помечтаю как а-ля Манилов.

В 3188 году на ЛОР появится ветка для разработчиков ...  
А ныне - БАЗАР! ...
anonymous
()
Ответ на: комментарий от anonymous
Ой, цветет TDD в поле у ручья.
TDD молодого полюбила я.
TDD полюбила на свою беду:
Не могу открыться, слова не найду.
anonymous
()
Ответ на: комментарий от alpha

Да. Я на это и намекал, но сходу найти не смог.

monk ★★★★★
()
Ответ на: комментарий от monk

Исходники компилятора будут открыты?
По приведенному примеру не понятно «Это задание или просто такой синтаксис программы?» … Так-то

Молодец!  ...
anonymous
()
Ответ на: комментарий от anonymous

По приведенному примеру не понятно «Это задание или просто такой синтаксис программы?» … Так-то

По вот этому? Это синтаксис. Компилируется в бинарник. Linux/Win/Mac.

Исходники компилятора будут открыты?

Уже: https://github.com/Kalimehtar/russian-lang/tree/master/1
Лицензия MIT.

Базовый компилятор (Racket) также открыт под лицензией MIT/Apache 2.0.

monk ★★★★★
()
Ответ на: комментарий от monk

Шутка

Вот тебе голубчик похвалы тулупчик!

Мой дядя, САМЫХ ЛУЧШИХ ПРАВИЛ, когда внезапно занемог.  
Он @monk уважать заставил.  
И ... /помер/.
anonymous
()
Ответ на: комментарий от monk

То, что по TDD в ответ на тест должен быть написан не правильный алгоритм, а алгоритм проходящий только этот тест.

Это «мягкая» рекомендация, призванная помочь писать тесты, которые лучше покрывают алгоритм. В примерах, как это делается, после нескольких итераций пишется «правильный» алгоритм.

goingUp ★★★★★
()
Ответ на: комментарий от anonymous

То что модераторы посты трут, то просто

ЗАМЕЧАТЕЛЬНО! ...

Все будет с этим форумом ПРОСТО.

anonymous
()
Ответ на: комментарий от monk

Юнит тесты не гарантируют полную корректность (для этого используются другие методы) – это будет так независимо от того следуешь ты TDD или нет.

fulmar_lor
()
Ответ на: комментарий от byko3y

Браво!!! Дополню. И ещё появляется эффект «код ради тестов» или «реализация вторична».

anc ★★★★★
()
Ответ на: комментарий от byko3y

Тестировщик? Кто это? Я никогда в жизни не работал в команде с отдельным тестировщиком.

У нас эту функцию выполнял начальник. Прирожденный тестер, баги находил моментом.

anc ★★★★★
()
Ответ на: комментарий от monk

(пардон, что тут, ту тему закрыли на шкворц)

Ну и такой вопрос, с какого фига понадобилось обращаться по индексу, тем более, по вложенным индексам,

Например в функции умножения матриц

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

anonymous
()
Ответ на: комментарий от Iron_Bug

Короче TDD это заложенные проектированием требования которые потом уже код должен удовлетворить. Типа самопроверочное/интерактивное ТЗ, когда главное это уже описанный функционал, вне зависимости какой для его выполнения будет написан алгоритм. Я так понимаю.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от anonymous

итерируешься по первой и транспонированной второй, профит.

Так для итерирования по массиву всё равно индексы надо.

monk ★★★★★
()
Ответ на: комментарий от anonymous

итерируешься по первой и транспонированной второй

умножение бывает не только скалярное

monk ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

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

тесты кода пишутся ПОСЛЕ кода, а не до. и никакой функционал они не определяют. они просто позволяют поддерживать проект в некотором относительно констистентном состоянии и автоматизировать проверку, хотя и формально. прохождение тестов не доказывает отсутствие ошибок, оно просто означает, что то, что раньше при заданных условиях работало как-то, после внесений изменений работает так же.

Iron_Bug ★★★★★
()

TDDшники, а расскажите про свою религию?

А как можно проект /да даже алгоритм/ покрыть тестами?
Дурак все равно победит …

anonymous
()
Ответ на: комментарий от Iron_Bug

@Iron_Bug, удалось вам найти форум разработчиков?
При этом, чтобы диалоги были пристойными и НЕ ТУПЫМИ?
Проблема в том, что многие не разбираются в том, о чем постят …

anonymous
()
Ответ на: комментарий от anonymous

Шутка /нет печальнее истории чем эта/

Когда я был маленьким, то некоторые дети бросались какашками.  
Прошло время.  
Дети повзрослели и стали поливать друг друга Г...М ...
anonymous
()
Ответ на: комментарий от izzholtik

тебе ещё рано на этот форум

Это да

НЕ ПОВЗРОСЛЕЛ ...   
anonymous
()
Ответ на: комментарий от anonymous

удалось вам найти форум разработчиков?

да я как-то и не искала. нет такой потребности. наверное, у меня просто не бывает вопросов, на которые бы могли ответить на форумах. а писать простыни текста с разными howto я тоже давно перестала: некогда и лень. я лучше буду заниматься программированием.

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

а так, для всякого оффтопа есть Fediverse. там пока не очень стрёмно, потому что массовый юзер туда ещё не добрался. я давно ушла с централизованных ресурсов и сижу на своём сервере, там есть всё мне необходимое.

Iron_Bug ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

это теоретики придумывают всякое ненужно.

есть люди, которые пишут книжки, а есть люди, которые пишут код. так вот, одновременно то и другое практически никто не делает. поэтому если ты хочешь шашечки и красивые теории - это в книжках. а если ты хочешь ехать, то нужно просто садиться и писать код, до полного просветления. со временем нарабатывается опыт и никаких проблем с тем, «как писать», не возникает.

вообще, тесты можно поделить на несколько категорий: тесты, которые пишут сами разработчики (всякие юнит-тесты и прочее), тесты, которые генерятся разными автоматическими приблудами, на предмет всяких там нагрузок и разных значений (всякие mocking тесты и иже с ними), тесты, которые проводят живые люди, на предмет интерфейса, если это требуется, тесты, которые разработчик пишет при планировании, для выяснения разных фич и возможностей разных библиотек, алгоритмов и т.д. так что всё это разные вещи. но никогда тесты не пишутся перед кодом. это какое-то извращение.

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.