Антихрупкость Нассима Николаса Талеба — это кладезь практических идей для разработчиков программного обеспечения, несмотря на то, что это не книга по разработке программного обеспечения.

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

Талеб отмечает, что в замыслах природы часто используется избыточность («Природа любит перестраховываться»):

«Уровни избыточности — это центральное свойство управления рисками природных систем. У нас, людей, есть две почки [...] дополнительные запасные части и дополнительные возможности во многих, многих вещах (скажем, легкие, нервная система, артериальный аппарат), в то время как человеческий дизайн имеет тенденцию быть запасным и обратно избыточным, так сказать — у нас есть исторический опыт участия в долгах, что противоположно увольнению»

Исходный код программного обеспечения является хорошим примером человеческого дизайна, который имеет тенденцию быть запасным (не имеющим лишнего жира) и обратно избыточным. Избыточности в коде традиционно избегают любой ценой. Фактически, одним из первых принципов, которым часто учат младших разработчиков, является СУХОЙ принцип — не повторяйтесь. Что касается DRY, то избыточный код — это беда, которую следует устранять везде, где она появляется.

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

Однако, как утверждает Талеб:

«Избыточность неоднозначна, потому что если не происходит ничего необычного, она кажется пустой тратой времени. За исключением того, что случается что-то необычное — обычно». [курсив добавлен]

Что это за «необычные вещи, которые обычно случаются» при разработке программного обеспечения? И как дублированный код может защитить нас от них?

Неправильная абстракция

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

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

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

С другой стороны, избыточность в виде дублированного кода делает код более надежным. Он делает это, избегая худшего зла введения неправильной абстракции. Таким образом, он ограничивает влияние неожиданных изменений бизнес-требований. Как утверждает Санди Мец: Дублирование намного дешевле неправильной абстракции

Правило трех

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

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

Назад к природе

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

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

Это все, чтобы сказать: идите вперед и бесстрашно копируйте и вставляйте больше кода 🙂

Ссылки и дополнительная литература

Неправильная абстракция

Пиши код, который легко удалить, а не расширить

Антихрупкость: вещи, которые выигрывают от беспорядка (Incerto)

Первоначально опубликовано на coderefinery.wordpress.com 28 января 2019 г.