Я в интернете

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

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

Позднее Ctrl + ↑

Думаем дальше № 66 — «Лизать меня собаке не нужно»

Рассуждаю о наготе в раздевалке и вреде идеи «личных границ».

Все выпуски подкаста:
Эпл · Ютюб · Я.Музыка · Спотифай · Мейв · РСС для подкастного приложения

0:00 Люди раздеваются в раздевалке
5:33 Комфорт окружающих и личные границы
10:38 Люди создают много шума
13:24 Выражать желания не наглость
14:51 Люди мешают плавать
16:50 Не надо ссылаться на табличку: люди важнее
17:57 Люди ходят с зонтиками во время дождя
19:30 Собачники не понимают, что не всем в кайф их собаки
23:16 Так что же раздевалка тогда?
24:41 Бариста возмущена посетительницей, которая ничего не заказала
25:57 Соблюдение местных традиций в разных странах
28:01 Личных границ не существует, есть только желания людей
35:18 Возвращаем себе субъектность. Желания сильнее абстракций
38:29 Уважение к прямой просьбе и взрослость прямого отказа
43:08 Защита личных границ детей путём защиты детей от личных границ (фигасе)
46:54 Почему люди платят налоги и зачем понимать, что происходит на самом деле
50:11 Термин полезен для общения психотерапевтов
51:58 Внимание к комфорту окружающих безо всяких просьб с их стороны
53:38 Интимное общение и понятность без слов
56:40 Как я сам стараюсь не напрягать и как выражать просьбы с опорой на собственное желание
1:00:34 Люди бегут в туалет сразу после взлёта
1:02:39 Не слишком ли я стремлюсь «быть удобным», раз думаю о комфорте окружающих?
1:04:56 Почему чрезмерное выстраивание «личных границ» приводит к обратному эффекту
1:07:56 Право на имя и границы его применимости
1:14:03 В какое время кому писать. Люди важнее традиций

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

 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 уже известны, значение истинности их импликации не несёт никакой пользы и почти никакого смысла.

На интерфейсном курсе: убираем необязательные элементы с плашки

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

Это фрагмент № 203 онлайн-курса «Пользовательский интерфейс и представление информации». Записано на курсе 25 октября 2024 года.

Последние дни идёт запись на курс 25 июля — 23 августа!

Почитать о курсе
Программа, отзывы, запись

Это лучший курс об интерфейсе.

Что послушать — 89

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

Вот что я слушал в последнее время, что мне понравилось:

  1. Луи Сикей у Рика Рубина. Два часа разговора о жизни, карьере, шутках. Классный формат: очень короткие вопросы и подробные ответы на всё.
  2. FFmpeg: The Incredible Technology Behind Video on the Internet. Создатели Ффмпега в подкасте Лекса Фридмана.
  3. Communication Technology and the Struggle for Freedom. Свободолюбивое выступление Павла Дурова на каком-то мероприятии в Осло.
  4. 44 Harsh Truths About The Game Of Life. Наваль Равикант, всегда клёво его послушать. Наверное это потому, что почти про всё я думаю так же, но не излагаю так же складно.
  5. 3 Rules For Selling To Rich People.

Отношения между сценарием и навигацией в интерфейсе

 4 мин

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

Что будет, если просто положить сценарии в основу навигации?

Когда сценариев очень мало, может получиться неплохой интерфейс. Если есть всего три-пять действий, за которыми человек приходит в интерфейс, и мы просто делаем для них кнопки, то всё будет понятно и удобно. Это то, что я предлагал для ПВЗ «Яндекс-маркета».

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

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

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

Ну и что, как построить навигационную модель вокруг этого сценария? Да никак.

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

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

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

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

Как я навайбкодил «Колокол Тарта» за 10 минут

Колокол Тарта я придумал сделать зимой в качестве первого эксперимента в вайб-кодинге. Сначала я создал новый пустой проект в Икскоде. Первую рабочую версию я получил минут за десять с «Кодексом» ЧатаГПТ, о чём рассказывал в подкасте.

Поскольку я вообще не понимаю, что к чему в структуре проекта Икскода, я решил начать с вопроса (на ответ мне оказалось наплевать), и дальше у меня были вот такие обращения к Кодексу со всеми опечатками как есть:

  1. This is a new project created in XCode. Explain to me its folder structure and files.
  1. How to add a system menu item for this app? I mean the right area menu area with icons. What is it called in Apple world? Where Wi-Fi, control center etc live?

Как видите, тут я ещё осторожничал и не решался просто сказать, мол, сделай — пытался сначала выяснить, как именно сделать. Он рассказал.

  1. Let’s add this to the actual code
  1. Now let’s remove the main window and Dock icon from this app. When the app runs, it add the bell status bar item, and the only option in the menu is Quit. There must be nothing else in this app so far.
  1. Why do we need if os(macOS)? This app is Mac only and is not intended to run on any other OS. Can we remove any meantion os other OSes from it?

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

  1. Now let’s add a menu item «Ring’ and a separator before Quit in our menu extra. When the “Ring” item is selected, the app should play some system sound that sounds like a bell

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

  1. Now lets add another function. The app should ring the bell automatically every X seconds, where X varies between 3 and 30 (make it easily adjustable constants in code). So when the app launches, it sets lastBell to the current time, sets the first randomInterval, and starts a timer that fires every second. When the timer fires, the app checks if randomInterval has elapsed, and if yes, it plays the bell sound, remembers the current time as lastBell and comes up with a new randomInterval. So in the end it just plays the bell sound every now and then until I press quit.
  1. Add another menu item under Ring that shows how long ago was the previous ring in a human-readable form i.e. “Rang 5 seconds ago”, “Rang about an hour ago”. The wording should not be exactly like this. Just use any existing system formatters for relative time with minumum code.

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

  1. When I build the app in XCode, where does the executable go? How to run the app without XCode?

Тот факт, что этот вопрос приходится задавать, говорит об Икскоде плохо.

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

Архив вакансий не может быть подразделом создания вакансии

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

Дизайнер показывает страницу создания вакансии. В ней вкладки «Новая вакансия» и «Архив». В первой, понятно, форма, а во второй — список ранее опубликованных, но уже закрытых вакансий.

Я спрашиваю: почему архив находится вдруг на странице создания вакансий? Он же должен быть в разделе «Вакансии». Дизайнер объясняет, что частый сценарий — перепубликация ранее закрытых вакансий. То есть руководитель хочет создать вакансию, а мы ему удобно прямо под рукой даём архив, чтобы он мог старую вакансию перепубликовать.

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

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

Юридическая туфта на странице Айфона

Я зашёл на страницу Айфона и заметил, что юридическая туфта занимает половину её высоты:

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

Пользователь: Я купил Айфон, прочитав о нём на странице, но оказалось, что он работает иначе. Эпл ввёл меня в заблуждение.

Защитник Эпла: Однако на странице снизу под сноской 64 указано, что он работает иначе.

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

И всё. Пусть включают все свои уточнения в основное повествование или пишут так, чтобы двусмысленности не возникало.

Колокол Тарта для Мака

Держите мою программу-колокол для Мака, которую я сделал зимой.

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

Выпускать её официально по эпловским понятиям я пока не готов — это намного сложнее, чем делать программы. Так что инструкция по установке такая: скачать (в комментариях), распаковать, перенести в /Applications, по правой кнопке Open и подтвердить, что доверяете мне. На последних версиях Макоса может потребоваться ещё и зайти в System Settings → Privacy & Security, и там нажать Open Anyway.

Не мешайте детям хотеть

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

Ну, наверное.

См. также:

Ранее Ctrl + ↓