Давно не трогал SQL, все больше даталог или вообще просто GUI разработка, а тут пришлось. И я, оказывается, забыл, какой это бредовый язык.
Основной бред это, конечно, текстовые запросы. Понятно, что это удобно (было когда его придумывали) чтобы, как там, бухгалтеры сами себе запросы к базе писали на естественном языке. Но блин, 50 лет уже прошло, весь мир на нем работает, неужели нельзя было за это время что-то более machine-friendly придумать? И самое смешное что запросы руками как раз никто не пишет, все ходят из программ, но обе стороны притворяются, как будто это бухгалтер ручками набил — и программист, и база.
Понятно, SQL-инъекции, которые из этого проистекают — стыд. Подсчет запятых и скобок — стыд. Куча бесполезных ресурсов, которые обе стороны тратят на парсинг «естественного языка» — ебаный стыд.
Но больше всего меня удивило, что эти запросы еще и хреново кешируются. Ну там, допустим,
SELECT * FROM users WHERE name = ?
SELECT * FROM users WHERE role IN (?, ?, ?, ?, ?)
Читать полностью…
WITH LOOKUPS (attr, value) IN VALUES (('a', 1), ('b', 2), ...)
Пора признаться: за двадцать лет в айти я так и не понял, зачем нужен второй монитор. Я пытался, много раз, да и сейчас, технически, у меня есть экран макбука, но опыт показывает, что я ими не пользуюсь. Все, что нужно, я ставлю на первый, а если ставлю что-то на второй, то моментально про это забываю.
Эвристика простая: есть довольно узкая область прямо перед тобой, в которую тебе удобно смотреть. Все что вовне — надо менять позу, или смотреть издалека под углом, в общем, удобно для какой-то второстепенной информации, но не для той, с которой ты прям работаешь.
Да, если работаешь с вебом, удобно поставить код и браузер рядом. Но это помещается на один (нормальный, не ноутбучный) экран. Ну и все.
Если работаешь с графикой, то удобно развернуть канвас максимально, потому что панели, например, в Фигме, занимают неприлично много места. Поэтому, скажем, два монитора рядом это не то же самое что один, но побольше.
На второй экран можно вынести, например, Слак. Но тогда он или будет тебе постоянно отвлекать, или ты научишься его игнорировать. А если тебе надо в нем прям поработать, что-то интенсивно обсудить, на соседнем мониторе это будет менее удобно, чем на основном. И вообще, мне кажется, это какая-то нездоровая фигня, работать с постоянно открытым чатом.
Можно вынести логи, да — но тогда, опять же, когда они тебе правда нужны, за ними будет неудобно тянуться, а когда не нужны, то что толку что они перед глазами?
Короче, я так и не понял, зачем нужен второй монитор. Но один — настолько большой, насколько вы можете себе позволить — конечно, незаменим.
В комментах к посту про Island of Insights скинули ссылку на блог Doredel (Аня играет в игры), и я там подзалип (рекомендую!), а также нашел 14 Minesweeper variants, про которую я даже не слышал и которая ровно то, что я искал — видите, чудеса бывают!
А сегодня решил сделать зеркалочку на пост оттуда «Что не так с Rogue-like играми». Аня их не любит, а я наоборот, в не-rogue-like играть почти не могу. Итак, что ТАК с Rogue-like играми.
Основная проблема с мейнстримными играми в том, что в них есть win condition, но нет lose condition. То есть как бы плохо ты ни играл, через положенные 8-16 часов ты доберешься до задуманной авторами концовки. Каждую ситуацию тебе достаточно пройти _хоть как-то_ один раз, а если не получится — загрузился и попробовал снова. Если ты не игровой журналист, рано или поздно ты пробьешься через любую преграду.
И в какой-то момент меня это стало жутко бесить. Потому что — если игра все равно пройдется, что бы я ни делал, то зачем там я? В чем, так сказать, смысл? Я как-то пытался поиграть в Call of Duty, включил, посмотрел кинцо, мне дали автомат, рядом взвод коллег, я начал разбираться, какая кнопка что делает, а они раз-раз и все зачистили. Прикольно, ребят, я вам не мешаю?
Или вот прямо сейчас прохожу Космическую Марину-2. И там есть задания, когда нужно защищать какие-то колонны от Тиранидов. Они, типа, их облепляют и грызут, и вот нужно не дать сгрызть. Прикол в том, что что бы ты ни делал, это ни на что не влияет — стреляешь по ним, вроде кто-то падает, но меньше их не становится. А потом, по таймеру, видимо, просто все падают разом и задание считается выполненым. Ощущение, что тебе дали подержать автомат с игрушечными пулями. Если бы я был ребенком, я бы, наверное, впечатлился, но я-то не ребенок.
Финансовая мотивация и mass appeal понятны. Было бы странно добровольно отдавать 70 евро, запускать игру, а игра тебе говорит «ты лох» и тут же убедительно это доказывает. То есть, любители, конечно, и на такое найдутся (см. Дарк Соулс), но это явно не может быть массовым, дефолтным состоянием.
Ну вот, а я, похоже, перешел в разряд этих самых любителей. Ключевым для меня в роглайках стало то, что качаешь ты не персонажа, а себя. То есть игра фиксированная, и единственный способ продвигаться — становиться лучше. Это придает смысл всему процессу, что ли.
Помню, как запускал Дед селлс в первый раз, и как страдал на первом уровне, не мог увернуться от зомби и стрелков, и как радовался, когда получалось дойти до второго уровня, и как мечтал, что когда-нибудь, может быть, увижу третий. И как сейчас, 200 часов спустя, если начинаю новый сейв, прохожу через первые уровни как нож через масло, удивляюсь еще, почему они начало таким скучным сделали, противники мебель какая-то неподвижная.
Так вот, весь этот прогресс — он исключительно внутри меня произошел. Игра тут вообще ни при чем, игра не изменилась. И поэтому, кстати, это единственные игры, которые заставляют меня залипнуть на сотню часов — создание новых нейронных связей процесс небыстрый.
В общем-то, все остальное вторично. Пермасмерть и рандомная генерация уровней нужны только затем, чтобы заставить тебя пройти через процесс самопрокачки, они средства, а не цель. Можно, наверное, и без них — Дарксоулсы, например, не генерят уровни, но прокачивать себя заставляют. А Диабла, например, при всей своей рандомности не цепляет, потому что скиллчека нет — что бы ты ни делал, монстры мрут пачками все равно.
А так в статье про недостатки все верно написано: рандомная генерация это от дешевизны, конечно, сложность балансировать сложно (запускал как-то Monster Train, прошел его с первого раза, хмыкнул и закрыл), играешь по сто раз в одно и то же.
Но что делать, в обычных играх «на прохождение» смысла еще меньше.
«Программистам не нужны шорткаты. Средний программист коммитит 40 строк в неделю, большинству еще оооочень далеко до точки, в которой шорткаты начнут хоть как-то помогать»
Читать полностью…Я уже рассказывал, как с удивлением обнаружил, какие игры мне нравятся, и это не обязательно те, которые я бы хотел, чтобы мне нравились. Например, я даже PS5 решил продать, потому что понял, что ну не заходят мне игры-морские свинки — это когда игра и не кино, и не игра (то есть без геймплея).
Сегодня порекомендую вам такой странный тайтл как Islands of Insight. Там все неправильно — начиная с того, что это «квест-паззл», работающий как ММО. То есть это огромный мир-хаб, и пока ты решаешь загадки, вокруг тебя бегают другие игроки (сейчас, кажется, сервера отрубили и остался только оффлайн).
У тебя есть персонаж, которого надо прокачивать (опять таки, в паззле!)
В добавок к этому он некрасивый. Точнее, графика-то там ого-го (Пазл! Требовательный к видеокарте!), он скорее неизящный какой-то, безвкусный.
Многие пазлы в нем оскорбительны своей примитивностью (найди скрыты объекты! пробеги трассу на скорость! запомни расположение квадратиков! сопоставь фотку с пейзажем!) и явно являются филлерами.
И все же, и все же. Все это можно (и нужно) перетерпеть ради, собственно, пазлов. Вот те, которые с черно-белой доской, вот они главное блюдо и жемчужина, единственное, что сделано безоговорочно хорошо и, собственно, делает игру имеющей смысл.
В них вам дают доску, которую нужно заполнить черными и белыми квадратами. Правила меняются (например, все черные регионы должны иметь площадь 2. Или все белые должны быть соединены. Или возле вот этих квадратов должно быть 4-5-6 квадратов того же цвета), но формат остается. Казалось бы, ну сколько можно в таких ограниченных условиях придумать пазлов? Оказывается, тысячи! И они интересные, прям их решение это отдельный кайф: есть по-проще, есть по-сложнее, есть, где надо догадаться до какого-то принципа, и к концу игры ты с парой десятков этих принципов, которые постепенно открывал, решаешь уже мега-доски.
Короче, звучит наверное непонятно или скучно, но на деле затягивает как наркотик. Похоже на судоку или hexacells — большая проблема, и ты сидишь и пытаешься логически понять, в заданных условиях, что-то однозначно верное про доску. Обычно это всего один или два возможных «следующих шага» в рассуждении, и именно их надо найти. И так, шаг за шагом, ход за ходом продвигаешься по чуть-чуть, пока все не решишь.
В общем, странный зверь. Наверное, на это был бы похож The Witness, если бы Джонатан Блоу в какой-то момент не сказал себе «Пазлы самоценны, не надо как-то дополнительно развлекать или мотивировать игрока» и продолжил добавлять контент любой ценой. Но — еще раз — пазлы с досками 100% legit, я фанат и готов ради них терпеть все остальное. Другие пазлы или треш, или ну такое (там есть несколько других видов логических пазлов, но они мне не зашли).
Я даже думал натырить пазлы оттуда и выложить куда-нить в интернет, потому что UI там реально максимально базовый. Пока рекомендую как есть — вдруг вам тоже надо именно такое.
Ну и да, хочу еще, где бы взять.
Понял кое-что про цветовые схемы.
Смотрите. Если у вас классическая светлая тема, то цвета текста надо брать темные — темно-синий, темно-зеленый, темно-сиреневый. Ну потому что фон светлый.
А темные цвета что? Правильно, некрасивые. Например, в дефолтной Light у JetBrains весьма неприятные синий, темно-сиреневый, темно-бирюзовый (буэ) и даже темно-желтый кое-где есть. Я какое-то время думал, что они просто плохо их подобрали, но вчера осознал, что это принципиальное ограничение, которые вытекает из необходимости контраста.
А вот если у вас темная тема, то и использовать вы можете самые классные цвета, свежие, яркие, насыщенные. Просто потому что _все_ цвета лучше выглядят в светлом варианте.
Так мы научно обосновали преимущество темных тем перед светлыми.
Также я понял, что когда-то подсознательно выкрутился из этой патовой ситуации, сам того не осозновая. В моем Alabaster используется «подсветка фоном». Т.е. текст всегда остается черным, а если надо выделить, например, строки, то выделяется фон вокруг них. И вот при выделении фоном контраст как раз не нужен, и можно опять же использовать чистые светлые зеленый-желтый-голубой-сиреневый _в светлой теме_. И кайфовать.
Ну и вдогонку, чтобы два раза не писать. Когда начал разбираться с цветом, наверняка, как и многим другим, мне пришла в голову «гениальная» идея сделать идеально сбалансированную цветовую схему. Типа, взять OkLCH, зафиксировать яркость и насыщенность и сгенерировать пять-восемь цветов равномерно распределенных по цветовому кругу. Ну и получится идеально сбалансированная, математически точная цветовая схема.
И знаете что получилось? Что цвета хрен отличишь друг от друга. Потому что натурально, яркость одинаковая, насыщенность одинаковая, а к оттенку наш глаз сильно менее чувствителен. Смысл выделения не в том, чтобы все выглядело одинаково, а в том, чтобы все выглядело по-разному, _выделялось_.
Но попробовать все равно стоило. Хотя бы ради инсайта.
В любом нормальном языке можно работать с путями до файлов. Только иногда пути это просто строки (String), а иногда — специальные классы (File, Path и т.д.).
Так вот, сколько я на это смотрю, так и не понял преимуществ оборачивать пути в классы. Над строками работают все обычные операции со строками — склеить, поделить, интерполировать, сериализовать. А на «путях» — нет. Существование таких классов как правило только возни добавляет. Преимущество делать new
Path(path
Str).exists()
вместо Path.exists(path
Str)
довольно сомнительное.
Может вы знаете? Объясните?
UPD: поменял File на Path чтобы было понятнее
На кейсе от аирподсов есть лампочка, которая иногда горит зеленым, а иногда — оранжевым. И вот после трех лет использования я сдался и загуглил, что же она показывает.
Ожидание: лампочка горит оранжевым, когда кейс пора заряжать. Ну, типа, как на ЛЮБОМ другом устройстве.
Реальность: лампочка горит оранжевым, если она заряжает наушники. То есть, по сути, всегда: если я складываю в кейс наушник, значит я им только что пользовался, а значит он чуть-чуть, но разряжен.
С другой стороны, может я какое-то время носил кейс и решил достать наушник. Но в этом случае мне глубоко пофиг, насколько он там зарядился: если я решил достать наушник, значит я его достану. Вывод: в лампочке смысла нет в обоих случаях.
Как же тогда узнать, когда пора заряжать кейс? Очень просто, следите за руками:
Включаем телефон
Разблокируем телефон
Выходим в хоум скрин
Подносим кейс к телефону
Открываем кейс
Трогаем экран, чтобы телефон не успел заблокироваться
Ждем
Ждем
Открываем-закрываем кейс пару раз НА ВСЯКИЙ СЛУЧАЙ
Перемещаем его в пространстве вокруг телефона, трем об спинку, постукиваем, пытаемся приложить к чему-то чувствительному внтури
Сомневаемся в собственной адекватности
Ставим под сомнения каждый жизненный выбор, приведший нас к этой ситуации
О, окно с уровнем зарядки появилось!
Но это только если кейс не сдох совсем в ноль, тогда секунд через 30 ты догадаешься это проверить по лампочке (она не будет включаться совсем)
Никита, но есть же виджеты, показывающие уровень заряда? Есть. Но они показывают заряд в произвольный момент времени в прошлом И НИКАК ОБ ЭТОМ НЕ УВЕДОМЛЯЮТ. То есть 37% на виджете легко может означатт «в среду в семь утра на прошлой неделе уровень заряда был 37%». И никак об этом узнать нельзя.
И все это ради того, чтобы не делать нормально одну гребаную лампочку.
Честное слово, как Ватсон не мог без трубки, так и пользователи Эпла не могут ПРОСТО взять и чем-то пользоваться. Эпловоды должны страдать.
«Код должен читаться как книга». Ну что за бред. Конечно же нет.
Книга — это LinkedList. Единственный способ ее потребления — слово за слово, по порядку.
Код — это HashMap. Он читается с произвольного места, у него нет линейного развития, начала и конца.
Даже просто внешний вид кода — по одному выражению на строку, огромные меняющиеся отступы, несогласованные предложения, сильно расширенная пунктуация — должен намекнуть, что это совсем не книга. Единственное, что есть общего у книги и кода — буквы.
Этот пост напоминает вам об опасности аналогий. Плохая аналогия отдалит вас от правды, а не приблизит. Прямо как котенок с пуговицей.
Главное правило интерфейсов: если у вас нарисована скрепка и я на нее нажму, должен открыться диалог выбора файла. Не меню какое-то, а выбор файла.
А то некоторые любят там пофантазировать: какие-то «недавние» файлы предлагать, или дробокс с гугл драйвом, или еще как-то, или вообще не файлы тоже туда засунуть. Слак так делает, Телеграм так делает, Whatsapp, FastMail, Notion. Не надо так!
Во-первых, я никогда не буду прикреплять файлы из какого-то стороннего сервиса, потому что я ими не пользуюсь.
Во-вторых, если бы и пользовался, вы все больные там, если думаете, что я буду полагаться на какую-то интеграцию. Наверняка там надо восемь кругов ада пройти чтобы условный Слак узнал про условный Гугл Драйв, наверняка за этим никто не следит (потому что фича бесполезная), наверняка оно работает кое-как. Нет уж, у меня есть руки, я сам могу файл откуда надо достать и куда надо положить, спасибо, не надо мне помогать.
В итоге скрепка с меню — это еще один бесполезный шаг, который мешает нормальным людям прикрепить файл. Не надо так.
Провел выходные за оптимизацией Java кода. Периодически слышу, как люди говорят «JVM может быть быстрой», и я в целом им верю, но какой ценой?
Например, смотрел доклад, и там чел говорит: ну вот, JVM любит когда ты код попроще пишешь, и не любит по-сложнее. Когда массивы-индексы-примитивные типы так вообще хорошо.
Проблема в том, что это не точные инструкции. Например, сходить в другой класс прочитать поле или даже вызвать несложный метод может быть бесплатно. А может и нет. Как узнать? Никак, пробовать. Вчера мой код начал работать в 10 раз медленее просто потому, что я какую-то переменную перенес из локальной в поле класса. В 10 раз! И только одну конкретную переменную. Пять других перенеслись прекрасно. ПОЧЕМУ?
И в итоге ты не работой занимаешься, а шаманством каким-то, перестановкой инструкций наугад. Я уважаю научный метод, гипотеза-эксперимент, вот это все, но это не он, это уже граничит с магией. Если честно, неудобно даже как-то называть себя инженером после такого.
Закончилось все тем, что я написал версию, которая работает за 50 микросекунд на ASCII файле, но если запустить ее на файле с не-ASCII символом, а потом снова на ASCII, то она начинает работать за 100 микросекунд. То есть еще раз, тот же вход, та же функция, просто начинает работать в два раза медленее если кто-то где-то однажды позвал ее на другом файле.
А потом выйдет новая версия и все опять начнет работать по-другому. Или не начнет. Потому что гарантий никаких нет, а внутри магия.
Вчера случился передоз фронтендом, который я не понимаю, если честно, на каком-то фундаментальном уровне.
Во-первых, я обновил npm на какую-то минорную версию, и теперь при старте приложения вижу это:
(node:45421) ExperimentalWarning: CommonJS module /opt/homebrew/lib/node_modules/npm/node_modules/debug/src/node.js is loading ES Module /opt/homebrew/lib/node_modules/npm/node_modules/supports-color/index.js using require().
Support for loading ES Module in require() is an experimental feature and might change at any time
(Use node --trace-warnings ... to show where the warning was created)
Есть странный тупняк в маке, который я никогда не пойму. Если ты выводишь звук куда-то, то иногда громкостью можно управлять, а иногда нет.
Если я правильно понимаю, идея была такая: подключил ты условно колонку, вот и регулируй звук на колонке, это «правильно». Где карту открывали...
И это явно не какое-то дурное техническое ограничение даже, потому что в самих приложениях управлять громкостью по-прежнему можно. Нельзя только общесистемной, кнопки на клаве перестают работать, он прям рисует перечеркнутый значок, когда пытаешься это делать. То есть какой-то бедняга это еще и закодил.
Очень сложно передать, как меня это бесит, но я прям закипаю от этого тупняка. Недавно это все сложилось в идеальный сценарий: на мониторе есть колонки, и я иногда вывожу звук туда, когда ноут закрыт. Мак громкостью управлять не дает. Но на мониторе есть свои кнопки! Покручу там, подумал я. Нажимаю — а эти кнопки как-то, видимо, по HDMI или еще какому там протоколу — передали сигнал обратно на мак, как будто я «медиа-кнопку» нажал. Ну а мак против, говорит, нечего тут медиа кнопки нажимать.
Короче, экосистема. Как это назвать, кроме как нарочным вредительством, я не знаю. Если бы, буквально, _ничего_ не делали, было бы лучше.
Один важный инсайт, который косвенно пришел ко мне из Кложе-мира, но в целом универсален: никому не нужны ваши программы. Всем нужны данные.
Грубо, никому не нужна программа-просмотрщик PDF. Зато всем нужна сама пэдээфка. И гугль-докс никому не нужен, нужны только тексты, которые в нем написаны. Уйдет гугль-докс — будут писать в ворде, уйдет ворд — придумают что-нибудь еще.
Звучит контринтуитивно — вроде мы так мучаемся, пишем эти самые программы, функции, UI какие-то придумываем, пользователей заставляем пользоваться. Условно, 90% усилий и 90% времени проходит в программах и за написанием программ.
И все же. Программы сами по себе никому не нужны. Они нужны как способ трансформации данных. Взять что-то на вход, обработать, поменять, выплюнуть что-то новое и все. После этого твоя программа снова никого не интересует. Может ее удалят, может забудут, может поменяют на конкурента, или может она сломается с обновлением. А может завтра снова запустят — ху ноуз?
Программы скоротечны — могут пожить год, ну пять, некоторые совсем исключительные дотягивают до тридцатника. А данные — вечны. Данные переносятся между компьютерами, операционными системами, поколениями.
Важно это не забывать, когда пишешь программу. Что ты тут в общем-то не главный, тебя пригласили на секунду по какой-то сиюминутной нужде, но в целом до и после прекрасно обходились и без тебя. Данные только оставь.
У Вани Гришаева (канал igrishaev) заметка про то, как в Телеграме съезжает разметка. Тоже это видел, воспроизводил, и вроде даже кто-то пересылал это разработчикам.
Конкретно эта проблема в том, что регионы хранятся отдельно от текста, оффсетами. Соответственно, когда ты редактируешь текст, регионы могут неправильно пересчитаться и съехать. Понимаем, бывает.
Важный урок тут вот какой: любой алгоритм можно написать один раз. Любой алгоритм можно починить, чтобы он работал на более-менее всех разумных инпутах. Но задача — если ты делаешь действительно массовый сервис — не в том чтобы написать алгоритм правильно один раз, задача — организовать все так, чтобы он переживал изменения, был устойчивым. Приходят новые люди, появляются новые требования, меняется система вокруг, меняется сам алгоритм, но ядро задачи продолжает работать как ни в чем не бывало.
Обычно это означает придумать максимально простую и тупую форму, чтобы в ней было невозможно сделать ошибки. В примере с разметкой, как правильно пишет Ваня, это означает засунуть разметку в текст, типа тегов.
На заре приложения Sketch у них был баг, когда в каких-то случаях cmd+z делал undo не совсем правильно и ты попадал не в то место, с которого начал. Опять же, наверняка они делали что-то умное и сложное вроде вычисления дельт, а надо было делать что-то простое и железобетонное.
Да, звучит как читерство. Писать тупой код? Для этого что ли я так долго учился? Проявить себя и свой ум негде (на самом деле есть где, конечно — придумать хорошее простое решение часто сложнее, чем придумать сложное).
Зато работает, есть не просит, и пользователи счастливы. Мы же ради пользователей программируем, да? Да ведь?
Реальному миру часто не хватает RSS.
Например, вчера LG анонсировала 6K монитор, который поступит в продажу позже в этом году. Ну и как мне узнать, когда это произойдет? Единственное, что приходит в голову, это подписаться на какой-то сайт с новостями о хардваре, но это же целый год придется нерелевантные новости читать ради одной когда-нибудь релевантной.
Или часто какой-то фильм заинтересовал трейлером. Как узнать, когда он приедет в кинотеарты? Или в цифру? Пока получается только случайно. Хотелось бы как-то более надежно.
Или, скажем, любимый режиссер новый фильм снял. А я откуда узнаю? При этом мне не нужны все новые фильмы, это слишком много, мне хотелось бы конкретные фильтры.
Короче, миру нужен RSS ко всему.
UPD: ребята, не зацикливайтесь на протоколе. Может быть RSS, email, телеграм, мне пофиг. Главное — уведомления об объекте с точечным фильтром
К мему с семвером пришли люди и начали предлагать CalVer — это когда версия это Год.Месяц.День или типа того.
Но это самая бестолковая схема эва!
Во-первых, она предполагает, что новое всегда лучше старого. Типа, Вася написал библиотеку в 2025-м, а Петя в 2024-м. Оба потратили на них по три часа. Но у Васи версия больше! Почему? А нипочему.
Во-вторых, кажется, что со старым софтом что-то не так. 1.0 звучит солидно когда угодно, а 2020 звучит как-то не очень, типа, фу, 4 года назад. Хотя программы так-то не стареют. Алгорит, написанный четыре года назад, будет так же хорошо работать, как и написанный сегодня.
(а учитывая, что компьютеры становятся быстрее, в прошлом ограничения были более строгие, следовательно, шанс, что старые программы будут работать быстрее, тоже выше)
В-третьих, она никак не отражает, собственно, масштаб изменений. Скажем, Вася написал библиотеку в 2020-м, а потом поправил один минорный юз-кейс в 2025-м. Итого мажорная версия скакнула аж на пять единиц! Любому, кто будет принимать решение об обновлении, может показаться что это что-то прям важное.
В-четвертых, ложное чувство безопасности. Скажем, ты поставил версию 2025.01.01. Новогоднюю. Всего пять дней прошло, думаешь ты. Обновляться явно еще рано. А на самом деле после 2025.01.01 в тот же день вышла 2025.01.01-001 (куда, кстати, девать номера вышедших в один день?) с фиксом критической уязвимости. Но версия этого никак не отражает.
Короче, версионирование на гордости/стыде мне хотя бы понятно. Семантическое тоже, хотя в реальности следовать ему трудно. Версионирование по дате я не понимаю от слова совсем.
С тем же успехом возьмите просто одно число и увеличивайте его на 1 с каждым коммитом. Это хотя бы избавит от иллюзий, связанных с недавностью.
Хуже только когда после 3.9 решают бампнуть до 4.0 просто для красоты.
Запускал тут на днях Идею, а она мне пишет рядом с каждым полем количество его использований. Прям английским по белому:
public char[] readBuf; 22 usages
public char[] accumulator; 14 usages
public int accumulatorLength; 20 usages
Пишут, что в Whatsapp сейчас работает 150 только дизайнеров (есть какая-то известная статья про то, что во всем Вотсаппе 20-50 инженеров и только, но она старая, сейчас вроде 1600 человек и из них 150 дизайнеров, не перепутайте).
Тема, конечно, изъезженная, но мне все еще любопытно, как выглядит средний день среднего дизайнера. Над чем он работает (учитывая, что дизайн Вотсаппа не менялся уже лет десять, они за это время ну может пяток иконок добавили), куда потом эта работа идет, как он себя по этому поводу чувствует.
И нет, я не хочу, чтобы они делали редизайн каждый год. Очевидно это было бы хуже. Но вот они не делают, а дизайнеров все равно 150. Чем они заняты?
Сформулировал наконец, что значат цифры в SemVer, или «семантическом» версионировании.
Итак, допустим, у вашего продукта версия A.B.C.
Тут A — это рекламная версия. Когда вам нужно создать инфоповод и напомнить миру, что вы существуете. Менять что-то необязательно, но можно редизайнчик ебануть, например.
B — это дефолтная версия. Когда ни туда, ни сюда, просто посидели, что-то поделали.
C — это позорная версия. Она бампится, когда вам не хочется привлекать внимания к косякам, которые вы сами же и создали.
Сохраните, чтобы не забыть.
Знакомлюсь потихоньку с фронтендом, узнал, что у нас используется библиотека Turbo. Как я это узнал? А очень просто. На запуске она печатает здоровый такой баннер, что у нее вышла новая версия и пора бы обновиться.
Офигеть, да? Какая-то сраная библиотечка считает себя насколько пупом земли, что позволяет себе а) занять десяток строчек в логе, б) сходить в интернет и проверить версию, хотя ее об этом никто не просил, и в) присесть мне на уши по поводу обновления, как будто у меня других дел нет.
Отдельно бесит, что вообще говоря в использовании более старых библиотек никаких проблем нет: меня все устраивает, все нужные функции есть и работают как мне надо, нафига мне обновляться? Чтобы что? Просто чтобы еще работы на пустом месте создать и еще чуть больше устать? Спасибо, услужили.
Серьезно, вот что происходит, если у разработчиков слишком много денег и свободного времени: все функции уже реализовали, на Раст переписали, что дальше делать? Приходится какую-то ерунду выдумывать, «улучшать» стандартный воркфлоу не там, где нужно, а там, где проще, и отвлекать пользователя. Понятно, что это работает на саморекламу — у нас, может, еще десяток других библиотек, про которые я так и не узнал, а эта хоть и бесяче, но заняла место в моей голове — но как же я от этого устал. Не надо, пожалуйста, из каждой библиотеки делать источник новостей.
С ужасом жду момента, когда другие переймут эту практику и на старте в логе будет пяток-другой баннеров, в идеале с мигающими буквами, бегущей строкой и анимированной псевдографикой, которые будут просить обновиться, занести денег бездомным котятам, переименовать master в main и стать веганом. Даже библиотека для этого будет, shame.js. Как будто к этому все и идет.
И вдогонку: коллективным разумом выяснили, что лампочка показывает уровень заряда кейса, если вытащить наушники, и «заряжаются ли наушники», если они в нем. ОДНА И ТА ЖЕ ЛАМПОЧКА. ОДНИМ И ТЕМ ЖЕ ЦВЕТОМ. ДВЕ ПРИНЦИПИАЛЬНО РАЗНЫЕ ВЕЩИ. К вопросу о модальности и как она легко может запутать даже взрослых умных людей.
Очень жаль, что Эплы решили не делать свою машину. Представляю, как у них внутри была бы лампочка, которая показывает уровень заряда батареи, если водительская дверь открыта, и «включены ли фары», если закрыта. Столько возможностей, ух
Мало кто думает про долгосрочные психологические эффекты программ, а они есть.
Простой — надежность. AirDrop классный, когда он работает, но невозможный, когда нет. На его фоне Телеграм кажется истинным чудом — ни разу еще такого не было, чтобы ты положил файл на одном устройстве и он не появился через пару секунд на другом. Это ощущение надежности не купишь никакими интерфейсами, шрифтами, кнопками или анимациями. Что толку в Аирдропе, если в конечном итоге я не получу файл? Команде Телеграма удалось сделать лучший файлообменник, настолько хороший, что им можно пользоваться даже несмотря на другие ненужные функции вроде чатов. А нужна-то была — всего-навсего — надежность.
Со звонками наоборот: на телефоне Телеграм работает кое-как, а Вотсапп гораздо лучше. А вот на компе найти программу для созвонов, на которой вот чтобы совсем не было ебли, у меня пока не получилось. Причем тут речь не о 90% успеха, а именно о 99,999%. Чтобы пропал страх, нужно прям долгое и стабильное закрепление.
Или наушники — с блютусными ты знаешь, что в 10% случаев будет какая-то боль, у тебя прям в голове этот психологический барьер, когда их надеваешь — ух, щас или все хорошо будет, или я знатно поебусь. А с проводными или вайфайными такой проблемы просто нет, нет этого барьера.
Другой долгосрочный эффект — стабильность. Как мы уже говорили, современные компании не хотят делать продукт, они хотят делать новости. Поэтому интерфейс постоянно меняется, кнопки переезжают, привыкать ни к чему нельзя. В итоге ты не привыкаешь пользоваться продуктами, ты привыкаешь сканировать интерфейс каждый раз и ориентироваться на лету, потому что наверняка что-то опять перепридумали, перерисовали, переставили.
Операционные системы больше не выполняют роль стандартов в построении интерфейса, потому что сами меняются раз в два года. В двухтысячных все воротили нос от интерфейсов на Флеше, потому что они были кастомными и нестандартными, надо было разбираться. Так вот, сегодня ВЕСЬ компьютер это набор интерфейсов на Флеше. И не только веб, нативные приложения тоже.
Результат? «Учиться» пользоваться компьютером потеряло смысл. А не могу показать маме, где кнопка «выбрать аудиоустройство», потому что она сегодня тут, а завтра — там, и выглядит по-другому. В компьютере сегодня нужно учиться ориентироваться на незнакомой местности.
Я уже писал, что главный принцип хорошего кода — названия переменных из одного слова. И вот вчера тырил код (опен-сорсный, релакс) и там у чела синдром второго слова во все щели, просто невозможно. И, главное, все без проблем переименовывается и читается в сто раз лучше:
curChar - ch
bufChar - ch
idata - i или data
startpos - start или pos
cbBuffer - cb или buffer
nElems - n или len или cnt
retval - ret или res
strdata - str, блин!
keyVal - key
valVal - val
mapObj - map или m
aryObj - res или acc (ну там по смыслу)
objReader - reader
Самая смешная фигня на свете — инструкции, как подбирать «сочетающиеся» цвета на цветовом круге.
Обычно так: выберите точку, проведите прямую через центр, и на противоположном конце будет «противоположный» цвет, который гарантированно хорошо будет сочетаться с вашим. Дальше там начинаются варианты, типа, можно не два цвета выбрать, а три, тогда они должны по кругу на одинаковом уголовом расстоянии друг от друга находиться, и так далее. Можно четыре, пять, вы поняли.
А смешная она по многим причинам. Начнем с того, что цветовой круг — абсолютно рандомная штука, она никем не дизайнилась и ничему в реальности не соответствует. Спектр света линейный, поэтому чтобы его закольцевать к нему добавили мадженту — сумму красного и синего. Почему бы и нет? Далее, ваш круг скорее всего sRGB, то есть его пики — красный, синий, зеленый — просто соответствуют частотам соответствующих светодиодов, которые получилось придумать. Придумали бы другие светодиоды — пики были бы в другом месте, и вы составляли бы другие палитры. Наконец, sRGB довольно корявое цветовое пространство — яркость скачет, цвета складываются нелинейно, градиенты грязные.
Так что тут побеждает не здравый смысл и не глаза, а простота рецепта. Любой может провести отрезок через центр и получить два цвета. Получится хорошо или нет — уже не важно, важно, что это легко сделать.
Так рецепты и размножаются.
Я, кстати, потеплел к ChatGPT и начал пользоваться. Главное, что я понял — не задавать ей сложные вопросы, а задавать простые. «Сколько хранится открытый йогурт», «какие есть варианты поставить Стим на Маке», «как избавиться от трупа», «как работает VAT», «куда вставлять лицензию от библиотеки, код которой используешь», «как сконвертировать mp4 в gif».
Типа, что-то, по поводу чего нет каких-то особенных точек зрения, дискуссий, неоднозначностей, что давно, широко и одинаково используется и обсуждается, просто так получилось, что я — лично я — этого конкретного кусочка знаний не имею.
Действительно, в поисковике это заняло бы больше времени, пришлось бы почитать много плохого SEO-оптимизированного текста, причем текста, который не на мои вопросы отвечает, а вообще.
А так — получил свой ответ и пошел.
Что насчет кода? Ну код это пока сложный вопрос :) По крайней мере у меня. Но заглушки неплохо генерит.
UPD: А, еще она ошибки в тексте хорошо исправляет. Потому что языковая модель же
Вот вы думаете что UX это гуманитарная дисциплина, а нифига! Возьмем закон Фиттса: время нажатия на кнопку обратно пропорционально ее площади и пропорционально расстоянию. Т.е., грубо, если кнопка больше — время меньше, если кнопка дальше — больше.
А теперь представим, что кнопки вообще нет. Как нет? А вот так вот. Появляется по ховеру. Эпл такое любит: когда приложение хочет показывать нотификации, об этом появляется нотификация: “App name” Notifications: Notifications may include alerts, sounds and icon badges. Ты читаешь и думаешь: что сказать-то хотели? Какой-то незаконченный текст.
А это все потому, что это не просто сообщение на самом деле. Это скрытый вопрос! На самом деле там есть _выпадайка_, в которой две опции: Allow и Don’t allow, просто ее не видно. Буквально, кнопка есть, по смыслу нужна, но она просто графически нигде не нарисована. Появляется чисто по ховеру. Даже места под нее нет, чтобы об ее существовании можно было догадаться: она прям поверх текста этого появляется, когда наводишь мышку.
Ну и вот. Получается, площадь кнопки какая? Ноль. Подставляем в закон Фиттса, получаем деление на ноль, т.е. время нажатия улетает в бесконечность. И отсюда выводится уже мой закон: пользователь не может нажать на кнопку, если он не видит ее.
Казалось бы, какой банальный закон, тривиальщина. Однако нарушается каждый день, и не только Эплом. А вы говорите гуманитарная дисциплина. Умели бы цифры в формулу подставлять, так авось и проблем бы таких не было!
Анекдот. Программистам будет больно, сразу предупреждаю.
Яша с утра спросил у супруги, почему она отрезает кончики сосисок, когда готовит их. «Не знаю, меня мама так научила, спроси у неё», — отвечает супруга. Яша оказался любопытным и пошёл к тёще. Он спросил: «Мама, почему действительно вы всё время кончики у сосисок отрезаете, когда варите?»
Она говорит: «Я не знаю, меня мама так научила. Если тебе интересно, позвони ей». Ну Яша такой любопытный, пошёл звонить. Звонит, говорит: «Ида Самуиловна, это Яша, ваша внучка (моя жена) и ваша дочь (моя тёща) всё время, когда варят сосиски, отрезают кончики и говорят, что это вы их научили. В чём смысл?»
«Вы что, до сих пор варите сосиски в той моей самой маленькой кастрюлечке?»
Проклятие современного мира — логины.
В какой-то момент каждый стартап решил, что мало доебывать пользователя постоянными релиз ноутами и перестановкой фич на панели, надо еще и логинами.
Доходит до абсурдного: логины теперь есть в браузерах, редакторах кода, терминалах, драйверах видеокарты, мышке, телевизоре, посудомойке. Недавно я обнаружил возможность логиниться в приложения MS Paint и «Часы» (да, блин, ЧАСЫ) на Винде. Ждем, когда аккаунты добавят в Блокнот и Выбор WiFi, а то как-то непривычно что ли.
При этом нормальные ребята как не играли в эту игру, так и не играют. Лицензии вполне себе покупались и покупаются без аккаунтов, файлы и данные прекрасно синхронизируются тоже. Вот Syncthing, синкает файлы между произвольным количеством машин, через интернет, и ни одного ебучего аккаунта не надо нигде заводить. А что, так можно было? Оказывается, можно.
Реально не понимаю, мне ясны только минусы: во-первых, пользователи бесятся (хотя кого это когда-либо волновало). Во-вторых, тебе надо управлять базой емейлов и паролей, что как бы сложности и риски.
А плюсы в чем? Ну, вот завел пользователь аккаунт в «Часах». Ну, узнал ты его емейл. Но этот же емейл еще в пяти других твоих приложениях и в самой Винде, что дальше? Настройки, опять же, прекрасно синхронизировались без аккаунта.
Ну или ладно, делаешь ты терминал на Расте, или там редактор кода на Расте, или драйвер для мышки. И требуешь заводить аккаунт. Окей. Завели. Дальше что? Как это конвертируется в прибыль? Где тут деньги? Какая мотивация лежит за всей этой модой? Что продается?
UPD: Как правильно замечают, «Ещё и на свою ебучую рожу смотреть в углу каждого ебучего приложения»