Противоречие

Противоречие — взаимное исключение чего-то с чем-то, логическое отрицание друг друга, несогласие, несогласованность.

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

А.С. Пушкин

Разум человека развивается во многом за счёт обнаружения и преодоления противоречий. Например, в детстве нам кажется, что большие вещи всегда тяжелее маленьких. Под большим мы подразумеваем и тяжёлое, а под маленьким — лёгкое. И вот в один прекрасный день мы говорим, что воздушный шарик тяжёлый, а папина гантель — лёгкая. Сами чувствуем противоречие и, может быть, сами его преодолеваем. Так у нас зарождается представление о плотности веществ.

Когда мы конструируем Систему, противоречия также являются движущей силой развития. (Хотя бы потому, что наш разум развивается вместе с Системой.) Это проявляется по-разному. Работа Системы противоречит техзаданию — нам надо как-то улучшить эту работу, чтобы противоречия больше не было. Мы улучшили Систему, чтобы она перестала противоречить техзаданию, но оказалось, что это тоже плохо, — в самом техзадании есть противоречия. Спустя год успешной работы вдруг вылезла ошибка — появился словно из ниоткуда терм, не удовлетворяющий нашему паттерну, тоже противоречие, в котором надо хорошо разобраться и понять причины происшедшего.

Эрланг относят к декларативным языкам. Его выражения напоминают уравнения. С помощью знака = мы не присваиваем значение переменной, мы проверяем на истинность (что между левой и правой частью нет противоречия). Поэтому Эрланг, можно сказать, философичен. Он вдвойне философичен из-за своего отношения к противоречиям — легендарного “Пусть это рухнет!” Джо Армстронга.

Чего именно мы желаем, когда говорим “Пусть это рухнет”? Вряд ли мы хотим, чтобы наша Система вообще перестала работать. Мы, на самом деле, желаем вовремя и воочию увидеть возникшее противоречие, чтобы сделать из этого конструктивные выводы.

В Эрланге не принято злоупотреблять конструкцией try ... catch. Вместо этого есть акторы двух видов: работники и надзиратели. Первые содержат основной, полезный для нас код, выполняющий ценные для нас вещи. Этот код максимально нагляден и не замусорен проверками try ... catch. Такая ясность кода очень полезна при работе над ошибками и в целом для поиска причин противоречий.

Не следует бояться ошибок. К любой ошибке лучше относиться как к противоречию, развивающему Систему. В конце концов, есть даже такая техника — разработка ПО через тестирование (TDD), при котором изначально формируется полный пакет всевозможных противоречий.


Copyright © 2025 Алексей Карманов