Я в интернете

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

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

Избранное

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

 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 + ↓