-3. Некоторые вещи - РЕАЛЬНО ЖЁСТКО написаны. Не принимайте это лично на свой счёт. Просто "такой стиль".
-2. Тут не БУДЕТ ВООБЩЕ никаких ПРИМЕРОВ кода. Лишь "вода" и "поток
сознания". Если понадобятся примеры кода - буду писать их отдельно.
-1. Наверное понадобятся "разъяснения и дополнения". Я - готов к ним.
0. Буду отвечать "в режиме спринта". Вдохнул - начал писать - закончил
писать - выдохнул. Может быть где-то напишу откровенный бред, но вы его -
корректируйте.
18.12.2013 17:13, Vsevolod Leonov пишет:
Отнеситесь, пожалуйста, с юмором. J
1. Можно в блоге написать что-то вроде "как меня достал Леонов своими
тупыми вопросами о тестах. Как можно не понимать простых вещей?"? Раздуем так сказать "КОНФЛИКТ"?
2. Вот смотрите. Есть "банда четырёх", а мы с вами похоже - "два
придурка". Один придурок не понимает "зачем нужны тесты", а второй
придурок - не понимает - "как можно не понимать "зачем нужны тесты"". В
этом ключе и поведём дальнейший разговор. Ок?
3. Отбросим "формальности" и "интеллигентность" (которой у меня в помине не было). Будем "резать правду-матку". Ок?
Test Driven Development или битый небитого везёт
4. Давайте "сразу определимся". Я НЕ ИСПОЛЬЗУЮ TDD в его классическом
понимании. Как и не использую UML (про который мы уже говорили и
разговор о котором Леонов своей "кармой" прямо скажем "испортил" (не
слишком резко?)).
Так вот! ЕЩЁ РАЗ! Для непонятливых.
Я НЕ ИСПОЛЬЗУЮ TDD в его "классическом понимании".
Чтобы потом не говорили "Люлин не читал википедию" (хотя Люлин её
конечно читал, но она ему - "нафиг не упала") и не "тыкали носом" во
что-то "типа Лармана" (Лармана я кстати - ПЕРЕЧИТАЛ! ОТКРОВЕНИЙ - не
нашёл).
Посему!
Ещё раз! Для СОВСЕМ непонятливых.
Я НЕ ИСПОЛЬЗУЮ TDD. Я использую СИНТЕЗ подхода из TDD и "свои собственные мысли".
Я КРИТИЧЕСКИ ОЦЕНИВАЮ мысли умных людей.
И беру из них "то что помогает работе" и выкидываю "то что работе МЕШАЕТ".
И именно этот "синтез" мы далее по тексту будем понимать под "акронимом" TDD.
Ок?
TDD - это попытка поставить всё с ног на голову. В
классике инженерного дела сначала создаётся установка/техническая
система/машина/агрегат. Конечно, методика испытаний имеется в виду при
проектировании… но всё-так, программисты – это какой-то
особый вид инженеров? Генетически ущербных? Сами себя таким не
считаете?
5. Тут всё зависит от ОПРЕДЕЛЕНИЙ - что "голова", а что "ноги". И как известно - САМЫЙ НАУЧНЫЙ спор это спор о терминах.
6. " Конечно, методика испытаний имеется в виду при проектировании" -
ВОТ ИМЕННО - "МЕТОДИКА ИСПЫТАНИЙ". В софтверной инженерии её к сожалению
- НЕТ (в ПРОМЫШЛЕННЫХ МАСШТАБАХ).
7. "Генетически ущербных?" - ИМЕННО ТАК. "ОНИ" (мы) почему-то решили,
что ЛУЧШЕ ДРУГИХ инженеров, которые например делают велосипеды.
8. " Сами себя таким не считаете?" - СЧИТАЮ. И ИМЕННО поэтому и
стремлюсь ВСЕМИ СИЛАМИ стать "ДРУГИМ". Стать ЛУЧШЕ. Не считать себя
ИСКЛЮЧЕНИЕМ из ОБЩЕЙ инженерии. "Ах блин Я - ТВОРЕЦ". Нифига не ТВОРЕЦ.
Ремесленник! Не более того. И ВСЕ программисты - РЕМЕСЛЕННИКИ (за
исключением ЕДИНИЦ).
И это надо ОСОЗНАТЬ, ПОНЯТЬ и СМИРИТЬСЯ с этим.
И стать ИНЖЕНЕРОМ.
С БОЛЬШОЙ БУКВЫ.
А для этого нужны - "допуски, чертежи, и методика испытаний".
TDD - сковывает инициативу разработчика. Уже не сам
разработчик контролирует процесс, а задание «валится на него снеговыми
комками»? Нет ли психологического дискомфорта? Программист у нас теперь
не творец, а бездумная машина реализации
придуманного не им функционала?
9. НЕТ! Не сковывает! НАОБОРОТ - позволяет "работать больше" :-) Вместо
ОДНОГО класса "приходится" писать ДВА - сам ПРОЕКТНЫЙ класс и ТЕСТ к
нему. TDD это как раз для ИНИЦИАТИВНЫХ людей. Которые ЛЮБЯТ свою работу.
А БЕЗДЕЛЬНИКИ - нам ни к чему. БЕЗДЕЛЬНИКИ - могут дальше не читать.
10. Ещё как КОНТРОЛЛИРУЕТ! Более чем контроллирует. Сам себя "бьёт по рукам". И заставляет "шевелиться серые клеточки".
11. ДИСКОМФОРТА - НЕТ. Наоборот - есть ощущение СТАБИЛЬНОСТИ (привет Путину) и УВЕРЕННОСТИ в завтрашнем дне.
12. НЕТ! Программист - "ТВОРЕЦ". В смысле - ремесленник :-) Он "творит" - в "ДВА РАЗА БОЛЬШЕ". (Лентяев ведь мы скинули со счетов).
На самом деле - хрен два - "В ДВА РАЗА".
На самом деле - МЕНЬШЕ. Почему? Постараюсь объяснить ниже.
TDD - ставит во главу угла не качество реализации, а
сиюминутные фичи. Как можно говорить о качестве кода? Об архитектуре
системы? Мы на выходе с точки зрения программного кода получаем «салат
оливье» - механическую смесь разных на вкус
и цвет мелкопорезанных кусочков? Вы верите, что из винегрета, сложенный
большой кучкой может символизировать собой архитектурное совершенно и
конструктивное качество?
13. БРЕД!!! Именно КАЧЕСТВО и СТАБИЛЬНОСТЬ (ещё привет Путину) ставится во главу угла.
14. Как говорить о "качестве"? ОЧЕНЬ просто - "есть фича" и "есть тест"
проверяющий эту фичу. При таком подходе мы ГАРАНТИРОВАННО получаем
качественную (с точки зрения ТЗ) систему.
Что НЕ ПОПАЛО в ТЗ, то и не попало в тесты. Но это уже - "проблема заказчика".
15. Про архитектуру... Давайте подумаем - "а что есть архитектура"?
Действительно - что есть архитектура? Про UML ведь мы тут говорить не
будем?
Так вот...
Архитектура это не есть "что-то универсальное". И не есть "серебряная пуля".
Я САМ - ХОРОШИЙ АРХИТЕКТОР (к чёрту скромность) и я обладаю УНИКАЛЬНОЙ
АССОЦИАТИВНОЙ ПАМЯТЬЮ (опять же - к чёрту скромность). Коллеги - НЕ
ДАДУТ СОВРАТЬ. Меня "ночью разбуди" - я расскажу - что и где находится -
в каком модуле и не какой СТРОЧКЕ.
Так вот!
При всём при этом даже Я (большая буква - не случайно) - ПОЛНУЮ КАРТИНУ - НИКОГДА не помню.
НИКОГДА!
Архитектура (если не брать UML И "чертежи") - это набор "проектных решений".
Это "калейдоскоп решений и фич". И ТЕСТОВ - "их проверяющих".
Точнее - "матрёшка калейдоскопов".
И все эти калейдоскопы связаны логическими цепочками, которые "можно восстановить в памяти".
Причём тут тесты?
А вот при том - "тесты это ПРИМЕР ИСПОЛЬЗОВАНИЯ конкретного кода и КОНКРЕТНЫХ проектных решений".
Если что-то ЗАБЫВАЮ - мне ДОСТАТОЧНО посмотреть на тест, чтобы это вспомнить.
При этом тесты - БОЛЕЕ стабильны и ИНВАРИАНТНЫ нежели "реальный проектный код". Код перерождается. Эволюционирует. Умирает.
С тестами же это происходит ГОРАЗДО реже.
TDD –
некий бич, которым хлещут непокорных IT-рабов? Это что – некий вид
«управы» на непокорных, гордо именуемых «разработчиками»? Вы,
разрабочтики, не должны думать. Ваша дело – тянуть
лямку, выполнять план по валу! Смотри на тесты, данные тобой свыше, и
не вздумай проявлять инициативу!
16. Значит так... "Руководству", директорату и (тем более) заказчикам - РЕАЛЬНО НАПЛЕВАТЬ - какие технологии используются (за редкими исключениями).
По большому счёту - НИКОГО НЕ ПАРИТ - какие используются технологии и
что там "внутри" делают разработчики. Используют они RUP, TDD/ШмеДД,
Agile/СуперАгиле или что-то иное...
НИКОГО НЕ ПАРИТ!!!
Ещё РАЗ - НИКОГО НЕ ПАРИТ.
Всем выше перечисленным "стейкхолдерам" - ВАЖЕН РЕЗУЛЬТАТ. А не ПРОЦЕСС!!!
"Энтропия"!!! Это функция "состояния", а не "процесса".
Никакой здравомыслящий начальник НЕ БУДЕТ "навязывать" TDD.
Это не В ЕГО ИНТЕРЕСАХ.
Ещё раз!
Это не в ЕГО ИНТЕРЕСАХ.
Ему нужен РЕЗУЛЬТАТ. А не "раздражение разработчиков" типа - "вот этот умник опять какие-то
навомодные фишки нам навязывает".
УМНЫЙ начальник... Ну РЕАЛЬНО УМНЫЙ - может лишь "сделать так", чтобы разработчики "сами" почувствовали, что "им это надо".
Это - ЕДИНСТВЕННЫЙ путь. Иначе - ТУПИК!
17. НЕТУ "тестов данных свыше". Тесты это "ВНУТРЕННЕЕ" дело
разработчиков. И чем лучше тесты и чем их больше, тем разработчики
"крепко спят". И тем меньше они "вызываются на ковёр".
Тесты это не средство "управления".
Тесты это средство "спать спокойно". Для РАЗРАБОТЧИКОВ, а не для "начальников".
ЕЩЁ РАЗ - Тесты это средство "спать спокойно". Для РАЗРАБОТЧИКОВ, а не для "начальников".
TDD –
попытка некомпетентных и далёких от кодирования людей продвигать свою,
чуждую разработчикам идеологию… своё, часто неправильное видение
стратегии развития продукта.
18. ЕЩЁ РАЗ!
Для непонятливых.
Тесты НЕ ДИКТУЕТ "директорат", руководство или заказчики.
Тесты - это СРЕДСТВО РАЗРАБОТКИ.
Тесты это "внутренняя кухня" разработчиков и "группы качества".
Все остальные "стейкхолдеры" оперируют ТЗ. Ну или "экранами". Максимум...
19. Тесты и "стратегия развития" - НИКАК не соотносятся.
Допустим, меня обязали следовать технике TDD, хотя,
согласитесь, очень многие люди комфортно чувствуют себя без этого. Ну и
что это даёт по сравнению с нормальной техникой, когда «запланировали –
реализовали – сделали тесты – протестировали»?
Просто «красивая сказка» для начальника «мы используем передовые
подходы?»
20. ЕЩЁ раз!
"Обязать" использовать тесты - НЕВОЗМОЖНО. Можно лишь только
"уговорить".
21. Если кто-то чувствует себя комфортно БЕЗ тестов, то значит, что:
а. Его проект не такой сложный.
б. Он Всё тестирует на реальных пользователях. (не повезло им)
в. Он гений.
г. Он работает ОДИН.
22. Ещё раз. "Сказки" - НЕТ. "начальству" - ВСЁ РАВНО.
Начальству нужен РЕЗУЛЬТАТ, СРОКИ и КАЧЕСТВО продукта.
Напахал я тестов. Начал под них (скрепя сердце)
подгонять функциональный код. Выясняется… потом, что тест придуман
неправильно. Я поработал впустую?
23. Не НАДО ничего "НАПАХИВАТЬ".
"Алгоритм" - ПРОСТЕЙШИЙ - читаем ТЗ, и реализуем "фичи".
ОДНА "фича" - ОДИН "тест".
И так - ИТЕРАТИВНО.
Фича - порождает фичи, а фичи порождают тесты.
"Матрёшка".
"Калейдоскоп".
XP!!! Если хотите.
KISS-принцип.
А не бывает такого, что «тесты», которые приобрели вид «жёсткого задания», начали противоречить друг-другу?
24. О! Это мой ЛЮБИМЫЙ вопрос! Это "ГЕНИАЛЬНЫЙ" вопрос.
Только
идиот НЕ ПОНИМАЕТ ответа.
Давайте ПОДУМАЕМ!
Что ОЗНАЧАЕТ фраза "тесты начали противоречить друг-друг".
Давайте ВКЛЮЧИМ ИНТЕЛЛЕКТ!
Если тесты "противоречат друг-другу" это означает, что:
а. ТЗ недостаточно ПРОРАБОТАННО.
б. ТЗ ПРОТИВОРЕЧИВО.
Тут надо "сказать СПАСИБО тестам" и ВЕРНУТЬСЯ к проработке ТЗ.
TDD –
потеря времени. Давайте уж сначала напишем код, а потом будем его
тестировать. Любое хождение «задом-наперёд», ненатуральный порядок
разработки, даже если не сказывается на качестве,
обязательно вызовет «тормоза».
25. Хорошо. Давайте напишем код. Напишем. Покоммитим его в CVS/SVN. И что?
Мы свою работу сделали?
Типа "как повезёт"? Прокатит/не прокатит?
Можно и так.
Только потом тебя "поднимут с постели" и спросят "что за хрень ты тут написал?"
Так?
Можно ведь по-другому - "написать код" и "ПРОВЕРИТЬ его". А как мы его будем проверять?
"Тупым" протыкиванием?
А если для "протыкивания" надо сделать 20-ть шагов? А если 100? А если "данных нет"? А если "смежники не готовы"?
Не лень?
Не проще ли "написать тест" хотя бы для отладки?
С придуманными "из головы" входом и выходом.
По-моему - ПРОЩЕ.
А если тест УЖЕ написан и использовался для ОТЛАДКИ, то почему не включить этот тест в "ночную сборку"?
TDD –
способ поставить разработчика в унизительное положение. «Битый небитого
везёт». Программист работает «от чувства вины» в перманентном состоянии
нереализованности поставленной задачи.
26. НАОБОРОТ!
У программиста всегда есть "реперные точки".
Тут вот я написал тест. Он не проходит.
Тут я реализовал функционал.
Тест стал ПРОХОДИТЬ.
Я всё покоммител в CVS/SVN.
Я свою работу СДЕЛАЛ и "могу спать спокойно".
TDD –
нет ли ощущения, что программист всё время решает «обратную задачу»?
Или разработчик – двоечник, подгоняющий решение под ответ задачи?
27. А программисты - ВСЕГДА решают "обратную задачу". Ну или "строят коня в вакууме".
28. Нет - НЕ ДВОЕЧНИК. Просто - "обычный человек". Который НЕ МОЖЕТ
предусмотреть ВСЁ. Но зато то, что он ПРЕДУСМОТРЕЛ - ГАРАНТИРОВАННО
работает.
29. Есть и другие люди. Но они - ГЕНИИ. Их - МАЛО.
TDD – разработка в зазеркалье. Мы выполнили тесты, что не есть гарантия безошибочности. Кто отвечает за качество тестов?
30. Ещё раз!
ТЕСТЫ это не средство "битья по рукам".
ТЕСТЫ это средство - "спать спокойно".
31. ГАРАНТИИ "полной безошибочности" - НЕТ.
Есть лишь гарантия того, что разработчик ПРАВИЛЬНО понял ТЗ и реализовал его так как ПОНЯЛ.
TDD –
телега впереди лошади. Лошадь постоянно тыкается мордой «в задний
бампер», не видя ничего впереди себя. Как можно говорить о продумывании
функционала в целом на уровне архитектуры
системы, когда впереди – вдаль до самого горизонта – просто свалка
потребностей?
32. Вот тут ОПЯТЬ давайте вернёмся к "самому научному спору".
Давайте "ОПРЕДЕЛИМ ТЕРМИНЫ".
Что есть "телега", а что "лошадь".
Если мы почитаем википедию - мы увидим "полный бред".
И я об этом - ПИСАЛ -
http://programmingmindstream.blogspot.ru/2013/11/tdd_28.html
и тут -
http://programmingmindstream.blogspot.ru/2013/11/tdd.html
"Как можно тестировать то ЧЕГО НЕТ"?
Я САМ задавался этим вопросом.
Пока не ПОНЯЛ одной ПРОСТОЙ ИСТИНЫ:
"лошадь" - это ТЗ.
"телега" - это КОД.
А что есть ТЕСТЫ?
Тесты это - "оглобли" которыми "лошадь" привязана к "телеге".
Т.е. - ВЕДЁТ -
ТЗ, а тесты - "тянут за собой" код. И ПРОВЕРЯЮТ его соответствие ТЗ. И то что "код едет в ту же сторону, что и ТЗ".
Нету ни TestFirst! Ни CodeFirst!
НЕТУ!
Для непонятливых - Нету ни TestFirst! Ни CodeFirst!
ЕСТЬ - ТЗ-First!
ВСЁ - "растёт ногами" из ТЗ и ТЕСТЫ и код и АРХИТЕКТУРА.
И ПОТОМ - ArchitecrureFirst!
Т.е. цепочка разработки выглядит так:
ТЗ -> Набросок архитектуры -> Тест -> Код
А дальше возможны все разные варианты:
ТЗ -> Набросок архитектуры -> Тест -> Код -> Тест -> Код
ТЗ -> Набросок архитектуры -> Тест -> Код -> Архитектура -> Тест -> Код
ТЗ -> Набросок архитектуры -> Тест -> Код -> Архитектура
-> Тест -> Код -> ТЗ -> Архитектура -> Тест -> Код
и т.д. и т.п.
First - это - ТЗ и набросок архитектуры - дальше начинается - "итерационная разработка".
И что - особенно ВКУСНО - это то, что как только мы написали тест - нам
НЕ НАДО думать - "а где проверять работоспособность нашего класса".
Мы УЖЕ настроили всю
инфраструктуру для его тестирования и проверки.
ИМЕННО в этом и заключается слово Driven в TDD.
Ладно, есть на свете «извращенцы». Тогда хоть как можно облегчить страдания? Какой правильный процесс при этом?
33. Ну я - "извращенец". И ещё ещё как минимум - 6-ть человек.
34. Процесс я описал выше.
Повторю для "идиотов":
Т.е. цепочка разработки выглядит так:
ТЗ -> Набросок архитектуры -> Тест -> Код
А дальше возможны все разные варианты:
ТЗ -> Набросок архитектуры -> Тест -> Код -> Тест -> Код
ТЗ -> Набросок архитектуры -> Тест -> Код -> Архитектура -> Тест -> Код
ТЗ -> Набросок архитектуры -> Тест -> Код -> Архитектура
-> Тест -> Код -> ТЗ -> Архитектура -> Тест -> Код
А какой инструментарий? Как «впрячь коня (упрямый пони на коротких ножках) и трепетную лань (мысль разработчика)?
35. Значит про "мысль". С РАЗРАБОТЧИКОМ - надо "РАБОТАТЬ". Ходить вместе курить. Поить пивом (шучу). Уговаривать. Развлекать.
Сделать так, чтобы ОН ТЕБЕ ПОВЕРИЛ.
И чтобы считал ТВОИ мысли СВОИМИ (привет Карнеги).
По-другому - НИКАК.
ЗАСТАВИТЬ - НЕЛЬЗЯ.
Как и НЕЛЬЗЯ ЗАСТАВИТЬ "писать хороший код".
Можно подарить человеку книгу Мак-Конела на день Рождения. Но НЕ БОЛЕЕ ТОГО!
НИКАКИЕ АДМИНИСТРАТИВНЫЕ меры - НЕ ПОМОГУТ. Вызовут лишь -
озлобление.
Я это прошёл и НЕ РАЗ.
36. Инструментарий.
а. DUnit.
б. Доработки к DUnit -
http://18delphi.blogspot.ru/2013/03/dunit.html
в. Confluence -
http://ru.wikipedia.org/wiki/Confluence
г. САМОПИСНЫЙ аналог JIRA (
http://ru.wikipedia.org/wiki/Jira). В ту пору JIRA была ещё "сыра" поэтому мы её не взяли. СЕЙЧАС - я думаю - взяли бы её.
д. Скриповая машина -
http://18delphi.blogspot.ru/2013/11/gui.html
е. FishEye (
https://www.atlassian.com/software/fisheye/overview).
ё. Доработки к Confluence и FishEye позволяющие отслеживать связь
коммитов, изменений кода и строящие привязку КОНКРЕТНЫХ изменений кода к
КОНКРЕТНЫМ задачам (если я получу разрешение руководства - опубликуем
скриншоты). Я бы на месте нашего руководства давно бы продавал бы это
как КОММЕРЧЕСКИЙ продукт.
ж. Интеграция UML и Confluence.
В каком виде и кто создает тесты? А если «роль» создателя тестов не предполагает знание программирования?
37. Тесты создают разработчики. Если речь идёт о новой функциональности.
Или тестировщики. Если речь идёт об ошибках.
И ЧАЩЕ всего - тестировщики пишут ошибку и СРАЗУ пишут к ней тест.
Тут кстати надо понимать ОДНУ ПРОСТУЮ вещь - ТЗ и ОШИБКИ в общем-то
ничем НЕ ОТЛИЧАЮТСЯ друг от друга принципиально. Только лишь "зоной
ответственности".
38. "А если «роль» создателя тестов не предполагает знание
программирования?" - на BDD или Fit-таблицы - мы пока не "замахивались",
но мы РАБОТАЕМ над этим.
TDD – это наше «всё» или Вы всё-таки признаёте ограниченность данной техники?
39. "Разруха она в головах, а не в писсуарах".
НЕТУ "ограниченности".
Есть "нежелание применять".
Или "банальная лень".
Ко всем ли системам применима техника TDD? Есть «особые случаи» или «другие подходы»?
40. НЕТ! Нету "особых случаев".
Есть что-то "что можно выкинуть", есть что-то "что можно привнести".
Но в ЦЕЛОМ - TDD - ОСТАЁТСЯ. И ГАРАНТИРУЕТ "спокойный сон".
41. Я писал об этом тут -
http://18delphi.blogspot.ru/2013/03/blog-post.html
И тут -
http://18delphi.blogspot.ru/2013/03/tdd-c.html
Что по-Вашему может быть лучше, чем TDD?
42. BDD ;-) Роман Янковский "над ним работает" :-) Ссылка -
http://roman.yankovsky.me/?p=1258
Ну и Fit-таблицы. Ссылки к сожалению - найти не могу...