Психология ИИ должна проверять теории сознания в ИИ и информировать дизайн взаимодействия людей и ИИ

Данный пост — продолжение поста пользователя Buck «The case for becoming a black-box investigator of language models«. Я хочу выделить еще две причины для изучения поведенческой психологии ИИ, о которых Buck не упомянул:

  • данные по психологии ИИ будут нужны для проверки теорий сознания в ИИ; и

  • психология ИИ должна информировать дизайн интерфейсов взаимодействия человека и ИИ, их ограничений, а также правил и принципов поведения людей и ИИ в средах из взаимодействия.

Midjourney: "AI psychology should ground the theories of AI consciousness and inform human-AI ethical interaction design"
Midjourney: «AI psychology should ground the theories of AI consciousness and inform human-AI ethical interaction design»

Сознание в ИИ

Нейробиологи, не имеющие психологического образования, могут обсуждать человеческое сознание, потому что они сами обладают сознанием. Все люди (в том числе и исследователи сознания) хотя бы отчасти являются психологами, потому что им приходится иметь дело с собственной психикой и окружающими людьми на протяжении всей их повседневной жизни, а значит, у них должна быть «своя» психологическая теория, объясняющая и помогающая им предсказывать собственное поведение и поведение окружающих людей.

Поэтому роль психологии в изучении сознания неочевидна. Однако это методологическая ошибка. Например, зоопсихология (или, в более общем смысле, этология) является важнейшим источником данных для рассуждений о сознании у животных.

Аналогично, теории сознания в ИИ должны основываться на большом количестве данных о психологии ИИ. Психология ИИ должна стать новой областью эмпирической науки со своими собственными методами работы. Методы изучения психологии ИИ должны отличаться от методов изучения психологии человека из-за отсутствия «first person» точки зрения, которая есть у каждого психолога-человека, а также из-за того, что фенотип и экологическая ниша ИИ-систем очень сильно отличаются от человеческого фенотипа. Разные фенотипы/экологические ниши предъявляют другие требования к психике агентов. Аналогично, методы изучения психологии ИИ должны отличаться от методов изучения зоопсихологии, потому что мы можем использовать язык как для воздействия на ИИ (промптинг, вопросы, диалог), так и для получения ответов от них, тогда как животные почти никогда (исключение — попугаи) не могут ответить зоопсихологам «на языке», а многие животные не могут понимать и языковые команды.

Дизайн взаимодействия людей и ИИ

Safron, Sheikhbahaee et al. (2022) и Friston et al. (2022) уже указывали на необходимость явного проектирования экосистем для взаимодействия естественных и искусственных интеллектов. Очевидно, что эти взаимодействия должны иметь некоторые ограничения, начиная от «мягких» кодексов поведения и заканчивая жесткими ограничениями в интерфейсах.

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

Не слишком ли рано заниматься психологией ИИ? Ведь текущие системы всего лишь «повторяют увиденное в интернете»

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

  1. Собирать данные о поведении ИИ.

  2. Выдвигать «психологические» теории, которые компактно описывают (некоторые аспекты) поведения ИИ и одновременно дают более конкретные и более точные предсказания поведения ИИ, чем «ИИ просто предсказывает следующий наиболее вероятный токен в тексте». Следуя этой логике, мы можем сказать, что «ИИ просто действует, как ей предписывает уравнение Гейзенберга и унитарная эволюция вселенной».

  3. Перекрестно проверять теории механистической интерпретируемости (mechanistic interpretability; а-ля «нейробиология ИИ») и психологии ИИ друг с другом, точно так же, как нейробиология человека и психология человека теперь используются для информирования и перекрестной проверки друг друга.

  4. Основывать теории сознания в ИИ на данных как механистической интерпретируемости, так и психологии ИИ, точно так же, как теории cознания у животных и человека основаны на данных как нейронауки, так и психологии человека и животных.

Когда поведение систем становится сложным и не может быть объяснено низкоуровневыми теориями одновременно 1) компактно и 2) с достаточной точностью и предсказательной силой, использование только теорий более низкого уровня становится редукционизмом. Таким образом, попытки объяснить поведение человека только через нейронауку, или только через физиологию являются редукционизмом. Психология человека — это валидная научная область. Хотя в ней очень много плохих теорий, плохих методов исследований, и неподтверждающихся результатов, есть и достаточно очевидно валидные результаты и валидные теории верхнего уровня.

Неизвестно, преодолел ли уже ИИ этот уровень сложности. Я уверен, что да. Я думаю, что поведение ChatGPT уже во многих отношениях сложнее, чем поведение большинства животных, в то время как зоопсихология уже является настоящей, нередукционистской областью науки. Так или иначе, первый и второй шаги в списке выше должны быть предприняты в любом случае, как раз чтобы установить, является ли поведение ИИ достаточно сложным. И, по крайней мере, второй шаг уже требует некоторых навыков, опыта, и предрасположенности ученого-психолога, а не случайного ИИ-инженера или технократа из Силиконовой Долины.

Кроме того, надо учитывать, что даже если ChatGPT прямо сейчас еще не совсем на этом уровне, будущие версии ИИ, которые будут выпущены в этом году (или, максимум, в следующем), определенно преодолеют эту планку.

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

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

Призыв к действию

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

Я знаю, что тема немного не в российском дискурсе сейчас, где людям надо буквально выживать и искать что намазывать на хлеб завтра. Запрос не психологическую помощь в русскоязычном пространстве сейчас тоже очень велик, все психологи очень заняты. Тем не менее, я считаю, что потенциал темы огромен, и поэтому все равно важно, чтобы хоть кто-нибудь ею занимался. Мне кажется, сейчас в мире психологией ИИ как наукой (и методологией этой науки) не занимается абсолютно никто. Эта просто-сфера науки на данный момент совершенна пуста, и почти каждый может оказать огромное влияние на ее развитие.


ссылка на оригинал статьи https://habr.com/ru/post/709472/

Плохие уроки дебатов

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

Будучи студентом, я играл в классические дебаты по формату Карла Поппера с элементами политического кейса. Это такой КВН для любителей поспорить. В том смысле, что это игра, она для студентов, и такая деятельность оптимизирует какие-то навыки. А вот какие именно, это интересно понять. Давайте разберёмся, какое влияние оказывает на ваше мышление умение хорошо спорить.

Начало

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

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

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

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

Постмодерн

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

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

Я ощутил себя гораздо мудрее, ведь теперь я уже не делил всё на чёрное и белое. Мир больше не односторонний, он стал сложным и многогранным. Одновременно я ощутил, что знаю что-то важное, о чём не известно другим. Они то думают, что можно быть правым, а не казаться таковым. Ничего, они подрастут и поймут, что никто не может быть правым, всё относительно.

Вредные советы

Далее немного о мышлении в стиле дебатёра. Я опишу ряд моментов над которыми необходимо работать, если вы любой ценой убеждаете кого-либо в публичных дебатах (публичными буду считать любые, где есть хотя бы один зритель вашего спора). Очень надеюсь, что, дочитав статью, вы не станете использовать данные вредные советы.

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

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

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

• Высший пилотаж, доказать почему аргумент оппонента на самом деле доказывает вашу позицию? 

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

• Кстати, ещё одна похожая тактика (которая правда запрещена в формальных дебатах) это перегружать речь специальной терминологией. Аудитория не знакомая с терминами считает это как глубокое понимание темы, а оппонент перегрузит свой процессор, пытаясь понять элементарные по смыслу фразы.

• Вы должны хорошо знать распространённые логические ошибки и когнитивные искажения. Это позволит вам находить уязвимости в рассуждениях оппонента. 

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

• Если вы в отрицании (то есть опровергаете позицию оппонента, а не выдвигаете свою), то смело предлагаете третью альтернативу. Скорее всего, спикер готов воевать только против прямо противоположной позиции, а предложение чего-то иного выбьет из под его ног почву. 

• Если дебатируете в команде, то есть важное правило: вы никогда не должны противоречить спикерам своей команды. Всегда поддерживайте любую чепуху, которую озвучит ваш партнёр. Потом разберётесь, главное в публичном поле показать монолитность вашей позиции. В формальных дебатах даже есть штраф за противоречие спикеру своей команды.

Что-то не так?

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

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

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

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

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

Такой подход к своим убеждениям как будто подразумевает бесконечную подготовку к дебатам. Но только в этих дебатах ты можешь заранее выбрать позицию по любому вопросу. И ты стремишься всегда выбрать наиболее простую в отстаивании позицию (за которую больше всего реальных аргументов). И что ещё более странно в правилах этих дебатов — в любой момент ты можешь сменить позицию. Цель игры — по итогам дебатов быть на стороне победителей. Главное — победа.

К сожалению, мышление дебатёра или уличного бойца* построено на прямо противоположных принципах. Чем более контринтуитивный принцип тебе удастся доказать, тем выше твой класс. А менять мнение или команду — что может быть хуже?

На страже света

Как будто остаётся вопрос. Нужно ли применять навыки дебатирования, будучи войном света несущим правду? Учитывая тот факт, что так будут делать все, и все будут уверены в том, что они войны света несущие правду? 

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

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

 

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


ссылка на оригинал статьи https://habr.com/ru/post/709474/

Мечты о «Париже прерий»

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

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

Планы переустройства Чикаго второй половины 19 века

На протяжении 19 века Чикаго стал промышленным гигантом и главным перевалочным пунктом торговли Среднего Запада. Соответственно, росло и население: в 1850 году оно насчитывало только 30000 человек, в 1870 — уже 300000, а в 1890 — более миллиона человек. При этом условия жизни в городе постоянно ухудшались из-за притока населения. Немощённые улицы, хаотичная застройка, портовая грязь — всё это приметы города того времени.

Толчком к переустройству города стал пожар 1871 года, когда в октябре выгорела треть всех домов. Такому ураганному распространению огня способствовали черты Чикаго: плотная деревянная застройка, деревянные тротуары, портовые угольные склады и корабли в гавани. Раскалённый воздух 3 дня поддерживал огонь, раснося его сильным ветром на крыши соседних кварталов. После этого осталась лишь пустошь с обломками домов. Горе десятков тысяч жителей и негаданное счастье, упавшее на девелоперов.
Пожар не только не остановил взрывной рост населения, но даже способствовал притоку новых рабочих рук на восстановление заводов, портовых сооружений и строительство домов для новых граждан. Масштабная застройка, однако, всё также учитывала лишь базовые потребности горожан, не задумываясь о социальной и культурной жизни. Улицы оставались узкими, парков и садов не прибавилось, и город всё более напоминал Готэм.

Великий пожар в Чикаго, 1871 год
Великий пожар в Чикаго, 1871 год

Звездой надежды в этом мраке стала Всемирная выставка 1893 года, которая проходила в Чикаго. Для её проведения на территории в 6000 акров был построен городок из павильонов в стиле неоклассики в окружении парков, фонтанов и каналов. Архитекторами выступили Фредерик Ло Олмстед и наш сегодняшний герой — Дэниэл Бёрнэм. Выставка стала коммерчески успешной, сумев привлечь в Чикаго 27 миллионов человек и заинтересовать местных предпринимателей. Особенно поразил посетителей и горожан выставочный городок, находившийся в таком контрасте с реальным Чикаго. Стало понятно, что надо как-то изменить внешний вид американских городов, не отличавшихся в то время особым лоском.

Авторы архитектурных проектов
Дэниэл Бёрнэм. (1846-1912 гг.) — американский архитектор небоскрёбов и автор нескольких крупных генпланов городов США: Сан-Франциско, Вашингтона, Манилы, Кливленда и др.
Дэниэл Бёрнэм. (1846-1912 гг.) — американский архитектор небоскрёбов и автор нескольких крупных генпланов городов США: Сан-Франциско, Вашингтона, Манилы, Кливленда и др.
Фредерик Ло Олмстед (1822-1903 гг.) — американский архитектор и специалист по ландшафтному дизайну. Творец Центрального парка в Нью-Йорке, национального парка Йосемити и Ниагара-фоллс, парков Буффало и Бостона.
Фредерик Ло Олмстед (1822-1903 гг.) — американский архитектор и специалист по ландшафтному дизайну. Творец Центрального парка в Нью-Йорке, национального парка Йосемити и Ниагара-фоллс, парков Буффало и Бостона.

Так родилось общественное движение «За красивый город», которое уверовало в возможность решения проблем общества урбанистикой и начало невиданное доселе лоббирование программ реновации в крупных городах США (Сергей Семёнович уже кусает локти). Стартовой площадкой стала столица, где центральную часть города в 1900-х годах замостили плиточкой, создали каскад парков от Капитолия до реки Потомак, убрали железнодорожные пути из центра. После этого волна реновации под вой и улюлюканье продвинутой общественности перекинулась в провинцию, где каждая столица штата или крупный город желали похвастаться хотя бы парочкой псевдоклассических кварталов. Вскоре эта волна достигла и Чикаго.

Павильоны всемирной выставки в Чикаго
Павильоны всемирной выставки в Чикаго

В 1906 году местный союз предпринимателей обратился к Бёрнэму с просьбой создать новый генплан Чикаго, чтобы Варламов сказал малаца. Неудивительно, что они обратились именно к нашему герою, ведь Бёрнэм обладал уже солидным портфолио осуществлённых проектов: как отдельных зданий (дом-утюг на Манхэттене, Монаднок-билдинг, Релайанс-билдинг), так и глобальных городских планов (генпланы центра Вашингтона, Сан-Франциско, Кливленда, Манилы и Багио — городка для элиты на Филиппинах). В каждом из этих планов маститый архитектор много внимания уделял зелёным пространствам, сетке бульваров и площадям для социальных активностей. Так что жителям Чикаго стоило ожидать шедевра.

Примеры работ Бёрнэма и его бюро
Флэтайрон-билдинг (1901 г.), он же дом-утюг на Манхэттене.
Флэтайрон-билдинг (1901 г.), он же дом-утюг на Манхэттене.
Монаднок-билдинг, один из первых небоскрёбов Чикаго, 1891-93 гг.
Монаднок-билдинг, один из первых небоскрёбов Чикаго, 1891-93 гг.
Релайанс-билдинг, Чикаго, 1890-е годы
Релайанс-билдинг, Чикаго, 1890-е годы

После трёх лет кропотливой работы Дэниэл Бёрнэм представил миру свой наполеоновский план перестройки Чикаго.

Он включал в себя 6 пунктов:

  1. Обустройство набережных озера Мичиган.
    Очищение набережных от портовых строений и создание общедоступных парков. Набережные предполагалось расширить насыпными островами вдоль берега, где тоже будут зелёные пространства. Грузовые портовые сооружения переносятся за город, к озеру Калумет, пассажирское же сообщение осуществляется через гавань в центре города без вреда для горожан.

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

    План сети автострад в пригородах Чикаго
    План сети автострад в пригородах Чикаго
  3. Перепланирование жлезнодорожной сети.
    Планировалось разгрузить железнодорожную систему Чикаго, объединив между собой разномастные ветки (а их было 22 штуки). Из центра города пути переносятся на окраину, где будет построена сортировочная станция и терминал для грузовых кораблей. В центре города оставался бы лишь пассажирский трафик, пущенный либо под землёй либо виадуками над улицами. Пунктом назначения же для пассажирских поездов становился новый вокзал на Клинтон стрит в центре города. От вокзала бы уходили и линии метро и трамвая в разных направлениях.
    Самой же умопомрачительной частью плана, этакой вундервалей Бёрнэма, была система туннелей под центром города для доставки грузов с товарной станции напрямую на производства и в магазины. Товары бы принимали на небольших подземных станциях и поднимали наверх лифтами. Планировалось создание 4-х подземных кольцевых туннелей разного диаметра, охватывающих разные районы города.

    План железных дорог в центре города. Система пассажирских станций — штриховкой, метро между ними — кольцевой красный пунктир, других туннелей — красный пунктир, туннелей доставки грузов — синий пунктир, надземных линий — жёлтая черта. Большинство путей закопано под землю, наверху только вокзалы и часть надземных линий.
    План железных дорог в центре города. Система пассажирских станций — штриховкой, метро между ними — кольцевой красный пунктир, других туннелей — красный пунктир, туннелей доставки грузов — синий пунктир, надземных линий — жёлтая черта. Большинство путей закопано под землю, наверху только вокзалы и часть надземных линий.
  4. Перепланировка сетки улиц.
    Чикаго получает обновлённую радиальную сетку улиц, сохраняя кварталы, построенные по прямолинейной сетке. По плану предполагается несколько категорий дорог: собственно улицы, бульвары и авеню. Улицы имеют прямоугольную сетку, бульвары образуют кольцевые дороги от парка к парку, авеню диагоналями разрезают городскую застройку, сходясь на главной площади.

    Предлагаемая сетка улиц в центре Чикаго. Хорошо видны диагонали-авеню, расходящиеся лучами из центральной площади, и бульвары между парками, полукольцом окружающие центр.
    Предлагаемая сетка улиц в центре Чикаго. Хорошо видны диагонали-авеню, расходящиеся лучами из центральной площади, и бульвары между парками, полукольцом окружающие центр.
  5. Система парков и скверов.
    Помимо зелёных набережных озера Мичиган в городе появляется система парков, лесопарков и скверов, соединённых бульварами. Предполагалось облагородить сохранившиеся участки леса вокруг города с превращением их в 5 гармонично расположенных лесопарков: Калумет, Маунт Форест, Эльмхёрст, Дес-Пленс ривер и Скуки-вэлли. Образцами для подражания выступили Париж, Берлин и Вена, окружённые поясом лесопарков. Такой же пояс должен был появиться и у Чикаго, обеспечивая чистоту воздуха и отдых горожанам.
    Городские же парки должны были располагаться почти симметрично на местах пересечения главной оси — Конгресс-стрит, диагоналей и большого кольцевого бульвара. Таким образом в каждом районе города находилось бы по парку (всего их 4). Кроме этого, ближе к центру города были бы расположены небольшие скверы.

    Сеть парков и скверов: зелёные территории на окраинах — лесопарки слева направо: Калумет, Маунт Форест, Эльмхёрст, Дес-Пленс ривер и Скуки-вэлли, ближе к центру — небольшие парки и скверы.
    Сеть парков и скверов: зелёные территории на окраинах — лесопарки слева направо: Калумет, Маунт Форест, Эльмхёрст, Дес-Пленс ривер и Скуки-вэлли, ближе к центру — небольшие парки и скверы.
  6. Центр города, как место притяжения жителей.
    Центральной осью города является Конгресс-стрит, протянувшаяся от Халстед стрит и до берега озера Мичиган. Улица вытекает из главной площади, на которой предполагается построить монументальное здание мэрии города. Окружать его должны здания администрации Кук каунти и штата Иллинойс. Всё это составляет единый ансамбль, так называемого «гражданского центра», как средоточия власти. Площадь же является аналогом площади Звезды в Париже (та, что с Триумфальной аркой), из которой лучами расходятся улицы. В конце же Конгресс-стрит, на берегу озера будет выстроен Филдовский музей естественной истории, как центр культуры и образования.

    Главная улица города — Конгресс-стрит и главная площадь со зданиями Гражданского центра.
    Главная улица города — Конгресс-стрит и главная площадь со зданиями Гражданского центра.

Самой интересной чертой плана является его заточенность на развитие общественного транспорта, а не личного автомобиля, что нехарактерно для Америки следующих десятилетий. Бёрнэм мыслил личный автотранспорт, как развлечение выходного дня, но не средство передвижения. Под такое требование и предполагалось расширение улиц, строительство диагоналей и кольцевых дорог. Основным же видом транспорта оставался общественный: трамваи, пригородные поезда, метро. Именно эта черта роднила будущий Чикаго с европейскими городами и задавала бы ему такой путь развития.

Что удалось и не удалось

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

Эдвард Беннет (1874-1954 гг.) — американский архитектор и градостроитель родом из Ангии, соавтор плана Чикаго и творец административного квартала («Федерального треугольника») в Вашингтоне, Букингемского фонтана в Чикаго и парка гражданского центра в Денвере.
Эдвард Беннет (1874-1954 гг.) — американский архитектор и градостроитель родом из Ангии, соавтор плана Чикаго и творец административного квартала («Федерального треугольника») в Вашингтоне, Букингемского фонтана в Чикаго и парка гражданского центра в Денвере.

И всё же многое удалось реализовать. Набережные были очищены от портовых сооружений и открыты горожанам. Вместо доков появился (и существует до наших дней) каскад парков, главным из которых является Грант-парк. Расположен он на месте предполагаемого туристического причала, напротив Конгресс-стрит.
Построен Филдовский музей, правда несколько южнее, чем это задумывалось, в Бёрнэм-парке. Здесь же отсыпан остров с пирсом.

Железные дороги были выведены из центра или закопаны под землю. Главным вокзалом Чикаго является задуманный и спроектированный Бёрнэмом Юнион Стейшн. Строительство его началось в 1913 году, прерывалось войной и забастовками и было закончено лишь к 1925 году. Железнодорожные компании стали пользоваться единой сетью железных дорог, как и предполагалось. Чудесные же подземные туннели и лифты остались мечтой.

Осуществлённый элементы плана: Грант парк и залив для яхточек.
Осуществлённый элементы плана: Грант парк и залив для яхточек.
Филдовский музей собственной персоной
Филдовский музей собственной персоной
Юнион-стейшн, он же вокзал Юнион
Юнион-стейшн, он же вокзал Юнион

Были построены шоссе в сельской местности, устроены лесопарки, расширены улицы в центре города. Но всё это были лишь единичные элементы стройной системы, не приносящие должного эффекта по отдельности. Проблемой проекта стала его медленная реализация, растянувшаяся на десятки лет. За эти годы случилось непоправимое, бывшее смертельной угрозой изначальному замыслу. На волне неуклонного повышения благосостояния начался бурный процесс автомобилизации, изменивший массовое сознание американцев. Теперь личный автомобиль, а не автобус или трамвай, стал объектом взглядов и желаний людей. Он больше не роскошь, а средство передвижения, как говорил Остап Бендер. Именно этот процесс, а не Чёрный четверг 1929 года похоронит идеи проекта, устаревшего в «ревущие двадцатые». Великая депрессия не была бесконечной, деньги появились вновь. Однако, мировоззрение горожан и их потребности стали совершенно иными. Поэтому на месте предполагаемого «Гражданского центра» на Конгресс стрит сегодня возвышается бетонная громада эстакады Джейн Бёрн…

Эстакада Джейн Бёрн, занимающая ныне место Гражданского центра. Памятник эпохе владычества автомобилей.
Эстакада Джейн Бёрн, занимающая ныне место Гражданского центра. Памятник эпохе владычества автомобилей.

Мечты об идеальном городе остались мечтами. Чикаго вырос совсем не таким, как его мыслили Бёрнем и Беннет. Нью-Йорк, Лос-Анжелес, Даллас и другие мегаполисы США также мало соответствуют идеям великих архитекторов. Главное место в них принадлежит не человеку, а автомобилю. И это проблема не только американских городов, но и наших. Российские города, пусть и с опозданием, всё ещё стремятся нагнать вчерашний день, сооружая московские хорды и строя питерские скоростные диаметры. С этой точки зрения, нам и сейчас есть чему поучиться у авторов генплана Чикаго, взяв на вооружение лучшие из их идей: приоритет общественного транспорта, большие зелёные пространства, культурные центры, как точки притяжения людей. Так мы сделаем городскую среду более дружелюбной. И нам не придётся более ужасаться вероятному виду из окна.

Автор: Михаил Колодеев

Оригинал


ссылка на оригинал статьи https://habr.com/ru/post/709476/

Пять шаблонов загрузки данных для повышения быстродействия сайтов


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

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

Современные фронтенд-приложения становятся все больше и больше. Не удивительно, что индустрия серьёзно озадачилась вопросом оптимизации. При использовании фреймворков мы получаем неадекватные размеры приложения, которые могут пойти ему не на пользу, а во вред. Любой необязательный фрагмент JavaScript, который вы собираете и отправляете в продакшен, в итоге только увеличит количество кода, который клиенту нужно загрузить и обработать. Здесь дежурное правило гласит — чем меньше, тем лучше.

Шаблоны загрузки данных являются важнейшей частью вашего приложения, поскольку определяют, какие его части являются непосредственно доступными для использования посетителями. Не создавайте сайт, который будет тормозить у клиентов из-за необходимости скачать изображение размером 5МБ на главной странице. Старайтесь лучше понять принципы. Вам нужно хорошо разобраться в водопаде загрузки ресурсов.

Перебор со спиннерами загрузки и водопад данных

Водопад загрузки данных – это каскад файлов, скачиваемых с сетевого сервера клиентом для загрузки вашего сайта от начала и до конца. Он, по сути, описывает жизненный цикл каждого файла, который вы скачиваете из сети для загрузки вашей страницы.

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


Домашняя страница Medium

Тут у нас два важных компонента:

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

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

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

Но разве ожидание данных не является само-собой разумеющимся?

Да, но их загрузку можно ускорить.

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

  • данных от API бэкенда;
  • создания макета согласно этим данным.

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

Пять важных шаблонов загрузки данных

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

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

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

Рендеринг на стороне сервера и Jamstack

В современных JS-фреймворках отрисовка страниц зачастую реализуется на клиентской стороне (CSR). Браузер получает в виде полезной нагрузки JS-бандл и статический HTML, после чего отрисовывает DOM, а также для реактивности добавляет слушателей и активаторы событий. Когда такое приложение отрисовывается в DOM, страница блокируется до полного завершения этого процесса. Рендеринг делает приложение реактивным. Для его выполнения необходимо сделать ещё один вызов API к серверу и извлечь все нужные данные.

В свою очередь, отрисовка на стороне сервера (SSR) подразумевает передачу приложением простого HTML клиенту. SSR можно разделить на два типа: с гидратацией и без гидратации. SSR – это старая техника, используемая такими фреймворками, как WordPress, Ruby on Rails и ASP.NET. Основная её задача – предоставить пользователю статический HTML с необходимыми данными. В отличие от CSR, SSR не требуется совершать дополнительный вызов API к серверу, поскольку именно сервер генерирует шаблон HTML и загружает данные.

В более современных решениях вроде Next.js используется гидратация, при которой статический HTML гидратируется на клиентской стороне с помощью JS. Можно сравнить это с завариванием быстрорастворимого кофе: кофейный порошок – это HTML, а вода – это JS. При смешивании порошка с водой вы, очевидно, получите кофе.

Но что такое Jamstack? Jamstack аналогичен SSR, поскольку клиент получает простой HTML. Но во время SSR клиент извлекает HTML с сервера, а в случае с Jamstack приложения передают заранее сгенерированный HTML прямо из CDN. В связи с этим они обычно загружаются быстрее, но здесь разработчикам сложнее создавать динамический контент. Такие приложения за счёт предварительной генерации HTML хороши для клиента. Однако при использовании большого объёма JS-кода на стороне клиента становится всё сложнее оправдать использование Jamstack вместо СSR.

И SSR, и Jamstack имеют свои особенности. Общее между ними то, что они не нагружают клиента рендерингом всей страницы, используя JS.


Jamstack в сравнении с SSR и CSR

Когда вы оптимизируете SEO своего сайта, рекомендуется использовать SSR или Jamstack, поскольку в сравнении с CSR эти техники возвращают HTML-файлы, удобные для просмотра поисковыми ботами. Поисковики, конечно, также могут просматривать и компилировать JS-файлы для CSR. Хотя отрисовка каждого JS-файла в приложении с CSR может быть затратной по времени и понижать эффективность SEO вашего сайта.

SSR и Jamstack очень популярны, и всё больше проектов переходят на фреймоворки для SSR вроде Next.js и Nuxt.js, отказываясь от их ванильных CSR-аналогов – React и Vue. Главная причина в том, что SSR-фреймворки обеспечивают большую гибкость в отношении SEO. В Next.js есть целый раздел, ориентированный на SEO оптимизации.

Приложение с SSR обычно содержит шаблонизаторы, которые внедряют переменные в HTML при его передаче клиенту. К примеру, в Next.js можно загрузить список студентов, написав:

export default function Home({ studentList }) {   return (     <Layout home>         <ul>           {studentList.map(({ id, name, age }) => (             <li key={id}>               {name}               <br />               {age}             </li>           ))}         </ul>     </Layout>   ); }

Jamstack популярен для сайтов документации, которые обычно компилируют код в HTML-файлы и размещают их в CDN. Файлы Jamstack, как правило, до компиляции в HTML используют разметку Markdown. Вот пример:

--- author: Agustinus Theodorus title: 'Title' description: Description --- Hello World

Активное кэширование памяти

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

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

Но как делать правильный выбор между кэшем Redis (серверным) и кэшем браузера (локальным)? Оба этих варианта можно использовать одновременно, но каждый из них будет служить своей цели.


Схемы кэширования

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

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

Генерация событий данных

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


Типичная архитектура Websocket

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

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


Архитектура генерации событий

В чистой реализации WebSocket по-прежнему есть множество недочётов. Использование этой технологии вместо стандартных HTTP-вызовов полностью изменит поведение приложения. Даже одна небольшая проблема с подключением сможет повлиять на весь пользовательский опыт. К примеру, WebSocket не может обеспечить быстродействие реального времени – когда требуется связаться с базой данных, используется запрос GET. Чтобы сделать WebSocket рациональным и целесообразным выбором в бэкенде необходимо устранить ряд слабых мест, препятствующих эффективной работе в режиме реального времени.

Для реализации таких возможностей необходим основополагающий архитектурный шаблон, например, «генерация событий», который можно использовать для создания надёжных real-time приложений. И хотя он не гарантирует общее повышение быстродействия приложения, этот шаблон явно улучшит пользовательский опыт, предоставив клиентам возможность использовать UI в режиме реального времени.

В современном JS есть доступные для использования провайдеры WebSocket. Класс WebSocket открывает соединение с удалённым сервером и позволяет прослушивать, когда WebSocket создаёт соединение, закрывает его, возвращает ошибку, либо возвращает событие.

const ws = new WebSocket('ws://localhost');ws.addEventListener('message', (event) => {     console.log('Message from server ', event.data); });

Хотите реагировать на события сервера? Добавьте функцию addEventListener и вставьте обратный вызов, который она будет использовать.

ws.send('Hello World');

Хотите отправлять сообщение? И здесь у WebSocket есть решение. Отправку сообщений с сервера можно реализовать с помощью функции send. Причём это не сложнее вывода “Hello World”. Примеры взяты из документации MDN.

Предварительная и отложенная загрузка данных

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

▍ Предварительная загрузка

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

<link rel="prefetch" href="https://example.com/example.html">

URL для предварительной загрузки устанавливаются в атрибуте rel HTML-элемента link. Однако у данной техники есть как плюсы, так и минус.

Плюсы:

  1. Операция предварительной загрузки дожидается, пока сеть браузера не окажется свободной и останавливается, как только вы запустите некий сетевой процесс, кликнув по ссылке или активировав функцию отложенной загрузки.
  2. Предварительная загрузка кэширует данные в браузере, ускоряя переходы при перенаправлении по ссылке.

Минус:

  1. Этот приём можно использовать для скачивания трекеров, что ставит безопасность пользователя под угрозу.

▍ Отложенная загрузка

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


Отложенная загрузка

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

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

Resumability

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

Главная идея Resumability состоит в передаче состояния приложения от сервера клиенту посредством сериализации. Вместо загрузки всего кода (HTML, JS) с последующим его гидратированием во фронтенде при использовании Resumability мы разбиваем парсинга JS-кода на стадии и отправляем их клиенту в виде HTML.


Сравнение Resumability и гидатации. Изображение взято из Qwik

Загрузка страниц будет молниеносной, поскольку клиент вместо перезагрузки чего-либо будет десериализовывать состояние, внедрённое в HTML. Resumability является довольно чужеродной концепцией и для многих проектов покажется совсем непривычным приёмом. Придумал этот шаблон создатель Qwik, Миско Хевери.

Qwik – это JS-фреймворк, внутренне работающий по принципу Resumability, который в него закладывался изначально. Если же говорить о таких фреймворках, как React и Vue , то они никогда не смогут задействовать технику Resumability, не пожертвовав обратной совместимостью. Причина в том, что компонент отложенной загрузки в Qwik работает асинхронно в отличие от большинства синхронно устроенных фреймворков JavaScript.

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

Использование Qwik в некотором смысле напоминает React – в частности у них похож синтаксис. Вот фрагмент кода Qwik. Основа приложения будет представлена в форме HTML:

import { App } from './app';export const Root = () => {   return (     <html>       <head>         <title>Hello Qwik</title>       </head>       <body>         <App />       </body>     </html>   ); };

Здесь есть зависимость от App, компонента Qwik для отложенной загрузки:

import { component$ } from '@builder.io/qwik';export const App = component$(() => {   return <p>Hello Qwik</p>; });

У Qwik и React также есть сходства на уровне компонентов, а вот в серверной части они уже отличаются.

import { renderToString, RenderOptions } from '@builder.io/qwik/server'; import { Root } from './root';export default function (opts: RenderOptions) {   return renderToString(<Root />, opts); }

Фрагмент выше показывает, как серверная часть Qwik сериализует основной компонент, используя метод renderToString. После этого клиенту потребуется лишь спарсить чистый HTML и десериализовать JS-состояние без необходимости их перезагружать.

Обобщение

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

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

  1. Отрисовка на стороне сервера (SSR) и Jamstack.
  2. Активное кэширование памяти.
  3. Генерация событий данных.
  4. Предварительная и отложенная загрузка.
  5. Resumability.

Каждый из них эффективен на своём месте.

SSR и Jamstack обычно хорошо подходят для приложений, требующих меньшего управления состоянием на клиентской стороне. С появлением современных фреймворков вроде React всё больше людей познакомились с паттерном отрисовки на клиентской стороне (CSR), но в результате сообщество всё же возвращается к SSR. Техника SSR используется в старых MVC фреймворках, где с помощью шаблонизаторов на основе данных бэкенда генерируется HTML. Jamstack – это ещё более старая иллюстрация изначальной веб-среды, в которой использовался только HTML.

Активное кэширование памяти позволяет быстрее загружать данные из API. Эта техника решает важную проблему загрузки данных путём их кэширования либо на удалённом сервере (Redis), либо локально в браузере. Помимо этого, она используется в шаблоне предварительной загрзуки данных.

Что касается генерации событий, то этот архитектурный шаблон дополняет основанные на событиях WebSocket API, работающие в реальном времени. Простых старых WebSocket недостаточно для полноценной эффективности, поскольку, хоть сам WebSocket и работает в реальном времени, регулярные вызовы API к базе данных создают узкое место. Шаблон генерации событий устраняет эту проблему, создавая для загрузки данных отдельную БД.

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

Отложенная загрузка сокращает объём ресурсов, необходимых для загрузки при первом клике. Вам требуются только те из них, которые вы видите непосредственно после загрузки страницы. И эту технику дополнительно расширяет шаблон Resumability. Он подразумевает отложенную загрузку JS-компонентов путём их частичной отрисовки на сервере с последующей сериализацией состояния для завершения начатой отрисовки уже на стороне клиента посредством HTML.

Дальнейшие шаги

Выработка навыков по оптимизации приложений является непрерывным процессом. Вам нужно продумывать всё наперёд в проектах, которые реализуете изо дня в день. Шаблоны загрузки данных – это всего лишь один из способов для повышения быстродействия.

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

Благодарю за чтение. Надеюсь, статья была для вас полезной.

Играй в нашу новую игру прямо в Telegram!


ссылка на оригинал статьи https://habr.com/ru/company/ruvds/blog/709056/

Это ужасно бесит — подборка косяков, постоянно встречающихся от сайта к сайту, от приложения к приложению

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

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

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

Этим почему-то особенно грешат интернет-магазины и сервисы доставки еды. Каждый день ты получаешь бестолковые нетаргетированные рекламные пуши с кучей Emoji, а когда приходишь в настройки, надеясь их отключить, тебе предлагают выбор — либо всё, либо ничего. Не хочешь получать рекламу? Тогда не узнаешь и о статусах своих заказов или о том, что курьер с едой уже близко. Это натуральное свинство.

Ozon на примере выше — как раз-таки положительное исключение, у них можно вырубить рекламу, не отключая действительно важные уведомления. Однако скриншот со спамом получился очень уж сочный, и я не устоял. 😄

Безосновательное разлогинивание

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

Боитесь, что нерадивый пользователь залогинится, используя чужой или публичный компьютер, и потом забудет вручную выйти из своего аккаунта? Ну так дайте ему выбор в виде соответствующей галочки рядом с полями ввода логина и пароля. Хотя, справедливости ради, встречаются и сайты с такими галочками, которые тем не менее ни на что почему-то не влияют. Привет, Apple и Microsoft, каждый раз у вас указываю, что меня никогда не надо разлогинивать, и всё равно вы меня разлогиниваете уже через несколько часов. 🤬

Наконец, отдельный котёл в аду должен быть у тех разработчиков, кто реализовывает такое поведение в мобильных приложениях. Да, вы удивитесь, но бывают и такие, при чём это не банки и не что-либо подобное. Например, Lounge Key — приложение-каталог бизнес-залов в аэропортах мира. Или «Умный дом» от Яндекса. А ещё Binance (криптобиржа), которая и так открывается лишь по Face/Touch ID, но всё равно почему-то выкидывает тебя из аккаунта каждые несколько дней. Вот зачем так делать?

Сброс выбранного города или неверное его отображение

Друзья, Россия состоит не из одной только Москвы. Я понимаю, что москвичам это вряд ли сколько-нибудь интересно, но вы не представляете, наско́лько бесит, когда каждый раз, заходя в привычный интернет-магазин, ты видишь, что вместо твоего уже ранее выбранного города всё опять сбросилось на Москву. Этим грешат, например, re:Store и сайты почти всех российских операторов мобильной связи — МТС, МегаФона и других.

МегаФон
МегаФон

Другой вариант проявления той же проблемы — когда сайт или приложение корректно запоминает твой город, но затем неверно отображает его в своих интерфейсах. Так, например, делает Тинькофф Банк — ты можешь выбрать в своём профиле какой угодно город или регион, и он даже сохранится, но если затем снова зайти в настройки профиля, там всегда будет написано «г. Москва» (как минимум, в iOS-приложении). Полагаю, потому что все тестировщики банка сидят в Москве и даже не задумываются, что в этом месте их интерфейса может скрываться какой-то баг.

Тинькофф Банк
Тинькофф Банк

Выбор дат без возможности ввода с клавиатуры

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

Amazon
Amazon

Кстати, если вы добавляете куда-то пикер даты рождения, не поленитесь проставить его дефолтное значение на 1980 – 1990 год вместо сегодняшнего. Абсолютному большинству пользователей так будет ближе до нужного им варианта.

Буквенная клавиатура для телефонных номеров и неуместная автокоррекция ввода

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

Бывают случаи, когда в одном и том же поле пользователь должен иметь возможность ввести как номер телефона, так и, например, электронную почту, однако телефон — более приоритетный вариант. Для подобных кейсов также предусмотрена соответствующая настройка, при которой по дефолту отобразится цифровая клавиатура, но на ней останется возможность перехода к буквам. В контексте, например, iOS-разработки это UIKeyboardType.namePhonePad.

Что бесит ещё больше, так это когда ты пытаешься ввести где-то свой логин или E-Mail, но клавиатура упорно всё тебе портит своей автокоррекцией, потому что разработчик сайта или приложения поленился отключить её для соответствующего поля ввода. Либо когда наоборот имеется поле, предназначенное для ввода осмысленного текста, но разработчик на кой-то ляд отключил в нём автокоррекцию.

ВКонтакте
ВКонтакте

На примере выше нарушены сразу все только что описанные мной рекомендации.

Куки 🤦‍♂️

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

Наш сайт использует куки, разрешите нам использовать куки, куки-куки-куки…

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

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

Хоть как-то спастись от «кук» можно при помощи специальных браузерных расширений, но разве это нормально..?


Думаю, хватит пока. 🙈

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

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Бесит?
62.31% Да, всё из списка 81
30% Да, но лишь некоторые пункты 39
7.69% Нет 10
Проголосовали 130 пользователей. Воздержались 8 пользователей.

ссылка на оригинал статьи https://habr.com/ru/post/709494/