TGViewer
Channel Public Channel
Верхняя полка📝

Верхняя полка📝

@stopshelf

Путевые заметки программного инженера и легкоатлета-любителя.

Автор: Владимир @Toparvion Плизга

Домашняя страница: https://toparvion.pro/
Subscribers
360
Photos
349
Videos
11
Links
163

Showing posts older than #466 · Back to latest

Older Posts 5 shown
Post #465 408
Если вдруг вы пропустили, сообщаю, что опубликованы результаты опроса State of Java 2026. Они доступны всем желающим в виде небольшой, но ёмкой презентации:

https://jokerconf.com/research/state-of-java/2026/presentation.html

Напомню, что это был обстоятельный опрос #Java-разработчиков обо всём, что касается их профессии: от используемых языковых конструкций до желаемых зарплат. Я призывал вас принять в нём участие в апреле, а теперь пора пожинать плоды посмотреть, что получилось 👀

Для меня наиболее любопытными оказались мифы про VirtualThreads 🆚 WebFlux и про распределение желаемых зарплат по регионам. А что запомнилось вам? 👐
  • 👍 3
Post #464 382
Отлов спорадичных багов с помощью BTrace 👣

Один из забористых багов, с которым мне довелось "развлекаться" в преддверии отпуска, сочетал в себе много интересного:
— воспроизводился только на удалённом сервере в контуре партнёра;
— требовал одновременных действий минимум 2-х человек;
— не имёл чёткого набора шагов, а только некий паттерн;
— из-за этого требовал по несколько попыток, чтобы проявиться.

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

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

И тогда мне вспомнился BTrace — диагностический инструмент под зонтиком OpenJDK, позволяющий внедрять в байт-код работающего приложения различные инъекции (прямо на #Java) для доставания почти любых данных из полей и локальных переменных, в том числе аргументов методов. Из-за того, что такими инъекциями можно наломать дров, в BTrace придуман специальный DSL, сильно ограничивающий допустимые действия (например, нельзя вызывать почти никакие методы прикладного кода), но позволяющий безопасно "снюхивать" данные из многих точек приложения 👃

Основной фичей BTrace в этот раз для меня стало отслеживание зависимых вызовов — это когда для заданного метода агент реагирует не на любые вызовы, а только на те, которые произошли из тела другого (тоже заданного) метода. В тексте BTrace-скрипта выглядит это примерно так (сокращённо):

    @OnMethod(clazz = "SpreadsheetSession"
, method = "handleCellValue" // метод-инициатор вызова
, location = @Location(value = Kind.CALL
, clazz = "SpreadsheetSession"
, method = "calculateCellsDependentOnSingle")) // целевой (проблемный) метод
public static void handleCellValue(
@TargetMethodOrField String method,
@ProbeMethodName String probeMethod,
AnyType cellAbsRef,
boolean hasManualInput) {
// ...
String spreadsheet = str(Reflective.get("entity", cellAbsRef)); // извлечение данных через DSL
// вывод извлеченных данных (тоже на DSL)
println(method + " from " + probeMethod + ": " + spreadsheet + ":" + column + row + ", manualInput: " + hasManualInput);
}

Это похоже на зависимые точки останова в отладчике, только никакого останова не происходит, а собранные данные выводятся в консоль, из которой запущен BTrace 🖥

Конечно, первое применение BTrace требует сильно больше времени, чем повтыкать System.out.println() или подцепиться отладчиком. Но зато потом, когда механизм освоен и отлажен, итерации диагностики вида "написал-применил-посмотрел-повторил" укорачиваются до нескольких минут и позволяют эффективно локализовывать даже такие упоротые изощрённые проблемы, как эта 🧶

Надеюсь, вам никогда не придётся отлаживать такие баги. Но если вдруг, имейте в виду, что BTrace может в этом пригодиться ✍️

—
P.S. Любопытно, что 10 лет назад, когда я не знал о BTrace (хотя он уже в каком-то виде существовал), я создал собственный инструмент jMint со схожей идеей: внедрять в работающее приложение кусочки кода на Java (дроплеты), чтобы менять его поведение с целью тестирования и/или отладки. Основное отличие jMint — в отсутствии "безопасного" DSL. Причина здесь не только в слабоумии и отваге автора, но и в стремлении дать возможность заглушать нежелательное поведение или временно менять интересующее. Поэтому применение инструмента было строго ограничено тестовым контуром. Несмотря на опасности и ограничения, он неплохо прижился в моей прошлой команде и какое-то время продолжал применяться после моего ухода. Подробнее о нём можно узнать здесь 📖
—
GitHub GitHub - btraceio/btrace: Production-safe dynamic tracing and diagnostics for Java applications—attach to live JVMs with no restart… Production-safe dynamic tracing and diagnostics for Java applications—attach to live JVMs with no restart or recompilation. - btraceio/btrace
  • 🔥 12
  • 👍 4
  • ❤ 3
Post #458 251
Например, о том, что последовавшие за отпуском выходные оказались богатыми на #спорт 👇🏼

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

А на следующий день мне довелось впервые сбегать 10 км в рамках благотворительного забега "Достигая цели", приуроченного ко дню железнодорожника. Здесь конкуренция была существенно выше — в мужском абсолюте среди 107 бегунов мне удалось стать лишь 17-ым. Учитывая, что специально к такой дистанции я не готовился, считаю этот результат хорошим 👌

После таких выходных, знаете ли, приятно возвращаться к работе и осознавать, что она сидячая 🫠
  • 👍 6
  • 👏 4
  • 🏆 2
  • ❤ 1
Post #448 295
Как не трудно догадаться, если канал вдруг затих на две недели, значит, его автор в отпуске. Так и есть, на сей раз в Горном Алтае 🏞

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

Зато удалось много походить по небольшим горам, побегать вдоль завораживающих пейзажей, поплавать на лодке, катере, каяке и сапе — словом, осуществить ту пресловутую "смену обстановки", что иногда так необходима для поддержания нормальной работоспособности 👷‍♂️

А теперь можно приступать к новым делам и продолжать делиться новостями, благо, они есть 🙂
  • 🔥 11
  • ❤ 2
  • 👍 1
Post #438 300
Жить в регионе со среднегодовой температурой около 0℃ и разбросом ±35℃ — сомнительное удовольствие 🙃

С другой стороны, это создаёт клёвые условия для тренировок на свежем воздухе: хоть беговых, хоть лыжных 🏃‍♂️⛷

На фото — одна и та же опушка у лыжной базы близ Новосибирского Академгородка 📍

В июле и декабре 🌿❄️
  • ❤ 12
  • 🔥 2
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →