Начало заметки см. RB29-1.
Изучая пару лет назад архив Эдгара Дейкстры, я нашёл тот ключ, который давно искал. Речь идёт о понимании того, что есть программирование и в чём специфика этой сферы интеллектуальной деятельности человека. Среди классиков программирования не так много можно выделить тех, кто исследовал философские аспекты. И Дейкстра, на мой взгляд, принадлежит к числу этих немногих. В нескольких заметках Дейкстры (EWD480, EWD512, EWD881) содержится указание на книги известного математика Джорджа Пойа, посвящённые подходам к решению математических задач ("e;How to Solve It"e;, "e;Art of Plausible Reasoning"e; и др.). Дейкстра уловил важную аналогию. Он видит в этих книгах ответ на вопрос, как нужно подходить к решению задач в программировании.
Для представления взглядов проф. Дж.Пойа я выбрал книгу "e;Математическое открытие"e;, пожалуй, наиболее ценную для нашей цели изучения природы программирования.
------
О контурном подходе к решению задач (читай – "e;контурное проектирование"e;). Пойа пишет: "e;Как только мы начинаем серьёзно заниматься какой-нибудь задачей, нас что-то побуждает заглядывать вперёд, мы пытаемся предвидеть, что будет дальше: мы ждём чего-то, мы стремимся угадать контур решения. Этот контур может быть более или менее расплывчатым, он может быть даже в какой-то степени неправльным, хотя на самом деле не так уж часто он бывает очень неправильным"e;. Как формируется контур? Пойа поясняет: "e;Я редко расстаюсь со своими наручными часами, но когда это случается, у меня всегда появляется забота о том, как их найти. Потеряв свои часы, я по привычке начинаю их искать в некотором совершенно определённом месте: на своём письменном столе, или на какой-нибудь полке, где я обычно кладу свои мелкие вещи, или ещё в каком-нибудь третьем месте, если мне удалось вспомнить, что я снял часы именно там. Такое поведение типично. Как только мы серьёзно заинтересовались своей задачей, мы стараемся наметить контур, внутри которого следует искать решение. Этот контур может быть неопределённым, он может быть почти неосязаемым, но именно он определяет наши будущие действия. Конечно, попытки решения могут быть различными, но по существу же все они похожи друг на друга, все они лежат внутри этого заранее намеченного (возможно, не вполне сознательно) контура. Если ни одна из испробованных попыток не даёт результата, мы чувствуем себя обескураженными, ничто другое не приходит на ум; мы не в состоянии выйти за пределы намеченного контура. Ведь мы ищем не вообще какое-то решение, а вполне определённое решение, решение, которое должно находиться внутри нашего ограниченного контура. Мы не ищем решения где-то по всему свету, а внутри ограниченной области поисков"e;.
Самый выносливый и терпеливый читатель, сумевший дойти до этого места, надеюсь, сможет по достоинству оценить простоту и глубину подхода Пойа. И всё же перед штурмом вершины (изложением схемы мышления, предложенной Пойа) давайте сделаем последний привал.
О решении задач как о процессе строительства. Пойа пишет: "e;Попробуем сравнить взгляды решающего математическую задачу в начале и в конце его работы. Когда задача только ещё возникла, картина проста: решающий видит её обособленной, либо без всяких подробностей, либо с очень малыми подробностями; возможно, что он различает только главные её части – неизвестные, данные и условие, или предпосылку и заключение. Картина же, которую он видит в конце, совсем другая: она сложна, снабжена такими дополнительными подробностями и деталями, о связи которых с рассматриваемой задачей решающий вначале и не подозревал… Откуда же берутся все эти материалы, вспомогательные элементы, теоремы и т.д.? Их накопил решающий в своей памяти, и теперь ему предстоит извлечь их оттуда и целенаправленно приспособить к решению своей задачи. Такое привлечение сведений мы будем называть мобилизацией, а их приспособление к решаемой задаче – организацией. Процесс решения задачи подобен строительству дома. Сначала нужно собрать необходимый материал, чего само по себе недостаточно: куча камней – это ещё не дом. Чтобы построить дом или решение, надо сложить части вместе и организовать их в целое, к которому мы стремимся. Практически мобилизацию невозможно отделить от организации; они дополняют друг друга как аспекты единого сложного процесса – процесса умственной работы, конечной целью которой является решение. Работа эта, если она проводится интенсивно, вводит в дело все наши материальные ресурсы, требует применения всей гаммы наших умственных способностей и содержит в себе неисчерпаемое множество аспектов. Возможно, нам следует здесь поддаться искушению и выделить некоторые операции из всего многообразия умственных операций, являющихся элементами умственной работы, и описать их в таких терминах, как изоляция и комбинация, распознавание и вспоминание, перегрупировка и пополнение"e;.
Распознавание и вспоминание. Пойа так раскрывает эти понятия: "e;Решая задачу, мы бываем очень рады, если нам удаётся распознать какой-нибудь знакомый элемент. Так, например, при изучении геометрической фигуры мы можем обнаружить не замеченный ранее треугольник… Обнаружив, распознав этот треугольник, мы устанавливаем тем самым связь с обширной областью ранее приобретённых знаний, один из участков которой может оказаться в настоящий момент полезным. Таким образом, распознавание может, вообще говоря, побуждать нас к вспоминанию чего-то полезного для решения задачи, к мобилизации относящихся к рассматриваемому вопросу сведений"e;.
Пополнение и перегруппировка. Пойа поясняет: "e;Мобилизованные нами потенциально полезные элементы, будучи присоединены к нашей концепции задачи, могут, вообще говоря, обогатить её, придать ей более законченный вид, ликвидировать пробелы, устранить её недостатки, одним словом, пополнить её. Иногда, однако, удаётся добиться значительного успеха в организации решения и без добавления нового материала за счёт одного лишь изменения расположения уже имеющихся элементов, путём изучения соотношения между ними в новой диспозиции, путём перестановки или перегруппировки их. Перегруппировав элементы, мы меняем "e;структуру"e; нашего понимания задачи. Итак, перегруппировка означает изменение структуры"e;.
Изолирование и комбинирование. Пойа пишет: "e;При изучении сложного целого наше внимание может привлекать то одна, то другая деталь. Мы сосредоточиваемся на какой-то определённой детали, мы фокусируем на ней своё внимание, делаем на неё упор, выделяем её из её окружения – одним словом, изолируем её… После того как изучен ряд деталей и произведена соответствующая их переоценка, может снова возникнуть потребность представить себе всю ситуацию в целом… Комбинированный эффект переоценки роли некоторых деталей может вылиться в новую мысленную картину общей ситуации, новую, более гармоничную комбинацию всех деталей. Изолирование и комбинирование, дополняя друг друга, могут продвинуть процесс решения. Изолирование деталей приводит к распаду целого на части, а последующее комбинирование их снова объединяет части в целое, более или менее отличающее от исходного. Разлагая целое на составные части, а затем воссоединяя их по-иному, снова разлагая и снова воссоединяя по-иному, мы заставляем эволюционировать наше понимание задачи, переходя к более перспективной ситуации"e;.
Ну вот мы и подошли к вершине нашего повествования. К той схеме, которую Джордж Пойа озаглавил "e;Как мы думаем"e; (с.253).
Вот его пояснения к диаграмме: "e;Мобилизация и организация представлены как противоположные концы одной и той же (горизонтальной) диагонали квадрата, так как практически эти операции дополняют друг друга. Мобилизация извлекает из нашей памяти относящиеся к делу элементы, а организация целенаправленно увязывает их друг с другом. Изолирование и комбинирование представлены как противоположные концы другой (вертикальной) диагонали, так как практически эти операции дополняют друг друга. Изолирование выделяет конкретную деталь из окружающего ее целого, комбинирование воссоединяет детали в осмысленное целое. Стороны, исходящие из вершины, отведенной мобилизации, помечены словами "e;распознайте"e; и "e;вспомните"e;, так как практически мобилизация элементов, имеющих отношение к задаче, часто начинается с распознавания некоторого элемента, содержащегося в задаче, и заключается во вспоминании связанных с ним и уже знакомых нам других элементов. Стороны, исходящие из вершины, отведенной организации, помечены словами "e;пополните"e; и "e;перегруппируйте"e;, так как практическая организация означает пополнение нашего понимания задачи, придание ему определенной законченности путем добавления новых деталей и ликвидации пробелов; она означает также перегруппировку, перестройку во всей нашей концепции задачи. Точно так же деталь, которую нам удалось вспомнить и которая оказалась полезной при комбинировании, обогащает наше понимание задачи и пополняет целое. В процессе решения задачи прозрение (или предвидение) является центром нашей деятельности; поэтому соответствующая точка помещена в центре нашего символического квадрата. Мы движемся, мобилизуя и организуя, изолируя и комбинируя, распознавая и вспоминая элементы различного вида, перегруппировывая и пополняя нашу концепцию задачи, стараясь предвидеть решение или какую-нибудь его характерную черту, или участок ведущего к нему пути. Если предвидение, прозрение приходит внезапно, подобно вспышке, то мы называем его вдохновением или блестящей идеей; обладание такой идеей — наше самое сокровенное желание"e;.
Как нетрудно догадаться, эта схема подходит не только для решения математических задач. Она весьма универсальна, и всё предшествующее изложение задавало необходимый контекст, базис обоснования этой схемы. Анализируя его, можно прийти к выводу, что схема Пойа может быть полезна в самых разных областях интеллектуальной деятельности. В первую очередь, нас, разумеется, интересует сфера программирования. Однако, те, кто знаком с близкими областями (программирование человеческой деятельности — менеджментом), легко заметят, что схема Пойа весьма компактно представляет универсальный подход к решению задач и здесь. И её можно использовать в том числе для организации процесса создания сложных программных систем (включая и подход Open Research Programming).
В заключение моего пересказа с обширным цитированием приведу ещё одни важные слова Пойа. Он пишет: "e;Мы радуемся, когда наше понимание задачи оказывается хорошо сбалансированным и гармоничным, когда оно содержит все необходимые детали, и притом только хорошо знакомые детали… Наша концепция задачи кажется хорошо уравновешенной, если не ощущается необходимости в перегруппировке её элементов, она кажется внутренне согласованной, если не нужно вспоминать детали, если одна из них легко вызывает в памяти другие. Если нет необходимости в пополнении концепции задачи, она представляется нам законченной; если все детали распознаны, она кажется нам знакомой и близкой. Отчётливость в восприятии деталей обеспечивается их предварительной изоляцией и сосредоточением внимания на каждой из них в отдельности, а гармоничность концепции в целом является следствием удачной комбинации деталей. Мы говорим, что идея близка, когда чувствуем уверенное продвижение к тому, что можно назвать прозрением"e;.
Пойа в своей книге в виде сносок-комментариев приводит ряд интересных цитат, которые привлекли его внимание. Некоторые, даже не сообщив об этом читателю, я самовольно под собственным углом зрения встроил в свой субъективный пересказ его книги с прицелом на последующее раскрытие своего видения природы программирования. Но две хотел бы выделить особо. Они прокладывают мостик к следующей моей заметке, которая, как и эта, будет носить вспомогательный характер, и потребуется в качестве важного приложения к моим мыслям о природе программирования.
Цитата из книги "e;The Age of Reason"e; (Baltimore, 1956) выдающегося американского просветителя, политического деятеля и публициста Томаса Пэна (Thomas Paine, 1739-1809), именем которого назван штат Пенсильвания: "e;Каждый исследователь, изучавший деятельность и развитие человеческого ума, основываясь на наблюдениях над собственным умом, не мог не заметить, что существуют две различные категории того, что называют мыслями: к первой относятся те, которые мы порождаем активно, посредством акта мышления, обдумывания, ко второй – те, которые вспыхивают в нашем сознании самопроизвольно. Я всегда почитал за правило общаться с этими добровольными пришельцами со всевозможной вежливостью и старался изучить, насколько мне позволяли мои способности, заслуживают ли они внимательного приёма; именно благодаря им я и приобрёл почти все знания, которые имею"e;.
Косвенная ссылка на книгу "e;Афоризмы"e; немецкого физика и писателя Георга Кристофа Лихтенберга (1742-1799). Пойа пишет: "e;Лихтенберг как-то заметил, что не следует говорить "e;я думаю"e;, но – "e;думается"e;, подобно тому как говорят: "e;светает"e;, "e;морозит"e;. Лихтенберг утверждает, что существуют спонтанные акты мышления, которыми мы не можем управлять, подобно тому как мы не можем управлять великими силами природы. Мы могли бы сюда ещё добавить, что разум наш иногда ведёт себя подобно упрямой лошади или мулу – странному животному, к которому мы должны приноровиться и которого должны время от времени понукать, чтобы заставить его служить нам, ибо, вообще-то говоря, он довольно часто отказывает нам в своих услугах"e;.
На мой взгляд, изложенный здесь материал (помимо чисто практической пользы в решении различных задач) в достаточно компактной форме позволяет осознать возможные подходы к программированию (включая и всевозможные методологии). Если отталкиваться от взглядов Пойа и проецировать их на сферу программирования, приходишь к мысли о том, что программирование стоит рассматривать гораздо шире, чем это обычно принято. Иными словами, обобщить программирование (не просто компьютерное) до уровня интеллектуальной деятельности, направленной на построение любых систем (не только компьютерных). О том, что под этим понимается и к какой пользе это может привести, мы поговорим несколько позже.
|