Получи случайную криптовалюту за регистрацию!

Java: fill the gaps

Логотип телеграм канала @java_fillthegaps — Java: fill the gaps J
Логотип телеграм канала @java_fillthegaps — Java: fill the gaps
Адрес канала: @java_fillthegaps
Категории: Технологии
Язык: Русский
Количество подписчиков: 10.33K
Описание канала:

Привет! Меня зовут Диана, и я занимаюсь java разработкой с 2013г.
Делюсь опытом/знаниями по темам:
- Java Core
- Вопросы с собеседований
- Best practices
Комплименты, вопросы, предложения: @utki_letyat

Рейтинги и Отзывы

4.50

2 отзыва

Оценить канал java_fillthegaps и оставить отзыв — могут только зарегестрированные пользователи. Все отзывы проходят модерацию.

5 звезд

1

4 звезд

1

3 звезд

0

2 звезд

0

1 звезд

0


Последние сообщения 10

2021-11-12 09:00:11
Intellij IDEA: редактирование кода

Несколько простых приёмов для быстрой работы.

Легендарные комбинации
Ctrl + C
Ctrl + V
Ctrl + X
работают со всей строкой, на которой стоит курсор, не нужно ничего выделять.

Удалить всю строку:
Ctrl + Y

Дублировать строку:
Ctrl + D

Выделить часть кода:
Ctrl + W
При каждом нажатии W захватывается всё большая область.

Переместить выделенный код:
Ctrl + Shift +
Ctrl + Shift +
3.9K views06:00
Открыть/Комментировать
2021-11-09 09:00:03 Статистика по микросервисам

К концу года появляется много отчётов и статистики о состоянии JVM экосистемы. В целом ситуация не сильно отличается от прошлого года:

Самая популярная версия java до сих пор 8, используется на 69% проектов. Java 11 встречается на 36% проектов, а 12 и выше - на 16%.

Самый популярный фреймворк - Spring Boot: 65% проектов. На втором месте Spring MVC: 40% проектов.

Самая популярная IDE - Intellij IDEA, система сборки - Maven.

Трендовые GraalVM, Quarkus и Micronaut нашли применение где-то на 4% проектов, цифра примерно как в прошлом году.

Поэтому в этом посте поделюсь статистикой не по джаве, а по всему, что связано с микросервисами. Данные взяла из JRebel Java Developer Productivity Report 2021 и JetBrains The State of Developer Ecosystem 2021.

Демография: Россия - 3% участников, в основном ответы из США, Китая и Европы.

Итак,

49% проектов используют микросервисы
42% сидят с монолитом
10% применяют serverless архитектуру

На чём пишут микросервисы:
41% Java
37% JavaScript
25% Python

Сколько микросервисов на проекте:
34% Меньше пяти
36% 5-10
14% 10-20
16% 20 и больше

Как микросервисы общаются между собой?
83% HTTP-вызовы
47% Месседж брокер
25% WebSocket
20% RPC

С чем возникает много проблем:
30% Общение между сервисами
26% Масштабирование и производительность
24% Развернуть что-нибудь локально
14% Проблемы в коде микросервисов

Популярные performance проблемы:
54% Долгий Response Time
39% High CPU Usage
35% Утечки памяти
26% Много открытых соединений

Сколько времени занимает поднятие окружения на удалённой машине:
42% Меньше трёх минут
38% 3-10 минут
21% Дольше 10 минут

Только 20% разработчиков во время деплоя переключаются на другие рабочие задачи. Остальные 80% ходят за чаем, общаются с семьёй и листают соцсети
4.5K views06:00
Открыть/Комментировать
2021-11-05 09:00:03 JUnit, часть 3: модели кастомизации

Изменение архитектуры - не всё, чем JUnit 5 отличается от предыдущей версии. Второе отличие касается модели кастомизации.

В этом посте поговорим, зачем это нужно в тестовом фреймворке, и про разницу между 4 и 5 версией.

Чтобы было понятнее, давайте опишем простую задачу и будем её понемногу усложнять.

Допустим, нужно измерить время выполнения каждого теста: запустить таймер вначале и вывести время выполнения в конце.

Для одного класса это несложно - просто добавляем методы с аннотациями @Before и @After.

А как посчитать время для всех классов? Здесь варианта два:

Вынести общий код в отдельный класс, в каждый класс-тест добавить методы Before и After. Решение рабочее, но придётся копипастить методы в каждый класс.

Внедрить логику где-то на верхнем уровне и включать/выключать её через настройки или аннотации.

Это и есть кастомизация - предусмотренные библиотекой места "встраивания" новой логики. JUnit 4 и 5 используют для этого разные механизмы. Давайте кратко их обсудим.

JUnit 4 Runner

Переопределяем жизненный цикл теста целиком. Наследуемся от интерфейса Runner или абстрактного класса, в нужных местах добавляем нужные действия. Теперь тесты запускаются не по стандартной схеме, а по той, что прописана в новом классе.

Примеры:
@RunWith(Parameterized.class) запускает параметризованные тесты
@RunWith(Suite.class) запускает наборы тестов
@RunWith(SpringJUnit4ClassRunner.class) добавляет спринговые активности до и после запуска теста
@RunWith(MockitoJUnitRunner.class) позволяет использовать заглушки

Главный минус - жизненный цикл только один, значит Runner для теста может быть только один. Не получится совместить несколько фич, например, параметризованные тесты с заглушками.

JUnit 4 Rule

Переопределяем интерфейс TestRule и задаём действие до и после выполнения теста. В тестах выглядит как просто поле:

@Rule
public Timeout globalTimeout = Timeout.seconds(10);

В JUnit 4 есть несколько готовых правил:
TemporaryFolder - создать временную папку для теста
ExternalResource - открыть и закрыть внешний ресурс(файл, сокет, БД)

Плюсы-минусы:

Можно использовать несколько rule в одном классе
Работает в рамках одного метода и по сути похож на before/after.

JUnit 5 Extension

Жизненный цикл теста разбивается на 10+ фаз. К каждой из них можно присоединиться, если переопределить нужный интерфейс:
BeforeAllCallback - действие перед всеми тестами
ParameterResolver - передача параметров в тест

Реализуем нужные интерфейсы, регистрируем класс и готово. Похожий механизм используется в Spring.

Класс может использовать несколько экстеншенов
Можно вклиниться на любых этапах жизненного цикла
В интерфейсах доступен контекст выполнения и вся информация про тесты, в итоге возможностей гораздо больше

В JUnit 5 полностью убрали поддержку Runner и Rule, всё переписано на Extension API. Кодовые базы стали несовместимы между собой, поэтому и нужна библиотека Vintage с адаптерами.
______

Разбирать чужие кейсы полезно, но не всегда увлекательно. Поэтому вот интересный факт про разработку JUnit.

JUnit - опенсорсный проект, где никто никому не платил за работу.

Но рефакторинг назревал много лет. Однажды ребята решили, что такие грандиозные планы требуют фулл тайм и объявили краудфандинг на JUnit 5.

Сумма требовалась небольшая - 25 тысяч евро, меньше двух миллионов рублей. В итоге собрали в 2 раза больше, и уже через 6 недель был готов первый прототип.

Меня это очень впечатляет, особенно в сравнении со стоимостью и скоростью разработки в энтерпрайзе
1.1K views06:00
Открыть/Комментировать
2021-11-05 09:00:03
Как вы думаете, во сколько обошлась переделка архитектуры JUnit и написание практически новой кодовой базы?
Anonymous Poll
12%
2 тысячи евро
11%
25 тысяч евро
30%
100 тысяч евро
33%
5 миллионов евро
14%
20 миллионов евро
429 voters1.1K views06:00
Открыть/Комментировать
2021-11-03 09:00:03 JUnit, часть 2: зачем всё менять?

В JUnit сложилась странная ситуация.

JUnit 4 - топовый java фреймворк для тестов, который используется более чем в 100 тысячах проектов.

JUnit 5 вышел спустя 10 лет и обещает много нового. Но нельзя просто взять и перейти на 5 версию:
Аннотации вообще другие
Зависимостей стало больше
Для совместимости с JUnit 4 надо подключать какой-то винтаж.

Обратная совместимость - обычное дело для java приложений. В новой версии всё работает как раньше. Постепенно добавляешь новые фичи.

Почему JUnit не пошёл по этому пути?

Чтобы ответить на вопрос, нужно копнуть в архитектуру и кейсы использования.

JUnit создавался как удобная библиотека для написания тестов. Для разработчика есть API - аннотации @Test, @Before, методы assertEquals и тд. Здесь всё классно.

Дальше эти тесты запускает IDE или система сборки.

И вот им приходится тяжело. В JUnit 4 API для запуска и анализа тестов очень ограниченный, поэтому IDE и сборщики используют рефлекшн и другие обходные пути.

Чем плох такой подход - понятно. Любое изменение внутренней реализации ломает логику внутри IDE/системы сборки.

JUnit 5 учёл эту проблему и содержит три отдельных артефакта:
Jupiter - апи для разработчиков
Platform - апи для запуска и анализа тестов. Целевая аудитория - IDE, плагины и системы сборки. Теперь каждый из них может использовать библиотеку, а не писать свой велосипед
Vintage - для запуска JUnit 4 тестов на новой платформе

Почему у JUnit 4 и 5 разные аннотации?

У JUnit 5 абсолютно другая кодовая база. Для совместимости с 4 версией пришлось бы наворотить много кода. Гораздо практичнее вынести все адаптеры в отдельный компонент.

Тогда
Старые тесты будут работать
Чётко видно, где старые тесты, а где новые. А значит есть шанс, что со временем кодовая база с тестами перейдёт на новую версию.

Что здесь особенного?

В целом выглядит как обычный рефакторинг. Продукт развивается, мир меняется, монолит делится на составные части.

Но в этой истории есть две важные детали.

На страничке принципов разработки команды JUnit есть такие строки:

JUnit has never tried to be a swiss army knife
Third party developers move more quickly than we do

Отсюда видна ещё одна мотивация: поощрение развития других библиотек и фреймворков.

Другие разработчики тестовых библиотек теперь могут использовать JUnit платформу и автоматически получать поддержку библиотек во всех IDE и системах сборки.

Вторая инициатива команды JUnit - проект Open Test Alliance for the JVM.

В чём суть: есть много тестовых фреймворков и библиотек. Все они работают по-разному - бросают разные исключения, отличается формат и набор данных и тд. IDE и системам сборки приходится учитывать все особенности.

Идея проекта - создать общую спецификацию для тестовых библиотек. Проект поддержали TestNG, Spock, Hamcrest, AssertJ, Eclipse, IntelliJ, Gradle, Maven и Allure.

Неизвестно, закончится ли эта история удачно, но идея классная.

Здорово, когда компания делает не только хороший продукт, но и способствует развитию отрасли в целом
1.9K views06:00
Открыть/Комментировать
2021-11-01 09:00:12 JUnit, часть 1: джентельменский набор

Список фич, которые пригодятся для большинства тестов. Если что-то не видели - почитайте, вдруг пригодится. У JUnit чудесная документация, так что подробно расписывать не буду.

Жизненный цикл теста

Каждый тест - это метод с аннотацией @Test.

Через аннотацию @DisplayName задаётся симпатичное имя теста в отчёте.

Чтобы выполнить что-то до или после выполнения теста, используются методы с аннотациями
@Before, @BeforeAll
@After, @AfterAll

JUnit создаёт новый экземпляр класса на каждый тестовый метод. Класс ServiceTest с пятью методами @Test во время запуска превратится в 5 экземпляров класса ServiceTest.

Благодаря этому тесты выполняются независимо.

Этим JUnit отличается от TestNG, где создаётся один экземпляр класса на все тестовые методы. Если хочется как в TestNG, добавьте над классом аннотацию @TestInstance(Lifecycle.PER_CLASS)

Проверки

Сердце каждого теста - методы с приставкой assert*:
assertTrue
assertEquals
assertInstanceOf

В самом JUnit мало методов, более удобные ассерты есть в библиотеках Hamrest и AssertJ. AssertJ, на мой взгляд, более читабельный, но Hamrest используется чаще.

Группировка тестов

Аннотация @Tag("groupName") объединяет тесты в группы. Работает и для одного теста, и для класса.

Можно указывать тэги в системе сборки и при запуске тестов из IDE.

Отключение тестов

Аннотация @Disabled. Продвинутые варианты для:
операционной системы
@DisabledOnOs(WINDOWS)

версии java
@DisabledOnJre(JAVA_9)
@DisabledForJreRange(min = JAVA_9)

системных переменных:
@DisabledIfSystemProperty(named = "ci-server", matches = "true")
@DisabledIfEnvironmentVariable(named = "ENV", matches = ".*development.*")

Параметризированные тесты

Помогают запустить один тест с разными аргументами. Выглядит так:

@ParameterizedTest
@ValueSource(ints={100,-14})
public void test(int input) {}

Такой тест запустится дважды - с аргументом 100 и -14.

Вместо готового списка можно брать значения
из CSV файла @CsvSource
из метода @MethodSource

Проверка таймаута

Через ассерт
assertTimeout(ofMinutes(2), ()->{});

Через аннотацию
@Timeout(value=42,unit=SECONDS)

Полезные библиотеки

Hamrest, AssertJ - расширенные библиотеки методов-ассертов
Mockito для заглушек. Добавляете библиотеку в pom.xml или build.gradle, а в тест - аннотацию @ExtendWith(MockitoExtension.class)
Testcontainers для запуска внешних компонентов в докере. Добавляем библиотеку, аннотацию @Testcontainers над классом и @Container над компонентом
Java Faker - генератор данных для тестов
1.7K viewsedited  06:00
Открыть/Комментировать
2021-11-01 09:00:12
Какой основной тестовый фреймворк у вас на проекте?
Anonymous Poll
26%
JUnit 4
57%
JUnit 5
7%
TestNG
11%
Что-то другое
521 voters1.6K views06:00
Открыть/Комментировать
2021-11-01 09:00:12 JUnit - самая популярная библиотека для юнит-тестов на java. Сейчас в ходу две версии - четвёртая и пятая.

О чём поговорим на этой неделе:
В первой части опишу основные фичи JUnit 5
Во второй и третьей расскажу про проблемы JUnit 4, и как они решались в JUnit 5

Я часто пишу, что разобранный в деталях чужой опыт - это почти свой Таким вот кейсам и посвящена 2 и 3 часть.
1.6K views06:00
Открыть/Комментировать
2021-10-21 09:00:26 Ментор: зачем нужен и как договориться

Работа с ментором - очень удобный способ прокачать свои навыки. Подойдёт для карьерных подвигов любого уровня:
Войти в айти
Джуниор → мидл
Мидл → сеньор
Сеньор → тимлид/архитектор/проджект/продакт

Если серьёзно нацелены на изучение технологии, фреймворка или новой области, лучше делать это под надзором того, кто уже прошёл этот путь. Кто знает все подводные камни и короткие дорожки.

Что делает ментор?

НЕ берёт ответственность за вас
НЕ читает лекции
НЕ контролирует каждый шаг

Помогает составить план развития
Даёт оценку вашим навыкам со стороны
Подсказывает материалы для изучения

Где найти ментора?

Внутри компании, в общих чатах, на конференциях и митапах. Если разработчик общителен, любит делиться знаниями и находится в вашей точке Б, то он прекрасный кандидат в менторы.

Мне не пишите, пожалуйста, я все силы отдаю ребятам с курса многопоточки

Как договориться о сотрудничестве?

Сообщение вроде "привет, хочу стать сеньором" не сработает. Даже если потенциальный ментор - добрый человек и готов поделиться опытом, он не хочет лишних забот. У него есть работа и жизнь помимо работы. Покажите, что вы чётко знаете, чего хотите и готовы работать самостоятельно.

Как может выглядеть сообщение:

Здравствуйте, Диана!

Меня зовут Антон, я студент 4 курса по специальности Инженер-технолог. Последние 2 года увлёкся программированием и понял, что хочу развиваться в этом направлении.

(описываем цель)

Моя цель - к концу года пройти собеседование на Junior Java разработчика в Сбере или в другой крупной компании.

(рассказываем текущую ситуацию)

Я прошёл все курсы, которые вы рекомендовали в этом посте и начал делать пет-проджект. С чем мне нужна помощь:

Сделать пет-проджект достойным для прикрепления к резюме
Прохождение собеседований. Отвечаю на вопросы вроде правильно, но ни одного оффера пока не получил

(небольшой комплимент и просьба уделить время)

Давно читаю ваш канал, мне откликается стиль написания постов - всё просто и понятно, многие вещи понимаю гораздо чётче. Хотел бы с вами посоветоваться по поводу своей цели. Думаю, разговор не займёт больше часа.

Как вы на это смотрите?

Если знаете, что человек уже занимается менторингом, можно попросить об этом напрямую.

На встрече обсудите и зафиксируйте комфортный для обоих формат, сроки и расписание. Формат может быть любой:
Небольшие домашние задания
Сеанс парного программирования
Имитация собеседования
Код-ревью домашнего проекта

Встречи могут быть как 2 раза в неделю, так и раз в месяц.

Если человек отказался - попросите небольшой совет или обратную связь, а затем продолжите поиски.
1.8K views06:00
Открыть/Комментировать
2021-10-18 09:05:00 Два полезных телеграм канала

На этой неделе продолжу тему с развитием карьеры. А на следующей вернёмся в технические дебри джавы

Сегодня расскажу про два полезных телеграм канала.

Для начинающих - канал Code Review

У него очень классная идея. Это даже не канал, а коммьюнити, где можно
Оставить свой код на ревью
Сделать задание и отправить его на ревью
Сделать ревью другим ребятам

Для начинающих полезно побыть со всех сторон - и показать свой код, и посмотреть, как пишут код другие. Получить конструктивную обратную связь и дать её другим.

Как всё проходит:
С понедельника по среду подаются заявки на ревью
С четверга по воскресенье собирается фидбэк

Всё быстро и просто. Надеюсь, что проект будет развиваться, поэтому поучаствую в ближайшей java ревью-сессии как приглашённый эксперт

Для продолжающих - канал Хороший разработчик знает

Канал ведёт Павел - разработчик с 15-летним опытом, сейчас работает в Германии. Пишет посты с уклоном в soft skills, менеджмент и верхнеуровневый инжиниринг:

Как я стал principal engineer - часть 1, часть 2
Как выбрать процессор в облаке
Как рассчитать расходы на инфраструктуру

Чем выше по карьерной лестнице, тем важнее эти темы.

У обоих каналов пока немного подписчиков, но ребята делают очень хорошее дело. Давайте их поддержим!
1.4K views06:05
Открыть/Комментировать