Читать книгу Активные данные. Философское программирование - Сергей Федорович Толкачев - Страница 3

НЕ ДОГМЫ
Увертюра

Оглавление

– Все люди немножко программисты.

– Люди разные бывают…

– Программисты тоже.


Сетевой фольклор

Среди мудрых философских вопросов о смысле жизни, таких же древних, как и сама наша способность задавать вопросы, есть один, на который казалось бы легко найти ответ: «Почему мы задаем вопросы?» Однако и философ, и психолог, и Google – все ответят на него по-разному, что и не удивительно, поскольку никто на Земле не имеет полного знания о том, как устроен человеческий мозг. Вопрос относится к категории «Познай самого себя», а это по всей видимости невозможно, так как познающая система должна иметь информационные ресурсы, существенно превышающие ресурсы познаваемой системы. И среди обычных людей, как сам вопрос, так и ответы на него, воспринимаются скорее как любопытные, но не имеющее никакой практической пользы.


Пабло Пикассо сказал однажды: «Компьютеры бесполезны. Они могут только давать ответы.» Если начало этого утверждения эпатажно и спорно, то его вторая половина, применительно к первому поколению вычислительных машин – корректна и конструктивна. Но всё течет и развивается. И вот когда ЭВМ трансформировались в распределенные системы обработки знаний, у программистов появилась возможность ответить на вызов Пикассо: научить компьютер задавать умные вопросы. Ведь современный компьютер уже умеет задавать простые вопросы. А для поддержания «разумного разговора», нужны принципиально новые подходы не только к технической и программной архитектуре, но и к самой сути информационных процессов, с которыми придётся иметь дело следующему поколению программистов и пользователей.


«А что нужно, чтобы компьютер смог поддержать разумный разговор?» Для ответа на этот вопрос мало понимать, как он работает и что происходит внутри. К этому пониманию нужно будет добавить знания из самых разных областей науки, бизнеса, техники и искусства, и заодно ответить на сопутствующие вопросы: «Как обучается компьютер? Как передать знания наиболее эффективным способом? В чем принципиальная разница между человеком и компьютером?» Если мы сумеем соединить разные частички мозаики знаний вместе, эта увлекательная тема развернётся перед нами во всей своей многогранной гармонии. А с практической точки зрения – раскроются секреты, лежащие в основе построения чат-ботов, виртуальных помощников и множества других интеллектуальных инструментов, для которых диалог является естественным интерфейсом.


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


«Мы живем, и мы учимся» – тривиальная фраза для тех, кто понимает русский язык. Но если читатель любопытен, то прежде чем продолжить чтение, он хотя бы на несколько секунд задумается над взаимосвязью между этими простыми словами. Любопытство – удивительно интересное свойство человеческого мозга, присущее от рождения всем людям. Иногда оно просыпается от одного простого слова, а иногда глубокие философские рассуждения проходят мимо и никакого интереса к ним человек не испытывает. Но каждый раз, когда любопытство просыпается, мы узнаём что-то новое.


«We live to learn and we learn to live» – один из вариантов предыдущей фразы, записанный на английском языке. Использование другого языка сразу же разделило читателей на два класса – тех кто его понимает, и кто нет. При этом любопытный читатель, не зависимо от того, знает он английский или нет, постарается сделать обратный перевод, сопоставит результат и возразит: «Хотя слова в этих предложениях и одинаковы, но смысл в них совершенно разный!».


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


«GCA AGA GAT TGT» – фрагмент ДНК, записанный при помощи кодонов алфавита из четырёх оснований (A,C,G,T). Объяснить его до конца на сегодняшний день не сможет никто. Наши знания заканчиваются пониманием соответствий и микро действий, которые выполнит рибосома, интерпретируя молекулярные буквы. У нас есть некоторые статистические данные, мы знаем алфавит, знаем как происходит интерпретация, но не понимаем самого главного – смысла и логики программы, написанной неизвестным автором.


«CCHHHHHOH» – хорошо известное описание молекулы этанола, принадлежащей к огромному множеству молекул, которые построены из алфавита, состоящего из 118 атомов. Химические формулы молекул похожи на лингвистические конструкции – слова. Но в отличие от символов в алфавитах естественных или формальных языков, атомы активны, и связи (конкатенации) между ними многомерны!


Все разнообразные языки и алфавиты (молекулярные, лингвистические или технические), так или иначе, связаны с передачей, восприятием и преобразованием данных, информации и знаний в биологических, социальных или инженерных системах. При всём разнообразии этих систем, отличия между биологическими языками деления клеток, естественными языками общения людей и языками программирования, совсем не настолько велики, как это может показаться. Особенно для программистов, которые выполняют роль переводчиков, соединяя между собой мир людей и мир компьютеров, в каждом из которых говорят на своих языках. И этот уникальный опыт, накопленный программистами за многие годы, когда они по сути выполняют роль коммуникационного интерфейса между человеком и инженерными системами, может пригодиться самым неожиданным образом.


В этой книге речь пойдет о программировании активных данных. «Чего только не программируют в наше время» – заметит тут ворчливый программист и будет абсолютно прав. Запрограммировать можно практически всё, и перефразируя известное высказывание Архимеда, настоящий программист может сказать: «Дайте мне объект, и я его имплементирую.» Правда, в отличие от Архимеда, которому не нужно было объяснять, что такое «точка опоры», программист должен быть готов определить грамматику, семантику и прагматику этой фразы, специфицировать протокол «дайте», перечислить свойства «мне» и «объект», уточнить чем является «и» – конкатенацией или логической функцией, и т. д. Ведь он живет в мире, где все его слова, все его тексты, проверяет неумолимый компилятор, который только и делает, что снова и снова ищет ошибки. Стоило упомянуть слово «компилятор», как старый программист (старый – это тот, кто читал книги Д. Кнута и К. Джермейн, и знает разницу между MIX и PSW) немедленно возразил: «Делать компилятору больше нечего он занимается исключительно преобразованием одних строк в другие, и, если не получается, кричит, что не могу, спасайте. Ну да, делают это не все компиляторы. Например, JavaScript весьма толерантен и игнорирует любые ошибки. (Ю.Ш.)». Таков удел всех книг для программистов. С одной стороны, программирование – это формальная дисциплина, а с другой – сколько программистов, столько и формализаций.


Приступая к работе над этой книгой, автор, который всю свою жизнь пишет программы, не может просто так взять и выключить профессиональный способ формулирования мыслей, ведь для него книга – это та же программа, только написанная на другом языке. Но в отличие от программы, книгу мало написать корректно и оптимально, её важно написать к тому же и интересно! Наряду с этим, образованный программист, имеющий некоторое представление о «принципе минимальной длины описания» или «Колмогоровской сложности», понимает, что гипотетически, существует способ передать то, что он хочет сказать, в кратчайшей форме. Но читательское восприятие – процесс сугубо индивидуальный, контекстно-зависимый и к тому же мультимодальный. Поэты и математики лучше других знают, как при помощи слов выразить человеческие чувства и рациональную логику, и для этого они используют одномерные языки. Музыканты и художники могут передавать гармонию и видение мира, в пространствах с бо́льшим количеством измерений. В идеале, сочетание слов, ритмов, логики и рисунков создаёт в голове у человека самые глубокие и прочные ассоциации, основанные на фундаментальных формах сознания. А если помимо форм, прислушаться как в диалогах Пушкина о роли автора, Реньи о математике или в философских спорах Валентинова с Лениным о материальном и идеальном, возникает процесс обмена сомнениями, в котором каждый может поучаствовать со своими идеями и возражениями, то конечно нам нужно добавить в книгу виртуальный диалог с читателем и взгляд со стороны, например, в форме замечаний собеседника-оппонента…


Дойдя до этого параграфа, читатель-непрограммист может представить, что творится в голове у автора-программиста, а читатель-программист вправе ожидать хоть какое-нибудь формальное определение. И вот, чтобы помочь как можно быстрее разобраться и понять, насколько интересно и полезно будет продолжить чтение этой книги, попробуем не совсем формально и по возможности кратко, сформулировать её цель:


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


Теперь дотошный читатель может проверить близость определения термина переменная с соответствующей статьей в Википедии, математик—алгебраист (А.В.К.) добавит, что «Согласно Н. Бурбаки, переменная в формальной математике это вообще неопределенный термин», а старый программист снова возразит: «В математике нет процессов. Непонятно, о какой конкретно математике идет речь. И хотелось бы иметь определение „знания“ и „понимания“ (Ю.Ш.)». И поскольку «все они тоже правы», перед автором возникает образ Сциллы и Харибды, между которыми нужно проложить маршрут повествования так, чтобы и увлечь любопытного читателя, и в то же время сделать книгу полезной для практического программиста.


Обмен знаниями – это такой же естественный процесс для человека, как и умение говорить прозой. Безусловно, что далеко не всякий разговор приводит к приобретению знаний, а протоколы и формы, в которых мы передаем и получаем знания, могут быть самыми разнообразными. Но в каждом случае, если речь идет об обмене знаниями, мы наблюдаем три составляющие этого процесса: источник, сообщение и получатель. Источник – автор, учитель, композитор и т. п., преобразует свои знания в сообщение, которое может быть записано в виде книги, нотной партитуры, математической теории, и передано в форме диалога, лекции или беседы. А получатель – это тот, кто в результате приобретает новую информацию или навыки, позволяющие что-то сделать. Можно продолжить ряд вариантов этой тройки:


композитор партитура музыкант

учитель урок ученик

автор книга читатель


С появлением компьютера оказалось, что он также, наряду с человеком, может участвовать в процессе обмена знаниями, как в качестве источника, так и получателя. Вряд ли кого-нибудь сегодня удивит, что программист передает знания компьютеру в форме программы (программист программа компьютер) или компьютер, выступающий в роли учителя (компьютер урок ученик). А с помощью средств виртуализации, сам компьютер можно превратить в сообщение и тогда возможна схема передачи знаний в форме: автор компьютер пользователь.


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


Этот риторический вопрос относится к давнему диалогу между той частью человечества, которая представляет формальные науки, и остальными людьми, которые занимается креативной деятельностью в повседневной жизни, не задумываясь о формализации и доказательстве корректности, иногда тривиальных, а иногда очень сложных, как бытовых, так и производственных решений и процессов. С этим парадоксом постоянно сталкиваются программисты, которые, с одной стороны, используют инструменты и знания, основанные на формальных теориях, а с другой – применяют их при написании программ, в которых ошибки всегда были, есть и будут. Попытки построить теорию верификации программ, наверняка ещё где-то продолжаются, но иллюзии шестидесятых годов о том, что можно создать универсальный формальный доказатель корректности, у многих теоретиков программирования уже давно рассеялись. Этот спор не может выиграть ни одна из сторон, но можно надеяться, что, когда компьютер «поумнеет» до уровня понимания обычных вещей и способности задавать вопросы, чтобы перейти от простого к сложному, он сам сумеет добавить аргументы, как одной, так и другой стороне этого спора.


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


Компьютер и мозг хорошо взаимодополняют друг друга, хотя при этом они концептуально различны. В основе компьютера лежит централизованный процессор, исполняющий внешнюю программу, а мозг – децентрализованная система из множества динамических элементов, у которой нет конечной цели, a поведение является реакцией на внешние возбуждения. Различия между компьютером и человеком наглядны, но совсем не ясно, как может помочь программисту знание основ симфонической музыки, или наоборот, какая польза от теории информации, автору при работе над книгой? На первый взгляд, между этими понятиями нет прямых связей. Впрочем, если допустить, что знание, которое автор или программист создают и публикуют, является объектом с определенными свойствами, которые можно измерить, и этот объект воспринимает и интерпретирует некая система (компьютер или человек), то такую модель уже можно анализировать.


С точки зрения программиста, способного написать и загрузить программу в компьютер, знание – это динамическое понятие, которое обладает важным свойством аддитивности. Если к тому, что находилось в компьютере (аппаратное и программное обеспечение), добавилась новая программа, то можно сказать, что знание компьютера увеличилось на некоторую величину соразмерную этой программе. Программист может также предположить, что по аналогии с компьютером, знание человека – это нервная система (нейроны и нервы) плюс приобретенное, тем или иным образом, нечто, которое изменило её состояние. Знания человека могут увеличиваться вследствие полученной информации, которая, как и в случае с компьютером, также может быть измерена. Эта аналогия, в дальнейшем будет служить отправной точкой для более глубокого уточнения этого понятия.


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


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


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


В этой книге мы будем использовать знания из самых различных областей: биологии, математики, физики, музыки… Интерпретировать эти знания будет некий виртуальный любопытный программист, иногда поверхностно и разносторонне наивно, иногда профессионально глубоко, но всегда с целью понять суть, методы и практику программирования, и всегда готовый поделиться своими открытиями с другими. Программист, который немножко дилетант во всем, кроме своей профессии, решая задачи из самых разнообразных предметных областей, научился разбираться в каждой из них в достаточной степени, для того чтобы понимать основы, специальную лексику и оценивать результаты, по крайней мере, на уровне здравого смысла.


Есть одна область, в которой программы, не только помогают передавать знания от одной системы к другой, но и служат основой для эволюции огромного биологического мира. Поразительно, как похожи машинные коды, которые исполняются в компьютерах, и биологические программы или молекулы ДНК, которые интерпретируются внутри клетки, копируются, модифицируются и передаются другим клеткам! И вполне вероятно, что это сходство не случайно. В середине прошлого века, когда компьютеров ещё не было и их нужно было придумать, один из основателей, заложивший архитектуру вычислительных машин на многие годы вперед, которая так и называется «Архитектура фон Неймана», в своей работе по структуре ЭВМ прямо ссылается на биологические модели нейронов, как прототип вычислительных элементов.


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


Чем больше мы узнаём о природе биологических систем, о том, как происходит накопление и обмен знаниями, тем шире раздвигаются границы программирования. И хотя мы пока очень далеки от полного понимания того как работает код ДНК, и скорее всего никогда его не достигнем, можно предположить, что самая первая программа появилась на Земле приблизительно три миллиарда лет назад. И если немного пофантазировать вместе с древними греками, произойти это могло вот так:


Давным-давно возникла в мире Любовь, и соединились Мать-Земля и Создатель-Уран. Изверглись вулканы, вздыбилась магма, образовались моря и континенты. И оплодотворил Уран Землю – Жизнью. Или, используя современную терминологию, запустил Создатель на репродуктивном интерпретаторе Рибосоме, программу первоначальной загрузки ДНК, способную модифицировать свой код, посредством РНК. С тех пор и развивается на нашей Земле Жизнь, в самых разнообразных формах. Будь то животное или микроб в природе, дерево или трава в лесу, брат или сестра в семье – все они равны перед своими прародителями, но также все они и разные между собой. Так задумал Создатель и так воплотила его желание Мать Земля…


Можно даже попробовать вообразить этого Создателя – Великого Программиста, который сотворил ДНК и Рибосому, загрузил их внутрь первичной самовоспроизводящейся клетки, запустил механизм размножения, и в результате последующих итераций появились и мы, и всё живое, что нас окружает. Хотя вполне вероятно, что всё было решительно иначе, никакого Великого Программиста изначально не было, и вся эта красота получилась из случайного соединения молекул. Но что бы ни произошло тогда на Земле, есть некоторые основания утверждать, что жизнь есть следствие глобального биологического программирования. Система биологических программ, которая имеется в каждой клетке и в каждом вирусе, в процессе фантастически огромного количества компиляций и интерпретаций, под воздействием различных мутирующих факторов, породила всё многообразие живых организмов, которые продолжают эволюционировать, с каждой очередной интерпретацией копии программы ДНК на Рибосоме. А когда пришло время, то и Человек, в свою очередь, сотворил и компьютер, и программирование, которые являются естественным продолжением своих биологических прототипов. И чем закончится эволюция компьютеров – кто знает?


Грезят на подобные темы не только программисты. Странные картины мира привычны также и физикам, например у Р. Фейнмана, вселенная – это «атомы с сознанием, материя с любопытством.». А если уж продолжить фантазировать вместе с физиками совсем по-настоящему, то можно представить себе модель рекуррентного Создателя. Ведь когда один Создатель породил итеративный процесс, который привел к появлению другого Создателя, и тот, в свою очередь, породил следующий итеративный процесс, который… А что, если был Создатель, который придумал язык, в котором алфавит состоит из атомов (см. таблицу Менделеева), а слова-молекулы образуются путем многомерной конкатенации букв этого алфавита. Затем, с помощью первоначальной загрузки (Большой Взрыв), он запустил универсальный процесс, и в результате из физического алфавита и слов, образуются молекулярные предложения, из которых и получается ВСЁ, что с точки зрения конструктивного программиста, вполне логичная система рекуррентных отношений. И вернувшись к своей программе, конструктивный программист добавил к ней ещё одну строчку, ещё одну маленькую итерацию к процессу Великой Эволюции, и кто знает, может быть, когда-то нечто подобное делал другой Программист? – «Но довольно…»


Последние два слова – пример того, как глубоко различны все мы в восприятии и понимании! Этими словами заканчивается знаменитый монолог Гамлета в переводе Б. Пастернака и у того, кто читал и помнит эту версию, они определённо вызовут какую-нибудь, возможно, что и весьма глубокую, ассоциацию. Но для того, кто не читал или не помнит, реакция после прочтения этих двух слов будет совсем другой. Слово всё в начале этой главы, вместе со словом ВСЁ в конце, объединяют не логика, а принципиально иные по своей природе, глубокие ассоциативные связи, о которых и пойдет речь в этой книге.


Книга о программировании без примеров программ, так же неполна, как и книга о математике без математических формул. Можно много фантазировать и интересно рассуждать о знаниях, программах и компьютерах, но практическая цель этой книги будет достигнута только тогда, когда программисты смогут применить результаты этих рассуждений в своих работах, и чтобы помочь в этом, все демонстрационные примеры, приведенные в этой книге, включая библиотеки подпрограмм и объектов, доступны в GitHub:


https://github.com/stolkachev

Активные данные. Философское программирование

Подняться наверх