С последнего моего прогноза прошло уже 4 месяца! Пора снова заглянуть в будущее.
У меня есть 5 примеров из ближнего круга, когда тестировщики переходили в разработчики. Этот сценарий, чтобы войти в айти, а затем и в разработку (с часто бОльшими зарплатами) давно на слуху. Почему он до сих пор актуален? Да простят меня тестировщики, но на начальных позициях требования к ним меньше, особенно к специалистам по ручному тестированию.
Удивительно, но примеров, когда системный аналитик переходил в разработчики, у меня нет. Читал про такие кейсы в этих ваших интернетах, и то пару раз.А сейчас их станет ещё меньше — ниже объясню, почему.
Почему меня это удивляет? Разве набор компетенций системного аналитика гораздо не ближе к разработчику?
* сбор и описание функциональных, нефункциональных, пользовательских и бизнес-требований
* постановка задач
* проектирование БД
* написание SQL-запросов
* проектирование интеграций и API (JSON, SOAP, RPC, очереди, шины, GraphQL, WebSocket, Webhook и другие)
* проектирование архитектуры (System Design)
Давай проанализируем этот список. Чего в нем не хватает? Навыка написания кода⌨️ ! Какой вывод напрашивается? Системный аналитик с помощью ИИ вполне может заменить команду разработки.
Нужно просто поменять вектор приложения усилий: аналитик будет наполнять контекст и ставить задачи не кожаным мешкам, а ИИ. Больше не придется быть прокси между бизнесом и инженерами. А как мы знаем, любые вынужденные коммуникации внутри и между командами значительно бьют по производительности труда. Бизнес будет счастлив!
Первой целью вижу проекты, которые сосредоточены на перекладывании JSON'а. Это тот случай, когда сложность прикладного кода приложения невысока, но документация проекта может быть значительной. В этой схеме бизнес платит не за сложность технических решений, а за высокую когнитивную нагрузку на членов команды, а ИИ с рядом наполненных контекстов с этим прекрасно справится. Кажется, что в России финтех может стать первой такой экспериментальной площадкой.
Что думаешь? Объявляем бойкот системным аналитикам😡 ?
У меня есть 5 примеров из ближнего круга, когда тестировщики переходили в разработчики. Этот сценарий, чтобы войти в айти, а затем и в разработку (с часто бОльшими зарплатами) давно на слуху. Почему он до сих пор актуален? Да простят меня тестировщики, но на начальных позициях требования к ним меньше, особенно к специалистам по ручному тестированию.
Удивительно, но примеров, когда системный аналитик переходил в разработчики, у меня нет. Читал про такие кейсы в этих ваших интернетах, и то пару раз.
Почему меня это удивляет? Разве набор компетенций системного аналитика гораздо не ближе к разработчику?
* сбор и описание функциональных, нефункциональных, пользовательских и бизнес-требований
* постановка задач
* проектирование БД
* написание SQL-запросов
* проектирование интеграций и API (JSON, SOAP, RPC, очереди, шины, GraphQL, WebSocket, Webhook и другие)
* проектирование архитектуры (System Design)
Давай проанализируем этот список. Чего в нем не хватает? Навыка написания кода
Нужно просто поменять вектор приложения усилий: аналитик будет наполнять контекст и ставить задачи не кожаным мешкам, а ИИ. Больше не придется быть прокси между бизнесом и инженерами. А как мы знаем, любые вынужденные коммуникации внутри и между командами значительно бьют по производительности труда. Бизнес будет счастлив!
Первой целью вижу проекты, которые сосредоточены на перекладывании JSON'а. Это тот случай, когда сложность прикладного кода приложения невысока, но документация проекта может быть значительной. В этой схеме бизнес платит не за сложность технических решений, а за высокую когнитивную нагрузку на членов команды, а ИИ с рядом наполненных контекстов с этим прекрасно справится. Кажется, что в России финтех может стать первой такой экспериментальной площадкой.
Что думаешь? Объявляем бойкот системным аналитикам
Please open Telegram to view this post
VIEW IN TELEGRAM
😁6👍1
На прошлой неделе чинил логирование в реактивном приложении. Это был Spring Cloud Gateway на WebFlux, который достался нам по наследству от другой команды. Наконец дошли руки до этой задачи.
Меня, однако, зацепил другой момент. Нужно было залогировать ошибку, когда из реактивного контекста и ThreadLocal все было заботливо удалено:
В😐 .
Чем не угодили❌ , которые в некоторых ситуациях предполагались для
Нет, спасибо, эта история не для гейтвея.
Почувствуйте всю мою боль, пришлось писать полотно:
Дайте работягам one liner для HashMap по аналогии с
Утерев слёзы, я собрал все(потокобезопасные не рассматривал) one liner'ы ванильной Java для хэш-таблиц в сводную таблицу, где расписал свойства иммутабельности, возможность хранить nullable key и value, ограничения на число элементов, ловушки реализации и реализацию под капотом. Каждый из вариантов бережно приправлен тестами. Красота 🐸 🐸 🐸
Меня, однако, зацепил другой момент. Нужно было залогировать ошибку, когда из реактивного контекста и ThreadLocal все было заботливо удалено:
log.atError()
.addMarker(Markers.appendEntries(entries))
.setCause(e)
.log("Error occurred in MDCFilter");
В
Map<?, ?> entries передаем пары ключ-значение, которыми хотим обогатить запись в логе. В моем случае это trace_id и user_id. Конечно, хочется написать one liner для инициализации entries. Только сделать это на ванильной Java не получится: нет подходящего решения Чем не угодили
Map.of(...) и Map.ofEntries(...)? Они не принимают null-value user_id. Может тогда возьмём HashMap c Double Brace Initialization?new HashMap<>() {{
put(TRACE_ID, traceId);
put(USER_ID, userId);
}};Нет, спасибо, эта история не для гейтвея.
Почувствуйте всю мою боль, пришлось писать полотно:
Map<String, String> entries = new HashMap<>();
entries.put(TRACE_ID, traceId);
entries.put(USER_ID, userId);
Дайте работягам one liner для HashMap по аналогии с
Map.of(...) или Map.ofEntries(...)!Утерев слёзы, я собрал все
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4💯2❤1🔥1
А что собственно с логированием? В прошлый раз обещал рассказать подробнее. Это будет очередное подтверждение, зачем нужно знать многопоточку. Тем сложнее, что она здесь используется не в чистом виде, а в составе библиотек.
В очередной раз, бороздя просторы кибаны, я наткнулся на несоответствие идентификатора пользователя и содержимого в логируемых сообщениях. Пришлось приступить к исследованию кодовой базы сервиса. Я, честно, сначала грешил на нашу библиотеку логирования, однако дело было вобычном советском ... неаккуратной работе с MDC (Mapped Diagnostic Context) в нашей реализации интерфейса
🤪
Если бы нам было достаточно локальной видимости ключа в рамках одного оператора, то мы могли бы:
* явно удалять ключ с помощью
* использовать
* использовать
При использовании цепочек операторов мы не можем работать с
Это позволяет сделать библиотеку осведомлённой о состоянии злополучного
Углубиться в детали можно в цикле из трех статей.
А что в Kotlin? Все несколько проще, хотя при работе с корутинами и suspend-функциями мы так же не можем напрямую использовать
Такие дела😎
В очередной раз, бороздя просторы кибаны, я наткнулся на несоответствие идентификатора пользователя и содержимого в логируемых сообщениях. Пришлось приступить к исследованию кодовой базы сервиса. Я, честно, сначала грешил на нашу библиотеку логирования, однако дело было в
org.springframework.cloud.gateway.filter.GlobalFilter:@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
...
MDC.put(USER_ID, userId);
...
}
org.slf4j.MDC используется для правки значений в MDC. Делается это с помощью вызова MDC.put(), который устанавливает пару ключ-значение. Под капотом MDC работает с экземпляром ch.qos.logback.classic.util.LogbackMDCAdapter. LogbackMDCAdapter в свою очередь работает на ThreadLocal-переменных.
ThreadLocal привязан к конкретному потоку, а не к запросу пользователя. Если вы установили значение в MDC (ThreadLocal) в операторе реактивной цепочки, то следующий оператор, может не увидеть его, так как вполне возможно будет выполнен на другом потоке. Наша задача — подружить библиотеку, которая понятия не имеет о том, что работает в реактивном приложении с этим самым реактивным приложением Если бы нам было достаточно локальной видимости ключа в рамках одного оператора, то мы могли бы:
* явно удалять ключ с помощью
MDC.remove() в блоке finally * использовать
MDC.putCloseable() в блоке try-with-resources* использовать
MDC.getCopyOfContextMap и MDC.setContextMap для захвата и дальнейшего восстановления состояния MDCВажно понимать, что метод MDC.putCloseable() не восстанавливает предыдущее значение, которое было перезаписано под уже существующим ключом!
При использовании цепочек операторов мы не можем работать с
org.slf4j.MDC напрямую. Вместо этого, начиная с Spring Framework 6.0 /Spring Boot 3.0 / reactor-core 3.5.0, у нас появилась возможность использовать связку io.micrometer:context-propagation и reactor.core.publisher.Hooks. Вызов Hooks.enableAutomaticContextPropagation() позволяет библиотеке встроиться в механизм Project Reactor. После этого мы можем взаимодействовать с io.micrometer.context.ContextRegistry через метод registerThreadLocalAccessor:public static void registerMdcKey(String mdcKey) {
Supplier<String> getKey = () -> MDC.get(mdcKey);
Consumer<String> putKey = value -> MDC.put(mdcKey, value);
Runnable removeKey = () -> MDC.remove(mdcKey);
ContextRegistry.getInstance()
.registerThreadLocalAccessor(mdcKey,
getKey,
putKey,
removeKey);
}Это позволяет сделать библиотеку осведомлённой о состоянии злополучного
ThreadLocal. После этого мы можем использовать contextWrite на Flux/Mono, чтобы установить "метаданные", которые мы хотим передавать по цепочке:chain.filter(exchange)
.contextWrite(ctx -> ctx.putNonNull(USER_ID, userId))
Углубиться в детали можно в цикле из трех статей.
А что в Kotlin? Все несколько проще, хотя при работе с корутинами и suspend-функциями мы так же не можем напрямую использовать
org.slf4j.MDC: корутина может "уйти" на другой поток. Нужно прокинуть свой kotlinx.coroutines.slf4j.MDCContext в контекст корутины:withContext(MDCContext(...) + ..., block)
MDCContext имплементирует kotlinx.coroutines.ThreadContextElement (который в свою очередь имплементирует CoroutineContext.Element) и автоматически обновляет MDC при каждом переключении потока. Такие дела
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤🔥1🔥1
Часть 1. Есть ли настоящее и будущее у микробенчмаркинга?
С коллегами все чаще начали задаваться вопросом: "Не стоит ли поэкспериментировать с нагруженными core-сервисами?"
Что подразумевается под экспериментами?
1) остаться в лоне jvm, но сменить фреймворк с Java/Kotlin + SpringBoot + Webflux
2) переписать сервис на другой язык
Первое, что приходит в голову и в то же время наименее болезненно — отказаться от Webflux в пользу VirtualThreads, но 25-ый LTS-релиз еще не завезли. Почему его надо ждать — писал ранее.
На слепое переписывание сервисов под разные связки язык-фреймворк, понятное дело, времени нет, поэтому нужно проводить ресерч для определения наиболее перспективных кандидатов.
Может быть кто-то сделал эту работу за нас? Коллеги, опять же, поделились такой ссылочкой — sharkbench.dev.
Что понравилось? Достаточно богатый список языков и фреймворков. Можно посмотреть тестируемый код, который, на удивление, прикладывают не всегда. Для этого нажимайте на...сам не сразу додумался, пока в исходный код страницы не залез 🤣 .
Всего видим два набора тестов: с IO-bound (раздел Web frameworks) и CPU-bound (раздел Computation) нагрузкой. Если CPU нагружается алгоритмом вычисления приближения числа π, уже ставший стандартом де-факто, то с IO-bound нагрузкой нужно разобраться. Тестируется достаточно простой сценарий: происходит случайное обращение к двум параметризированным GET-ручкам, которые проксируют json'ы из локально выставленного источника, что и создает IO-нагрузку. К результатам такого тестирования, однако, надо подходить критически, так как профиль нагрузки вряд ли можно назвать prod like. Вместо реальной эффективности языка-фреймворка мы видим, как хорошо решается узкая задача.
Особенно хорошо в тестах это демонстрирует JDK Semeru от IBM, чей сборщик мусора по умолчанию как раз заточен на работу с большим числом короткоживущих объектов. Может быть, конечно, это и была идея автора.
Подведем итоги. Для первого знакомства ресурс подойдёт вполне неплохо, но пока хочется изучить альтернативы для принятия взвешенного решения. Как минимум ещё один такой есть на примете, ждите в следующих сериях.
P.S. Пока изучал, что за зверь такой IBM Semeru, наткнулся на сайт с хорошим верхнеуровневым сравнением JDK от разных вендоров jdkcomparison.com, рекомендую. И еще один whichjdk.com.
С коллегами все чаще начали задаваться вопросом: "Не стоит ли поэкспериментировать с нагруженными core-сервисами?"
Что подразумевается под экспериментами?
1) остаться в лоне jvm, но сменить фреймворк с Java/Kotlin + SpringBoot + Webflux
2) переписать сервис на другой язык
Первое, что приходит в голову и в то же время наименее болезненно — отказаться от Webflux в пользу VirtualThreads, но 25-ый LTS-релиз еще не завезли. Почему его надо ждать — писал ранее.
На слепое переписывание сервисов под разные связки язык-фреймворк, понятное дело, времени нет, поэтому нужно проводить ресерч для определения наиболее перспективных кандидатов.
Может быть кто-то сделал эту работу за нас? Коллеги, опять же, поделились такой ссылочкой — sharkbench.dev.
Что понравилось? Достаточно богатый список языков и фреймворков. Можно посмотреть тестируемый код, который, на удивление, прикладывают не всегда. Для этого нажимайте на
<> в первой колонке Всего видим два набора тестов: с IO-bound (раздел Web frameworks) и CPU-bound (раздел Computation) нагрузкой. Если CPU нагружается алгоритмом вычисления приближения числа π, уже ставший стандартом де-факто, то с IO-bound нагрузкой нужно разобраться. Тестируется достаточно простой сценарий: происходит случайное обращение к двум параметризированным GET-ручкам, которые проксируют json'ы из локально выставленного источника, что и создает IO-нагрузку. К результатам такого тестирования, однако, надо подходить критически, так как профиль нагрузки вряд ли можно назвать prod like. Вместо реальной эффективности языка-фреймворка мы видим, как хорошо решается узкая задача.
Особенно хорошо в тестах это демонстрирует JDK Semeru от IBM, чей сборщик мусора по умолчанию как раз заточен на работу с большим числом короткоживущих объектов. Может быть, конечно, это и была идея автора.
Подведем итоги. Для первого знакомства ресурс подойдёт вполне неплохо, но пока хочется изучить альтернативы для принятия взвешенного решения. Как минимум ещё один такой есть на примете, ждите в следующих сериях.
P.S. Пока изучал, что за зверь такой IBM Semeru, наткнулся на сайт с хорошим верхнеуровневым сравнением JDK от разных вендоров jdkcomparison.com, рекомендую. И еще один whichjdk.com.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5❤1
Часть 2. Есть ли настоящее и будущее у микробенчмаркинга?
Продолжаем исследование, первая часть здесь.
Пробежавшись по Интернетам я понял, что примеров таких проектов, которые ведут систематические наблюдения за языками/фреймворками, не так уж и много. Предлагаю посмотреть, что удалось найти:
programming-language-benchmarks.vercel.app → тестируются базовые алгоритмы, написанные на разных языках (без фреймворков), представлено несколько связок алгоритм + рантайм / компилятор для каждого языка, удобный интерфейс для проведения сравнительного анализа языков, можно посмотреть исходный код (как впрочем и на всех остальных ресурсах)
benchmarksgame-team.pages.debian.net → аналогичен предыдущему, но с менее дружелюбным интерфейсом. Из интересного: судя по дискуссии, там когда-то был Kotlin, но выпилили за отсутствием интереса☔️
web-frameworks-benchmark.netlify.app → расширенный вариант (по количеству исследуемых связок) рассматриваемого ранее sharkbench.dev. Также тестируются довольно простые сценарии на железе уровня домашнего ПК.
techempower.com/benchmarks → самый фундаментальный труд из представленных: много, нет, МНОГО связок-язык фреймворк, которые почти ежегодно тестируются на prod-like железе в 7 различных сценариях (JSON Serialization, Single Database Query, Multiple Database Queries, Fortunes, Database Updates, Plaintext, Caching). Подробнее в их wiki.
Первые два кандидата хороши, но ответа на вопрос «какую взять связку для нового микросервиса» они не дадут. Тем не менее, если интересует изолированная производительность рантайма — эти ресурсы можно добавить в закладки.
Перейдем сразу к четвертому кандидату и работе, проделанной TechEmpower. Титанический труд, моё почтение! Получился фундаментальный обзор существующих решений. Я точно на час-другой залип, разбираясь кто такой Вован и что мне делать с офисным этажом🤣 . Если рассматривать решения на Java / Kotlin / Go / Scala / Rust, то в каждой из категорий чаще побеждают связки на Rust или Java. Уфф, не придется Go учить пока! Как и в прошлый раз в категории Java в топах видим Quarkus и Vert.x. Прощай Spring? Rust судя по этим тестам можно считать абсолютным лидером среди вообще всех языков. Вот и определились потенциальные кандидаты для гейтвея 👦 ?
Добавлю ложку дегтя, чтобы жизнь медом не казалась. Для честного сравнения абсолютно необходим вдумчивый разбор каждой реализации — насколько корректно реализована микрологика и используются библиотеки, что кэшируется, не было ли решение намеренно затюненоили наоборот под конкретный бенчмарк. Чего пока не хватает и, наверное, чего никогда не будет в такого рода бенчмарках, так это навороченных боевых сценариев, которые можно найти в кровавом enterprise, а именно:
* приближенности тестируемого кода по сложности к уровню микросервиса, а не просто "выжать максимум из худенькой ручки"
* сериализации / десериализации сложных структур
* интеграции с брокерами сообщений (хотя взаимодействие с реальными СУБД есть)
Много хочу? Определенно👍 . Удивительно, что нет или я не нашел? ресурса, где бы упор шел на тестирование прицельно JVM-приложений, обмазанных логикой и интеграциями. Кажется, что написав сервис один раз, его будет не так сложно портировать под другие фреймворки. Может нам было бы достаточно поменять библиотеку сериализации / работы с MongoDB / Kafka? Хотя, конечно, с точки зрения долгосрочной поддержи это будет достаточно затратное мероприятие. Да и насколько такому тестированию можно будет верить? Подняли мы тут на днях немажорные версии библиотек на гейтвее и нагрузочное тестирование показало рост CPU в районе 10% 🤣 В итоге никогда точно не скажешь, как фреймворк поведёт себя на реальных задачах, а не в изолированном микробенчмарке. Идем проводить эксперименты на стенде нагрузочного тестирования? 💯%
Если знаешь другие ресурсы, где проводят такие сравнения — пишите мне в личку @senior_junior_dev, буду рад дополнить подборку.
Продолжаем исследование, первая часть здесь.
Пробежавшись по Интернетам я понял, что примеров таких проектов, которые ведут систематические наблюдения за языками/фреймворками, не так уж и много. Предлагаю посмотреть, что удалось найти:
programming-language-benchmarks.vercel.app → тестируются базовые алгоритмы, написанные на разных языках (без фреймворков), представлено несколько связок алгоритм + рантайм / компилятор для каждого языка, удобный интерфейс для проведения сравнительного анализа языков, можно посмотреть исходный код (как впрочем и на всех остальных ресурсах)
benchmarksgame-team.pages.debian.net → аналогичен предыдущему, но с менее дружелюбным интерфейсом. Из интересного: судя по дискуссии, там когда-то был Kotlin, но выпилили за отсутствием интереса
web-frameworks-benchmark.netlify.app → расширенный вариант (по количеству исследуемых связок) рассматриваемого ранее sharkbench.dev. Также тестируются довольно простые сценарии на железе уровня домашнего ПК.
techempower.com/benchmarks → самый фундаментальный труд из представленных: много, нет, МНОГО связок-язык фреймворк, которые почти ежегодно тестируются на prod-like железе в 7 различных сценариях (JSON Serialization, Single Database Query, Multiple Database Queries, Fortunes, Database Updates, Plaintext, Caching). Подробнее в их wiki.
Первые два кандидата хороши, но ответа на вопрос «какую взять связку для нового микросервиса» они не дадут. Тем не менее, если интересует изолированная производительность рантайма — эти ресурсы можно добавить в закладки.
Перейдем сразу к четвертому кандидату и работе, проделанной TechEmpower. Титанический труд, моё почтение! Получился фундаментальный обзор существующих решений. Я точно на час-другой залип, разбираясь кто такой Вован и что мне делать с офисным этажом
Добавлю ложку дегтя, чтобы жизнь медом не казалась. Для честного сравнения абсолютно необходим вдумчивый разбор каждой реализации — насколько корректно реализована микрологика и используются библиотеки, что кэшируется, не было ли решение намеренно затюнено
* приближенности тестируемого кода по сложности к уровню микросервиса, а не просто "выжать максимум из худенькой ручки"
* сериализации / десериализации сложных структур
* интеграции с брокерами сообщений (хотя взаимодействие с реальными СУБД есть)
Много хочу? Определенно
Если знаешь другие ресурсы, где проводят такие сравнения — пишите мне в личку @senior_junior_dev, буду рад дополнить подборку.
Please open Telegram to view this post
VIEW IN TELEGRAM
✍1❤1
This media is not supported in your browser
VIEW IN TELEGRAM
После того, как мой прошлый помидорный таймер приказал долго жить после трех дней работы, потребовав 11$, я понял, что не хочу больше это терпеть ☝ . Я хочу гибкости, настраиваемой статистики и полного контроля над происходящим. Пришлось повайбкодить, чтобы у тебя тоже был такой инструмент. Итак...
Открой для себя Pomodoro Supreme — сверхнадёжный отказоустойчивый таймер фокусировки моей собственной разработки.
🚀 Особенности, которые вдохновляют
🌐 Всегда с тобой — в любой точке планеты
Работает в облаке, синхронизируется автоматически: начни сессию в Москве, продолжи во Владивостоке. Всё, что тебе нужно — Google-аккаунти доступ в сеть Интернет.
🛡 Абсолютная отказоустойчивость
Google-инфраструктура обеспечивает надежность уровня 99.999%. Даже апокалипсису придётся подождать до конца твоей фокус-сессии.
🧩 Гибкость без ограничений
Поддержка любых активностей, настройка длительности, расширяемость через Google Apps Script — хочешь Telegram-бота, Slack-оповещения или аналитику? Легко!Ты всё это сможешь добавить сам!
📦 Полная автономность
Не требует хостинга, развертывания или оплаты серверов. Все данные хранятся в Google Таблице — просто, прозрачно, под твоим контролем.
💡 Для кого это?
Для всех, кому важно работать в ритме и тех, кто хочет по окончании очередной сессии слышать этот эпический звук.
Никаких установок. Никаких банковских карт. Только ты, твоя цель и максимальная концентрация.
Готов начать? Просто открой Google Таблицу. Скачай код тут😵💫 Перейди в интерфейс Apps Script, скопируй код в соответствующие файлы и нажми "Начать развертывание" ⌨️
Открой для себя Pomodoro Supreme — сверхнадёжный отказоустойчивый таймер фокусировки моей собственной разработки.
🚀 Особенности, которые вдохновляют
🌐 Всегда с тобой — в любой точке планеты
Работает в облаке, синхронизируется автоматически: начни сессию в Москве, продолжи во Владивостоке. Всё, что тебе нужно — Google-аккаунт
🛡 Абсолютная отказоустойчивость
Google-инфраструктура обеспечивает надежность уровня 99.999%. Даже апокалипсису придётся подождать до конца твоей фокус-сессии.
🧩 Гибкость без ограничений
Поддержка любых активностей, настройка длительности, расширяемость через Google Apps Script — хочешь Telegram-бота, Slack-оповещения или аналитику? Легко!
📦 Полная автономность
Не требует хостинга, развертывания или оплаты серверов. Все данные хранятся в Google Таблице — просто, прозрачно, под твоим контролем.
💡 Для кого это?
Для всех, кому важно работать в ритме
Никаких установок. Никаких банковских карт. Только ты, твоя цель и максимальная концентрация.
Готов начать? Просто открой Google Таблицу. Скачай код тут
Please open Telegram to view this post
VIEW IN TELEGRAM
😁3🔥2🫡2🎉1
Везде говорят, что найм умер, а мы активно набираем джавистов. Посмотрел вакансии Сбера, их сейчас тоже много. Наблюдаю, что банки активно развивают небанковские продукты, постепенно захватывая новые рынки. Это всё еще раз подтверждает, что банкиры всегда зарабатывают, даже в кризис. Сразу всплывают в голове мемы про доступное жилье доступную ипотеку 😃 . Яндекс тоже не отстает.
Активный найм — много собеседований. Чтобы не нарваться на кандидата, который проходит паровозик (несколько кандидатов идут на одну и ту же вакансию, собирая базу вопросов) или пользуется базой слитых вопросов, выработал для себя ультимативную тактику. Каждый раз задаю на 80% новый набор вопросов, благо ChatGPT не страдает от недостатка фантазии. Конечно, такой подход требует как бОльшую подготовку перед самим собеседованием, так и сильную теоретико-практическую базу. Все это в наличии😎
Для того, чтобы отсеять накрутчиков опыта, выполняем ревью кода и решаем небольшие практические задачки на знание языка. Условие одной из них: нужно написать неблокирующий потокобезопасный стек, не используя коллекций из библиотеки j.u.c. Попробуй свои силы. Вот решение:
На medium есть целая статья, которая предлагает более элегантное решение с хвостовой рекурсией на Kotlin.
Раньше давал алгоритмическую задачу, от которой впоследствии отказался. За отведенные 15 минут нужно было нарисовать лестницу заданной высоты N вида:
Казалось бы, отступил нужное число пробелов и вывел
Сейчас есть множество других методов, чтобы обмануть интервьюера:
* AI-инструменты, которые позволяют отвечать на вопросы в режиме реального времени, но невидимые при демонстрации экрана. Можно приспособить под это отдельный монитор или мобильное устройство/планшет в идеале с AI-коррекцией направления взгляда
* синхронизация речи и движений губ у AI-клона в реальном времени
* парное прохождение собеседований, когда ответы диктуются более подготовленным напарником, или вообще прохождение собеседования другим человеком
В целом не имеет значения, удалось ли обмануть кандидату интервьюера, если в дальнейшем на испытательном сроке он справляется с поставленными задачами. Хуже, когда команда в течение трех месяцев не получает ожидаемой отдачи от новичка, а тянет ношу и за себя и за того парня. Жаль, что испытательный срок перестал быть лишь формальностью.
Активный найм — много собеседований. Чтобы не нарваться на кандидата, который проходит паровозик (несколько кандидатов идут на одну и ту же вакансию, собирая базу вопросов) или пользуется базой слитых вопросов, выработал для себя ультимативную тактику. Каждый раз задаю на 80% новый набор вопросов, благо ChatGPT не страдает от недостатка фантазии. Конечно, такой подход требует как бОльшую подготовку перед самим собеседованием, так и сильную теоретико-практическую базу. Все это в наличии
Для того, чтобы отсеять накрутчиков опыта, выполняем ревью кода и решаем небольшие практические задачки на знание языка. Условие одной из них: нужно написать неблокирующий потокобезопасный стек, не используя коллекций из библиотеки j.u.c. Попробуй свои силы. Вот решение:
public class LockFreeStack<T> {
// по классике хранит непосредственно значение и ссылку на следующую Node
private static class Node<T> { ...
private final java.util.concurrent.atomic.AtomicReference<Node<T>> head = new AtomicReference<>();
public void push(T element) {
Node<T> newNode;
Node<T> currentHead;
do {
currentHead = head.get();
newNode = new Node<>(element, currentHead);
} while (!head.compareAndSet(currentHead, newNode));
}
public T pop() {
Node<T> currentHead;
Node<T> nextNode;
do {
currentHead = head.get();
if (currentHead == null) {
return null;
}
nextNode = currentHead.next;
} while (!head.compareAndSet(currentHead, nextNode));
return currentHead.value;
}
}
На medium есть целая статья, которая предлагает более элегантное решение с хвостовой рекурсией на Kotlin.
Раньше давал алгоритмическую задачу, от которой впоследствии отказался. За отведенные 15 минут нужно было нарисовать лестницу заданной высоты N вида:
|¯
|¯
|¯
Казалось бы, отступил нужное число пробелов и вывел
|¯, но справился за все время с этим единственный синьор. Не знаю почему, но это был реальный гроб.Сейчас есть множество других методов, чтобы обмануть интервьюера:
* AI-инструменты, которые позволяют отвечать на вопросы в режиме реального времени, но невидимые при демонстрации экрана. Можно приспособить под это отдельный монитор или мобильное устройство/планшет в идеале с AI-коррекцией направления взгляда
* синхронизация речи и движений губ у AI-клона в реальном времени
* парное прохождение собеседований, когда ответы диктуются более подготовленным напарником, или вообще прохождение собеседования другим человеком
В целом не имеет значения, удалось ли обмануть кандидату интервьюера, если в дальнейшем на испытательном сроке он справляется с поставленными задачами. Хуже, когда команда в течение трех месяцев не получает ожидаемой отдачи от новичка, а тянет ношу и за себя и за того парня. Жаль, что испытательный срок перестал быть лишь формальностью.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6⚡2👍1
Насобирал с последнего поста по собеседованиям немного вестей с полей.
Коллега пишет:
Софтина, конечно, не обязательно именно такая была, но идея понятна: ИИшка разбирает аудиопоток и выдает ответы на вопросы интервьюера в режиме реального времени.В мирном русле можно использовать подобные софтины в качестве переводчика для интервью на иностранных языках, конечно, генерируя ответы самостоятельно.
Как это проявлялось:
Буквально вчера столкнулся с подобным на скрининге: на первоначальный вопрос в ответ полная ерунда, затем после незначительного уточнения/повторения развернутый подробный ответ. И так не один раз, а буквально через вопрос. На некоторые — вообще не получил ответ при том, что спрашивал вполне себе базу у разработчика со стажем в 5 лет...так в резюме написано, я бумажке верю 😃
Может я разучился правильно формулировать мысли? Надеюсь, вы меня еще понимаете. Понимаете же🤩 ? Но, кажется, дело все же в другом. ИИ полностью отключает способность думать. Но не у всех: слабый кандидат с ИИ раскрывается в ещё более невыгодном свете, а сильный кандидат, наоборот, поймает синергию. Должно хватать когнитивных возможностей для того, чтобы обрабатывать два параллельных потока, что возможно только при серьезной подготовке.
Вы скажете: "Паранойя!". Возможно, но другой мой коллега пишет:
При этом все же есть хорошие кандидаты, которые не всё знают, но готовы рассуждать и в диалоге приходить к правильному ответу, что более ценно, чем сам правильный ответ.
Лет, наверное, 5 назад мне очень запомнились два менти. Парень и девушка, которые не имели профильного образования и работали в совершенно не связанных с IT сферах. Они только закончили курсы и хотели получить какой-то опыт собеседований. Каждого из них после первого mock-интервью я отправил собирать офферы. Их ответы были точны и по делу. Практически не было вопросов, на которые они не знали ответ, но даже в этом случае они не сдавались. Это были очень приятные собеседования, о которых я до сих пор помню. Ребята нашли работу в течение двух недель. Да, рынок был другой, но у меня не было сомнений, что работодатели будут бороться за таких специалистов.
А что делать интервьюерам?
В рамках подготовки HR-ы могут хотя бы попросить выписку из электронной трудовой. Мы в свою очередь можем, посмотреть активность в Git-репозитории, но тогда никого не наймем...
На самом интервью будем просить включить камеру со второго ракурса и не использовать наушники, как я писал ранее, буду задавать на 80% новый набор вопросов. Вопросы должны быть не в лоб, как, например, "Что такое Index Only Scan?" в контексте анализа плана запроса, а "Чем плох Index Only Scan?". В них по незнанию тяжелее сориентироваться.
Коллеги развивают идею:
Тут главное не переборщить, чтобы не сбить с толку не ИИ-powered кандидата. И, конечно, давать задачки по проектированию, которые очень хорошо показывают ход мыслей кандидата. Без сильной базы даже с ИИ тяжело будет принимать адекватные решения, чтобы добиться поступательного прогресса при возникающих ограничениях.
Такой вот он найм сейчас — крутимся как можем🤩
Коллега пишет:
Есть острое ощущение, что сейчас на скрининге кандидат использовал нейросетку для прохождения собесов: cluely.com
К кому придет на интервью товарищ ... — присмотритесь.
Софтина, конечно, не обязательно именно такая была, но идея понятна: ИИшка разбирает аудиопоток и выдает ответы на вопросы интервьюера в режиме реального времени.
Как это проявлялось:
Структура ответа всегда одинаковая: сначала полная хрень, потом по бумажке. Говорили чуть-чуть про кубер, спросил его про сайдкары. Он резко сменил контекст, начал рассказывать про распределенные транзакции. Стал у него уточнять, выяснилось, что он про saga рассказывает. Видать нейросетка ослышалась.
Буквально вчера столкнулся с подобным на скрининге: на первоначальный вопрос в ответ полная ерунда, затем после незначительного уточнения/повторения развернутый подробный ответ. И так не один раз, а буквально через вопрос. На некоторые — вообще не получил ответ при том, что спрашивал вполне себе базу у разработчика со стажем в 5 лет...
Может я разучился правильно формулировать мысли? Надеюсь, вы меня еще понимаете. Понимаете же
Вы скажете: "Паранойя!". Возможно, но другой мой коллега пишет:
Дочка-студентка рассказывала как ребята сейчас проходят почти любой собес: ставят 2 компа и 2 человека. Второй ищет ответы в нейросетке и показывает первому. Поэтому, если человек сначала говорит фигню, а потом вдруг дает правильный ответ, на мой взгляд, это гарантия подсказок.
При этом все же есть хорошие кандидаты, которые не всё знают, но готовы рассуждать и в диалоге приходить к правильному ответу, что более ценно, чем сам правильный ответ.
Лет, наверное, 5 назад мне очень запомнились два менти. Парень и девушка, которые не имели профильного образования и работали в совершенно не связанных с IT сферах. Они только закончили курсы и хотели получить какой-то опыт собеседований. Каждого из них после первого mock-интервью я отправил собирать офферы. Их ответы были точны и по делу. Практически не было вопросов, на которые они не знали ответ, но даже в этом случае они не сдавались. Это были очень приятные собеседования, о которых я до сих пор помню. Ребята нашли работу в течение двух недель. Да, рынок был другой, но у меня не было сомнений, что работодатели будут бороться за таких специалистов.
А что делать интервьюерам?
В рамках подготовки HR-ы могут хотя бы попросить выписку из электронной трудовой. Мы в свою очередь можем, посмотреть активность в Git-репозитории, но тогда никого не наймем...
Коллеги развивают идею:
Можно задавать вопросы настолько всрато (издалека заходить), что их даже ИИ не разберет.
Тут главное не переборщить, чтобы не сбить с толку не ИИ-powered кандидата. И, конечно, давать задачки по проектированию, которые очень хорошо показывают ход мыслей кандидата. Без сильной базы даже с ИИ тяжело будет принимать адекватные решения, чтобы добиться поступательного прогресса при возникающих ограничениях.
Такой вот он найм сейчас — крутимся как можем
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤2🤔1
Все же уже видели ⬆️? В связи с этим:
Идея для стартапа №1
Нужно сделать фейк настолько дип, что задействовано будет все помещение, а видеопотоки будут синхронизироваться на несколько устройств. Причем готовая запись не подойдет — будут просить протереть камеры и покрутиться на стуле💃
Говорят, что современные проблемы требуют современных решений. С собеседованиями же наоборот — вернётся в моду оффлайн формат. Выиграют те компании, у кого офисы и интервьюеры есть в разных локациях. Для малых и даже средних компаний это настоящая головная боль, так как они значительно ограничены географией присутствия. Их продолжат нещадно обманывать... Поэтому у меня на подходе:
Идея для стартапа № 2
В связи с этим все большей популярностью будут пользоваться системы независимой оценки кандидатов.
Linkedin и HH (в рамках Национальной системы подтверждения IT-компетенций🧐 ) уже предлагают подтвердить свои навыки. Правда, в текущем виде ценность для работодателя такой оценки чуть меньше, чем нулевая.
Как это должно выглядеть НА САМОМ ДЕЛЕ? Кандидат приезжает в локацию, где под наблюдением и с использованием средств РЭБ🪖 будет проходить собеседование по заранее выбранным темам. За достоверность результатов компания отвечает в первую очередь своим именем. Это напоминает сдачу сертификационных экзаменов Oracle, которые в России (как, наверное, и везде) можно было сдать только в тестовых центрах Pearson VUE.
———
Видится, что процесс найма и поиска работы станет ещё более длинным. Работягам из глубинки придется ещё чаще перебираться в крупные города, а компании из регионов продолжат довольствоваться малым.
———
Как обычно в этом безумии не проиграют сильные разработчики. Настоящие синьоры нарасхват при любой погоде. Если чувствуешь, что застрял в развитии карьеры, то приходи ко мне на консультацию, чтобы откусить кусочек побольше от лакомого IT-пирога🥰 .
Идея для стартапа №1
Нужно сделать фейк настолько дип, что задействовано будет все помещение, а видеопотоки будут синхронизироваться на несколько устройств. Причем готовая запись не подойдет — будут просить протереть камеры и покрутиться на стуле
Говорят, что современные проблемы требуют современных решений. С собеседованиями же наоборот — вернётся в моду оффлайн формат. Выиграют те компании, у кого офисы и интервьюеры есть в разных локациях. Для малых и даже средних компаний это настоящая головная боль, так как они значительно ограничены географией присутствия. Их продолжат нещадно обманывать... Поэтому у меня на подходе:
Идея для стартапа № 2
В связи с этим все большей популярностью будут пользоваться системы независимой оценки кандидатов.
Linkedin и HH (в рамках Национальной системы подтверждения IT-компетенций
Как это должно выглядеть НА САМОМ ДЕЛЕ? Кандидат приезжает в локацию, где под наблюдением и с использованием средств РЭБ
———
Видится, что процесс найма и поиска работы станет ещё более длинным. Работягам из глубинки придется ещё чаще перебираться в крупные города, а компании из регионов продолжат довольствоваться малым.
———
Как обычно в этом безумии не проиграют сильные разработчики. Настоящие синьоры нарасхват при любой погоде. Если чувствуешь, что застрял в развитии карьеры, то приходи ко мне на консультацию, чтобы откусить кусочек побольше от лакомого IT-пирога
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍1🔥1
Как у вас с рекурсивно заданными типами?
Меня в коде они всегда приводят в замешательство🧐 На самом деле, это не что иное, как F-bounded Polymorphism. Попробуем вместе разобраться с этим понятием, и какое отражение оно нашло в Java 👉 тык. В пост телеги контент не влез.
public abstract class Enum<E extends Enum<E>> ...interface Entity<T extends Еntity<T>> ...Меня в коде они всегда приводят в замешательство
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Прошёл Легендарную тридцатку!
Последний раз я ходил в трёхнедельный школьно-студенческий поход на Камчатку. Было это более 10 лет назад. В этот раз занетворкался с ребятами из дружественного банка.
Как было круто, можно увидеть на фото. Я же хотел поделиться моим скромным опытом о технической стороне похода.
Оптимизация расходов
Приобрести всю экипировку может стоить достаточно дорого, особенно если вы любите комфорт.
Чтобы не попасть в долговую яму, часть экипировки я взял у друга, а часть — в аренду. Так делали многие ребята.
Палатка
Взял свою старую добрую двухместную Freetime Easy Ride. Она относительно легкая (2.2 кг) и простая в установке, но достаточно серьезно потеет ночью и оборудована одним тамбуром. Сейчас я бы взял что-то более легкое, практичное и технологичное. Можно присмотреться, например, к топовым вариантам от Sea To Summit (одноместная на 1,1 кг, двухместная на 1,4 кг).
Коврик и спальный мешок
Классический коврик не брал. Взял у друга надувной матрас. Было очень удобно, но так как не посмотрел его характеристики, то ночью в сочетании с моим спальником было прохладно. Приходилось утеплять его флисками. мысли на этот счёт:
* спальник я бы брал максимально теплый, но в то же время легкий (до 700-800 гр), например, такой. Если жарко, то его можно просто не застегивать;
* коврик дает защиту от проколов и холода надувному матрасу, но достаточно объемный. Можно рассмотреть утепленные матрасы;
* ребята брали обычные коврики, что не так удобно, но в сочетании с тёплыми спальниками работали хорошо;
* учитывайте одежду, в которой будете спать, чтобы она не крала тепло.
Рюкзак
Желательно подобрать в магазине, предварительно нагрузив. Чем больше регулировок, тем больше шанс что-то поправить непосредственно в походе. Если рюкзак очень большой, не под ваш рост, то никакие регулировки не помогут.
Фонарик
Выбирать нужно такой, где будут хотя бы три режима: автономный для палатки, ближний свет, например, для ужина, чтобы никого не слепить, и дальний для перемещений.
Одежда и обувь (и прочее)
Тут все достаточно просто: нужно проиграть сценарии, в которых будете использовать ту или иную вещь, и берёте в соответствии с ними самый минимум. Всегда ценятся хорошие мембраны и то, что быстро сохнет.
Так как на солнце я быстро сгораю, то мне в этот раз хорошую службу сослужили панама с защитой от солнца 360°, перчатки и брюки-трансформеры с отстёгивающимися штанинами. А вот купленная белая джерси по ощущениям долго сохла, хотя и была очень легкой.
У обоих новых ботинок Millet на третий день в зона сгиба носка отошла прорезиненная защита😐 . Обязательно разносите новые ботинки хотя бы несколько дней до похода.
Итого
Дорогая экипировка делает поход супер комфортным. Бюджетные альтернативы обычно предлагают некоторый компромисс. Независимо от бюджета, придется продумать все до мелочей, чтобы получить от похода удовольствие.
P.S. Если вдруг захотите пройти этот маршрут самостоятельно, то вот гайд от нашего гида. Если возникли вопросы, то заходите в личку или сообщения группы.
Последний раз я ходил в трёхнедельный школьно-студенческий поход на Камчатку. Было это более 10 лет назад. В этот раз занетворкался с ребятами из дружественного банка.
Как было круто, можно увидеть на фото. Я же хотел поделиться моим скромным опытом о технической стороне похода.
Все написанное ниже касается только несложных летних горных походов.
Оптимизация расходов
Приобрести всю экипировку может стоить достаточно дорого, особенно если вы любите комфорт.
Чтобы не попасть в долговую яму, часть экипировки я взял у друга, а часть — в аренду. Так делали многие ребята.
Палатка
Взял свою старую добрую двухместную Freetime Easy Ride. Она относительно легкая (2.2 кг) и простая в установке, но достаточно серьезно потеет ночью и оборудована одним тамбуром. Сейчас я бы взял что-то более легкое, практичное и технологичное. Можно присмотреться, например, к топовым вариантам от Sea To Summit (одноместная на 1,1 кг, двухместная на 1,4 кг).
Коврик и спальный мешок
Классический коврик не брал. Взял у друга надувной матрас. Было очень удобно, но так как не посмотрел его характеристики, то ночью в сочетании с моим спальником было прохладно. Приходилось утеплять его флисками. мысли на этот счёт:
* спальник я бы брал максимально теплый, но в то же время легкий (до 700-800 гр), например, такой. Если жарко, то его можно просто не застегивать;
* коврик дает защиту от проколов и холода надувному матрасу, но достаточно объемный. Можно рассмотреть утепленные матрасы;
* ребята брали обычные коврики, что не так удобно, но в сочетании с тёплыми спальниками работали хорошо;
* учитывайте одежду, в которой будете спать, чтобы она не крала тепло.
Рюкзак
Желательно подобрать в магазине, предварительно нагрузив. Чем больше регулировок, тем больше шанс что-то поправить непосредственно в походе. Если рюкзак очень большой, не под ваш рост, то никакие регулировки не помогут.
Фонарик
Выбирать нужно такой, где будут хотя бы три режима: автономный для палатки, ближний свет, например, для ужина, чтобы никого не слепить, и дальний для перемещений.
Одежда и обувь (и прочее)
Тут все достаточно просто: нужно проиграть сценарии, в которых будете использовать ту или иную вещь, и берёте в соответствии с ними самый минимум. Всегда ценятся хорошие мембраны и то, что быстро сохнет.
Так как на солнце я быстро сгораю, то мне в этот раз хорошую службу сослужили панама с защитой от солнца 360°, перчатки и брюки-трансформеры с отстёгивающимися штанинами. А вот купленная белая джерси по ощущениям долго сохла, хотя и была очень легкой.
У обоих новых ботинок Millet на третий день в зона сгиба носка отошла прорезиненная защита
Итого
Дорогая экипировка делает поход супер комфортным. Бюджетные альтернативы обычно предлагают некоторый компромисс. Независимо от бюджета, придется продумать все до мелочей, чтобы получить от похода удовольствие.
P.S. Если вдруг захотите пройти этот маршрут самостоятельно, то вот гайд от нашего гида. Если возникли вопросы, то заходите в личку или сообщения группы.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥2