О Windows из первых рук: Битва функций

Когда вы перерабатываете функциональность «с нуля», каждая старая функция превращается в требование к новой функции.

Раймонд Чен

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

Концепцию –100 очков первоначально ввел Эрик Гуннерсон (Eric Gunnerson), когда объяснял, почему одни возможности реализованы в языке C#, а другие — нет. Этот принцип, в целом, применим к любому процессу проектирования продуктов. Каждой идее, связанной, с реализацией новой функции, сначала приписывают воображаемую недостачу 100 очков. Это означает, что для того, чтобы ее сочли по-настоящему заслуживающей внимания, необходимо продемонстрировать, что продукт в целом существенно выиграет от ее реализации.

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

Начинаем все заново

Меню Start в Windows 95 заменило старый диспетчер программ из Windows 3.1. У диспетчера программ был флаг «Save Settings on Exit». Если его сбрасывали, то все изменения, которые вы вносили в группы программ, пропадали после выхода из системы. В Windows 95 уже не было аналогичной функции.

Когда эта функция исчезла, часто можно было слышать гневные возгласы людей, использовавших эту старую функцию старой архитектуры. Они возмущались: «Как вы посмели удалить функцию X из переработанной Чудо-Системы?». Однако в этом вопросе все вывернуто наизнанку. Функцию не удаляли из переработанной Чудо-Системы. Ее никогда не было в переработанной Чудо-Системе. Так что нельзя сказать, что функцию удалили, — ее не стали добавлять.

Очевидно, что решения столкнуть старый код на обочину и начать с нуля принимаются не ради шутки. Например, старая архитектура больше не может справляться с современными нагрузками. Архитектура, которая работала с несколькими тысячами записей, может престать работать, когда записей станет несколько миллионов. А может оказаться, что старая архитектура просто вышла из моды. И вместо того, чтобы построить новую версию на основе старой архитектуры, проектировщики решают начать все заново.

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

С другой стороны, малоизвестные или редко используемые функции могут не попасть в окончательную версию. Некоторые другие функции могут проиграть не из-за нехватки очков, а из-за нехватки ресурсов. Предположим, в старой архитектуре имеется 100 функций. Еще предположим, что у вас хватает ресурсов на то, чтобы реализовать в новой версии также 100 функций. Если каждая функция из старой архитектуры будет переноситься в новую, то в результате получится, что новая архитектура полностью идентична старой. А если это так, зачем вообще все перерабатывать?

Конфликт между старыми и новыми функциями может быть прямым. Старая функция X может напрямую конфликтовать с новой функцией Y. Если вы решите сохранить X, то не сможете эффективно реализовать Y, и наоборот. Например, функция X может оказаться нереализуемой, когда количество записей превышает несколько сотен тысяч. С другой стороны, функция может не попасть в новую версию не из-за того, что проиграла битву функций, а просто из-за того, что люди, которые создавали новую версию, вообще не знали об этой старой функции.

Во многих случаях разработчики неохотно отказываются от старых функций. «Да, мы действительно хотели добавить функцию X, и отказ от нее, в самом деле, был болезненным решением», — говорят сотрудники группы разработки. «Мы надеялись, что сможем протащить ее в новую версию, но оценочные трудозатраты на добавление функции составили около 10 дней, и в нашем графике просто нет на это времени. Извините».

Как и в любом проекте, реальность не позволяет сделать все, что вам бы хотелось. Обязанность проектировщика — находить компромиссное решение относительно того, какие функции разрабатывать, и определять, что будет реализовано, а что останется в прошлом.

Раймонд Чен

Раймонд Чен (Raymond Chen)* — его веб-сайт и одноименная книга «Old New Thing», вышедшая в издательстве Addison-Wesley в 2007 году, рассказывают об истории Windows, программировании с использованием интерфейса Win32. Содержащаяся в них информация предназначена только для ознакомления и не может служить заменой консультации профессионального юриста.*