[О блоге] [наверх] [пред] [2020-01-23 08:35:39+03:00] [9ecf9331987a62db1d012bef94c39406a1d6af60]
Темы: [web]

Почему же я так не люблю всё что связано с JS?

В одной переписке я написал длинный развёрнутый ответ почему всё что
касается JavaScript-а я так не люблю. Решил вот и сюда его запостить
(чуть-чуть обрезав).

>Вот, например, такой вопрос: вы где-то писали, что не любите "несвободный" JavaScript.
>А какой код на JS считать свободным?

Проще сказать что я в принципе не люблю весь JS и всё что с ним связано.
Почему?

Что такое современный Web-броузер и современный Web? Раньше это
подразумевалось и было распределённой системой документов. Почти все
документы это HTML страницы гиперссылками на дополнительные HTML,
картинки и тому прочее. Был чётко стандартизированный и заточенный под
эту задачу протокол общения клиента и сервера для получения этих
документов -- HTTP. В HTML/HTTP есть и поддержка отправки форм,
запросов. Если закрыть глаза на всякие несовместимости в
форматах/реализациях, то в преобладающем большинстве случаев вы могли
взять любой броузер и действительно путешествовать по этим связанным
между собой документам. Это реально *документы* -- их можно скачать
локально на диск и сохранить в виде файла. Можно открыть его позже.
Можно скопировать и передать кому-нибудь другому. Сами по себе все эти
HTML/JPEG/PNG форматы не требуют использования несвободного ПО, как и
HTTP протокол. То есть, я могу спокойно использовать исключительно
свободное ПО без опасений в безопасности чтобы получать данные,
отправлять данные через формы, обмениваться ими, обрабатывать, и т.д..

Современный Web это распределённая система программного обеспечения и
несовместимых протоколов. Подключаемся к модному современному сайту и он
нам не отдаёт документ который мы можем просмотреть, а он отдаёт
программу. Полноценную обычную программу. Просто не в .exe/whatever
формате, а в виде JS-кода. А дальше эта программа начинает общаться по
какому-то своему протоколу с сервером (под протоколом я подразумеваю
JSON-RPC/XML-RPC для общения с API серверов) и получать тоже какие-то
данные, как правило голые JSON/XML, которые эта программа начинается
рендерить -- преобразовывать в визуальное представление на экране. Это
абсолютно полностью равносильно тому, что заходя на сайт он бы попросил
меня установить .exe программу, я бы её запустил и она что-то там бы
начала делать исключительно для работы с этим чётко заданным
единственным сайтом.

Первое: у меня вопрос -- какого чёрта творится? Почему, если я хочу
посмотреть расписание электричек или курс валюты, то я должен скачать
отдельную для этого программу? Почему раньше это мне отдавали в виде
документа? Или в виде просто какого-то текста? Что за фигня? Раньше я по
какому-то протоколу (Gopher, HTTP, FTP, whatever) делал запрос: нужен
документ/файл/текст с курсом валют -- и мне его сервер выдаёт. А сейчас
я должен почему-то выполнять какой-то код.

Я не могу сохранить документ, не могу им обменяться, не могу прочитать
его в offline позже (так как есть только запущенная программа,
безусловно не предоставляющая возможность "экспорта" своего состояния
для загрузка с диска позже, без необходимости online подключения к
серверу). Я категорически, полностью и абсолютно не согласен с этим
бредовейшим творящимся в мире маразмом.

Я не использую проприетарное ПО у себя на компьютере, только свободное.
Почти весь JS код (отдаваемый с серверов) не является даже открытым --
это обфусцированный код, равносильный просто бинарному коду, ассемблеру.
Даже если бы я и закрывал глаза на его закрытость, несвободном,
проприетарность, то меня терзают проблемы безопасности. В последние годы
мы все слышали про особенности работы Intel/AMD/whatever процессоров
которые позволяют использовать их как уязвимость и считывать данные из
памяти другого процесса или вообще самой ОС. Уже были практически
демонстрации атак когда JS код внутри броузера (то ли Firefox, то ли
Chrome), который должен быть неким изолированным sandbox-ом, запущенный
внутри другой ОС внутри виртуальной машины, мог прочитать любые данные
из памяти самого компьютера на котором это всё запускается. А атаками
типа RowHammer (тоже из JS-а из броузера из виртуальной машины) можно
даже изменять данные основной памяти, создавая какую-хочешь брешь в
безопасности и возможности компрометации всего чего угодно. На
современном железе *невозможно* какими-либо программными средствами
изолирования обеспечить безопасность от компрометации чего угодно от
запуска недоверенного кода. Это просто факт. А любой закрытый код -- это
чёрный ящик неизвестно что там внутри себя делающий. Может быть ничего,
можешь быть безвредный для безопасности майнинг, может быть тырящий
ключи полнодискового шифрования или приватные ключи PGP. Изолировать
такую программу мы не можем (ну ok, можем, но в виртуалках которые на
самом низшем уровне делают эмуляцию (полностью программную), где
скорость выполнения настолько низкая, что на практике задумываться о
запуске Firefox/Chrome не приходится). Доверять чему-то что автор явно
закрыл -- лично я тоже не могу. Поэтому это ни при каких обстоятельствах
не может мною запускаться хотя бы из-за вопросом безопасности.

Второе: когда у нас старый добрый тёплый ламповый HTML, то вопросы его
рендеринга лежат на броузере. HTML говорит что надо сделать табличку,
надо сделать формочку, добавить кнопочку -- броузер делает. HTML говорит
что у нас есть <link rev="next"> и значит броузеру если дать команду
"перейти на следующую страницу" -- он это сделает. Огромная часть
рендеринга и управления интерфейсом сейчас на современных сайтах теперь
лежит на плечах сотен вот этих программ что мы скачиваем. По сути,
вместо одной программы нам привычной, НАМИ выбранной, НАМ удобной -- мы
имеем по отдельной программе для каждого сайта. По отдельному UI для
каждого сайта. Я, когда ещё разрешал исполнение JS, то в Firefox
использовал Vimperator плагин -- там можно было нажать "f", дальше
циферками (или буковками -- уже не помню как там точно было) подсветится
каждая ссылка, я нажимаю букву/цифру и быстро перехожу по этой ссылке,
без какой-либо мышки и прочего. На тьме современных сайтов всякие
нажатия перехватываются и уже не работают. На тьме сайтов есть не только
броузерная штатная полоса прокрутки, но и внутренняя какая-то и, крутя
скроллер, я скроллю далеко не то что мне надо.

То есть всё стало жутко неудобно. Всё стало непривычно. Каждый
(современный) сайт это как каждый раз новая незнакомая по интерфейсу
программа. Которая никогда в жизни не будет удобной как
Firefox+Vimperator связки. А если и будет, то значит кому-то было нечем
заняться и он переписал Vimperator для своего сайтика.

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

Третье: я постоянно замечаю что если у тебя не стоит броузер свежее чем
год назад, то многие сайты не будут работать. Через год, если ты не
обновил, ещё больше не будет работать. И работают не просто сайты, а
framework-и типа React и чего-то подобного. У меня на работе есть
отдельно выделенный компьютер для запуска недоверенного кода и там, на
тот момент, стоял самый свежий Firefox. Через 1-2 года то, что пишут
наши разработчики или какой-нибудь Mattermost -- просто не работает, ибо
возможностей 1-2 летнего Firefox недостаточно. Я вынужден постоянно
обновляться. А как мне это делать, если тот же Firefox из года в год
только деградирует в полнейшее унылое говно (с точки зрения приватности,
безопасности, useability, и т.д.)? Не обновлюсь -- не будет многое
работать. Обновлюсь -- весь мой experience деградирует, ибо ВСЕ
популярные броузеры со временем с точки зрения приватности становятся
только хуже (всё больше способов усилить слежку, сбор данных, ограничить
возможность использования блокировщиков рекламы (я что хочу, то и делаю
с трафиком мне поступающим, какого чёрта они мне диктуют и ограничивают
свободу фильтрации трафика/скриптов (ответ то, конечно, известен)?)).
Это тоже абсолютно неприемлемо, с моей точки зрения. Себя не уважать
играть по таким правилам какие нам диктуют 2-3 корпорации в мире.

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

Хочешь делиться информацией -- делись, но не заставляй меня использовать
твоё ПО, если нет супер-пупер хорошей причины для этого. Дай мне скачать
данные в виде SQL/XML/whatever и объясни их структуру/устройство -- уже
лучше, значительно лучше, поверю что твоя программа это действительно
для моего удобства просто как предложение, а не обязательство. Я
прекрасно понимаю что ценность огромного количества сайтов это как-раз в
их нигде не имеющемся контенте и свою БД знаний они отдавать не будут.
Если бы это был просто HTTP+HTML, то робот мог бы crawl-ить сайт и
рано или поздно скопировать в итоге все данные. Многие ставят всякие
системы защиты от этого (частые запросы выполняются медленно,
ограничивается кол-во запросов в минуту/день/и т.д.). Это вполне может
работать против роботов, не мешая человекам. А кто-то вот решает просто
сделать несовместимый протокол/формат и запилить свою программу для
работы с ним -- делая это в виде JS. Благой цели тут нет, не
обманываемся.

Почему всё это творят Facebook, Google, Instagram и прочее на своих
ресурсах? Ну тут всё понятно: их ВЕСЬ бизнес это сбор информации о нас,
её продажа и показ нам тон рекламы. С обычным HTTP+HTML проблематично
собирать информацию и показывать рекламу. С собственным ПО --
единственный выход. Но только я не считаю их желание сбора нашей
приватной информации и впендюривание рекламы благой целью, поэтому мне
не нужны их "благие" программы.

Почему это делают для сайтиков которые даже просто расписание электричек
показывают или карту метро? Я понимаю что могу тебя задеть, как и
миллионов других людей, но я в основном склоняюсь к тому, что по доброй
воле (а не по приказам менеджеров работодателя) только от незнания и
неумения делать это в классическом HTTP+HTML. Я УЙМУ раз слышал что
используя все эти überframework-и типа React сайтик можно писать быстро
и легко -- то есть тупо разработчик такого JS single page application
выполнит задачу настолько быстрее, что это тупо будет существенно
дешевле чем "старый добрый" подход. На практике я этого в своей жизни ни
разу не увидел. Видел что человек полностью переписывал своё JS
приложение с нуля, потому что это было проще из-за устаревания его
100500 зависимостей и framework-ов. При этом это приложение никто другой
не мог писать (огромный порог вхождения), а всякие базовые функции из
коробки работающие в обычном броузере типа "кнопочки вернуться назад",
"обновить страницу" -- были неработающими. И только такие истории о JS
single page application-ах я и видел: чаще всего их регулярно
переписывают/дописывают ибо когда ты начнёшь разработку, то к её концу
все твои зависимости/framework-и уже устареют и сильно убежавшие вперёд
свежие обратно-несовместимы. Это какой-то полный хаос и ад программиста.
Верю что хороший JS разраб есть, который будет писать быстрее, лучше,
эффективнее, без постоянной поддержки и переписывания -- но и его
стоимость, очевидно, будет сильно высока и если он уйдёт, то надо искать
такого же высококвалифицированного спеца снова. А специалистов у нас
реально очень мало -- сам офигеваю как мало нормальных разработчиков в
принципе есть даже в Москве, за которыми, можно сказать, IT-компании
охотятся. То есть с JS-миром можно жить, но невероятно дорого. А отсюда
вопрос -- а зачем тогда, если ты не ВК, FB, whatever у которых без
засовывания приложения на компьютер пользователя просто нельзя?

Согласен что чистого HTML с его формами далеко не всегда может быть
достаточно для хотя бы удобной визуализации данных. Но в 99% случаев
достаточно (я имею в виду почти все сервисы типа банков, Госуслуг
гипотетических, и т.д.). В оставшемся 1% придётся писать
специализированную программу, не спорю. Делать в виде JS кода
отдаваемого сервером -- смотрим мои нарекания к этому выше. Делать в
виде просто отдельного приложения типа Python программы, .exe файла --
уже лучше хотя бы тем, что ОДИН раз скачав, ОДИН раз доверившись, мне
не надо её каждый раз будет обновлять при каждом заходе. И эту программу
мы скачиваем например из репозитория.

Гипотетически если бы броузер был устроен как пакетный менеджер ОС, то у
меня многие нарекания бы исчезли. Чисто теоретически ведь действительно
нет разницы скачаю я .py программу из репозитория или .js программу --
тут просто два разных языка. Но установка пакета из него это чёткое
осознанное действие со стороны пользователя, одобренное им. Использующее
(как правило) уже доверенные ключи подписи какого-нибудь Debian. Если я
доверяю тому что мне установилось, то я спокоен каждый раз используя эту
программу общающуюся с сервером. В броузере сейчас я чисто гипотетически
могу посмотреть JS-код, увидеть например что там один JS файл, никаких
подкачиваний внешнего JS, никакой обфускации, вообще под AGPLv3
лицензией -- всё бы прекрасно, без нареканий, но обновив страницу мне
уже могут подсунуть другой код, отличный. Если бы броузер явно как-то
следил за изменениями кода, спрашивал пользователя что делать с этой
новой программой, возможно давал бы ему diff этих программ, то возможно
это хоть как-то можно было бы рассматривать например мною, но ничего
похоже даже в принципе нигде нет. Броузеры разрабатывают программисты в
корпорациях занимающихся слежкой -- там такое нафиг встраивать, это вред
их бизнесу.

Вот поэтому вся экосистема и мир JS для меня... мягко говоря, не
рассматриваются в принципе.

Ещё одно могу добавить, но это уже совершенно субъективное: более
ужасного языка чем JS я не встречал (из на практике используемых). Я
слышал про его историю, объясняющую что вообще изначально он был написан
на коленке одним человеком за неделю для каких-то тривиальных вещей, без
задней мысли о том чтобы писать полноценные приложения на этом. А потом
добавили костыль тут, там, и пошло поехало. Я СОВЕРШЕННО не понимаю его
идеологии, подходов и тому прочего. Но это субъективно всё. Например я
обожаю и считаю лучшим языком Go -- а есть люди его не переваривающие. Я
вот не перевариваю Rust, просто потому что каждая мелочь в нём, даже
оформление документации и синтаксис языка меня раздражают (ну может же
просто какой-нибудь салатовый цвет раздражать без явной на то
объективной причины?), хотя объективно, если Rust можно собрать из
исходников (это жирно подчёркиваю), то так то без нареканий. И я
наслышан что современный JS стандарт сильно переработан и уже совершенно
не выглядит как костыль костылём погоняет. Верю, но нет.

Кстати, по идее, один раз скачанный JS на жёсткий диск и запускаемый на
localhost адресе (без запросов на скачивание дополнительных JS-ов из
Интернета) в принципе может мной считать безопасным вариантом, если
конечно это свободное ПО без всякого встроенного зловреда. Но... снова
вспоминаем про проблему обновления броузера и тому прочего. Да и на
практике так почти никто не делает JS приложения чтобы их не надо было
скачивать с сервера в online.

>Как их убедить, особенно тех, кто  боится запускать JS еще со времён
>дырявого IE5, что я не вирусописатель и мою фигнюшку можно взять и
>запустить в браузере, не боясь, что она проест дыру в их компутере или
>сожрет пять мегабайт трафика на рекламу?

Никак. Причин чтобы писать JS приложение я не вижу. Единственный вариант
который я бы мог рассмотреть это JS который явно скачивается на диск,
который я запускаю с localhost-а, который не обфусцирован само собой и
не имеет запросов на JS код с Интернета. Но также я знаю что с большой
долей вероятности не будет работать, ибо в моём Xombrero очень старый
webkit движок, а более удобного броузера я не находил. Firefox стал
полным вообще прям пипец говном. Chromium -- по сути всегда им был (с
точки зрения приватности, безопасности и прочего). А другого ничего нет.
Я бы возможно всё же бы и поставил Firefox с Pentadactyl+NoScript
плагинами (когда-то в такой связке использовал), но API Firefox-а,
насколько слышал, так часто меняется, что Pentadactyl уже давно не
работает и разработчики не хотят постоянно тратить своё время на
переписывание под постоянно меняющийся API.

Я связывался с автором Xombrero и спрашивал как он то живёт, как он
использует Web, раз Xombrero официально заброшен? А никак. Он ответил
что всё да, невероятно печально и если хочется современного Web, из года
в год в каждом месте API и JS-а меняющегося, то вариантов кроме как
прогнуться под корпорации у тебя нет и терпеть их адовый софт. Я для
себя решил что мне нафиг не сдался современный Web ибо платить такую
цену, как юзание несвободного ПО или убожества какими были/стали
Firefox/Chromium, не хочу. Тягаться с теми у кого триллионы долларов --
вряд ли можно. Можно или играть по их правилам или нет.

Как меня убедить что у тебя действительно не зловредный код, что JS это
действительно объективно хороший выбор? Учитывая что 99.999% программ на
JS-е являются прямо противоположным, то я даже не буду задумываться и
тратить своё время на раздумья о такой программе :-)

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

Да, я слышал о таком. Но вижу это так: люди решают проблемы, которые
сами себе же добавили. Я же тоже когда-то JS трогал и меня даже на одной
конференции запомнили как чувака который кодил на JS в ivi.ru -- от чего
я был шокирован, ибо на JS я там написал экрана два кода для вот такой
задачи: https://habr.com/ru/company/ivi/blog/249359/
И я помню что безусловно для разработчика гораздо удобнее добавить прям
вообще весь framework, чем как-то пытаться сделать так, чтобы на
странице был только актуальный и нужный для неё JS-код. Это дорого с
точки зрения разработчика, понимаю. Но вообще, учитывая сколько занимают
JS современный сайтов (2MiB+!!!), то, что 2, что 4-8 мегабайт -- роли не
сыграет, ибо всё-равно через 1-2 года даже обфусцированные будут
занимать эти 8 мегабайт.

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

    [оставить комментарий]
    комментарий 0:
    From: kmeaw
    Date: 2022-01-18 11:45:22Z
    
    А будет ли современный веб пригоден для использования, если исправить
    следующие вещи?
    
    > Это реально *документы* -- их можно скачать
    > локально на диск и сохранить в виде файла.
    
    Можно написать такой браузер, который при нажатии на кнопку "сохранить"
    будет записывать на диск не тот HTML, который он скачал с сервера, а
    сериализовывать текущий DOM. То есть записать на диск документ, который
    получился в результате работы JS-кода над теми данными, которые он
    получил из API.
    
    > Почему, если я хочу посмотреть расписание электричек или курс валюты,
    > то я должен скачать отдельную для этого программу?
    
    А если заставить всех разработчиков веб-приложений понимать какой-нибудь
    заголовок типа "Render-On: server", указывающий веб-серверу, что эту
    отдельную программу надо выполнить на сервере, а не на клиенте, и
    прислать клиенту вместо программы результат её работы, как было со
    старым добрым CGI?
    
    комментарий 1:
    From: Sergey Matveev
    Date: 2022-01-18 11:50:03Z
    
    *** kmeaw [2022-01-18 14:44]:
    >А будет ли современный веб пригоден для использования, если исправить
    >следующие вещи?
    
    Мне кажется будет. Пока вроде придраться ни к чему не могу. Мой
    компьютер не будет пытаться компрометироваться исполняемым загружаемым
    кодом, а я получаю готовый документ для просмотра.