## О программировании Прежде чем перейти к освещению темы веб-программирования (или создания сайтов), я бы хотел написать несколько слов относительно темы программирования в целом. Таким образом сориентировав читателя в существующих на момент написания реалиях. ### Что такое программирование Начну с того, что все разновидности программирования, так или иначе, преследуют цель автоматизации процессов. Это сродни тому, как родители учат ребенка делать повседневные дела: чистить зубы или завязывать шнурки. Родители стараются передать знания о каком-то изученном ними процессе, с целью делегировать его ребенку. При этом важно дать максимально точные указания, которые не породят путаницу и позволят родителям чувствовать себя спокойно доверяя дело малышу. Родителям в данной ситуации, также, важно хорошо проанализировать существующую реальность и выдвинуть представление о реальности желаемой. > Хочу, чтобы чистил зубы. Утверждению приведенном выше недостает конкретики (Сейчас не умеет, не хочет? Как именно он должен это делать? Когда или с какой периодичностью?). Еще утверждению не хватает глубины продуманности (Что делать, если нет зубной пасты? Что делать, если щетка упала в унитаз?). > Сейчас ИМЯ_РЕБЕНКА не умеет чистить зубы. Хочу чтобы он умел осуществить требующеюся манипуляцию механически и повторял ее дважды в день (после пробуждения и перед отходом ко сну) в течении всей своей жизни. При такой расширенной постановке становится проще вычленить те критерии, которых требуется добиться, а значит и методы для этого. Формулировка задачи подобным образом является, по сути, [алгоритмом](https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC), родитель из примера является программистом, а ребенок - компьютером, который научится что-либо делать по сочиненной программе. Если на некоторое время задержаться в пределах аналогии с ребенком-компьютером, то мы должны будем отметить важность такого понятия как форма передачи информации, говоря проще - языка общения. И ребенку, и компьютеру нужны какие-то исходные данные. Ребенок не знает пока ничего о кариесе, зубной пасте и стоматологическом кабинете, а компьютер не имеет малейшего представления о понятиях привычных для нас (товарах, котировках акций, авиабилетах - словом всем том, что мы можем захотеть обслуживать или обрабатывать програмно). Вся необходимая информация содержится в языке. Это и понятия, и способ передачи инструкций. Для общения с компьютером есть свои [языки](https://youtu.be/0IkaXvwjDf8). Таким образом **программирование** - это процесс сочинения алгоритмов и их описание на том или ином языке, понятном компьютеру. В рамках таком определении важно отметить, что алгоритмы - универсальны между языками программирования. Один и тот же алгоритм можно описать разными языками. Поэтому навык решения задач выходит на первый план перед знанием особенностей того или иного языка программирования. Интересные алгоритмы (в сети достаточно разного рода материалов по теме, поэтому ограничусь ссылками на вики, которая совершенно не пытается подать информацию понятно, но может дать какой-то начальный толчок): - [Сортировка](https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8) - [Задача о кратчайшем пути](https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D0%BA%D1%80%D0%B0%D1%82%D1%87%D0%B0%D0%B9%D1%88%D0%B5%D0%BC_%D0%BF%D1%83%D1%82%D0%B8) - [Задача о рюкзаке](https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%D0%B5) Каждый из описанных алгоритмов имеет практическое применение в жизни. Сортировку можно встретить на сайте любого интернет-магазина или в программе на телефоне, где требуется выстроить элементы в определенном порядке. Частные решения задачи о кратчайшем пути позволяет таким сервисам как Netflix создавать рекомендации фильмов для своих подписчиков, компании Tesla создавать самоуправляющиеся автомобили, а Facebook - находить среди миллиардов пользователей тех, кто могут быть между собой знакомы. Решения задачи о рюкзаке позволяет оптимально распланировать распределение ресурсов конечного количества - арендуемой площади, используемого в строительстве или на производстве материала и тд. Алгоритмов существует огромное множество и изучить их все не представляется возможным. Тем не менее вполне возможным является своеобразная настройка своего ума для решения новых задач на примере уже решенных подобного плана. ### Как выбрать язык? #### По сфере применения Исторически сложилось, так, что разные языки программирования нашли свое применение в разных сферах человеческой деятельности. На то есть много причин, например, высокая эффективность в определенной области (скажем, [PERL](https://ru.wikipedia.org/wiki/Perl) очень быстро работает с текстом, резонно, что некоторое время назад многие программы для работы с текстом писали на нем). Или, как другой пример, широкая сфера применения (Javascript позволяет писать приложения для разных сред исполнения - на компьютере у пользователя или на сервере в интернете). Так или иначе сейчас мы имеем некоторое распределение языков по сфере их применения. Это означает, что выбирая программирование своим родом занятости каждому следует определить желаемую сферу применения. Затем же определить язык, который в этой сфере используется. Приведу несколько примеров. Программирование для мобильных телефонов. Подходят: Java (операционная система андроид написана на Java), Swift (используется на телефонах Apple). Программирование для интернета. Подходят: Javascript (отвечает за все интерактивные события на сайтах, равно как за сохранение и добычу данных для того или иного сайта), Java (служит для обработки данных), PHP (сродни Java, но отличается [синтаксисом](https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%81_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)) ) Программирование для [IoT](https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82_%D0%B2%D0%B5%D1%89%D0%B5%D0%B9): Rust, Go, C++, C# #### По предложенной заработной плате Программирование, помимо прочего это - труд, а труд, без сомнения, должен быть вознагражден за время на него потраченное. Дабы составить некоторую картину относительно положения дел на рынке занятости можно воспользоваться сайтом: https://djinni.co/salaries/ (потребуется, скорее всего, зарегистрироваться, это бесплатно). Пользуясь фильтрами слева можно выбирать языки, опыт работы и тд. и получать приблизительную оценку потенциальной заработной платы. ## О разработке сайтов Беглое представление о том, что такое сайты и как они работают можно получить [здесь](https://developer.mozilla.org/ru/docs/Learn/Getting_started_with_the_web/How_the_Web_works). Фактическую разработку можно разделить на две крупные части - frontend (фронтэнд, дословно - передний край) и backend (бэкэнд, дословно - задний край). Фронтэнд разработчики (программисты часто сами называют себя этим словом, из-за англ. develop - создавать, разрабатывать) создают ту часть сайта, которую будут видеть, и с которой будут взаимодействовать пользователи. То, как выглядят элементы (картинки, кнопки, текст и т.д.), как они себя ведут (анимации, разные эффекты и т.д) задумывается дизайнером сайта и визуализируется в виде изображения, а фронтэнд разработчики превращают представленные, таким образом, макеты в интерактивные страницы. Бэкенд разработчики решают другие задачи. Их забота - обеспечить приток данных на те страницы, которые "оживлены" фронтэнд разработчиками. Если мы возьмем для примера интернет-магазин Розетка, то трудом бэкэнд разработчика будет являться: - определение методики хранения каталога продукции в базах данных - обеспечение доступа к хранимой информации - обеспечение возможности фильтровать и сортировать полученные данные - и т.д Идеальный разработчик может уметь и то, и другое, такой специалист называется full-stack (специалист полного цикла). Все же начинать стоит с чего-то одного и фронтэнд выглядит более понятным предметом для изучения. ## Пара слов о фронтэнд разработке Всю фронтэнд разработку можно уместить в три емких слова: HTML, CSS и Javascript. HTML - специальный язык разметки, который позволяет разработчику наделить определенные элементы страницы некоторым смыслом, понятным для компьютерных программ работающих с этой страницей. Например: ```html <h1>Привет!</h1> <h2>Хорошего дня!</h2> ``` Текст "Привет!" обрамлен специальными тегами, которые дают понять браузеру (программе просмотра веб-страниц), что это заголовок первого уровня. h - происходит от слова heading (буквально - заголовок), 1 - указывает на иерархический уровень (чем меньше число, тем важнее заголовок). Таким образом h2 - подзаголовок для h1, а h3 - подзаголовок для h2 и т.д. Ключевым здесь является то, что обрамляя текст подобным образом мы формируем семантическую структуру документа. Так брузер будет знать где у нас заголовок, где список, а где картинка. CSS - другой язык, который позволяет оформлять элементы страницы (например h1 из примера выше) требующимся образом. Например: ```css h1 { color:red; } h2 { color: green; } ``` Приведенный пример даст браузеру знать, что h1 должен быть написан красным цветом, а h2 - зеленым. Таким образом можно регулировать размеры, цвет, местоположение на странице, и многое другое для любого элемента на странице. Javascript - в приведенной тройке это единственный по-настоящему язык программирования. Дает разработчику возможность динамически менять разные характеристики элементов, их внешний вид, и тд. Например: ```javascript const h2 = document.querySelector('h2'); h2.addEventListener('click', function() { alert("Хорошего вечера!"); }); ``` В первой строке мы говорим с чем мы хотим работать (элемент h2), а затем создаем функцию, которая выводит на экран сообщение "Хорошего вечера!". Функция будет вызвана при нажатии на элемент h2 мышкой ( `h2.addEventListener('click'...` ). Разобравшись досконально с сутью 3-х приведенных языков можно создавать сайты абсолютно любой сложности. Начать предлагается с совместного обучения HTML и CSS, и лишь после них отдельно начинать Javascript. Но это лишь мое субъективное мнение. Несколько ресурсов для начала самостоятельного обучения: Текст: 1. [Самоучитель HTML](http://htmlbook.ru/samhtml) 2. [Самоучитель CSS](http://htmlbook.ru/samcss) 3. [Самоучитель Javascript](https://learn.javascript.ru/) Видео: 1. [HTML для начинающих](https://youtu.be/DOEtVdkKwcU) (отличный канал, по мере продвижения в сторону Javascript на нем можно найти кучу интересного) 2. [CSS для начинающих](https://www.youtube.com/watch?v=SpCUuyZZTp8) 3. [Javascript для начинающих](https://www.youtube.com/watch?v=Bluxbh9CaQ0) Удачи и успехов!