З чого почати в веб-розробці
З чого почати в веб-розробці

Нас часто запитують про те, як увійти в світ розробки і не зійти з розуму. Різноманітність необхідних знань, мов і інструментів часом вводить в ступор, при цьому в мережі зазвичай можна знайти тільки досить загальні рекомендації. Ми вирішили покласти цьому край і поділитися нашим баченням того, як стартувати в веб-розробці. Багато рад, звичайно ж, підійдуть для всіх напрямків розробки, але ми вирішили сконцентруватися на тому, що знаємо найкраще.
Спершу може здатися, що програмування - це знання конкретної мови програмування, а точніше його синтаксису. На це спрямовано безліч курсів в мережі, а так само у вакансіях майже завжди написано шукаємо <любой язык>-програміста. Незважаючи на це, в дійсності професія програміста значно ширше і включає в себе безліч знань з різних напрямків. До того ж, програмісти часто працюють в командах, що вимагає хороших навичок міжособистісного спілкування.
В першу чергу багатьох цікавить, наскільки сильно потрібна математика програмістам. Відповідь така: чим більше в вас математики, тим в більш глибокі і складні теми ви можете зануритися. Наприклад, без належної математичної підготовки навряд чи вийде займатися розробкою автопілотів або писати біржової софт, але створювати сайти виявиться цілком під силу. Але навіть сайти можна створювати по-різному, і математика тут теж може допомогти.

Дуже часто вивчення програмування прив'язують до вивчення структур даних і алгоритмів, які часом дуже тісно пов'язані з математикою. Ми анітрохи не применшує важливості знання алгоритмів, але, разом з тим, якщо у вас немає профільної освіти (в математиці або інформатики), то починати свій шлях в програмування через алгоритми - заняття складне і майже напевно марна. Є деякий базовий набір, який потрібно знати. В першу чергу це поняття алгоритму та алгоритмічної складності. Решту можна вивчати поступово, разом з процесом занурення в розробку.

Процес написання коду на більшості мейнстрімовим мов відображає як раз те, як працює комп'ютер. Програміст дає вказівки (інструкції) про те як треба обчислювати необхідні значення. Такі мови (особливо низькорівневі) сприяють розумінню пристрою архітектури комп'ютера. Таке програмування часто називають імперативним і використовують поняття імперативна парадигма.
Другий аспект пов'язаний зі структурою самого коду. Будь-яка нова бізнес-правило, доданий в нашу програму, збільшує його складність. І будь-яка програма з часом стає тільки складніше. Все, що ми можемо цьому протиставити, це використовувати ті інструменти, мови і парадигми, які дозволять нам максимально уповільнити зростання складності. З ростом програми на перше місце виходять такі аспекти, як створення потужних і грамотних абстракцій, повторне використання коду, композиція. Розвитку цих навичок сприяє декларативна парадигма. код написаний в цьому стилі відповідає на питання що і дозволяє описувати рішення задачі у вигляді специфікації, виконання якої і є відповіддю на поставлене запитання. Яскравий приклад декларативного стилю це sql і регулярні вирази, а так само всі функціональні мови і мови логічного програмування (prolog).
Важлива думка, яка повинна стати для професіонала очевидною, полягає в розумінні того, що мова програмування це інструмент. Так само як вивчення інструкції до телескопа не робить з вас астронома, вивчення синтаксису і особливостей мови не робить з вас програміста. Програміст вибирає інструмент виходячи з завдання і зовнішніх умов, і в його арсеналі може бути безліч мов.
Командна строка
Перше, з чим стикається практично будь-який програміст - це командний рядок. Володіння командним рядком дуже впливає на вашу продуктивність і прищеплює базові навички роботи в операційній системі, а так само розкриває її пристрій. Це стосується, наприклад, файлової системи, процесів, пристроїв.

Зауваження про windows
З Windows ситуація трохи особлива. На ній в цілому можна почати розробляти, але якщо ви пишете нема на .net -платформи, то краще відразу готуватися до занурення в UNIX системи. Це пов'язано з тим, що майже весь серверний софт пишеться під POSIX-сумісні операційні системи, до яких відносяться Linux. Mac OS X і безліч інших. І ваш код майже напевно буде працювати під керуванням машини з Linux на борту.
POSIX це набір стандартів, що описують інтерфейси між операційною системою і прикладної програмою (системний API), бібліотеку мови C і набір додатків і їх інтерфейсів. Стандарт створений для забезпечення сумісності різних UNIX-подібних операційних систем та переносимості прикладних програм на рівні вихідного коду, але може бути використаний і для не- UNIX систем.
Середовище розробки
Системи контролю версій

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

Іншим важливим аспектом є тести. На жаль, реальність така, що тести пише не так багато розробників як могло б. При цьому автоматизоване тестування це те, що робить програмування по-справжньому приємним заняттям. Без них ви не можете гарантувати нічого, зміна одних частин коду буде приводити до поломки інших, і ви про це, швидше за все, не впізнаєте. Код буде містити безліч багів, багато з яких будуть виявлятися тільки в процесі експлуатації, розробка буде повільніше, тому що вам доведеться постійно повторювати руками вже пройдені сценарії використання. Деякі мови мають тестові фреймворки прямо в стандартній бібліотеці, а в інших треба ставити додаткові пакети.
Крім цього, будь-яка мова це не тільки вихідний код і компілятор / інтерпретатор, але ще і екосистема. Для різних мов вона включає різні компоненти, але деякі є обов'язковою частиною будь-якого стека:
- Менеджери версій - дозволяють ставити безліч різних версій мови програмування і зручно між ними перемикатися, особливо корисно якщо в різних проектах у вас використовуються різні версії. Особливо актуально в динамічних мовами.
- Менеджер залежностей / Пакетний менеджер - це одна з найважливіших підсистем, яка відповідає за установку і оновлення залежностей.
Налаштування локального і бойового оточення
Крім самого вихідного коду, софт для кінцевого споживача (НЕ бібліотеки) завжди містить безліч сторонніх компонентів, таких як: бази даних, веб-сервера, сервера черг і багато іншого. Все це вимагає установки і налаштування безлічі компонентів в систему.

Бази даних
Уміння працювати з реляційними базами даних - навик, необхідний всім веб-розробникам. В основі будь-якої реляційної СУБД (система управління базами даних) лежить реляційна алгебра і sql. sql - це декларативний мову для маніпулювання даними в СУБД. Він не пов'язаний з мовами програмування, запити виражені на sql виконуються безпосередньо всередині СУБД. На щастя, sql стандартизований і в базовому варіанті однаковий для всіх реляційних баз даних.

В цілому, вивчення SQL можна розділити на дві частини: створення, наповнення бази і запити в базу. На Хекслете є два курси, що покривають ці теми - Бази даних: SQL DDL / DML і Бази даних: SQL DQL.
Протоколи (tcp / ip, http, webdav, websockets)
Основний всього інтернету (та й взагалі будь-якої мережі) є стек протоколів tcp / ip. Звичайно ж, його не обов'язково знати досконально, але без розуміння, що таке порт, і, як в цілому відбувається комунікація, далеко не заїдеш. А ось з http зовсім інша історія. Цей протокол, за яким спілкується браузер з бекендом сайту поверх tcp. http текстовий протокол без стану з досить простими правилами роботи. Знати його важливо, а найприємніше те, що це не складно.
Також зростає використання протоколу webbsockets. який дозволяє робити по-справжньому інтерактивні і чуйні додатки. Незамінний при розробці real-time додатків, таких як чати, ігри.
У верстці активно використовуються різні пре і пост процесори, які дозволяють вирішити велику кількість проблем статичного css. а також дають можливість використовувати сучасні стандарти css без "милиць". В першу чергу це такі технології як postcss і його найпопулярніший плагін autoprefixer.
Безпека
Фактор, якому приділяють найменше уваги, особливо на ранніх стадіях. Це призводить до того, що в інтернеті мільйони сайтів, які містять критичні уразливості. За мережі постійно ходять роботи, скануючі сервера і сайти на десятки, а то і сотні вразливостей. Самі атаки поділяються на безліч різних видів і зачіпають, як фронтенд частина програми, так і бекенд частина.
А далі що?
А далі вибирайте стек який вам до душі і вливається!