Что такое качественный код

Мы говорили о недавнем внедрении в работу особого типа инженерных практик, а именно о Code Review. Думаю, не лишним будет вкратце напомнить, что под Code review мы понимаем систематическую проверку кода с целью обнаружения ошибок, недочетов, расхождений, не замеченных на начальной стадии разработки. Инспекцию кода проводят периодически так называемые ревьюеры, при этом ими контролируется не только сам код (его соответствие стандартам, корректность и прочее), но и общая логика реализации задачи.

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

В подтверждении своих слов ниже приведу описание положительных тенденций, которые мы пронаблюдали после введения Code Review.

1. Обнаружение большего числа дефектов до передачи в QA стало возможным в силу нескольких причин:

  • Быстрая работа над ошибками. Если ревьюер знает разработчика, имеет опыт работы с его кодом, то без особых усилий может “отловить” характерные ошибки своего коллеги;
  • Опыт. Ревьюер, будучи более подкованным и опытным программистом, вполне возможно, уже сталкивался с решением подобной задачи и знает потенциально слабые места программного кода;
  • Взгляд со стороны. Каждый может пропустить ошибку, а повторный просмотр снижает вероятность ее наличия.
  • Дополнительная мотивация. Если разработчик знает, что код будет просматриваться, то сам вполне заинтересован в том, чтобы допускать как можно меньше ошибок.

2. Улучшение качества кода за счет обсуждения реализации между разработчиками:

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

3. Упрощение поддержки кода стало возможным, благодаря совместной работе над ним.

4. Code Review как инструмент обучения сотрудника

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

Со своей стороны, отвечая на вопрос о целесообразности ведения постоянной инспекции кода, с чистой совестью говорю: “надо, товарищи! “ Поскольку результат от таких проверок с лихвой окупит потраченное время.

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

Из первых рук: мнения разработчиков о Code Review

“Я участвовал в проекте, предусматривавшем перекрестный ревьюинг кода: два разработчика, соответсвенно, просмотр кода друг друга. Скажу честно: удобно, нужно, нетрудозатратно. Если в цифрах, то поначалу ревьюинг обнаруживал примерно 10-15 ошибок, а затем 0-5 ошибки на один и тот же объем кода. А по времени в день весь процесс занимал не более 20 минут, поэтому, как мне кажется, смысл в такой работе есть точно.”

Алексей Романенко, PHP-разработчик

Константин Медведев, Project Manager

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

Николай Джулай, Project Manager

  • Перевод
  • Tutorial

В последнее время я читал статьи о лучших практиках code review и заметил, что эти статьи фокусируются на поиске багов, практически игнорируя другие компоненты ревью. Конструктивное и профессиональное обсуждение обнаруженных проблем? Неважно! Просто найди все баги, а дальше само сложится.

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

Моя революционная книга обучит вас проверенным техникам по выявлению максимального количества недостатков в своём партнёре. Книга не затрагивает следующие области:

Обсуждение проблем с сочувствием и пониманием.
Помощь партнёру в устранении недостатков.

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

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

Так почему мы проводим code review таким образом?

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

Я собираюсь сделать смелое предположение, что вам хотелось бы улучшить code review в настоящем, где вы работаете с людьми, а не с роботами. Даже более смелое предположение, что хорошие отношения с коллегами - это главная цель, а не просто переменная для ускорения исправления ошибок (минимизации параметра cost-per-defect). Как бы изменились ваши методы ревью с учётом этих обстоятельств?

В этой статье обсудим техники, которые предполагают, что code review - не только технический, но и социальный процесс.

Что такое code review?

Термин “code review” может означать разные действия, от простого чтения какого-то кода из-за спины разработчика до совещания на 20 человек, где вы разбираете код строчка за строчкой. Я здесь имею в виду формальную и письменную процедуру, но не отягощённую рядом совещаний для инспекции кода.


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

Ревью начинается, когда автор отправляет список изменений рецензенту. Оно происходит в несколько раундов . Каждый раунд - это один полный цикл приёма-передачи между автором и рецензентом: автор присылает изменения, рецензент отвечает отзывом на эти изменения. Каждая рецензия кода состоит из одного или нескольких раундов.

Ревью завершается, когда рецензент одобряет изменения. Обычно этому сопутствует отправка сообщения LGTM, сокращённой фразы “looks good to me”.

Почему это так трудно?

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

Филип Гринспан, сооснователь ArsDigita, из книги «Основатели за работой ».


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

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

Техники

Отдайте компьютерам скучную часть работы

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

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

Правая часть пустая, потому что автор использовал редактор кода, который автоматически форматирует пробелы каждый раз при нажатии кнопки «Сохранить». Ну худой конец, когда автор отправляет свой код на проверку, система непрерывной интеграции сообщает о неправильных пробелах. Автор исправляет проблему ещё до того, как рецензент её заметил.

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

Задача Автоматизированное решение
Проверить билды Travis или CircleCI .
Проверить прохождение автоматических тестов Система непрерывной интеграции, такая как Travis или CircleCI .
Проверить, что отступы и пробелы соответствуют корпоративному стилю. Инструмент форматирования кода, такой как ClangFormat (для C/C++) или gofmt (для Go).
Идентификация неиспользуемых модулей или неиспользуемых переменных Статические анализаторы кода, такие как pyflakes (линтер для Python) или JSLint (линтер для JavaScript).

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

Автоматизация выгодна и автору. С её помощью он может обнаружить небрежные ошибки за несколько секунд, а не за несколько часов. Мгновенный фидбек ускоряет обучение и упрощает исправление ошибки, потому что релевантный контекст у автора ещё в рабочей памяти. Кроме того, автор гораздо легче воспринимает сообщение о глупой ошибке от компьютера, а не от вас.

Нужно всем вместе поработать, чтобы внедрить автоматические проверки такого рода в рабочий процесс code review (например, хуки перед коммитами в Git или вебхуки в GitHub). Если процесс ревью требует от автора запускать такие проверки вручную, то вы лишаетесь большей части преимуществ. Автор неизбежно иногда будет забывать о проверке, из-за чего вам придётся возиться с с простыми ошибками, которые могла исправить автоматическая проверка.

Оформите аргументы по стилю в виде руководства по стилю

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

Хорошее руководство по стилю определяет не только внешние элементы оформления вроде соглашения о присвоении имён или правила отступов, но и как использовать функции данного языка программирования. Например, JavaScript и Perl набиты функциональностью - там есть много вариантов реализации одной и той же логики. Руководство по стилю определяет Один Правильный Способ программирования, так что вы больше не увидите, что одна половина вашей команды использует один набор функций языка, а другая половина - совершенно другой набор функций.

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

Вариант 1: адаптация существующего руководства по стилю
Если поискать в интернете, то можно найти опубликованные руководства по стилю - и позаимствовать их для собственного использования. Самые известные - руководства по стилю от Google , но можно найти и другие, если эти не подходят. Адаптируя существующий документ, вы получаете все выгоды от наличия руководства по стилю, не тратя времени на написание такого документа с нуля.

Недостаток в том, что все организации адаптируют эти правила для внутренних нужд. Например, руководства Google очень консервативны относительно использования новых функций языков , потому что у них огромная кодовая база, которая должна работать на всём: от домашнего маршрутизатора до последнего iPhone. Если у вас стартап из четырёх человек с единственным продуктом, то логично выбрать более агрессивную стратегию в использовании самых последних функций или расширений языков.

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

Я предпочитаю держать наше руководство в формате Markdown в системе контроля версия (например, на GitHub Pages). Так все изменения проходят через стандартную процедуру рецензирования - кто-то должен явно одобрить изменения, а каждый в команде может поднять любую проблему. Вики и Google Docs тоже подходят.

Вариант 3: Гибридный подход
Сочетая варианты 1 и 2, вы можете адаптировать существующее руководство и одновременно вести локальный документ для расширения или перезаписи базы. Хороший пример - руководство Chromium C++. Там в качестве базы взяли руководство по C++ от Google, но сделали собственные изменения и дополнения.

Начинайте ревью немедленно

Расценивайте code reviews как задачу с высоким приоритетом. Когда вы изучаете код или пишете отзыв, не торопитесь, но начинайте делать это немедленно - в идеале, в течение нескольких минут.

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

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

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

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

Начните с высокого уровня, и спускайтесь ниже

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

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

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

Щедро используйте примеры кода

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

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

Urls = for path in paths: url = "https://" url += domain url += path urls.append(url)
Ответ в стиле «Можно это упростить с помощью списковых включений?» вызовет раздражение, потому что ему нужно потратить 20 минут, изучая функцию, которую никогда раньше не использовал.

Предлагаю рассмотреть списковое включение такого рода:

Urls = ["https://" + domain + path for path in paths]


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

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

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

Никогда не говорите «ты»

Это звучит немного странно, но послушайте: никогда не обращайтесь лично к автору в процессе код ревью.

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

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

Например, вот безобидный комментарий:

Ты допустил ошибку в слове «благополучно».

Автор может интерпретировать такое замечание двумя соврешенно разными способами:
  • Интерпретация 1 : Эй, приятель! Ты неправильно написал слово «благополучно». Но я всё равно считаю, что ты умный! Вероятно, это просто опечатка.
  • Интерпретация 2 : Ты допустил ошибку в слове «благополучно», придурок.
Сравните это с замечанием, в котором отсутствует обращение «ты»:
sucessfully -> successfully

Вторая заметка - это просто исправление, а не оценка автора.

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

Вариант 1: Замените «ты» на «мы»

Ты можешь дать этой переменной более наглядное имя, вроде seconds_remaining ?
превращается в:
Мы можем дать этой переменной более наглядное имя, вроде seconds_remaining ?

«Мы» усиливает коллективную ответственность всей команды за код. Автор может перейти в другую компанию, как и вы, но в том или ином виде останется команда, которая отвечает за этот код. Может показаться глупым говорить «мы», когда речь идёт об изменении, которое автор явно должен сделать единолично, но лучше выглядеть глупым, чем обвинителем.

Вариант 2: Удалите из предложения субъект
Другой вариант избежать личного обращения - использовать сокращение, которое исключает из предложения субъект:

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

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

Ещё один вариант - перефразировать предложение в виде вопроса, который начинается со слов «Что насчёт...» или «Как насчёт...»:
Что насчёт переименовать эту переменную для более наглядного имени, вроде seconds_remaining .

Оформляйте отзывы как запросы, а не команды

Код ревью требует большего такта и осторожности, чем обычное общение, потому что здесь выше риск, что обсуждение скатится в личный спор. Казалось бы, рецензенты должны проявлять бóльшую вежливость и учтивость в код ревью по сравнению с личным общением. Но я обнаружил страннейшим образом прямо противоположную ситуацию. Многие люди никогда не скажут коллеге, «Дай мне этот степлер, а потом принеси газировки». Но я видел множество случаев, когда рецензенты оформляют отзывы в таком командном стиле, вроде «Перенеси этот класс в отдельный файл».

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

Сравните одно и то же замечание, оформленное двумя разными способами:

Людям нравится контролировать свою работу. Такой запрос даёт автору чувство самостоятельности.

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

Сравните, насколько воинственной кажется беседа в зависимости от оформления первоначального замечания:

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

Обосновывайте принципами, а не мнениями

Когда составляете замечание для автора, то объясните и предлагаемое изменение, и его причину . Вместо фразы «Нам следует разделить этот класс на два» лучше сказать «Сейчас этот класс отвечает одновременно и за скачивание файла, и за его парсинг. Следует разделить его на класс для скачивания и на класс для парсинга согласно принципу единой ответственности ».

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

Разработка программного обеспечения - это одновременно искусство и наука. Не всегда можно точно сформулировать, что именно неправильно в данном фрагменте кода с точки зрения устоявшихся принципов. Иногда код просто некрасивый или излишне усложнённый, и сложно точно сформулировать, почему. В таких случаях объясните как можете, но сохраняйте объективность. Если сказать «Мне кажется, это сложно понять», то это хотя бы объективное утверждение, в сравнении с фразой «Это запутанный код», что является оценочным суждением, с которым не каждый может согласиться.

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

Часть 2: скоро

Через пару недель я опубликую вторую часть статьи. Будьте на связи, там рассмотрим дополнительные советы, в том числе:
  • Работа со слишком большими код ревью.
  • Распознавание возможности дать высокую оценку.
  • Соблюдение рамок ревью.
  • Действия в безвыходных ситуациях.
UPD. Опубликована вторая часть статьи. Добавить метки

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

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


Мне удалось обнаружить только один случай небрежной, неудачной, слабой рифмовки:


Шагай смелей, земля -
Твоя. Но пусть тебя,
Когда ты ступишь за десяток третий,
У пропасти во ржи,
Ведущей в мир вранья,
Поймают твои собственные дети.

Сначала я хотел отметить разнообразие ритмов в приведённых стихах, но чуть позже сообразил: да это же всё ямб!


То трёхстопный:


Зима стекает по стеклу
И носом шмыгает в трамваях.
Москва, как видно, привыкает
К предновогоднему теплу

То четырёхстопный, но почти до неузнаваемости изменённый ипостасями:


Ты тянешь из меня глотками
Беспечной молодости влагу,
Хватаясь стебельками ручек
За пальцев теплые стволы…
То четырёхстопный в соединении с двухстопным:
Ребенок спит, прижав к себе игрушку -
Любимца-льва.
То пятистопный:
Когда делили счастья апельсин,
Тебе досталось много сочных долек,
Но ты решил, что съешь их все один,
Не оттого ли апельсин твой горек?
То, наконец, опять трёхстопный (но совсем иной в пятом стихотворении, чем в первом):
Держи меня, держи,
над пропастью во ржи,
Не дай мне повзрослеть, остепениться…

Конечно, ямб для русского языка размер уникальный. Валерий Брюсов насчитывал несколько десятков тысяч ритмических вариантов на основе ямба. Однако подобное разнообразие говорит о совершенной ритмической свободе автора. Причём, смею полагать, сам автор не очень задумывался в своё время, какой ритмический рисунок избрать. Это, с одной стороны, проявление тех же «шумов в голове», которые наличествуют у автора. Однако, с другой стороны, это и проявление большой словесной культуры, которая, как известно, представляет собой забытое, оттеснённое в бессознательное, но накопленное когда-то Знание.


Уровень лексический. Опять-таки, то уместное многозначность («Зима стекает по стеклу И носом шмыгает в трамваях»... «И выпуская из-под ткани Ножонки цепкую корягу. Твои движенья то ползучи, Как капли стынущей смолы»..,), то предельная, почти демонстративная опрощённость («Подружек постепенно забываю, Пропала с глаз. Я им нужна, но только не такая, Как я сейчас, Не в этой роли - заполошной квочки С больной спиной,Вокруг себя возведшей заморочки Сплошной стеной. Рутину разбавляю парой ложек Боевичка. Вы скажете, я стала скучной? Может. Наверняка. О чем вести с наседкой разговоры? Все дом да быт»...), то литературная реминисценция («Держи меня, держи,
над пропастью во ржи»…) Самое главное – всякий новый поворот лексики у автора всегда уместен, полностью адекватен смыслу каждого следующего стихотворения подборки.


Каждое из пяти стихотворений имеет свой собственный сюжет: первое – предощущение рождения сына (параллельно с предощущением наступления настоящей зимы и, между прочим, Рождества); второе – кормление новорожденного (и автор абсолютно умеет избежать здесь, так сказать, напрашивающихся физиологических пошлостей, третье – бытовые заботы мамы растущего ребёнка, четвёртое – могло бы стать просто назидательским морализаторством (мол, жадным быть нехорошо), если бы не изящный приём с апельсином, который, на мой взгляд, перерастает здесь из простой аллегории в символ: «Когда делили счастья апельсин, Тебе досталось много сочных долек, Но ты решил, что съешь их все один, Не оттого ли апельсин твой горек?», пятое - о том мире, которым могут одаривать нас дети, о мире «без вранья»: «Зови меня, зови В фантазии свои, В которых ты волшебник, робот, рыцарь, Коснись меня лучом
Доверчивой любви, Дай мне к твоей вселенной подключиться!»


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


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


(И, может быть, не случайно именно в последних словах подборки появляются и «формальные» рифмы, да и синтаксис немного коряв: «пусть тебя, Когда ты ступишь за десяток третий, У пропасти во ржи, Ведущей в мир вранья Поймают твои собственные дети»; автору надо было «закруглить» тему, вот эта заданность сразу и проявилась в, казалось бы, формальных моментах. Может быть, я и неправ. И, разумеется, это прерогатива автора)


И последнее. Нельзя не упомянуть о предшествующей подборке Веры Бутко. Там была трагедия нелюбви к мужчине, здесь – счастье матери. И то, и другое автор изображает с блеском (иначе не скажешь) Однако, между прочим, «кинжальный» вариант финала связал бы данную подборку с предыдущей.


Повторюсь. Конечно, право только и исключительно автора решать. Мне, как читателю, в общем, достаточно того, что автор сумел возбудить во мне своими стихами. Но всегда хочется большего. Благо, автор, по моему глубокому убеждению, на это большее способен. Поэтому общая оценка всё-таки 9, а не 10 баллов.

Шмыгать

Шмыгать

1. Двигаться шаркающей походкой. Ш. ногами. Шмыгающая походка.

2. Быстро двигать чем-н. взад и вперёд по какой-н. поверхности. Ш. щёткой.

3. Быстро двигаться, ходить в разных направлениях. Мимо окон шмыгают какие-то люди. Глаза шмыгают у кого-н. (перен. : о беспокойном, шныряющем взгляде).

4. Проходить, удаляться быстро, незаметно. Мышь шмыгает в щель.


Толковый словарь Ожегова . С.И. Ожегов, Н.Ю. Шведова. 1949-1992 .


Смотреть что такое "шмыгать" в других словарях:

    ШМЫГАТЬ, шмыгнуть чем, по чем, обо что; что, чем; тереть, дернуть, шаркать, шуркать, б.ч. о трении мягким. Шмыгать веревку, нитку, чтоб не было закрутин, пошмыгать, вышмыгать. Шмыгать сапожную вервь варом, от(на)шмыгать. Постромка шмыгает по… … Толковый словарь Даля

    ШМЫГАТЬ, шмыгаю, шмыгаешь, несовер. 1. что. Тереть, протирать (обл.). Шмыгать веревку сапожным варом. 2. чем. Быстро двигать чем нибудь, шаркать, тереть (разг. фам.). «На ходу шмыгал ногами и переваливался с боку на бок.» А.Тургенев. «Он громко… … Толковый словарь Ушакова

    См … Словарь синонимов

    ШМШЫГАТЬ 2, аю, аешь; несов.: шмыгать носом (разг.) Ч делать носом втягивающие движения, хлюпать (в 4 знач.). Толковый словарь Ожегова. С.И. Ожегов, Н.Ю. Шведова. 1949 1992 … Толковый словарь Ожегова

    ШМШЫГАТЬ 1, аю, аешь; несов. (разг.). Толковый словарь Ожегова. С.И. Ожегов, Н.Ю. Шведова. 1949 1992 … Толковый словарь Ожегова

    шмыгать - аю, аешь; нсв.; разг. см. тж. шмыганье 1) Быстро ходить, двигаться в разных направлениях, часто и торопливо пробегать мимо кого, чего л. Шмы/гать из комнаты в комнату. В аквариуме шмыгали рыбки. Между столами шмыгают официанты. Люди шмыгают мимо … Словарь многих выражений

    I несов. неперех. разг. 1. Быстро двигать чем либо. отт. Ходить, шаркая. 2. Торопливо ходить взад и вперёд. отт. перен. Беспокойно перебегать с одного предмета на другой (о глазах, взгляде, взоре). 3. Незаметно уходить, скрываться. II несов.… … Современный толковый словарь русского языка Ефремовой

    Шмыгать, шмыгаю, шмыгаем, шмыгаешь, шмыгаете, шмыгает, шмыгают, шмыгая, шмыгал, шмыгала, шмыгало, шмыгали, шмыгай, шмыгайте, шмыгающий, шмыгающая, шмыгающее, шмыгающие, шмыгающего, шмыгающей, шмыгающего, шмыгающих, шмыгающему, шмыгающей,… … Формы слов

    шмыгать - Искон. Суф. производное от шмыга, образованного посредством суф. га от звукоподражательного шмы (ср. хмыкать, рыкать и т. д.) … Этимологический словарь русского языка

Get a valuable feedback from your customers by giving them the freedom to share their impressions freely. Let them rate your products and/or services straight on your website. See below the key features that come standard with our online review system.

    Reviews & Ratings

    Embed PHP Review Script into your website and let clients share their experience with the products and services you offer. They can rate by criteria and give both positive and negative feedback.

    Multiple Languages

    The PHP review system can speak not only English, but any language you may need. You can translate all titles and system messages from the admin page using unique IDs for each piece of text.

    Editable Rating Criteria

    Depending on the type of business, review system admins can
    set different rating criteria to be shown in the front-end form.
    Each of these criteria is rated with 1 to 5 stars.

    Email & SMS Notifications

    Set up the online review system to send Email & SMS alerts when a new review has been posted. You can easily specify which users to receive these messages from the Users menu.

    Multiple User Types

    Create unlimited client types depending on the industry and services used. Hotel ratings can go with following user types: Family with kids, Couple, Business trip etc. They appear as labels in the reviews.

    Responsive & Attractive

    The review and rating script runs on all devices, seamlessly adapting to various screen sizes. In accord with your website branding, you can pick the best matching front-end theme among 10 color options.

    A quick tips box next to the review form allows you to add some witty words and draw customers out. The review system filters reviews by user type. Customers can rate other clients" ratings, too.

    With a Developer Licence you get the source code and can make any custom changes to the PHP Review Script. We can also modify the customer review system upon request.

Понравилась статья? Поделиться с друзьями: