Сегодня я хочу посмотреть на программные системы с точки зрения накопления и передачи знаний.
Для начала нам нужно углубиться в живые организмы, и посмотреть на три стадии развития интеллекта в живом.
В первой стадии внутри поколения не происходит накопление новых знаний, а только между поколениями через ДНК. Можно сказать, что все знания бактерии хранятся только в ДНК. На самом деле, бактерии просто негде накапливать знания. У нее нет пластичного мозга (да и вообще никакого мозга нет). На нее действуют внешние и внутренние силы, которые приводят к относительно случайным мутациям, и отбор окружающей среды.
ДНК хранит все, что может…
Обучение происходит невероятно медленно. Нужны миллионы лет, чтобы выучить простейшие вещи, вроде “если слишком горячо, нужно двигать хвостиком и убегать”.
UPDATE: Однако, жизнь одного поколения очень коротка, поэтому перенос знаний в ДНК может происходить быстро. Поэтому бактерии быстро адаптируются к изменениям окружающей среды или к антибиотикам.
Во второй стадии возможно накопление знаний в одном поколении. Появляется мозг, который способен накапливать информацию гораздо быстрее, чем ДНК. К сожалению, все еще нет эффективной передачи знаний в одном поколении или через поколение. Работает только узкий канал вроде личного примера. Например, кошки учат котят ловить мышей.
Наличие мозга позволяет учиться быстрее. Котят любят больше, чем бактерии. Они относительно умные.
Через игры котята тоже приобретают новые знания, так что в пределах одного поколения есть некоторая связь.
Обучение происходит гораздо быстрее, но все еще достаточно медленно. Сколько потребовалось лет, чтобы кошки научились охотиться на птиц? Я думаю, тысячи.
В третий стадии появляется фундаментальное новшество — речь. Внезапно можно передавать знания с невиданной ранее скоростью. Язык позволяет накапливать знания в мозгу и передавать их через поколения (песни, сказки, легенды, анекдоты). Письменность позволяет задействовать внешние источники хранения данных (бумага, глина, камень). Формируется культурный контекст.
Речь и письменность — самый эффективный канал передачи и накопления информации.
Родители играют всё меньшую роль, новые люди черпают гораздо больше знаний из внешних хранилищ информации. Обучение происходит очень быстро. Каждый фенотип обучается, изменяется и имеет шанс пополнить глобальный контекст, так что формируется положительная обратная связь. Знания нарастают лавинообразно. Человечество уже упирается в пределы организации и поиска данных, совершенно невиданная проблема для более ранних стадий накопления и передачи знаний.
Где программная система накапливает знания и как передает? К нашему огромному сожалению, она накапливает и передает знания только через разработчиков.
Что можно считать ДНК программной системы? В природе ДНК — это набор генов, которые через экспрессию формируют свойства фенотипа. В софте ДНК — это набор функций и свойств, экспрессия (использование) которых формирует свойства фенотипа.
Пару примеров. Вы можете сделать Basic Auth, интеграцию с Google Auth и подключиться к провайдеру SSO. Вот у вас три гена Auth в продукте. Компания “Ч” использует только Google Auth, так что они экспрессируют только один ген, а два других остаются незадействованны. Но компания “У” использует все три.
Или вы можете разрешить пользователю писать любые бизнес-правила в системе самостоятельно. Тогда можно с высокой долей уверенности утверждать, что каждый фенотип будет иметь свой набор бизнес-правил, то есть ген будет задействован очень вариативно, в зависимости от контекста.
Разработчики, используя свой личный опыт и опыт индустрии в целом, формируют ДНК программной системы. Потом разработчики смотрят на эту систему в динамике (если очень повезет, то лет 10, но обычно они меняют работу гораздо раньше), накапливают знания в своем мозгу, и создают новую систему, с улучшенной (ну, или скажем честнее, с другой) ДНК.
Всё держится на разработчике. Разработчик держится на таблетках.
Теперь о грустном.
Фактически, мы сейчас находимся на уровне бактерии. Программные системы относительно изолированны, не умеют общаться друг с другом, плохо реагируют на изменения внешнего контекста.
Всё держится на разработчике.
Мы сейчас находимся на уровне бактерий. Но есть определенные проблески. Зарождается ML с какой-то надеждой решить проблему #1. Возможно в будущем мы сможем создавать модули, которые будут позволять системам преобразовывать информацию в знания, находить там паттерны и обобщения. К примеру, делать заключения вроде “с 9 до 9:30 по вторникам и средам производительность модуля поиска падает на 200%” или “95% пользователей после закрытия последнего бага переводят задачу в состояние Coded”.
Второй фундаментальный прорыв наступит, когда фенотипы системы начнут общаться между собой и делиться этими знаниями. Например:
— Я фенотип F#87, у меня на 200% падает производительность модуля поиска с 9:00 до 9:30 по вторникам и средам
— Я F#129, у меня нагрузка на модуль поиска в это время 0. Я добавила правило Perf_42 / Distribute resources | SEARCH | F#129 -> F#87 | 100% -> 80%
Черт с ней, с речью, нам бы для начала научить системы обмениваться повадками (паттернами)! Это должно быть гораздо проще, чем произвольная речь. Паттерны исчисляемы. Даже с десятком тысяч паттернов работать относительно легко и это поддается ручному программированию. Мы уже сейчас можем заняться этим интересным направлением. Ничего не мешает.
Оптимистичнее всего с гибкостью. Кажется, мы уже подошли к черте создания гибких систем, фенотипы которых могут очень сильно отличаться друг от друга. По крайней мере в некоторых доменах.
Будущее очень заманчиво и хочется дожить до решения всех трёх проблем, упомянутых выше. Однако, между бактериями и котами лежит огромная пропасть 🌿→ 🐈.