-
Проблема и решение
Работая над задачей, важно спрашивать себя о двух вещах.
Первая — какую проблему я пытаюсь решить? Удивительно, но многие не могут внятно на это ответить. Они говорят, что делают, и это понятно: внедряют фреймворк, пишут тесты. Но какая проблема была изначально?
Из первого вопроса следует второй — как мое решение влияет на проблему? Оно вообще ее решает? Или можно было проще? Или можно было поправить конфиг?
Пишу это, потому что удивлен, как часто забывают об этих вопросах. Бывает, проблему можно поправить функцией или макросом, но в код тянут библиотеку. Или можно купить готовое решение, но тимлид говорит: мы напишем свое через три месяца. Или разработчик насмотрелся видосов со свежей конфы и хочет проверить чужие идеи.
Поэтому раз: какую проблему я решаю? И два: отвечает ли ей мое решение? Чередуя эти вопросы, можно сделать любую задачу точно и в срок.
-
Паузы в играх
Я играю только в старые игры: те, которые были популярны, когда мне было 13-17 лет. В основном это эмулятор PlayStation и ранний PC. Играя сегодня, наблюдаю забавные вещи, на которые не обращал внимания раньше. Например, паузы или перезарядка оружия.
Далеко не везде пауза останавливает мир полностью. Например, в старой сеговской игрушке General Chaos есть прикол: если бросить гранату и нажать паузу, она спокойно долетает и наносит урон. При этом работает анимация урона и смерти врага. За счет этого можно пройти игру одним бойцом.
В игре Parasite Eve 2 на PlayStation был мощный лазер (насадка на карабин “Javelin”). Лазер хорош, но с большим интервалом между выстрелами. Однако если выстрелить и нажать паузу, то за это время его отпустит, и после паузы можно стрелять снова. С точки зрения игры лазер спамит непрерывно.
В игре Alien Shooter 2 на PC нечто схожее с переключением и перезарядкой. Есть ракетница по принципу “мощно, но редко”. Пока она перезаряжается, можно переключиться на другое оружие и пострелять из него, а потом вернуться к ракетнице — она будет готова к выстрелу.
В Quake 2 на PlayStation был прикол с путаницей патронов от одного оружия к другому. Если во время стрельбы переключиться с шоги на рейл и обратно, то рейл тратил дробь, а шога — обедненный уран.
Почему так происходит? Хоть я ничего не понимаю в играх, но хотя бы предположу. Пауза ставит логический флаг, при котором игровой цикл не обновляет объекты. А перезарядка оружия и некоторые другие вещи работают от прерывания процессора. Другими словами, процессору говорят: через две секунды выполни код, который находится по этому адресу. Таймер можно только отменить, но не продлить. Поэтому даже если мир заморожен, через две секунды сработает код, который снимет с оружия статус “перезадяка” и выставит ему нужное число патронов. Отсюда такие приколы.
Морали нет, просто вспомнилось.
-
Бесчеловечность Java
Джавное ООП отличает особая бесчеловечность. Ощущение, что код писали не люди, а роботы, которые хотят обратить кожаных мешков в рабство. Именно такие ассоциации приходят в голову.
Пример — джавный SDK для S3. Возникла задача — явно указать пару ключей и регион. Как это делается в дружелюбных языках? Передается мапка с тремя ключами или kwargs. По умолчанию берутся переменные среды, но считается, что пользователь не идиот и в случае нужды укажет свои ключи.
Джавный SDK, напротив, считает пользователя идиотом. Креды берутся из переменных среды и системных файлов. Если хочешь указать свои, то нужно написать такой код:
Я рожал его почти два часа. Понимаете ли, инициировать
BasicAWSCredentials
недостаточно. Нужно обернуть его вAWSStaticCredentialsProvider
и передать вAmazonS3ClientBuilder
. Так очевидно и просто!Ясное дело, в джавадоке об этом ни слова. Каждый класс подробно знает о своих геттерах и сеттарах, но не то, как их скомпоновать. Гугление выдает ссылки на StackOverflow и Baeldung. Все спонтанно, что-то уже deprecated, разброд и шатание. В официальных доках только те примеры, что считаются правильными со стороны AWS.
Все это топорно и бездушно. А некоторым с этим жить.
-
Пустая консоль
Как приятно осознавать, что есть сайты, где в Developer Console ничего нет. То есть буквально ничего: ни логов Javascript, ни красных сообщений блокировщика, ни Google Static Content и прочего барахла. Пустой экран.
Я об этом (популярный новостной сайт):
Вдвойне приятней, что один из этих сайтов — мой. В его консоли действительно ничего нет! Пусть посетитель об этом не знает, но знаю я, и от этого хорошо на душе.
-
Темные темы
Про темные темы можно сказать так: лучше, чем ничего. Потому что идея хорошая, а нормальных темных тем не бывает.
Проблема в том, что затемнить фон недостаточно. Всякие иконки и виджеты по-прежнему светят в глаза, потому что на них смена темы не действует. Пример — белые иконки приложений на скриншоте слева. Когда их много, света почти столько же, что и раньше. В грамотной теме должны меняться иконки тоже. Технически это возможно, но требует доработки со стороны третьих лиц, поэтому маловероятно.
Вторая проблема на картинке справа. Синий, желтый и другие цвета выглядят ярко на черном фоне. Иконки у ящиков надо сделать серыми, а звезду — чуть ярче, чтобы она выделялась за счет яркости, а не цвета. Жирные белые заголовки дают много света, их надо приглушить. Но дизайнерам это до лампочки — они поменяли фон и выкатили в продакшен. Вы просили темную тему? Просили. Мы добавили? Добавили. Закрываем тикет.
Так это и работает. Темные темы кидают пользователям, как кость, хотя они не проработаны. Я понимаю, это долго и дорого, и по-хорошему это два разных дизайна. Кому охота поддерживать два, если можно один?
Поэтому и отношение к темным темам такое: есть что-то да и ладно. Лучше, чем ничего.
-
Истечение карт
Нет смысла говорить о том, что истечение паролей и ключей — плохая идея. Об этом уже много раз писали.
Но интересно, почему такая же история с пластиковыми картами? По умолчанию они действительны три года. Вопрос: почему только три года? Что мешает карте работать пять, семь, пятнадцать лет? У нее что, чип протухает? Очевидно, препятствий этому нет, нужно лишь поменять дату в базе данных.
Понравилось ли бы служащему банка, если бы каждые три года нужно было менять замок на входной двери? Или гонять машину к дилеру, чтобы тот перепрошил электронику, иначе в машину не попадешь. Или ноут спустя три года не включается, и ты едешь в офис Эпла, чтобы его продлили. А с картами это считается нормальным.
Самое главное, что правило в три года игнорируется самим банком, когда ему хочется. Например, премиум-карты делают на семь лет, потому что они металлические и выпускать их каждые три года дорого. Или когда против России ввели санкции, у банков временно закончился пластик для выпуска карт. И банки что? — просто продлили сроки карт. Массово пришли смс-ки: ваша карта *1234 теперь работает до 2030 года.
Сервисы онлайн-платежей тоже подтянулись: они перестали проверять дату карт, потому что люди на автомате вводят ту, что на карте, а не ту, что в смс.
Спрашивается, а что, так можно было? Как видим, да. Истечение по времени — вещь искусственная, и в случае нужды ее легко подвинуть. Никто не умер, банковская система не рухнула. Беда в том, что двигать такие вещи может лишь тот, кто ввел их в оборот, то есть не мы с вами.
-
Java
У меня появился пет-проект, и самое главное — он не на Кложе, а на Джаве. Пишу уже две недели, и вот какие ощущения.
Современная Джава неожиданно хороша. Если взять последнюю версию 21, не цепляясь на бородатое легаси, то писать на ней довольно приятно. Скажем, везде вместо классов использовать рекорды — это неизменяемые классы, которые экономят код и несут клевые вещи из коробки.
Или использовать паттерн-матчинг по классам, например:
switch (msg) { case BindComplete ignored: break; case AuthenticationOk ignored: break; case AuthenticationCleartextPassword ignored: handleAuthenticationCleartextPassword(); break; case ParameterStatus x: handleParameterStatus(x); break; default: throw new SomeException("no branch");
Когда-то давно это делалось паттерном Visitor (Посетитель). От одного упоминания на зубах скрипит песок. А теперь это несколько строчек. Современной Джаве нужно все меньше паттернов, потому что они нативо поддерживаются языком. Это происходит медленно, в год по чайной ложке, но в данном случае медлительность значит неотвратимость.
В 21 Джаве завезли виртуальные треды. С ними можно писать блокирующий код, а JDK сама определит, когда тред можно остановить и возобновить. Конечно, нужно знать детали процесса. Недавно я погонял виртуальные треды из Кложи, и прям очень приятно.
Хочется отметить Джавный тулинг. Идея Community Edition очень хороша. Все подхватывает, безошибочно подсказывает варианты в выпадашках. В Кложе такого нет и никогда не будет.
Да, в Джаве нет репла, но вот смотрите: я написал класс Main с запускалкой кода. Жму зеленую стрелку — все выполнилось. Если что-то упало, я ставлю дебаг на строку и жму кнопку с жуком. Исполнение прерывается на отметке, вижу локальное состояние, правлю код, запускаю. Прекрасно.
В Кложе, наоборот, нет встроенного отладчика вообще. Есть отладчик в emacs-cider, но он странный и работает через раз. Для себя я написал отладчик bogus, и он спасал меня раз двести, не меньше. Но моя поделка ничего не решает — ей пользуются три анонимуса, а остальные дебажат принтами или через tap.
Конечно, начинать проект на Джаве 21 — это утопия. Куда бы вы не пошли, вас будет ждать легаси, которому, дай бог, обновиться бы до Джавы 17. Там будут паттерны, частично инициированные POJO и прочие прелести. Но хобби на свежей Джаве — почему нет?
Джава развивается так быстро, что не успеваешь следить. В нее вливают горы денег, а работают над ней одни из умнейших людей мира. Это чувствуется. Например, в случае с виртуальными тредами пришлось пройти по всей SDK и поправить все блокирующие вызовы. Колоссальная работа! Все, чтобы программист поменял
FixedPoolExecutor
наVirtualThreadExecutor
, и вжух — полетело.Не все принимают эту данность. Я знаю человека, который уверен, что Джава — это собственность Оракла (хорошо хоть не Sun), за нее нужно платить, она тормозная и ест много памяти. При этом на Джаве он писал 15 лет назад. Уютный мирок заблуждений приятней, чем реальность.
Сказанное не значит, что я записался в джависты. Просто у Джавы можно многому поучиться в плане развития. Взять на заметку.
-
Обложки
Я не могу смотреть на обложки, где автор кривляется. Например, делает грустное или злое лицо. Кривит рот. Или в заголовке указано “Choosing X vs Y”, и автор подпирает подбородок и смотрит вверх — типа задумался.
Помните Крошку Енота? Не строй рожи, а улыбнись! И оно к тебе вернется.
Не буду приводить примеры, чтобы не обидеть кого-нибудь. Но блин, какая же это тупизна. Хотя и здесь можно найти пользу: если автор кривляется, смотреть видео не нужно.
-
О заголовках
Небольшая заметка о том, как писать заголовки. Главное правило — заголовок не должен делать предположений о читателе или диктовать ему шаги. Читатель — абсолютно нейтральная сторона. Указывать ему — все равно что ломать четвертую стену, то есть фу.
Примеры плохих заголовков:
-
10 фактов о JavaScript, которые должен знать каждый разработчик. Ничего я тебе не должен, отвали.
-
20 фактов о Python, которые вы не знали. Я на нем 8 лет писал, все я знаю.
-
Почему ваш код — отстой. Это у тебя отстой, не переноси с больной головы не здоровую.
-
Посмотрите это видео прямо сейчас или добавьте в закладки. Спасибо, сам разберусь, что и когда смотреть и где хранить.
Удивляет, что вроде бы нормальные ребята нет-нет да озаглавят материал в таком духе. Один кложурист написал статью “Why your REPL experience sucks”. Я посмотрел код, а он там жестко накосячил. Интересно выходит: косячит он, а experience sucks мой.
Или видел заголовок Медузы: вышло какое-то видео, посмотрите сейчас или добавьте в закладки. Может, еще выслать письменный отчет о просмотре? И переслать ссылку десяти знакомым?
Нельзя тыкать читателю, что он знает и что нет, что и когда смотреть. Читатель сам прекрасно разберется.
-
-
DVD-квесты
Накатило воспоминание, и хочу им поделиться с вами.
В моем детстве не было интернета, и контент доставали на DVD. Это были фильмы, софт, музыка любимых групп. И надо сказать, кроме содержимого диска я всегда интересовался его оформлением.
На DVD мог быть не только фильм, но и интерактивное меню. Например, при включении диска показывалась менюшка, где можно было выбрать просмотр сначала, конкретный эпизод или фанатский контент: короткометражки, бекстейдж и прочее.
Технически менюшка могла быть как картинкой, так и видео. Классно смотрелись менюхи, где фоном шло видео, а кнопки тоже были анимированные, например, короткие сцены к эпизодам. Кнопки работали как горячие области: на них можно было кликать. По клику человек улетал на другую менюху или видео.
Одно время я работал на телеканале Альтес, и там мне это очень пригодилось. Мы частенько записывали клипы местных артистов на DVD, и до меня оформления дисков как такового не было. В программе для записи выбирали менюху по умолчанию, и все. А я заморочился и сделал менюхи в стиле каждого артиста. Это был фурор, и подобная вещь стала стандартом: нам, пожалуйста, с менюшкой, как у тех ребят.
Так вот, у меня было много дивидишек, красивых и не очень, но один я никогда не забуду. В то время я увлекался группой Korn — я и сейчас их люблю, но меньше — и попался мне их диск. Я думал, что на нем обычный сборник клипов, но то, что было внутри, превзошло все ожидания.
Это был настоящий DVD-квест! Действие в нем происходит от первого лица. Вначале беднягу закатывают на каталке в дурдом а-ля Сайлент Хилл. Всюду инвалидные коляски, решетки и крючья на потолке. Герой встает и начинает исследовать локацию.
На Ютубе нашлись фрагменты этого диска. Ниже — кадр из заставки и ссылка на видос:
https://www.youtube.com/watch?v=KkioRvvyVRw
Каждая локация — это комната с интерактивными предметами. Посмотрев на предмет, герой испытывает припадок, и ему показывают видео с группой Korn. В основном это бекстейдж, где музыканты обдолбанные в трейлере, видео с репетиций или просто балдеж. Во время блужданий по дурдому можно попасть в комнату охраны с кучей телевизоров, и по клику на каждый показывается клип. Контент нужно было найти!
Особо хотелось бы рассказать про навигацию между комнатами. Каждая комната была не статичной картинкой, а видео. Например, крючья на потолке качались и бренчали, проводка искрила, вода текла из пробитых труб. На фоне звучал зловещий амбиент. В одной из комнат был псих в рубашке на электрическом стуле. Набор штампов, но как все это было оформлено!
Если “потрогать” предмет, например череп на столе или анатомический атлас, герой “видел” историю этого предмета: кто его держал до вас, что происходило в комнате и так далее.
Навигация между комнатами была связной: если нажать на дверь, включался ролик, как герой отворяет ее и попадает в другую локацию. Если нажать на вентиляцию в стене, он вставал на цыпочки, чтобы подглядеть, что там твориться. Были приколы с пролетом сквозь трубы с червями и мокрицами. Все вместе это давало такой эффект присутствия, что не найду слов.
Ну и наконец: там была скрытая локация. Представляете? Секретная комната! На DVD! В одном месте была лестница в подвал, а там — дверь с кодовым замком. Замок был представлен отдельной менюшкой с кнопками от 1 до 9. Нужно было ввести четыре правильных цифры. При ошибке тебя сбрасывали на начало ввода.
По ссылке ниже другая головоломка с этого диска. Видимо, либо их было две, либо я что-то путаю.
https://www.youtube.com/watch?v=ofR1hijB1rw
Вы представляете, как трудно это было сделать? У DVD нет переменных и состояния, он может только показывать видео или меню. Поэтому создатели диска сделали пять сцен с замком. Первая — когда ничего не введено и одна кнопка ведет вперед, а остальные — назад. Вторая — когда правильно введена первая цифра; на ней уже другая кнопка ведет вперед, а остальные — на первую сцену. Третья — когда введены две цифры; четвертая — когда введены три, и последняя правильная открывает дверь.
Чтобы вы оценили масштаб, нарисую граф переходов:
Видите? Я даже две полных сцены не нарисовал, а линии уже не дают понять, что происходит. А там этих сцен было минимум пять.
Код на двери был 19… чего-то там: год образования группы. За дверью находился морг с совсем уж трешовым оформлением. На стеллажах лежали трупы музыкантов; если их осмотреть, показывали крайне упоротое видео.
Вот какой был дивидишник! Пишу о нем потому, что хочу воздать должное его создателям. Как же они заморочились! Надо было найти подходящий подвал, разложить реквизит, все отснять, смонтировать, наложить криповые эффекты. Надо было продумать карту, маршруты передвижения, какое видео и где разместить. Сцена с кодовым замком по сложности была как четверть всего проекта. И сделать все это в программе, которые были рассчитаны на пару менюшек! Это просто мое уважение.
Сколько часов я провел, слоняясь по тем подвалам! Это была как будто игра, но и не игра — а квест в телевизоре.
И хотя я ни разу не видел подобных дисков, один приятель рассказывал о чем-то похожем. У него был официальный DVD с фильмом “Люди в черном”, и там зритель оказывался в лаборатории. Можно было либо смотреть фильм, либо исследовать локации и заглядывать в предметы, где спрятан фанатский контент.
Пишу это и понимаю, что ничего подобного сегодня быть не может. У нас есть стриминговые сервисы и торренты, но ни то, ни другое не предполагает оформления: ни меню, ни фанатского контента.
Это ни в коем случае не сожаление о прошлом, а попытка его увековечить. Да, была такая прикольная фигня. Да, было клево. Да, да.
И вернемся в сегодня.