В тот момент это казалось отличной идеей. Каждый раз, когда в пакетной программе происходила критическая ошибка, на терминал оператору отправлялось уведомление, в котором ему предлагалось завершить программу. Затем оператор должен был связаться с кем-то из техподдержки (обычно программистом) и спросить у него, что делать дальше. Руководство, не мудрствуя лукаво решило, что заднее слово должно быть за кем-то понимающим суть функционирования программы, а не просто за каким-то там оператором.

Прошли годы, и руководство усвоило три основных урока, ставших плодами применения этой политики. Во-первых, техподдержка всегда отвечала: «Это фатальная ошибка! Да и что я, по-твоему, могу сделать из дома в два часа ночи? Просто глуши ее!». Во-вторых, за годы разработки пакетных программ их скопилось достаточно много (примерно 20000), поэтому от ночных звонков программисты страдали массово. В-третьих, так как из-за отправленного оператору запроса выполнение программы блокировалось, последующие программы ожидали, пока оператор достучится до ответственного программиста, который благоразумно отключил на ночь телефон, чтобы избежать звонков. Очевидно, надо было что-то делать.

Бо Кристенсену и его команде кудесников COBOL-а было поручено пересмотреть код обработки ошибок и предложить способ завершать программу автоматически с занесением соответствующей записи в журнал работы программы. Стандартный код обработки ошибок выглядел так...

IF (ошибка)
      DISPLAY 'В ПРОГРАММЕ GLV2030C ПРОИЗОШЛА ФАТАЛЬНАЯ ОШИБКА, ПРЕКРАТИТЕ ВЫПОЛНЕНИЕ ЗАДАНИЯ' UPON CONSOLE
END-IF.

Все что надо было сделать, это заставить код выполнять грубое прерывание работы программы (ABEND - ABnormal END (Аварийное завершение). Поэтому код заменили на что-то такое...

IF (ошибка)
     DISPLAY 'В ПРОГРАММЕ GLV2030C ПРОИЗОШЛА ФАТАЛЬНАЯ ОШИБКА, ВЫПОЛНЕНИЕ ЗАДАНИЯ ПРЕКРАЩЕНО'
     CALL 'ABENDMOD'
END-IF.

Разумеется, из второго урока, а именно, подобный код обработки ошибок содержится примерно в 20000 пакетных программ, следовало, что замена будет масштабной. Так как у местных программистов и без того хватало «настоящей работы», они просто не могли этим заниматься. Поэтому им в голову пришла еще одна светлая мысль, и они нашли контрактника.

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

Реджи не был опытным программистом, впрочем, он и не старался им показаться. Однако он был технически подкован, хорошо следовал указаниям и был готов заниматься самой утомительной работой. После того как ему показали несколько примеров, он решил, что готов справиться со всем остальным самостоятельно. За прошедшие месяцы Реджи прошелся по всем программам и исправил все фрагменты кода, в которых обрабатывались ошибки. За десятки тысяч изменений он ни разу не пожаловался, а рука его, ни разу не дрогнула, став виной опечатки. Настоящая машина.

После того как измененный код поступил в эксплуатацию, программисты начали надеяться, что время ночных звонков прошло. Однако затишье длилось всего неделю: посреди ночи задание выдало ошибку. Это был простой сбой, программа исчерпала весь объем рабочего файла, поэтому оператор увечил его размер и перезапустил задание. Обычная рабочая процедура.

А затем она снова выдала ошибку. Ее перезапустили. Ошибка. Перезапуск. Ошибка. Перезапуск. Ошибка. В конце концов, в два часа ночи был разбужен программист, получивший указание срочно явиться, обнаружить источник проблемы и исправить ее. Всего за несколько минут он выяснил, что было не так...

IF (условие перезапуска)
     DISPLAY 'ЭТО ПЕРЕЗАПУСК ЗАДАНИЯ, ТРЕБУЕТСЯ ПОДТВЕРЖДЕНИЕ'
     CALL 'ABENDMOD'
END-IF.

Код был недавно исправлен не кем иным как Реджи. Программист быстро вернул все в исходное состояние...

IF (условие перезапуска)
      DISPLAY 'ЭТО ПЕРЕЗАПУСК ЗАДАНИЯ, ТРЕБУЕТСЯ ПОДТВЕРЖДЕНИЕ' UPON CONSOLE
END-IF.

На срочном совещании созванном на следующее утро выяснилось, почему Реджи изменил этот фрагмент кода. Программист, который его учил, просто забыл ему сказать, чтобы тот игнорировал подтверждения на перезапуск. Теперь надо снова пройтись по примерно 20000 программ и исправить подтверждения на перезапуск. К счастью, Реджи снова оказался под рукой...

Оригинал:http://worsethanfailure.com/Articles/Reggie-X-Preston.aspx