Как научиться программировать самому


пошаговая инструкция с советами экспертов

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

Этот онлайн-ресурс специализируется на сфере IT. Что касается программирования, здесь можно пройти обучение по направлениям Frontend, Web-разработка, Android, Python и другим.
Это известнейший онлайн университет. Там можно обучиться всем востребованным профессиям в сфере программирования. Skillbox предлагает пройти как теоретическую, так и практическую часть, и по окончании курса у вас на руках уже будет портфолио.
Это также онлайн университет, предлагающий на выбор широкий спектр IT специализаций, в том числе и курсы программирования по самым популярным направлениям. А если вы боитесь не справиться, вам предложат наставника, и вы будете учиться под его чутким руководством. Geekbrains обещает своим студентам стажировку в крупных партнерских компаниях, а также помощь с устройством на работу.
Это крупнейшая образовательная платформа, сотрудничающая с ведущими университетами всего мира. Здесь вы сможете найти большое количество курсов программирования, но многие из них ведутся на английском языке.
На этой англоязычной платформе вы найдете большое количество курсов, посвященных различным языкам программирования. Однако для обучения вам понадобится уверенное знание английского языка.

Это лишь малая часть платформ, которые вы можете выбрать для обучения. Есть и множество других, некоторые специализируются на более узких направлениях: например, ресурс JavaRush пригодится тем, кто хочет пройти курс обучения по программированию именно на Java, а платформа HTML-Academy понравится тем, кто выбрал специализацию frontend-разработчика.

Научитесь компьютерным наукам

Большинство программ бакалавриата начинаются с «введения» в компьютерное программирование. Лучшие версии этих курсов предназначены не только для новичков, но и для тех, кто упустил полезные концепции и модели программирования во время обучения программированию.

Наша стандартная рекомендация для этого содержания - классическая Структура и интерпретация компьютерных программ , которая доступна в Интернете бесплатно как в виде книги, так и в виде набора видеолекций MIT.Хотя эти лекции великолепны, наше видео-предложение на самом деле представляет собой лекции SICP Брайана Харви (для курса 61A в Беркли). Они более детализированы и лучше ориентированы на новых студентов, чем лекции MIT.

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

С тех пор, как это руководство было впервые опубликовано в 2016 году, один из наиболее часто задаваемых вопросов заключался в том, порекомендуем ли мы теперь записи более поздней версии 61A, преподаваемой Джоном ДеНеро, и / или соответствующей книги Составление программ , которая «в традициях SICP», но использует Python.Мы думаем, что ресурсы DeNero также великолепны, и некоторые студенты могут в конечном итоге предпочесть их, но мы все же предлагаем лекции SICP, Scheme и Брайана Харви в качестве первого набора ресурсов, которые стоит попробовать.

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

Если вам не нравится SICP, попробуйте Composing Programs .Если это все еще не подходит, попробуйте How to Design Programs . Если кажется, что ни одно из этих действий не окупает ваши усилия, возможно, это знак того, что вам следует сосредоточиться на других темах в течение некоторого времени и вернуться к дисциплине программирования через год или два.

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

,

Научитесь программировать за десять лет

Почему все так спешат?

Зайдите в любой книжный магазин, и вы увидите, как Teach Yourself Java за 24 часа вместе с бесконечными вариациями, предлагающими научить C, SQL, Ruby, алгоритмы и т. Д. За несколько дней или часов. Расширенный поиск Amazon по запросу [название: научить, себя, часов, с: 2000 и нашел 512 таких книг. Из первой десятки девять книг по программированию (вторая - по бухгалтерскому учету). Аналогичные результаты дает замена «учи себя» на «учись» или «часов» на «дни»."

Вывод таков: либо люди спешат учиться о программировании, или о том, что программирование как-то невероятно проще узнать больше всего на свете. Felleisen et al. отдают дань этой тенденции в своей книге How to Design Programs , когда они говорят «Плохое программирование - это просто. Идиоты могут выучить его за 21 день , даже если это манекенов ». Комикс Abtruse Goose тоже получил свое.

Давайте проанализируем, что такое заголовок Научитесь C ++ за 24 часа может означать:

  • Научитесь: За 24 часа у вас не будет времени написать несколько важные программы, и извлекайте уроки из своих успехов и неудач с их.У вас не будет времени работать с опытным программистом и понять, каково жить в среде C ++. Короче, ты не будет времени многому научиться. Таким образом, книга может говорить только о поверхностное знакомство, а не глубокое понимание. Как сказал Александр Поуп, небольшое обучение - опасная вещь.
  • C ++: Через 24 часа вы сможете изучить некоторые синтаксисы C ++ (если вы уже знаете другой язык), но вы не могли узнать много о том, как использовать язык.Короче говоря, если бы вы были, скажем, Базовый программист, вы можете научиться писать программы в стиле Базовый с использованием синтаксиса C ++, но вы не могли узнать, что такое C ++ на самом деле хорошо (и плохо) для. Так в чем смысл? Алан Перлис однажды сказал: "Язык, который не влияет на то, как вы думать о программировании, знать не стоит ». Один из возможных моментов: что вам нужно немного изучить C ++ (или, что более вероятно, что-то например, JavaScript или обработка), потому что вам нужно взаимодействовать с существующий инструмент для выполнения конкретной задачи.Но тогда ты не научиться программировать; вы учитесь выполнять эту задачу.
  • за 24 часа: К сожалению, этого недостаточно, так как следующий раздел показывает.

Научитесь программировать за десять лет

Исследователи (Блум (1985), Брайан и Хартер (1899), Хейс (1989), Simmon & Chase (1973)) показали это требуется около десяти лет, чтобы развить опыт в любом из множества зоны, в том числе шахматы, музыкальная композиция, телеграф работа, рисование, игра на фортепиано, плавание, теннис и исследования в нейропсихология и топология.Ключ совещательный практика: не просто делать это снова и снова, а бросать вызов самому себе с задачей, которая выходит за рамки ваших текущих возможностей, попробуй ее, анализировать вашу производительность во время и после выполнения и исправлять никаких ошибок. Потом повторить. И повторить еще раз. Кажется, нет настоящие ярлыки: даже Моцарт, который в 4 года был музыкальным вундеркиндом, Еще 13 лет до того, как он начал создавать музыку мирового уровня. В другой жанр, Битлз, казалось, ворвались на сцену с череда хитов №1 и появление на шоу Эда Салливана в 1964 году.Но с тех пор они играли в маленьких клубах Ливерпуля и Гамбурга. 1957 г., и, хотя на раннем этапе они приобрели массовую популярность, их первая великая критический успех, Sgt. Peppers , выпущен в 1967 году.

Малькольм Гладуэлл популяризировал эту идею, хотя он концентрируется на 10 000 часов, а не на 10 годах. Анри Картье-Брессон (1908-2004) использовал другую метрику: «Ваши первые 10 000 фотографий - ваши худшие». (Он не Ожидайте, что с цифровыми фотоаппаратами некоторые люди смогут достичь этой отметки за неделю.) Настоящий опыт может занять всю жизнь: Сэмюэл Джонсон (1709–1784) сказал: «Превосходство в любом отделе может быть достигается только трудом всей жизни; его нельзя покупать в меньшая цена ». И Чосер (1340-1400) жаловался:« Lyf такой короткий, ремесло так долго до lerne ». Гиппократ (ок. 400 г. до н.э.) известен отрывком« ars longa, vita brevis ", которая является частью более длинной цитаты" Ars longa, vita brevis, occio praeceps, Experimentum periculosum, iudicium difficile ", что на английском языке переводится как" Life is short, [the] craft долго, возможность мимолетная, коварный эксперимент, суждение трудно." Конечно, ни одно число не может быть окончательным ответом: это не кажется разумным предположить, что все навыки (например, программирование, игра в шахматы, игра в шашки и музыка) может потребоваться одинаковое количество времени для освоения, и все люди займет ровно столько же времени. Так как Профессор К. Андерс Эрикссон сказал: «В большинстве областей замечательно, сколько времени даже самые талантливые люди нужны для достижения высочайшего уровня производительности. Число 10000 часов просто дает вам ощущение, что мы говорим годы от 10 до 20 часов в неделю, и те, кого некоторые люди утверждают, являются наиболее талантливыми людьми по-прежнему должны достичь высочайшего уровня."

Итак, вы хотите быть программистом

Вот мой рецепт успеха в программировании:

  • Заинтересуйтесь программированием и займитесь программированием, потому что это весело. Удостовериться что это достаточно весело, так что вы будете готовы потратить свои десять лет / 10 000 часов.
  • Программа . Лучший способ обучения - это обучение при выполнении. Говоря более технически, «максимальный уровень производительность для физических лиц в данной области не достигается автоматически в зависимости от расширенного опыта, но уровень производительность может быть увеличена даже очень опытными людьми, поскольку результат сознательных усилий по улучшению."(стр. 366) и «наиболее эффективное обучение требует четко поставленной задачи с соответствующий уровень сложности для конкретного человека, информативная обратная связь и возможности для повторения и исправления ошибок. »(стр. 20-21) Книга Познание на практике: разум, математика и культура в повседневной жизни Life - интересный ссылка на эту точку зрения.
  • Поговорить с другими программистами; читайте другие программы. Это важнее чем любая книга или учебный курс.
  • Если хотите, проучитесь четыре года в колледже (или больше в колледже Высшая школа). Это даст вам доступ к некоторым вакансиям, требующим учетные данные, и это даст вам более глубокое понимание области, но если вам не нравится школа, вы можете (с некоторой самоотдачей) получить подобный опыт самостоятельно или на работе. В любом случае книжное обучение само по себе не быть достаточным. «Компьютерное образование не может сделать эксперта программист больше, чем изучение кистей и пигментов может сделать кто-то искусный художник », - говорит Эрик Реймонд, автор книги The New Словарь хакеров .Один из лучших программистов, которых я когда-либо нанял, имел только высшее образование; он создал много отличного программного обеспечения, имеет собственную группу новостей и сделал достаточно акций, чтобы купить собственный ночной клуб.
  • Работа над проектами с другими программистами. Будь лучшим программистом по некоторым проектам; быть худшим для других. Когда ты лучший, вы можете проверить свои способности вести проект и вдохновлять другие с вашим видением. Когда ты хуже всех, ты узнаешь, что за мастера делают, и вы узнаете, что им не нравится делать (потому что они заставить вас сделать это за них).
  • Работа над проектами после других программистов. Понять программу, написанную кем-то другим. Посмотри, что нужно для понять и исправить это, когда оригинальные программисты не вокруг. Подумайте, как разрабатывать свои программы, чтобы упростить тех, кто будет их поддерживать после вас.
  • Выучите не менее полдюжины языков программирования . Включите один язык, который подчеркивает абстракции классов (например, Java или C ++), тот, который подчеркивает функциональную абстракцию (например, Lisp, ML или Haskell), один который поддерживает синтаксическую абстракцию (например, Lisp), один который поддерживает декларативные спецификации (например, Prolog или C ++ шаблоны) и тот, который подчеркивает параллелизм (например, Clojure или Go).
  • Помните, что в «информатике» есть « компьютер ». Know сколько времени требуется вашему компьютеру, чтобы выполнить инструкцию, получить слово из памяти (с промахом в кэше и без него), чтение последовательных слов с диска и поиск нового места на диске. (Ответы здесь.)
  • Присоединяйтесь к языку стандартизация усилий. Это может быть комитет ANSI C ++ или может решить, будет ли ваш локальный стиль кодирования иметь 2 или 4 пробела уровни отступов.В любом случае вы узнаете, что другие люди как в языке, насколько глубоко они это чувствуют, и, возможно, даже немного о том, почему они так себя чувствуют.
  • Имейте здравый смысл, чтобы отказаться от усилий по стандартизации языка как как можно быстрее.
Учитывая все это, сомнительно, как далеко вы можете пройти, просто книжное обучение. Перед тем как родился мой первый ребенок, я прочитал все How До книг, а еще чувствовал себя бестолковым новичком. 30 месяцев спустя, когда должен был родиться второй ребенок, вернулась ли я к книгам на повышение квалификации? Нет.Вместо этого я полагался на свой личный опыт, который оказался гораздо более полезным и обнадеживающим для меня, чем тысячи страниц, написанных экспертами.

Фред Брукс, в своем эссе No Silver Bullet определили план из трех частей для поиска отличных разработчики программного обеспечения:

  1. Систематически определяйте лучших дизайнеров как можно раньше.
  2. Назначьте профессионального наставника, который будет отвечать за развитие потенциального клиента и тщательно вести карьерный досье.
  3. Предоставляйте возможность развивающимся дизайнерам взаимодействовать и стимулировать друг друга.
Это предполагает, что некоторые люди уже обладают качествами, необходимыми для быть отличным дизайнером; задача состоит в том, чтобы как следует их уговорить. Алан Перлис выразился более лаконично: «Каждого можно научить лепить: Микеланджело пришлось бы научить, как этого не делать. Так и с великие программисты ». Перлис говорит, что у великих есть внутреннее качество, выходящее за рамки их обучения. Но причем тут качество взято? Это врожденное? Или они развивают это через трудолюбие? Как Огюст Гюсто (вымышленный повар в Ratatouille ) говорит: «Готовить может любой, но только бесстрашный. может быть здорово."Я думаю об этом больше как о готовности посвятить большой часть жизни к совещательной практике. Но возможно бесстрашный - способ резюмировать это. Или, как критик Гюсто, Антон Эго говорит: «Не каждый может стать великим художником, но великим художник может прийти откуда угодно ".

Так что покупайте книгу по Java / Ruby / Javascript / PHP; Вы будете наверное, получу от этого какую-то пользу. Но ты не изменишь свою жизнь, или ваш реальный общий опыт программиста за 24 часа или 21 день. Как о работе трудно постоянно улучшаться в течение 24 месяцев? Что ж, теперь вы кое-чего начинаете...


Список литературы

Блум, Бенджамин (ред.) Развитие талантов в молодежи , Баллантайн, 1985.

Брукс, Фред, No Silver Bullets , IEEE Computer, vol. 20, нет. 4, 1987, с. 10-19.

Брайан, W.L. & Хартер, Н. "Исследования по телеграфному языку: Приобретение иерархии привычек. Обзор психологии , 1899, 8, 345-375

Хейс, Джон Р., Полное решение проблем Лоуренс Эрлбаум, 1989.

Чейз, Уильям Г. и Саймон, Герберт А. «Восприятие в шахматах» Когнитивная психология , 1973, 4, 55-81.

Лаве, Жан, Познание на практике: разум, математика и культура в повседневной жизни Life , Cambridge University Press, 1988.


Ответы

Приблизительное время для различных операций на типичном ПК:
выполнить типичную инструкцию 1/1000000000 с = 1 наносекунда
выборка из кэш-памяти L1 0.5 наносекунд
неправильное предсказание перехода 5 наносекунд
выборка из кэш-памяти L2 7 наносекунд
Блокировка / разблокировка Mutex 25 наносекунд
выборка из основной памяти 100 наносекунд
отправить 2 Кбайта по сети 1 Гбит / с 20000 наносекунд
Последовательное чтение 1 МБ из памяти 250 000 наносекунд
выборка из нового места на диске (поиск) 8000000 наносекунд
Последовательное чтение 1 МБ с диска 20000000 наносекунд
отправить пакет из США в Европу и обратно 150 миллисекунд = 150 000 000 наносек

Приложение: выбор языка

Несколько человек спрашивали, какой язык программирования им следует изучить в первую очередь.Однозначного ответа нет, но рассмотрите следующие моменты:
  • Используйте своих друзей . На вопрос «какая операционная система должна Я использую Windows, Unix или Mac? ", Я обычно отвечаю:" использовать что угодно ваши друзья используют ". Вы получаете преимущества, извлекая уроки из друзья компенсируют любую внутреннюю разницу между ОС или между языками программирования. Также подумайте о своих будущих друзьях: сообщество программистов, частью которого вы станете, если вы Продолжать. Есть ли у выбранного вами языка большое растущее сообщество или маленький умирающий? Есть ли книги, веб-сайты и онлайн-форумы получить ответы от? Вам нравятся люди на этих форумах?
  • Будьте проще .Языки программирования, такие как C ++ и Java предназначены для профессиональной разработки большими командами опытные программисты, озабоченные эффективностью выполнения их код. В результате эти языки имеют сложные части, предназначенные для этих обстоятельств. Вы озабочены обучением программированию. Вам не нужны эти сложности. Вам нужен язык, который был разработан, чтобы его было легко выучить и запомнить одинокий новый программист.
  • Играть. Каким способом вы бы предпочли научиться играть на пианино: обычный интерактивный способ, при котором вы слышите каждую ноту, как только нажимаете клавишу, или «пакетный» режим, в котором вы слышите ноты только после того, как закончите целую песню? Понятно, что интерактивный режим облегчает обучение игре на фортепиано, а также программирование.Настаивайте на языке с интерактивным режимом и используйте его.
Учитывая эти критерии, мои рекомендации по первому программированию язык будет Python или Схема . Другой вариант - Javascript, не потому, что он идеально подходит для начинающих, но потому что для этого есть так много онлайн-руководств, таких как Учебник Ханской академии. Но твой обстоятельства могут отличаться, и есть и другие хорошие варианты. Если ваш возраст является однозначным числом, вы можете предпочесть Алиса или писк или Blockly (они также могут понравиться учащимся старшего возраста).Важный дело в том, что вы выбираете и начинаете.

Приложение: книги и другие ресурсы

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

Как научиться программированию? [Руководство для начинающих]

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

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

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

Как научиться программированию?

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

1. Ознакомьтесь с языком программирования

Знакомство с языком программирования - это первый шаг к изучению программирования. Люди часто начинают с C, C ++, Java или Python. Я лично предпочитаю C ++ вначале, поскольку он не слишком прост (как Python) и не слишком несовершенен с точки зрения библиотек (как C).C ++ довольно быстр и имеет хорошую библиотечную поддержку - лучшее из обоих миров! Кроме того, C ++ - хороший выбор для соревновательного программирования, поскольку он довольно быстр и поддерживает стандартную библиотеку шаблонов (STL). Выбор первого языка очень субъективен и зависит от ваших интересов и целей. Возможно, вас заинтересуют интерфейс, серверная часть, разработка мобильных приложений, разработка игр, наука о данных и т. Д. Если ваша главная цель - получить работу, обязательно ознакомьтесь с нашей статьей о том, какой язык программирования лучше всего подходит для получения работы ?

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

2. Изучите структуры данных и алгоритмы

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

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

3. Запачкайте руки соревновательным программированием

Изучив структуры данных и алгоритмы, вы должны начать решать проблемы на таких сайтах, как SPOJ, Codechef, Codeforces, Topcoder, Hackerrank, Geeksforgeeks и т. Д.Чем больше проблем решишь, тем лучше. Однако лучше решать проблемы в порядке возрастания сложности. Вы можете отсортировать проблемы в порядке убывания количества присланных решений и приступить к решению. Решив около 100 смешанных задач, вы приобретете уверенность в своих навыках программирования.

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

4. Сделать проект

Теперь, когда вы усовершенствовали свои навыки решения проблем и программирования, пришло время создать несколько полезных приложений. Вы можете выбрать какой-нибудь популярный фреймворк для веб-разработки (Django, Flask, Ruby on Rails и т. Д.) И создать с его помощью проект. Создание приложения позволит вам почувствовать настоящую разработку программного обеспечения, что и делают большинство программистов.

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

5. Изучите

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

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

В настоящее время существует множество онлайн-ресурсов для изучения любой из вышеупомянутых областей. Но с изобилием доступных ресурсов новичку сложно найти отличный учебник из такого множества вариантов. Что бы вас ни интересовало, вы можете найти лучшие учебники, рекомендованные сообществом программистов, для этого языка / фреймворка на Hackr.io. Помимо руководств и курсов, вы также можете найти лучшие книги и упражнения / проекты / практические задачи на Hackr.

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

Это был мой подход к обучению программированию; вот как я научился программировать :) Поскольку вы читаете эту статью, я предполагаю, что вы серьезно относитесь к изучению программирования, и это хорошо! Надеюсь, вы нашли эту статью полезной. Всего наилучшего для вашего обучения! Не стесняйтесь задавать мне свои вопросы / сомнения в комментариях.

Еще читают:

,

Смотрите также