🖼️ VCS как иллюстрация двухмерного времени
Photo by Kumiko SHIMIZU [1] / Unsplash [2]
Есть мнение, что опытный дендрохронолог [1] может прочитать историю леса или хотя бы его сегмента по спилу одного дерева. Засушливые года отличаются от дождливых, тёплые отличаются от холодных, а следы пожаров и других подобных катаклизмов вообще может прочитать кто угодно. Откровенно говоря, пилить дерево даже не обязательно, можно специальным сверлом извлечь тоненький керн (не знаю, правда, как это переживёт само дерево) — цилиндрический стержень из древесины.
Таким же подходом пользуются геологи: смотрят на геологические разрезы или на керны, и анализируют полосочки наслаивающихся осадочных пород, чтобы прочитать многовековую историю Земли в данном конкретном месте.
Хорошие иллюстрации к идее о том, что время линейно, немного подобно пространственным измерениям и легко проецируется на одномерную прямую. Собственно, его и изобразить в виде линии легко.
Например, вот несколько войн, которые имели место в истории:
[🖼️ 1325: Война из за ведра, 1537: Куриная война, 1838: Кондитерская война, 1859 Война из за свиньи, 1932: Война с эму] [2] В войнах, конечно, нет ничего смешного, но историки, давшие этим войнам имена, возможно, придерживались иной точки зрения. Или вот другой пример. Цепочка событий, которая привела к возможности развернуть этот блог.
[🖼️ 1945: Изобретение ENIAC, 1971: Изобретение микропроцессора, 1984: Появление DNS, 1990: Создание браузера, 2013: Появление Docker,] [3] Это не исчерпывающий список всех событий, просто иллюстрация. Тут ведь даже нет моего рождения! И набор используемых технологий, конечно, значительно шире. А ещё похоже немного на схему нормальной линии метро или трамвая, висящую в вагоне. Нормальной — это не имеющей разветвлений. Про разветвления чуть ниже поговорим.
Итак, вот наглядное изображение: время одномерно. Даже если в один момент времени произошло несколько событий, они всё равно будут в одной точке на прямой.
И, что ещё важно, события обязательно следуют друг за другом. По порядку. События в прошлом не создают параллельных миров, как об этом любят писать некоторые фантасты. История не терпит сослагательного наклонения, и не может быть в истории какой-то параллельной ветви событий, где браузер не изобрели.
Или может?..
В мире информационных технологий существуют такие штуки, как системы контроля версий (VCS). Их несколько разных, но мне привычен Git, поэтому я буду описывать дальше в привычной для гита терминологии.
В гите есть понятие фиксации изменений — коммит. Он представляет собой, собственно, событие.
Ещё в гите есть ветки. Ветки позволяют создавать цепочки событий от какого-то отдельного момента. Ветки могут разветвляться дальше или сливаться друг с другом. Важно отметить, что ветки отделяются отдельной операцией, то есть коммит не приводит к появлению новой ветки.
Вот пример:
[🖼️ Здесь изображена визуализация простенького репозитория git, которую нельзя описать в двух словах.] [4] Для построения диаграммы использован инструмент [5] проекта git school. Не пугайтесь стрелок, направленных в обратную сторону. Так задумано: они указывают на состояние, из которого сделан тот или иной коммит. Читать диаграмму всё равно стоит слева направо.
Мы здесь видим три ветки: master, B и C. Можно было бы переименовать master в A, но специалистам привычнее, что основная ветка называется мастером (также используется более нейтральное main).
Мастер начинается с initial commit. Дальше в нём происходит коммит A1. Не так важно, что в нём изменилось. Но после A1 появляется ветвь B. В ней происходят коммиты B1 и B2. Коммит A2 не учитывает изменений из ветки B, т.е. тут мы видим два параллельных мира: master продолжает жить жизнью, в которой не случалось B1 и B2.
После A2 из мастера отделяется ещё одна ветка, C. В ней тоже происходят два коммита: C1 и C2. В мирах веток B и master нет никаких сведений о том, какие события происходили в ветке C. Но и в ветке C нет сведений о коммитах из ветки B.
Затем в ветке master происходит коммит A3. И затем ветка сливается в B — появляется коммит с именем merge. После слияния в ветке B становятся доступны ранее неизвестные события: коммиты A2 и A3. При этом, в ветке master коммитов из веток B и C всё ещё нет.
А затем по очереди в master сливаются ветки C и B. И вот интересный момент: теперь в master есть все события: A1, A2, A3, B1, B2, C1 и C2. Но в ветке C всё ещё нет ни B1-B2, ни A3.
Ну и заключительный коммит A4 базируется уже на полной истории всех событий. А отметка head указывает, что версия, с которой происходит работа, соответствует этому моменту, когда B и C слиты в master и сделан коммит A4.
Программистам этот рассказ может показаться слишком упрощённым — приношу за это свои извинения.
А давайте вообще попробуем пофантазировать.
[🖼️ Двухмерная диаграмма: по вертикали временные измерения, по горизонтали пространственные. На отметке "три пространства и одно время" подпись "мы здесь".] [6] Spacetime dimensionality, ColeLoki [7] и Scalable Vector Raccoon [8], Wikimedia Commons [9] Мир с четырёхмерным пространственным измерением и одномерным временем считается нестабильным. Однако можем ли мы представить себе четырёхмерный объект? Например, тессеракт, фигуру, состоящую из восьми кубов, в которой все углы прямые, а все отрезки имеют одинаковую длину? Если опустить прямоту углов, можно сделать проекцию тессеракта на двухмерное или трёхмерное пространство, так же, как при изображении куба на плоскости часть углов утрачивает фактическую прямоту.
А двухмерное пространство можно представить? Казалось бы, легкотня — вон, на экране картинка двухмерная. Однако, есть нюанс. Мы смотрим на экран сбоку, а не с плоскости экрана, и поэтому видим картинку. А как выглядит двухмерный мир для его обитателя? Добавлю к этому, что в двухмерном мире нет привычной нам толщины, то есть плоский и бесконечно тонкий наблюдатель смотрит будет смотреть на такие же объекты.
Про одномерные или пятимерные пространства я вообще предпочту промолчать.
Таким образом, можно прийти к самому главному. Двухмерное время можно представить себе только в виде проекции, причём довольно грубой и дискретизированной на отдельные события. Можно спроецировать двухмерное время на одномерное — события просто выстроятся в линию. Можно спроецировать двухмерное время на двухмерное пространство, так же, как одномерное время мы визуализируем в виде хронологической шкалы — возможно, получится график наподобие примера с гитом. Но представить его себе мы не сможем, будучи существами, живущими в 3+1-мерном пространстве. Так же, как не сможем представить и движение в двух временах сразу.
Впрочем, пофантазировать и представить, что контроль версий создаёт миры с двухмерным временем — забавно.