Как стать автором
Обновить

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

Разве плохо было бы, если б большинство фич C++ 20 работали с более старыми (и все еще широко использующимися) версиями компиляторов...

-Да, никому не упали лишние UB

В формате мема:


Все: Ржут над npm с его node_modules и говорят что python куда лучше для новичков


Python3: Я буду ставить зависимости всех проектов прямо в систему. Ну, если только если ты не обманешь её, сделав одним из нескольких способов венв и не пообещаешь на словах, что не забудешь включать венв когда будешь ставить зависимости. Которые, кстати, будут просто в текстовом файле, а если там нужны системные библиотеки — то пошел ты нафиг, вот что.

Все давно в pyproject.toml (https://python-poetry.org/)
Никогда не думал, что фронт для джунов. До этой статьи.

А как она изменила это мнение?

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

И какие аргументы Вы нашли?

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

Что значит "низкий порог входа"? Создать index.html в 2к21 уже недостаточно, если что :)

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

99.9999% всех разговоров в интернете строятся вокруг объективных суждений (данная цифра тоже субъективно взята с потолка), не понимаю, в чем проблема ¯_(ツ)_/¯

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

Низкий порог входа только для тех, кто копипастит примеры jQuery со Stack Overflow.

Я пару лет активно занимался кастомным фронтедом HTML/CSS/Vanilla JS (никакого jQuery или Бутстрапа). А потом за 2-3 месяца освоил бекенд (настройка сервера и NodeJS). До этого я боялся бекенда. Думал, что им занимаются только хардкорные программисты. Но я очень удивился, когда осознал, что те логические задачи которые мне приходится решать на фронденте на порядок сложнее тех, с которыми я сталкиваюсь на бекенде. Это в разрезе одного среднестатистического сайта на котором я делаю и фронт, и бек.

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

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

Статья показалась очень наивной:


  1. Фронтэндеры подменяются мифическими "опытными фронтэндерами"
  2. "Сложность" частично подменяется "важностью"
  3. Много воды типа "сложные проблемы такие сложные", "МНОГО думают над этими проблемами", "ПОСТОЯННО работают над этими проблемами"

Показалось что кучка джунов напостила комменты в твиттер — и вот статья.

вы же в курсе, кто такой Yehuda Katz?

Какая разница? Я про содержание статьи, а не про количество женщин, которые хотят от него детей.

Люди:
"С фронтом справится любая обезьяна, там делов-то что джейсон перекладывать и формочки клепать"


Эти же люди:
"Эй, почему у меня сайт тормозит? Почему он грузит мегабайты жс-кода? Почему так медленно? Где доступ с клавиатуры? Почему в сафари всё поехало? Какие дятлы вообще так делают?!"

Дятлы? Герои!

Человек, который хвалит тулинг JS либо никогда не работал ни с чем другим, либо никогда не работал с проектами больше одностраничника. Когда у тебя тайпчек после простого изменения делается по 2-3 минуты, или вообще tsc отваливается — разработка превращается в ад. Сборка проекта, который пишется меньше года по 15 мин — да запросто. Тайпинг в тайпскрипте лучший — ну программисты Dart с вами не согласны.
Редко соглашаюсь с этим автором, но вот тут он прав — Объясните, почему мой рокет-саенс бэкенд билдится пару секунд, а четыре формы на фронте — полгода
А по-поводу отношения как к джунам — не знаю как так получается, но у меня сложилось впечатление, что фронтендеры гораздо чаще изучают и знают именно технологии, а не само программирование. Вы когда-нибудь видели чтобы в мире C# делили людей на EntityFramework-разработчик или Dapper-разработчик? А Senior React Developer — это в порядке вещей.

Яхуда Кац явно работа с проектами вне фронтенда. И большие проекты явно делал.

> Сборка проекта, который пишется меньше года по 15 мин — да запросто.
А на C можно membomb написать, которая вообще не соберется.
strict: true надо включать и типы чаще прописывать, тогда тайпскрипт компилирует довольно быстро. Ну и реакты с англурярами собирать отдельно, чтобы по 10МБ на диск не читать/писать
ну программисты Dart с вами не согласны.

А можно пример?


Когда у тебя тайпчек после простого изменения делается по 2-3 минуты

Это проблема. Но стоит отметить, что эта проблема присутствует, наверное, во всех языках с продвинутой системой типов. И ею она и обусловлена. Т.е. тормозами вы платите за комфорт. Если вас устраивает система типов в C#, то вы можете писать на TS так, чтобы он копилировал быстро.

Деление есть, но его мало. Для примера есть SharePoint. Знания только c# будет мало, надо понимать особенности экосистемы SP. Если покопать, то причина кроется в маркетинге и попытке удешевить оплату труда разработчика, уменьшая порог вхождения. То бкенда тоже доберется). В целом кодить на фронте сложнее чем на бекенде. Большинство фронтовых заказов в области сайтиков, с которыми справляются и недопрограммситы)

Настройте babel для транспиляции и линтер для tsc.
А tsc --noEmit используйте периодически для проверки.
Итого, компиляция через бейбл 1,7сек, через tsc 47. Как-то так.)

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

Это ложное впечатление. Прочитайте мой комментарий выше: habr.com/ru/post/535724/#comment_22530464

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

В целом, согласен.
Вы когда-нибудь видели чтобы в мире C# делили людей на EntityFramework-разработчик или Dapper-разработчик? А Senior React Developer — это в порядке вещей.

"Senior Oracle Developer", это тоже человек, который просто знает именно технологию, а не само программирование? (вакансия как доказательство существования профессии, а не реклама).
В целом, все описанные Вами проблемы решаются очень просто, у нас проект, которому больше 7 лет, с кучей файлов, ts'ом, scss'ом, vue, и прочая и прочая, собирается за 30 секунд 3-им webpack'ом:) (можно и быстрее, но неактуально, пока что)

У меня есть гипотеза, почему «фронтенд для джунов».


  1. Никто не хочет тратить время на нагромождение костылей по имени HTML+CSS и часто отдают это джунам.
  2. Делать типовые формы и таблицы действительно несложно.

Верстка, формы и таблицы это, наверное, 80% всего фронтенда и с этим справляются джуны. То же самое можно сказать и про бек, где 80% это принять запрос, запустить SQL, вернуть результат.


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

То же самое можно сказать и про бек, где 80% это принять запрос, запустить SQL, вернуть результат.

Кто то еще этим занимается в 21 веке? Я уже лет 10 ввод/вывод данных не писал, есть куча спецификаций которые это делают автоматом для CRUD.

На одной из работ нужно было делать много разных таблиц.


На первый взгляд действительно просто. Но потом возникают такие вещи как:


  • динамические данные
  • фельтиперсовые ячейки а-ля прогресс-бары, чарты, красотульки, свистелки и пукалки
  • фильтрация, из хэдеров или из-вне.
  • пагинация, причем обязательно сподвывертом и красивыми кнопочками
  • сортировка, причем когда у вас фельтиперсовые ячейки в виде графиков, прогрессбаров и тд
  • изменение данные прямо из таблички
  • объединение ячеек и колонок
  • drag-and-drop
  • i18n
  • ....

Вот и прыгаешь по всем этим DataTables, ag-Grids и мериадам реактовых велосипедов. А потом еще и сам свой велосипед начинаешь городить ибо ничего из готового под фантазию твоих продуктов не подходит.

Конечно же я не о таких таблицах говорил.

Что только это фронтендеры ни придумают, лишь бы $mol не использовать..

Удивлен, почему «пользователь закрыл ноутбук» преподносится как внезапное, неочевидное и уникальное для фронта поведение. Аналоги его присутствуют для любых (во всяком случае, во всех, мне известных) областей. Виртуальная машина встала на suspend и вернулась через 10 минут. Антивирус заблокировал временно или перманентно один или несколько ресурсов, используемых десктопным приложением. В среде обновилась библиотека и теперь она вызывает ряд недокументированных эффектов в старых функциях. Пропало питание, в конце концов. Продолжать можно бесконечно… В большинстве случаев приложение должно разрабатываться с учётом того, что кругом враги и на входе и выходе могут произойти непредвиденные ситуации. И да, «X для Y» без уточнения условий не вызывает ничего, кроме снисходительного недоумения. Разве только кроме иронического применения)

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

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

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


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

Вы всё, что не web-фронт, почему-то обобщаете в stateless-бэк (плюс редкие не-stateless). Модуль расширения для Postgres, к примеру, к разработке не относится? Или там не требуется отрабатывать нештатные ситуации? Или перезапускать сервер с тяжелыми базами — это не критично? Не вполне понял Вашу мысль.

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

Кстати, о TypeScript. TypeScript — лучшая в своем классе система постепенной типизации для динамического языка.

Не знаю как Вы, но лично я бы предпочел, чтобы TypeScript имел обязательную статическую типизацию. Думаю, если сильно постараться можно даже отказаться от типа any. Но больше всего в ts мне не нравятся дженерики. Окей, они есть, но почему нужно делать какие-то костыли?
спойлер
ёлы-палы, я только сейчас увидел как давно этот вопрос был задан, мда…
Окей, они есть, но почему нужно делать какие-то костыли?

Принимая во внимание, что в TS это просто типы поверх JS, получается, что автор вопроса хочет странного. Он хочет получить тип, который есть только на стадии компиляции, и использовать его в runtime. Для этого надо класс передавать явным образом в виде, скажем, аргумента. Ну или замыкания. Т.е. generic-и в TS тут совсем не причём, т.к. они — просто типы. Они абстрактная нематериальная сущность, к ним нельзя обратиться в runtime, т.к. их просто не существует в runtime. Весь TS это просто абстракция.


TypeScript имел обязательную статическую типизацию. Думаю, если сильно постараться можно даже отказаться от типа any

TS это wrapper над JS, и практически все проблемы TS вытекают именно из этого. Например отсутствие удобных перегрузок, отсутствие доступа к типам в runtime, unsoundness и пр..


Я бы тоже предпочёл, чтобы в browser-ах появился новый язык, с выразительностью и системой типов не ниже TS/Flow, но sound (напр. Scala 3). Это же позволит сделать его весьма быстрым. Однако этого, я полагаю, не случится в ближайшее десятилетие.

В браузерах есть webassembly.

И, я надеюсь, с какого-то момента из webassembly будет доступ к DOM без JS interop и мы забудем про JS как про страшный сон.
Боюсь webassembly породит еще больше проблем, они просто будут другими), но решит текущие)

Доступ в DOM из WASM не поможет. Потому что внезапно выскочат все те же грабли что и в JS


  • Массивы, которые совсем не массивы, а NodeList со своим поведением
  • document.all который имеет тип undefined, но со значением

Можно, конечно, сказать "а давайте выкинем это легаси и сделаем новый нормальный API", но это совсем другого порядка задача и как заметил faiwer, в ближайшем десятилетии это вряд ли случится

В чем проблема сделать новое браузерное API, если обратная совместимость нас не тянет? Это как раз тот случай, когда можно и нужно. Легаси продолжит использовать интероп, ибо и сам JS сразу никуда не планирует исчезать из браузеров.

Потому что эффект второй системы никто не отменял. Создание нового "правильного" DOM API будет тем еще долгостроем.

Т.е. generic-и в TS тут совсем не причём, т.к. они — просто типы. Они абстрактная нематериальная сущность, к ним нельзя обратиться в runtime, т.к. их просто не существует в runtime.

Так ведь можно сделать так, чтобы они были доступны: записывать референсы на конструктор в приватных статических полях класса, доставать их оттуда. Проблема только в том, что это не будет работать с выдуманными типами «string», «number». Но даже это можно обойти, если во время транспиляции подставлять соответственно «String» и «Number». Это всё только должен разруливать tsc, а не программист.

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

Записать в references вы можете только class-ы, т.к. interface-ов и type-ов просто не существует в runtime. Записывать же туда только классы — очень спорное решение.


Но даже это можно обойти, если во время транспиляции подставлять соответственно «String» и «Number»

Очень слабое решение. Это позволит покрыть условно 0.1% возможностей типов в TS. Зачем оно такое нужно на уровне языка? Я уже использовал это решение как раз с NestJS. Ощущение того что это эпичный костыль не покидало и не покидает меня по сей день. Там такое количество "но"…

очень спорное решение

Ну дык из enum'ов сделали же порнографию, что с дженериками такое провернуть не могут?

Ладно, я понял Вашу позицию. Можете привести примеры возможностей типов в TS только? Пока не сообразил, что имеете в виду.
Ладно, я понял Вашу позицию. Можете привести примеры возможностей типов в TS только? Пока не сообразил, что имеете в виду.

Ну например:


  • Сигнатуры у методов
  • Алгебра типов (особенно |)
  • higher order rank polymorphism
  • Рекурсивные типы
  • Литералы
  • Перегрузка
НЛО прилетело и опубликовало эту надпись здесь

Если честно я вообще не понял, что вы этим хотели сказать. Зачем вы процитировали моё сообщение. И причём тут автор (я не автор). Так же как непонятно причём тут Deno.

НЛО прилетело и опубликовало эту надпись здесь
дено тут при том что тут люди обсуждают то что тс статический, что мб было бы актуально года так полтора назад

Вы уверены, что вы понимаете, что такое Deno? :) Это просто аналог nodeJS от его же автора. Да в нём используется TS по-умолчанию. Но, come on, runtime там всё тот же V8. Соответственно там нет никаких типов в runtime. Deno никак не меняет сущность TS. Просто транспилятор встроен в сам Deno. Поэтому он мало кому интересен. Кроме "революционной" идеи про url-import-ы он ничем не примечателен.


лол ваще в шоке как это можно не понять

Ну то что у вас трудности с формулировками я вижу :) JS не является моим первым языком. И единственным тоже не является. И нет, я писал на языках со статической системой типов. Я "курил" куда больше, чем ванильный JS. Подозреваю, что в цитате, на которую вы мне ответили, вы непонимаете значения половины пунктов :)

НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Сигнатуры у методов — ЛЮБОЙ ооп язык

Почему именно ООП? Любой язык со статическими типами вообще. Как без них то? Писалось в контексте того что TS не может предоставить в runtime такие вещи


алгебра типов — тут согласен такого нигде больше нету

С чего это вдруг? Wiki пишет про несколько десятков языков, среди которых Scala и Haskell


higher order rank polymorphism — ну тут вообще цирковое представление

Насколько я могу судить в TS вообще нет Kind-ов. Отсюда и нет их полиморфизма. Issue по твоей ссылке я читал. Их там много. Каждый любитель FP заводит по одной, чтобы завести свои монады ;) На хабре есть даже неплохая статья про то как это можно обойти, если очень надо.


Но я не про -Kinded polymorphism, я про:


type A<T1> = <T2>(t1: T1, t2: T2) => <T3>(t3: T3) => [T1, T2, T3]

По сути про polymorphism за счёт generic-ов в рамках higher-order-functions. Но ок, раз ты смог нагуглить про Kind-ы поставим галочку ;)


— литералы — помянем автора

Literal Types


— перегрузка — аналогично

Overloaded Functions. Впрочем уверен что если ты слышал про ООП, то про них ты знаешь.


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

Хорошо, что к вам "на район" завезли интернет ;) TS всяко лучше, чем 228

Герои хреновы. Раньше firefox за неделю-две использования сжирал 2-3 гигабайта и падал. Сейчас же при запуске и открытии нескольких сайтов он отжирает эти самые 2-3 гигабайта. И это не только потому что он такой кривой, а потому что сайты стали немерено сложными. На ноутбуке с 16 гигабайтами RAM уже невозможно работать.
Странно, на своей десктопной «лисе» за несколько лет такого никогда не замечал.
Браузер всегда укладывается в 1 Гб RAM.

А вот с тем, что через несколько дней использования hibernate браузер начинает глючить, согласен полностью.
Никакой гибернации, комп работает месяцами без перезагрузок. Укладывается в гигабайт? Очень смешно. Он по настроению может запросто выжрать всю память, а ее установлено 64 гигабайта. Не всё, конечно, выделено для наглой рыжей морды, но жрёт он всё до чего может дотянуться. Иногда с какими-то версиями лучше, иногда совсем плохо. Очень сильно течет от просмотров видео.
Впрочем, chrome не лучше.
Очень сильно течет от просмотров видео.

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

Причем тут кодеки? Firefox все воспроизводит своими встроенными. 50 вкладок с видео я не оставляю. Вкладки открываются и закрываются, а общая занимаемая память растет со временем. В целом да, 50-100 вкладок открыто, но раньше на это хватало 2-3 гигабайт памяти, сейчас уходит в 10 раз больше. А всё из-за героев фронтендеров, которые увешивают все тоннами джаваскрипта, мегабайтными плохо сжатыми картинками, простынями css.
но раньше на это хватало 2-3 гигабайт памяти, сейчас уходит в 10 раз больше

В целях общего развития (моего), а в каком году было это "раньше"?

Это было во времена когда еще не было официальных 64-битных сборок firefox под windows. Соответственно, до firefox 43. Он вышел в конце 2015 года, 5 лет назад.

Интересно получается. В то время уже были SPA, и Angular и React уже набрали популярность, даже редизайн Хабра уже случился. По идее, с тех пор должно становиться только лучше, потому что весь этот молодой и не окрепший стек вышел на плато продуктивности, без новых JS-фреймворков каждую неделю

С тех времен веб для десктопов лучше не стал. Есть крен в сторону мобилок. Сейчас большинство сайтов можно без проблем смотреть с телефона. Но цена этого — деградация десктопной версии, которая превращается в мобильную. А это меню-гамбургер, хотя на десктопе не проблема сделать нормальное меню, огромные отступы между элементами, очень низкая плотность информации на экране. Скорость работы сайтов не выросла, а хорошо если не упала. В 2006-м году gmail через телефонный модем работал нисколько не медленнее нынешнего gmail через 100-мегабитное соединение. Оптимизации никакой ни у кого нет. Пару лет назад я пытался купить билеты на сайте s7 из Таиланда и мне это не удалось. Там с 5-7 шагов по покупке и они не догружались. Пришлось качать мобильное приложение. Дома смотрел, идут запросы каждую секунду с телеметрией. Герои, да.
Компилятор может написать почти нуб, сама идея с деревьями виртуальных объектов проста, вопрос — какого качества будет этот компилятор.
Дело в том, что компиляторов нужно не много и требования к качеству высоки
Вебcайтов же напротив нужно очень много и требования к качеству — самые разные, отсюда — множество нубов во фронтенде и еще больше — в простой верстке и создании сайтов «из коробки».
«что, если случайные 5% моих SQL-запросов в Rails фейлятся». Начинающие фронтендеры не думают об этом, но более опытные — точно учитывают такие кейсы.

Постоянно сталкиваюсь с тем, что об этом забывают дизайнеры. Ну никак не могут усвоить и принять для себя классическую асинхронную триаду "waiting/success/failure". На картинках всегда только "success", остальных состояний нет, приходится пинать.

А ещё плейсхолдеры для пустых коллекций, да-да.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации