Топ-50 лучших курсов программирования с нуля для начинающих 2021

Содержание:

Функциональное программирование

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

Между последователями разных парадигм, оказавшимися в одной ветке комментариев, всегда разгорается бесконечный холивар с обвинениями в «ООП/ФП головного мозга». Но бывают и программисты, готовые применить любой из подходов в зависимости от проекта.

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

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

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

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

Мой топ 10 лучших курсов программирования для новичков

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

Для удобства сделал табличкой, но ниже есть списком с более подробной информацией и кратким описанием.

Школа Курс Длительность Цена Ссылка
Нетология Как стать программистом 2 дня Бесплатно На сайт
GeekBrains Основы программирования 1 месяц Бесплатно На сайт
Нетология Python-разработка для начинающих 2 недели Бесплатно На сайт
XYZ School Intro Game Code Пару часов Бесплатно На сайт
Нетология Старт в программировании 2 недели 990 руб. На сайт
Skillbox Профессия Python-разработчик 12 месяцев 3 900 руб/мес На сайт
Skillbox Профессия iOS-разработчик 12 месяцев 3 900 руб/мес На сайт
Нетология Веб-разработчик с нуля 6 месяцев 4 996 руб/мес На сайт
BeOnMax Веб-разработчик с нуля до результата 23 часа 90 рублей/месяц и выше На сайт
GeekBrains Факультет разработки на C++ 12 месяцев 4 990 руб/мес На сайт

1. Как стать программистом от Нетологии

Бесплатный курс от Нетологии, который поможет вам начать карьеру в этой сфере и более точно определиться с направлением.

  • Цена: бесплатно,
  • Длительность: 2 дня,
  • Формат: онлайн-лекции.

2. Основы программирования от GeekBrains

Еще один бесплатный курс по основам, но уже от школы GeekBrains.

  • Цена: бесплатно,
  • Длительность: 1 месяц,
  • Формат: онлайн-лекции.

3. Python-разработка для начинающих

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

  • Цена: бесплатно,
  • Длительность: 2 недели,
  • Формат: вебинары, домашки и тесты.

4. Intro Game Code от XYZ School

Бесплатный курс от School XYZ по разработке игр. Подойдет тем, кто знает хотя бы один язык программирования.

  • Цена: бесплатно,
  • Длительность: несколько часов,
  • Формат: лекции в записи.

5. Старт в программировании

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

  • Цена: 990 рублей,
  • Длительность: 2 недели,
  • Формат: онлайн-вебинары и задания.

6. Профессия Python-разработчик от Skillbox

Огромный полноценный курс по Python-разработке от топовой онлайн-школы Skillbox.

  • Цена: 3 900 рублей/месяц,
  • Длительность: 12 месяцев,
  • Формат: лекции + практика + домашки.

7. Профессия iOS-разработчик от Skillbox

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

  • Цена: 3 900 рублей/месяц,
  • Длительность: 12 месяцев,
  • Формат: лекции + практика + домашки.

8. Веб-разработчик с нуля от Нетологии

Курс для веб-разработчиков с нуля от Нетологии. Подойдет даже полным новичкам.

  • Цена: 4 996 рублей/месяц, 89 940 рублей — сразу,
  • Длительность: 6 месяцев,
  • Формат: вебинары + практика + домашки.

9. Веб-разработчик с нуля до результата от BeOnMax

Еще один курс по веб-разработке, но уже от BeOnMax.

  • Цена: 90 рублей/месяц и выше,
  • Длительность: 23 часа,
  • Формат: видеоуроки.

10. Факультет разработки на C++ от GeekBrains

Большой курс по C++ от онлайн-университета GeekBrains.

  • Цена: 4 990 рублей/месяц,
  • Длительность: 12 месяцев,
  • Формат: онлайн-обучение.

Каждый разработчик ПО умеет программировать, но не каждый программист может разрабатывать ПО

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

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

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

Ориентированный на решения подход

решения задач

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

Удобство использования

  • Хорошо спроектированное ПО в формах ввода данных пользователей не будет учитывать регистр символов в поле электронной почты и удалит начальные и конечные пробелы. Не нужно усложнять пользователям жизнь из-за того, что у них включен CAPSLOCK: электронный адрес не зависит от регистра. Если программа принимает новые адреса электронной почты, проверяйте их заранее и понятным языком сообщайте пользователю, что он, возможно, ввел неправильный адрес. Здесь имеются в виду и банальные ошибки — например, отсутствие символа @, — и не столь очевидные: например, ошибочное написание популярного домена: «gmail.ocm».
  • Если пользователя нужно куда-либо перенаправить, хорошая программа запомнит исходный пункт и после выполнения необходимых действий вернет туда пользователя. Она запомнит и уже известные данные и взаимодействия, которые нужно связать с последующими шагами пользователя. Предположим, к примеру, что вы на сайте Expedia искали авиарейсы как гость, не входя в систему, — а затем решили создать учетную запись. Все предыдущие поисковые запросы в новой учетной записи сохранятся, и вы сможете ими воспользоваться с других машин.
  • Хорошее ПО разрабатывается с учетом реальных сценариев работы в ней пользователей. Нельзя просто добавлять какие-то функции — нужно поставить себя на место пользователя. На днях я бронировал рейс авиакомпании United Airlines и забыл добавить свой номер часто летающего пассажира. Получив подтверждение, я отправился на веб-сайт United Airlines, чтобы добавить этот номер в рейс, и это заняло у меня десять минут. Очевидного пути добавить этот номер не было, поэтому пришлось лазать по всем ссылкам, которые, как мне казалось, могли привести к нужному функционалу. Наконец я нашел нужную страницу: оказалось, что в прошлый раз я не заметил нужное поле, потому что оно было глубоко зарыто в большой форме. В итоге мне понадобилось отредактировать данные о пассажире, прокрутить на этой форме штук 20 полей ввода, выбрать нужный тип номера и обязательно ввести номер телефона — иначе форму отправить было нельзя. Это пример программы, которую мог бы разработать человек, не пытавшийся думать с точки зрения пользователя.

Используемые инструменты

изобретении мгновенных визуальных представленийЕсли вы еще не видели выступление Брета — обязательно посмотрите его.

Алгоритмы

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

  1. Открыть чайник.
  2. Если в чайнике нет воды — набрать воду из под крана.
  3. Поставить чайник на газовую плиту.
  4. Открыть газ.
  5. Зажечь огонь.
  6. Дождаться, пока закипит вода в чайнике.
  7. Насыпать в чашку заварку.
  8. Залить заварку горячей водой.

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

Существует несколько способов описания алгоритма:

  • граф — схемы;
  • словесный;
  • псевдокод;
  • программный код.

Как научиться?

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

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

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

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

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

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

Не беспокойтесь по поводу математики. Желательно знать, что такое остаток от деления числа на другое число, но все зависит от задач, которые перед вами стоят. Конечно, если вы хотите хитро обрабатывать данные, то вам нужна математика в том объеме, который нужен для такой обработки.

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

Есть мнение, что на фоне развития искусственного интеллекта и машинного обучения программисты скоро будут не нужны: компьютеры сами научатся себя программировать. Но мне кажется, что это не так. До тех пор, пока есть задачи и пока нужно объяснять, как их решать, программирование будет существовать. Безусловно, программирование сильно эволюционирует, за последние 20 лет оно изменилось очень сильно. Но от того, что компьютеры стали умнее, разработчиков меньше не стало — наоборот, их стало гораздо больше. И мне кажется, что дальше будет происходить то же самое.

Шаг 4. Выбор инструментов

Как правило, в книгах указан перечень инструментов со ссылками на их загрузку.

Обычно это IDE – оболочка – среда разработчика, включающая в состав:

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

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

В Python, например, программный код исполняется интерпретатором прямо в консоли, куда вводится. Компилятор для запуска приложения не требуется, но конечный пользователь должен запустить соответствующею среду. https://www.python.org/downloads/

Для написания кода подойдёт любой текстовый редактор. Многие из продвинутых инструментов поддерживают синтаксис языков программирования и упрощают кодинг.

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

Рис. 7 – IDE редактор

При работе с небольшими проектами есть смысл прибегнуть к помощи онлайн-редакторов кода, которые также поддерживают подсветку синтаксиса, автоматический (интеллектуальный) ввод и даже выполнение кода.

С++ (Си-плюс-плюс)

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

Главным его плюсом является то, что он полностью универсален. На С++ можно писать всё что угодно, именно это и обеспечило ему любовь профессионалов. Кроме того, он относительно прост в освоении — тому, кто уже изучил С, Python или Java, будет нетрудно разобраться и в С++. Верно и обратное, так что С++ часто представляют как своего рода универсальную формулу и некий ключик к миру программирования вообще.

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

Машинный язык

Процессор компьютера не способен понимать напрямую языки программирования, такие как C++, Java, Python и т.д. Очень ограниченный набор инструкций, которые изначально понимает процессор, называется машинным кодом (или «машинным языком»). То, как эти инструкции организованы, выходит за рамки данного введения, но стоит отметить две вещи.

Во-первых, каждая команда (инструкция) состоит только из определенной последовательности (набора) цифр: и . Эти числа называются битами (сокр. от «binary digit») или двоичным кодом.

Например, одна команда машинного кода архитектуры ×86 выглядит следующим образом:

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

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

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

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

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

С чего начать

Популярные языки программирования

Рейтинги популярности ЯП могут отличаться. На формирование ТОП-списка влияет регион, где проводилось исследование, и параметры, на которых основан рейтинг.

Согласно TIOBE, десятка самых популярных языков выглядит такРейтинг RedMonkThe PYPL PopularitY of Programming Language Index

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

А если вы мечтаете работать в конкретной компании, узнайте для начала, на каких языках программирования она работает. Netflix, SoundCloud и Adobe используют язык Go, Apple — Objective-C (преемником стал Swift), выбор NASA и — Python, компании , GitHub и Kickstarter использовали для создания язык . 

Как выбрать направление и язык программирования

Какие-то языки программирования заточены под решение конкретных задач, какие-то — универсальные:

  • Python — язык программирования общего назначения. На нем можно программировать и приложения, и решения для нейросетей.
  • JavaScript — широко используется во фронтенд-разработке, отвечает за интерактивность сайтов.
  • Java — язык программирования, на котором можно реализовать сайты, Android-приложения, трейдинговые системы, игры, open source фреймворки.
  • С# — на этом языке можно кодить игры, приложения, веб-сервисы; идеально сочетается с экосистемой Microsoft.
  • PHP — ЯП, разработанный для написания web-приложений, которые воспроизводятся на веб-сервере. 
  • — многофункциональный язык программирования с доброжелательным комьюнити и высокой скоростью разработки. И так далее.

Самый легкий способ выбрать язык программирования — пройти наглядный тест. Выберите направление, в котором вам было бы интересно работать, и система подберет оптимальный язык программирования. Пример подобного теста:

Шаг 1Шаг 2Шаг 3

Таким образом, с начала вы определяетесь с направлением, а после выбираете ЯП.

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

Важно! После прочтения вам может стать легче! Программисты — логичный народ, они не пишут каждый код заново. Есть такое понятие, как фреймворки

Это код-полуфабрикат, который они кастомизируют, улучшают под свои задачи. 

Что почитать?

Онлайн-медиа — здесь обсуждаются нишевые события и более узкие темы.

  • Google Developers — надежный первоисточник, из которого можно узнавать актуальные новости о продуктах компании.
  • I Programmer — портал для программистов. Новости обо всех направлениях от UX до робототехники и всех языках программирования.
  • Smashing Magazine — статьи о веб-дизайне: разбор кода, свежие кейсы, советы по трудоустройству и общению с клиентами.
  • Хабр — универсальный русскоязычный ресурс, где можно найти гайды, обсуждения, код-ревью и кейсы от разработчиков разных компаний от IT-гигантов до небольших digital-агентств.
  • Вастрик — авторский инди-блог про IT и выживание в мире технологий. Тексты про машинное обучение, блокчейн, VR, вычислительную фотографию, машинный перевод и многое другое.
  • For Web — блог в Twitter с полезными материалами для фронтендеров: свежие статьи, доклады и инструменты от сибирского разработчика Андрея Романова.

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

  • Reddit — популярный форум на все темы подряд, на котором часто сидят опытные разработчики, выкладывают свои кейсы и комментируют другие публикации. Найти их можно по тегу «programming».
  • Stack Overflow — закрытый клуб для программистов без рецептов и котиков. Здесь можно запросить у опытных коллег code review, комментировать публикации и давать им оценку.
  • CyberForum — форум программистов, системных администраторов, где помогают в решении задач по программированию.
  • Game Dev — форум, на котором разбирают создание игр и все, что с ним связано.

Что ещё должен знать программист: математика и английский?

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

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

Как получить первый опыт и первую работу

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

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

  1. Выполните несколько заказов на биржах фриланса. Это могут быть «Фрилансим» или Upwork. Предлагайте свои услуги бесплатно, тогда к вам придут первые заказчики.
  2. Найдите единомышленников и создайте с ними общий проект. Люди объединяются для таких целей почти на каждой образовательной площадке, где есть курсы по программированию.
  3. Выберите курсы, организатор которых помогает с трудоустройством. Например, в GeekBrains после обучения открывается доступ к стажировкам от разных компаний, в том числе — оплачиваемым. GeekUniversity и «ШАГ» гарантируют трудоустройство своим выпускникам.

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

Про мнемокоды или о фразах в языках программирования

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

Малопонятно, что значат эти странные цифры и буквы: C9 88 32. Хотя уже лучше, чем и-кание («I») и о-кание («О»), точнее, лучше сочетания единиц и нулей.

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

  • UP будет означать «слезай»,
  • FROM будет означать русский предлог «со» (или «с»),
  • а ELEPHANT есть не что иное, как «слон».

Настоящие английские слова буквально, в переводе, означают следующее:

  • up – вниз,
  • from – от или с,
  • elephant – слон.

Осталось сделать таблицу перевода с условного французского языка (с шестнадцатеричного кода) на условный английский. Выглядеть она будет так:

  • 32=ELEPHANT,
  • 88=FROM,
  • C9=UP.

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

С9 88 32 = UP FROM ELEPHANT

Последняя запись UP FROM ELEPHANT есть не что иное, как мнемокод.

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

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

Двоичные и шестнадцатеричные коды более понятны железному автомату, каковым является компьютер и его сердце – процессор. Мнемокод может иметь, например, такой вид: UP FROM ELEPHANT. Согласитесь, что такой мнемокод уже может читать и писать человек.

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

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