Ох уж этот web

в 10:02, , рубрики: QML, web, Песочница, метки: ,

Примерно год назад я всерьез задумался над недавно пошумевшими на хабре темами про ненависть к html. Действительно, html — это просто средство разметки текста, его нельзя применять для построения UI, который на 90% состоит из layout'ов. Вернее можно, но получается ад. Кроме всего прочего, случай с html — это когда данные смешиваются с представлением. Не получится скачать отдельно html, а отдельно данные. Возникает идея парсеров.

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

На мой взгляд, единственная задача html — это отображать br,strong,a, ну и так далее. Нет никакой необходимости пытаться верстать блочно, потому что блочная верстка — это попытка средставми html сделать layout. И вся эта идея иерархичности блочного контента рассыпается в пыль, когда child вылезает за пределы parent'a. Кому в голову вообще пришла такая издевательская над инкапусяцией идея, почему это вообще ВОЗМОЖНО? WYSIWYG с точки зрения кода какой-то странный получается — видишь один код, а отображаться он может как и где угодно. Зачем нужна эта двусмысленность?

И не получится сделать сложный блочный ui без костылей вида -999px и т.д. Кстати, почему до сих пор нет нативной поддержки layout'ов? Уже на языке низкого уровня быстрее описать интерфейс, чем на вебе. И заметьте: каждый дизайнер изголяется над созданием/стайлингом/размещением контролов, которые уже ДАВНО есть в ЛЮБОЙ ОС. Так зачем столько телодвижений для создания такого же, но другого? Чтобы что? Кстати, а для чего каждый сайт должен иметь уникальный дизайн? Разве это чем-то вынуждено? Почему desktop ui с одинаковыми контролами не приедается, а шибко пестрые-нестандартные интерфейсы на десктопе считаются моветоном? Ну да, можно написать еще штук 20 шаблонизаторов, позволяющих абстрагироваться от печальных реалий. А дизайнеры пускай сами своими -99999px гвоздями прибивают ui к html.

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

Если подытожить, логичный для меня веб будет таким:

  • юзер обращается на адрес %s
  • сервер отдает ему один скрипт, бинарник, или qml-код
  • код самостоятельно подгружает паблик-контент из, к примеру, redis'а, развернутого в паблик
  • клиентский скрипт самостоятельно генерирует по этим данным и ui представление, попутно занимаясь escape'ами и всем остальным
  • как только юзеру понадобится private area, обычными методами ему дается session_id/private_code
  • дальнейшее общение клиента и сервера — это mq. Ключ mq = session_id. На первых порах справится redis.

Есть несколько проектов, которые используют redis таким образом, но это не мейнстрим. Сама идея приятна тем, что данные отдаются не туда (и не тогда), откуда их попросили. Юзер сам повторно обращается за данными, которые ему нужны. И делает с ними что хочет. В таком случае пусть пишет хоть свой ui.

В итоге задача программиста будет всего лишь одной: написать бизнес-логику, генерирующую правильные данные. И все. То есть совсем все. А что с этими данными делать, как, когда, зачем и почему — дело десятое. Нет никакой необходимости править шаблоны, изменять порядок запросов и т.д. Тогда серверная часть web-app изначально будет выглядеть как набор интерфейсов для получения данных. Нам безразлично из каких данных будет состоять главная страница пользователя и его личный кабинет. Если юзер захочет — напишет свой ui.

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

Если разделить роли:

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

Итак:

  • html не является подходящим удобным инструментом для создания ui
  • генерация слепка из данных и представления накладна и не вынуждена, по горлу бритвой Оккама ей
  • модель «запрос-ответ» ломает асинхронность и слишком ко многому обязывает обе стороны
  • последствия html в виде валидации вообще всех данных омерзительны: браузер не знает заранее что получит, поэтому не может натравить правильные фильтры на данные. А чтобы он это знал, он сам их должен просить явно

Почти любой интересный сайт сегодня — это не просто страничка, а масса интерфейсов и методов обработки данных. Почему бы не отделить интерфейс от данных сразу же? Получается так, что любой сайт сегодня навязывает мне свое представление. А это мне очень не нравится. На сайт я захожу для получения информации, а не для разглядывания картинок и новых css3 заманух (я не спорю, что порой это очень красиво, но красота отвлекает и в конечном счете падает юзабельность). Меня бесит, что кнопку поиска я ищу поиском на странице. Меня бесит, что на всех сайтах одного назначения кнопки расположены в разных местах. Я хочу видеть сайты так же, как и все desktop'ные app.

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

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

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

Автор: lilo_panic

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js