nikitonsky_pub | Unsorted

Telegram-канал nikitonsky_pub - Стой под стрелой

10682

Ведет @nikitonsky. Рекламы нет

Subscribe to a channel

Стой под стрелой

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

Ну и вот. В порыве юмора добавил в этот файл апишники отметившихся. Типа, пишешь «Привет, я Вася», а оно сохраняет: «IP 3.14.159.265 написал: „Я Вася“»

И народ так занервничал!

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

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

Вот, давайте для примера я вам еще айпишников напишу:


247.172.180.151
79.156.53.78
43.213.57.243
61.207.97.37
130.126.244.221
200.163.13.46
77.132.32.188
217.178.6.33
89.187.33.214
215.112.6.97


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

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

Кстати, расскажите, что можно с айпишником сделать? Вот, например, мой (реально): 94.135.166.230. Что дальше? Чем я рискую?

Читать полностью…

Стой под стрелой

Редкий случай: в твиттере нашелся чел, который добровольно принял ответственность за невыровненные иконки в Икскоде. Они там буквально косо в квадратиках стоят. Цитирую:

> This is technically my fault. They are programmatically generated from SF Symbols and scaled dynamically [...] There’s something about the font rendering that meant that the CG Graphic or whatever it was, wasn’t seeing the pixels for what they were - I tried all sorts and couldn’t get it to work.

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

> The old icons were even worse and very dated. We had to ship. The person who would’ve been able to fix it was busy with more important things. Just the reality of every software development place.

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

На самом деле интересно было бы узнать, чем именно. Сколько там у Эпла инженеров, тысяч сто? А продуктов? Сто? Тысяча? Ну допустим тысяча. И что, сто инженеров недостаточно, чтобы посадить кого-нибудь выровнять иконки?

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

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

Читать полностью…

Стой под стрелой

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


org.eclipse.jetty.websocket.server.config.JettyWebSocketServletContainerInitializer$Configurator


Да, прям так и написано, в одну строчку. 96 символов, между прочим. В перфокарту не влезет.

Но давайте смотреть. Все что до точки это пакет. org.eclipse.jetty, понятно, название библиотеки. Тут у меня уже начинает болеть голова, потому что почему нельзя просто jetty сделать? В смысле нельзя потому что в Джаве так не принято, а почему в Джаве так не принятно?

Мне кажется, люди в 2000-х, когда интернет только начинался, немножко боялись, что имен не хватит на всех и нужно их как-то «занимать». А вот если разделить весь пул имен на три под-пула (com, org, net) то тогда хватит.

Название организации eclipse тут присутствует по похожей причине, типа, а вдруг имена закончатся, а кому-то очень надо будет сделать проект, который тоже будет называться jetty, вот тогда он просто организацию поменяет и будет норм! (спойлер: будет все равно не норм)

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

Дальше идет websocket.server.config. Это, собственно, пакет. Точнее, подпакет. Тут у меня три вопроса.

Во-первых, ну ты уже застолбил org.eclipse.jetty, ну и положи туда все, что у тебя есть, что, жопа отвалится? То есть сама необходимость подпакетов.

Во-вторых, если ты делаешь подпакеты, делай их для себя, а пользователю ими голову не парь. В Джаве это, к сожалению, любят. Например, они запилили работу со временем в java.time. Вопросов ноль. Но и положи ты в этот пакет все, Якове, брате, зачем аРхИтЕкТуРу городить? Но нет, таймзоны у них в java.time.zone, форматтеры в java.time.format, остальное размазано равномерно-случайно между java.time.temporal, java.time.chrono и собственно java.time. Может в момент придумывания это и звучало как-то стройно и логично для какого-то одного конкретного случая, но на практике получается, что я всегда импортирую пару классов из одного, пару из другого и остаток из третьего. И чего? В чем, так сказать, глубокий смысл? У нас нет задачи выкопать яму, есть задача заебать солдата.

Ну и в-третьих, окей, у тебя офигеть сложный проект, прям миллион классов, и если вывалить их в один пакет, то файловой системе поплохеет (сомневаюсь, но давайте предположим). НУ СДЕЛАЙ ТЫ ДВА УРОВНЯ ТОГДА. Не городи эту бесконечную вложенность, как программисты любят. Вехний уровень и на нем несколько папок. ВСЕ. Больше ничего не нужно. Красиво. Плоско. Наглядно. В голове помещается. Есть ли в жизни что-то более идиотское, чем бегать туда-сюда по миллиону мелких папок (привет, `src/main/java/`), в каждой из которых по две-три других папки? Я не знаю.

Ура. С пакетами разобрались. Переходим к классу. JettyWebSocketServletContainerInitializer. Шесть существительных. Добрый вечер.

При этом, в чем смысл пакетов? Это неймспейсы, так? Чтобы классы с одинаковыми именами, например, Зарплата, не перепутались, один кладут в пакет лупа, а другой в пупа.

ТОГДА ЗАЧЕМ ЭТУ ВСЮ ИНФОРМАЦИЮ ПОВТОРЯТЬ В НАЗВАНИИ КЛАССА?

А, Джависты? Зачем? Зачем, а? Jetty. Было в пакете. Чего молчишь? А? WebSocket. Было. Заело, да?

Дальше. $ означает вложенный класс. То есть есть класс JettyWebSocketServletContainerInitializer, а у него внутри еще Configurator. Зачем? А никто не знает. Вроде бы пакеты и так выполняют функцию неймспейсов, но в данном случае неймспейсом может поработать класс.

На семантику я даже боюсь смотреть. Зачем нужен целый класс Initializer, почему нельзя просто проинициализировать что-то? Почему нельзя сказать obj.option = "abc". Ну или ладно, obj.initialize(options)? Зачем инициализатору нужен свой отдельный конфигуратор? Никто не знает. Джависты боятся простоты как огня.

Пишите, короче, на Кложе.

Читать полностью…

Стой под стрелой

Всем хороши UUID, вот только репрезентация подкачала. Ну посмотрите:


798bf160-5eda-4aa2-a741-bbfc48ac9f8f


Что это? 36 букв? Дефисики? Чтобы что? По телефону диктовать удобно было? Отдельно меня убивает группировка: 8-4-4-4-12. Кто это придумывал?

(на википедии пишут, что раньше вообще было 34dc23469000.0d.00.00.7c.5f.00.00.00 и urn:oid:2.25.113059749145936325402354257176981405696, так что мы еще легко отделались)

Смотрел я на это, смотрел, и решил, что надо сжимать.

Первая мысль — base64. Это кодировка основана на простой идее: кодировать бинарные данные максимально «безопасными» символами, которые пролезут везде.

Что такое безопасные символы, спросит читатель? Так вышло, что из 256 символов стандартного ASCII половина (128) может попердолить если ошибиться с кодировкой, парочка трансформируется непредсказуемо, если открывать файл в текстовом режиме на разных системах, и еще 32 творят всякую дичь и скорее всего никак не отображаются на экране, что оставляет нам примерно 94 символа, которые отобразятся более-менее одинаково всегда.

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

Теперь следите за руками. В английском 26 маленьких букв. Еще столько же больших. Итого 52. Добавляем 10 цифр, получается 62. ПОЧТИ дотянули до круглого 64.

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

Если зайти на википедию, можно увидеть, что большинство стандартов, которые прям стандарты-стандарты, берут + и /. Плюс еще куда ни шло, но вот / нам решительно не подходит – он явно будет плохо парситься внутри урлов и файловых путей, а пихать uuid в урлы и файловые пути — это святое.

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

Вот, если что, полный спискок:


! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ ` { | } ~


Если бы я делал, я бы наверное выбрал - — во-первых, потому что он уже в UUID используется, то есть мы ничего не теряем, а во-вторых он прикольно поддерживает тему заглавных/строчных в паре с _.

Но так ли уж нам нужно именно 64 буквы? Есть более радикальная идея: а что если взять всего 62?

На самом деле, если использовать 64, то нам понадобится ⌈128 / log₂64⌉ = 22`символа. А если брать 62, то `⌈128 / log₂62⌉ = 22 все равно!

Да, математика не такая красивая, по 6 бит удобнее откусывать, чем делить на 62 с остатком. Но! Мне кажется, если вы парсите UUID любым способом, кроме прямого memcpy 16 байт, вы уже проиграли игру в оптимизацию, и 22 лишних деления вам погоду не сделают. Зато универсальность!

В итоге UUID будут выглядеть как-то так:


ibIP7XtbjSUXesMuVW63JA


Сравните с тем, что было:


798bf160-5eda-4aa2-a741-bbfc48ac9f8f


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

Если играть совсем жестко, то можно все 94 доступных символа заиспользовать. Но тогда идентификатор сократится всего на 2 символа, а выглядеть они станут так:


;n'^}VR!5VIxlUl$\Q37


ИМХО, не стоит того.

А вот что можно провернуть, так это эмоджи! Вроде, если взять все односимвольные эмоджи без модификаторов, можно наскрести 1361 штук. Этого хватит на то, чтобы сократить 128-битные uuid до 13 символов. Можно даже только 1024 использовать, все равно 13 будет, плюс математика попроще.

Выглядеть будет так:


🩸💞🆑🪕🏪🤒🌡🥔🦐🪪🍑🕧🧋


С узнаваемостью проблем нет, а вот с эффективностью... Каждый эмоджи занимает 4 байта в UTF-8, т.е. мы получаем 13 * 4 = 52 байта, что больше даже 36-ти у текущего UUID.

Зато как красиво!

Читать полностью…

Стой под стрелой

Кстати я же вам не рассказывал про сайтик. Я задолбался искать сеансы в кино и сделал сайт Alle Kinos (все кинотеатры Германии, типа).

У обычных сайтов кинотеатров очень нерегулярный интерфейс. Они не могут просто все что есть показать единообразно, они как сайты Бюро — тут обложечка, тут выезжалочка, тут пять новинок, тут трейлер, тут новость, тут интервью с режиссером, тут специальный этаж, и каждый как уникальная снежинка, не похож на соседей. Как будто люди на сайт кинотеатра ходят новости почитать. А, ну и обложки на пол-экрана, так чтобы ты максимум мог три фильма увидеть за раз, даже если в самом кино показывают 25.

Все это красиво, но ориентироваться трудно и общая картина теряется. А потом еще кликать надо по три раза, чтобы сеансы увидеть, и страницы грузятся по несколько секунд, короче, два фильма посмотрел — уже устал.

Ну вот, а я сделал регулярный интерфейс. Все стандартно, одинаково и без выебонов. Чистая функция. Выбираешь город, тебе вываливается ОДНА страница со всеми фильмами, всеми кинотеатрами и сеансами на неделю. Для Берлина это примерно 2 Мб (235 Кб с компрессией), и ничего, никто не умер. Работает побыстрее большинства сайтов, сделанных «настоящими» программистами.

Это еще был эксперимент сделать сайт «без интерфейса». Там нет джаваскрипта совсем, вот ни байтика. Нужно поискать что-то? Ну так в браузере есть поиск. Посмотреть все? Скроль. Перейти по ссылке? Это вообще нативная веб-функциональность. Sticky headers и ленивая подгрузка картинок тоже уже делаются встроенными средствами. Джаваскрипт не нужен! Да, так было можно.

И, главное, никакой пагинации.

Читать полностью…

Стой под стрелой

В Твиттере Тагир показывал, как они научили Идею генерировать javadoc комментарии к методам. И все бы ничего, если бы не пример: на метод


public static <T> @Nullable T getLastElement(T @Nullable [] array) {


оно сгенерировало


/**
* Returns the last element of the provided array.
*
* @param array the array from which the last element is requested. It can be null.
* @return the last element of the array, or null if the array is null or empty.
*/


Когда уже разработчики поймут, что такие вот ничего не добавляющие тавтологические комментарии — вред, а не польза. Все, буквально все, что написано в комментарии, есть тупо в сигнатуре метода, причем в три раза короче. То есть вы только что заставили меня прочитать в три раза больше текста, чтобы не узнать ничего нового. ЗАЧЕМ? Вам что, за буквы платят?

Неудивительно, что в дефолтной теме в Идее комментарии рисуются сереньким. Типа, они конечно есть, но мы все в глубине души понимаем, что там булшит и никто его читать не будет.

Понимают — но делают и продолжают делать.

Читать полностью…

Стой под стрелой

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

А тут недавно купил мини на 8Гб и все-таки заглянул в таб с памятью. Очень, знаете ли, удивился.

Ну, для начала, я браузер с телеграмом никогда за программы вообще не считал. Типа, они не должны есть ресурсов от слова совсем, настолько у них простая задача. А тут оказалось, что Файрфокс с тремя табами это уже полтора гига! Телега еще 600-800. Неплохо, да? И это нативная, без электрона.

Второй сюрприз ждал меня в самом макосе. Ебучие живые обои жрут 2 гига просто так, всегда, низачем. Даже когда они не живые!!! Я их, конечно, выключил, но осадочек остался.

Ну и остальное набегает по мелочи. То есть еще раз, браузер с тремя (тремя!!!) вуладками и телеграм, и уже скушано 11 гигабайт. И это я еще работу даже не открывал. А вы еще спрашиваете, почему я слак в браузере предпочитаю.

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

Читать полностью…

Стой под стрелой

Тут вышла Балатро под Айос, я решил одним глазком глянуть, ну и заодно попробовать гЕйМиНг нА мАкЕ™. Начал с ноута — скачал, запустил — работает. Играю. Получаю ачивки.

А потом бац – захожу в ачивки, а там 0 из 31. То есть внутри игры они зарабатывались, а в геймцентр не попадали.

Ладно, думаю. Попробую на телефоне. Скачала, запустил — работает. Играю. Ачивки пошли! И даже сейв подтянулся. Только почему-то нет звука.

Но на телефоне тесновато. Идеальный форм-фактор для игры про перекладывание карт — конечно же айпад! Я сначала расстроился, потому что это айпад жены, и придется играть от ее имени. Но потом вспомнил, что в геймцентр можно залогиниться отдельно! Отлично! Скачал (бесплатно, через ЭпЛ-сЕмЬю), запустил — работает. Аккаунт мой подключился, ачивки видно. Только в самой игре прогресса почему-то нет.

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

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

Так что с геймингом в Эпл экосистеме все хорошо. И денег просят немного — всего 6.99 в месяц.

Читать полностью…

Стой под стрелой

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

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

Вот если бы это принудительно на уровне интерфейса сделали, стало бы совсем хорошо.

Читать полностью…

Стой под стрелой

Что Киберпанк (игра) великий, конечно, вам рассказывать не надо, но вот просто один пример.

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

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

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

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

В-третьих, важный момент с камерой. Вся игра происходит от первого лица — ни в каких игровых ситуациях и даже кат-сценах ты не видишь себя со стороны. Ты переживаешь абсолютно все от лица Ви, что очевидно очень хорошо работает для игры. Но в финальной сцене происходит крутой трюк — камера впервые показывает тебя со стороны. Эффект — ну как будто ты дух, который вышел из собственного тела и смотрит на него перед тем, как вознестись на небо. На этом не акцентируется внимание, это выглядит как просто монтажная склейка, но ты шкурой это чувствуешь, как это важно, после ста часов геймплея. Еще более важно — после того, как камера разделяется с персонажем, они уже больше не сольются. История Ви закончилась, вот, посмотри на него последний раз и иди домой. ДАЖЕ КАМЕРА ЕГО/Е БРОСИЛА.

Там есть еще понятные коннотации типа прыгнуть с головой в бездну, неопределенность по поводу сразу он себя застрелил или это самоубийство with extra steps, ну и все остальное на уровне, но еще раз повторю — все сделано максимально мощно, до сих пор мурашки.

Это, вообще-то говоря, редкость для кино даже, а уж для видеоигр и подавно. Хотелось бы как-то дискурса про настоящую кинематографичность в играх, но пока мы на уровне «Horizon/Last of us это пик того что возможно» мы далеко не уйдем конечно. Пусть те кто делал Киберпанк в кино уже пойдут что ли, сил нет следующего Ведьмака ждать.

Читать полностью…

Стой под стрелой

Про обновления: настраивал вчера новый комп. Ну я человек простой — поставил макбук рядом, посмотрел что у меня за программы там и все то же самое скачал. Какие-то существенно скакнули вперед, оказывается, а я и не знал. Ну скачал самое последнее, понятно.

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

Опять же, я человек простой — если мне показать окно, что вышла 17.2.4, а у меня 17.2.3, я спать не смогу пока не обновлюсь. Но если такое окно не показывать, то, оказывается, мне вполне норм. Комфортно, спокойно.

Из любопытного против обновлений: в kitty отвалились шрифты. Раньше они не проверяли их и все работало прекрасно, а теперь «проверяют на моноширинность» и отказываются работать. Кому от этого хорошо непонятно. Но хорошо что есть Эйрдроп и старая версия.

Короче, я понимаю плюсы автообновлений конечно, но и плюсы у «жизни в лесу» тоже есть. Какую версию скачал в первый раз такой и пользуешься всю жизнь — а почему нет, собственно? Если все устраивает и всего достаточно.

Читать полностью…

Стой под стрелой

Кстати попробовал сегодня Claude 3.5 Sonnet, натравил на свой плагин для Саблайма и попросил сделать фичу. Получилось не очень (сначала совсем нонсенс, потом просто несколько нерабочих версий), пока мне не надоело и я не доделал уже сам.

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

По-моему гениально.

Читать полностью…

Стой под стрелой

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

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

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

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

Но больше всего меня добивает, когда интервью перебивается комментариями ведущего. Причем не в разговоре, а как бы «поверх». Типа:

Ведущий (воис-овер): Сейчас Эндрю расскажет нам о том, как он придумал Zig.
Эндрю (разговор): Ну так вот, как я придумывал Zig.

Но это не часть разговора. Реплика ведущего именно что записана потом. Нафига, спрашивается?

При этом в самом разговоре ведущий тоже, конечно, есть:

Ведущий (воис-овер): Сейчас Эндрю расскажет нам о том, как он придумал Zig.
Ведущий (разговор): Эндрю, расскажи, как ты придумал Zig?
Эндрю (разговор): Хорошо.

Но особенно добивает, когда ведущий так же, воис-овером, подводит итог. Типа:

Эндрю (разговор): Ну вот так я Zig и придумал.
Ведущий (воис-овер): Вы только что послушали, как Эндрю придумал Zig.

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

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

Ну и нафига тогда?

Читать полностью…

Стой под стрелой

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

Да, разметка пухнет, но допустим мы с этим окей (надо, на самом деле, еще подумать будет, что с этим делать).

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

Но нельзя писать всякие ховеры и медиа-запросы. Что с этим делать? А нужно просто сделать вид, что можно! То есть технически в голом CSS/HTML нельзя написать <a style=":hover { color: red; }"> или <body style="@media max-width: 600px { ... }>". А берем и делаем вид что можно. И пишем. И работает.

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

В итоге функционально мы ничего не потеряли. Задача решается, сложность реализации такая же, а сложность системы в целом уменьшилась — не нужен вот этот вот язык с .mt-77.pd-284.fg-[#flkjlkfds], не нужно его учить, не нужно знать как он мапится на CSS. Нужно знать и учить одну вещь, а не две. Копи-пейст компонентов из примеров работает ровно так же. То есть стало строго лучше.

Ну что, есть такое уже? Наверняка есть. Как называется?

Читать полностью…

Стой под стрелой

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

Это правило, которое мы все негласно понимали и соблюдали до недавнего времени. Даже в мобилках, где места мало и вроде бы сам бог велел, старались все-таки табы сделать, между которыми можно мнгновенно переключаться. За исключением, может быть, каких-нибудь Settings, где только список опций на 14 экранов.

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

Один из самых ярких нарушителей — System Settings в Ventura. Было как – открываешь System Preferences и видишь сразу все вообще возможные иконки. Кликаешь на одну и проваливаешься в, собственно, настройки. Там иногда тоже пара-тройка экранов, и тогда внутри табы. Но любая опция, которая тебе нужна, сразу в прямой доступности и на фиксированном месте. И ее, блин, видно! Эплы даже само окно System Preferences научили менять размер под текущую панель, чтобы не дай бог скролл не появился.

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

Но ощущение еще ладно, но иногда внизу скролла спрятаны реально нужные опции. Например, Wifi. Сверху переключатель вкл/выкл, потом текущая сеть, и после них длинный список «других сетей». Ладно, думаешь, наверное он так до конца и идет. Но нет! Если промотать два-три экрана вниз (а мотается весь интерфейс целиком, как веб-страница, т.е. переключатель и текущая сеть, например, в этом случае уезжают), ВНЕЗАПНО под ним окажется еще два переключателя, кнопка подключения к сети по имени и кнопка Advanced. Но об этом в жизни невозможно догадаться! Если у вас есть длинный список всякого говна, он должен идти последним элементом, а не в середине.

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

Другой момент сравнимого позора — интерфейс печати, которые в той же Ventura переделали. Было как — ну квадратное окно с табами, типа, Media & Quality, Layout, Paper Handling и т.д. А стал опять проматываемый интерфейс. Но в этот раз даже хуже — они все сложили в один длинный вертикальный список, который да, скроллится. Но пункты в этом списке еще и свернуты по умолчанию! Т.е. ты и поскроллить нормально не можешь, и на пункты нормально посмотреть не можешь. Тебе надо И скроллить, И целиться в маленький шеврон, разворачивающий группу. И все это ездит туда-сюда и раздвигает соседние пункты, т.е. ничего не фиксировано и постоянно меняет положение. Ужасно.

Кстати, какой-то здравомыслящий человек в Эппле где-то нашелся, потому что кнопка «Печать», собственно, самая главная, вынесена из скролл-контейнера. Если уж следовать принципу «делаем все максимально идиотско и неправильно», то она должна была бы быть в конце скроллящегося списка и ее не должно было быть видно изначально. Но, может, пользователи возмущались, поэтому испортить диалог получилось не на 100%.

Правило все еще действует — контент скроллится, интерфейс нет. Это удобно, это логично, это кайфово. Просто на Эпл не надо ровняться, они больше пургу гонят посленднее время.

Читать полностью…

Стой под стрелой

Запускал вчера по воле случая Дискорд, и у них там плашка про Хэллоуин вылазит. И вот что подумал:

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

«Ой, смотрите, у нас новая фича!». «Ой, устанавливаю апдейты! 1/15» «Ой, мы обновили тему» «Ой, у нас новый интерфейс» «Ой, хуюлька переехала в пиздюльку» «Ой, вы давно не смотрели нотификации» «Ой, а релиз ноуты прочитали? Ну а вдруг нет. На всякий случай напоминаю»

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

А мне и представлять не надо. Сегодня все пытаются из программы сделать «продукт» и занять угол в вашей голове. Даже браузеры.

Читать полностью…

Стой под стрелой

Кстати, смеха ради, попробуйте найти JettyWebSocketServletContainerInitializer.java и понять, что он делает. Там сто строк кода, они все тщательно (больше половины строк — комменты) задокументированы, присутствует логгирование, проверки на null, лицензия.

НО ЧТО ОН, СУКА, ДЕЛАЕТ-ТО???

Единственное осмысленное, что я смог понять, это что ему могут передать штуку (тот самый configurator), он ее сохранит и потом вызовет (accept). Почему ее не может вызвать тот, кто ее создал, зачем для этого целых два класса (один вложенный) на 100 строк — загадка.

Читать полностью…

Стой под стрелой

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

И не то чтобы я их не подключал к питанию — за этот месяц они заряжались раз десять-пятнадцать. Просто не ночью.

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

Жаль что его нет, конечно.

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

Читать полностью…

Стой под стрелой

Забыл сразу написать, а это важно. Тут возникла дискуссия, что надо делать «фичи» (пагинацию, поиск, фильтры), а я не согласен.

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

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

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

Кажется, что без фич мы ограничили пользователя в возможностях, а на самом деле мы его освободили.

Читать полностью…

Стой под стрелой

Заглянул в Джиру (я знаю, я знаю) и увидел показательный пример. Там можно выбрать фильтр кнопкой More и выпадайкой с дополнительными фильтрами. Типа, те, которые на панель сразу не поместились.

Знаете, сколько там фильтров? 78. Знаете, сколько показывается за один раз? 10.

Да, 10. Де-сять. Десять.

Еще десять можно получить по кнопке More. И так далее.

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

НО. Не надо доводить ее до абсурда. С одной стороны, вы пихаете в браузер 43 мегабайта джаваскрипта (да, я проверил, не поленился). А с другой боитесь загрузить список из 78 элементов. Линейный список! Коротких строк по 10-15 символов.

Знаете, сколько занимает весь список, целиком, от начала и до конца? Из всех 78-и элементов? 100 килобайт! (это DOM, это плохо, но чего еще вы ожидали от Жиры?). ^W^W 1 килобайт. ОДИН! КИЛО! БАЙТ!

Это примерно (достает калькулятор) в 43000 раз меньше, чем джаваскрип, который вы только что не моргнув глазом загрузили. Сорок. Три. Тысячи. Раз. Три с половиной порядка! (UPD: четыре с половиной!)

Какой из этого вывод? Да, сделать 10 элементов кажется максимально естественным решением. Цифра красивая. Но в большинстве случаев это преступно мало. Я бы хотел, чтобы нормализовали 1000, но браузеры и так еле-еле шевелятся, поэтому давайте сойдемся на сотне.

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

Читать полностью…

Стой под стрелой

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

А на деле это обычно с потолка взятая цифра, которую за три секунды кто-то придумал. Типа, «нам надо обрабатывать 5000 запросов/секунду». Почему именно 5000? А если 10000 обработаем? А если 1000? Не то чтобы решения будут сильно разными, и не то чтобы кто-то специально будет программу замедлять. Команда напишет код to the best of its abilities, купят сервачок какой-нибудь, а там херакс — и 100,000 вместо 5000 получится. И чего? Обратно отдавать куда-то?

В обратную сторону тоже верно. Написали, получилось тысяча — что теперь, не запускаться? Запустятся все равно, один фиг столько пользователей на старте не будет. А потом посмотрят, сколько придет.

То же самое с reliability, и с дедлайнами, с временем отклика. Все будут стараться, но получится как получится, и запуск будет все равно.

А еще иногда кто-нибудь выходит и говорит гордо: we’ve met our requirements. Типа, выполнили требования. А ты смотришь и видишь — фигню какую-то сделали. Типа, сайт три секунды открывается. А он такой — так у нас и были требования чтобы три секунды.

Ну и нафига тогда требования?

Читать полностью…

Стой под стрелой

Одна из вещей, которые расстраивают меня в связи с искусственно-интеллектуальной революцией это то, что когда мы научим компьютеры программировать (а все к тому идет), то они будут программировать примерно на том, что есть сейчас. Тот же Питон, тот же Джаваскрипт, тот же DOM, с которым они будут бороться. Они научатся гуглить баги браузеров, чинить питоновские зависимости, тратить ресурсы, запуская код на динамических языках и кодируя картинки в base64.

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

Но этого не будет, конечно. Вот и расстраиваюсь.

Читать полностью…

Стой под стрелой

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

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

Как надо? Рисуйте ту же полоску снизу, а не поверх. Там нужно 40 пикселей, камон, как-нибудь впихнете. Заодно ховер не нужен будет — можно всегда их показывать. Заодно градиент не нужен будет, не будет портить видео (божечки, как меня бесят эти черные полупрозрачные градиенты поверх всего). А главное — можно будет поставить на паузу и рассмотреть _контент_, то, ради чего мы сюда, собственно, пришли. Нас не интересуют ваши контролы, у нас нет цели управлять видео, мы хотим посмотреть, что нам показывают. Как бы, эээ, приоритеты?

Еще смешнее, если записать кусочек экрана высотой 100-200 пикселей и открыть запись в КвикТайме. У него панель даже к низу не прибита, и высокая как сволочь. Короче, она просто поверх видео целиком считай, по 10 пикселей контента видно в щелях по бокам и все. При этом само видео довольно маленькое, 90% экрана пустует, но нет, надо залезть своими контролами на мой контент. А ведь раньше было нормально! Но почему-то все решили, что контролы должны плавать.

И такое везде. В фотках. В интернет-магазинах. В картах. В гугл-картах, если открыть фотку заведения, все 4 угла будут заняты какими-то там контролами, а саму информацию в этих углах фото ты так никогда и не увидишь.

В телефоне — айфоновская камера показывает видоискатель на весь экран, например, с контролами поверх, собственно, видео. Да, видео в этом случае занимает большую площадь, но _выстраивать кадр_ сложнее, потому что контролы мешают. А теперь подумайте, какая у вас задача — чтобы пикселей побольше использовать или чтобы видео хорошее получилось?

То-то и оно. Не надо бояться уменьшить область контента и нарисовать контролы сбоку. Как, выглядит на первый взгляд не так секси. Зато удобнее в разы.

Читать полностью…

Стой под стрелой

Самый непоянтный мне продукт — Дискорд. Понятно, что предложение выгодное — разворачивай комьюнити нахаляву, соответственно и популярность. Но интерфейс взрывает голову каждый раз.

Я тут съездил на Heart of Clojure (Сердце, получается, Кложи) и там все было через дискорд сервер. В прошлом у меня были проблемы даже чтобы инвайт принять, потому что ты открываешь ссылку, она просит скачать приложение, ты открываешь приложение, там опять ссылка на сайт, он опять просит приложение, приложение начинает обновляться... Но в этот раз более-менее безболезненно прошло.

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

Ладно, думаю, наверняка надо просто пойти и какую-то настройку поменять. Настройку я не нашел (но она есть, тут мой тупняк), поэтому замьютил все каналы по отдельности.

Нотификации продолжали валиться. Потому что то ли я не все каналы видел, то ли новые добавили (я, кстати, до сих пор так и не понял). И тут стало веселее: я вижу нотификацию. Захожу в приложение. И не вижу, откуда она! То есть нигде нет красного этого ебучего кружочка.

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

Извинился перед организаторами (я буквально ворвался в чей-то митинг! Из-за интерфейса!) и с горем пополам нашел кнопку выйти (она микроскопическая если что).

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

И на эту же тему — сегодня же случайно обнаружил, что у меня два непрочитанных DM-а с конфы. То есть присылать нотификации с каналов, в которых ты не состоишь, мы умеем, а присылать нотификации про директ, ДИРЕКТ блять, когда человек ЛИЧНО ТЕБЕ пишет, так у нас сразу лапки?

Серьезно, кому в голову пришло, что разумным дефолтом может быть нотификации на все сообщения во всех каналах (а не @mentions, кто хочет читать ВСЕ?) КРОМЕ прямых сообщений лично тебе.

Ну и последняя мелочь — выбранный текущий канал выделяется более светлым шрифтом, ровно как и каналы с непрочитанными сообщениями! Ерунда, но добавляет замешательства. Хочется сбросить эту «непрочитанность», а сбрасывать нечего.

Все это приправлено сверху ровным слоем рекламы. Потому что жить на что-то надо.

Такой вот у меня Discord Experience. Как ваш день?

Читать полностью…

Стой под стрелой

Надо поговорить про Кложу, а не с кем, поэтому поговорю с вами.

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


:keyword
"string"


Кайфа два: во-первых, сравнение очень быстрое (достаточно сравнить указатели), во-вторых, это семантически другой тип, у него другие паттерны использования. Строки создаются динамически и используются для ввода-вывода, а кейворды — обычно заранее статически известны и используются как ключи в мапах и как low-ceremony enum что ли. И то, что они визуально по-другому выглядят, помогает читать программу.

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

Ну вот. Сидели мы с этими кейвордами, не тужили, и тут приходит Рич (создатель Кложи, между прочим, не хуй собачий) и говорит: ребят, кейворды хорошо, но знаете что еще лучше? Глобально уникальные кейворды!

Типа, у тебя был http-запрос:


{:uri ...
:headers ...
:body ...}


А было бы лучше (по Ричу), если бы было:


{:ring.request/uri ...
:ring.request/headers ...
:ring.request/body ...}


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

Типа, будет меньше коллизий. И действительно, в том же Ring-е есть response, у которого внезапно тоже :headers и :body. Но я не вижу, как это может быть проблемой. Типа, да, теоретически ты можешь слить request и response в одну мапу, но это мега-странное действие, как в ООП языке сделать объект, который наследуется сразу и от запроса, и от ответа. То есть ситуаций, когда ты сливаешь две мапы разного типа, как-то особо и не должно происходить вроде.

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

Другой аргумент это что по такому кейворду легко узнать, откуда он прилетел. Опять же, с одной стороны да, но с другой как будто у тебя всегда есть контекст все равно, у объектов есть названия, ты, короче, видишь, что почем и у случайного объекта случайное поле вряд ли появится. Это как в ООП, локальные поля объекта же без неймспейса описываются, потому что обычно рядом тип написан. Было бы странно, если у TUser были бы поля t_user_name, t_user_password. Излишне. Нет такой ситуации, в которой ты по полю пытаешься определить тип объекта. А Рич как будто к этому как раз и взывает.

И тут наконец появляется настоящая причина: Ричу надо было сделать Clojure Spec, библиотеку валидации, и надо было к чему-то привязать правила. И они решили, что все ключи теперь будут глобально уникальными, и что это FOR THE GREATER GOOD.

Но, честно говоря, можно было бы сделать и по-другому. Писать длинные ключи довольно сильно лень, бонусов я так и не увидел, с поиском они дружат довольно плохо (все, редактора больше недостаточно — теперь нужна IDE), и, главное, все прекрасно работает и на старых, коротких кейвордах.

А писать ключам неймспейсы — это как просить все локальные переменные делать глобально уникальными, потому что let a внутри функции f() это совсем не тот же let a который внутри функции g(). Ну да, не тот, но проблем-то от это не появляется!

Читать полностью…

Стой под стрелой

Был на выходных в Лейпциге, ну и надо было билет на трамвай как-то приобрести. Я, конечно, не дурак, чтобы в самом трамвае купюру в автомат совать – я же айтишник! Я скачал приложение.

Ну и в общем сообщаю вам, что билет на трамвай покупается суммарно где-то в 20 шагов примерно. Типа, надо

- зайти в Апстор,
- скачать приложение,
- подтвердить лицо,
- зайти в скачанное приложение,
- зарегистрировать аккаунт,
- сходить на почту,
- подтвердить аккаунт по ссылке (откроется браузер),
- перейти обратно в приложение,
- залогиниться,
- выбрать «купить билет»,
- выбрать способ оплаты,
- открыть сайт пэйпала,
- ввести логин/пароль,
- чтобы это сделать, надо сходить в приложение 1password и _там_ тоже ввести пароль,
- зайти на пейпал,
- подтвердить аккаунт в приложении пейпала (да, это другое, то был САЙТ),
- еще раз подтвердить лицо (спасибо, что не пароль),
- вернуться на тот временный браузер с пейпалом в приложении с билетами, т.к. конечно приложение пейпала о нем не знает,
- нажать купить,

Ну и все вроде. Изи катка.

Если посчитать, в процессе участвуют:

- Апстор
- Почта
- Приложение с билетами
- Браузер
- Приложение пейпала

То есть пять принципиально разных приложений.

Если еще посчитать, то доказывать что я это я мне пришлось пять раз. На моем собственном телефоне, между прочим!

Если коротко попытаться описать этот опыт, то это минут 5-10 очень сильного концентрированного фокуса и стресса.

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

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

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

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

Читать полностью…

Стой под стрелой

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

А я до сих пор НЕ ПОНИМАЮ.

Вот чисто на прошлой неделе, чем я занимался:

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

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

Потом ловил и чинил баг в библиотеке Mapbox. Опять же, природа багов такова, что про них нигде не пишут — если бы на баги была документация, они были бы фичами. А ИИ, понятно, учится на том, что написано, а не на объективной наблюдаемой реальности.

И вот сейчас пилю текстовый ввод с автодополнением на CodeMirror. Не самая последняя библиотека, но достаточно редкая, чтобы ИИ не мог про нее ничего внятного ответить. Но он не молчит конечно, просто плюется своими фантазиями об АПИ, которых никогда не было и нет.

Так это. Как ИИ должен помогать кодить-то? Я тоже хочу на хайп-трейн. Нужно несложные интернет-магазины пойти делать или что?

Читать полностью…

Стой под стрелой

Вообще к Тейлвинду есть еще одна претензия, которая на фоне всего остального мелочь, но зато универсальная, можно применять везде. Это сокращения.

Так вот, сокращения — отстой. Не надо экономить буквы. Не надо писать pl-0 mt-1 w-px когда можно написать padding-left: 0; margin-top: 4px; width: 1px;. Какая в сокращениях польза? Никакой. А вреда много.

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

А потом приходит программист и такой: чет padding-left длинновато, давайте писать pl вместо этого. Ну да, места ты немножко сэкономил. Но теперь глаз не может быстро считать, ему нужно останавливаться, вглядываться, включать медленное мышление. Речевые центры не задействованы, десятилетия привычек не помогают, и все ради того, чтобы какой-то Вася когда-то чуть меньше кнопок нажал.

Очевидно, что если бы язык можно было бы как-то просто и легко улучшить, это бы уже сделали. Если бы мы читали pdnglft так же легко и быстро как padding-left, то все газеты и книги уже писали бы так. Однако этого почему-то не происходит. Почему?

Все горячие головы из компьютер сайнс, кто когда-то не подумал и сэкономил на спичках, насколько мне известно, впоследствии сожалели об этом. Зато благодаря ним у нас до сих пор есть такие шедевры, как /usr вместо /user, referer вместо referrer, setjmp, longjmp, k8s и много чего еще.

Я и сам побывал в этой шкуре. У меня есть библиотека для интернационализации, и мне нужен был формат для даты-времени. Я, понянто, посмотрел на prior art и чуть не сделал так же. Ну а что, yyyy — длинный год, yy — короткий, M — месяц, m — минута, mm — минута с нулем. Все знают, всем понятно.

А потом посмотрел на это, подумал — господи, ну что за идиотизм? И сделал нормально:


(tongue/inst-formatter "{month-short} {day}, {year} at {hour12}:{minutes-padded} {dayperiod}" inst-strings-en)


И как же стало хорошо!

В общем, мой вам совет — не экономьте на буквах. Оставьте однобуквенные переменные математикам.

Читать полностью…

Стой под стрелой

Бирман снова великий. В подкасте «Думаем дальше № 23: Отделы дизайнеров с пипетками» он рассказал про концепцию дизайна как эволюции.

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

Вы все знаете миллион таких примеров. Я помню, как Букинг хвастался тем, что в любой момент времени у них одновременно проходит под сотню А/Б тестов, а мы смотрели на это и говорили: ребят, ну очевидно же фигня получается! А они — зато по данным!

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

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

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

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

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

Самое веселое в том, что эволюционный дизайн первым заменят нейросети, потому что он прекрасно автоматизируется. Хэй Сири, придумай мне 10 вариантов расположения надписи «3 человека смотрят этот отель прямо сейчас, а осталось всего две комнаты!». Выкладываешь, меряешь, и если что-то выстрелило — мержишь в мастер. Зачем в этом процессе хоть где-то человек? Правильно, незачем.

Будущее полно надежды как никогда.

Читать полностью…

Стой под стрелой

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

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

А предшественницы-то у нее были? Как же — были… Больше скажу: и Кложуры бы не оказалось никакой, если бы я не полюбил в одно далекое лето один изначальный язык. В некотором княжестве у моря (почти как у По).

Когда же это было, а?

Читать полностью…
Subscribe to a channel