Pull to refresh

Двадцать вопросов, которые помогают разработать алгоритм

Algorithms *
Как разработать алгоритм, решающий сложную задачу? Многие считают, что для этого нужно «испытать озарение», что процесс этот не вполне рационален и зависит от творческой силы или таланта.

На самом деле решение любой задачи сводится к сбору информации о наблюдаемом объекте. Причем этот принцип применим как для решения самых сложных научно-исследовательских задач, так и для решения прикладных задач. Работа изобретателя напоминает не столько работу волшебника, сколько путешествие первооткрывателя по неизведанной территории. Главное качество хорошего изобретателя – умение собирать информацию.

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

Вопрос №1. Кто?
Начиная решать определенную задачу, составьте максимально длинный список людей, имеющих непосредственное отношение к ее решению. Выясните:
— кто в первую очередь заинтересован в ее решении?
— кто уже занимался решением этой или смежной задачи?
— кто определяет, хорошо задача решена или плохо?
— с кем можно советоваться по ходу решения задачи?
— кто может проверить решение?
— кто является автором статей в этой области?

Вопрос №2. Для чего?
Спросите себя несколько раз: «Почему я хочу решить эту задачу? Для чего это нужно?» Часто оказывается, что решение задачи A необходимо для того, чтобы решить задачу B, но при этом задачу B можно решить и другим путем. В этом случае, начиная думать над исходной задачей А, мы лишь теряем время.

Вопрос №3. Как?
Какими методами я буду руководствоваться, решая данную задачу? Как будет структурирован процесс ее решения? Есть ли готовые методологии, которые можно использовать?

Вопрос №4. Что?
Какие объекты присутствуют или подразумеваются в данной задаче? Нарисуйте их на бумаге и обозначьте стрелками всевозможные отношения между ними, связанные с данной задачей. Есть ли неучтенные или лишние объекты?
В каждый объект должны приходить и из каждого объекта должны исходить примерно одинаковое количество стрелок. В противном случае, как правило, мы либо упускаем важные связи между объектами, либо придаем неоправданно большое значение некоторым связям.

Вопрос №5. Когда?
Посмотрите на задачу с точки зрения времени. Выясните:
— как быстро должны работать отдельные блоки алгоритма?
— какие внешние факторы, связанные со временем, могут повлиять на их работу?
— сколько времени есть у вас на разработку, программирование и тестирование алгоритма?

Вопрос №6. Где?
Посмотрите на задачу с точки географической точки зрения. Ответьте на вопросы:
— где, в каких странах, городах, районах будет использоваться ваше решение?
— на каких компьютерных платформах оно будет работать?
— какие еще вопросы, связанные с месторасположением и географией, имеют отношение к данной задаче?

Вопрос №7. Что было?
Какие решения данной задачи существовали год, два, десять, сто лет назад? Ни одна задача не возникает на пустом месте – скорее всего, люди уже справлялись с этой проблемой в прошлом. Интересно и полезно бывает узнать, как именно это происходило.

Вопрос №8. Что есть?
Какие решения этой задачи существуют и используются сегодня? Выясните это и добейтесь четкого понимания альтернативных решений, доступных уже сейчас.

Вопрос №9. Что будет?
Как будут решать эту же задачу люди через три, пять, десять, сто лет? Определите этот тренд хотя бы приблизительно, подумайте над этой темой, пофантазируйте.
Прекрасно, если алгоритм, над которым вы сейчас работаете, будет частью долговременного тренда, а не устареет морально через год после реализации.

Вопрос №10. Частью чего является?
Частью какой более масштабной задачи (или системы) является данная задача? А частью чего является эта более масштабная система?

Вопрос №11. Из чего состоит?
Какие более мелкие подзадачи являются частью исходной задачи? На какие части можно разбить исходную задачу? А на какие еще более мелкие части можно разбить подзадачи?

Вопрос №12. На что похоже?
На что похожа данная задача? В данном случае ассоциации могут быть сколь угодно длинными и метафоричными, и это даже хорошо. Прекрасно, если вы найдете сходное явление в совершенно другой области человеческой деятельности.
Это очень мощный вопрос. Именно на аналогиях между совершенно неожиданными областями знания находятся самые красивые и гармоничные решения.

Вопрос №13. Что вижу?
Визуализируйте задачу, ее решение и все его компоненты. Нарисуйте их. Побудьте ребенком (или дизайнером), найдите наиболее подходящие цвета (даже для виртуальных, абстрактных объектов). Прочувствуйте визуальную гармонию этой задачи или найдите «некрасивые», проблематичные места, если такие есть.

Вопрос №14. Что слышу?
Это очень сложный и полезный вопрос, поскольку та мощнейшая часть мозга, которая отвечает за обработку звуковой информации, у большинства современных людей слаборазвита. При этом я знаю гениальных ученых и инженеров, которые именно «слышат» решение той или иной задачи.
Итак, постарайтесь «услышать» взаимодействие всех элементов задачи (для этого удобным бывает закрыть глаза), услышать характерные звучания ее элементов. Услышьте разговоры и тембры голосов людей, применяющих решение вашей задачи на практике.

Вопрос №15. Что чувствую?
Этот вопрос также может показаться необычным, хотя и не в такой степени, как предыдущий. Ощутите тактильные, температурные, вкусовые, дыхательные ассоциации, вызываемые данной задачей. Некоторые решения могут показаться «крепкими», в то же время как другие «холодными» или даже «горькими».
Подключите часть вашего мозга, отвечающую за ощущения, к анализу задачи. Конечно, это нестандартный путь анализа научной информации, но он также бывает полезным.

Вопрос №16. Каким может быть идеальное решение?
Пофантазируйте, как можно решить эту задачу в идеале; придумайте что-то совершенно невероятное — чем невероятнее, тем лучше. На этом принципе построен метод «мозгового штурма», когда предлагаются любые, даже самые неожиданные решения.
Представьте себе, что у вас нет границ, а условия работы самые благоприятные. Что бы вы могли сделать в этой ситуации?
Как можно было бы сделать решение этой задачи совершенно великолепным?

Вопрос №17. Почему все закончится неудачей?
Побудьте брюзгой и пессимистом-критиком. Найдите все причины, из-за которых у вас не получится решить эту задачу; а также все организационные проблемы, которые приведут к провалу этого проекта. Тщательно их запишите — чем больше, тем лучше.
Когда вы выйдете из состояния критики, записанное станет бесценной информацией о тех опасностях, которые поджидают вас на пути решения задачи, и от которых следует уклониться.

Вопрос №18. В чем польза для меня?
Какие выгоды лично вы извлечете из решения данной задачи? Чему научитесь? Сколько заработаете? Какие важные связи и контакты приобретете? Как улучшите свою репутацию?

Вопрос №19. В чем польза для других?
Какую именно пользу от решения этой задачи получит заказчик, клиент, тот человек, который будет пользоваться результатами вашего труда? Имеет ли решение вашей задачи большое значение для него?

Вопрос №20. В чем польза для общества?
Как повлияет решение вашей задачи на все общество, в котором мы живем? Будет ли она общественно-значимой? Чем и как она поможет всему человечеству в целом?

Уверен, что ответив на все эти вопросы, вы узнаете намного больше о той задаче, которая перед вами стоит. Причем, почти наверняка, вы увидите эту задачу с самых неожиданных сторон — и ваша фантазия сама подскажет вам необычные, надежные, красивые и гармоничные способы ее решения.

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

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

Оригинал статьи находится здесь
gil-algorithms.com/articles/20_questions_on_generating_an_algorithm.html
Tags:
Hubs:
Total votes 95: ↑81 and ↓14 +67
Views 5.9K
Comments Comments 28