Sonic86 писал(а):
Вопрос у меня к бывалым программистам - реально ли взять и все-таки сразу написать код почти весь правильно, без такого занудного тестирования, просто из головы. Или все-таки процесс такого тестирования-исправления неизбежен - все равно на него придется потратить много времени? Я все-таки думаю, что можно.
Наверное, многое зависит от уровня задачи. Если математическая задача имеет элегантный алгоритм, то вполне возможна ее красивая реализация в «один присест»
. Но если брать реальные задачи, хоть по математическому моделированию, хоть производственно-экономического профиля, вывод неизбежен – профессиональное тестирование это неотъемлемая часть жизни программиста, как сон для обычного человека. Поэтому нравиться это или нет, но к тестированию и отладке нужно относиться очень серьезно. Как по мне, «занудное тестирование» имеет в своей основе логическую природу. Если вы кодируете некий алгоритм, то всегда неявно подразумеваете его контекст, в котором он будет выполнятся. Например, обрабатываете содержимое файла. Если он имеет нужную вам информацию в нужном формате, то проблем нет – алгоритм обработки может быть простым. Но! Файл может отсутствовать – естественно, эту ситуацию надо отработать. Файл может быть, но не с тем содержимым. Следовательно, нужно проверять его формат и сигнатуру. Формат может соответствовать, но данные могут быть неверны. Например, вы ожидаете строку оканчивающуюся нулем, а нуля может не быть, а строка может быть «бесконечной». Структура файла (например, *.exe) может быть очень сложна, так что процесс контроля и допустимости значений может занять очень много кода. То же касается и «поведения» алгоритма. Сложный алгоритм сложно тестировать и искать логические ошибки в нем. Если говорить математическим языком, то тестирование (обработка всех принципиально возможных ситуаций, в т.ч. исключительных) это
логическое замыкание алгоритма. По аналогии с замыканием открытых множеств. Причем логическое замыкание должно сопровождаться механизмом вывода в поток (файл, окна сообщений или отладки и т.п.) протокола выполнения программы. Анализируя который, всегда можно найти причину сбоя, в т.ч. логического. Для примера, можно посмотреть реализацию сложного (для понимания) нового алгоритма сортировки (учитывающего естественное частичное упорядочивание, в любом порядке, даже в случайно распределенных последовательностях), в статье
Внешняя сортировка «естественным слиянием». Отладка этого алгоритма заняла много времени, но только используемая система тестирования помогла осуществить ее за обозримое время. Хотя говорить о полном логическом замыкании предложенного алгоритма еще не приходится, тем не менее, это хороший пример.