Нечего на зеркало пенять, коли рожа кривая. Сочинения по темам

  • Перевод

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

Этот процесс называется отладка. Каждый день, каждый программист предстает перед тем фактом, что когда он пишет код - он создает и ошибки в коде. И как только он понимает, что его программа не работает, он должен искать проблемы, которые сам же и создал.

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

Некоторые языки программирования, такие например как С, чрезвычайно восприимчивы к таким видам ошибок, которые появляются и исчезают случайным образом, и как только вы начинаете разбираться в причине их появления они сразу пропадают. Такие ошибки часто называют Гейзенбагами , потому что как только вы начинаете их искать, они исчезают.

Такие ошибки могут возникать в любом языке программирования, особенно при написании многозадачного кода, где малейшие задержки во времени могут вызвать состояние гонки . Но в C есть другая проблема - утечка памяти.

Однако, что бы не вызвало ошибку, ключевые шаги при поиске проблемы всегда следующие:

  • Найти наименьшую закономерность, при которой ошибка полностью воспроизводится. С гейзенбагами это может оказаться сложным, но даже небольшой процент испытаний, при которых ошибка воспроизводится является значимым.
  • Автоматизировать процесс испытаний. Намного лучше, когда можно запускать тест снова и снова. Можно даже сделать его частью программы, когда ошибка будет устранена - это не допустит появления ошибки вновь.
  • Искать причину, пока не будет найдена её основа. До тех пор, пока вы не найдете истинную причину возникновения ошибки, вы не можете с уверенностью говорить, что вы её исправили. С гейзенбагами можно очень просто сбиться с толку, полагая, что вы исправили ошибку, после того как она вдруг исчезнет после того что вы сделаете в процессе поиска.
  • Исправить причину и проверить с помощью шага 2.
Недавно, в Hacker News появилась стаьтя - Если у вас гейзенбаг в С - значит проблемма в вашем оптимизаторе компилятора . Это очень неверное суждение.

Компилятор, который вы используете, вероятно, используют тысячи людей, в то время как вашу программу используете скорее всего только вы. Как вы думаете, что, компилятор или ваша программа работает наиболее стабильно?

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

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

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

В статье выше есть один определенно не завершенный пример:

«Отключите оптимизатор и проверьте программу снова. Если она работает - значит проблема в оптимизаторе. Поиграйтесь с уровнями оптимизации, поднимая уровень до тех пор, пока ошибка не начнет воспроизводится.»

Все что вы знаете когда меняете уровни оптимизации - это то, что уровни меняются независимо от того, появляется ошибка или нет. Это не говорит вам о том, что оптимизатор работает неверно. Вы не нашли искомую причину ошибки.

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

Вот конкретный пример программы на C которая содержит ошибку, появляющуюся при изменении уровня оптимизации компилятора, и показывает странное поведение программы.

#include

Int a()
{
int ar;
ar = (getpid() % 19 == 0);
}

Int main(int argc, char * argv)
{
int rc;
rc = 0;
a();
return rc;
}

Скомпилируйте эту программу с помощью gcc под Mac OS X с помощью следующего Makefile (я сохранил код в файле odd.c).

CC=gcc
CFLAGS=

И вот пример скрипта, который запускает программу 20 раз и выводит результат:

#!/bin/bash
for i in {0..20}
do
./odd ; echo -n "$? "
done
echo

Если вы запустите этот скрипт, вы будете ожидать строку нулей, поскольку rc никогда не получает значений отличных от нуля. Однако вот пример работы программы:

$ ./test
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Если вы опытный программист C, вы увидите как я сделал чтобы появлялась единица, и почему она появляется в разных местах. Но давайте теперь попробует отладить программу с помощью printf:

[...]
rc = 0;
printf("[%d]", rc);
a();
[...]

Теперь, когда вы запустите программу, ошибка исчезнет.

$ ./test
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

Выглядит странно, поэтому вы перемещаете printf в другое место:

[...]
rc = 0;
a();
printf("[%d]", rc);
[...]

И получаете тот же странный результат с исчезновением ошибки. И то же самое произойдет если вы отключите оптимизатор и даже без printf ошибка не будет появляться:

$ make CFLAGS=-O3
gcc -O3 -c -o odd.o odd.c
gcc odd.o -o odd

$ ./test
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Это все происходит, потому что ф-я a() выделяет память для 16-ти Integer элементов. И тут же записывает после конца массива либо 1 либо 0 в зависимости от того, делится ли PID процесса на 19 или нет. В конечном итогде она записывается в rc из-за расположения в стеке.

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

Т.к. C очень восприимчив к этому типу ошибок, важно использовать хорошие инструменты для проверки таких проблем. Например статический анализатор кода

/ / / «На зеркало неча пенять, коли рожа крива» (эпиграф и сюжет комедии Гоголя «Ревизор»)

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

У знаменитой творческой работы Н.В. Гоголя « » есть свой эпиграф. «На зеркало неча пенять, коли рожа крива». Прочитав его впервые, читатель не сразу может понять, о чем идет речь. Но, углубляясь в текст комедии, мы понимаем, о чем же, все–таки, писал автор.

Достаточно интересен тот факт, что ключ к своей творческой работе Гоголь подобрал не сразу. Только через некоторое время после того, как текст комедии облетел всю Россию, Николай Васильевич присвоил работе такой эпиграф.

Конечно, критике его работы не было предела. А все потому что, многие лица, проживавшие в России того времени, узнали себя и свои повадки в главных героях комедии. А кто же хочет признаваться в содеянных поступках и выносить их на всеобщее высмеивание. Конечно же, никто! Это и решил сделать Гоголь в строках «Ревизора».

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

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

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

После прочтения всего «Ревизора» мне полностью понятен и объясним эпиграф, который предложил

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

    ПЕНЯТЬ, пеняю, пеняешь, несовер. (к попенять), кому чему за что и на что или на кого что за что (разг.). Сетовать, жаловаться на кого нибудь, выговаривать кому нибудь, укорять кого нибудь. «Нечего на зеркало пенять, коли рожа крива.» (посл.) «Он… … Толковый словарь Ушакова

    Толковый словарь Ушакова

    1. РОЖА1, рожи, жен. 1. Лицо (прост.). Пьяная рожа. «И по роже его видно, что он за штука.» Чехов. «Но ведь, пожалуй, по роже съездит и он между тем.» Некрасов. «Проказник мой у зеркала сквозь слез так кисло морщит рожу.» Крылов. «Нечего на… … Толковый словарь Ушакова

    1. РОЖА1, рожи, жен. 1. Лицо (прост.). Пьяная рожа. «И по роже его видно, что он за штука.» Чехов. «Но ведь, пожалуй, по роже съездит и он между тем.» Некрасов. «Проказник мой у зеркала сквозь слез так кисло морщит рожу.» Крылов. «Нечего на… … Толковый словарь Ушакова

    ЗЕРКАЛО, зеркала, мн. зеркала, зеркал, зеркалам, ср. 1. Блестящая (стеклянная или металлическая), особым способом отшлифованная поверхность, отражающая лучи света так, что на ней получается отображение находящихся перед ней предметов. «Нечего на… … Толковый словарь Ушакова

    пенять - «пеняй на себя!» говорят, подчеркивая, что человек сам несет ответственность за свой поступок. А еще говорят: «Нечего на зеркало пенять, коли рожа крива», то есть, не жалуйся на других, если сам виноват. Глагол пенять – сетовать, укорять ведет… … Занимательный этимологический словарь

    ЗЕРКАЛО, а, мн. ала, ал, алам, ср. 1. Предмет со стеклянной или металлической отполированной поверхностью, предназначенный для отображения того, что находится перед ним. Напольное, стенное, настольное, ручное з. Стены в зеркалах. Туалетный столикТолковый словарь Ожегова

    пенять - кому, за что и на что. Зиночка пеняла ему за то, что он оставил ее одну (Б. Полевой). На зеркало нечего пенять, коли рожа крива (пословица) … Словарь управления

    Яю, яешь; нсв. (на кого что). Разг. Жаловаться, сетовать. * На зеркало нечего пенять, коли рожа крива (Посл.). // обычно кому. Выговаривать, выражать недовольство по поводу чего л. ◊ Пеняй (пусть пеняет) на себя. Обвиняй только себя (в том, что… … Энциклопедический словарь

«На зеркало неча пенять, коли рожа крива», - народная пословица, эпиграф к «Ревизору».

Когда кривизна рожи приобретает параметры фантасмагорические, - возникает театр абсурда. Великий театр, главные истоки и начала которого - в русской прозе, русской драматургии XIX века. Драматургии, которая имеет свойства на решающих исторических перекрестках рождаться заново, и, персонажи ее, оглядываясь по сторонам, обращаются к нам с вами с вопросом: где это мы?

Жилище Михал Васильича Кречинского, расположенное по адресу Новый Арбат, 11(там показывает премьеру театр «Эрмитаж» - пьесу Сухово-Кобылина «Свадьба Кречинского» в постановке Михаила Левитина) освящает портрет якобы сановного предка. Портрет выполнен в той манере, что повесь его вверх ногами, вкось-вкривь - вряд ли это будет замечено. Однако Михал Васильич, приглядевшись, себя в кривизне сановного портрета, наверное, узнает. Ибо он - большой знаток по этой части, по части окружающей кривизны, картинной и всякой прочей. Не только знаток, - архитектор, создатель. Таким и играет его Евгений Редько.

Сказать: русский абсурд - это еще не сказать почти ничего. Русский абсурд - он ведь чрезвычайно, ошеломительно разный.

Гоголевский смех сквозь слезы, когда волна сочувствия захватывает вас при взгляде не только на Подколесина с Агафьей Тихоновной, но и на Городничего с его семейством.

В спектакле «Балалайкин и К°» (1973 год, Товстоногов, «Современник», по «Современной идиллии» сурового, беспощадного Салтыкова-Щедрина) самые пронзительные моменты - это отчаянные вспышки стыда, случившиеся в душах мучительно оподляющихся персонажей.

В Кречинском Евгения Редько - ни капли стыда, в спектакле Михаила Левитина - ни грана сочувствия, а кривизна рож - это не обязательно кривизна рож, но обязательно - кривизна душ.

Иногда слышишь: обаяние зла. Что это такое? Кречинский в спектакле «Эрмитажа» - воплощение этого обаяния. Безусловно верится на слово, когда узнаешь, что глупенькая Лидочка Муромская - далеко не первая его жертва. Кречинский Евгения Редько - человек всесокрушающей страсти: игра, авантюра, деньги, власть - ступенька за ступенькой, а сорвалось - ну что ж, начнем заново.

Мне представлялось, что «Свадьба Кречинского» - это особняком, это еще в русле Островского, не совсем Сухово-Кобылин. В спектакле Левитина - не так. Здесь, пожалуй, весь Сухово-Кобылин сыгран, со стилистическими, смысловыми заходами и в «Дело», и в «Смерть Тарелкина».

Ну вот - окружение Кречинского. Если сказать деликатно - команда, если сказать точно - стая, где Кречинский - вожак.

Камердинер Федор - артист Александр Пожаров. Казалось, служебный персонаж. Написано - совсем немного реплик. Сыграно - через обмен с Кречинским взглядами, жестами, когда и полслова не нужно для полного взаимопонимания - сыграно многолетнее сотрудничество опытнейших двоих, из которых каждый точно знает свое место. Федор - для поддержания обыденной респектабельности.

Расплюев - для выполнения поручений сомнительных, грязных. Здесь, в исполнении артиста Константина Тумиловича, кривизна зашкаливает. Здесь - не обаяние зла, а его обноски. Вспоминаются гротески раннего Ильинского, Гарина, Мартинсона. Подумал - не слишком ли? Да нет, не слишком. Надеюсь, сказанное, молодому артисту не повредит.

Обноски - не выбросить ли за ненадобностью? Нет, нельзя выбрасывать. Все трое - Кречинский, Федор, Расплюев - так повязаны, что порознь им уже не выжить. Тем более, за ними - напрягите немного воображения - угадываются помощники, советники, менеджеры, киллеры, секретари. Стая, жадно захватывающая жизненное пространство.

Такой захват - работа не из сложных, и в этом - наигорчайшая горечь представления на Новом Арбате, 11. Кто годится, кем гордится? Это из Маяковского. Тетушка Анна Антоновна (артистка Дарья Белоусова) с ее тяжким сдвигом по фазе на почве светского блеска-треска? Кривоногий (опять кривизна!) уродец Нелькин (артист Станислав Сухарев) - ну, куда ему против Кречинского, даже и проигравшегося? Муромский (артист Сергей Олексяк), дочка его Лидочка (артистка Алла Черных) при их-то стабильном местопребывании на пустом месте?

В ряд бараны идут,
Бьют барабаны.
Кожу для них дают
Сами бараны.

Это - из Бертольта Брехта.

Наверное, можно сострадать и баранам, но вдруг - ни с того, ни с сего - о другой живности вспомнилось.

Где-то прочел: в Москве появились живодеры, которые, перекрывая единственный выход из подвала своего дома, замуровывают там бездомных кошек, нашедших приют на зиму. И подумалось: какое чувство бы я испытал, услышав стон замурованной кошки?

Бездомных кошек нынче много, и крики их перемешиваются с криками человеческими.

В спектакле Левитина нет ни баранов, ни кошек, но свой зверинец есть, как не быть. Кречинский впервые появляется на сцене в обличии бычка с красными глазами, ведя за собой цепочку подведомственных ему персонажей. (В «Тени» Шварца, одном из предыдущих спектаклей Левитина, Тень, в исполнении того же Евгения Редько тоже водила за собой послушный хоровод, но там она была все-таки тенью, а здесь, в «Кречинском», укрепилась, укоренилась настолько, что впору самой тени отбрасывать.)

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

И захотелось вдруг закричать: это не я - кривоногий уродец! И тяжкий сдвиг по фазе - не у меня! И чужой это стон из замурованного подвала. Чужой! Чужой… А вдруг - не чужой?

Так что, чего уж пенять на зеркало. Безмерный русский абсурд. Одна из его ипостасей.

Допускаю, что спектаклю «Свадьба Кречниского на Новом Арбате 11» не хватает гуманистического начала. Но как быть этого начала достойными - вот о чем тоже не мешает подумать. Нам всем. Для того хотя бы, чтобы не оказаться на грани не вполне гуманистического конца.