Антипаттерн

Поделись знанием:
Перейти к: навигация, поиск

Антипаттерн (англ. anti-pattern) — это распространённый подход к решению класса часто встречающихся проблем, являющийся неэффективным, рискованным или непродуктивным[1]. В отличие от шаблона проектирования, рассмотрение антипаттерна включает в себя как неправильное решение проблемы с его признаками и последствиями, так и выход из ситуации[2].

Термин происходит из информатики, из книги «Банды четырёх» «Шаблоны проектирования», которая заложила примеры практики хорошего программирования. Авторы назвали эти хорошие методы «паттернами», и противоположными им являются «антипаттерны». Частью хорошей практики программирования является избегание антипаттернов. До появления термина все проблемы назывались ловушки (pitfalls). Таким образом, антипаттерны — это самые распространённые ловушки, но не все ловушки будут антипаттернами.

Антипаттерны концептуально похожи на паттерны в том, что они документируют повторяющиеся решения общих проблем. Они известны как антипаттерны, потому что их использование (или злоупотребления) даёт негативные последствия[3].

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





Антипаттерн и паттерн ошибки

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

В отличие от паттернов ошибок, антипаттерны относятся к уровню проектирования, а не кодирования.

Антипаттерны являются паттернами проектирования, паттерны ошибок представляют собой паттерны некорректного поведения программ, коррелирующего с ошибками программирования[4].

История

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

Впервые термин «Антипаттерн» в смысле формальной модели типичного неудачного решения используется в 1996 году Майклом Эйкройдом (англ. Michael Akroyd) на конференции «Object World West Conference», посвященной аспектам объектно-ориентированного программирования.[5] В своей презентации «Антипаттерны: предотвращение неправильного использования объектов», Эйкройд обращал внимание на вредные, но частые программные конструкции, в частности, те, что противоречат принципам ООП. К тому же, для каждой такой конструкции он предлагал эффективную замену.

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

Классификация

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

  • Антипаттерны разработки (development antipatterns)[⇨]
  • Архитектурные антипаттерны (architectural antipatterns)[⇨]
  • Организационные антипаттерны (managerial antipatterns)[⇨]

Нейл и Лаплантэ приводят четвёртый тип[6][7]:

  • Антипаттерны среды (environmental antipatterns)[⇨]

Кроме того, антипаттерны были описаны для отдельных информационных технологий, таких как[7]:

Антипаттерны разработки

Технические проблемы и решения, с которыми имеют дело программисты[7]:

Антипаттерны в объектно-ориентированном программировании

  • Базовый класс-утилита (BaseBean[13]): Наследование функциональности из класса-утилиты вместо делегирования к нему
  • Anemic Domain Model[13] — боязнь размещать логику в объектах предметной области.
  • Вызов предка (Call super): Для реализации прикладной функциональности методу класса-потомка требуется в обязательном порядке вызывать те же методы класса-предка
  • Ошибка пустого подкласса (Empty subclass failure): Создание класса (в Perl), который не проходит «проверку пустоты подкласса» («Empty Subclass Test») из-за различного поведения по сравнению с классом, который наследуется от него без изменений
  • Божественный объект (God object): Концентрация слишком большого количества функций в одной части системы (классе)
  • Объектная клоака (Object cesspool): Переиспользование объектов, находящихся в непригодном для переиспользования состоянии
  • Полтергейст (Poltergeist[14]): Объекты, чьё единственное предназначение — передавать информацию другим объектам
  • Проблема йо-йо (Yo-yo problem): Чрезмерная размытость сильно связанного кода (например, выполняемого по порядку) по иерархии классов.
  • Одиночество (Singletonitis): Неуместное использование паттерна одиночка
  • Приватизация (Privatisation): Сокрытие функциональности в приватной секции (private), что затрудняет его расширение в классах-потомках
  • Френд-зона (Friend zone): Неуместное использование дружественных классов и дружественных функций в языке C++
  • Каша из интерфейсов (Interface soup[15]): Объединение нескольких интерфейсов, разделенных согласно принципу изоляции интерфейсов (Interface segregation), в один
  • Висящие концы: Интерфейс, большинство методов которого бессмысленны и реализуются «пустышками»
  • Заглушка (Stub): Попытка «натянуть» на объект уже имеющийся малоподходящий по смыслу интерфейс, вместо создания нового

Антипаттерны в кодировании

  • Ненужная сложность[en] (Accidental complexity): Внесение ненужной сложности в решение
  • Действие на расстоянии[en] (Action at a distance): Неожиданное взаимодействие между широко разделёнными частями системы
  • Накопить и запустить (Accumulate and fire): Установка параметров подпрограмм в наборе глобальных переменных
  • Слепая вера[en] (Blind faith): Недостаточная проверка корректности исправления ошибки или результата работы подпрограммы
  • Лодочный якорь[en] (Boat anchor)[14]: Сохранение более не используемой части системы
  • Активное ожидание[en] (Busy spin, busy waiting): Потребление ресурсов ЦПУ (процессорного времени) во время ожидания события, обычно при помощи постоянно повторяемой проверки, вместо того, чтобы использовать асинхронное программирование (к примеру, систему сообщений или событий)
  • Кэширование ошибки[en] (Caching failure): Забывать сбросить флаг ошибки после её обработки
  • Воняющий подгузник (The Diaper Pattern Stinks): Сброс флага ошибки без её обработки или передачи вышестоящему обработчику
  • Проверка типа вместо интерфейса (Checking type instead of membership, Checking type instead of interface): Проверка того, что объект имеет специфический тип в то время, когда требуется только определённый интерфейс
  • Инерция кода (Code momentum): Сверхограничение части системы путём постоянного подразумевания её поведения в других частях системы
  • Кодирование путём исключения[en] (Coding by exception): Добавление нового кода для поддержки каждого специального распознанного случая
  • Таинственный код (Cryptic code): Использование аббревиатур вместо мнемоничных имён
  • Жёсткое кодирование (Hard code): Внедрение предположений об окружении системы в слишком большом количестве точек её реализации
  • Мягкое кодирование (Soft code): Патологическая боязнь жёсткого кодирования, приводящая к тому, что настраивается всё что угодно, при этом конфигурирование системы само по себе превращается в программирование
  • Поток лавы[en] (Lava flow)[14]: Сохранение нежелательного (излишнего или низкокачественного) кода по причине того, что его удаление слишком дорого или будет иметь непредсказуемые последствия
  • Волшебные числа (Magic numbers): Использование числовых констант без объяснения их смысла
  • Процедурный код (Procedural code): Когда другая парадигма является более подходящей
  • Спагетти-код (Spaghetti code, иногда «макароны»)[14]: Код с чрезмерно запутанным порядком выполнения
  • Лазанья-код (Lasagnia code, или «лук» (onion)): Использование неоправданно большого количества уровней абстракции
  • Равиоли-код (Ravioli code, или «пельмени»): Объекты настолько «склеены» между собой, что практически не допускают рефакторинга
  • Мыльный пузырь (Soap bubble): Объект, инициализированый мусором, максимально долго притворяется, что содержит какие-то данные
  • Мьютексный ад (Mutex hell): Внедрение слишком большого количества объектов синхронизации между потоками
  • (Мета-)шаблонный рак (Template cancer): Повсеместное использование шаблонов (в основном C++), в том числе там, где их использование не оправдано. Это уменьшает понимание и сопровождение кода и замедляет компиляцию.

Методологические антипаттерны

  • Паттерн проектирования: само по себе использование паттернов считается анти-паттерном — знаком того, что система не воплощает достаточный уровень абстракции[16].
  • Программирование методом копирования-вставки (Copy and paste programming)[14]: Копирование (и лёгкая модификация) существующего кода вместо создания общих решений
  • Дефакторинг (De-Factoring): Процесс уничтожения функциональности и замены её документацией
  • Золотой молоток (Golden hammer[14]): Сильная уверенность в том, что любимое решение универсально применимо. Название происходит от поговорки «когда в руках молоток, все проблемы кажутся гвоздями»
  • Фактор невероятности (Improbability factor): Предположение о невозможности того, что сработает известная ошибка
  • Преждевременная оптимизация (Premature optimization): Оптимизация на основе недостаточной информации
  • Изобретение колеса/велосипеда (Reinventing the wheel[14]): Создание с нуля, вместо использования готового решения
  • Изобретение квадратного колеса (Reinventing the square wheel): Создание плохого решения, когда существует хорошее известное решение
  • Самоуничтожение (Self-destruction): Фатальная ошибка либо нестандартное поведение программы, приводящая к отказу в обслуживании, возникшая вследствие другой менее серьёзной ошибки. Например, при возникновении ошибки, приложение начинает очень быстро и много писать в лог, вследствие чего заканчивается место на жёстком диске быстрее, чем это обнаружит мониторинг.
  • Два тоннеля: Вынесение новой функциональности в отдельное приложение вместо расширения уже имеющегося. Чаще всего применяется, когда по каким-либо причинам (в основном, при нехватке времени либо нежелании менеджмента) внесение изменений в уже имеющийся код требует больших затрат, чем создание нового. При этом у клиента в конечном итоге работают два приложения, запускаясь одновременно либо попеременно друг из друга.
  • Коммит-убийца (Commit assasin): Внесение отдельных изменений в систему контроля версий без проверки влияния их на другие части программы. Как правило, после подобных коммитов работа коллектива парализуется на время исправления проблем в местах, которые ранее работали безошибочно.

Антипаттерны управления конфигурацией

  • Ад зависимостей (Dependency hell, на платформе Microsoft Windows также называется «DLL-ад», «DLL hell»): Разрастание графа взаимных зависимостей программных продуктов и библиотек, приводящее к сложности установки новых и удаления старых продуктов. В сложных случаях различные установленные программные продукты требуют наличия разных версий одной и той же библиотеки. В наиболее сложных случаях один продукт может косвенно потребовать сразу две версии одной и той же библиотеки.

Разные

  • Дым и зеркала (Smoke and mirrors[14]): Демонстрация того, как будут выглядеть ненаписанные функции (название происходит от двух излюбленных способов, которыми фокусники скрывают свои секреты)
  • Раздувание ПО (Software bloat): Разрешение последующим версиям системы требовать всё больше и больше ресурсов
  • Функции для галочки: Превращение программы в конгломерат плохо реализованных и не связанных между собой функций (как правило, для того, чтобы заявить в рекламе, что функция есть)

Архитектурные антипаттерны

Типичные проблемы, связанные со структурой системы[7]:

Организационные антипаттерны

Проблемы, с которыми встречаются менеджеры (или группы менеджеров)[7]:

  • Аналитический паралич[en] (Analysis paralysis)[14]: неоправданно большие затраты на анализ и проектирование. Часто приводит к закрытию проекта до начала его реализации;
  • Дойная корова[en] (Cash cow): когда при наличии продукта, приносящего выгоду без существенных вложений не вкладываются средства в развитие и разработку новых продуктов;
  • Продолжительное устаревание[en] (Continuous obsolescence)[14]: выделение непропорционально больших усилий на портирование системы в новые окружения;
  • Сваливание расходов (Cost migration): перенос расходов на проект к уязвимому отделу или бизнес-партнёру;
  • Раздутый улучшизм (Creeping featurism): добавление новых улучшений в ущерб суммарному качеству системы;
  • Раздутый элегантизм[en] (Creeping elegance): непропорциональное улучшение красивости кода в ущерб функциональности и суммарному качеству системы;
  • Разработка комитетом (Design by committee)[14]: разработка проекта без централизованного управления, либо при некомпетентном руководстве;
  • Неуёмная преданность[en] (Escalation of commitment): продолжение реализации решения после того, как доказана его ошибочность;
  • Я тебе это говорил (I told you so): игнорирование мнения эксперта
  • Управление основанное на числах (Management by numbers): излишнее внимание к численным показателям, либо имеющим очень косвенное отношение к управляемой системе, либо сложным для получения;
  • Драконовские меры (Management by perkele): неоправданно жесткий стиль управления;
  • Управление грибами[en] (Mushroom management)[14]: недостаточное информирование работников о выполняемой работе;
  • Расползание рамок (Scope creep): потеря контроля над разрастанием проекта;
  • Привязка к поставщику (Vendor lock-in)[14]: жёсткая привязка к поставщику;
  • Тёплое тело (Warm Bodies)[14]: человек, чей вклад в проект под сомнением;
  • Единственный знающий человек (Single head of knowledge, SHOK): когда жизненно важными для проекта сведениями или навыками обладает только один человек в команде; с его уходом работа останавливается;
  • Рыцарь на белом коне (Knight in shining armor, KISA): когда на сцене появляется человек, который пытается починить всё, не сообщая никому, что он сделал и почему.

Нейл и Лапланте приводят следующие антипаттерны[6]:

  • (Absentee Manager)
  • (All You Have Is A Hammer)
  • (Cage Match Negotiator)
  • (Doppelganger)
  • (Fruitless Hoops)
  • (Golden Child)
  • (Headless Chicken)
  • (Leader Not Manager)
  • (Managerial Cloning)
  • (Manager Not Leader)
  • (Metric Abuse)
  • (Mr. Nice Guy)
  • (Mushroom Management)
  • (Plate Spinning)
  • (Proletariat Hero)
  • (Rising Upstart)
  • (Road to Nowhere)
  • (Spineless Executive)
  • (Three-Headed Knight)
  • (Ultimate Weapon)
  • (Warm Bodies)

Антипаттерны среды

Проблемы, вызванные доминирующей в организации структурой и социальной моделью, являющейся результатом действующей в организации общественной политики[17][7][6][18]:

См. также

Напишите отзыв о статье "Антипаттерн"

Примечания

  1. Budgen, D. Software design. — Addison-Wesley, 2003. — ISBN 0-201-72219-4.
  2. Brown, 1998.
  3. Smith C.U., 2000.
  4. 1 2 Аллен Э., 2003, с. 65—66.
  5. [c2.com/cgi/wiki?AntiPattern c2.com/cgi/wiki?AntiPattern]. Cunningham & Cunningham, Inc..
  6. 1 2 3 Neill, Laplante, 2005.
  7. 1 2 3 4 5 6 settas, 2011.
  8. Miroslav Kis. Information security antipatterns in software requirements engineering. In Proceedings of the 9th Conference on Pattern Language of Programs (Plop), 2002.
  9. John Long. Software reuse antipatterns. In ACM SIGSOFT Software Engineering Notes, volume26, page 4, July 2001.
  10. Paula Kotze, Karen Renaud, and Judy van Biljona. Don’t do this — pitfalls in using anti-patterns in teaching human-computer interaction principles. Computers and Education, 50(3):979-1008, April 2008
  11. J. Krai and M. Zemlicka. The most important service-oriented antipatterns. In proceedings of the International Conference on Software Engineering Advances (ICSEA), 2007.
  12. P.A. Laplante, R.R. Hoffman, and G. Klein. Antipatterns in the creation of intelligent systems. IEEE Intelligent Systems, 22:91-95, 2007.
  13. 1 2 Rajiv Ramnath, Cheyney Loffing. [books.google.com/books?id=8tIsAwAAQBAJ Beginning IOS Programming For Dummies]. — John Wiley & Sons, 2014-04-14. — С. 105. — 470 с. — ISBN 9781118799277.
  14. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 William J. Brown. [ce.sharif.edu/courses/93-94/1/ce222-1/resources/root/AntipatternsBooks/Antipatterns%20-%20Refactoring%20Software,%20Architectures,%20and%20Proj.pdf AntiPatterns: Refactoring Software, Architectures, and Projects in Crisis]. — Wiley, 1998-04-03. — 156 с. — ISBN 0−471−19713−0.
  15. Gary McLean Hall. Adaptive Code via C#: Agile coding with design patterns and SOLID principles. — Microsoft Press, 2014. — С. 267-268. — ISBN 978-0735683204.
  16. [www.paulgraham.com/icad.html Revenge of the Nerds]. — «In the OO world you hear a good deal about "patterns". I wonder if these patterns are not sometimes evidence of case (c), the human compiler, at work. When I see patterns in my programs, I consider it a sign of trouble. The shape of a program should reflect only the problem it needs to solve. Any other regularity in the code is a sign, to me at least, that I'm using abstractions that aren't powerful enough-- often that I'm generating by hand the expansions of some macro that I need to write.»
  17. В оригинале: socio-political forces
  18. Phillip Laplante [queue.acm.org/detail.cfm?id=1035617 The Burning Bag of Dung—and Other Environmental Antipatterns] ACM Queue November 30, 2004 Volume 2, issue 7

Литература

  • [perldesignpatterns.com/ Perl Design Patterns Book|Perl Design Patterns] — A free online book and wiki
  • William J. Brown, Raphael C. Malveau, Hays W. McCormick III, and Thomas J. Mowbray. AntiPatterns: Refactoring Software, Architectures, and Projects in Crisis. — John Wiley & Sons, 1998. — ISBN 0471197130.
  • William J. Brown, Hays W. "Skip" McCormick, Scott W. Thomas. AntiPatterns and Patterns in Software Configuration Management. — Wiley, 1999. — ISBN 978-0-471-32929-9.
  • William J. Brown, Hays W. "Skip" McCormick, Scott W. Thomas. AntiPatterns in Project Management. — Wiley, 2000. — ISBN 978-0-471-36366-8.
  • Neal Ford, Matthew McCullough, Nathaniel Schutta. [books.google.ru/books?id=aS7-oEoppEMC Presentation Patterns: Techniques for Crafting Better Presentations]. — Addison-Wesley, 2012-08-15. — 395 с. — ISBN 9780132963374.
  • Chad Pytel, Tammer Saleh. [books.google.com/books?id=i6mZ0HBDPzsC Rails AntiPatterns: Best Practice Ruby on Rails Refactoring]. — Addison-Wesley Professional, 2010-11-09. — 347 с. — ISBN 9780132660068.
  • Neill, Colin J. [dx.doi.org/10.1002/j.2334-5837.2012.tb01399.x 9.1.2 Antipatterns in Systems Engineering: An Opening Trio] (англ.) // INCOSE International Symposium. — 2012. — Vol. 22, no. 1. — P. 1233—1245. — ISSN [www.sigla.ru/table.jsp?f=8&t=3&v0=2334-5837&f=1003&t=1&v1=&f=4&t=2&v2=&f=21&t=3&v3=&f=1016&t=3&v4=&f=1016&t=3&v5=&bf=4&b=&d=0&ys=&ye=&lng=&ft=&mt=&dt=&vol=&pt=&iss=&ps=&pe=&tr=&tro=&cc=UNION&i=1&v=tagged&s=0&ss=0&st=0&i18n=ru&rlf=&psz=20&bs=20&ce=hJfuypee8JzzufeGmImYYIpZKRJeeOeeWGJIZRrRRrdmtdeee88NJJJJpeeefTJ3peKJJ3UWWPtzzzzzzzzzzzzzzzzzbzzvzzpy5zzjzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzztzzzzzzzbzzzzzzzzzzzzzzzzzzzzzzzzzzzvzzzzzzyeyTjkDnyHzTuueKZePz9decyzzLzzzL*.c8.NzrGJJvufeeeeeJheeyzjeeeeJh*peeeeKJJJJJJJJJJmjHvOJJJJJJJJJfeeeieeeeSJJJJJSJJJ3TeIJJJJ3..E.UEAcyhxD.eeeeeuzzzLJJJJ5.e8JJJheeeeeeeeeeeeyeeK3JJJJJJJJ*s7defeeeeeeeeeeeeeeeeeeeeeeeeeSJJJJJJJJZIJJzzz1..6LJJJJJJtJJZ4....EK*&debug=false 2334-5837].
  • Colin J. Neill, Philip A. Laplante. Antipatterns: Identification, Refactoring, and Management. — CRC Press, 2005. — ISBN 978-1-4200-3124-9.
  • Dimitrios Settas. Software project antipattern knowledge management (doctoral thesis). — Thessaloniki, Greece: Aristotle University, 2011.
  • Аллен Э. Типичные ошибки проектирования. — Издательский дом «Питер», 2003. — 224 с. — ISBN 5-887827-304-6.
  • Smith C. U., Williams L. G. [spe-ed.com/papers/antipat.pdf Software Performance AntiPatterns] (англ.) // 2nd International Workshop on Software and Performance. — 2000.

Ссылки

  • [www.antipatterns.com/briefing/ Tutorial on anti-patterns]
  • [c2.com/cgi/wiki?AntiPatternsCatalog Anti-patterns catalog]
  • [worsethanfailure.com/ Worse Than Failure]
  • [sourcemaking.com/antipatterns SourceMarking]
  • Перевод статьи «Resign Patterns» — [www.developers.org.ua/archives/a4/2007/02/14/resign-patterns/ Проломы проектно-дезориентированного проектирования] — пародии на книгу «Банды четырёх»
  • [perldesignpatterns.com/perldesignpatterns.html Perl Design Patterns book]
  • [pirnat.com/mike/2009/05/09/the-diaper-pattern-stinks The Diaper Pattern Stinks]


Отрывок, характеризующий Антипаттерн

– Готов экипаж? – в другой раз спросил он.
– Готов, ваше сиятельство. Что прикажете насчет Верещагина? Он ждет у крыльца, – отвечал адъютант.
– А! – вскрикнул Растопчин, как пораженный каким то неожиданным воспоминанием.
И, быстро отворив дверь, он вышел решительными шагами на балкон. Говор вдруг умолк, шапки и картузы снялись, и все глаза поднялись к вышедшему графу.
– Здравствуйте, ребята! – сказал граф быстро и громко. – Спасибо, что пришли. Я сейчас выйду к вам, но прежде всего нам надо управиться с злодеем. Нам надо наказать злодея, от которого погибла Москва. Подождите меня! – И граф так же быстро вернулся в покои, крепко хлопнув дверью.
По толпе пробежал одобрительный ропот удовольствия. «Он, значит, злодеев управит усех! А ты говоришь француз… он тебе всю дистанцию развяжет!» – говорили люди, как будто упрекая друг друга в своем маловерии.
Через несколько минут из парадных дверей поспешно вышел офицер, приказал что то, и драгуны вытянулись. Толпа от балкона жадно подвинулась к крыльцу. Выйдя гневно быстрыми шагами на крыльцо, Растопчин поспешно оглянулся вокруг себя, как бы отыскивая кого то.
– Где он? – сказал граф, и в ту же минуту, как он сказал это, он увидал из за угла дома выходившего между, двух драгун молодого человека с длинной тонкой шеей, с до половины выбритой и заросшей головой. Молодой человек этот был одет в когда то щегольской, крытый синим сукном, потертый лисий тулупчик и в грязные посконные арестантские шаровары, засунутые в нечищеные, стоптанные тонкие сапоги. На тонких, слабых ногах тяжело висели кандалы, затруднявшие нерешительную походку молодого человека.
– А ! – сказал Растопчин, поспешно отворачивая свой взгляд от молодого человека в лисьем тулупчике и указывая на нижнюю ступеньку крыльца. – Поставьте его сюда! – Молодой человек, брянча кандалами, тяжело переступил на указываемую ступеньку, придержав пальцем нажимавший воротник тулупчика, повернул два раза длинной шеей и, вздохнув, покорным жестом сложил перед животом тонкие, нерабочие руки.
Несколько секунд, пока молодой человек устанавливался на ступеньке, продолжалось молчание. Только в задних рядах сдавливающихся к одному месту людей слышались кряхтенье, стоны, толчки и топот переставляемых ног.
Растопчин, ожидая того, чтобы он остановился на указанном месте, хмурясь потирал рукою лицо.
– Ребята! – сказал Растопчин металлически звонким голосом, – этот человек, Верещагин – тот самый мерзавец, от которого погибла Москва.
Молодой человек в лисьем тулупчике стоял в покорной позе, сложив кисти рук вместе перед животом и немного согнувшись. Исхудалое, с безнадежным выражением, изуродованное бритою головой молодое лицо его было опущено вниз. При первых словах графа он медленно поднял голову и поглядел снизу на графа, как бы желая что то сказать ему или хоть встретить его взгляд. Но Растопчин не смотрел на него. На длинной тонкой шее молодого человека, как веревка, напружилась и посинела жила за ухом, и вдруг покраснело лицо.
Все глаза были устремлены на него. Он посмотрел на толпу, и, как бы обнадеженный тем выражением, которое он прочел на лицах людей, он печально и робко улыбнулся и, опять опустив голову, поправился ногами на ступеньке.
– Он изменил своему царю и отечеству, он передался Бонапарту, он один из всех русских осрамил имя русского, и от него погибает Москва, – говорил Растопчин ровным, резким голосом; но вдруг быстро взглянул вниз на Верещагина, продолжавшего стоять в той же покорной позе. Как будто взгляд этот взорвал его, он, подняв руку, закричал почти, обращаясь к народу: – Своим судом расправляйтесь с ним! отдаю его вам!
Народ молчал и только все теснее и теснее нажимал друг на друга. Держать друг друга, дышать в этой зараженной духоте, не иметь силы пошевелиться и ждать чего то неизвестного, непонятного и страшного становилось невыносимо. Люди, стоявшие в передних рядах, видевшие и слышавшие все то, что происходило перед ними, все с испуганно широко раскрытыми глазами и разинутыми ртами, напрягая все свои силы, удерживали на своих спинах напор задних.
– Бей его!.. Пускай погибнет изменник и не срамит имя русского! – закричал Растопчин. – Руби! Я приказываю! – Услыхав не слова, но гневные звуки голоса Растопчина, толпа застонала и надвинулась, но опять остановилась.
– Граф!.. – проговорил среди опять наступившей минутной тишины робкий и вместе театральный голос Верещагина. – Граф, один бог над нами… – сказал Верещагин, подняв голову, и опять налилась кровью толстая жила на его тонкой шее, и краска быстро выступила и сбежала с его лица. Он не договорил того, что хотел сказать.
– Руби его! Я приказываю!.. – прокричал Растопчин, вдруг побледнев так же, как Верещагин.
– Сабли вон! – крикнул офицер драгунам, сам вынимая саблю.
Другая еще сильнейшая волна взмыла по народу, и, добежав до передних рядов, волна эта сдвинула переднии, шатая, поднесла к самым ступеням крыльца. Высокий малый, с окаменелым выражением лица и с остановившейся поднятой рукой, стоял рядом с Верещагиным.
– Руби! – прошептал почти офицер драгунам, и один из солдат вдруг с исказившимся злобой лицом ударил Верещагина тупым палашом по голове.
«А!» – коротко и удивленно вскрикнул Верещагин, испуганно оглядываясь и как будто не понимая, зачем это было с ним сделано. Такой же стон удивления и ужаса пробежал по толпе.
«О господи!» – послышалось чье то печальное восклицание.
Но вслед за восклицанием удивления, вырвавшимся У Верещагина, он жалобно вскрикнул от боли, и этот крик погубил его. Та натянутая до высшей степени преграда человеческого чувства, которая держала еще толпу, прорвалось мгновенно. Преступление было начато, необходимо было довершить его. Жалобный стон упрека был заглушен грозным и гневным ревом толпы. Как последний седьмой вал, разбивающий корабли, взмыла из задних рядов эта последняя неудержимая волна, донеслась до передних, сбила их и поглотила все. Ударивший драгун хотел повторить свой удар. Верещагин с криком ужаса, заслонясь руками, бросился к народу. Высокий малый, на которого он наткнулся, вцепился руками в тонкую шею Верещагина и с диким криком, с ним вместе, упал под ноги навалившегося ревущего народа.
Одни били и рвали Верещагина, другие высокого малого. И крики задавленных людей и тех, которые старались спасти высокого малого, только возбуждали ярость толпы. Долго драгуны не могли освободить окровавленного, до полусмерти избитого фабричного. И долго, несмотря на всю горячечную поспешность, с которою толпа старалась довершить раз начатое дело, те люди, которые били, душили и рвали Верещагина, не могли убить его; но толпа давила их со всех сторон, с ними в середине, как одна масса, колыхалась из стороны в сторону и не давала им возможности ни добить, ни бросить его.
«Топором то бей, что ли?.. задавили… Изменщик, Христа продал!.. жив… живущ… по делам вору мука. Запором то!.. Али жив?»
Только когда уже перестала бороться жертва и вскрики ее заменились равномерным протяжным хрипеньем, толпа стала торопливо перемещаться около лежащего, окровавленного трупа. Каждый подходил, взглядывал на то, что было сделано, и с ужасом, упреком и удивлением теснился назад.
«О господи, народ то что зверь, где же живому быть!» – слышалось в толпе. – И малый то молодой… должно, из купцов, то то народ!.. сказывают, не тот… как же не тот… О господи… Другого избили, говорят, чуть жив… Эх, народ… Кто греха не боится… – говорили теперь те же люди, с болезненно жалостным выражением глядя на мертвое тело с посиневшим, измазанным кровью и пылью лицом и с разрубленной длинной тонкой шеей.
Полицейский старательный чиновник, найдя неприличным присутствие трупа на дворе его сиятельства, приказал драгунам вытащить тело на улицу. Два драгуна взялись за изуродованные ноги и поволокли тело. Окровавленная, измазанная в пыли, мертвая бритая голова на длинной шее, подворачиваясь, волочилась по земле. Народ жался прочь от трупа.
В то время как Верещагин упал и толпа с диким ревом стеснилась и заколыхалась над ним, Растопчин вдруг побледнел, и вместо того чтобы идти к заднему крыльцу, у которого ждали его лошади, он, сам не зная куда и зачем, опустив голову, быстрыми шагами пошел по коридору, ведущему в комнаты нижнего этажа. Лицо графа было бледно, и он не мог остановить трясущуюся, как в лихорадке, нижнюю челюсть.
– Ваше сиятельство, сюда… куда изволите?.. сюда пожалуйте, – проговорил сзади его дрожащий, испуганный голос. Граф Растопчин не в силах был ничего отвечать и, послушно повернувшись, пошел туда, куда ему указывали. У заднего крыльца стояла коляска. Далекий гул ревущей толпы слышался и здесь. Граф Растопчин торопливо сел в коляску и велел ехать в свой загородный дом в Сокольниках. Выехав на Мясницкую и не слыша больше криков толпы, граф стал раскаиваться. Он с неудовольствием вспомнил теперь волнение и испуг, которые он выказал перед своими подчиненными. «La populace est terrible, elle est hideuse, – думал он по французски. – Ils sont сошше les loups qu'on ne peut apaiser qu'avec de la chair. [Народная толпа страшна, она отвратительна. Они как волки: их ничем не удовлетворишь, кроме мяса.] „Граф! один бог над нами!“ – вдруг вспомнились ему слова Верещагина, и неприятное чувство холода пробежало по спине графа Растопчина. Но чувство это было мгновенно, и граф Растопчин презрительно улыбнулся сам над собою. „J'avais d'autres devoirs, – подумал он. – Il fallait apaiser le peuple. Bien d'autres victimes ont peri et perissent pour le bien publique“, [У меня были другие обязанности. Следовало удовлетворить народ. Много других жертв погибло и гибнет для общественного блага.] – и он стал думать о тех общих обязанностях, которые он имел в отношении своего семейства, своей (порученной ему) столице и о самом себе, – не как о Федоре Васильевиче Растопчине (он полагал, что Федор Васильевич Растопчин жертвует собою для bien publique [общественного блага]), но о себе как о главнокомандующем, о представителе власти и уполномоченном царя. „Ежели бы я был только Федор Васильевич, ma ligne de conduite aurait ete tout autrement tracee, [путь мой был бы совсем иначе начертан,] но я должен был сохранить и жизнь и достоинство главнокомандующего“.
Слегка покачиваясь на мягких рессорах экипажа и не слыша более страшных звуков толпы, Растопчин физически успокоился, и, как это всегда бывает, одновременно с физическим успокоением ум подделал для него и причины нравственного успокоения. Мысль, успокоившая Растопчина, была не новая. С тех пор как существует мир и люди убивают друг друга, никогда ни один человек не совершил преступления над себе подобным, не успокоивая себя этой самой мыслью. Мысль эта есть le bien publique [общественное благо], предполагаемое благо других людей.
Для человека, не одержимого страстью, благо это никогда не известно; но человек, совершающий преступление, всегда верно знает, в чем состоит это благо. И Растопчин теперь знал это.
Он не только в рассуждениях своих не упрекал себя в сделанном им поступке, но находил причины самодовольства в том, что он так удачно умел воспользоваться этим a propos [удобным случаем] – наказать преступника и вместе с тем успокоить толпу.
«Верещагин был судим и приговорен к смертной казни, – думал Растопчин (хотя Верещагин сенатом был только приговорен к каторжной работе). – Он был предатель и изменник; я не мог оставить его безнаказанным, и потом je faisais d'une pierre deux coups [одним камнем делал два удара]; я для успокоения отдавал жертву народу и казнил злодея».
Приехав в свой загородный дом и занявшись домашними распоряжениями, граф совершенно успокоился.
Через полчаса граф ехал на быстрых лошадях через Сокольничье поле, уже не вспоминая о том, что было, и думая и соображая только о том, что будет. Он ехал теперь к Яузскому мосту, где, ему сказали, был Кутузов. Граф Растопчин готовил в своем воображении те гневные в колкие упреки, которые он выскажет Кутузову за его обман. Он даст почувствовать этой старой придворной лисице, что ответственность за все несчастия, имеющие произойти от оставления столицы, от погибели России (как думал Растопчин), ляжет на одну его выжившую из ума старую голову. Обдумывая вперед то, что он скажет ему, Растопчин гневно поворачивался в коляске и сердито оглядывался по сторонам.
Сокольничье поле было пустынно. Только в конце его, у богадельни и желтого дома, виднелась кучки людей в белых одеждах и несколько одиноких, таких же людей, которые шли по полю, что то крича и размахивая руками.
Один вз них бежал наперерез коляске графа Растопчина. И сам граф Растопчин, и его кучер, и драгуны, все смотрели с смутным чувством ужаса и любопытства на этих выпущенных сумасшедших и в особенности на того, который подбегал к вим.
Шатаясь на своих длинных худых ногах, в развевающемся халате, сумасшедший этот стремительно бежал, не спуская глаз с Растопчина, крича ему что то хриплым голосом и делая знаки, чтобы он остановился. Обросшее неровными клочками бороды, сумрачное и торжественное лицо сумасшедшего было худо и желто. Черные агатовые зрачки его бегали низко и тревожно по шафранно желтым белкам.
– Стой! Остановись! Я говорю! – вскрикивал он пронзительно и опять что то, задыхаясь, кричал с внушительными интонациями в жестами.
Он поравнялся с коляской и бежал с ней рядом.
– Трижды убили меня, трижды воскресал из мертвых. Они побили каменьями, распяли меня… Я воскресну… воскресну… воскресну. Растерзали мое тело. Царствие божие разрушится… Трижды разрушу и трижды воздвигну его, – кричал он, все возвышая и возвышая голос. Граф Растопчин вдруг побледнел так, как он побледнел тогда, когда толпа бросилась на Верещагина. Он отвернулся.
– Пош… пошел скорее! – крикнул он на кучера дрожащим голосом.
Коляска помчалась во все ноги лошадей; но долго еще позади себя граф Растопчин слышал отдаляющийся безумный, отчаянный крик, а перед глазами видел одно удивленно испуганное, окровавленное лицо изменника в меховом тулупчике.
Как ни свежо было это воспоминание, Растопчин чувствовал теперь, что оно глубоко, до крови, врезалось в его сердце. Он ясно чувствовал теперь, что кровавый след этого воспоминания никогда не заживет, но что, напротив, чем дальше, тем злее, мучительнее будет жить до конца жизни это страшное воспоминание в его сердце. Он слышал, ему казалось теперь, звуки своих слов:
«Руби его, вы головой ответите мне!» – «Зачем я сказал эти слова! Как то нечаянно сказал… Я мог не сказать их (думал он): тогда ничего бы не было». Он видел испуганное и потом вдруг ожесточившееся лицо ударившего драгуна и взгляд молчаливого, робкого упрека, который бросил на него этот мальчик в лисьем тулупе… «Но я не для себя сделал это. Я должен был поступить так. La plebe, le traitre… le bien publique», [Чернь, злодей… общественное благо.] – думал он.
У Яузского моста все еще теснилось войско. Было жарко. Кутузов, нахмуренный, унылый, сидел на лавке около моста и плетью играл по песку, когда с шумом подскакала к нему коляска. Человек в генеральском мундире, в шляпе с плюмажем, с бегающими не то гневными, не то испуганными глазами подошел к Кутузову и стал по французски говорить ему что то. Это был граф Растопчин. Он говорил Кутузову, что явился сюда, потому что Москвы и столицы нет больше и есть одна армия.
– Было бы другое, ежели бы ваша светлость не сказали мне, что вы не сдадите Москвы, не давши еще сражения: всего этого не было бы! – сказал он.
Кутузов глядел на Растопчина и, как будто не понимая значения обращенных к нему слов, старательно усиливался прочесть что то особенное, написанное в эту минуту на лице говорившего с ним человека. Растопчин, смутившись, замолчал. Кутузов слегка покачал головой и, не спуская испытующего взгляда с лица Растопчина, тихо проговорил:
– Да, я не отдам Москвы, не дав сражения.
Думал ли Кутузов совершенно о другом, говоря эти слова, или нарочно, зная их бессмысленность, сказал их, но граф Растопчин ничего не ответил и поспешно отошел от Кутузова. И странное дело! Главнокомандующий Москвы, гордый граф Растопчин, взяв в руки нагайку, подошел к мосту и стал с криком разгонять столпившиеся повозки.


В четвертом часу пополудни войска Мюрата вступали в Москву. Впереди ехал отряд виртембергских гусар, позади верхом, с большой свитой, ехал сам неаполитанский король.
Около середины Арбата, близ Николы Явленного, Мюрат остановился, ожидая известия от передового отряда о том, в каком положении находилась городская крепость «le Kremlin».
Вокруг Мюрата собралась небольшая кучка людей из остававшихся в Москве жителей. Все с робким недоумением смотрели на странного, изукрашенного перьями и золотом длинноволосого начальника.
– Что ж, это сам, что ли, царь ихний? Ничево! – слышались тихие голоса.
Переводчик подъехал к кучке народа.
– Шапку то сними… шапку то, – заговорили в толпе, обращаясь друг к другу. Переводчик обратился к одному старому дворнику и спросил, далеко ли до Кремля? Дворник, прислушиваясь с недоумением к чуждому ему польскому акценту и не признавая звуков говора переводчика за русскую речь, не понимал, что ему говорили, и прятался за других.
Мюрат подвинулся к переводчику в велел спросить, где русские войска. Один из русских людей понял, чего у него спрашивали, и несколько голосов вдруг стали отвечать переводчику. Французский офицер из передового отряда подъехал к Мюрату и доложил, что ворота в крепость заделаны и что, вероятно, там засада.
– Хорошо, – сказал Мюрат и, обратившись к одному из господ своей свиты, приказал выдвинуть четыре легких орудия и обстрелять ворота.
Артиллерия на рысях выехала из за колонны, шедшей за Мюратом, и поехала по Арбату. Спустившись до конца Вздвиженки, артиллерия остановилась и выстроилась на площади. Несколько французских офицеров распоряжались пушками, расстанавливая их, и смотрели в Кремль в зрительную трубу.
В Кремле раздавался благовест к вечерне, и этот звон смущал французов. Они предполагали, что это был призыв к оружию. Несколько человек пехотных солдат побежали к Кутафьевским воротам. В воротах лежали бревна и тесовые щиты. Два ружейные выстрела раздались из под ворот, как только офицер с командой стал подбегать к ним. Генерал, стоявший у пушек, крикнул офицеру командные слова, и офицер с солдатами побежал назад.
Послышалось еще три выстрела из ворот.
Один выстрел задел в ногу французского солдата, и странный крик немногих голосов послышался из за щитов. На лицах французского генерала, офицеров и солдат одновременно, как по команде, прежнее выражение веселости и спокойствия заменилось упорным, сосредоточенным выражением готовности на борьбу и страдания. Для них всех, начиная от маршала и до последнего солдата, это место не было Вздвиженка, Моховая, Кутафья и Троицкие ворота, а это была новая местность нового поля, вероятно, кровопролитного сражения. И все приготовились к этому сражению. Крики из ворот затихли. Орудия были выдвинуты. Артиллеристы сдули нагоревшие пальники. Офицер скомандовал «feu!» [пали!], и два свистящие звука жестянок раздались один за другим. Картечные пули затрещали по камню ворот, бревнам и щитам; и два облака дыма заколебались на площади.
Несколько мгновений после того, как затихли перекаты выстрелов по каменному Кремлю, странный звук послышался над головами французов. Огромная стая галок поднялась над стенами и, каркая и шумя тысячами крыл, закружилась в воздухе. Вместе с этим звуком раздался человеческий одинокий крик в воротах, и из за дыма появилась фигура человека без шапки, в кафтане. Держа ружье, он целился во французов. Feu! – повторил артиллерийский офицер, и в одно и то же время раздались один ружейный и два орудийных выстрела. Дым опять закрыл ворота.
За щитами больше ничего не шевелилось, и пехотные французские солдаты с офицерами пошли к воротам. В воротах лежало три раненых и четыре убитых человека. Два человека в кафтанах убегали низом, вдоль стен, к Знаменке.
– Enlevez moi ca, [Уберите это,] – сказал офицер, указывая на бревна и трупы; и французы, добив раненых, перебросили трупы вниз за ограду. Кто были эти люди, никто не знал. «Enlevez moi ca», – сказано только про них, и их выбросили и прибрали потом, чтобы они не воняли. Один Тьер посвятил их памяти несколько красноречивых строк: «Ces miserables avaient envahi la citadelle sacree, s'etaient empares des fusils de l'arsenal, et tiraient (ces miserables) sur les Francais. On en sabra quelques'uns et on purgea le Kremlin de leur presence. [Эти несчастные наполнили священную крепость, овладели ружьями арсенала и стреляли во французов. Некоторых из них порубили саблями, и очистили Кремль от их присутствия.]
Мюрату было доложено, что путь расчищен. Французы вошли в ворота и стали размещаться лагерем на Сенатской площади. Солдаты выкидывали стулья из окон сената на площадь и раскладывали огни.
Другие отряды проходили через Кремль и размещались по Маросейке, Лубянке, Покровке. Третьи размещались по Вздвиженке, Знаменке, Никольской, Тверской. Везде, не находя хозяев, французы размещались не как в городе на квартирах, а как в лагере, который расположен в городе.
Хотя и оборванные, голодные, измученные и уменьшенные до 1/3 части своей прежней численности, французские солдаты вступили в Москву еще в стройном порядке. Это было измученное, истощенное, но еще боевое и грозное войско. Но это было войско только до той минуты, пока солдаты этого войска не разошлись по квартирам. Как только люди полков стали расходиться по пустым и богатым домам, так навсегда уничтожалось войско и образовались не жители и не солдаты, а что то среднее, называемое мародерами. Когда, через пять недель, те же самые люди вышли из Москвы, они уже не составляли более войска. Это была толпа мародеров, из которых каждый вез или нес с собой кучу вещей, которые ему казались ценны и нужны. Цель каждого из этих людей при выходе из Москвы не состояла, как прежде, в том, чтобы завоевать, а только в том, чтобы удержать приобретенное. Подобно той обезьяне, которая, запустив руку в узкое горло кувшина и захватив горсть орехов, не разжимает кулака, чтобы не потерять схваченного, и этим губит себя, французы, при выходе из Москвы, очевидно, должны были погибнуть вследствие того, что они тащили с собой награбленное, но бросить это награбленное им было так же невозможно, как невозможно обезьяне разжать горсть с орехами. Через десять минут после вступления каждого французского полка в какой нибудь квартал Москвы, не оставалось ни одного солдата и офицера. В окнах домов видны были люди в шинелях и штиблетах, смеясь прохаживающиеся по комнатам; в погребах, в подвалах такие же люди хозяйничали с провизией; на дворах такие же люди отпирали или отбивали ворота сараев и конюшен; в кухнях раскладывали огни, с засученными руками пекли, месили и варили, пугали, смешили и ласкали женщин и детей. И этих людей везде, и по лавкам и по домам, было много; но войска уже не было.
В тот же день приказ за приказом отдавались французскими начальниками о том, чтобы запретить войскам расходиться по городу, строго запретить насилия жителей и мародерство, о том, чтобы нынче же вечером сделать общую перекличку; но, несмотря ни на какие меры. люди, прежде составлявшие войско, расплывались по богатому, обильному удобствами и запасами, пустому городу. Как голодное стадо идет в куче по голому полю, но тотчас же неудержимо разбредается, как только нападает на богатые пастбища, так же неудержимо разбредалось и войско по богатому городу.