Интервью с Виталием Брагилевским: «Мир, в котором все будут программировать на Haskell — это вряд ли хороший мир»

в 10:09, , рубрики: haskell, Блог компании Provectus, книги по программированию, функциональное программирование

Интервью с Виталием Брагилевским: «Мир, в котором все будут программировать на Haskell — это вряд ли хороший мир» - 1

Виталий Брагилевский (@_bravit) пока что еще преподает в ЮФУ курсы по Haskell и теории алгоритмов. Также, дает выездные курсы в других городах, является редактором и переводчиком множества книг о Haskell и функциональном программировании, состоит в комитетах Haskell 2020 и компилятора GHC и активно выступает на конференциях. К примеру, он прочитает краткий курс компиляторостроения на Haskell на функциональной конференции FPURE в Казани.

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

— Как у тебя получилось стать преподавателем? По твоей активности, количеству выступлений на конференциях, ты не похож на обычного преподавателя.
В моем прошлом преподаватели были не такими.

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

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

— А как дело дошло до института? Специальность, на которой ты обучался, была связана с программированием?

— Я заканчивал Ростовский государственный университет по направлению “Прикладная математика и информатика”.

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

Многие мои однокурсники, которые пошли по программистской линии, сейчас работают какими-то программистскими начальниками.

— Вы потом там же и остались и пошли в аспирантуру?

— Да, я в том же университете остался. Я не учился в аспирантуре. И я не занимался научной деятельностью. Были какие-то попытки, но сказать, что я занимался целенаправленно наукой, я не могу. У меня все время находились дела, которые казались мне более интересными, чем занятия наукой. Тут еще накладывалось то, что тех областей науки, которые мне были интересны, у нас в стране не было. И можно сказать, что нет до сих пор. А заниматься наукой удаленно, без руководства, самостоятельно, практически я не смог.

Интервью с Виталием Брагилевским: «Мир, в котором все будут программировать на Haskell — это вряд ли хороший мир» - 2

— А из практики если взять, у нас только в Новосибирске есть что-то связанное с компиляторами?

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

Если мы возьмем Dragon Book, то там теории типов посвящена маленькая глава и ничего толком там нет. Гигантские разделы, посвященные парсингу, всяким таким вещам, а то, что мне интересно, там этого нет…

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

— А что из книг на на эту тему можно было почитать тогда? Пирса?

— Если я не ошибаюсь, Пирс (TAPL — Types and Programming Languages) на английском вышел в году 2005-ом. Потом его перевели на русский язык, и издатель нам тогда прислал на кафедру посылку, где было 5-6 переведенных на русский этих книжек. У нас были семинары, на которых мы все это потихоньку изучали, делали доклады, решали задачи.

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

— Ты преподаешь разные дисциплины и вообще вроде начинали с Java. Как произошло, что начали преподавать Haskell?

— Когда молодой преподаватель приходит работать в университет, ему дают курсы не по его выбору обычно, а то, что надо читать. У меня первый спецкурс, который я читал, назывался “Web XML технологии”. В первый раз я его читал в 2003 году. В начале июля меня берут на кафедру, говорят, вот твоя нагрузка и с сентября начинаешь читать курс. Я ни в том, ни в другом специалистом не был тогда. Поручили — значит изучаешь и начинаешь читать. XML изучил и в рамках этого курса, потом начал веб-сервисы изучать, как-то программировать, оттуда и на Java перешел. Появился курс по Java, и ее немножко преподавал несколько лет.

То есть курсы появляются из того, что поручили, а уже потом начинаешь предлагать сам, что тебе интересно и хочется прочитать. Если есть место, куда это воткнуть в учебный план, кафедра соглашается. И так появился курс ФП, по-моему в 2008/09 году.

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

— А какие были отзывы от студентов, которые получили уже проработанный материал?

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

Понятно, что студенты относятся к изучению Haskell как к какой-то обязаловке: надо изучать, вот они и изучают. И в общем они правы.

— Как-то это повлияло на выпускников? Появились ли те, кто ушел в функциональщину?
— Я единиц знаю, кто Haskell использует из тех, кто прослушал курс этот. Курс назывался не Haskell, а ФП. И для меня всегда было важно, чтобы студенты попытались разобраться в идеях ФП, а уже Haskell, не Haskell, — это дело десятое. И я надеюсь, что никто из моих студентов не боится использовать функции высшего порядка и Лямбда-функции в каких-нибудь других промышленных языках программирования.

И это я считаю абсолютно нормальным. Мир, в котором все будут программировать на Haskell — это вряд ли очень хороший мир. И если они не боятся идей ФП — это уже хорошо.

— А почему это будет плохой мир?

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

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

Возьмем автомобили какие-нибудь. Экспертный уровень водителя должен все время падать. То есть должно быть все проще и проще водить машину. То же самое связано с программированием. А Haskell, конечно, высокие требования накладывает, и не очень перспективно это все. Или мы будем брать: не понимаешь монады, расстрелять!

— Вот пример с водителями это понятно. Я вот примеряю с врачами. Я бы не хотел, чтобы их уровень со временем падал.

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

Я в этом, конечно, не разбираюсь, но верю, что за этим — будущее. Нам не нужно иметь миллион экспертов-врачей. То есть, это должен быть не врач, а оператор ПО, которое продиагностирует, назначит лечение и так далее. Другое дело, что эксперты экстра-класса нужны, чтобы разрабатывать такое ПО.

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

Интервью с Виталием Брагилевским: «Мир, в котором все будут программировать на Haskell — это вряд ли хороший мир» - 3

— Я слышал, что вы участвовали в переводах книг. Можете рассказать об этом?

— Мое первое дело в книгоиздании началось со следующего. Я слышал, что издательство «ДМК-Пресс» должно выпустить книжку “Изучай Haskell во имя добра”. Я был заинтересован в этом переводе, потому что мне нужно было рекомендовать что-то студентам, что им почитать на русском языке желательно про Haskell.

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

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

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

А после этого я начал издательству предлагать какие-то книжки для перевода. Я перевел с Артемом Пеленицыным, моим коллегой по университету, книгу Берда “Жемчужины функционального программирования”. Мы перевели “Введение в теорию языков программирования”, книжку тоненькую. Я еще переводил книжку Марлоу “Параллельное и конкурентное программирование на языке Haskell”. Или это все, или еще что-то, я уже не помню, честно говоря. Вот последнее, что мои студенты переводили, “Программируй на Haskell” Уилла Курта.

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

Интервью с Виталием Брагилевским: «Мир, в котором все будут программировать на Haskell — это вряд ли хороший мир» - 4

— А в Практике функционального программирования вы участвовали? Я вообще не застал этот журнал.

— Ну да, я там для него статью одну в третьем выпуске что ли написал. Про свертки я писал и про то, как они позволяют запрограммировать многие вычисления на списках.

— А что вообще произошло с журналом? Кто его начал и почему все заглохло?

— Он выходил несколько лет. У меня полная коллекция есть печатная. Я не знаю всех деталей, как он возник. Но один из главных людей-организаторов этого журнала Лев Валкин, lionett в ЖЖ. Он был, по-моему, редактором нескольких первых номеров потом этим занимался Женя Кирпичев, который сейчас в гугле работает. По-моему, Дмитрий Остапов еще из тех, кто в самом начале. Это все были люди, которые тогда были активны в русском сегменте ЖЖ. У них выходили посты очень популярные и с гигантскими обсуждениями. Вот они в какой-то момент решили сделать журнал на эту тему. И на мой взгляд, журнал был очень хорошим, статьи писались очень хорошо.

Они работали так: авторы писали статьи и эти статьи очень хорошо рецензировались. Был серьезный процесс исправлений — меня заставили выбросить кучу шуток из статьи. Валкин мне сказал: “Вот ты читаешь сейчас, тебе смешно, а потом тебе будет стыдно”. Выкинули кучу шуток, и так далее. В общем серьезная работа над текстом была, и он получался очень хорошо.

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

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

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

— А там прямо печатную версию рассылали?

— Да, там были какие-то сервисы, можно было удаленно подписаться и получать очередные номера. То есть они печатались, а не только в электронной форме были. Их конечно, приятно держать в руках. Тот же Валкин тратил очень много времени: он шрифты покупал для журнала, чтобы это солидно было. И это выглядит красиво. Это все в TeX делалось, что всегда сложно. Это была большая работа и выполнять ее просто так было очень сложно.

Интервью с Виталием Брагилевским: «Мир, в котором все будут программировать на Haskell — это вряд ли хороший мир» - 5

— Хотел сразу перескочить на книгу, которую ты сейчас пишешь по “Haskell in Depth”? Чем она будет отличаться от “Изучай Haskell во имя добра”?

— Книжка позиционируется как вторая по Haskell. Для того, чтобы ее читать, нужно Haskell уже знать. Это первое отличие от “Learn your Haskell” и всех остальных, потому что все они вводят с самого начала, а тут я себе даже позволяю монады не объяснять. Потому что уже все это должны изучить.

Второе, что для меня важно при ее написании — то, что эта книжка должна подчеркивать способность Haskell решать практические задачи. Это такой прагматический Haskell, который можно использовать в промышленности. Поэтому я стараюсь использовать библиотеки. Очень мало книг по Haskell реально используют библиотеки. В прагматичном подходе есть только одна книжка “Real World Haskell”, которая в 2008 году выходила, то есть очень давно. И то, они очень мало ориентировались на библиотеки, хотя они на то время уже были, но тут их мало используют. А я наоборот с самого начала считаю необходимым использовать как можно больше библиотек для решения задачи. Когда ты используешь библиотеки, ты можешь продвинуться гораздо дальше. Вот это вторая книжка — ориентация на использование в промышленном программировании.

И третье — наверное, попытка описать вещи, которые разбросаны по куче блогпостов. Конкретно сейчас я работаю над главой по перфомансу, производительности и бенчмарки всякие и как делать оптимизацию кода. И я смотрю на “Real World Haskell”, там написано нормально, но мало. За 10 лет Haskell ушел далеко вперед в этом вопросе и много разрозненной информации и вот я как-то пытаюсь ее собрать в рамках одной главы.

В Haskell много таких тем, где нет одного источника, где можно было бы про это почитать. При этом понятно, что из соображений объема я не в состоянии все дать, но я несмотря на то, что называется Haskell in depth, все равно in depth — это можно миллион страниц писать, и все это будет глубже и глубже. Но я стараюсь дать некий минимум, после которого уже легко можно смотреть отдельные блокпосты и всякие разные списки-рассылки читать.

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

— Я так понимаю, в ближайшем будущем готовятся две книги по хаскелю на выход. Есть же еще книга Гранина (graninas) “Functional Design and Architecture”.

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

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

— Кстати, вот с таким подходом одного приложения мне такой подход лично не очень нравится. Есть Алехандро Мена книжка “Beginning Haskell: A Project-Based Approach, 2014”. И она тоже на русский переведена. Там сайт с корзиной, который на протяжении всей книги пилится. Мне это не очень нравится. Это больше похоже на какую-то реального рода работу. И вещи из хаскеля вспоминаются, чтобы что-то конкретное заимплементить. Но все подходы имеют право на существование.

Я полтора года назад уже, в августе 2017 года, написал набор рецензий на имеющиеся книжки по хаскелю и понял, что все плохо. И тогда было объявлены несколько книжек по хаскелю с почти никакой информацией о них. Была “Joy of Haskell” Жюли Моронуки, одна из соавторов Haskell Book. Там была “Intermediate HaskelL”, по-моему, которую делал Артем Казак и Влад Завьялов. То есть уже тогда была информация об этих книжках, но в виде объявлений. Но я ничего больше о них не слышал с тех пор, хотя прошло полтора года. Они в таком же непонятном состоянии находятся.

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

— Хватит ли сил потом перевести это все на русский? Или может кто-то другой будет этим заниматься?

— Я предпочитаю об этом не думать. Проблема в том, что доверить кому-то другому будет, конечно же, сложно. Я пока про это не думаю, нужно сначала дописать. На самом деле, очень много работы и она продвигается очень медленно.

— А нету ли какого-то договора или что-то в этом роде?

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

— На книгах закончили. Есть ли у тебя какой-то опыт промышленного программирования, потому что это проскакивало в твиттере. И ты уходишь от преподавания, заниматься реальной разработкой?

— Куда именно я ухожу, я пока не знаю (на момент публикации уже стало известно куда). Но от преподавательской работы я действительно ухожу. И опыта промышленной работы у меня нет. Мне кажется, что его можно получить, если понадобится. Жизнь устроена таким образом, что любая даже джуниорская позиция в IT оценивается существенно выше, чем работа в университете и обязанностей при этом существенно меньше. Я готов в своем возрасте начать нарабатывать опыт промышленного программирования, если это понадобится. Формально я заканчиваю 15 июля, там у меня будет летняя практика, которой я буду руководить. И на этом заканчивается моя работа в университете.

Интервью с Виталием Брагилевским: «Мир, в котором все будут программировать на Haskell — это вряд ли хороший мир» - 6

— Ты ведь состоишь в комитете Haskell 2020. Какие там сейчас предложения висят? Как может измениться язык, что почитать по этому поводу? Я слышал только о линейных типах. Это как-то похоже на механики в Rust?

— Есть 2 комитета. Haskell 2020 — его цель изначально была написать новые стандарты языка хаскель, но этот комитет провалился. Это можно сейчас уже точно утверждать. Но новый стандарт языка хаскель — он не про новые вещи. Он про вещи уже устоявшиеся, которые можно уже стандартизировать. Но работа в этом комитете практически никакая не велась.

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

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

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

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

— Есть ли какие-то интересные, которые ты курируешь, чтобы упомянуть?

— У меня очень мало пока было. Я в этот комитет вошел в августе 2018 года. Даже ничего особо интересного я не припомню. Я вот сейчас работаю над пропоузалом “Простые ограниченные семейства функций”. Я пытаюсь продраться сквозь текст, написанный довольно сложным языком. Например, в этом пропоузале предлагается добавить контроль над семействами типов такого рода. Сейчас семейство типов, как бы функции на типах, для которых не определена область определения. А их хотят ограничить таким образом, чтобы не любые типы можно было подставлять, а только те, которые там реализуют какое-то ограничение на семейство функций.

— А получится ли дать быструю информацию, зачем используется семейства типов в хаскеле?

— Ну у них очень много примеров. В ghc, по-моему, с 2005 года существуют. Это фактически вычисления на типах. Когда мы хотим получать результаты функций не какого-то конкретного типа, а типа, который зависит от других типов.

Самый простой пример: в обычном хаскеле мы не можем складывать значения разных типов, даже если они числовые. То есть мы не можем взять тип int и тип integer и сложить. Но при это мы всегда можем вычислить некий более общий тип. Например, если мы int и integer складываем, то более общий будет integer. А, если мы double и int складываем, то более общим будет double. И мы можем написать функцию, которая по двум заданным типам будет вычислять более общий. И тогда можно объявить функцию с входными значениями A и B, а на выходе зависимость от этих двух типов.

— Это почти зависимые типы?

— Нет, это совсем не зависимые типы, потому что работа идет только на типах. То есть это функция на типах, никаких значений тут не возникает. Это удобно, но там очень много, правда, темных углов в этой реализации. И несмотря на то, что почти 15 лет функции семейства типов с нами, там все равно остается много проблем.

— И последний вопрос. В самом начале ты сказал, что хаскель только для умников. Зачем тогда писать книги, давать столько информации об этом, если это нужно только 1% от всей индустрии?

— Во-первых 1% — это много. Во-вторых — потому что все это делается не для них, а для себя. Люди занимаются тем, что им интересно. И эта самая главная и самая лучшая мотивация. Если этот 1% индустрии будет счастлив, то это очень хорошо. Если нет, мне все равно.

FPURE — это единственная в этом году конференция по функциональному программированию в России. Ивент пройдет 24-25 мая в Казани. Более 200 российских и зарубежных представителей различных фп-сообществ: Scala, Haskell, Clojure, F#, Elixir и другие. Купить билет и узнать больше информации можно тут.

Автор: Вадим Челышов

Источник


* - обязательные к заполнению поля