понедельник, 21 марта 2016 г.

Код

Как и у каждого программиста, у меня есть свой взгляд на жизненный цикл «кода», под которым понимается любая «программа» или конгломерат «программ», работающий на ЭВМ.

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

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

В связи с этим, у меня выработалась такая «теория жизни кода».

Программист (он же архитектор) — как Бог. Он решает создать некую Вселенную из ничего.

Изначально ничего нет, как следствие нет и никаких проблем.

Вот появляются первые наброски примитивной архитектуры, и на ЭВМ запускаются первые работающие строчки кода. Код на этой ступени развития представляет собой что-то простейшее и одноклеточное, сродни амёбе. Амёбе много не нужно: плавает себе сама в своём бульоне и пожирает всё остальное, с чем соприкасается.

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

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

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

Так же и код — пока его мало, ему ничего не требуется, он не устаревает, он не накапливает «технический долг», в нём легко разобраться. Когда его становится много, то его требуется регулярно поддерживать в форме: что-то переписывать, выбрасывать старое, добавлять новое, «менять запчасти». Большой код всегда будет самораспадаться: с каждой прошедшей секундой он будет немного деградировать и приходить в запустение, даже если к нему никто не прикасается, и он «просто работает». И чем сложнее код, с тем большей скоростью он будет стремиться к состоянию хаоса.

И нет волшебного лекарства от этого: каких бы гениальных программистов вы ни наняли, каких бы великолепных менеджеров вы ни назначили — всё в этом мире сразу же с момента своего появления уже стремится к самораспаду. Это сродни дихотомии «жизнь — смерть», согласно которой одно неотделимо от другого, и всякая жизнь, как только она появляется, уже сразу несёт в себе смерть.

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

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

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