Правильная ссылка на эту страницу
http://az-design.ru/Support/SoftWare/l/GlassRob/04h1031.shtml

3.1. Принцип “лучшее — враг хорошего” и решение задач

       Сколько труда нужно потратить, чтобы разработать программное решение задачи?
       Вопрос звучит достаточно просто, и можно предположить, что ответ на него тоже будет простым. Как в старой загадке про то, какой длины должна быть статья или речь: как юбка — достаточно длинной, чтобы покрывать предмет, и достаточно короткой, чтобы вызывать интерес (есть ли женский эквивалент этой крайне шовинистической мужской шутки?!)
       В нашем случае, проект должен быть достаточно проработан, чтобы полностью решать задачу, но не более того. Кажется, все просто?
       На самом деле, не совсем. Решения бывают разные. Одни решения могут быть детально проработанными и очень тонкими (их называют “ювелирными”). Другие решения оказываются упрощенными и тривиальными (их называют “неадекватными” или даже “негодными”). Но бывают решения, о которых можно только мечтать, — изящные, красивые и творческие, представляющие собой простое решение невероятно сложной задачи. Хитрость в том, чтобы сначала попытаться достичь такой элегантности, а если этого не позволяют имеющиеся ресурсы, то предоставить сложное решение, сложность которого обусловлена лишь особенностями задачи, а не нашим несовершенством.
       Однако во всех этих рассуждениях предполагается, что решить задачу можно несколькими способами, и трудность в том, чтобы определить, достаточно ли хорош тот, который вы рассматриваете в данный момент. Но это как раз и есть краткое описание мира программирования и трудности поиска программных решений. Даже для сравнительно простых задач может не существовать неоспоримо лучшего метода поиска решения (и неоспоримо лучшего решения), если вы заняты поиском программного решения или даже кодированием решений. Большинство задач в области программирования относится к категории “неструктурированных”, а определить объем труда, необходимого для решения задачи этого класса, — ну очень серьезная задача!
       (Помню, как на одной из недавних конференций по программированию докладчик предложил механизм поиска компонентов для повторного использования, которому требовалось, чтобы разработчик сформулировал проектное решение в том же виде, в каком это сделал разработчик того самого компонента для повторного использования, который нужно найти. Такие совпадения в реальном мире программных решений просто исключены.)
       В действительности, для большинства сложных задач есть много различных уровней проектных решений. Есть идеальное, лучшее из всех возможных решение. Есть приемлемое решение — “работает, но хотелось бы чего-то лучшего”. Есть совершенно неадекватное решение — “это никуда не годится”. Плюс множество промежуточных ступеней. Рисунок 3.1 прекрасно иллюстрирует подобное многообразие решений для задачи поиска экстремума изображенной кривой.


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

       Теперь вся проблема осложняется. Если различных уровней решений много, то снова возникает вопрос о том, сколько труда требует поиск решения.
       К счастью, некоторые ответы можно найти в литературе, посвященной решению задач. Любопытно, что методами решения задач люди, надо полагать, интересовались испокон веков, но лет тридцать назад, с появлением такого инструмента решения задач, как компьютер, интерес резко возрос. И одна книга, посвященная решению задач, по моему убеждению, возвышается над прочими.
       Это “Науки об искусственном”, шедевр Герберта Саймона, лауреата Нобелевской премии и премии Тьюринга. Объем этой книги таков, что данный скромный очерк выглядит в сравнении с ней карликом, и самое увлекательное в ней — понятия “оптимизации” и “разумной достаточности”. Оптимизация — это попытка найти лучшее из имеющихся решений задачи. Однако Саймон утверждает, что для сложных задач часто нет очевидного способа поиска оптимального решения. Для такого класса задач нам необходимо, по мнению Саймона, отправиться на поиски разумно достаточного решения.
       Что он понимает под “разумно достаточным”? Он говорит о таком решении, которое работает, причем “достаточно хорошо”, но не дотягивает до оптимального, хотя и выполняет свою функцию.
       Как установить, что ваше решение именно такое? Согласно Саймону для этого вы должны представить адекватное обоснование своего решения. Таким образом, разумно достаточное решение должно быть “приемлемым” (supportable).
       Может быть, это всего лишь семантическое словоблудие? Что ж, вернемся к кривой на рис. 3.1 и попробуем предложить метод, с помощью которого можно гарантировать нахождение истинного максимума. Взглянем на дело с практической точки зрения. Ваши ресурсы для поиска решения небезграничны. Может быть, ваш начальник, как обычно, напоминает, что решение должно было быть найдено еще неделю назад, а может, он жестко ограничил ваши возможные затраты на поиск решения.
       Понятие “разумной достаточности” представляется весьма важным, но оно дополнительно осложняет процесс решения задач. Теперь мало начать искать решение — нужно заранее установить, какой уровень решения будет приемлемым. Может быть, вы столкнулись с той редкой задачей, которой не подходит никакое решение, кроме оптимального? Или у вас ограничения по времени и стоимости, и вам нужно просто работоспособное решение? В мире встречаются задачи обоих типов, и важно понять свою ситуацию, прежде чем начать поиск решения.
       Здесь весьма уместна одна чудесная поговорка. Это принцип “лучшее — враг хорошего”.
       Из него попросту следует, что если для вашей задачи подходит разумно достаточное решение, то не стоит тратить силы на поиск оптимального.




<<< Пред. Оглавление
Начало раздела
След. >>>

Дата последнего изменения:
Thursday, 21-Aug-2014 09:10:55 MSK


Постоянный адрес статьи:
http://az-design.ru/Support/SoftWare/l/GlassRob/04h1031.shtml