bash.im ithappens.me zadolba.li
10776

Тем дальше бежать за трактором

Тем, кто говорит, что может программировать без ошибок, я обычно предлагаю написать программу для решения квадратного уравнения (алгебра, шестой класс) с условием, чтобы программа работала всегда и выдавала адекватный результат.

О проверке дискриминанта вспоминают практически все. О том, что есть комплексные числа, и этот случай надо тоже обрабатывать, — примерно каждый пятый.

О том, что надо обрабатывать вырожденный случай — линейное уравнение, — каждый двадцатый.

О потере точности не вспоминает практически никто. После моих намёков код переписывается и распухает раза в три.

О потере точности в комплексных числах никто сам так и не вспомнил.

Сопроцессор в архитектуре х86 при денормализованном результате может генерировать исключение (ошибку). Народ матерится и начинает устанавливать флаги сопроцессора. После намёка, что такой финт может повлиять на выполнение кода во вложенных вызовах, в соседних потоках и колбэках, матерится и переписывает ещё раз. Потом вопрос: а что будет, если кто-то поменял флаги сопроцессора извне? Потом я задаю вопрос про SSE, ARM, PowerPC, режимы округления 80x87. Прошу оценить погрешность вычислений. Что делать, если погрешность вычислений такова, что влияет на знак дискриминанта? Намекаю, что при большой погрешности надо сменить метод решения… К этому моменту не совсем тупой народ начинает понимать, что сильно попал.

Короче, нормального решения квадратного уравнения я так и не видел. А ведь это чисто математическая задача. Абсолютно чёткое задание с абсолютно полной информацией. Без ошибок в постановке задачи. Без кривого железа. Без перепутанных проводов датчиков. Без неадекватного и паникующего в аварийной обстановке персонала. Без попыток применить программный комплекс для других целей.

Если человек говорит, что пишет программы без ошибок, увольняйте его немедленно. Полное совершенство и всеведение доступно только Аллаху, но он программ не пишет. Для прочих смертных — это верный признак, что человек умеет сваливать ответственность на других, и за ним придётся все переписывать. Чем круче джип, тем дальше бежать за трактором.