Про контекст, свойства и применимость
Будучи довольно лояльным к человеческому невежеству как таковому, я крайне нелегко переношу воинствующую глупость. Когда кто-то чего-то не понимает, я могу часами терпеливо объяснять. Как только в ответ начинают раздаваться логически противоречивые аргументы, мне с трудом удается удержать себя в руках.
Продолжительное время я ошибочно полагал, что это связано с неспособностью людей к построению силлогизмов и непониманием базовых основ логики. Но меня свербила мысль: ведь эти люди в массе своей зарабатывают деньги умственным трудом, который, как мне казалось, в принципе невозможен без применения логических умозаключений.
Сейчас мне кажется, что проблема немного тоньше. Даже люди, вполне способные оперировать логикой без явных нарушений аксиоматики, теряются в проекциях. Сродни тому, как художник, идеально владеющий приемами передачи трехмерного изображения, может внезапно повесить полку под значительным углом: ведь он поверял горизонт аксонометрией, отходя на три шага назад и на два влево.
Контекст — неимоверно важный в любой непонятной ситуации конструкт. Для ограниченной выборки — далеко не всегда работают те же самые законы, что заведомо применимы для бесконечной вселенной. Сужение пространства измерений — изменяет и аксиоматику, делая взрослые законы не неверными, но — малоприменимыми.
Совсем недавно я ввязался в дискуссию об иноагентах, которая закончилась, практически не начавшись, стоило мне заявить, что в данном контексте я не вижу никакой разницы между «Медузой» и «Раша Тудей», которую вообще забанили на доброй половине земного шара. «Разница есть», — возражали мне неглупые собеседники, совершенно не осознавая того факта, что все отличия лежат в плоскости, перпендикулярной обсуждавшемуся тезису. Если мы говорим про цензуру, то она не зависит от того, нравится, или нет, нам сам объект цензуры. Если можно запретить «Mein Kampf», то можно и Мандельштама. С точки зрения запрета на открытую публикацию — авторство и содержание текста не имеет ровным счетом никакого значения (пока цензоры не возомнили себя Богом, которому положено решать, что хорошо, а что плохо, конечно).
Огромное количество примеров такой логической слепоты можно найти и в разработке программного обеспечения; в основном — в тестировании. Люди зачастую не отдают себе отчет в том, что же на самом они тестируют. Аргумент «кухонный комбайн не работает, потому что он не может нашинковать капусту» — выглядит странновато, если заметить, что в данный момент он оснащен насадкой для выжимания сока.
Умные люди около двадцати лет назад придумали Property-Based Testing, или тестирование свойств, для изоляции и устранения этой ошибки. Сущность, будь то вышеупомянутый кухонный комбайн, либо кусок кода, отвечающий за запуск баллистической ракеты, должна обладать некоторыми свойствами. Эти свойства даже могут быть взаимно противоречивы, если попытаться их проверить вместе: например, автомобиль не является неисправным, если он не может заправляться бензином на ходу.
Вычленение и описание этих самых свойств — задача не из самых тривиальных. Чем сложнее система — тем больше будет связности между различными ее частями. Например, в качестве необходимых свойств карандаша — можно выделить возможность оставлять след на бумаге если грифель торчит, и возможность оголить грифель при помощи подручных средств в противном случае. Еще раз мимоходом отмечу, что карандаш не обязан предоставлять возможность заточки в процессе письма.
Минимальная связность свойств — показатель хорошо спроектированной системы; грузовики «Вольво», собранные, как из конструктора, из блоков, — позволяют практически мгновенную замену кабины или кузова. Чем больше связность — тем сложнее выделить и обосновать какие-либо внятные свойства.
Когда мне приходится строить архитектуру нового проекта, я первым делом задаю себе вопрос: где у нас тут та перфорация, по которой можно будет эту систему разбить на множество мелких, для каждой из которых впоследствии будет просто определить свойства, реализовать их и протестировать? Хорошая архитектура позволит обойтись минимумом так называемых «интеграционных тестов», потому что если петли удобно крепить на раму, а дверь — навесить на них, нам не потребуется звать троих крепких друзей, которые будут держать дверь, пока я привинчиваю ее к косяку.
Возвращаясь к вопросу логических умозаключений, не могу устоять против соблазна дать бесплатный непрошеный совет: каждый раз, когда вы анализируете какой-либо событийный ряд (будь то неотвеченный вашей подругой телефонный звонок, или фиаско Непобедимой армады в Гравелинском сражении) — постарайтесь отделить зерна от плевел, аккуратно сузить, спроецировать аксиоматику большого мира до данной чрезвычайной ситуации, и только потом приступайте к анализу.
Квантовая теория поля не поможет ни изобрести колесо, ни понять, почему лучше всего его сделать круглым.