Представьте, что вам на собеседовании дали задачу: спроектировать систему доставки газа по трубам переменного давления, причём система должна загружаться почти на 100% в зоне высокого давления, а разгружаться (быстро и почти полностью) в зоне низкого. Вы бы, наверное, нарисовали линейную зависимость. Больше давления — больше загрузка. Просто, и главное, что будет легко тестировать.

Эволюция посмотрела на этот вариант, подумала 500 миллионов лет и сделала всё наоборот.


Техзадание от природы

Предлагаю чуть формализовать. У нас есть два «дата-центра»:

  • Лёгкие — давление кислорода ~100 мм рт. ст. Тут надо загрузиться по максимуму.

  • Ткани — давление ~20–40 мм рт. ст. Тут надо отдать почти всё.

И есть молекула, которая мотается между ними по кровотоку. Задача: максимизировать разницу между «загрузился» и «разгрузился».

Если вы инженер (а вы, возможно, инженер), первая мысль — линейная зависимость, где загрузка пропорциональна давлению. То есть чем больше кислорода вокруг, тем больше связалось. Честный и весьма понятный даже школьникуy = kx.

Но проблема в том, что линейная кривая это палка о двух концах для этой задачи.

Вот посмотрите. При линейной зависимости разница насыщения между 100 мм рт. ст. и 40 мм рт. ст., ну, примерно 60% от максимума. Вроде нормально? К сожалению нет. Потому что в реальности ткани хотят получить кислород именно в узком диапазоне давлений, и линейная зависимость отдаёт его слишком равномерно (понемножку на каждом миллиметре давления). Как микросервис, который размазывает CPU по всем запросам одинаково, вместо того чтобы приоритизировать.


S-кривая, или «нелинейность как фича»

Гемоглобин — белок из четырёх субъединиц, каждая может связать одну молекулу O₂. Казалось бы, четыре независимых слота. Четыре boolean-а. Давайте загрузим по одному.

Но тут тоже нет.

Когда первая молекула кислорода садится на первую субъединицу, происходит конформационное изменение — белок меняет форму. И эта новая форма делает посадку второй молекулы легче. Вторая делает легче третью. Третья (соответственно) четвёртую.

binding_affinity[0] = LOW;    
binding_affinity[1] = MEDIUM; 
binding_affinity[2] = HIGH;   
binding_affinity[3] = VERY_HIGH; 

Это называется кооперативное связывание. И это даёт не прямую линию, а S-образную (сигмоидальную) кривую насыщения.

Внизу по давлению — кривая ползёт еле-еле., почти плоская. Гемоглобин упирается, не хочет брать кислород, а потом резкий взлёт (почти вертикальный). А уже наверху снова плато, насыщение под 98–99%.

А дальше...

При 100 мм рт. ст. (лёгкие) гемоглобин насыщен на ~98%. При 40 мм рт. ст. (ткани в покое) — на ~75%. При 20 мм рт. ст. (работающая мышца) — на ~30–35%. Разница между «загрузился» и «разгрузился» огромная, и именно в том диапазоне давлений, где это нужно.

Линейная зависимость дала бы при тех же параметрах разницу процентов в 60. Сигмоида даёт 65–70. Кажется, мелочь? Но это 65–70 на каждом цикле кровообращения, 70 раз в минуту, 24 часа в сутки. На масштабе — разница между «побежал за автобусом» и «упал в обморок, пытаясь встать с дивана».


Уравнение Хилла, или коэффициент кооперативности

Математически это описывает уравнение Хилла:

Y = (pO₂)ⁿ / ((P₅₀)ⁿ + (pO₂)ⁿ)

Где Y — степень насыщения (0 до 1), pO₂ — парциальное давление кислорода, P₅₀ — давление, при котором насыщение = 50%, а n — коэффициент Хилла.

Вот этот n и есть вся суть.

При n = 1 — обычная гипербола. Так работает миоглобин (одна субъединица, без кооперативности). Загружается быстро, отдаёт неохотно. Хороший складской работник, паршивый курьер.

При n = 2.8 (реальный гемоглобин) — та самая сигмоида. Медленный старт, резкий переход и быстрое насыщение. Если б n было ровно 4 (по числу субъединиц), то это была бы идеальная кооперативность, все четыре сайта переключаются одновременно, как бистабильный триггер, но о природа не дотянула до 4. И, возможно, специально.

(Потому что если n = 4, система становится слишком «бинарной» — либо полностью загружен, либо полностью пуст. Никакой тонкой настройки. А n = 2.8 — это sweet spot между кооперативностью и гибкостью. Эволюция, проще говоря, нашла оптимум, который мы бы назвали «хорошим trade-off между throughput и latency».)


Эффект Бора: context-aware оптимизация

Ладно, S-кривая — это интересно, но гемоглобин пошёл дальше.

Работающие ткани производят CO₂ и молочную кислоту. pH падает, температура растёт ,и гемоглобин это чувствует. При снижении pH кривая сдвигается вправо и белок начинает отдавать кислород ещё активнее при том же давлении.

Это как если бы ваш балансировщик нагрузки не просто раскидывал запросы по round-robin, а мониторил температуру CPU на каждом сервере и автоматически перенаправлял трафик на холодные ноды. Только это не какой-нибудь навороченный service mesh — это одна молекула, четыре субъединицы, пара протонов.

Христиан Бор (отец того самого Нильса Бора, квантовая механика, судя по всему, передаётся генетически) описал этот эффект в 1904 году. (за 40 лет до того, как люди поняли структуру ДНК, между прочим).

# Эффект Бора в псевдокоде
if ph < 7.4 or pco2 > 40 or temperature > 37:
    p50 += delta  # сдвиг кривой вправо
    # отдаём O2 активнее

Элегантно? Как по мне — очень. Один и тот же белок одновременно транспортирует O₂, сенсит pH, реагирует на температуру и всё это без единого if-а в привычном нам смысле. Чистая биохимия, чистые аллостерические взаимодействия.


Серповидноклеточная анемия: баг, который не фиксят

А теперь баг, который прошёл code review эволюции и остался в продакшене.

Серповидноклеточная анемия — одна точечная мутация в гене β-глобина, лдна аминокислота: глутаминовая кислота → валин. В позиции 6. Шестой символ в строке длиной 146. Один char.

- ...Val-His-Leu-Thr-Pro-Glu-Glu-Lys...
+ ...Val-His-Leu-Thr-Pro-Val-Glu-Lys...

Этот один символ меняет всё. Мутантный гемоглобин (HbS) при низком давлении кислорода начинает полимеризоваться — молекулы слипаются в длинные жёсткие нити. Эритроцит из мягкого пончика превращается в серп. Серпы застревают в капиллярах, рвут сосуды, вызывают адскую боль, инсульты, отказ органов.

Очень тяжёлая болезнь. До современной медицины это часто была смерть в детстве.

И вот вопрос: почему естественный отбор не выкосил эту мутацию за тысячи лет?

Потому что гетерозиготы (одна нормальная копия, одна мутантная) получают устойчивость к малярии. Плазмодий — паразит, который живёт внутри эритроцитов, — не может нормально размножаться в клетках с частичным содержанием HbS. Эритроцит деформируется, селезёнка его утилизирует вместе с паразитом. Грубо говоря, организм выкидывает заражённые контейнеры до того, как инфекция расползётся по кластеру.

Если посмотреть на карты, то это видно буквально: частота гена серповидноклеточности совпадает с ареалом малярийного плазмодия. Африка, Ближний Восток, Индия, Средиземноморье. Там, где малярия убивает, мутация спасает. Там, где малярии нет, — мутация просто вредит и вымывается отбором.

Это же классический полиморфизм, поддерживаемый балансирующим отбором. Или, если по-нашему, — это feature flag, который в одном окружении критичный баг, а в другом — конкурентное преимущество. И вы не можете его просто выключить, потому что для части пользователей он в проде держит SLA выше нуля.


Почему «неправильное» решение работает 500 миллионов лет

Мне кажется, что если бы кто-то принёс гемоглобин на архитектурное ревью, его бы разнесли.

— Подождите, у вас четыре субъединицы, и они все влияют друг на друга?!
— Один белок отвечает за транспорт, сенсинг pH, буферизацию CO₂ и регуляцию сосудистого тонуса? Single Responsibility Principle — не, не слышал?
— А мутация одного символа может положить всю систему? У вас что, нет валидации входных данных?

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

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

500 миллионов лет, без рефакторинга, на одной кодовой базе, и с обратной совместимостью от рыб до людей.

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

Комментарии (14)


  1. Stic_t
    31.03.2026 08:26

    Мне кажется, что если бы кто-то принёс гемоглобин на архитектурное ревью, его бы разнесли.

    Прокекал с этого.

    Тут как и не понимание биологии так и не понимание программирование и систем разработки.

    Первый и последний аргумент что рушит основной тезис статьи. Это то

    Что человек как биологический организм не появился едимоментно.

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

    И система не материализуется из ничего а проходит большой путь через поколения с постепенным изменениям из предыдущих систем.

    А ревью по сути заменило тестирование. Большое тестирование.

    Оно называется теория эволюции. Естественный отбор.

    Если изменения были плохие, то изменения не закреплялись. А качество изменений измерялось тем, смога ли особь выжить и оставить потомство.

    Почему гемоглобин сделан плохо по вашему ? Потому что остальные варианты не закрепились и либо мешали выжить, или не помогали этому.


    1. inkedsymon Автор
      31.03.2026 08:26

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


    1. xSVPx
      31.03.2026 08:26

      С отбором есть проблема. Точнее две:

      1.Его больше нет :(.

      2. Он очень долгий, надо много поколений

      В результате организм человеков адаптирован не под текущие условия, а под те, что были скажем пару тысяч лет назад (как минимум).

      И поэтому кажется, что где-то что-то сделано весьма неоптимально. А оно оптимизировано для мира без антибиотиков и прививок.


      1. domix32
        31.03.2026 08:26

        1.Его больше нет :(.

        чёйта вдруг? Это не то что вы можете остановить.


        1. cruiseranonymous
          31.03.2026 08:26

          Антибиотики, например, прирезали знатно отбор по стойкости организма.
          Пока плохоприспособленные к локальным условиям люди умирали в младенчестве так, что даже им имён не давали пока не проживёт хоть недельку, а из проживших до совершеннолетия доходила далеко не половина - был отбор.
          Как медицина стала откачивать слабых, воду научила кипятить-обеззораживать, а всякие там апендициты(который исторически при воспалении === смерть "животом сильно мучался, да и помер") надёжно удалять без проблем - так, по факту, отбор само себе человечество и отключило. Какие от этого долговременные последствия будут для человчества как вида - пока неведомо. А вот для индивидов как раз отлично, это реально благо. Чутка сбойнувший организм/иммунитет больше не приговор, пневмония под 40 не гроб-гроб-кладбище, и даже Хокинг смог работать.

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


          1. tetris_big_gravity
            31.03.2026 08:26

            «“Медицина отключила отбор” — звучит красиво, но нет. Отбор не выключается, он меняет правила игры.Мы заменили “умер от аппендицита в 20” на более сложные факторы — поведение, интеллект, кооперация и т.д. Это называется не сбой, а адаптация.
            Если вид эволюционировал до способности лечить себя и менять среду — это не ошибка а, внезапно! успех


            1. cruiseranonymous
              31.03.2026 08:26

              Мы заменили “умер от аппендицита в 20” на более сложные факторы — поведение, интеллект, кооперация и т.д.

              Только это уже "cultural selection", причём внутривидовой, а не исходный natural selection, который про "survival of the fittest к местным условям природы вообще" а не про "в рамках города у вон того самца больше доступных самок". Человек перекроил природу вокруг себя, и тем остановил для человечества как вида отбор натуральный, как минимум в части младенческой смертности и прочих порезов-воспалений-травм. Эволюция как процесс осталась, а отбор остановился. Если(скорее, когда) антибиотики снова перестанут работать - то, может, и снова возобновится.


      1. nakesreong
        31.03.2026 08:26

        С отбором есть проблема. Точнее две:

        он действительно долгий. до такой степени долгий, что нельзя говорить о том что "его больше нет", основываясь на каких-то жалких 2 тысячах лет современной цивилизации и даже ~10К существования человека почти в современном виде

        до этого наш вид, а вернее даже род Хомо, буквально миллионами лет бил камнем о камень, без всяких там антибиотиков и прививок. очень успешно

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

        эволюция это вообще рулетка, она не гарантирует что вид получит лучшие признаки из возможных. вообще. иначе бы у нас все травоядные ходили бы как дикобразы (эти твари леопарда останавливают!). но увы, повезло с признаком только им. а собаки бегают с доп пальцами на лапах (полидактия очень распространена) - толку от мутации нет, но размножаться и оставлять потомство не мешает. вот и закрепилась


    1. MountainGoat
      31.03.2026 08:26

      Если изменения были плохие, то изменения не закреплялись.

      Увы, если бы это было так. Но хоть у жирафа спросите, что он по этому поводу думает.

      "Если первое попавшееся решение вроде бы хоть как-то работает, то так и оставляем" - вот девиз эволюции.


      1. Denis_Chernyshev
        31.03.2026 08:26

        Совсем не так. Цикл рефакторинга начинается с мутации. Мутация вроде бы ошибка в коде, но белковый код не алгоритмический, поэтому пока неизвестно, мутация - это баг, или фича.

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


  1. Loratadin
    31.03.2026 08:26

    Как было бы классно, если б учебники в меде писали вот так. По нормальному! А не 70 страниц словоблудия, чтобы донести информацию о простенькой сети взаимодействий


  1. P6c6970
    31.03.2026 08:26

    лдна аминокислота

    Небольшая опечатка

    Интересный формат, спасибо за статью


  1. Slonisimo
    31.03.2026 08:26

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


  1. Kimimi
    31.03.2026 08:26

    Эволюция бы легко прошла. Кода там будет много, а как известно напиши 20 строк кода и тебе устроят разнос по каждой, напиши 1000 строк - скажут "выглядит норм"