С чего начать в WEB-Разработке

Как войти в мир разработки и не сойти с ума? Разнообразие необходимых знаний, языков и инструментов порой вводит в ступор, при этом в сети обычно можно найти только довольно общие рекомендации. Нужно положить этому конец и поделиться видением того, как стартовать в веб-разработке. Многие советы, конечно же, подойдут для всех направлений разработки, но сконцентрируемся на том, что нужно именно WEB программистам.

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

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

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

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

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

Второй аспект связан со структурой самого кода. Любое новое бизнес-правило, добавленное в нашу программу, увеличивает его сложность. И любая программа со временем становится только сложнее. Все, что мы можем этому противопоставить, это использовать те инструменты, языки и парадигмы, которые позволят нам максимально замедлить рост сложности. С ростом программы на первое место выходят такие аспекты, как создание мощных и грамотных абстракций, повторное использование кода, композиция. Развитию этих навыков способствует декларативная парадигма, код написанный в этом стиле отвечает на вопрос что и позволяет описывать решение задачи в виде спецификации, выполнение которой и является ответом на поставленный вопрос. Яркий пример декларативного стиля это SQL и регулярные выражения, а так же все функциональные языки и языки логического программирования (prolog).

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

По частям

Командная строка

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

Замечание про windows

С Windows ситуация немного особенная. На ней в целом можно начать разрабатывать, но если вы пишете не на .net-платформе, то лучше сразу готовиться к погружению в UNIX системы. Это связано с тем, что почти весь серверный софт пишется под POSIX-совместимые операционные системы, к которым относятся Linux, Mac OS X и множество других. И ваш код почти наверняка будет работать под управлением машины с Linux на борту.

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

Как временное решение, в Windows можно использовать https://www.cygwin.com/. Это слой совместимости с POSIX. Еще одно решение - это полностью перейти на POSIX-совместимую операционную систему, такую как Mac OS X или Ubuntu. Либо в качестве промежуточного варианта использовать виртуализацию, например, VirtualBox.

Среда разработки

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

Среди текстовых редакторов в последнее время большую популярность получил бесплатный https://atom.io/.

Особняком стоят два текстовых редактора. Это emacs и vim. Вокруг них сложилась особая культура, и принципы работы с этими редакторами сильно отличаются от привычных подходов. Они появились раньше всех современных IDE и, судя по всему, переживут их ;)

Системы контроля версий

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

В настоящий момент стандартом де-факто является git, написанный создателем операционной системы Linux, Линусом Торвальдсом. Взаимодействие с git происходит через командную строку, и в базовом варианте есть буквально несколько команд, изучив которые можно начинать полноценно работать с git.

Язык

Мы долго добирались непосредственно до самого процесса написания кода, но таки добрались. В самом начале пути программиста необходимо выработать правильный стиль работы с исходным кодом. Стиль включает в себя то, как вы оформляете исходный код, именуете файлы. Его важно прививать с самого начала, это формирует в вас правильные привычки, что потом позволит проще интегрироваться в существующие проекты и команды. К счастью, в большинстве языков программирования стандарты кодирования 1) описаны, 2) автоматически поддерживаются редакторами (не всегда), 3) проверяются специальными дополнениями, называемыми linter.

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

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

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

Настройка локального и боевого окружения

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

Базы данных

Умение работать с реляционными базами данных — навык, необходимый всем веб-разработчикам. В основе любой реляционной СУБД (система управления базами данных) лежит реляционная алгебра и sql. sql - это декларативный язык для манипулирования данными в СУБД. Он не связан с языками программирования, запросы выраженные на sql выполняются непосредственно внутри СУБД. К счастью, sql стандартизирован и в базовом варианте одинаков для всех реляционных баз данных. Поэтому, в отличие от языков программирования, переход с одной базы к другой может быть практически прозрачен для программиста.

Изучение реляционных баз данных это в первую очередь изучение стандарта sql, то есть изучение того, как работать с sql. Мы рекомендуем делать это используя postgresql, так как эта СУБД очень сильно придерживается стандарта и обладает мощными возможностями. В дальнейшем вам придется взаимодействовать с базой данных используя ваш язык программирования. Что в конечном счете сводится к генерации правильных sql запросов.

Про веб

DNS

Когда вы делаете запрос к сайту google.com, то, на самом деле, ваш компьютер подключается к удаленному компьютеру и дальше происходит обмен данными между ними. Но как браузер узнает к какому серверу подключиться? Получение ip адреса по доменному имени работает благодаря DNS (Domain Name System — система доменных имён). Это один из краеугольных камней в работе современного веба. На хабре есть детальная статья объясняющая как работает DNS.

Протоколы (tcp/ip, http, webdav, websockets)

Основной всего интернета (да и вообще любой сети) является стек протоколов tcp/ip. Конечно же, его не обязательно знать досконально, но без понимания, что такое порт, и, как в целом происходит коммуникация, далеко не уедешь. А вот с http совершенно другая история. Этот протокол, по которому общается браузер с бекендом сайта поверх tcp. http текстовый протокол без состояния с достаточно простыми правилами работы. Знать его важно, а самое приятное то, что это не сложно.

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

Хостинг

В конце концов все, что вы напрограммировали, нужно куда-то залить и запустить. Чаще всего это делают DevOps.

Фронтенд

Чем бы вы не пользовались для серверной части в вебе, во фронтенде выбора нет. Для разметки используется html, для оформления css, а интерактивность программируется используя javascript. Современный фронтенд достаточно сложен и содержит большое количество ньюансов. Это привело к тому что появилось направление 'фронтенд разработка'. Оно включает в себя два больших направления. Верстка, это все что связано с html/css и клиентское программирование, которое включает в себя javascript и языки, которые компилируются в javascript.

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

Клиентский javascript со временем становится более интегрированным с nodejs. Стандартом де-факто стала система сборки webpack. А наиболее перспективным фреймворком - ReactJS, который перевернул взгляд на разработку клиентских приложений со сложной логикой.

Безопасность

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

А дальше что?

А дальше выбирайте стек который вам по душе и вливайтесь!

Статья взята с map.hexlet.io

Вот еще интересненькое

Больше информации приблизит тебя к миру IT