Development

Позвольте трупу упасть

(В оригинале – Don’t Nail Your Program into the Upright Position)

Однажды я написал шутливую программку на С++, в которой я с некоторой долей сатиры реализовал следующую концепцию: при помощи множества try…catch конструкций по всему коду не дать программе аварийно завершиться. Результат мы назвали «труп, не падающий потому, что он прибит гвоздями к стене».

Несмотря на легкомысленность примера, я вынес из него некоторый опыт.

В нашей собственной С++ библиотеке был один класс. Этот класс долгое время страдал от активности многих и многих программистов. Практически каждый оставил в нем свой след. В этом классе содержался код, работающий со всеми исключениями из всех остальных мест. И мы решили, что объект этого класса должен жить вечно (или умереть в попытках это сделать).

Для этого мы сплели сеть из множества обработчиков исключений. Мы смешали в кучу как «родные» обработчики, так и обработчики Windows. Когда что-то не работало, мы вызывали это снова и снова. Оглядываясь назад, мне нравится сравнивать написание конструкций try..catch, вложенных в другие ветви catch, с решением свернуть с широкой дороги проверенных практик на манящую, но опасную для здоровья узкую тропинку, ведущую непонятно куда. Однако, это уже «здравый смысл постфактум».

Не стоит и говорить, что когда в приложении, использующем этот класс, что-то шло не так, то это что-то исчезало ничуть не хуже, чем жертвы мафиозной разборки в порту, не оставляя даже пузырей на поверхности. И даже не вызывая предназначенных для этого отладочных функций, цель которых – записывать информацию о случающихся проблемах. В итоге мы конечно поняли, какую херню мы сделали, и пришли в ужас. Мы заменили этот кошмар на простой и надежный механизм оповещения. Но произошло это после многих и многих сбоев, оставшихся необнаруженными.
Я бы не стал об этом писать, если бы не недавно состоявшийся диалог с челом, чей академический статус должен был говорить «Я знаю лучше». Мы обсуждали Java-код в удаленной транзакции. Он настаивал, что в случае ошибки код должен перехватить исключение на своей стороне. «И что ему потом с ним делать?» – спросил я, – «Приготовить на ужин?»

Он процитировал правило дизайнера пользовательского интерфейса: «НИКОГДА НЕ ПОЗВОЛЯЙТЕ ПОЛЬЗОВАТЕЛЮ ВИДЕТЬ СООБЩЕНИЕ ОБ ОШИБКАХ», не задумываясь о том, что КАПС и НИКОГДА – не самые лучшие аргументы. Я спросил, не он ли писал софт для банкоматов, «синий экран» которых так любят фоткать и выкладывать в инет, за что получил по голове.

В общем, если вы с ним встретитесь, то улыбайтесь и соглашайтесь со всем, что он говорит, пока будете медленно продвигаться к двери.

Автор оригинала – Verity Stob