Как показал опыт - если пользователи сами будут выгребать ошибки, то это будет происходить постоянно.
Нет, только до тех пор, пока они не найдут другого поставщика.
Может поговорим тогда о Test Driven Development?
Далеко не везде применимо. AgileRussia проводили в прошлом году семинар по TDD. Я после него поразмышлял немного и обнаружил (!), что мы-то, оказывается, такой метод уже применяли!
Расскажу чуть подробнее. Чтобы банк получил право обслуживать чиповые карты MasterCard, он должен пройти несколько сертификационных процедур, и одна из них - сертификация софта терминала на специальном тестовом наборе карт. Набор этот в настоящее время включает несколько десятков карт, и в общей сложности проводится несколько сотен тестов. Каждый тест проверяет достаточно узкую функциональность. Набор тестов, как мне представляется, формируется на основе огромного опыта MasterCard по каким-то прецедентам (не путать в вариантами использования
), и постоянно расширяется. То есть, если мы прошли сертификацию в одном банке на определённом наборе тестов, в следующем банке этот набор будет уже немного другим - появятся новые карты, новые тесты, содержимое некоторых старых тестов изменится.
Приведу пример, чтобы было понятнее, о чём речь. В стандарте EMV есть специальный тэг - PAN sequence number, который записывается на карту и не изменяется до конца её жизни. Обычно, когда вы открываете карточный счёт в банке и получаете карточку, значение этого тэга выставляется в 1. Когда срок действия карты заканчивается, вам выпускают новую карту с тем же номером, а значение этого тэга увеличивают на 1. Так в теории. На практике же возможны ещё такие варианты: номер тэга всегда выставлен в 0, либо этот тэг вообще отсутствует (не записан на карту). На самом деле, в реальной жизни вариантов ещё больше (например, значение тэга выставлено в FFFF, что вообще не соответствует спецификации EMV).
Поведение терминала в этих случаях должно различаться - если тэг есть и выставлен в 0, его так и нужно посылать со значением 0. Если тэга нет вообще, то и посылать его не нужно (кажется очевидным, но количество возможных вариаций на эту тему потрясает, из-за чего, видимо, в MasterCard и придумали соответствующие тесты).
Так вот, о TDD. Проходя очередную сертификацию, мы "подгоняли" поведение терминала под критерии прохождения всех тестов MasterCard. То есть занимались практически чистым Test-Driven Development - вместо глубокого и детального изучения спецификаций (а на это в области смарт-карт реально полжизни можно угробить, к тому же они непрерывно изменяются) извлекали "требования" непосредственно из тестов. Отличие только в том, что тесты разрабатывали не мы сами, а получали их от авторитетного источника.
Сертификацию прошли успешно, но выявились следующие проблемы:
- сертификация, пройденная в одном банке, совершенно не гарантирует успешного прохождения сертификации в другом банке - набор тестов будет несколько другим, и опять придётся править приложение "на лету", что, вообще говоря, противоречит сертификационной процедуре;
- кое в чём требования MasterCard не совпадают с требованиями, например, VISA - и приложение, "заточенное" под тесты Master Card, может не пройти визовские тесты (что будет очень неприятным сюрпризом для банка, и ещё более неприятным для нас, особенно если десятки или сотни терминалов уже установлены в точках);
- ну и, как предсказывает TDD, появляется тот самый "вонючий" код, который очень трудно сопровождать. А рефакторинг сертифицированного приложения - это очень и очень муторное занятие (а сертификатами оно обкладывается по полной программе, и при этом каждый сертифицирующий орган свято уверен, что любое изменение в приложении требует его повторной сертификации).