Я в интернете

РСС    Джейсон-фид

Есть автоматические трансляции в Тумблер и Же-же. Если не работает, напишите мне: ilyabirman@ilyabirman.ru.

Избранное

Проектирование дизайна как создание объяснения

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

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

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

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

Я:

Какой толк от прототипа? Ведь из прототипа я ничего не пойму. Я буду видеть, что что-то как-то сработало, но я не увижу внутренних причин.

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

После прочтения Дойча я понимаю, почему так: прототип — не объяснение. Что толку физику от результатов опыта, если у него нет объяснительной теории, которую эти опыты подтверждают или опровергают? Это же просто рандомные факты, вызывающие лишь недоумение. Чтобы понимать, почему они такие, мне нужно открыть, то есть придумать закон, который бы их объяснил.

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

Это всё снова показывает, насколько качественное проектирование близко к придумываю законов физики.

Программа при запуске хочет, чтобы я открыл файл

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

Это, как и кнопка «наверх» внизу страницы и кнопка «На главную» на пустом экране — тоже пример того, когда мне протягивают костыль, а я не хромой. Завёл тег «медвежья услуга» по этому поводу.

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

Во-вторых, даже если я и собираюсь открыть файл, ну не через диалог открытия файла же я это буду делать! Это самый неудобный способ открыть файл в мире. Файл почти наверняка у меня где-то и так под рукой: в письме, в телеге, на рабочем столе, в папке, в веере Downloads в доке. Я его просто оттуда затащу да и всё. Нафиг мне твой диалог сдался вообще?

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

Где и как подписать дверь

 6 мин

Не только содержание, но и расположение подписи несёт информацию о помещении.

Самое очевидное — это подписать посередине двери на уровне глаз. Просто какой-то кабинет, без постоянного потока посетителей:

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

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

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

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

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

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

Кстати, туалеты вообще удобнее обозначать иконками:

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

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

Если нужен только номер, его можно разместить и над дверью:

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

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

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

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

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

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

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

Импликация, следствие и условия

 4 мин

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

Импликация — это логическая операция вида «A → B». Она истинна во всех случаях кроме одного: когда A истинно, а B ложно. Можно оценить по таблице истинности:

A B A → B
0 0 1
0 1 1
1 0 0
1 1 1

То же самое можно сформулировать как «из истины следует истина, а из лжи — что угодно».

Кажется, что это простая штука, ведь в жизни мы легко понимаем выражения типа «Если A, то B» или «Из A следует B». Но если сказать, что «из 2×2=4 следует что Волга впадает в Каспийское море» (V), большинство воспротивится этому. Почему, ведь с точки зрения логики это верное утверждение?

Дело тут в том, что мы не интерпретируем фразу V буквально. Мы видим, что в общем случае из математического равенства не следует географический вывод. То есть мы подсознательно обобщаем V, превращаем в шаблон, и тогда импликация разрушается. Мы понимаем, что имея лишь «2×2=4» и не зная ничего про Волгу, невозможно сделать вывод о том, куда она впадает. Но импликация означает истинность конкретного этого высказывания, а не то, что высказывание сохранит истинность при обобщении.

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

Высказывания типа «Если A, то B» нас интересуют как способ выводить истинность B из истинности A или наоборот, то есть только тогда, когда мы не знаем одно из них. А для этого нам нужно вскрыть содержательную связь между A и B, а не просто значения их истинности. Тут-то нам и нужны шаблоны, да такие, что мы уже заранее знаем, что импликация там истинна!

Предположим, мы знаем, что «у каждого голландца есть велосипед» (K). Заметьте, что это уже утверждение, содержащее импликацию («если человек голландец, то у него есть велосипед»), и мы уже договорились, что оно истинно. Вот теперь если мы узнаем, что Фёдор голландец, мы сделаем вывод о том, что у него есть велосипед. Импликация помогла сделать этот вывод только потому, что мы 1) уже знали, что сама она истинна, и вдобавок 2) она имела форму шаблона, в который можно было подставить Фёдора. От истинности же импликации V из начала заметки нет никакого проку. Поэтому с такими видами совершенно верных высказываний мы никогда не имеем дела. Они нам кажутся настолько пустыми, что мы не готовы даже пытаться оценивать их истинность.

Один из комментаторов у Никиты написал, мол, как же импликации нет в языках программирования, когда там есть if (a) b? Но что значит? В известных мне языках программирования это даже не является выражением, но если бы являлось, каким было бы его значение? Иными словами, что бы нам дал вывод print (if (a) b)? Конечно же true! Ведь в этом буквально состоит работа языка программирования: обеспечить b, когда истинно a. Если он этого не делает, то зачем такой язык программирования нужен? Но в то же время, если a ложно, то глядя на эту строчку мы никак не сделаем вывод о том, произойдёт ли b. Может, какая-то другая часть кода обеспечит b. Строчка if (a) b никак не способна предотвратить b.

Получается какая-то эзотерика, и только потому, что никто никогда не рассматривает if (a) b как логическое выражение и не пытается оценить его истинность. Всех интересует только логическое выражение a по отдельности, потому что от его истинности зависит, может ли быть уверены в том, что произойдёт b.

Импликация в языках программирования была бы, если бы можно было написать if (a→b) c, то есть «если из a следует b, обеспечь c». Но нафиг это надо? Как мы уже выяснили, когда значения a и b уже известны, значение истинности их импликации не несёт никакой пользы и почти никакого смысла.

Теорема о тормозах

Поговорим о ситуациях, когда компьютер тормозит.

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

Теорема: все тормоза являются ошибками и исправимы.

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

Примеры тормозов в современно софте:

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

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

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

Таким образом, тормоза нельзя списать на слабое железо; это слабость исключительно её автора.

В эпоху ИИ самое важное — чего-то хотеть

Все обсуждают, кого заменит ИИ, какие специалисты станут ненужными.

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

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

Увольте программистов, которые разлогинивают ваших пользователей

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

На днях думал прокатиться на самокате. Зашёл в приложение Вуш, а оно меня забыло:

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

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

Или вот зашёл я в Саундклауд послушать музыку — а туда я захожу почти каждый день, и у меня даже платный акаунт — а Саундклауд пишет какую-то ахинею:

Вы, говорит, разлогинились. Идите теперь в телефон! Что за кретин это написал? Во-первых, я не разлогинивался из Саундклауда, скорее всего, вообще ни одного раза в жизни, потому что нет причин это делать. Только сам дебил-Саундклауд мог меня разлогинить. Во-вторых, какая вообще связь с телефоном? В таком контексте ощущается как сознательное издевательство. Даже если предположить, что я зачем-нибудь разлогинился сам, нафига мне идти в телефон, что там ждёт свежеразлогинившегося меня?

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

Не думаю, что меня хоть раз разлогинивало Яндекс.Такси или Озон. Да даже Альфа и Тиньков меня не разлогинивают никогда, и ничего! Как-нибудь уж самокаты и музыка могут снизить свои требования к «безопасности» хотя бы до банковского уровня?

Рациональное использование площади экрана

 5 мин

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

Квиктайм при просмотре видео рисует интерфейс перемотки лишь на небольшую часть ширины экрана:

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

Налоговая в выбиралке валюты не даёт увидеть, какую валюту я выбираю:

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

Аналогично Гугль-фонтс прячет настройку шрифта вот в такое меню с прокруткой:

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

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

А вот обратные примеры. У Спотифая не вместилось «С возвращением» и три кнопки на большой экран:

Даже если предположить, что вы не хотите «отвлекать» меня от входа ничем интересным, ну уместить-то можно было это всё хотя бы? Хотя, конечно, я был бы больше мотивирован войти, если бы чувствовал, что внутри меня что-то ждёт хорошее.

Яндекс-музыка туда же:

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

В дефолтном дизайне Айтюнса на огромном 32″ 6К мониторе в высоту экрана влезает три трека! Три:

Тут я затрудняюсь дать комментарий.

Не только в музыкальных программах это. Вот Гугль-докс не может уместить названия файлов:

Ну какой идиот, а? Ну вон же полно место по бокам, и это при моей любимой ширине окна 1024 даже1 Нахрена, нахрена ты обрезал названия?

Кинопоиск спрятал две кнопки («Неинтересно» и «Просмотрен») в многоточие:

Просто космический идиот. Ещё и нарисовал подсказку, которая заняла столько же места, сколько заняли бы обе кнопки без подсказки! Да у тебя целый экран вот посвящён моим отношениям с этим фильмом. Что может быть важнее, чем показать кнопки настройки этих отношений? Для чего ты сэкономил это место?

А вот классический Лончпад Эпла:

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

А сейчас что? Только вот так:

Всему тесно, и чуть что возникает прокрутка.

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

Случайное

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

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

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

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

Ну как же в принципе неизвестен? Вселенная же как-то решает, где ей в итоге частицу проявить? Значит есть причина того, что частица проявилась именно там, а не где-то ещё. Есть какой-то механизм, который приводит к такому исходу. И если мы пока не видим или не понимаем его, то надо подумать получше, а если мы уже доказали его принципиальную невидимость для нас, то нужно говорить именно о ней.

Насчёт Дэвида Дойча

Есть физик и философ Дэвид Дойч. Давно знаю о его существовании, слушал подкасты и эфиры с его участием; упоминания и обсуждения его взглядов. Было ощущение, что интересный человек. Наконец я добрался до книг. Начал со второй — «Начало бесконечности» (2011).

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

Сейчас я уже читаю текстовую версию и делаю заметки, так что, возможно, когда-нибудь будет и выписка, но вероятно, какие-то отдельные вещи я вам принесу и до того. А в аудиоверсии я взялся слушать предыдущую книгу, «Структура реальности» (1997).

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

Одно из важнейших понятий у Дойча — это «хорошее объяснение». Он сравнивает разные способы того, как наука объясняет те или иные явления, и даёт критерий хорошего объяснения: его сложно изменить. На его примерах видно, что это работает, но нужно какое-то время, чтобы уяснить, почему именно трудноизменяемость делает объяснение хорошим. Но когда это понимание формируется, ты видишь эту связь качества и трудноизменяемости везде! Если дизайнер принёс дизайн, который работает, но любой элемент можно переставить куда-то ещё без потерь, такой дизайн ощущается слабым. Он не выглядит продуманным; нет ощущения, что каждый элемент на своём месте; на вопрос «почему именно так» нет ответа. Теперь я понимаю: дизайн слишком легко изменить, а значит он слишком слабо связан с задачей; он неточно на неё отвечает; она слабо проявлена в нём.

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

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

Половина того, что у него написано вызывало у меня реакцию «офигеть, вот это поворот!», а вторая — «я всегда именно так это и чувствовал, но никогда бы не смог так чётко изложить!» Как вы понимаете, и то и то очень приятно.

Ранее Ctrl + ↓