Минутка просвещения

Читать в телеге. Когда-то там были посты не только от меня.

Пустые коммиты в git

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

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

А недавно пустой коммит мне пригодился, чтобы обойти CI-проверку, которую я же и написал — мне было лень писать код для обработки особого случая :)

СсылкаКомментировать

Не сроки зависят от оценок, а оценки от сроков

Хорошая статья “на подумать” про то, что оценки часто тащат за собой политику и лучше сразу ее учитывать. Не могу сказать, что на 100% со всем согласен, но уж слишком часто сам оказывался в ситуациях, когда использовались очень рандомные эвристики для оценок (“заложим риски”), а то и вовсе дедлайн известен и оценка состоит в том, чтобы понять, что можно за это время сделать. Так-то озвучены хорошие мысли: надо фокусироваться на решении проблемы, а не на оценке конкретного решения, надо больше проговаривать/фокусироваться на неопределенностях/рисках, и что важность/критичность задачи тоже влияет на оценку. И вообще, надо совместно с бизнесом продуктовые задачи решать.

СсылкаКомментировать

Сравнение всяких технологий

Ламповый сайтик со набором всяких сравнений: операционные системы, окружения рабочего стола, браузеры, мессенджеры (причем более объективно, чем, например тут), клоны экселя и т.п.

Для важных переговоров™, как говорится.

Но особенно мне душу погрела статья про исчезновение маленьких телефонов.

СсылкаКомментировать

Влияние ИИ на выработку навыков

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

Выделю две цитаты:

We found that using AI assistance led to a statistically significant decrease in mastery. On a quiz that covered concepts they’d used just a few minutes before, participants in the AI group scored 17% lower than those who coded by hand, or the equivalent of nearly two letter grades. Using AI sped up the task slightly, but this didn’t reach the threshold of statistical significance.

Managers should think intentionally about how to deploy AI tools at scale, and consider systems or intentional design choices that ensure engineers continue to learn as they work—and are thus able to exercise meaningful oversight over the systems they build.

В целом рекомендую к прочтению.

Примечательно, что в твиттере мнения полярные: от «duh, я же говорил» до «вы просто не умеете их правильно готовить». Еще некоторые пытаются высказать, что у сеньоров все по-другому (как будто им учиться не надо).

СсылкаКомментировать

Впечатления о Ruby

С этим языком я мимолетно сталкивался и раньше — например, Puppet и его модули были написаны на Ruby; язык шаблонов Liquid, который используется в Jekyll, имеет схожий с ним синтакс; недавно локально запускал Discourse, который на рельсах написан.

У меня было о нем впечатление, что это просто такой “японский питон”, который выстрелил после Ruby On Rails, а сейчас уже движется тупо по инерции, ведь для чего-то нового рельсы вряд ли будет наверху списка.

Но вот для сайтика захотел написать проверку, что правильно id телеграммовских сообщений проставил для комментов, и решил, что раз есть готовое окружение под Jekyll с Ruby, то можно и этот скрипт на Ruby написать.

ChatGPT выдал какую-то полную дичь с кучей бойлерплейта. Потаскал оттуда полезные вызовы, но в целом написал сам.

Язык… своеобразный. Самые отталкивающие моменты:

  1. необходимость закрывающих end (да и в целом лишние церемонии);
  2. очень непонятные ошибки (уровня “ты где-то end забыл” на последней строке, с нулем гипотез где);
  3. много лишнего/вещей о которых надо помнить: unless, когда есть if и not, странности синтаксиса (вроде того, что в хэш-таблицах по умолчанию будут символы, а не строки; странные правила для return или разрешение вещей типа sum sum(3, 4), 5). Добило меня, что если написать переменную с заглавной буквы, то это будет константа с глобальной видимостью (а по умолчанию в контексте функции ничего извне не видно).

Есть и хорошие идеи (например, ? на конце у методов, возвращающих bool и ! у методов, меняющих содержимое коллекции на месте), но в целом я не ощутил, что у языка есть какие-то киллер-фичи.

СсылкаКомментировать

Однопальцевый зум

В большинстве приложений карт (я проверил Google Maps, Яндекс и Organic Maps) есть еще один вариант для масштабирования, кроме привычного двухпальцевого метода и двойного нажатия — двойное нажатие + оттягивание вверх/вниз. Есть даже исследование на сумасшедшей выборке из 12 человек, что этот метод на 47% эффективнее, когда вы держите телефон одной рукой.

СсылкаКомментировать

Cosmopolitan

Несколько лет этот проект валялся у меня в списке “посмотреть”. Звучит как какая-то магия: компилятор C, который производит один исполняемый файл, который можно запустить на любой платформе без интерпретера, мам, пап и кредитов. Попробовал его, когда делал счетчиковую машину, но почти сразу же бросил это дело. Увы, реальность полна разочарований: что-то дополнительное все равно придется ставить/настраивать, это аж в ридми написано. При этом техническая реализация довольно интересная.

СсылкаКомментировать

Witr: why is this running

Попробовал witr — порадовала автономность и спектр вариантов установки (просто deb-пакет — это прекрасно). С заявленной задачей, можно сказать, справляется, но вау-эффект не произвел. Для открытых портов lsof | grep TCP как будто проще, а источники процессов ведут почти всегда в systemd, при этом пути к связанному конфигу нет. Киллер-фичей бы для меня стало определение стандартных системных процессов, но это слабо соответствует заявленной цели утилиты.

СсылкаКомментировать

Cache control и "умный" Cloudflare

Если ваш сервер не посылает заголовки, связанные с кэшированием, то по умолчанию, браузеры ориентируются на заголовок Last-Modified. Если и эту дату не ставить (или всегда оставлять там текущее время), то ничего закэшировано не будет. Не могу сказать, что когда-то сильно парился по этому поводу как бэкэндер — обычно всякие API должны отвечать самыми свежими данными, а этим вопросом занимались фронты/девопсы/SRE (если занимались, конечно). Да и у многих фреймворков и проксей вполне адекватные настройки по умолчанию (например, всякие эндпоинты, которые статику отдают, нормально и заголовки кэширования из коробки дают).

И вот на прошлой неделе я как пользователь-админ делаю всякую мелочевку в нашем древнем MPA-монолите приложении с SSR, а страничка не обновляется. Возвращается результат из кэша. Самое страшное — даже в приватном режиме возвращается та же страница, где я “залогинен” и видны админские функции. Это Cloudflare решил любезно закэшировать страницу, и пофиг что ее нельзя кэшировать — ведь там есть .jar в URL! Абсолютно пофиг, что содержимое — это HTML страничка.

Решение вроде как очевидное — посылать правильный заголовок Cache-Control и Cloudflare настроить. Но с заголовками и нашим приложением возникла небольшая проблемка: если содержимое страницы отличается для разных пользователей, то надо эти кэши как-то разделять. Для этого есть Vary, но браузеры не заставишь посылать дополнительный заголовок, а Vary: Cookie — это антипаттерн. Другая проблема — CSRF-токены в HTML. В итоге сильно вкладываться в исправление проблемы не было ни желания, ни ресурсов, тупо отключили кэш, а в критическом месте оставили Vary: Cookie, потому что от этого, несмотря на проблемы, выиграет большинство пользователей. Но осадочек от Cloudflare остался. И ощущение, как будто “классический” web тут уступает современным фреймворкам: почти везде рекомендуют в подобных сценариях отдавать статический HTML, чтобы он кэшировался, а наполнять его на стороне клиента.

СсылкаКомментировать

Чистосердечное признание

Теперь, в новом (старом), 2026 году, когда канал набрал сумасшедшее количество подписчиков (аж 100!), пора признаться.

Все посты в этом канале были написаны нейросетью. Не верите?

  1. Первое длинное тире было использовано аж в десятом посте — в январе 2020, между прочим! А примерно с апреля 2020 года оно используется почти все время. Почти тогда же у канала появился сайт — совпадение? Нет! Это чтобы нейронку дообучать на истории постов.
  2. Подписи с авторcтвом пропали! Последний пост с подписью был тоже в апреле 2020, все сходится! Там даже что-то про человеков говорят. Админ не может с чистой совестью поставить свое авторство под нейрослопом!
  3. Многословие и словоблудие: вы только посмотрите, сколько текстов-потоков сознания. Почти везде присутствуют резкие переходы между темами, “логические зигзаги” и абстрактные умозаключения “капитана очевидности”, характерные для нейротекстов.
  4. Списки очень часто появляются. Вот, например: 1, 2. Что характерно, оба поста — краткий пересказ существующего материала, что является популярным вариантом использования нейросетей. Да даже и в этом посте есть список!
  5. Когда в канале стало 50 подписчиков, то были включены комментарии. А недавно началась активная монетизация — аж два поста (этот и этот) получили по одной звезде! Явно видно стратегию продвижения. Помните, что если контент бесплатный, то продукт — это вы!
  6. Не обязательно верить на слово — можем проверить последний пост самостоятельно с помощью инструмента Copyleaks AI Detector — 100% результат:

Делайте выводы. Пора отписываться.

СсылкаКомментировать