Литература по программированию

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

Книги по алгоритмам и структурам данных:

Дж. Макконелл Анализ алгоритмов. Активный обучающий подход Дж. Макконелл Анализ алгоритмов. Активный обучающий подход. — 3-е дополненное издание. М: Техносфера, 2009. -416с.

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

Миллер, Р. Последовательные и параллельные алгоритмы: Общий подход Миллер, Р. Последовательные и параллельные алгоритмы: Общий подход / Р. Миллер, Л. Боксер ; пер. с англ. — М. : БИНОМ. Лаборатория знаний, 2006. — 406 с.

Книга Миллера полностью посвящена параллельным алгоритмам и параллельным вычислительным машинам. Рассматриваются машины с общей и распределенной памятью. Описываются фундаментальные алгоритмы (сортировка, поиск, умножение матриц, обработка изображений). Для каждого алгоритма приводятся последовательная и параллельные реализации для различных архитектур, проводится их анализ. Книга содержит большое количество математических выкладок и является весьма специфической — интересна будет студентам, интересующимся супервычислениями.

Скиена С. Алгоритмы. Руководство по разработке Скиена С. Алгоритмы. Руководство по разработке. 2-е изд.: Пер. с англ. — СПб.: БХВ-Петербург. 2011. — 720 с.: ил.

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

Литература по параллельному программированию:

Э. Уильямс Параллельное программирование на С++ в действии. Практика разработки многопоточных программ Э. Уильямс Параллельное программирование на С++ в действии. Практика разработки многопоточных программ. — М.: ДМК Пресс, 2012.-672с.

В стандартной библиотеке С++0x появились средства для разработки параллельных программ (Thread Library), автор книжки работает в комитете стандартизации С++ и участвовал в разработки этой библиотеки (он точно знает о чем пишет). Книга подойдет как начинающим, так и читателям, знакомым с параллельным программированием. Может быть использована как справочник по С++ Thread Library (вместо стандарта).

Антонов А.С. Технологии параллельного программирования MPI и OpenMP Антонов А.С. Технологии параллельного программирования MPI и OpenMP: Учеб. пособие. — М.: Издательство Московского университета, 2012.-344 с.

Очень хорошая книжка по OpenMP и MPI. Содержит много примеров и как-то плавно подает материал. До этого я читал другую литературу по этим темам, тонул в изобилии директив и т.п. Именно подачей материала мне понравилась эта книга. Написана она приятно — ее не страшно читать перед сном :).

Книги о проектировании и разработке программного обеспечения

Э. Гамма Приемы объектно-ориентированного проектирования. Паттерны проектирования Э. Гамма Приемы объектно-ориентированного проектирования. Паттерны проектирования / Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес. – СПб.: Питер, 2009. – 366 с.

Классическая и наиболее известная книга о шаблонах проектирования. Описание каждого шаблона достаточно подробное, обычно содержит несколько вариантов реализации с их слабыми и сильными сторонами. Примеры в книге приведены на C++ и Smalltalk, однако словесное описание и UML диаграммы помогут разобраться программистам на других языках. Рекомендую посмотреть книгу всем без исключения будущим программистам.

Джейсон Мак-Колм Смит Элементарные шаблоны проектирования Джейсон Мак-Колм Смит Элементарные шаблоны проектирования : Пер. с англ. — М. : ООО “И.Д. Вильямс”, 2013. — 304 с.

Книга Мак-Колма более похожа на научный труд, чем на учебник, однако, является достаточно интересной и полезной. В первую очередь рассматриваются элементарные шаблоны — такие, как делегирование, наследование, рекурсия. Затем, показывает как из элементарных шаблонов построить более сложные — при этом шаблоны рассматриваются крайне подробно. Достаточно полезной показалась система обозначений PIN (Pattern Instance Notation), разработанная автором в качестве расширения UML. PIN используется на протяжении всей книги, т.к. позволяет элегантно отображать зависимости между паттернами, не вникая в детали их реализации. В конце приводится описание \(\rho\)-исчисления, являющегося формальной теорией, лежащей в основе шаблонов проектирования. Я рекомендую посмотреть книгу всем программистам, которые этого еще не сделали — будет интересно.

Влиссидес Джон. Применение шаблонов проектирования. Дополнительные штрихи. : Пер. англ. М.: Издательский дом Влиссидес Джон. Применение шаблонов проектирования. Дополнительные штрихи. : Пер. англ. М.: Издательский дом «Вильямс

Хорошее дополнение к книге Гаммы и Хелма с несколько другим способом изложения и местами более интересными примерами. Начинается книга с заблуждений о шаблонах — далеко не все, особенно студенты, понимают как ими пользоваться. По ходу книги автор ставит перед читателем ряд проблем и всякий раз выполняет поиск подходящих шаблонов проектирования, при этом приводится даже некоторый алгоритм выполнения такого поиска. Первым примером книги является проектирование файловой системы (с сущностями «Файл», «Каталог», «Ярлык»), на нем рассматриваются паттерны Composite, Proxy (для реализации «Ярлыка» файла — этот пример сильно отличается от того, что приведено в GoF), Visitor (тоже очень удачное применение) и Template Method (в контексте рефакторинга и инверсного управления). Затем, в пример добавляется владелец файла, но пользователей нужно создавать, а еще они объединяются в группы. На примере системы управления пользователями рассматриваются шаблоны Singleton и Mediator (для связи пользователей с группой «многие ко многим»). В конце второй главы приводится хорошая диаграмма «pattern: role annotation». В третьей главе рассматриваются тонкости и проблемы реализации шаблонов — начинаются с Singleton-а (проблема с зависимостями между несколькими Одиночками, параллельным программированием и освобождением памяти из под них). Затем также рассматривается Observer и Visitor (на мой взгляд, выбран слишком примитивный пример с построением графического интерфейса из двух полей ввода и кнопкой). В конце главы описывается «нестандартный» шаблон Generaton Gap — лично я про него читал впервые, применить вы его сможете лишь в тех случаях если ваша система генерирует исходный код программ, рассматривается он на примере генератора пользовательского интерфейса (типа Qt Designer), но отмечается что нечто подобное используется в YACC. Цель паттерна Generaton Gap — убрать зависимость между сгенерированным системой кодом и тем, что дописывает потом вручную пользователь, для этого предлагается, казалось бы очевидное решение — генерируемый код помещается в базовый класс, который пользователь может наследовать для увеличения функциональности (хотя я бы рассмотрел также вариант с композицией). Последним примером книги является система обработки событий (Event), при этом ставится проблема — типов событий много, но, получив событие, мы не хотим выполнять кучу dynamic_cast для установления его типа. На этом примере описаны шаблоны Mulicast и Typed Message — лично мне это показалось бесполезным. В конце книги приводится рекомендации по разработке шаблонов проектирования (семь правил, которые помогут вам придумать новый шаблон) — я бы назвал это правилами по изучению шаблонов (советую прочитать). В целом, хорошая книга, но с плохим переводом (очень много явных ляпов) и местами устаревшая (т.к. примеры написаны на С++, который развивался и сильно изменился, а книга старая) — например не совсем правильно подмечены недостатки Singleton-а Маерса и описан неактуальный подход с Double-Clecked Locking (хотя для истории и кругозора может пригодится).

martin-fine-code Мартин Р. Чистый код. Создание, анализ и рефакторинг. Библиотека программиста. — СПб.: Питер, 2014. — 464 с.

Книга посвящена вопросам написания программного кода, который легко поддерживать — обсуждаются не только стили кодирования, форматирования, но и, например, структура хорошего кода, юнит-тестирование, использование исключений. В контексте чистого кода описываются некоторые шаблоны проектирования. Альтернативой можно считать книгу Фаулера (она также посвящена чистому коду), но Роберт Мартин пишет гораздо интереснее. Рекомендую прочитать книгу всем студентам, прошедшим курс объектно-ориентированного программирования.

fauler-refactoring Фаулер М. Рефакторинг. Улучшение существующего кода/ М. Фаулер. Символ-Плюс, 2008. 432 с.

Также как и книга Боба Мартина полностью посвящена рефакторингу кода. Разница в подходе. У Боба Мартина — легкое чтиво, а тут — попытка каталогизации видов рефакторинга (начиная от элементарных переименований и перемещений до сложных — например, преобразование процедурного проекта в объектно-ориентированный). Если вы разрабатывали что-то чуть-чуть сложнее тетриса — то книга читается быстро (я справился за 2 дня), значительная часть материала вам и так знакома — ну… посмотрите вы на то, как это систематизировано и все. На мой взгляд, покупать книгу не стоит (я взял на работе почитать), т.к. вряд-ли вы будете ее перечитывать. С другой стороны, знакомый тимлид требует от работников при рефакторинге указывать конкретный вид (название берется из каталога вот этой книги) указывать в комментарии к коммиту репозитория. В целом, инициатива мне нравится, т.к. читабельность истории проекта улучшится. Советую прочитать книгу будущим и действующим программистам, но долго на ней не задерживаться, а посмотреть другие книги этого раздела :).

Тепляков С. В. Паттерны проектирования на платформе .NET Тепляков С. В. Паттерны проектирования на платформе .NET – СПб.: Питер, 2015. – 320 с.

Замечательная книга от разработчика компании Microsoft и известного в узких кругах блогера (до выпуска книги Сергей много писал на тему паттернов проектирования на своем сайте). Не смотря на то, что в названии фигурирует .NET, книга будет полезна всем без исключения разработчикам (в книге Гаммы тоже приводятся примеры на Smalltalk, но это не мешает ей быть классикой). Главы книги можно читать в любом порядке, т.к. они не связаны друг с другом — как и в книге Гаммы разделение по главам осуществляется на основе типов паттернов (паттерны поведения, порождающие паттерны, структурные паттерны), кроме того, есть глава посвященная принципам SOLID. Рассматриваются вопросы unit-тестирования в контексте применения шаблонов проектирования.

Pro_git Чакон Скотт, Страуб Бен Git для профессионального программиста. — СПб.: Питер, 2016. — 496 с.: ил.

В книге автор рассказывает про систему контроля версий «git», при этом делает это не поверхностно (как многочисленные статьи в интернете), а очень подробно. Главы выстроены таким образом, чтобы читатель сразу мог начать пробовать некоторые команды git, а затем узнавать про различные варианты их использования. Очень помогает читать обилие иллюстраций к примерам. Книга настолько полно описывает git, что после нее по этой теме можно читать только stack overflow (какие-то конкретные вопросы все равно будут возникать), но вы будете уметь работать в команде, использующей git, выбирать оптимальный вариант использования git для своей команды, настраивать git на сервере и т.д.

ooad Буч Градди Объектно-ориентированный анализ и проектирование с примерами приложений, 3-е изд. / Буч Градди, Максимчук Роберт А., Энгл Майкл У., Янг Бобби Дж., Коналлен Джим, Хьюстон Келли А.: Пер с англ. — М.: ООО «И.Д. Вильямс», 2010. — 720 с.

Классическая книга по программированию от очень авторитетного автора. В книге есть множество интересных и важных для программиста вещей, но они обильно разбавлены рассуждениями на отвлеченные темы и, на мой взгляд, очень неудачными примерами про теплицы. Во второй вам расскажут про общие принципы ООП; в третьей главе — дополнят некоторыми обозначениями UML и интересным разделом про качество классов и объектов; в четвертой — рассматриваются различные подходы к классификации и уточнению абстракций. Пятая глава книги содержит описание 13 видов UML диаграмм, но на мой взгляд Буч выбрал не самые лучшие примеры и недостаточно времени уделил описанию назначения этих диаграмм. Шестая глава содержит описание процесса разработки программного обеспечения, при этом выделяются макропроцесс (жизненный цикл проекта) и микропроцесс (проектирование) — для них описываются стадии с видами деятельности на каждой из них. Седьмая глава завершает изложение очень коротким описанием организационных вопросов. Вторую половину книги составляют примеры приложений (можно посмотреть в каком порядке Буч предлагает их проектировать и какие виды диаграмм использовать).
Все главы кроме пятой очень обзорные — в них нет смысла вчитываться, по этим темам написаны отдельные толстые книги. Например, про качество ПО в нескольких книгах рассуждает Роберт Мартин, а про проектирование ПО (микропроцесс) написал отдельную книгу Розенберг — при этом он использует другой подход (ICONIX). Очень часто долгие рассуждения Буча касаются очевидных вещей и как бы вы не вчитывались — не получится узнать что-то новое, поэтому я считаю, что книгу достаточно бегло просмотреть. Наиболее полезные, на мой взгляд, части книги:

  • описание элементов объектной модели во второй главе;
  • большая часть третьей главы, посвященная основам ООП;
  • описание UML в пятой главе;
  • по диагонали можно прочитать шестую главу и просмотреть несколько примеров из приложения.
iconix Розенберг Д., Скотт К. Применение объектного моделирования с использованием UML и анализ прецедентов.: Пер. с англ. М.: ДМК Пресс, 2002

Книга посвящена разработке программного обеспечения в соответствии с процессом ICONIX, поэтому несмотря на то, что в названии фигурирует UML — рассматриваются всего 4 вида диаграмм (прецедентов, пригодности, последовательности и классов). Диаграмма пригодности не описана во многих других книгах по UML, т.к. в стандарте UML она описана в дополнении. В книге не только описываются сами диаграммы, но и процесс разработки ICONIX, который является итеративным, что оказывает влияние на процесс построения диаграмм. Каждому виду диаграммы посвящена отдельная глава, в конце которой приводится топ 10 ошибок — это тоже очень полезная и интересная часть. Книга в 7 раз тоньше произведения Буча, а полезной информации, на мой взгляд, в ней больше.

С. Бобровский Технологии Пентагона на службе российских программистов. Программная инженерия. - СПб.: Питер, 2003. - 222 с.: ил. С. Бобровский Технологии Пентагона на службе российских программистов. Программная инженерия. — СПб.: Питер, 2003. — 222 с.: ил.

Основная проблема, обсуждаемая в книге — ошибки в программах. В контексте проблемы рассматриваются модели разработки ПО и управления проектами и языки программирования. Книга состоит из четырех глав:

  1. Очень коротко описываются подходы, позволяющие повысить качество продукта (в т.ч. сократить число ошибок): гибкие практики (Agile), развитие качеств программиста — профессиональные и личностные качества, особое внимание уделяется обучению и мотивации.
  2. Описание истории развития языков программирования. Акцент делается на влияние на этот процесс спец. служб в 20 веке. Кроме того, много написано о том, что большая база кода на устаревших языках мешает забыть о них и, следовательно, препятствует развитию более совершенных языков.
  3. Очень коротко описываются подходы к управлению процессом разработки ПО — такие как C/SCSC и CMM. В частности это процессы управления рисками (превышения бюджета проекта или сроков). Из главы можно узнать о сути предлагаемого подхода их достоинствах и недостатках. Чтобы использовать методики информации недостаточно, к сожалению в книге нет ссылок на литературу, где эту информацию можно получить.
  4. Описаны 2 японских проекта связанных с разработкой систем параллельной обработки данных. Более подробного описания проекта ЭВМ 5 поколения на русском языке я не встречал.

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

Литература по функциональному и логическому программированию:

Сергиевский Г. М. Функциональное и логическое программирование Сергиевский Г. М. Функциональное и логическое программирование : [учеб. пособие] / Г. М. Сергиевский, Н. Г. Волченков. – М. : Академия, 2010. – 317с.

Книжка весьма интересная. Книг по функциональному программированию вообще не много, а по логическому и того меньше. Этот учебник не претендует на полноту, но описано все не плохо, особенно понравились разделы по оптимизации функциональных программ и их верификации. Сначала описываются элементы функциональной парадигмы в целом, а затем рассмотрены Lisp и Haskell. Все примеры к главе «логическое программирование» написаны на эдингбургском прологе (к ним относится SWI, GNU, …). Книжка не очень легко читается — много матана.

Томпсон С. Программирование в Erlang Томпсон С. Программирование в Erlang / C. Томпсон, Ф. Чезарини. — М.: ДМК Пресс, 2012. — 488с.

Литературы, посвященной языку Erlang мало, а на русском языке — еще меньше. Есть официальный сайт с качественной документацией (но это не учебник), есть несколько книг, из которых выделяются книги Армстронга, Чезарини и Геберта.
Книга Геберта размещена легально на странице learnyousomeerlang.com (онлайн учебник), иногда я ей пользуюсь, но она на английском (не всем удобно). Есть попытка любительского перевода книги Армстронга (можно найти на docs.google.com). Книгу Чезарини, в отличии от остальных вариантов, можно подержать в руках.

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

Хабаров С. П. Prolog - язык разработки интеллектуальных и экспертных систем Хабаров С.П. Интеллектуальные информационные системы. Prolog — язык разработки интеллектуальных и экспертных систем: учебное пособие / С.П.Хабаров.- СПб. СПбГЛТУ, 2013.- 138 с.

Мне понравился обзор популярных диалектов пролога. Мне не очень понравилось описание принципов логического программирования, я думаю что у Сергиевского этот раздел проработан значительно лучше. Более подробно в пособии разобраны SWI Prolog, Turbo Prolog, Visual Prolog и соответствующие среды разработки. Описана разработка программ с графическим интерфейсом в Visual Prolog и SWI Prolog (XPCE). Все выполнено лаконично, читается как детская книжка (картинка на каждой странице). Книжка неплохая.

Литература по языку С++:

Стивен Прата. Язык программирования C++ (C++11). Лекции и упражнения Стивен Прата. Язык программирования C++ (C++11). Лекции и упражнения, 6-е издание — М.: Вильямс, 2012. — 1248 с.

Когда я учился такой книги, к сожалению, не было. Книга толстая, но читать ее интересно. Автор не является членом комитета стандартизации языка, а преподает в ВУЗе, поэтому написал не справочник, а учебник. Это лучший учебник по С++, который я видел. Прата собрал весь свой педагогический опыт и сделал упор именно на те аспекты, с которыми у студентов возникают проблемы (как ни странно, но у моих студентов те же самые проблемы, поэтому я рекомендую им эту книгу). Книга новая и в ней описывается новый стандарт. Специально под фичи С++11 выделено всего 50 страниц, но по ходу всей книги делаются небольшие отступления на эту тему.

Б. Страуструп Язык программирования С++ Б. Страуструп Язык программирования С++. Специальное издание. Пер. с англ. — М.: Издательство Бином, 2011 г. — 1136 с.

Хорошая книга от автора языка. Текст книги сухой, хотя в ней есть примеры, советы по поводу «хорошего кода» и даже упражнения. Лично я, использую ее в качестве справочника — как учебник книга вряд ли может сравниться с произведением Прата.

Рецензия от другого, уважаемого мной программиста:

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

Если вы уже успели потратить свои деньги на приобретение этой книги, то будьте бдительны. Отнеситесь к ней как к справочнику возможностей языка C++ и не воспринимайте близко к сердцу советы, которые дает автор книги (за исключением банальных типа инкапсуляции данных).

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

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

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

978-5-94074-990-5_270_369_5_80 Мейерс С. Эффективное использование С++. 35 новых рекомендаций по улучшению ваших программ и проектов. — М.: ДМК Пресс, 2014. — 294с.
meiers-effektivnoe-ispolzovanie-c-55-vernyh Мейерс С. Эффективное использование С++. 55 верных способов улучшить структуру и код ваших программ. — М.: ДМК Пресс, 2006. — 300с.

Две книги Скотта Мейерса для углубленного изучения С++. Выполнены в виде сборников правил типа: «Никогда не вызывайте виртуальные функции в конструкторе или деструкторе». Правила касаются понимания концепций объектно-ориентированного программирования, вопросов управления памятью, обработки ошибок и эффективности кода. К правилами прилагается исчерпывающее объяснение. В очень небольшой части материал книг пересекается, но в целом, они дополняют друг друга. Начать изучение стоит с книги «35 рекомендаций» — она попроще.

Андрей Александреску. Современное проектирование на C++. Андрей Александреску. Современное проектирование на C++. Обобщенное программирование и прикладные шаблоны проектирования. Перевод с английского — Издательский дом «Вильямс», 2002 г. 336 с.

Отзыв от уважаемого мной программиста:

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

Это одна из тех редких книг, которую нужно прочесть всем, кто желает стать настоящим профессионалом своего дела.

Книга рассказывает об основных паттернах проектирования с упором на их реализацию. Особый восторг вызывают фирменные метапрограммные рецепты господина Александреску.

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

Герб Саттер, Андрей Александреску. Стандарты программирования на C++. 101 правило и рекомендация. Герб Саттер, Андрей Александреску. Стандарты программирования на C++. 101 правило и рекомендация. Перевод с английского — Издательский дом «Вильямс», 2005 г. 224 с.

Отзыв от уважаемого мной программиста:

На мой взгляд это одна из лучших книг (если не самая лучшая) из серии «C++ In-Depth». Коротко, просто и по делу. Ничего лишнего, ни одной плохой рекомендации. Создается ощущение, что читаешь некий доклад о том как нужно программировать, основанный на опыте всех программистов, полученном с момента создания языка C++, из которого тщательным образом было отобрано только самое лучшее и выкинута вся муть, которую выдумывают современные воспаленные мозги.

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

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *