Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Опять изучаем алгоритм. И уже который раз в заголовке слово "Эволюция". Эволюция программного проекта, эволюция памяти и теперь эволюция поведения. Это простое совпадение?
Или этот термин, выведенный в свет небезызвестной работой «О происхождении видов...», зафиксировал образец универсального способа развития, который не ограничивается только биологией??
Почему для понимания алгоритма необходим разговор о поведении???
Где в формализации алгоритма есть место эмоциям????
И все эти вопросы в ограниченной объемом статье. Задача не проста, и тем интереснее начать...
Задача
Для начала разговора о поведении необходимо обозначить базовые утверждения, на которые будут опираться наши рассуждения. Необходимых утверждений-предпосылок немного, но они пока не закреплены страницами энциклопедий, а те источники, где они встречаются, строго научными не назовёшь. Не имея такой общепринятой платформы, приведенный далее материал лишается в полной мере научной строгости, но, думаю, никто такого требования к науч-поп статье и не предъявляет. Далее будут подкрепленные примерами размышления на заданную тему, а научные детали отделены, и для заинтересовавшихся — ссылки на них собраны в завершении статьи.
Базовое утверждение, необходимое в дальнейших рассуждениях, звучит так:
Поведение — это совокупность алгоритмов, наследуемых и создаваемых биологической особью для обеспечения своей сохранности и размножения.
Следующие утверждение частично содержатся в первом базовом утверждении и поясняют его детали:
Алгоритм поведения — это повторимый способ воздействия биологической особью на состояние окружающей среды
Запуск алгоритма поведения определяется детектируемым особью сочетанием признаков, свидетельствующим о некотором состоянии среды
Воздействие производится особью исполнением упорядоченной совокупности действий из доступного особи множества действий.
И для заключительного утверждения потребуется немного переформулировать результат первой статьи серии "Что такое алгоритм...":
Действие, доступное биологической особи — это элементарный алгоритм поведения.
Утверждения не очень сложны. Но зачем они? И какие преимущества можно получить, нарекая поведение Алгоритмом?
Сформулировать ответы на эти вопросы сложнее чем их задать, но не будем пугаться сложности и складывать руки. Вся текущая статья посвящена решению этой задачи.
Можно попытаться кратко описать достоинства предлагаемого подхода. В первую очередь он даёт возможность анализа формирования и изменения поведения биологического организма и его уникального вида — человека. Что уже не мало. Но есть вторая и, вероятно, более важная особенность такого взгляда на поведение. Этот взгляд позволяет обнаружить примеры синтеза алгоритма без участия программиста. Выявленные таким образом примеры синтеза демонстрируют и заново открывают нам один из основных универсальных способов создания сложного алгоритма.
Этот способ — Эволюция.
И в этом месте прервусь и повторю почти дословно важный момент, подчеркиваемый и в прошлых публикациях, но по-прежнему актуальный для выбранной формы повествования. Текущая статья, как и каждая статья серии — просто один шаг в пути к эффективным методам работы с алгоритмами. Предлагаемые на этом шаге решения требуют обсуждения. Жду в комментариях конструктивную критику. Отмечу подтвержденный предыдущими публикациями факт, свидетельствующий, что при всём стремлении в каждой статье раскрыть все важные аргументы, поддерживающие описываемые решения, к сожалению, результат этой попытки не всегда полностью успешен. Вижу в этом только необходимость самосовершенствования, но не повод остановиться. А потому приступим к новой и особой теме в формирующейся работе, посвященной формализации алгоритма.
Базовое поведение
Любой организм из соображений сохранения существования своего вида вынужден исполнять "базовые стратегии", собранные в следующем списке:
- стратегия "Поддержание своей целостности" (важность структуры составляющих организм объектов);
- стратегия "Поддержание своей жизнеспособности" (важность диапазонов параметров и наличия внешних веществ среды, обеспечивающих осуществимость жизненных процессов организма);
- стратегия "Исполнение процессов своего размножения" (важность выполнения организмом производства своих копий одним из доступных вариантов: например, самокопированием путем деления, бесполым или половым размножением).
Первые две стратегии критичны для текущего существования особи и они безусловны и безальтернативны. Для стратегии "размножения" не так очевидна необходимость исполнения, и если бы организмы жили вечно, то эта стратегия была бы вовсе не обязательной. Но в нашем мире "ничто не вечно". И потому, как уже было разобрано в одной из предыдущих статей (и ранее Ч.Дарвином), вполне закономерно, что те организмы, которые не обеспечивали исполнения стратегии "Размножения" жили, возможно, очень счастливо, но в итоге погибли, и их вид вымер. А существовать остались другие виды — те, которые эту "базовую стратегию" исправно продолжают соблюдать. Здесь можно отметить, что стратегия "Размножения" является устойчивой в эволюционной перспективе, то есть при длительной смене поколений организмов.
Но остановимся с биологией. Зачем это необходимо разбирать в контексте изучения алгоритма?
Это необходимо потому что "базовые стратегии" являются причиной любого поведения организма и даже причиной развития этого поведения. Необходимость исполнения "базовых стратегии" — это двигатель эволюционного способа, но совсем не главная его особенность.
Эволюционный способ
Главная особенность эволюционного способа — это возможность формирования сложного алгоритма добавлением нового обнаруженного простого алгоритма к уже существующему сложному алгоритму. По сути это постулирование превосходства способа аккумулировать сложный алгоритм постепенно над способом создания этого же алгоритма в текущий момент, нахождением и объединением всех составляющих простых алгоритмов разом.
Так, например, достаточно сложно себе представить, как разом появился рецепт (алгоритм) изготовления бисквитного торта. Но, зная о существовании эволюционного способа, целесообразно высказать предположение, что это происходило медленным наращиванием, то есть добавлением обнаруживаемых человеком простых алгоритмов приготовления еды к уже существующему. И тогда достаточно найти исходный алгоритм. Им для "рецепта торта" является базовая стратегия "Поддержание своей жизнеспособности", или упрощенно — необходимость еды. И к этому исходному алгоритму нам необходимо найти ситуации обнаружения и наращивания "простых" алгоритмов. Давайте попробуем придумать вариант такого развития. Конечно, совсем не обязательно, что этот вариант в действительности и был осуществлен. Важно только наличие этой простой эволюционной схемы.
Итак, базовый алгоритм — стратегия "Поддержание своей жизнеспособности".
На этой основе у большинства подвижных организмов формируется "пищевое поисковое поведение", сейчас не будем заострять внимание на внутренние шаги этого формирования.
В "пищевом поисковом поведении" человек пробовал многие предметы внешней среды на съедобность. И те, кто пробовал ядовитое — погибли и не оставили своего опыта, те же, кто попробовал новый съедобный продукт — выжили и показали своим детям этот съедобный продукт. Тем самым нарастили "пищевое поисковое поведение" алгоритмом выбора нового съедобного продукта. Для рассматриваемого нами случая этим алгоритмом стало поведение: "Съесть зерна злакового растения".
Но наша цель — торт. Поэтому не будем долго возиться над каждым шагом, оставим это для строго научных статей. Сосредоточим внимание на общей схеме эволюции, осознавая, что каждый крупный шаг можно разложить на составляющие с использованием тождественного подхода.
Соберем шаги эволюционного развития и формирования сложного алгоритма (рецепта) изготовления торта на основе базовой стратегии "Поддержание своей жизнеспособности" в следующей таблице. В каждой строке новый шаг, который инициализируется ситуацией обнаружения и присоединения нового маленького алгоритма.
Ситуация | Добавляемый алгоритм | Полученный сложный алгоритм |
---|---|---|
- | Базовая стратегия "Поддержание своей жизнеспособности" | |
??? | Мобильность организма | "Пищевое поисковое поведение" |
Голодный человек пожевал зерна | Съедобность злаковых | Поиск и употребление злаковых в пищу |
Одно зерно случайно очистилось, например, при переносе, и обнаружено, что так есть удобнее | Очистка злакового зерна | Поиск и употребление в пищу очищенных зерен злаковых |
При ручной чистке большого количества зерен стираются пальцы. Необходима и проста замена использования пальцев в шелушении зерна на использование нескольких камней | Способ очистки злакового зерна камнями | Поиск и употребление в пищу зерен злаковых, очищенных камнями |
Случайно зерна перетерлись камнями, и получились не целые зерна, а измельченные | Способ измельчения зерна камнями в муку | Поиск и употребление в пищу зерен злаковых, измельченных камнями |
При поедании муки ощущение сухости стимулирует добавление воды. Возможен второй вариант при случайном намокании перетертого зерна | Способ изготовления теста | Поиск и употребление в пищу зерен злаковых, измельченных камнями и затем намоченных |
Игра и лепка намокшим тестом | Способ изготовления лепешек | Поиск и употребление в пищу зерен злаковых, измельченных камнями и затем намоченных и слепленных лепешкой |
Случайное высыхание слепленной ранее лепешки, а сухая лепешка долго хранится | Способ изготовления "сухих" лепешек | Поиск и употребление в пищу зерен злаковых, измельченных камнями и затем намоченных и слепленных в лепешку, которая высушена |
Ускорение медленного высыхания лепешки помещением в теплое место рядом с огнем | Способ изготовления печеных лепешек | Поиск и употребление в пищу зерен злаковых, измельченных камнями и затем намоченных и слепленных в лепешку, которая выпечена рядом с огнем |
Добавление сладости, чтобы повысить вкусовые качества | Способ изготовления сладких печеных лепешек | Поиск и употребление в пищу зерен злаковых, измельченных камнями и затем намоченных сладкой водой и слепленных в лепешку, которая выпечена рядом с огнем |
Добавление яиц, чтобы обеспечить клейкость и целостность лепешки при малом количестве муки | Способ изготовления сладких печеных лепешек из жидкой муки | Поиск и употребление в пищу зерен злаковых, измельченных камнями и затем намоченных сладкой водой с добавлением яиц и слепленных в лепешку, которая выпечена рядом с огнем |
Взбивание яиц до пенного состояния, чтобы обеспечить воздушность лепешки | Способ изготовления сладких воздушных печеных лепешек из жидкой муки | Поиск и употребление в пищу зерен злаковых, измельченных камнями и затем намоченных сладкой водой с добавлением взбитых яиц и слепленных в лепешку, которая выпечена рядом с огнем |
Длинная таблица получилась. Карлсон не дождался бы такого тортика, и в нашем рецепте все еще нет крема и свечек. Но для общей схемы развития они лишние. Вместо них в получившейся таблице можно обнаружить другой примечательный момент. Содержащееся в третьей колонке описание сложного алгоритма подозрительно напоминает по своей структуре формулу изобретения в патентной системе России. При том, что описанный рецепт бисквитного коржа — это, несомненно, алгоритм (даже по текущему не скорректированному определению этого термина), очевидна близость этого рецепта к материальному аналогу — Изобретению. Зафиксируем эту близость, но рассмотрение пока отложим для следующих статей. И вернемся к анализу развития поведения человека.
Исходное поведение человека, желающего есть, изменилось. Оно эволюционировало. То есть маленькими добавлениями становилось сложнее чем раньше. Эти маленькие порции — ключевая особенность, позволяющая усложняться уже сложному алгоритму. Конечно, можно было дать первобытному человеку колосья, камни, сахар, воду, яйца и огонь, но при этом быстрое появление рецепта бисквитного теста было бы очень маловероятным. Даже имея множество попыток объединения этих ингредиентов, можно было провести за смешиванием много лет и не достичь конечного результата. А первобытному человеку, конечно, было чем заняться вместо этого не очень полезного занятия, например, пытаться выжить более реальным способом чем выпечка торта.
Но отвлечёмся от торта и обобщим, присоединяя к нашим размышлениям опыт разработки программного обеспечения:
Для создания сложного алгоритма эффективнее использовать способ, опирающийся на усложнение уже имеющегося алгоритма, чем способ с попытками написания сложного алгоритма с нуля.
Эффективнее усложнять алгоритм добавлением к нему маленького дополнительного алгоритма.
Маленькие алгоритмы могут быть созданы обнаружением случайного появляющегося, но повторяющегося явления в окружающей нас среде (например, такого как высыхание лепешки).
Не все маленькие алгоритмы в изобретении рецепта бисквита были случайными, но сложные варианты с использованием алгоритмического переноса пока обойдём стороной. И вернёмся к поведению, потому что рецепт торта это, конечно, тоже обусловленное поведение, но очень далёкое от того, что изучает психология.
В рассмотренном примере видно, что разработка выбранного алгоритма основывается на базовой стратегии организма. Это наследование от базовой стратегии верно с небольшими оговорками почти для всех видов создания алгоритма человеком. Но нам сейчас важен не этот факт. Для изучения поведения человека необходимо выделить множество основных стратегий поведения, близких к перечисленным базовым. Анализ структуры этого набора основных стратегий в конечном итоге покажет нам путь зарождения более совершенных способов синтеза алгоритма, что является глобальной целью проделываемой работы.
В деле выделения основных стратегий поведения для нас есть подарок. Этот подарок со стороны психологии. В которой эта основа уже выделена. Нам остается только структурировать её. Итак, знакомьтесь, основные стратегии человеческого поведения — это эмоции.
Эмоции
Давайте поборемся с желанием прекратить чтение статьи на предыдущем предложении. Ведь разъяснение использования этого странного слова в разговоре об алгоритмах уже почти сложилось.
Во-первых, мы будем разбирать не все эмоции человека. Ведь они имеют разный ранг. Есть примеры, непосредственно опирающиеся на базовые стратегии, перечисленные выше. Есть и отстоящие чуть дальше, но все же очень нужные для текущего разговора. И есть эмоции, в основном отличающиеся их использованием в общении взрослых людей разного социального статуса, рассмотрение которых рационально оставим психологам.
Во-вторых, на основе рассмотренных нами эмоций сформировано очень много алгоритмов окружающего нас сейчас мира. Понимание первоистоков некоторых алгоритмов, особенно в социальной сфере, обескураживает, но и без эффекта неожиданности поиск пути формирования любого сложного алгоритма является занятной головоломкой и вместе с тем достойным внимания развлечением.
Нет, конечно, этот постер — не реклама прекрасного мультфильма. Это демонстрация удивительного созвучия его содержания нашей текущей теме. И, да, слова "головоломка" нет в оригинальном названии мультфильма ("Inside Out"), его дословный перевод скорее "наизнанку" или лучше по смыслу — "изнутри". Нам тоже, как и в мультфильме, необходимо изнутри рассмотреть некоторые эмоции, наиболее ярко демонстрируемые детьми. И тоже понять как человеческие эмоции "смешиваются" и "обрастают" взрослым поведением. Но в отличие от мультфильма нам не нужно "очеловечивать" эмоции, делая их персонажами. Вместо этого мы будем делать их алгоритмами.
Стоит сказать, что целесообразность разбора именно детских проявлений эмоций имеет простое обоснование. Этот выбор подобен обращению внимания на стадии формирования эмбриона для изучения одинаковых и отличающихся этапов развития двух биологических видов и установления эволюционной родственности этих видов.
Давайте выпишем список важных нам эмоций и ощущений с указанием их иерархии развития с началом в базовых стратегиях.
Базовая стратегия "Поддержание своей целостности"
1.1. Противостояние повреждениям:
- Механорецепторы давления, растяжения (ощущения структурного повреждения)
- Тепловые и холодовые терморецепторы (ощущение теплового ожога),
- Хеморецепторы (ощущение химического ожога)
- Боль (защитный алгоритм поведения, вынуждающий реагировать на предвестников повреждения, устраняя их)
- Эмоция Страх (защитный алгоритм поведения, вынуждающий менять текущее поведение для избегания запуска предвестников повреждения)
- Эмоция Злость (алгоритм поведения на основе выполнения атаки, обеспечивающей защиту от нападения организма-агрессора, стремящегося вызвать повреждения)
- Коммуникация с сородичами, предупреждающая об опасности: торибоны — феромоны страха и тревоги, звуковое сигнальное взаимодействие (алгоритмы коллективного поведения для избегания повреждения)
Базовая стратегия "Поддержание своей жизнеспособности"
2.1. Поддержание контакта с веществами, необходимыми в жизненных процессах
- Наличие атмосферы пригодного газового состава: кислорода, углекислого газа (ощущение духота, алгоритмы дыхания)
- Наличие в правильном соотношении воды и солей: жажда, осморецепторы (ощущения и алгоритмы поведения, возвращающие водно-солевой баланс в оптимальный диапазон)
- Наличие еды: белки, углеводы, минералы (голод, вкусовые рецепторы, алгоритмы поиска и приготовления еды)
- Эмоция Злость (алгоритм поведения на основе выполнения атаки для обезвреживания и поедания сопротивляющегося организма-жертвы)
- Коммуникация с сородичами, информирующая о необходимых веществах: одмихнионы — метки пути, указывающие дорогу к дому или к найденной добыче, знаковое взаимодействие (алгоритмы коллективного поведения для обеспечения сородичей необходимыми веществами)
2.2. Поддержание параметров, необходимых для протекания жизненных процессов
- Контроль температуры тела, например, для обеспечения работы ферментов (ощущения и алгоритмы поведения, возвращающие параметры температуры в оптимальный диапазон)
- Контроль давления, например, для обеспечения кровоснабжения (ощущения и алгоритмы, обеспечивающие циркуляцию крови и контролирующие просвет кровеносных сосудов)
- Эмоция Страх (защитный алгоритм поведения, вынуждающий корректировать и развивать поведение для избегания опасных параметров и локаций среды)
- Эмоция "Радость" (стимулирующий алгоритм поведения, сопровождающий процессы развития поискового поведения для запоминания полезных параметров и локаций среды с возможностью возвращения к ним)
- Коммуникация с сородичами для копирования и аккумуляции обнаруженных отдельно каждой особью алгоритмов поведения (выживания), приводящих к полезным параметрам и локациям среды и помогающих избегать опасных параметров и локаций среды
2.3. Устранение контакта с веществами, мешающими жизненным процессам
- Избегание внешних вредных и ненужных веществ: хеморецепторы и вкусовые рецепторы (алгоритмы избегания химических отравлений и поедания бесполезных веществ)
- Избавление от накопленных ненужных веществ жизнедеятельности: (алгоритмы ощущения усталости (молочная кислота в мышцах), алгоритмы обеспечивающие позывы и исполнение выделений)
- Эмоция "Брезгливость" (алгоритмы поведения, помогающие избегать контакта с вредными и ненужными веществами)
- Коммуникация с сородичами, информирующая о вредных и ненужных веществах
Базовая стратегия "Исполнение процессов своего размножения"
3.1. Половое размножение (один из способов эволюционного развития биологических генетических алгоритмов)
- Выделение и обнаружение партнеров на основе феромонов (эпагонов — половых аттрактантов)
- Алгоритмы поискового поведения, обеспечивающие обнаружение партнера для взаимодействия и полового размножения
- Эмоция "Влюбленность" (так умело обойденная в рассматриваемом детском мультфильме рейтинга 6+). Отчего бы здесь вместо персонажа-эмоции не появиться спутнику всех статей этой серии — яблоку (на этот раз в образе "запретного плода"):
- Эмоция "Радость" (стимулирующий алгоритм поведения, сопровождающий процессы развития поискового поведения для запоминания полезных с точки зрения размножения состояний и локаций среды с возможностью возвращения к ним)
- Коммуникация и взаимодействие с сородичами, обеспечивающие информацией для благоприятного выбора партнера
3.2. Забота о потомстве (один из способов эволюционного развития алгоритмов поведения)
- Алгоритмы заботы о потомстве (своих копиях), необходимые в случае возрастания сложности организма и при необходимости некоторого времени для развития появившейся копии в способное к самостоятельному выживанию взрослое состояние. При указанных условиях копия, полученная генетическими методами, нуждается во внешнем поддержании жизнеспособности
- Эмоция "Грусть": слезы, плачущий крик, писк выпрашивания еды (стимулирующая сигнализация детской особью при взаимодействии со взрослой особью необходимости включить режим заботы для обеспечения чужой стратегии "Поддержание жизнеспособности" и "Поддержание целостности")
- Алгоритмы заботы о потомстве (своих копиях), необходимые в случае возрастания сложности организма и при наличии не наследуемых генетически алгоритмов его выживания. При этих условиях копия, сформированная генетическими методами, нуждается в развитии до взрослого состояния путем обучения, то есть копирования от взрослой особи используемых ею алгоритмов поведения (выживания)
- Эмоция "Радость" (алгоритм взаимодействия взрослой особи с потомством, включающий режим обучения и замещающий агрессивную реакцию на свою усталость и нелепые, вредные действия детской особи)
- Эмоция "Радость" (стимулирующая сигнализация детской особью при взаимодействии со взрослой особью необходимости включить режим обучения и выключить взрослую агрессию)
- Коммуникация с сородичами, обеспечивающая алгоритмы совместной заботы и обучения молодых особей.
Да, опять сложный и длинный список. Его можно представить в виде не очень съедобного разрезанного на куски торта (досталось бы мне тут от Карлсона). Целый торт — всё поведение человека, описываемое всем списком. Кусочки торта — отделяемые по наследованию от базовых стратегий пункты этого списка. При анализе выделенных "кусочков торта" видно, что эмоции, предлагаемые психологией для описания поведения человека, не являются очень удачным разбиением поведения на части. Так, например, эмоции "Злость", "Радость", "Страх" оказываются на разных "кусочках", разграничиваемых опорными базовыми стратегиями. Иногда ситуация сложнее: "кусочек" один и эмоция одна, но она характеризует два различающихся алгоритма поведения. Так, например, различны алгоритмы радости родителя и алгоритмы радости ребенка. Это не так страшно для психологии, но очень неудобно для работы с алгоритмами поведения и отслеживания их эволюции. Поэтому в наших последующих размышлениях мы будем указывать не эмоцию, а полный путь к разбираемому алгоритму от опорной базовой стратегии.
И на этом пока стоит остановиться. Ни один разбор значимого алгоритма поведения уже не поместится здесь в рамках статьи разумного объема. В этот момент читателю стоит похвалить себя за освоение объема текущего, который был отнюдь не мал. А автор тоже себя хвалит за старания и замещает свою усталость на радость от совершающегося процесса обучения .
Выводы
Да, стоит всегда себя вознаграждать за проделанную работу. Пусть даже наградой является лишь похвала. Ведь работа, проделанная в статье и читателем, и автором, не была легкой? Давайте соберем итоги выполненных свершений.
Была сформулирована совокупность базовых стратегий организма. И здесь
стоит отметить, что эти "базовые стратегии" целиком основываются на свойствах развивающегося алгоритмического пространства, формализованного в теоретической части работы, при констатации факта, что организм по своей сути является сложным алгоритмом, которому по вводимому в работе определению необходимо обеспечить повторимость своего исполнения.
Были перечислены первые три способа синтеза алгоритма: случайное обнаружение, объединение, и самое важное для этой статьи — эволюционное накопление.
Была продемонстрирована и закреплена иерархия развития алгоритмов поведения от базовых стратегий организма. Дополнительным важным моментом, неявно прослеживаемым в приведенной иерархии развития, является наличие "вишенки", лежащей на каждом рассмотренном "кусочке торта" поведения. "Вишенкой" является то, что все крайние пункты дерева развития являются коллективными или коммуникационными алгоритмами. Этот факт обязательно будет развит в статье, посвященной синтезу алгоритмов средствами коммуникации.
В завершение осталось пояснить игру с номером в названии текущей статьи. Это число не сто один, а . То есть 5. И части номер 4 еще не было, ввиду проведенного в предыдущей статье голосования по выбору темы для статьи последующей. В голосовании выиграла тема "Алгоритмы и человеческие эмоции" с "сокрушительным" перевесом в 1 голос. Теперь долг перед проголосовавшим читателем исполнен, и уже ничто не удерживает от написания статьи №4. В ней будет рассмотрен путь эволюции от алгоритмов поведения к алгоритмам математики.
Спасибо Вам за внимание.
Отзывы
Буду очень благодарен за отзывы, критику и предложения, так как они помогают мне скорректировать направление развития работы.
Отдельное волнение у меня есть по стилю повествования и форматированию, используемым в статье (кавычки, абзацы, курсив). Напишите, пожалуйста, если у Вас есть замечания к ним. Можно личным сообщением.
Ссылки
- Главная страница и теория работы (GitLab GPL): Проект "Общая теория алгоритмов"
- Вводная статья работы "Разрабатываем теорию алгоритмов как проект с открытым исходным кодом". Пожалуйста, не судите строго эту наивную публикацию "сверх-идеи" устаревшей версии 2019 года.
- Статьи серии "Что такое алгоритм?!"
- №1 "Действие",
- №2 "Обусловленная и связная последовательность",
- №3 "Синтез алгоритма запоминанием"
- №3.1 "Эволюция памяти"
- №3.14 "Копирование иерархии памяти"
- Статьи в хабе "Программирование":
- Детская сказка программисту на ночь
- Эволюция программного проекта и ООП
- Как не понимать принципы развития архитектуры SOLID
- Иллюстрация "Торт" взята из мультфильма "Малыш и Карлсон" 1969 г.
- Иллюстрации к разделу, посвященному эмоциям, взяты из мультфильма "Головоломка" ("Inside Out") 2015 г.
- Рисунок яблока в статье сформирован сообществом Wikipedia. Лицензия (Creative Commons Attribution-Share Alike 4.0 International)