Как подступиться к fullstack-разработке сегодня, если ты проспал десять лет



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

В качестве вступления...


Зачем это тут? Вполне вероятно, для многих пользователей Хабра всё описанное в статье покажется очевидным. Более того, какие-то аспекты, разумеется уже были описаны более подробно, да не один раз. Однако человеку, который знает только основы (HTML/CSS/JS), всё происходящее, например, в современном JS кажется просто хаосом, в котором решительно ничего не понятно и не ясно даже с какой темы начать изучать вопрос. Когда пытаешься такому человеку что-либо рассказать, упираешься в необходимость рассказывать массу вещей из разных областей, что превращает повествование в кашу.

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

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

Также, тут совсем ничего нет про функциональные языки: Scala, Erlang, Haskell, etc.

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

Базовые понятия


  • В первую очередь, актуализируйте свои знания о современных стандартах, используемых для вёрстки (HTML5, CSS3 и вот это всё). Также полезно будет прочесть про эволюцию ECMA Script (JS, на самом деле, это реализация именно этого стандарта), и освежить свои знания про JSON и JWT.
  • Объектно-ориентированный подход в программировании. Да-да! Многие, кто, вроде бы, понимает о чём речь, саму идею не до конца осознают, хотя она и появилась лет 50 назад. Поэтому желательно ещё раз ознакомиться, если хоть чуть-чуть сомневаетесь.
  • Системы контроля версий. Это абсолютный вин, знать их сегодня просто необходимо всем, кто работает в сфере разработки любого ПО. Даже если работаешь один системы контроля версий очень полезны, а уж в команде без них просто ад. Раньше для этого использовали, в основном, SVN или CVS, просто потому что серьёзных конкурентов у них почти не было. Сейчас стандарт де-факто это GIT (спасибо Линусу Торвальдсу). Я рекомендую начать с изучения консольной версии (даже для Windows), это займёт от силы пару дней, но когда придёт понимание, все фишки (типа git flow) вы поймёте очень быстро, а там уже и GUI-клиент какой-нибудь можно будет поставить. И уж совсем крутым можно стать, например, если освоить git hooks и настроить отправку данных на боевой сервер при коммите в мастер-ветку репозитория проекта.
  • Концепция MVC (не будет преувеличением сказать, что практически во всём современном вебе ПО работает по этому принципу, поэтому читать точно придётся).
  • Концепция RestAPI.
  • Виды, особенности и различия баз данных и основы SQL (я не говорю что это надо прямо учить, но представление иметь однозначно надо, вплоть до составления хотя бы простейших запросов). Почитать про NoSQL-базы данных, в частности MongoDB и Redis.
  • Методологии БЭМ. Я не сторонник такого подхода, но многие работают с его использованием, чтобы понимать о чём речь желательно почитать хотя бы вкратце.
  • Методологии разработки Agile и Scrum (там ничего особо сложного, скорее для общего развития).
  • Концепция Single Page Application (SPA) — применима не всегда, но почему-то всё чаще используется даже для очень объёмных проектов. Читать определённо.
  • Почитайте про Web Sockets — это технология, которая позволяет создавать интерактивное соединение между клиентом (браузером) и сервером для обмена сообщениями в режиме реального времени. Веб-сокеты, в отличие от HTTP, позволяют работать с двунаправленным потоком данных. Предлагаю смотреть на это как на AJAX нового поколения. Основная плюшка — это отсутствие необходимости постоянно запрашивать новые данные с сервера. При необходимости сервер сам отправит данные, а браузер их получит.
  • Ещё один стандарт который, вероятно, значительно изменит фронтэнд-разработку уже в ближайшем будущем — Web Components. Очень мощный инструмент и он вам определённо пригодится, хотя в данной статье я не буду уделять ему внимания.
  • XPath — язык запросов к DOM-документа. Маловероятно что он вам пригодится, так как в абсолютном большинстве случаев CSS-селекторы удобнее, но знать о его существовании полезно. Сейчас используется в основном в области тестирования или для парсинга больших объёмов данных.
  • Одно из ключевых отличий, по сравнению с разработкой десяток лет назад — сейчас практически везде принято использовать т.н. пакетные менеджеры (менеджеры зависимостей), которые пришли из мира UNIX. О некоторых из них я расскажу более подробно далее. Основная идея в том, чтобы снять с плеч программиста заботу о соблюдении зависимостей и обновлении используемых библиотек и фреймворков. Если раньше для начала проекта требовалось руками копировать в нужные места все нужные файлы и библиотеки, прописать все пути, проследить чтобы они были между собой совместимы и т.п., то сейчас всё это делается парой команд в консоли (да, без консоли до сих пор никуда, увы).
  • Прекомпиляторы. Возможно звучит странно, так как мы говорим о интерпретируемых языках, но таки да, сплошь и рядом используются отдельные программы, позволяющие, например, собрать все используемые стили в один файл перед заливкой в продакшн, а также позволяющие использовать в своём коде всякие удобные штуки, которых нет в стандарте (например переменные в CSS). Особенно популярны прекомпиляторы во фронтэнде — так как для бэкэнда чаще всего используются полноценные ООП-языки, там прекомпиляторы не так распространены и применяются, в основном, для ускорения и кэширования (например PHP Zend OPcache).
  • Для упрощения развёртывания разработки сейчас принято использовать т.н. контейнеры (Docker, Kubernetes). Это относительно новая концепция в современной разработке, рассматривать подробно её я не буду, однако представление иметь надо — технология очень мощная и однозначно полезная.
  • Тестирование — отдельная большая тема. Чаще всего под этим подразумевается т.н. юнит-тестирование. Суть идеи легко понять на простом примере. Создавая тест вы пишете некую обёртку, которая выполнит одну из ваших функций и проверит ожидаемый результат. Затем, когда вы поменяете что-либо в другой функции, от которой зависит первая функция, чтобы проверить, что изменение ничего не сломало — вам достаточно запустить созданные ранее тесты. Надеюсь понятно, насколько это может быть полезно в большом проекте.


Есть один важный аспект, который необходимо рассмотреть более подробно для предотвращения путаницы с понятиями «бэкэнд» и «фронтэнд», а также для более глубокого понимания происходящего в современной web-разработке. Это эволюция самого подхода к формированию HTML отображаемого в браузере. Хотя всё это формировалось, конечно, гораздо раньше чем десяток лет назад, поэтому, вроде бы, должно быть понятно и тому, кто лет десять за тенденциями не следил.

  • Самый первый и самый простой вариант — веб-сервер парсит запрос и просто выдаёт HTML-файл, соответствующий этому запросу. Максимум, может использоваться какой-нибудь SSI. По сути это просто классический статический сайт, а бэкэндом в данном случае выступает сам веб-сервер. Очевидно, для проекта в котором может быть множество страниц такой подход катастрофически неудобен — если нужно что-либо изменить, правки придётся вносить во всех файлах. Также очевидно, что ничего кроме статических сайтов тут реализовать практически невозможно. Сейчас это используется максимум для каких-нибудь совсем простых лендингов, и то, разработка фронтэнда для них всё равно сейчас ведётся, в основном, с помощью современных js-фреймворков, а их применение в абсолютном большинстве случаев практикуется посредством функциональности Node.js.
  • Развитие статического варианта — использование интерпретируемых языков на стороне сервера. Тут появилась возможность писать шаблоны на одном из интерпретируемых языков, в которые подставляются данные в зависимости от запроса, а также стало возможно храненить данные не файлах, а в БД. Можно считать, что с этого момента появляется чёткое разделение:
    1. Собственно сам веб-сервер. Сейчас это уже вовсе не обязательно монолитное приложение, например, распространённый вариант — когда Nginx выступает в качестве балансировщика нагрузки, а сами запросы обрабатывает уже Apache. Хотя вариантов может быть множество (спасибо за уточнение prijutme4ty).
    2. Язык и фрейморк на этом языке, которые используются для обработки запроса и маршртизации по URL. Пожалуй, не будет ошибкой сказать, что в контексте fullstack-разработки под понятием «бэкэнд» как раз данный слой чаще всего и подразумевается, хотя строго говоря, всё серверное ПО, обеспечивающее работу веб-сервера это, разумеется, тоже бэкэнд. Важно, что язык и фреймворк для бэкэнда могут быть практически любые. Например, в случае Ruby и Ruby on Rails в качестве шаблонизатора может использоваться встроенный ERB, в случае PHP и Laravel — в качестве шаблонизатора чаще всего используют Blade, ну и так далее.
    3. Код, который выполняется непосредственно на клиенте — то, что принято называть фронтэнд. Тут всё, фактически, сводится к JS.

    Долгое время данный подход был основным и единственным в web-разработке, пока не начали развиваться облачные технологии и не появилась концепция SPA.
  • Когда стали развиваться облачные вычисления, появились различные модели их использования (SaaS, PaaS, IaaS). Среди них хотелось бы отметить т.н. serverless-подход от AWS. Суть в том, что веб-сервер из предыдущего пункта заменяется на специальный фреймворк, посредством которого бэкэнд приложение взаимодействует с облаком. Облака развиваются семимильными шагами, появляется множество новых технологий и подходов к их использованию, поэтому описать всё кратко возможным не представляется. Если вам интересно данное направление, посмотреть большинство используемых сейчас облачных технологий с сортировкой по категориям можно тут: landscape.cncf.io (спасибо KonstantinSpb).
  • С развитием концепции SPA и появлением HTML-компонентов, которые рендерятся с помощью JS, встала проблема слишком долгого отображения — пока JavaScript загрузится и отрисуется у клиента, может пройти достаточно много времени. В связи с этим появился ещё один подход к генерации HTML, который исторически принято связывать именно со SPA-приложениями — Server Side Rendering (SSR). Суть в том, что мы можем выполнить первый рендер компонентов в HTML ещё на сервере, затем отдать это клиенту, вместе с тем же кодом, который сформировал этот HTML, и затем не передавать каждый раз целиком код приложения по сети, а просто отрисовывать нужные компоненты сразу в браузере, передавая лишь данные, необходимые для изменения состояния системы (то самое REST). Нужно понимать, что в некоторых случаях так могут не делать, разбив систему на функциональные блоки (например, сгруппировав формам, каждая из которых работает со своей областью системы, что уже не является SPA). В таком случае рендеринг компонентов выполняется один раз перед отправкой с помощью какого-либо JS-шаблонизатора прямо на сервере — в таком случае, концептуально, это ничем не отличается от использования шаблонизатора на любом другом бэкэнд-языке, и, хотя, по сути, рендеринг из JS в HTML всё ещё будет происходить на стороне сервера, это уже не является SSR, потому что сие понятие исторически употребляется именно в контексте SPA. За прояснение сего момента спасибо товарищам staticlab, napa3um и justboris.


Бэкэнд


Итак, в современном мире бэкэнд захватили несколько технологий. Встречаются, конечно всякие вариации и различная экзотика, однако полагаю не будет ошибкой сказать, что, навскидку, процентов 90 современного бэкэнда пишутся с помощью следующих инструментов:
  • Java
  • .NET
  • Python
  • Node.js (тут неоднозначно, но об этом дальше),
  • Ruby on Rails
  • И, конечно же, PHP


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

Рассматривая оставшиеся технологии, когда речь заходит о том, в каком направлении проще всего найти работу, безусловными лидерами являются три языка — PHP, Node.js и Python.

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

  • 5 021 вакансия Python
  • 4 220 вакансий PHP
  • 1 274 вакансии Node
  • 726 вакансий Ruby

На Моём круге (поиск по ключевым навыкам):

  • 171 вакансий PHP
  • 116 вакансий Python
  • 69 вакансий Node.js
  • 28 вакансий Ruby on Rails

У Java 5 960 вакансий на ХэХэ и 130 на Моём круге, но как учесть это именно для бэкэнда я не знаю, поскольку это всё ещё один из основных языков для разработки Android-приложений, отсюда и соответствующий спрос. Поэтому эти данные просто для справки.

Где-то рядом со всей этой тусовкой топчется Microsoft со своими SharePoint и ASP.Net. Внутри крупных компаний, которым необходима интеграция с Active Directory, это решение часто встречается, но, как уже говорилось выше, данный стек мы не рассматриваем ввиду объёма.


Про Node.js и его экосистему я расскажу в конце статьи, поэтому сейчас, описывая бэкэнд основное внимание уделим Python и PHP.

Про Python...


… и используемые фреймворки от artX89:
Тем, кто по какой-либо причине еще его не знает, а возможно даже обходит его стороной, хочется посоветовать, все-таки, присмотреться к этому языку получше. Я сам очень долго не хотел его изучать, и причина была не как у многих («фу, да там все через отступы»), а в том, что приводя плюсы питона (да простят меня люди говорящие «пайтон»), обычно называют лаконичность языка.

Часто приводят фразу в духе: «что на си занимает 100 строчек кода, в притоне это займет 10». Вот эта «простота» отпугивала, особенно после C++ и любимого С#. Казалось, что язык больше для «домохозяек» и людей не умеющих программировать на нормальных языках с нормальной типизацией, да и вообще язык только для скриптов. Я никогда так не ошибался! :) Язык очень мощный, невероятно удобный, который можно применять во многих областях. Я не знаю ни одного человека, перешедшего с PHP на питон, и который после этого опять хотел бы вернуться к PHP. Это я все к чему веду: питон отличный язык для того чтобы создавать на нем бэкэнд.

Ну а теперь непосредственно про фреймворки… Для начала надо определиться: какой сервер нам нужен блокирующий или неблокирующий. У каждого из них есть плюсы и минусы. Неблокирующий сервер чаще всего используют для веб-сокетов, но на нем можно писать и обычные сайты, способные одновременно обрабатывать большое количество подключений. Но при работе с такими серверами надо помнить, что все подключения крутятся в одном «общем цикле» и блокировка этого «цикла» приведет к полной блокировке всех подключений, в связи с этим все используемые библиотеки должны быть не блокирующими. Среди неблокирующих фреймворков на сегодняшний день я бы советовал использовать aiohttp, есть и другие достаточно популярные такие как Tornado, но все они уступают aiohttp. Что же касается блокирующего фреймворка, то тут выделяется Django. Он подходит для людей, которые любят чтобы все было в одном флаконе и желательно сразу. Django уже «из коробки» включает в себя и шаблонизатор, и ORM, и многие другие удобные библиотеки. Но если Вы, как и, я любите выбирать библиотеки под задачу, тогда советую использовать Flask, а все остальные библиотеки уже настраивать под себя. Шаблонизатор чаще всего используют Jinja2, это достаточно удобный и распространённый шаблонизатор, с которым если и возникнут вопросы, то ответ можно будет нагуглить очень быстро. Что касается ORM, то в мире питона правит sqlalchemy. Это, как пишет создатель peewee (конкурента sqlalchemy): «SQLAlchemy is the gold standard for ORM in the Python world» — и я с ним полностью согласен. Это универсальный и мощный инструмент. Но за все надо платить, в данном случае приходится «платить» сложностью данного фреймворка. Хотя, начать с ним работать можно очень быстро, а вникать в сложности уже в процессе.

Есть очень много и других полезных библиотек, полезных при работе с веб, таких как wtforms, beautifulsoup, Pillow и т.д, но тут все уже зависит от конкретного проекта и задач, которые стоят перед разработчиком.


Дополнение от Stas911:
Я бы еще добавил библиотеку requests (прямо очень мне понравилась). Для облачного serverless бэкенда стоит посмотреть на фреймворки Chalice и SAM. Ну и pipenv, black и flake8 наше все, конечно.


Что касается пакетного мэнеджера, самый используемый на данный момент в Python это Pip.

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

PHP


В ходу сейчас 7-я версия языка. В первую очередь надо сказать, что различия, ломающие обратную совместимость, есть не только между 5-й и 7-й, но и, например между 7.0.х и 7.1.х (что, кстати, нарушает принципы «семантического версионирования», но всем плевать). В частности, одно из важных изменений, ломающих обратную совместимость в 7.1 — более строгая типизация параметров.

Пример функции, которая выполняется с предупреждением в PHP7.0 и выдает Fatal error в PHP7.1
<?php
function test($param){}
test();
?>

Кроме таких перлов в язык добавилось чуть-чуть синтаксического сахара, а также были убраны некоторые встроенные функции… Была несколько изменена работа часто используемого цикла foreach… Пополнился список слов, которые нельзя использовать для именования собственных объектов (resource, object, mixed, numeric, void, iterable)… Ну и далее в таком же духе, ничего фундаментального, вроде бы.

Если с PHP 4 или 5 вам уже приходилось иметь дело, вы достаточно быстро разберётесь.

Современные PHP-фреймворки


Беглый анализ предложений о работе позволяет выделить наиболее популярные сегодня фреймворки:

  • Laravel — один из самых популярных фреймов. Ключевые фичи, доступные «из коробки»: шаблонизатор «Blade» (люблю его), Eloquent ORM для работы с БД и создания моделей (речь про модели из концепции MVC), механизм автоматической загрузки классов PHP без необходимости подключать файлы из определений в include, миграции (система управления версиями БД), есть свой формат пакетов, которые позволяют создавать и подключать модули Composer к приложению на Laravel. Многие дополнительные возможности уже доступны в виде таких модулей. Очень гибкий и, в целом, понятный инструмент. Будет хорошим стартом для дальнейшего изучения — при понимании используемых технологий, многие концепции других фреймворков будут понятнее. Также немаловажно, что данный фреймворк использует множество компонентов следующего фреймворка — Symfony, что тоже послужит хорошим подспорьем при дальнейшем расширении кругозора.
  • Symfony — в качестве ключевых плюсов упоминаются универсальность, стабильность, однако тут достаточно высокий порог вхождения. Из коробки имеет два ORM-инструмента: Propel и Doctrine.
  • Zend — самый высокий порог вхождения, взамен высокая стабильность и минимальные зависимости между частями проекта. Создан для разработки больших приложений корпоративного уровня (enterprise). Интересно, что Zend создан и поддерживается разработчиками PHP, а, например, виртуальная машина в интерпретаторе языка PHP именуется не иначе как Zend Engine.
  • Yii — считается одним из наиболее производительных и при этом простых фреймворков, хотя однозначных подтверждений этому нет (Впрочем, есть интересное сравнительное тестирование, не сказать что оно всеобъемлющее, но скорость неплохо иллюстрирует. Спасибо tnsaturday ). У Yii огромное сообщество и высокая популярность. Имеется множество расширений, например для работы со Sphinx. Одна из «киллерфич» — генератор кода Gii, разумеется есть миграции БД.
  • CodeIgniter — достаточно старый фреймворк, постепенно уходящий на задний план. Ключевые фичи это собственный гибкий шаблонизатор, шаблоны для работы с БД (очень похожи на синтаксис SQL), и мощные возможности кэширования на стороне сервера. Считается что это самый минималистичный и легкий фреймворк с одной из лучших документаций.
  • От себя хотел бы также отметить ещё один фреймворк, ныне считающийся устаревшим, однако он хорош скоростью и минимализмом. Также, если начать изучение технологий с него, многие подходы в других фреймворках будут понятнее. Речь о Kohana(RIP) — (Koseven). Проект изначально отпочковался от CodeIgniter, и был написан для PHP5. На данный момент Kohana считается умершей, однако есть более-менее активный форк с поддержкой PHP7 — Koseven. В данном фреймворке имеется своя система ORM, модуль Minion для выполнения Cron-задач, есть своя система миграций БД, при желании несложно подключить расширения (например шаблонизатор Blade или модуль SCSS). По стилю чем-то напоминает Laravel.

Популярность PHP-фреймворков в 2018-м году по данным сайта Coderseye.com:



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

Также существует отдельный класс фреймворков...
… предназначенный для создания простых сайтов — это, конечно же, всевозможные CMS. По сути это отдельные приложения, написанные на каком-либо серверном языке (чаще на PHP, иногда с использованием одного из вышеперчисленных фрейморков). Это всем знакомые WordPress, Joomla, Drupal, Bitrix и тому подобные проекты. Основная разница между вышеописанными PHP-фреймворками и CMS, в том, что последние чаще всего предоставляют часть базовых функций, используемых сайтами, из коробки (например, модуль блога или модуль регистрации и авторизации пользователей), а также позволяют решать вопросы маршрутизации упрощённым способом (создание разделов сайта и автоматический роутинг по ним). Обсуждать их особого смысла не вижу, так как любой серьёзный кодер, разбирающийся в PHP легко разберётся с большинством CMS за пару вечеров.


Самым популярным пакетным менеджером для PHP сейчас является Composer.

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

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

Другие бэкэнд технологии


Ещё одна штука, часто используемая, например, для ускорения работы с реляционными БД — поисковые движки. Хочется упомянуть Sphinx. Это мощная система полнотекстового поиска, написанная на С++. Представляет из себя отдельное приложение, предоставляющее API для распространённых языков программирования (официально поддерживаются PHP, Python, Java; существуют реализованные сообществом API для Perl, Ruby, DotNET и C++) и интеграцию с существующими СУБД (MySQL, PostgreSQL). Для себя я делаю краткий перевод третьей версии документации Sphinx, если вам подобное интересно, отпишите, пожалуйста, в комментариях, по завершении я выложу его на хабр.

Хотелось бы добавить сюда ещё пару технологий, однако мне явно не хватает опыта в части бэка, чтобы выбрать о чём точно стоит упомянуть. Надеюсь на «помощь зала».

На этом с бэком более-менее всё ясно (не считая Node), поехали дальше.

Фронтэнд


Как я уже упоминал выше, сегодня очень популярны парадигмы, позволяющие объединить в себе как бэк, так и фронт, переложив на используемый фреймворк и задачу роутинга по URL внутри проекта и генерацию шаблона. В основном это всё касается Node.js и концепции SPA.

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

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

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

На самом деле, про то что происходит сейчас в JS лучше всего написано вот в этой статье. Настоятельно рекомендую её прочесть, если ещё нет.

Я буду более краток, поэтому пройдусь лишь по основным моментам, необходимым для понимания современного JS. Итак, наш отправной пункт это концепция JavaScript-модулей. Чтобы понять необходимость использования этой концепции достаточно рассмотреть простой пример.

Простой пример с jQuery, для наглядности
<script type="text/javascript" src="/jquery.js"></script>

<script type="text/javascript">
console.log($); // function n() - тут вроде всё понятно

// Если мы сейчас попробуем определить любой свой объект с именем $,
// это, очевидно, переопределит одноимённую функцию из предыдущего файла
var $ = 'Not jquery';
console.log($); // Not jquery
</script>

// Если же мы теперь попробуем подключить ещё один файл
<script type="text/javascript" src="/new.js"></script>
// То внутри него мы уже не сможем использовать функцию $ из jquery,
// потому что все включения в код страницы используют глобальную область видимости


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

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

Наиболее часто используемая реализация на данный момент это формат CommonJS. В частности Node.js также использует эту реализацию. CommonJS реализует модули как специальный объект, внутри которого можно объявлять свои функции и переменные, а затем включать их в код в нужном месте с помощью ключевого слова require.

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

Однако теперь, когда встретите в коде JS-проекта ключевые слова "import", "export", "require" — знайте, это как раз и есть реализация модулей.

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

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

Пример кода, использующий npm-пакет moment.js и корректно работающий в Node.js:
var moment = require('moment');
console.log("Hello from JavaScript!");
console.log(moment().startOf('day').fromNow());


При использовании бандлера мы получим из такого кода единый работающий js-файл без выражений require.

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

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

JavaScript-фреймворки


Сегодня самые популярные направления, охватывающие, пожалуй, процентов 80 всей сферы фронтенда это «большая троица»:

  • React — библиотека, разработанная, в первую очередь, для SPA и реализующая концепцию т.н. «реактивного» взаимодействия между элементами и предоставляющая шаблонизатор JSX, позволяющий описывать компоненты интерфейса с помощью синтаксиса JS. Основная идея, пожалуй, в использовании собственной системы событий, которая и обеспечивает эту самую «реактивность» (тут могу ошибаться, буду рад, если меня поправят). Насколько я могу судить, чаще всего используется в связке с Redux (Redux это одно из решений, реализующее «реактивную» архитектуру Flux). React придумали ребята из Facebook.
  • Angular — мощнейший фреймворк, предоставляющий огромные возможности для разработки приложений, на нём можно реализовывать как «классические» небольшие SPA, так и действительно огромные проекты. Этот фрейм, в полной мере соответствует концепции MVC, предоставляет возможность использовать компоненты, имеет свою удобную систему событий и вообще, по моему субъективному мнению, всячески хорош. Если вы планируете разрабатывать большой серьёзный проект, я бы рекомендовал изучать именно его. С выходом версии 2.0. проект разделился на два независимых — это AngularJS и просто Angular (нумерация версий начинается с двойки), не следует их путать.
  • Vue — популярный ныне фрейморк. Я с ним не работал, поэтому могу лишь констатировать то, что понял из чужих статей. Насколько могу судить, развитие данного фреймворка испытывает значительное влияние React — он также как и React использует виртуальный DOM, а вторая его версия поддерживает шаблонизатор JSX. Судя по всему, это попытка упростить чрезмерно сложные фреймворки типа React или Backbone, выкинув лишнее, поскольку, например, для реализации своей системы событий тут необходимо подключать дополнительный модуль (Vuex), а ядро фреймворка используется в первую очередь как шаблонизатор и селектор элементов. Повторюсь, у меня нет опыта работы с этой библиотекой, я могу ошибаться и буду рад, если кто-нибудь меня поправит.

Сравнительная оценка популярности JS-фрейморков в 2018-м, по результатам большого опроса Stateofjs.com (кликабельно):



Как видно, на сегодняшний день также считаются популярными Polymer, Ember и Backbone (тут спорно, особенно учитывая, что последний раз его обновили в феврале этого года, а до этого обновления не было года три) и не упомянутый в статистике Meteor. Однако, анализируя предложения о работе, можно видеть, что первая троица имеет наибольший спрос, поэтому описывать остальные проекты я не вижу смысла.

Разумеется, библиотек куда больше, и даже такие «древности» (тут сарказм) как jQuery ещё используются повсеместно. Но для понимания современного WEB вполне достаточно быть знакомым с этой троицей. Хотя тот же jQuery для освоения гораздо проще, чем три упомянутых выше библиотеки — при хорошем знании JS в нём разобраться можно буквально за вечер (и если вы этого не сделали, то определённо стоит).

Пара слов о современных тенденциях разработки фронтэнда. Не хотелось бы пускаться в критику использования реактивного подхода для больших проектов, но всё-таки стоит упомянуть о том, что подход SPA для больших приложений это пока ещё не лучший выбор. Например, на том же Facebook мы можем наблюдать как первая же страница (логин) грузит с сервера больше 4 МБ данных, причём это всё только JS-код. И, если верить тому, что пишут о кодовой базе лицокниги, там есть не только React, но и Angular. Забавно, не правда ли? Если ваш фреймворк такой уж хороший, зачем вам ещё и Angular?

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

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

Современный подход к CSS-вёрстке


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

Для расширения возможностей CSS сейчас используются SASS и LESS — это динамические языки CSS стилей, которые могут компилироваться как на стороне сервера (SCSS), так и на стороне клиента (LESS, хотя есть и реализации для server-side). Оба этих языка обеспечивают следующие расширения CSS: переменные, вложенные правила, миксины, операторы и даже (ограниченно) функции.

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

Чуть подробнее:

  • LESS — это вложенный метаязык: валидный CSS будет валидной LESS-программой с аналогичной семантикой. LESS разработан с целью быть как можно ближе к CSS, поэтому у них идентичный синтаксис. В результате существующие CSS можно использовать в качестве LESS кода.
  • SASS — это метаязык на основе CSS, предназначенный для увеличения уровня абстракции CSS кода и упрощения файлов каскадных таблиц стилей.

Последние версии языка Sass имеют два синтаксиса:

  • SASS — более краткий, отличается отсутствием фигурных скобок, в нём вложенные элементы реализованы с помощью отступов;
  • SCSS (Sassy CSS) — использует фигурные скобки, как и сам CSS.

Пара важных различий между LESS и SASS
  1. LESS, в отличии от SASS/SCSS не имеет операторов логики — в LESS нет if/then, for и т.п.
  2. Предыдущий пункт компенсируется тем, что LESS может работать не только на стороне сервера, но также и на стороне клиента с использованием JS. Точнее он не то чтобы может, он на это и рассчитан. Обычная практика использования LESS-кода:

    <link rel="stylesheet/less" type="text/css" href="styles.less">
    <script src="less.js" type="text/javascript"></script>
    

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

    @height: `document.body.clientHeight`;

    То есть это даёт возможность сначала загрузить DOM, а потом под него создать специальный CSS прямо на стороне клиента.


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

Node.js


Node.js уже достаточно зрелая технология, продолжающая развиваться семимильными шагами. Это интерпретатор языка JavaScript для серверной стороны (поначалу звучит бредово, да). Сам по себе Node.js является C++ приложением, которое получает на входе JavaScript-код и выполняет его. При этом, нода имеет встроенный веб-сервер (весьма удобный в использовании для мелких проектов, хочу заметить).

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

Функциональность Node.js расширяется с помощью пакетов. Пакетом в Node.js называется один или несколько JavaScript-файлов, представляющих собой какую-то библиотеку или фреймворк.

NPM (аббр. node package manager) — это стандартный менеджер пакетов, автоматически устанавливающийся вместе с Node.js. Он используется для скачивания пакетов со своего облачного сервера, а также для загрузки пакетов на эти сервера. Он же отвечает за соблюдение зависимостей между используемыми в проекте библиотеками.

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

Если вы внимательно прочли предыдущую часть статьи, сейчас вам должно стать понятно, как Node.js объединяет фронт и бэк. Используя ноду вы можете писать код на JS (или на чём вам больше нравится — TypeScript, CoffeeScript, ES6 и т.д.), используя возможности шаблонизатора выбранного фреймворка.

Это, в общих чертах, может выглядеть следующим образом:
  1. Клиент передаёт запрос серверу (который реализован на ноде) в виде адреса запрашиваемой страницы.
  2. Нода парсит запрос и передаёт его «точке входа» вашего JS-приложения.
  3. Приложение анализирует запрашиваемый адрес и формирует нужную страницу из компонентов, описанных с помощью шаблонизатора используемого фреймворка.
  4. Перед отдачей результата клиенту, специальные пакеты ноды собирают все используемые JS-библиотеки в один файл, проводят компиляцию SASS/LESS, делают ещё кучу полезных вещей (тестирование компонентов, например) и возвращают клиенту готовый HTML с всего двумя подключаемыми файлами (JS и CSS).

Надеюсь из описания процесса наглядно понятно, что я имею в виду под объединением фронта и бэка.

Однако, очевидно, что если каждый раз выполнять рендеринг компонентов, постпроцессинг и сборку в один файл, это будет слишком долго. Поэтому на практике, именно такой подход используется только при разработке. Для загрузки в «продакшн» запускают билд проекта, получив на выходе уже готовые файлы, которые уже можно отдавать клиенту с помощью вполне традиционного бэкэнда (PHP, Ruby, да хоть сами сервер на C++ напишите, словом, как угодно). Иными словами, для разработки и поддержки проекта ставить ноду вам в любом случае придётся, поскольку править что-то в этих готовых файлах без исходников проекта это то ещё веселье.

Думаю очевидно, что всё это открывает огромный простор для разработки и широчайший выбор архитектур для построения проекта. Не то что стандартный набор (PHP + HTML\CSS + jQuery ) лет десять назад.

А ведь ещё можно, например, ещё больше унифицировать части кода и использовать их при разработке не только web-приложения, но и мобильного приложения, создавая цельную экосистему (Weex, React Native).

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

Некоторые популярные пакеты Node.js для разработчиков


  • Babel — транспайлер кода разных стандартов в валидный JS для разных «рантаймов» (старые браузеры и т.п.). Не содержит в себе правил преобразования, они идут отдельными пакетами. Без этого инструмента сейчас не обходится практически ни один проект.
  • Grunt — менеджер задач для автоматического выполнения рутинных операций (например, минификация, сжатия изображений, тестирование, объединение файлов). Использует командную строку для запуска задач, определённых в файле Gruntfile.
  • Примеры бандлеров для Node.JS: Webpack и Browserify. С помощью Webpack и встроенного NPM, например, можно легко заменить связку Bower и Gulp/Grunt.
  • Yarn — по сути, аналог NPM, оптимизирующий некоторые аспекты, например загрузку и установку пакетов. Использует тот же формат package.json и те же типы пакетов, что NPM.
  • Bower — менеджер пакетов предназначенный в первую очередь для подключения JS и CSS библиотек и фреймворков. По сути, аналог NPM, но только для фронта. Раньше был популярнее, сейчас считается устаревшим и, что важнее, небезопасным — даже сами авторы Bower призывают мигрировать на более современные инструменты, типа связки Yarn и Webpack.
  • Jade — по сути это шаблонизатор HTML, написанный специально для ноды, имеющий также некоторую функциональность JS. На мой субъективный взгляд идея в целом неплохая, но мне не нравится его синтаксис. Правда есть и ещё один сомнительный момент — если проект небольшой, спорна необходимость использовать шаблонизатор. А если большой, то один из трёх популярных JS-фреймворков скорее всего будет использован и возможности любого из них, по факту, функциональность Jade полностью перекроют.


***

Чуть-чуть новомодного сленга, на закуску:

Boilerplate code или просто boilerplate — под этим подразумеваются секции кода, которые должны быть написаны во многих местах с минимальными изменениями или вообще без них — например, код шапки HTML-страниц в шаблонах. Также может использоваться по отношению к языкам, в которых программист должен написать много кода, чтобы выполнить минимальную задачу — например объявление класса с приватными переменными и написание внутри публичных функций, только возвращающих значение этих приватных переменных.

DevOps (акроним от англ. development и operations) — набор практик, нацеленных на активное взаимодействие специалистов по разработке с сисадминами и взаимную интеграцию их рабочих процессов друг в друга. Проще говоря, любому нормальному fullstack-разработчику без девопса никуда, ведь для того чтобы самостоятельно развернуть себе нормальную среду для разработки, надо хотя бы в общих чертах понимать как работает веб-сервер и как его настроить.

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

***

Upd. В качестве бонуса. Спасибо KonstantinSpb.
Stackshare.io — чтобы быть в курсе, что используется в топовых и не очень компаниях.
Libhunt.com — отличный категорированный список по огромному числу технологий со сравнительной статистикой.
Поделиться публикацией

Комментарии 370

    –3
    Под каждую технологию бы еще ссылку на курс coursearea или edX положить, было бы бесценно.
      +21
      Это была бы реклама. Плюс я не готов советовать то, что сам не пробовал.
        0
        Второе — аргумент. А edX вполне себе бесплатен и курсы там бывают очень даже толковые. Самое то, чтобы нагнать 10 лет анабиоза.
      +14
      различные извращённые варианты, когда, например, Ruby on Rails используется как роутер и шаблонизатор для итогового HTML (Slim, Haml, etc.)

      Когда это роутинг и шаблонизация на бэкенде стали извращением?


      Перед отдачей результата клиенту, специальные пакеты ноды собирают все используемые JS-библиотеки в один файл, проводят компиляцию SASS/LESS, делают ещё кучу полезных вещей (тестирование компонентов, например) и возвращают клиенту готовый HTML с всего двумя подключаемыми файлами (JS и CSS).

      Бред. Это очень медленно и никто так не делает. Сборка и минификация скриптов и стилей делаются до выкатывания на прод. Дальше сервер отдаёт уже готовые ассеты.

        –12
        Когда это роутинг и шаблонизация на бэкенде стали извращением?

        Роутинг — нет. Но когда он на Ruby, да вместе с шаблонизацией — извращение натуральное.

        Бред. Это очень медленно и никто так не делает.
        У нас в компании именно так и делают для внутреннего использования.

        Это медленно, если у вас сервер нагружен тысячами подключений. А если раз в час заходят пять сотрудников, всё весьма шустро. И отлаживать так гораздо удобнее.
          +10
          Роутинг — нет. Но когда он на Ruby, да вместе с шаблонизацией — извращение натуральное.

          В чём же извращение писать роутинг (правила роутинга) на Ruby по сравнению с другими языками? Правила роутинга пишутся и на Java, и на Kotlin, и на C#, и на Python, и на PHP, и на JS.


          А вот шаблонизация на Ruby не пишется. Slim и HAML — это не Ruby и даже не подмножества.


          У нас в компании именно так и делают для внутреннего использования.

          То, что вы описали — натуральное извращение. Пускай именно так и делают в вашей компании (в чём я сильно сомневаюсь, потому что это медленно и нерационально; скорее всего вы спутали с SSR), но это крайне нестандартный подход, который вы выдаёте за общепринятый. Зато, видите ли, роутинг на Ruby — фу-фу-фу, извращение.

            –12
            В чём же извращение писать роутинг (правила роутинга) на Ruby по сравнению с другими языками?
            Я же написал, что нет — не извращение. Но только если роутинг. Это и будет классический бэкэнд.

            А вот если делать ещё и шаблонизацию, тогда это будет изврат.

            Slim и HAML — это не Ruby и даже не подмножества.

            Ну да. Это шаблонизаторы для Ruby, а не надмножества. Цитата с оффициального репозитория на гитхабе проекта:
            Slim is a fast, lightweight templating engine with support for Rails 3 and later. It has been heavily tested on all major ruby implementations.


            в чём я сильно сомневаюсь, потому что это медленно и нерационально
            Ещё раз — это медленно с точки зрения массового применения. А вот с точки зрения необходимости каждый раз запускать ребилд, при изменениях, если они вносятся часто, а посетителей у проекта единицы — это уже гораздо более рациональный подход.
              +5
              Но только если роутинг. Это и будет классический бэкэнд. А вот если делать ещё и шаблонизацию, тогда это будет изврат.

              Я правильно вас понимаю, что эти все V в MVC и такие шаблонизаторы, как Freemarker, Thymeleaf, Razor, Jinja, Blade, Twig, ERB, HAML — это не классический бэкенд, а новомодное хипстерское извращение?


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

              Нет. Это PHP-way.

                –9
                это не классический бэкенд, а новомодное хипстерское извращение

                А они написаны на Ruby?
                  0

                  Freemarker, Thymeleaf — на Java. Razor — на C#. Jinja — на Python. Blade, Twig — на PHP. ERB, HAML — на Ruby.

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

                image

            +10

            Тоже не понял в чём проблема. Я вот на Python генерирую готовый html код — это быстро и надёжно.

              –19
              Ну, можно и гвозди отвёрткой забивать, при желании.
                +19

                Какая-то нелепая отмазка, вместо обоснования своего кунг-фу.
                Подход в генерации html на сервере — оправдан скоростью и удобством.

                  –12
                  Вопрос не в подходе, а в выборе инструмента. Можно и на ассемблере вывод шаблонов для HTML написать, при большом желании, вопрос лишь в том, что так никто не делает, потому что есть более удобные инструменты.

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

                  Скорость — это нативный HTML без всякого SSR в принципе, а удобство это всё про выбор инструмента и не более.
                    +17

                    Мне кажется, что вы совершенно не понимаете и не представляете, о чём говорите.


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

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

                      –5
                      Во всех
                      Да что вы говорите? Почитайте про подход Pyramid в вашем питоне. Или расскажите мне где, например, MVC в Backbone.js…

                      Это только пара примеров. Похоже вы явно лучше понимаете о чём говорите, только почему-то не видите очевидного — инструментов реально столько, что даже один подход можно реализовать совершенно по разному и никакой там «концептуальной схожести» не будет даже близко.
                        +1
                        Почитайте про подход Pyramid в вашем питоне

                        Ну вот я открыл документацию:


                        @view_config(route_name='user')
                        def user_view(request):
                            user = request.matchdict['user']
                            return Response(u'The user is {}.'.format(user))

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


                        Аналог в Sinatra (Ruby):


                        get '/users/:user' do
                          "The user is #{params['user']}."
                        end

                        Аналог в Spring (Java):


                        @RequestMapping(value = "/users/{user}", method = GET)
                        public String getUser(@PathVariable("user") String user) {
                            return String.format("The user is %s.", user);
                        }

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


                        Или расскажите мне где, например, MVC в Backbone.js

                        Начнём с того, что Backbone — это фронтендный фреймворк. И там, строго говоря, не MVC, а MVP. Тем не менее, концептуально всё очень похоже на бэкенд. Вот вам модели, вот вам представления, а роль контроллера выполняет механизм событий. Движка шаблонов не содержит, но можно использовать underscore.template, всё равно эта библиотека в зависимости.

                          –5
                          Ну вот я открыл документацию:

                          Ну вы откройте заодно то, что говорят сами разработчики про наличие концепции MVC в их фреймворке.
                          Вот вам цитата, чтоб вы не утруждались.
                          Мы считаем, что есть только две вещи: ресурсы (resource) и виды (view). Дерево ресурсов представляет структуру сайта, а вид представляет ресурс. Шаблоны (template) в реальности лишь деталь реализации некоторого вида: строго говоря, они не обязательны, и вид может вернуть ответ (response) и без них. Нет никакого «контроллера» (controller): его просто не существует. «Модель» (model) же либо представлена деревом ресурсов, либо «доменной моделью» (domain model) (например, моделью SQLAlchemy), которая вообще не является частью каркаса. Нам кажется, что наша терминология более разумна при существующих ограничениях веб-технологий.


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

                          Начнём с того, что Backbone — это фронтендный фреймворк. И там, строго говоря, не MVC, а MVP.
                          Ну да, про бэкэнд пропустил. И, тем не менее, это, опять же, лишь один из примеров, не вижу никакой проблемы бэкэндному фреймворку использовать MVP.
                            +1

                            Ок, в Pyramid используется тот же подход, что и в других микрофреймворках (Sinatra, PHP Slim, Express, Spark и т.п.). Формально да, в них не выделяется отдельной сущности контроллера, а сами они как правило не реализуют функциональность шаблонов и моделей. Но как только вы напишете на таком фреймворке реальное приложение, у него будет фактически такая же архитектура, как в «больших» фреймворках. При этом коллекция «ресурсов» фактически будет контроллером. Можно спорить, но с точки зрения опытного разработчика принципиально ничего нового нет.


                            не вижу никакой проблемы бэкэндному фреймворку использовать MVP

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

                      +3

                      Ловкий и совсем незаметный переход от критики подхода к критике инструмента.
                      Причём тут SSR вообще?

                        –2
                        При том, что в первом комментарии речь шла именно про SSR на Ruby, перечитайте.
                          0

                          Нет, ни про какой SSR речь не шла. Эта технология отличается от классических шаблонов, которые обычно используются в Rails. Slim и HAML — это именно что классические шаблонизаторы, просто для удобства в них вместо HTML используется более простой и чистый синтаксис.

                            0
                            Вероятно путаница произошла отчасти из нечёткости понятия SSR. Дело в том, что данная аббревиатура чаще подразумевает именно использование JS-фреймворков в качестве шаблонизаторов.

                            И, тем не менее, «классический шаблонизатор», это, по своей сути, ровно тот же SSR, просто язык другой. Ну или приведите кардинальные различния, если считаете иначе.

                            Slim и HAML — это именно что классические шаблонизаторы, просто для удобства в них вместо HTML используется более простой и чистый синтаксис.
                            И что, часто такая связка используется, на фоне подхода PHP+Blade, например?
                              0
                              И что, часто такая связка используется, на фоне подхода PHP+Blade, например?

                              Да, в контексте Rails почему бы и нет. Наряду с ERB.

                                0
                                Так статистика будет, не?
                                  0

                                  Slim — 17 млн загрузок, HAML — 45 млн загрузок. У Rails 163 млн загрузок, т.е. эти шаблонизаторы составляют примерно 38%.

                                    0
                                    Ну и будьте последовательны, давайте аналогичную для Laravel, в котором из коробки Blade для этих целей встроен.
                                      0

                                      А в Rails из коробки ERB встроен, то есть остальные им и пользуются.

                                        0
                                        А в Rails из коробки ERB встроен
                                        Так бы сказали сразу, вам самолюбие не позволяло излагать конкретику или просто характер вредный?

                                        Я про встроенный шаблонизатор в Rails ничё не знал, собственно поэтому для меня всё это и выглядело странно изначально.
                                          0
                                          Я про встроенный шаблонизатор в Rails ничё не знал

                                          Зачем писать о том, чего не знаешь?
                                            0
                                            Где я писал про Rails?
                                              +1
                                              Я не буду тут рассматривать различные извращённые варианты, когда, например, Ruby on Rails используется как роутер и шаблонизатор для итогового HTML (Slim, Haml, etc.), просто знайте, что такие изощрения тоже существуют.
                                                0
                                                Так тут написано, что «не буду тут рассматривать», и, собственно, оно нигде и не рассматривается, в чём проблема?

                                                Вас до глубины души задело слово «извращение»?
                                                  0
                                                  Рассматривается, потому что подход Rails назван «извращением» и «изощрением», несмотря на то что сервер-сайд рендерингу в таком виде уже не один десяток лет и реализован он не только в Rails а и в вагоне других MVC фреймворков. Это утверждение вводит в заблуждение неофитов, не знакомых с Rails и другими фреймворками.

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

                                                  Используете на проекте Angular? Писали на плюсах? Вот и пишите про Angular и про плюсы, а про все остальное не пишите, потому что не использовали и не знаете.
                                                    0
                                                    несмотря на то что сервер-сайд рендерингу в таком виде уже не один десяток лет и реализован он не только в Rails
                                                    Я уже отметил, что в данном контексте был не прав и эту часть перепишу.

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

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

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

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

                                            Я про встроенный шаблонизатор в Rails ничё не знал, собственно поэтому для меня всё это и выглядело странно изначально.

                                            Извините, но как я должен был изначально догадаться, что вы не знаете ничего про шаблонизатор в Rails, если вы конкретно следующее:


                                            различные извращённые варианты, когда, например, Ruby on Rails используется как роутер и шаблонизатор для итогового HTML (Slim, Haml, etc.)

                                            когда он на Ruby, да вместе с шаблонизацией — извращение натуральное

                                            А вот если делать ещё и шаблонизацию, тогда это будет изврат

                                            Заметьте, что вы свою позицию никак не обосновали.


                                            Затем в том же ключе вы раскритиковали такой же подход, но уже для Python:


                                            Ну, можно и гвозди отвёрткой забивать, при желании.

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

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


                                            Что касается подхода с дев-сервером на продакшене, то я считаю, что очень плохо сразу учить новичков плохим практикам.

                                              –1
                                              Извините, но как я должен был изначально догадаться, что вы не знаете ничего про шаблонизатор в Rails
                                              Ну вы же такой умный, вон сколько предположений уже выстроили, могли бы и до этого додуматься.

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

                                                Справедливости ради, у меня выше по треду была такая мысль: "Мне кажется, что вы совершенно не понимаете и не представляете, о чём говорите."


                                                Я писал что вы лично бестолково холиварите.

                                                Настолько бестолково, что мои комменты заплюсованы, а ваши наоборот? :) А если более серьёзно, то мы же вроде бы пришли к истине хотя бы в плане SSR и Rails. Вы даже статью поправили. Правда по части SSR можно покритиковать стиль этого абзаца — уж очень он тяжеловесно написан. Даже просто понять мысль сложно, не говоря уже о том, чтобы читать это новичку. На досуге попробуйте перечитать и отредактировать.

                                  +4

                                  Термин SSR возник и имеет смысл в контексте рендеринга и "гидрации" SPA, а не просто обозначает сборку ХТМЛ из шаблонов. Изучение технологий по аббревиатурам — расхожая болезнь юных программистов.

                                    0
                                    Признаю что неправ, если вы мне приведёте хоть одно фундаментальное различие между сборкой HTML на стороне сервера с помощью JS-шаблонизатора и формированием этого HTML с помощью шаблонизатора, написанного на любом сервеном ЯП. Кроме, очевидно, того факта, что для запуска первого нужна нода.
                                      0
                                      Чем вы (или я) фундаментально отличаетесь от квантовых флуктуаций? (Это не оскорбление, это вопрос, показывающий парадоксальную суть вашего вопроса в более сжатой форме. Ответ на него точно такой же, как и на ваш.)
                                        –2
                                        Вы демагогии хотите или формализации знаний?
                                        0
                                        Скорость сборки может иметь значение. В этом случае JS не лучший вариант.
                                          +1

                                          Следует различать просто серверный шаблонизатор на JS (Mustache, Handlebars, doT, EJS, Nunjucks, Pug и т.д.) и серверный рендеринг приложения.


                                          В первом случае шаблонизатор действует подобно шаблонизатору на других платформах: берёт некий шаблонный файл и делает подстановку в него значений из БД. Далее готовый результат (обычно HTML-страница) передаётся на клиент и в целом с ней практически ничего не происходит (клиентские скрипты обычно действуют локально на каких-то участках страницы).


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


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

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

                                            Если мы рендерим страницу из компонентов, написанных на React с помощью JSX, на сервере, а клиенту отдаём только один раз ядро приложения и далее код нужной страницы в HTML, без кода компонентов — это, по вашему, не SSR?
                                              0

                                              Если на клиентской стороне не будет такого же кода на Реакте, то нет, это будет обычная шаблонизация, только необычным шаблонизатором.

                                                –1
                                                Если я преобразую код компонента описанный силами JS в HTML-код, это именно рендеринг, потому что происходит выполнение JS-кода в его рантайме (Node) для получения HTML. Если же говорить, что это просто «необычный шаблонизатор», то ничего не мешает и любой «обычный» шаблонизатор называть рендерингом, поскольку чёткого различия не приведено.
                                                0
                                                Потому что эта аббревиатура возникла именно для обозначения такой технологии. Исторически. Обозначают ей именно это, а не то, что нафантазаировали вы в отрыве от проблематики, просто глядя на буквы аббревиатуры.
                                                  0
                                                  Потому что эта аббревиатура возникла именно для обозначения такой технологии. Исторически.
                                                  Хорошо, это более здравый аргумент.

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

                                                  Как видно из приведённых выше аргументов — ключевое отличе тупо только в том, что в качестве шаблонизатора выступает что-то на JS.
                                                    0
                                                    Я кстати в этом не уверен, потому что употребял термин серверный рендеринг еще до того как появились реакты именно в контексте «выдача готового html сервером» vs «загрузка данных по ресту и отрисовка на клиенте spa».

                                                    Может подкинете какой пруф по поводу историчности возникновения аббревиатуры?
                                                      0
                                                      Ну, вообще он прав. Я сейчас почитал что пишут на зарубежных ресурсах по этому поводу и сходу не нашёл употребления данного термина для «классических» (назовём это так) шаблонизаторах.
                                                0
                                                Например отличие в том, что в случае SSR на Javascript можно передать на клиент шаблон и перерендеривать страницу без обращения к серверу, а в случае шаблонов на других языках придется обязательно ходить на сервер и рендерить там.
                                                  0
                                                  и перерендеривать страницу без обращения к серверу
                                                  И это уже будет не SSR, так?
                                                    +1
                                                    Да, уже не будет. Поэтому можно еще использовать слово «изоморфный рендер», если оно кажется более точным.

                                                      0
                                                      Я имел ввиду в первую очередь точку зрения на то, что для того, чтобы назвать некий подход «SSR» не требуется строго, чтобы код на клиенте мог выполнить то же, что и код на сервере, потому что происходящее на клиенте уже в любом случае не является SSR.
                                      0
                                      Вопрос не в подходе, а в выборе инструмента. Можно и на ассемблере вывод шаблонов для HTML написать, при большом желании, вопрос лишь в том, что так никто не делает, потому что есть более удобные инструменты.

                                      Вот именно, что в выборе инструмента. Современное веб-программирование сравнимо с использованием навороченного станка с ЧПУ. Но если вам просто надо просверлить отверстие, достаточно воспользоваться шуруповёртом.


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

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


                                      Помню, был у меня студент, который решил доработать мой проект по обработке изображений на C++. Проект был маленький, не имел зависимостей, кроме системо-зависимых вызовов. Студент же решил сделать его кросс-платформенным, подключил несколько 3rd-party библиотек. Как итог: проект раздуло до нескольких гигабайт, компиляция с нуля стала занимать десятки минут, проект перестал быть переносимым (нужно скачивать тонну зависимостей, пусть и через cmake). Да, его подход более правильный с концептуальной точки зрения, но не с точки зрения решения конкретной задачи.

                                      0
                                      Плюс ещё СЕО-оптимизация
                                +5
                                Можно сделать целую серию материалов.
                                Даже заголовок оставить тем же, только менять характеристику персонажа.

                                Как подступиться к fullstack-разработке сегодня, если ты:
                                — юный смузихлеб с подворотами хотящий вайти
                                — проджект манагер живущий по эджайлу
                                ну и так далее

                                  +5
                                  … проспал 20 лет и был электронщиком
                                    –1
                                    Вам не нравится сама идея подобного материала или конкретно заголовок?
                                      +2
                                      Я думаю, дилетантский подход к его составлению.
                                      Далеко ходить не нужно: секция про css неполная. Пик популярности LESS и SASS был где-то лет 5 назад, затем вышел PostCSS. Уже долгое время существую проекты вроде jss, styled-components, emotion и прочие.

                                      Про это и остальное в комментариях довольно развернуто описали.
                                    +3
                                    Когда речь заходит о том, в каком направлении проще всего найти работу, безусловными лидерами остаются три языка — PHP, Node.js и Python.

                                    Пффф, где Java? Мой Круг — не такой большой, как hh, и я слышал что на нем сидят только ИТ компании. Андроид — это малая часть Java-разработки. Как мне кажется, Java все таки занимает большой кусок бэкенд разработки(старое тоже надо поддерживать так-то).
                                      –4
                                      Вообще я согласен с тем, что Java как технология неплоха для бэка.

                                      Но мониторинг предложений о работе явно говорит о том, что найти работу кодеру на яве сложнее, чем любому пишущему на указанной троице, вот и вся логика.
                                        +6

                                        Но этот работа на Java будет в среднем намного более высокооплачиваема, чем на PHP.

                                          –1
                                          Но какой в этом смысл, если таких вакансий в пять-десять раз меньше?
                                            +4
                                            Что с того, что их меньше, если их все равно очень много? А если, как уже тут советовали, сделать фильтр вида «зарплата от XXX», то количественный разрыв становится гораздо менее ощутим.

                                            При том что по тому же Ruby (по сравнению с Java для web или с .Net) аналогично позиций меньше уже не в 2-3 раза, а как раз в 5-10, но вы его при этом активно рассматриваете почему-то.
                                              +1
                                              Ну не лукавьте, я рассматриваю в основном PHP, JS и Node.

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

                                              Разумеется, я мог где-то нерелевантную выборку составить по этим профессиям, но ведь и цель статьи — не показать рынок труда, а рассказать про основные.

                                              Словом, тут я мог ошибиться, конечно же.
                                              +3

                                              Я уже приводил статистику, но вот вам пруфлинки.


                                              Поиск по Москве с зарплатой > 200000:


                                              «Java Spring» — 48 вакансий.
                                              «Ruby on Rails» — 32 вакансии.
                                              «ASP.NET» — 30 вакансий.
                                              «Express OR koa OR MEAN» — 25 вакансий.
                                              «Symfony OR Laravel OR Yii» — 22 вакансии.

                                                –2
                                                Вы извините, я считаю что до этого уровня в любой сфере дорастают всё-таки немногие кодеры, странно считать это ориентиром.
                                                  +9

                                                  Снизьте планку — будет то же самое. Если, конечно, не снижать до нуля.


                                                  Опять же: моя реплика была о том, что вакансии более оплачиваемые. Теперь оказывается, что наличие высокооплачиваемых вакансий — не главное.


                                                  Если даже считать начальной мысль о том, что найти кодеру на Java работу сложнее, то это тоже спорно. Java-джуниоров успешно хантят крупные аутсорсеры типа Luxoft или EPAM, а также ИТ-подразделения банков и прочих корпораций. Они могут себе это позволить и даже готовы вложиться в их развитие, в отличие от мелких контор, требующих PHP, где предполагается, что сотрудник с первого дня работы начнёт приносить прибыль, ибо свободных денег у таких фирмочек немного.

                                                    0
                                                    Кодеры — наверное нет, разработчики вполне. Причем независимо от платформы. Под разработчиком понимаю человека, который нацелен не написание кода и придачи ценности коду как таковому, а на создание продукта со всеми вытекающими(проектирование фич, выяснение ограничений и подходящего инструментария и т.п)
                                                      0
                                                      Буквоедство, не?
                                                        –1
                                                        Да причем тут буквоедство — нередко народ пишет код не понимая в конечном счете с чего именно идет инкам для компании и что код это всего лишь строчки текста, по сути ничего не стоящие. Но с позиции своего максимализма или отсутствия опыта или еще чего придают именно этим строчкам кода именно на его/ее любимой платформе очень много значения, даже не пытаясь мыслить продуктово. Обычно такие же люди готовы рефакторить все и вся, не приемлят каких то отступлений в сторону говнокода в угоду time-to-market и вот это все.
                                                        Кодер — просто человек, умеющий писать код, реализовывать алгоритм здесь и сейчас.
                                                          0
                                                          Кодер — просто человек, умеющий писать код, реализовывать алгоритм здесь и сейчас
                                                          Кодер — просто более удобное слово, вместо длинных и неудобных «программист» или «разработчик». Никаких других смыслов тут нет. То что вашему самолюбию оно претит — вопрос лично ваших взглядов, не более.
                                                            –1
                                                            Самолюбие не при чем. Если для вас разработчик — любой человек пишущий код — пусть будет так. В моем понимания разработка больше про создание продукта со всеми вытекающими кроме написания кода. Поэтому останемся каждый при своем мнении.
                                                              0
                                                              Как можно писать код и не быть при этом разработчиком?
                                                                0
                                                                Человек, который просто переводит написанный другим сотрудником алгоритм на язык программирования, формально пишет код, но при этом может совершенно не понимать бизнес-требований. Будет ли он при этом являться разработчиком?
                                                                  0
                                                                  Ну, с моей точки зрения, да, хотя и не полноценным. И вот почему — сможет ли он корректно перевести алгоритм с одного языка на другой, совсем ничего не зная про бизнес-модель и окружение?

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

                                                                  Ну и в любом случае, это пустые придирки к словам идут, по моему мнению. Ситуации, когда человек просто пишет код, абстрактно, без привязки к какому-либо продукту или конкретной цели, как какая-нибудь Ада Лавлейс, бывают разве что в вакууме.

                                                                  А навешивая ярлыки «кодер», «программист», «разработчик», и прочее, мы в какую-то палочно-армейскую систему себя загоняем, к чему это?
                                                                    0
                                                                    Человек, который просто переводит написанный другим сотрудником алгоритм на язык программирования, формально пишет код, но при этом может совершенно не понимать бизнес-требований. Будет ли он при этом являться разработчиком?

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

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

                                                                    Считать, что разработчик это следующая эволюция кодера — некорректно. Квалификация пересекается частично.
                                                                    0
                                                                    В моем предыдущем сообщении «кроме» имелось ввиду как «помимо».
                                                                    Собственно, выше отлично выразили и дополнили мою мысль.
                                                                      +1
                                                                      Я понимаю. Речь о том, что — много ли вы знаете ситуаций, в которых человек пишет код просто так, абстрактно, не привязываясь к какой-либо конкретной задаче или бизнес-процессу? Я вот только студентов вспомнить могу. И, как уже отвечал выше, не считаю их кодерами, так как это ещё обучение.
                                                      +2
                                                      но ведь на пять-десять стульев сразу и не сядешь…
                                                        0
                                                        Но какой в этом смысл, если таких вакансий в пять-десять раз меньше?
                                                        Тут кстати еще нужно оценивать сами вакансии, если уж на то пошло. По PHP примерно треть, если не половина — это доработка разных плагинов для CMS, интернет-магазинов, написание парсеров и прочий битрикс. Порог вхождения в такие задачи довольно низкий, следовательно на такие позиции конкуренция даже у нас в стране среди чайников довольно большая (а на мировом рынке еще индусы мешаются), да и по сравнению с этими задачами даже кровавый энтерпрайз — наиинтереснейшая и наиприятнейшая отрасль :)
                                                          0
                                                          Ну например, если брать Минск, то Java/Scala/Kotlin Senior от $3k до $5k, а С/С++ Senior от $4.5k (Это даже если не брать игрушки) хотя вакансий очень мало. Но могу сказать что и программистов мало, на вес золота почти.
                                                        +3
                                                        Но мониторинг предложений о работе явно говорит о том, что найти работу кодеру на яве сложнее, чем любому пишущему на указанной троице, вот и вся логика.
                                                        А теперь снова сделайте запросы по ключевым словам этих стеков, но отфильтруйте по зарплате от 200тр (грубо говоря, отсекаем людей с небольшим опытом).
                                                        Spring в получившейся выборке уже встречается чаще, чем Symfony.
                                                          +6
                                                          Легко ли найти работу на Java? Супер легко! Если есть хоть какие то вменяемые знания. Работы по Java очень много и людей HRы рвут на части. Но Java, в основном, это крупный Enterprise, ниша быдлокодеров тут индусами занята, в Россию, да и вообще СНГ, заказчики идут за качеством по ± приемлемой цене, так что уровень знаний требуется на порядок выше чем для языков с «низким порогом вхождения».
                                                        +7
                                                        Где-то рядом со всей этой тусовкой топчется Microsoft со своим SharePoint

                                                        Вероятно, вы не совсем в ту сторону смотрели. Sharepoint — это очень специфичная вещь. У Microsoft есть ASP.Net (в разных ваканиях упоминают разные вариации web, mvc, webapi, core) — думаю более используемая штука, чем тот же Ruby on Rails.
                                                          0
                                                          Пожалуй вы правы. Sharepoint, это наверное что-то больше из разряда CMS…

                                                          Вечерком поправлю это дело, спасибо.
                                                            0
                                                            Если точнее, то «шарик» занимает нишу Enterprise Content Management и Business Process Management.

                                                            «Классическую» CMS из него тоже пытались сделать, но вышло ИМХО так себе: врождённая корявость HTML редактора и излишне замороченный подход к модификации внешнего вида сайта делают «шарик» совершенно неконкурентоспособным в этой нише.
                                                              +2
                                                              Активно набирает обороты опенсоурсный .net core, многие в корпоративном секторе уже поглядывают на него, размышляя. а не перейти ли на него с Java
                                                                0
                                                                Ага, только они очень долго так размышлять будут. Переходы то обычно сложные и дорогие
                                                                  +1
                                                                  Ну я знаю несколько компаний, который перешли с Java на net.core в новых проектах.
                                                            +3
                                                            Я надеюсь, что когда вас возьмут на работу, то будут платить $10 000 в месяц. Без этого знать столько всего сразу несколько бессмысленно.
                                                              0
                                                              Это вполне реальная зарплата для системного артихектора, который всё это знает.
                                                              +2
                                                              Поясню коммент выше:
                                                              Если под фулстеком подразумевается node.js на фронте и беке, то ок. Если node.js на фронте и приемлемый код на PHP на беке, то даже тут ок. Но если подразумеваевается node.js на фронте и хороший код на беке с хорошими архитектурными заделами, то я таких фронтендеров не встречал.
                                                              Все фулстек, которых я встречал, хорошо пишут фронтеэнд сторону и копипастят подходы в готовом продукте на беке. Потом это надо ревьювить и делать красивым.
                                                                +1
                                                                Ну не знаю… Я вообще программировать учился на крестах изначально. Поэтому до сих пор не встречал ни одной сложной для понимания концепции в PHP. Писать самому поначалу непривычно, но с чужим кодом чаще вопросов куда больше возникает, поэтому в итоге всё равно приходишь к тому, что сам пишешь.

                                                                Думаю проблема основная в том, что многие люди идут в web, не имея изначально глубокого знания какого-либо серьёзного языка. Я, собственно, именно про ООП и упомянул в первом списке.
                                                                  +7
                                                                  node.js на фронте

                                                                  Это словосочетание конкретно рвёт мне шаблон. Node.js работает на сервере. Сервер — это бэкенд. Фронт — это в браузере. Или я где-то глубоко заблуждаюсь?

                                                                    +2

                                                                    Всё правильно. Node.js — это или бэкенд, или средства разработчика.

                                                                      +1
                                                                      Однако это так и есть. Имеется ввиду что node.js используется просто как средство автоматизации самых различных задач во фронте. Большинство современных фронтовых тулов, которых тысячи, сделаны на ноде, но работают они как правило локально, без поднятия сервера, то есть это просто скрипты процессы которых чаще всего убиваются после завершения задачи.
                                                                      0

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

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

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

                                                                      +10
                                                                      Отсутствие в списке инструментов для бэкенда Java (Spring) и C#/.Net вызывает недоумение.
                                                                      И тут сравнивать нужно даже не количество вакансий (их гораздо больше, чем для того же Ruby, например), а вилку зарплат :)
                                                                      По данным мойкруга, например...
                                                                        –7
                                                                        Ну C#/.Net — может ещё может потягаться с тем же руби. Но ява проигрывает явно по всем фронтам. Даже если вакансий больше в целом, значимая часть из них — это не именно бэкэнд, а например что-то специализированное внутри компании. Какие-нить клиенты для внутренних ERP-систем, например, частенько на C#/.Net и пишутся. Как долю оценивать я не знаю. В любом случае она меньше чем у популярных направлений. Ну а объять всё за раз невозможно, поэтому решил про это не писать вовсе.
                                                                          +6

                                                                          ХХ по Москве:


                                                                          "Java Spring" — 535 вакансий.
                                                                          "Symfony OR Laravel OR Yii" — 434 вакансии.
                                                                          "Ruby on Rails" — 270 вакансий.
                                                                          "Django OR Flask" — 254 вакансии.

                                                                            0
                                                                            «Symfony OR Laravel OR Yii» — 434 вакансии.

                                                                            У нас с вами какой-то разный ХХ



                                                                            «Java Spring» — 535 вакансий. Из них минимум процентов 15 — никак не связанные именно с веб-бэкэнд.
                                                                            Несколько примеров, которые по этому запросу находятся:
                                                                            hh.ru/vacancy/29898913?query=Java%20Spring
                                                                            hh.ru/vacancy/30416742?query=Java%20Spring
                                                                            Очень показательный пример:
                                                                            hh.ru/vacancy/30180699?query=Java%20Spring
                                                                            Я просто знаком с продуктами этой компании. Это не Backend для web'а. Да, там используются практически те же технологии, например REST, но это всё же иная сфера.
                                                                            И таких вакансий, на самом деле, явно больше 15%, я же не буду их все просматривать, ну. Это нерелевантная выборка.

                                                                            У PHP и Node вакансий будет больше в итоге.
                                                                              +3
                                                                              У нас с вами какой-то разный ХХ

                                                                              О пересечениях множеств что-нибудь слышали?


                                                                              hh.ru/vacancy/29898913?query=Java%20Spring

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


                                                                              hh.ru/vacancy/30416742?query=Java%20Spring

                                                                              А вот в этой вакансии показательно: «Круто, если Вы умеете-практикуете Spring Boot».


                                                                              Я просто знаком с продуктами этой компании. Это не Backend для web'а. Да, там используются практически те же технологии, например REST, но это всё же иная сфера.

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


                                                                              У PHP и Node вакансий будет больше в итоге.

                                                                              Анализировать, конечно, мы их не будем? С упоминанием Node половина будет про фронтенд, я гарантирую это.


                                                                              Вообще ради чего вы так упрямо пытаетесь принизить Java по количеству и качеству вакансий?

                                                                                0
                                                                                Какая разница для чего бэкенд: для веба, для мобильников или десктопного приложения?
                                                                                Разница в том, что статья про web-разработку была, так-то…

                                                                                Вообще ради чего вы так упрямо пытаетесь принизить Java по количеству
                                                                                Не пытаюсь, что вы. Я лишь пытаюсь объяснить почему предпочтение для обзора отдано не этому языку, возможно я не до конца верно мысль излагаю.

                                                                                и качеству вакансий?
                                                                                Тут тем более нет, я вообще это даже не обсуждал, ибо сам считаю эту технологию, в целом, лучше чем многие другие интерпретируемые языки, несмотря даже на её давние проблемы, в виде дыр в безопасности её рантайма, например.
                                                                                  +3
                                                                                  Ну, у меня такое ощущение, что вы оставили только те языки, про которые что-то знаете. Это как если бы я писал: PHP устарел, не учите его(это кстати разве не так?), учите Java, на ней держится мир бэкенда. Ну и Node.js можете учить. Про RoR ничего не напишу вообще, потому что я про него не знал(аналогия с C#).
                                                                                    0
                                                                                    Ага. Было бы гораздо лучше, если бы я написал про те языки, про которые вообще ничего не знаю, но они модные, например про Golang?
                                                                                      +3
                                                                                      Ну серьезно, зачем писать статью которая освещает вопрос кусками?
                                                                                      И рекомендуя PHP вы оказываете медвежью услугу людям.
                                                                                      Дайте ему уже умереть
                                                                                        0
                                                                                        Это на цикл статей потянет минимум.
                                                                                    +2
                                                                                    Разница в том, что статья про web-разработку была, так-то…

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

                                                                                      –2
                                                                                      Напомню, что изначальная ваша позиция была такая: «Даже если вакансий больше в целом, значимая часть из них — это не именно бэкэнд, а например что-то специализированное внутри компании». То есть вы прямо сказали, что на Java вакансий по бэкенду мало.

                                                                                      Ну так мы и пришли к тому, что вакансий на web-бэкэнд на Java меньше, чем на остальные языки.

                                                                                      Ошибся я, по сути, только в том, что шарп не стал учитывать.
                                                                                        +2
                                                                                        Да не меньше! Java уверенно занимает большой кусок backend`a.
                                                                                        Странные у нас у всех поиски, приведу свой(с hh, по России) по запросу яп backend:
                                                                                        Java — 1032
                                                                                        PHP — 908
                                                                                        Python — 748
                                                                                        Node.js — 435

                                                                                        А если просто по запросу яп, то вот:
                                                                                        Java — 6000
                                                                                        PHP — 4200
                                                                                        Python — 5100
                                                                                        JavaScript — 8000, из них Node.js — 1159
                                                                              +4
                                                                              Ну C#/.Net — может ещё может потягаться с тем же руби. Но ява проигрывает явно по всем фронтам
                                                                              Даже если вакансий больше в целом, значимая часть из них

                                                                              В каком регионе, если не секрет? На headhunter по кейворду Java есть 1100 вакансий в Питере, 500 по C# и чуть больше 100 для Ruby.

                                                                                0
                                                                                По России искал.
                                                                                  +3
                                                                                    –1
                                                                                    А как вы вакансии шарпа, разделили на те, что для web и остальные?
                                                                                      +5

                                                                                      Там сложно так сходу сказать, но запрос "c#" and (asp.net or javascript or typescript or web or веб or fullstack) выдаёт 2.3К вакансий(т.е. с явным требованием чего-то вебового) — больше половины от всех.


                                                                                      Аналогичный запрос для java — 3.2K.


                                                                                      Для руби, кстати, тоже не везде веб в вакансиях — разрыв сохраняется.

                                                                                        –1
                                                                                        Окей, убедили. Видимо я не додумался именно по шарпу поискать.
                                                                                +4
                                                                                Насчёт «потягаться с руби» уже другие хабровчане ответили, вот честно, вы статистику из какого-то параллельного мира цитируете.
                                                                                Если хотите оценить именно позиции для веб-бэкенда, ищите по названию основного фреймворка, т.е. «ASP.net» или «Spring», как уже посоветовали выше.
                                                                                А что до широты применения — так это наоборот плюс, т.к. даёт возможность потом при желании легко перейти из веба в мобильную или десктопную разработку, к примеру.
                                                                                  0
                                                                                  Если хотите оценить именно позиции для веб-бэкенда, ищите по названию основного фреймворка, т.е. «ASP.net» или «Spring», как уже посоветовали выше.
                                                                                  Согласен, это было бы релевантнее. Но сопоставление и получение результатов было бы слишком затратным для использования в качестве примера. Это же всё-таки не исследование рынка, тут цель была другая.

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

                                                                                    Я думаю, вы имели в виду всё-таки C++ говоря про ООП-языки.
                                                                                      0
                                                                                      Ну возможно. Дело в том, что ощущение того, что я понимаю чего ж там именно всё-таки происходит с кодом в интерпретаторе\компиляторе, когда я составляю те или иные языковые конструкции, пришло только после изучения нескольких ООП-языков.

                                                                                      Конечно, в моём случае, основной толчок к пониманию базовых концепций дал именно С++. Но, тем не менее, более чётко всё осознать удалось уже после него, уже чуть позже, когда возился с PHP и (параллельно с асмом для МК). Потому я считаю, что порядок не важен и любой язык может дать представление.

                                                                                      Опять же, до плотного изучения крестов в вузе нам преподавали Delphi\Pascal, думаю это тоже роль в понимании сыграло.
                                                                              +2
                                                                              Помните о stackshare.io чтобы быть в курсе, что используется в топовых и не очень компаниях
                                                                                0
                                                                                Спасибо, видел сервис раньше, но не смог нагуглить.
                                                                                  +1
                                                                                  Еще есть www.libhunt.com
                                                                                    0
                                                                                    Кайф
                                                                                      0
                                                                                      лайф-хак на будущее, если есть какой-то сайт интересной тематики, то стоит погуглить запрос «alternatives to X» и на сайте альтернатив можно найти много полезного.
                                                                                +5
                                                                                Аналогично было, ушел (С++ бэкэнд винда, com-объекты) что называется в блудняк на ~10 лет (иногда баловался php, html/css). Возвращаться ой как тяжело, пробовал волнами (руки опускались от растерянности), непонятно куда ткнуться, полно технологий живущих на хайпе 1-2 года. Ошибался, веря IT-псевдоаналитикам, гадалкам и астрологам, переполняла смесь восхищения от стремительного развития отрасли и недоумение от нехватки профессионалов. Сначала с фронтэндом разобрался, для бэкэнда сейчас поглощаю asp.net core (c# понятен и понравился f#), архитектуры приложений, книжки по алгоритмам, нейросетям, в AI погружаюсь, купил для исследований RealSense-камеру, нейрогарнитуру. Мне 40+, боязно работу искать, что там в резюме показывать. Свой проект пилить буду. Благо идеи есть. Дорогу осилит идущий…
                                                                                  –4
                                                                                  для бэкэнда сейчас поглощаю asp.net core (c# понятен и понравился f#)

                                                                                  Возможно я отстал от реалий рынка и меня поправят, но кажется вы опять промазали со стеком.
                                                                                    +1

                                                                                    А что здесь по-вашему не так?

                                                                                      +1
                                                                                      .NET сейчас на взлёте, в отличие от Java (спасибо Kotlin), так что выбор как раз оправдан
                                                                                        +1
                                                                                        Как Kotlin влияет на бэкенд яву? На взлете или нет, но и у Java дела совсем не плохи.
                                                                                        0
                                                                                        mkshma Это вы об этом?
                                                                                        .Net vs Java
                                                                                        image

                                                                                        Да, была такая дилемма ) Но уже есть .Net Core, перспективы его интересны. Почитайте статью на хабре Через год-два .NET Core потеснит Java на рынке enterprise решений...
                                                                                        Тут пришлось выбирать. Я не был привязан ни к одной платформе. Но мне показалось сейчас разумным, перспективным и универсальным (бэкэнд, мобильная разработка, фронтэнд пишем уже скоро в wasm) выбрать именно платформу. Кстати на C# ставку не делаю, изучаю F# (в AI, финансах активнее стали использовать).
                                                                                        p.s. Пробовал Kotlin — понравился, приятный язык.
                                                                                          +1
                                                                                          Мне программировать на C# понравилось гораздо больше, чем на Java.
                                                                                          Основная причина: языковые возможности. Java по сравнению с C# слишком консервативна. Многие возможности в ней появились через пару-тройку лет после C#. А некоторые так и не появились: value types, поддержка дженериков со стороны JVM и т.д.
                                                                                      +8
                                                                                      С первого взгляда есть несколько замечаний по фронтенду. Во-первых, с приходом ES6 язык сильно изменился в лучшую сторону. По крайней мере странно отказываться от применения новых возможностей и называть «чистым JS» устаревший стандарт. Будущее веб-компонентов наступает, наступает, а наступить никак не может. Стоит ли их использовать — большой вопрос. Зато переменные в CSS уже есть. Компиляция LESS на клиенте — это весьма проблемный подход, а в вашем примере вы рассчитываете значение 100vh. Зачем? XPath может быть полезен при тестировании сценариев взаимодействия, в остальном его обычно некуда применить. Собирать и тестировать все каждый раз перед отдачей клиенту? А как же производительность? Обычно это делают заранее и на продакшен-сервер заливают готовые скрипты и CSS. Стоит упомянуть PostCSS как хорошее подспорье при верстке (автопрефиксер, проверка совместимости с браузерами и.т.д.). То, что Webpack может заменить Bower — это глупость. Инструменты решают принципиально разные задачи. Gulp и Webpack могут работать вместе и успешно дополнять друг друга.
                                                                                        –1
                                                                                        Во-первых, с приходом ES6 язык сильно изменился в лучшую сторону.
                                                                                        Ну я не говорил, что он стал хуже.

                                                                                        По крайней мере странно отказываться от применения новых возможностей и называть «чистым JS» устаревший стандарт.
                                                                                        Ну, скажем, я всё же обычно под «чистым JS» подразумеваю ES в сравнении с TypeScrpit или CoffeeScript.

                                                                                        Компиляция LESS на клиенте — это весьма проблемный подход, а в вашем примере вы рассчитываете значение 100vh. Зачем?
                                                                                        Очевидно, это всё только для примера. Я предпочитаю ни SASS, ни LESS вообще не использовать без крайней необходимости. Что касается переменных в CSS, то они до сих пор процентов у 40 пользователей в браузере не работают.

                                                                                        PostCSS
                                                                                        не слышал. Почитаю, спасибо.

                                                                                        То, что Webpack может заменить Bower — это глупость.
                                                                                        Не согласен. Очевидно что задачи изначально у них разные, но имеется ввиду, что для загрузки можно использовать NPM, который есть по умолчанию, а соберёт всё Webpack. Собственно, погуглите, так частенько делают.
                                                                                          0

                                                                                          И причём тогда здесь Bower?

                                                                                            0
                                                                                            При том, что его можно заменить, используя импорты с помощью в Webpack, что тут непонятного?
                                                                                              0
                                                                                              С помощью Webpack, например, можно легко заменить связку Bower и Gulp/Grunt.

                                                                                              Однако Gulp/Grunt тоже могут использовать NPM. В чём тут преимущество именно Webpack?

                                                                                                0
                                                                                                Можете спросить у разработчиков Bower, которые сами предлагают его менять на Webpack на первой же странице:
                                                                                                bower.io

                                                                                                Если вас интересует лично моё мнение — у всей этой мешанины с нодой, трасплейтерами и бандлерами, вообще перед обычной примитивной IDE (типа Atom'а) и написанием классического кода на JS вообще без всяких модулей — преимуществ в абсолютном большинстве случаев нет никаких. Преимущества появляются, когда проект дорастает до определённого размера.
                                                                                                  +3
                                                                                                  Не Webpack, а «Yarn and Webpack».
                                                                                            0
                                                                                            что касается переменных в CSS, то они до сих пор процентов у 40 пользователей в браузере не работают.

                                                                                            https://caniuse.com/#search=css-variables

                                                                                              +1
                                                                                              Ну не знаю, очень странная статистика. Например, что у них единственная отмеченная версия Chrome for Android это 71, а Firefox for Android это 64. Как это понимать? С остальными чё?

                                                                                              Кроме того, у меня, на личном проекте с 1000+ посетителей в день, я вижу что до сих в статистике, например, одной оперы ниже указанной 35-й версии, всё ещё есть целых 1.5%. А у IE 5.5%, который даже не Edge. Это уже 7%, а я ещё не учёл старые мобильные версии, всякие Яндекс-браузеры и прочий хлам, которого вообще-то у посетителей очень много, а по ссылке выше нет вообще.

                                                                                              Пусть не 40, конечно, тут я погорячился, но 25% наверняка наберётся, что, опять же, всё ещё рановато.
                                                                                                0
                                                                                                Ну не знаю, очень странная статистика

                                                                                                Пусть не 40, конечно, тут я погорячился, но 25% наверняка наберётся

                                                                                                Зато у вас статистика шикарная.

                                                                                                  0
                                                                                                  300+ тысяч. уникальных посетителей в год. Для стран СНГ, как мне кажется, плюс-минус ничего такая статистика.

                                                                                                  Не миллионы конечно, но это и не обычный хомяк уже.
                                                                                                    +1

                                                                                                    Мой комментарий был относительно "тут я погорячился, наверняка наберётся". Располагая такой статистикой вы должны были намного более точно назвать цифру, не так ли?

                                                                                                      –1
                                                                                                      Метрика не позволяет выбрать больше 30 или 40 версий за раз, а их гораздо больше. Я даже все версии хрома, которые переменные не поддерживают, не смог на одном графике выбрать, не то что остальные. Можно было бы отдельно посчитать, но мне тупо лень — вы абсолютно бестолковый холиварщик, который ничего не в состоянии сказать по сути, зато в собственных комментах путается, диалог с вами абсолютно бессмысленен, извините.
                                                                                                  +1
                                                                                                  единственная отмеченная версия Chrome for Android это 71, а Firefox for Android это 64. Как это понимать? С остальными чё?

                                                                                                  Остальные не используются. На вкладке "Usage relative" лучше видно.


                                                                                                  В итоге, работает у 87.39% клиентов, не работает у 12.61%. Это всё же не 40% и не 25%, хотя и не 0%.


                                                                                                    0
                                                                                                    Остальные не используются.
                                                                                                    Да? А куда они деваются? Я вот не обновлял полгода ничего из маркета на старом смартфоне, но использую его для тестов интерфейса на работе.

                                                                                                    Один смарт отдал бабушке, думаете она там браузер обновляла? А она им пользуется, я вам гарантирую. Таких кейсов с десятки наберётся.
                                                                                                      0

                                                                                                      https://caniuse.com/usage-table


                                                                                                      У них действительно нет версий мобильного Chrome и Firefox, кроме последних. Но на этой же станице они пишут:


                                                                                                      Browser usage table, based on data from StatCounter GlobalStats
                                                                                                      Information for mobile versions is extrapolated from other sources.

                                                                                                      Либо эти браузеры обновляются своевременно и доля устаревших версий пренебрежительно мала, либо caniuse плохо экстраполирует :)


                                                                                                      В пользу первого варианта говорит то, что другие мобильные браузеры всё же разбиты на версии.

                                                                                                        0
                                                                                                        У них действительно нет версий мобильного Chrome и Firefox, кроме последних.
                                                                                                        Ну так это говорит лишь в пользу того, что их статистика — рафинированный булшит.

                                                                                                        Либо эти браузеры обновляются своевременно и доля устаревших версий пренебрежительно мала
                                                                                                        Ой лан, прекратите…

                                                                                                        И это даже не половина списка, мне просто лень скринить остальное



                                                                                                        Это всё только за полгода. Для мобильной лисы ситуация аналогичная.

                                                                                                        На самом деле у них и половины того, что есть у пользователей, нету в списке.
                                                                                                0
                                                                                                Ну, скажем, я всё же обычно под «чистым JS» подразумеваю ES в сравнении с TypeScrpit или CoffeeScript.

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

                                                                                                Здесь как-то контекст теряется.

                                                                                                имеется ввиду, что для загрузки можно использовать NPM, который есть по умолчанию, а соберёт всё Webpack

                                                                                                Вижу теперь вы добавили в статье NPM, а то раньше звучало так, что вы заменяете Bower+Gulp на Webpack.
                                                                                                  0
                                                                                                  Здесь как-то контекст теряется.
                                                                                                  Согласен, формулировка неудачная, надо поправить.

                                                                                                  Вижу теперь вы добавили в статье NPM, а то раньше звучало так, что вы заменяете Bower+Gulp на Webpack.
                                                                                                  Мне просто надоело отбиваться от буквоедов. NPM есть в ноде по умолчанию, я думал это очевидно и так.
                                                                                                0
                                                                                                Bower уже почти 2 года рекомендует перестать им пользоваться и переходить на Yarn/NPM.
                                                                                                bower.io/blog/2017/how-to-migrate-away-from-bower
                                                                                                0

                                                                                                Видать вы не сильно то и деградировали эти десять лет, просто тогда ещё perl в моде был

                                                                                                • НЛО прилетело и опубликовало эту надпись здесь
                                                                                                    +1
                                                                                                    Не просто по IDE, а как её использовать по максимуму, включая знание всех горячих клавиш, полезные плагины и написание макросов
                                                                                                      +3

                                                                                                      С учётом особенностей нетипизированных языков, я бы ещё сказал. Автор, к примеру, отмахивается от TypeScript, который лично мне очень сильно облегчает жизнь в основном именно за счёт поддержки в IDE — при попытках писать на чистом JS даже WebStorm (уж на что он в этом плане умный) гораздо реже может подкинуть что-то вменяемое в автодополнении, а об авторефакторинге часто лучше даже не думать.

                                                                                                        +2
                                                                                                        Автор из эпохи vim-а и emacs-а судя по всему. Хотя даже там были всякие плагины для какого-никакого автодополнения, если не ошибаюсь…
                                                                                                          0
                                                                                                          Ну, кстати, vim мне лично никогда не нравился.

                                                                                                          Сейчас пользуюсь Atom'ом и, иногда VSCode, для проектов на Node. Но предпочтение всё же отдаю Atom'у (и иногда Notepad2). До сих пор считаю, что чем проще инструмент, тем лучше.
                                                                                                            0
                                                                                                            В случае языков с динамической типизацией действительно можно обойтись редактором с подсветкой синтаксиса. Но если вы начнёте использовать языки со статической типизацией, вы поймёте, насколько же приятно использовать IDE в работе.
                                                                                                              0
                                                                                                              А как типизация на это влияет? Для C++ я писал в Builder и потом уже под RAD, оно, конечно удобнее, но по другим причинам — в первую очередь потому, что в С++ есть компиляция, а в этих IDE отладчик встроенный. Хотя пара фич у умных IDE действительно есть, которых лично мне, по большому счёту, не хватает в простых редакторах:

                                                                                                              — Удобный всех мест в проекте где вызывается функция (как в Storm от JetBrains, хотя может у других есть такое же). Хотя в том же Atom это можно заменить «поиском по проекту».
                                                                                                              — Вывод списка аргументов, которые принимает функция и их типов, по мере ввода.
                                                                                                              — Статический анализ.

                                                                                                              Но эти вещи никак с типизацией не связаны, вроде бы.
                                                                                                                +1
                                                                                                                А как типизация на это влияет?

                                                                                                                Статическая типизация позволяет более интеллектуально делать поиск по проекту, осуществлять рефакторинги.


                                                                                                                Для C++ я писал в Builder и потом уже под RAD

                                                                                                                В них очень слабый анализ кода. Не сильно лучше редактора с подстветкой синтаксиса. Зато есть отладчик — это большой плюс.


                                                                                                                — Удобный всех мест в проекте где вызывается функция (как в Storm от JetBrains, хотя может у других есть такое же). Хотя в том же Atom это можно заменить «поиском по проекту».

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


                                                                                                                — Вывод списка аргументов, которые принимает функция и их типов, по мере ввода.

                                                                                                                Отлично. И как же вывести параметры метода при условии, что тип объекта неизвестен? Или предлагаете пользоваться только статическими функциями?

                                                                                                                  0
                                                                                                                  Отлично. И как же вывести параметры метода при условии, что тип объекта неизвестен?
                                                                                                                  Я имел ввиду в основном именно аргументы к функции, которые, очевидно IDE ищет всё-таки по имени функции, а не по типу. В случае объектов с не объявленным типом, список методов, очевидно, никак не вывести. Однако есть разные ситуации, например, если я нахожусь внутри функции, при объявлении которой указал, что принимаю в качестве аргумента массив, то можно показывать методы, доступные для массива, например, какие проблемы?
                                                                                                      +2
                                                                                                      Объектно-ориентированный подход в программировании.
                                                                                                      Системы контроля версий.
                                                                                                      Концепция MVC
                                                                                                      Методологии разработки Agile и Scrum

                                                                                                      Это шутка? Этим вещам по 10-20 лет, если не больше.

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

                                                                                                      Есть
                                                                                                      Аналогов Gii нет ни в одном современном фреймворке (по крайней мере из коробки в большой четверке).
                                                                                                        0
                                                                                                        Это шутка? Этим вещам по 10-20 лет, если не больше.
                                                                                                        Ну я не говорил что это всё вчера появилось, это глава про базовые понятия же.

                                                                                                        Есть
                                                                                                        Классный линк, спасибо.
                                                                                                          +1
                                                                                                          Аналогов Gii нет ни в одном современном фреймворке

                                                                                                          Попробуем сделать выводы?)
                                                                                                            +2
                                                                                                            Это шутка? Этим вещам по 10-20 лет, если не больше.
                                                                                                            Больше. Agile скоро 20, остальные старше. ООП — 52 года.

                                                                                                            А системы контроля версий — это, как говорится, было бы смешно, если бы не было так грустно. Вы даже не представляете, сколько до сих пор существует айтишников, которые не умеют ими пользоваться.
                                                                                                              0
                                                                                                              Agile скоро 20

                                                                                                              А скраму вообще за 30


                                                                                                              Hirotaka Takeuchi and Ikujiro Nonaka introduced the term scrum in the context of product development in their 1986 Harvard Business Review article, "The New New Product Development Game". Takeuchi and Nonaka later argued in The Knowledge Creating Company that it is a form of "organizational knowledge creation, [...] especially good at bringing about innovation continuously, incrementally and spirally".
                                                                                                                +2
                                                                                                                Это не столь важно. Даже в рамках PHP объектная парадигма доступна с начала 2000-х годов, MVC (в вебе) стартовал годом позже с подачи DHH и его рельсы. Другое дело, что пока у тебя сайт представляет собой 20 php скриптов, тебе этот MVC не особо-то и нужен. Дак и на C можно в объектном стиле писать, структы есть же? Значит можно. Я особо не интересовался, есть ли там инкапсуляция и прочие ништяки полноценного ОО подхода, но по крайней мере зачактки уже есть, а это 1972 год.

                                                                                                                А вот переход от сервер сайд рендеринга к клайент сайд рендерингу — это реально революция в вебе, но автор этому посвятил одну строку в своей статье. Из этого делаю вывод: реальность современного веба автор не понимает, масштаб изменений не оценивает. Смысл тут дальше что-то обсуждать?
                                                                                                                  0
                                                                                                                  Системам контроля версий около 50-ти.
                                                                                                                  Я работал с SCCS, которая была предком CVS и родилась еще в недрах bell labs где-то в начале 70-х
                                                                                                                  Просто системы контроля версий реально решают проблемы тех проектов, где несколько программистов.
                                                                                                                  А где разработчик один — это больше вопрос привычки и удобства.
                                                                                                                    0
                                                                                                                    А системы контроля версий — это, как говорится, было бы смешно, если бы не было так грустно. Вы даже не представляете, сколько до сих пор существует айтишников, которые не умеют ими пользоваться.
                                                                                                                    This! Собственно, потому и упомянуто.
                                                                                                                  +1
                                                                                                                  Ну я не говорил что это всё вчера появилось, это глава про базовые понятия же.


                                                                                                                  для претендента на вакансию web-разработчика сейчас недостаточно навыков десятилетней давности (какая неожиданность!)

                                                                                                                  Десять лет назад веб-разработчик, незнакомый с ООП, MVC и методологией Agile мог работать в лучшем случае каким-нибудь битриксоидом на екоммерсе. Как вы себе представляете веб разработку на PHP в процедурном стиле? Вы хоть откройте учебник Шлосснейгла (2004 год, если что) и ознакомьтесь с его содержимым, прежде чем статьи писать.
                                                                                                                    0
                                                                                                                    Десять лет назад веб-разработчик, незнакомый с ООП, MVC и методологией Agile мог работать в лучшем случае каким-нибудь битриксоидом на екоммерсе.
                                                                                                                    Крайне спорное заявление. Вы в целом что хотите сказать, что ООП знать не нужно или чего?

                                                                                                                    Как вы себе представляете веб разработку на PHP в процедурном стиле?
                                                                                                                    А где я писал про процедурный стиль? Речь о том, что многие сегодняшние модные «JS-кодеры», любящие рассуждать на тему что круче TypeScript или ES6+, не в состоянии при этом без гугла внятно ответить чем, например, объект в том же JS отличается от примитивного типа. Или, является ли функция объектом. Собственно, лишь для того чтобы у читателя эти понятия лучше закрепились в голове эта отсылка и сделана.

                                                                                                                    Вы хоть откройте учебник Шлосснейгла (2004 год, если что) и ознакомьтесь с его содержимым, прежде чем статьи писать.
                                                                                                                    Зачем?
                                                                                                                      +2
                                                                                                                      Я говорю, что статья в целом не отвечает на вопрос, поставленный в заголовке: а именно познакомить человека с современной веб разработкой.

                                                                                                                      ООП, MVC — это все было и десять, и двадцать лет назад. Ну, правда, сложно представить себе человека, занятого в IT и не знакомого с этими концептами. PHP7, да равно как и RoR нынешний мало чем отличаются от самих себя в 10 летней ретроспективе. Так ли важны тайп хинты и декларация типа ретерна? Наверное, нет.

                                                                                                                      А вот самому важному, REST API, вы уделили одну строку (sic!). А ведь тем временем это самое важное изменение в вебе за всю его историю. Это смена парадигмы в целом: раньше мы имели сервер сайд рендеринг с js (который в принципе мог быть отключен) для второстепенных задач, то сейчас мы имеем клайент сайд рендеринг, т.е. js вышел на передний план, он значительно превысил в сложности программирование на бэк энде, которое по сути свелось к формированию и отдаче json'а из БД.

                                                                                                                      На фронте же теперь создаются сложнейшие приложения с полноценным рил тайм рендерингом, которые не уступают возможностям традиционных десктопных приложений. Разве могли бы быть реализованы хотя бы теже гугл документы, трелло или какой-нибудь google docs без современного js? Вот о чем должна была быть статья, что там на бэкенде, PHP или RoR — это вообще уже не важно.