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