пятница, 17 июня 2011 г.

Будьте очень аккуратны, если вы решили изменить правила игры после того, как она закончилась

Это перевод Be very careful if you decide to change the rules after the game has ended. Автор: Реймонд Чен.

Одно из предложений, которое поступило для решения этой проблемы, заключалось в возврате кода ошибки ERROR_PLEASE_RESTART, который означал бы "Эммм, на сервере возникла проблема. Пожалуйста, повторите попытку". Вообще-то это почти то же самое, что "ничего не делать", потому что сервер и так возвращает ошибку для этой проблемы - STATUS_INVALID_LEVEL. Конечно, это не звучит как "Пожалуйста, попробуйте снова" - это звучит как "Извините, у меня не получается это сделать". Этот код ошибки предполагался для возврата, когда вы просите сервер войти в быстрый режим, а сервер его не поддерживает.

Но с точки зрения кодирования эффект одинаков. "Если FindNextFile возвращает ошибку xyz, то на сервере возникла проблема и вам нужно начать заново". Назовите xyz "ERROR_PLEASE_RESTART", "STATUS_INVALID_LEVEL" или "PURPLE_LILACS". Не важно, какое имя вы выберите, конечный эффект будет тот же самый: существующий код должен быть изменён, чтобы проверять на именно эту ошибку и соответствующе среагировать. Программы, которые не были обновлены, будут вести себя странно.

И в этом заключается проблема сегодняшнего поста: когда вы решаете, что проблема требует изменения правил игры, после того как игра уже закончена.

Программы во всём мире были написаны для соответствия одному из многих набору правил. Большинство актуальных сегодня программ были написаны для соответствия правилам Windows XP. Некоторые были написаны для правил Windows 2000. Есть даже старые программы, написанные под правила Windows 95 или Windows 3.1. Один из аспектов обратной совместимости заключается в адаптации к программам, которые нарушали правила и им это сходило с рук. Но сейчас мы говорим не про починку сломанных программ; сейчас мы говорим про сохранение корректных программ корректными.

Если вы введёте новый код ошибки и укажете необходимость нестандартной его обработки (к примеру, что-то, отличное от "провалить операцию"), то тогда все программы, которые были написаны до введения этого нового правила, неожиданно превратятся из корректных программ в "неправильные" - и это не из-за их ошибки. В зависимости от того, насколько "неправильными" они окажутся, серьёзность проблемы может варьироваться от неудобства до фатальной. В случае Проводника эта проблема проявится в том, что первый просмотр папки покажет неверное содержание, но обновление исправит это. Но если энумератор объектов .NET неожиданно выплюнет новое исключение ServerFailedMustRestartEnumeration, то вы, вероятно, увидите множество программ, вылетающих с необработанным исключением.

К этому моменту возникает обычный вопрос: как пользователям обновить их программы, чтобы они работали по новым правилам? Автора оригинальной программы может не быть в живых. Исходный код может быть утерян. Или же знание, необходимое для понимания исходного кода может быть утеряно ("эту программу написал нанятый специалист пять лет назад. У нас есть исходный код, но никто в нём ничего не понимает"). Или же автор программы может просто не рассматривать обновление программы для Windows Vista как необходимое действие (в конце концов, зачем ему обновлять версию 1.0, если сейчас актуальна 2.0?)

Заметьте, что Microsoft иногда вынуждена менять правила игры. Вытесняющая многозадачность взамен кооперируемой изменила кучу правил. То же сделало и новое управление питанием в Windows Vista. Но даже когда правила меняются, усилия направляются на то, чтобы эмулировать старые правила для старых программ. Потому что эти программы следуют другому набору правил, и менять правила после окончания игры - это не очень-то вежливо.

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

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