amarao_san

Categories:

Поток сознания о коде и данных

При том, что всё полезное делает код, мы старательно избегаем кода настолько долго, насколько можем. Вся наша иерархия работы с кодом (теги, версии, типы версий, семантик, бранчи, пакеты, etc) стремится к тому, чтобы код был данными. Мы работаем с кодом как с данными настолько долго, насколько можем.

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

... А в 21ом веке мы придумали как работать с сайд-эффектами как с данными, мы назвали их промисами и фьчерами. Мы ещё больше оттоптали себе кусочек «данных» вместо кода — фьючер — это всего лишь данные и чистые функции, про которые мы умеем притворяться, что это данные. И только где-то в безумии await'а скрывается кристализованная беспомощность.

В чём же прелесть данных? Заметим, с самого начала (работы Тьюринга, и в каком-то смысле, даже Гёделя) мы стремились к тому, чтобы избавиться от исполнения и перейти к анализу. Почему-то считается, что анализ — это не код, хотя из всех работ и Гилберта, и Гёделя и Тьюринга на нас смотрит простой факт, что анализ кода — это тоже код. Но мы старательно закрываем на это глаза, потому что где-то тут скрывается survival bias, потому что если мы мыслим, значит мы контролируем то, что анализирует (то есть контролируем себя) — свобода выбора в чистом виде. Если у нас есть свобода выбора, значит мы контролируем анализ. Это единственный кусочек кода, который мы контролируем, потому что Тьюринг показал, что мы не можем контролировать никакие другие кусочки кода, и как только они запустились, они сами себе решают (когда остановиться, и всё остальное). У нас возникает парадокс  — с одной стороны мы знаем, что код, который анализирует что-либо, он неанализируемый, с другой стороны, если у нас есть свобода выбора, то есть контроль над своим анализатором, над своим кусочком кода.

Где-то тут находится «я» — как код, которому кажется, что он может понять себя, потому что есть свобода выбора, то есть иллюзия контроля. И это единственный код, который нам кажется, что мы можем понять, потому что весь остальной код непознаваем.

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

... Но человек всегда имеет свободу остановиться. И получается, что для своего собственного «кода», для «я», задача остановки решена аналитически — захочу, остановлюсь.

Тьюринг показал, что решение задачи остановки эквивалентно способности предсказать ответ произвольной тьюринг-машины и её программы. Из этого каким-то странным образом вытекает, что если у нас есть свобода остановиться, значит, мы можем предсказать себя. Что приводит к мысли, что «я» — это то, что может себя анализировать. Но в то же самое время здесь есть большая ошибка — ведь свобода на решение об остановке не есть способность предсказать самого себя. |тупиковая ветвь рассуждений.

Возвращаясь к коду. Мы верим в предсказуемость кода, который уже работает (git, cp, exec, etc), и таким образом, граница «я» расширяется на уже запущенную систему.

Мы стремимся отложить добавление (выполнение) кода как можно дальше, чтобы сохранять целостность «я». Запуск другого кода — это leap of faith, потому что мы не имеем ничего, кроме гарантий, обещаний и веры. Мы не можем глядя на код ничего про него сказать. Есть святой грааль доказуемого кода, он он куда менее допускающий доверия, чем многим может показаться, потому что его доказательство — это тоже код, а мы не знаем, можем ли мы ему доверять.

Мы откладываем решение о доверии, сохраняя работу с данными как можно дольше. Вне зависимости от того, насколько странные данные, мы всё равно можем предсказать работу с данными (до той степени, до которой мы верим в свободу выбора и расширение «я» на уже запущенный доверенный код). Мердж может вызвать конфликт и сделать из гита кашу, но это всё равно кусочек данных, мы знаем как его восстановить (rm && pull). А вот простейший `cargo run` оставляет нас в полном непонимании с тем, что произошло. Мы не знаем что это код сделает и после того, как он сделал, мы не знаем что с этим делать.

Запуск кода — это отказ от «я». Основной целью любого процесса доставки кода — сохранение целостности «я» — он изолируется от кода, оставляет его «данными».

Посмотрите на любой CI/CD сервер. Он всегда использует модель «экстракции». Порождается чуждое (джоба на слейве/runner'е), оно что-то творит, что мы не знаем (но прикрываем таймаутом), и потом мы из него экстрактим ... данные. Даже если код что-то самопубликует, это всё равно данные. Мы не позволяем джобе что-то поменять в коде, в «я». У нас нет кода, который бы мог пойти и потеребить внутренности CI/CD, потому что это чужак, которого мы не понимаем и не можем предсказать. Код — либо данные, либо враждебная внешняя среда, с которой мы проявляем высшую степень осмотрительности и недоверия.

Error

default userpic

Your IP address will be recorded 

When you submit the form an invisible reCAPTCHA check will be performed.
You must follow the Privacy Policy and Google Terms of use.