metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-09-25 12:17 pm

О TDD, ретроградстве и варении в собственном соку

По мотивам предыдущего поста про taucraft: решарпер там или не решарпер, но Test-Driven-Development штука (вроде бы) объективно полезная.

При этом я почти уверен, что я TDD не использую, т.к. уже 15 лет занимаюсь всякой хренью в экстренном темпе, тесты у меня все заключаются в "проверить 10 раз чтобы миграция 30 Гб БД прошла успешно" и "отчетность видна от имени пользователя, который ей будет пользоваться".

Правильность же реализации/рефакторинга/замены всего с нуля проверяется за счет двойной записи бухгалтерии, наличия нескольких путей расчета одной и той же цифры и статических гарантий (т.е., например, я никогда не стану делать отчет отдельными запросами по списку аналитических кодов, если его можно сделать одним select/group by, при этом в него нужная аналитика попадет гарантированно). Плюс функциональщина, статические типы, кодогенерация - ну невозможно ошибится в коде, если у тебя источник информации для кода всегда один. А ошибки вида "не так спроектировали" - тестами не лечатся.

Еще я не использую разного рода современные инструменты, версии студии меняю через 2-3 года после их выхода, склонен использовать самодельные компоненты вместо готовых и вообще страдаю ретроградством.

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

Т.е. та же проблема, что в любых НИИГиТ - сидит 50летний мега-гуру, всю жизнь варившийся в собственном соку, который уже не в состоянии различить, где бессмысленная гонка за новизной или просто неподходящая технология, а где реально нужно отрывать жопу от стула и менять себе мозг.

[identity profile] raydac.livejournal.com 2012-09-25 09:28 am (UTC)(link)
имхо TDD штука хорошая но надо ряд условий
- заказчик знает что хочет
- у заказчика полно бабла
- у заказчика полно времени
- есть разработанная устойчивая архитектура

[identity profile] besm6.livejournal.com 2012-09-25 09:32 am (UTC)(link)
Надо сказать, современные TDD фреймворки как раз замечательно упускают тестирование апгрейда с одного релиза на другой и тестирование ошибок в миграции реальных БД :) Я тут это некоторое время назад в количестве пронаблюдал на рельсах. В общем, разработчик даже пишет тесты. И они даже в 30% случаев тестируют то, что надо (в остальных 70 - то, что получилось, т.е. при смене требований их все надо переписывать). И с завидной регулярностью валится (или хуже того, проходит с неверным результатом) миграция БД. Потому как ORM во время миграции - штука не просто тонкая, а ОЧЕНЬ тонкая, а фреймворка тестов на это никто не придумал.

В общем, доказательство программ порой оказывается не только надежнее, но и дешевле :)

А вот работа в паре (и ряд других техник из баззворда "XP") - штука весьма полезная, но где ж ты себе пару найдешь?

[identity profile] metaclass.livejournal.com 2012-09-25 09:35 am (UTC)(link)
Хм, у меня ни одно из условий не выполнено, за исключением последнего, разве что.

[identity profile] raydac.livejournal.com 2012-09-25 09:38 am (UTC)(link)
тогда лучше и не суйся в TDD, я активно практиковал TDD (и даж семинар посещал с мастер-классом в финке по данному вопросу), но это все было под работодателем который требовал "время неглавное, главное - качество". баблища же у работодателя было тоже много, так что можно было неделю писать тесты и три дня функционал.. в РБ и РФ за такое с какашками съедят

[identity profile] metaclass.livejournal.com 2012-09-25 09:38 am (UTC)(link)
Работа в паре у нас как раз есть, когда над одним проектом работаем, а не над 4 разными сразу :)

[identity profile] blackyblack.livejournal.com 2012-09-25 09:41 am (UTC)(link)
"Правильность же реализации/рефакторинга/замены всего с нуля проверяется за счет двойной записи бухгалтерии"
Очень весело тестировать новую фичу при помощи бухгалтеров.

TDD позволяет делать две важные вещи:
1. Фиксирует требования в виде достаточно простого кода (тестов).
2. Требует программиста переработать архитектуру для тестируемости. Для ФП не так актуально, но тоже достаточно ценно.

Я тоже раньше думал, что раз ФП, то и тесты писать не нужно. Но один раз написал и вскоре обнаружил багу, а дальше рефакторинг попёр как по рельсам. С TDD исчёзает масса отвлекающих факторов: архитектура уже готова для тестирования, следовательно и для добавления новых фич; не нужно думать о связанных системах при курочении кода.

Да, тестируется далеко не всё. Тестируются форматы данных, логика приложения. UI, базы данных, сетевые сервисы фактически не тестируются. И тем не менее, и здесь TDD будет полезен тем, что вытащит всё это говно за пределы логики ПО.

[identity profile] prote-je-moi.livejournal.com 2012-09-25 09:41 am (UTC)(link)
святые угоднікі.

[identity profile] raydac.livejournal.com 2012-09-25 09:43 am (UTC)(link)
p.s.
там же кстати видел людей которые работают по данной схеме уже не первый год и всю жизть считай рабочую провели у энтого работодателя, они отнеслись с недоверием когда я сказал, что вообще то в других местах за TDD и парное программирование вас изнасилуют, колесуют и уволят, так как для работодателя это будет равносильно удвоению себестоимости проекта удвоению его сроков и всю маржу к черту снесут вобщем посреднику и на откатах люди потеряют а они в РФ ого-го, полпроекта считай по деньгам... не.. это антироссийская практика

[identity profile] blackyblack.livejournal.com 2012-09-25 09:44 am (UTC)(link)
В паре с женой нужно работать. И желательно дома, в постели.

[identity profile] metaclass.livejournal.com 2012-09-25 09:47 am (UTC)(link)
1. Фиксирует требования в виде достаточно простого кода (тестов).
2. Требует программиста переработать архитектуру для тестируемости. Для ФП не так актуально, но тоже достаточно ценно.

Эти два пункта есть, TDD нет :)

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

UI тяжело, да. Особенно если глаза замылены и этот интерфейс уже 5 год видишь.

[identity profile] blackyblack.livejournal.com 2012-09-25 09:49 am (UTC)(link)
"2. Требует программиста переработать архитектуру для тестируемости. Для ФП не так актуально, но тоже достаточно ценно."

и

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

Нет ли здесь взаимоисключающих параграфов?

[identity profile] metaclass.livejournal.com 2012-09-25 09:53 am (UTC)(link)
Жена в декрете. А вообще таки да, она у меня работает.

[identity profile] metaclass.livejournal.com 2012-09-25 09:56 am (UTC)(link)
А что здесь взаимоисключающее?
У меня архитектура изначально проектировалась из соображения "должна проверятся из консольной проги в три строчки".

[identity profile] besm6.livejournal.com 2012-09-25 09:56 am (UTC)(link)
Эффективность пары как раз заметнее при работе над несколькими проектами сразу. Если оба работают над всеми. Гораздо быстрее щелкается контекст.

[identity profile] metaclass.livejournal.com 2012-09-25 09:58 am (UTC)(link)
Перевожу на русский:
"как силами одного необученного, но с врожденной грамотностью, журналиста без редакторов, полиграфии и рекламы выпустить одновременно глянцевый журнал, газету для домохозяек и серьезное аналитическое издание и при этом не сойти нахер с ума" :)

[identity profile] besm6.livejournal.com 2012-09-25 09:59 am (UTC)(link)
И кстати, может, я слышу меньше баззвордов, но те, что я слышу - они в основном как раз о технологиях правильной организации труда, а не об инcтрументах. Вопрос, конечно, насколько они действительно эффективны, а насколько - чистый базз...

[identity profile] prote-je-moi.livejournal.com 2012-09-25 10:03 am (UTC)(link)
ох, какая же ты няшечка. хочешь, я тебе помогу?)))я же немного журналист)))

[identity profile] blackyblack.livejournal.com 2012-09-25 10:06 am (UTC)(link)
Если у вас расчёта и логика без БД не пашет, то это непорядок. Как раз пункт про переработку архитектуры. То есть, если мы оставляем работу с фичами БД, то тогда нужно обеспечить возможность оторвать настоящую БД и прикрутить in-memory. Это всё не из любви к искусству делается, а уменьшает связность модулей и в перспективе даёт возможность совсем отвязаться от БД, если производительность не критична.

[identity profile] metaclass.livejournal.com 2012-09-25 10:23 am (UTC)(link)
Не получится. У меня БД - это ядро всей системы, все проектирование начинается с ее схемы. Часть кода находится внутри нее. Некоторые критичные части бизнес-логики основаны на транзакциях БД.

Отвязываться от БД в моем случае - более чем бесполезное занятие.
Возможно, сменить БД на другую, добавив в кодогенератор ее поддержку - ок.
Возможно, некоторые подсистемы, не совсем адекватно ложащиеся на RDBMS (сложные графы+иммутабельность+версионность), придется из нее выселять. Но результатом все равно будет очередной колхоз с функциональщиной для запросов.

[identity profile] blackyblack.livejournal.com 2012-09-25 10:33 am (UTC)(link)
Что и требовалось доказать. Архитектура уже изрядно запоганена, то что называется легаси код. Из соображений производительности люди завязываются на БД, но для свежего проекта так, конечно, делать не стоит.

[identity profile] bydlorus.livejournal.com 2012-09-25 10:42 am (UTC)(link)
А что, в свежих проектах производительность не требуется?

[identity profile] blackyblack.livejournal.com 2012-09-25 10:43 am (UTC)(link)
По умолчанию нет.

[identity profile] bydlorus.livejournal.com 2012-09-25 10:45 am (UTC)(link)
Программисты в собственном соку:

[identity profile] bydlorus.livejournal.com 2012-09-25 10:45 am (UTC)(link)
Это заметно.

[identity profile] jakobz.livejournal.com 2012-09-25 10:52 am (UTC)(link)
Ну, перегибать палку, конечно, не стоит. Я тесты где-то пишу, где-то нет. До или после написания кода - тоже по вкусу. Для меня повод написать тест - это или если видишь что руками проверять будет геморнее, или если есть неиллюзорный шанс что кто-то что-то по непониманию поломает.

Page 1 of 5