После употребления молока вы:

а) верните коробку туда, где вы ее нашли в холодильнике

б) верните коробку в любое свободное место в холодильнике

c) оставить коробку на кухонном столе

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

Детали имеют значение, и симметрия помогает вам управлять ими. Верните молоко туда, где вы его нашли. Закройте файлы, которые вы открыли. Свободная память, которую вы выделили.

Во время выступления о Java, управлении памятью и сборке мусора один спикер (не помню его имени) объяснил, почему Java не подходит для встраиваемых систем. Симулируя сердечный приступ, он схватился за грудь и рухнул на трибуну. Через несколько мгновений он поднял руку, говоря: «Я в порядке, я в порядке. Это просто мой кардиостимулятор занимается сбором мусора».

C не имеет такого ограничения, и проще говоря, для каждого malloc() должен быть free(). Однако бывают ситуации, которые искажают симметрию, например, функция strdup(), которая выделяет память для повторяющейся строки. Отнеситесь к этому как к malloc(), и все будет в порядке. Иногда обработка ошибок может заставить вас преждевременно отклониться от пути выполнения и, таким образом, случайно обойти функцию free(). В этом случае вам нужно будет не забыть закодировать еще один free() или рисковать утечкой памяти.

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

Ясно, что симметрия практична и красива и выходит за рамки информатики. Его можно увидеть в биологии (расшифровка ДНК), химии (форма бензола) и физике (квантовая механика). Симметрия также очевидна в искусстве, моде и рассказывании историй. И здесь у нас есть Java, а совсем недавно и Rust, пытающиеся отобрать часть этого. Аргумент состоит в том, что, обрабатывая эти мелкие детали, программист может сосредоточиться на понимании проблемы и кодировании решения. Но при этом упускается тот момент, что практика использования симметрии для решения проблем бесценна.

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

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

Автомобили – еще один беспроигрышный вариант. Я когда-то знал женщину, у которой была серьезная внешняя сила и супер-впечатляющая карьера. Но ее машина была в отвратительном беспорядке: обертки от фаст-фуда повсюду, а багажник превратился в мини-свалку. Однажды она везла нас куда-то и попросила меня вытащить из сумочки бумажник; моя рука вернулась испачканная помадой. Ик. Неудивительно, что ее финансовая жизнь тоже была в беспорядке.

Если вы страдаете от утечек памяти и переполнений буфера, никакой язык не сделает вас лучшим программистом. Но мысли о симметрии вполне могли бы.