1. Тесты писать обязательно, лучше вообще TDD.
IMHO это очень практично. Хотя лично я в данный момент отдаю предпочтение BDD и (в идеале) ATDD, но это детали.
Код без тестов некондиционный.
Не совсем так. Может быть, его писал гений и он идеален. А может, он вообще никуда не годится.
Точнее будет сказать: мы
ничего не знаем о коде без тестов. Это как в случае с мартышками, которые развлекаются с клавиатурой: нельзя отрицать возможность, что одна из них напечатала "Войну и мир", но и всерьез рассчитывать на такой вариант тоже не следует.
2. Тесты отнимают много времени.
Это так и есть (недавно смотрел свою личную статистику на этот счет; получилось примерно 2:1, т.е. 2 строки тестового кода на 1 строку продукционного).
Никакого противоречия с первым пунктом здесь нет. Да, тесты действительно отнимают много времени,
и их следует писать. Заливка фундамента тоже требует времени и средств, но это не повод класть кирпичи на голую почву.
Программист высокой квалификации может писать чистый код.
Я давно вывел для себя эмпирическую формулу:
где y - самомнение программиста, x - его реальный уровень. Чем ближе уровень к нулю, тем сильнее самомнение стремится к бесконечности. Мыслители уровня Дейкстры призывают к
смирению, ламеры упиваются своим всемогуществом.
И еще:
чистый код !=
рабочий код. Порой усердие разработчика заставляет работать такой код, рядом с которым выгребная яма покажется чистым родником.
* Человеку свойственно ошибаться.
+
* Нельзя быть уверенным, что чужой код тоже качественный и прозрачный и не сломается от внедрения в него.
+
* Никакая квалификация не защитит от опечатки: один символ в программе может изменить результат кардинально.
+, особенно если язык позволяет подобные синтаксические вольности.
* Проявление ошибки отложено и может вылететь в готовом продукте.
+
* Перекладывание бремени поиска (возможно и исправления) ошибки на других разработчиков.
Это еще не самое страшное, куда хуже, если ошибки находят конечные пользователи. Практика, когда тестируют код и исправляют ошибки специально выделенные люди, существует в некоторых командах; судить о ее достоинствах и недостатках не берусь. Да и текучка кадров может порой к этому вынудить.
А что думаете вы?
Как раз сейчас обсуждаем по переписке эту самую тему (только в отношении встроенных систем) с американскими коллегами, так что голова переполнена думами.
Прежде всего я подразумеваю, что речь идет в основном об
автоматизированных тестах, хотя явно об этом не было сказано. Ручное тестирование крайне трудоемко и подвержено ошибкам; кроме того, оно слишком скучно, поэтому от него будут отлынивать при первой возможности. Хотя ручных тестов нельзя избежать полностью, их нужно свести к самому минимуму. Лишь автоматизированные тесты можно запускать столько раз, сколько потребуется, без ущерба для проекта.
Польза от тестового набора не только в том, что с его помощью можно убедиться в работоспособности проекта в данный момент времени. Добавляя новый код к уже работающему, разработчик не может быть уверен на 100%, что при этом ни одна из прежних функций не нарушится, даже если новая работает успешно (разумеется, за исключением индюков из левой части графика y=1/x, но их вклад в проект все равно минимален). Регулярный перезапуск ранее пройденных тестов (так называемое
регрессионное тестирование) позволяет убедиться, что проект действительно развивается, а не топчется на месте, когда работавшее еще вчера сегодня оказывается неработающим.
Далее, раз уж речь зашла о "чистом коде", его невозможно добиться без рефакторинга. Реально убедиться в том, что рефакторинг не затронул функциональность, можно лишь регрессионным тестированием. Поэтому отсутствие тестов практически неизбежно ведет к "протуханию" кода (поскольку действия по "устранению запахов" рефакторингом затруднены).
Еще один важный аспект тестирования: выяснить, как поведет себя система в необычных условиях. Что будет с вашим сервером после DOS-атаки? Когда на вашу систему поступит сетевой пакет с нарушенной структурой? Когда переполнится SD-карта памяти? Без тестов можно лишь промямлить: "я учел эту возможность в коде" или более честно пожать плечами: "а хрен его знает...".
Когда несколько лет назад у меня появился интерес к программированию микроконтроллеров, именно дефицит инструментов для TDD долго препятствовал этому. В их поиске я обошел многие форумы, в том числе и до Шелека добрался в итоге. К счастью, "процесс пошел".