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

Код

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2 комментария:

  1. Хорошая статья. но динамическое равновесие понимается упрощенно. Система работает на этом равновесии, но если посмотреть более масштабно, существует процесс системного дисбаланса без идеальной целостности. Если перевести на тему кода, то если не стремится привести код к единству, к некоторому идеальному состоянию, а искать меру хаоса и порядка, то это и будет в масштабном смысле хаос. важно понимать не только горизонталь, но и вертикаль происходящего. в биологии тоже самое. именно целостность - единство задачи организма - жить, приводит к равновесию. а не равновесие устанавливается само. Вот с пловцом то же, если пловец имеет задачу плыть, нацелен, то маленькая остановка, мини"утопление" не играет роли, но если начать выстраивать равновесие плыву - не плыву, вне общей целостной задачи, то теряется не только пловец и в прямом, и в переносном смысле, но нет и источника динамического равновесия. Это так для размышления.

    ОтветитьУдалить
    Ответы
    1. Офигеть, кто это такой умный)

      Ну, наверное, да: если просто вливать в систему немного порядка, чтобы уравновесить хаос, то с высоты это будет выглядеть как всё тот же самый хаос.
      Чем-то напомнило правило "целесообразности" как "не цели самой по себе, а цели, за которой следует более высокоуровневая цель".

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

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

      Удалить