Пять шагов к идеальному код-ревью
Почти никто не любит ревьюить код. Считается, что на это тратится слишком много времени. Но на самом деле правильно организованное ревью может сэкономить гораздо больше ресурсов на последующих этапах.
В этой статье вы найдёте практические советы по структурированию и ускорению код-ревью. Даны отдельные рекомендации для специалистов разных уровней: от стажёров до мидлов.
#статья #ревью
Почти никто не любит ревьюить код. Считается, что на это тратится слишком много времени. Но на самом деле правильно организованное ревью может сэкономить гораздо больше ресурсов на последующих этапах.
В этой статье вы найдёте практические советы по структурированию и ускорению код-ревью. Даны отдельные рекомендации для специалистов разных уровней: от стажёров до мидлов.
#статья #ревью
😁2
Javet 3.0.2 Released: Bridging Java and JavaScript with Enhanced Features
Javet, a fusion of Java and V8 (JAVa + V + EighT), has recently released its version 3.0.2, marking a significant advancement in embedding Node.js and V8 in Java. This version includes Node.js v20.10.0 and V8 v12.0.267.8, highlighting the project's commitment to staying current with the latest developments in these technologies.
By A N M Bazlur Rahman
Read: https://www.infoq.com/news/2023/12/javet-302-released/
Javet, a fusion of Java and V8 (JAVa + V + EighT), has recently released its version 3.0.2, marking a significant advancement in embedding Node.js and V8 in Java. This version includes Node.js v20.10.0 and V8 v12.0.267.8, highlighting the project's commitment to staying current with the latest developments in these technologies.
By A N M Bazlur Rahman
Read: https://www.infoq.com/news/2023/12/javet-302-released/
👍2
Компоновка аннотаций в Java
Привет Хабр! Совсем недавно, в процессе разработки я столкнулся с невероятным количеством бойлерплейт-кода в аннотациях. Решение сделать с этим что-то было принято мгновенно и вот что из этого вышло...
Читать: https://habr.com/ru/articles/778064/?utm_campaign=778064
Привет Хабр! Совсем недавно, в процессе разработки я столкнулся с невероятным количеством бойлерплейт-кода в аннотациях. Решение сделать с этим что-то было принято мгновенно и вот что из этого вышло...
Читать: https://habr.com/ru/articles/778064/?utm_campaign=778064
👍2
Генерация контрактов OpenApi или прикладной API first: совсем немного про зачем
Новое место, новая позиция, новый продукт! Финтех, камунда, ~ 40 (!) микросервисов за которые отвечает наша команда. Первый спринт. Я в роли наблюдателя. В спринте вроде бы обычная задача - нужно вызвать из одного сервиса другой, и обработать результат. Ребята оценивают, начинают работу, и что я вижу в течение следующих дней: один разработчик берёт сервис-сервер, другой сервис-клиент, и каждый начинает реализацию контракта описанного в табличке в confluence. Что-от около десятка полей, если мне не изменяет память. Они уходят на пару дней, возвращаются, начинают тестирование контракта, выясняется что одно или два поля немного различаются в названии, уходят править нейминг, возвращаются, тестируют и только после этого переходят к написанию какой-то логики.
И тут меня понесло. Да, дело не конкретно в этих ребятах или задаче. Или продукте. Или компании. Они просто делают работу как привыкли делать. С точки зрения разработчика - закрыть такую задачу за 3 или 6 дней - нет особой разницы. Над сроками вообще начинаешь заморачиваться только после перехода в роль которая за эти самые сроки хоть как-то отвечает. Но потратить 4 дня силами двух разработчиков только на контрактую обвязку...
Здесь в памяти начали всплывать давние попытки генерации спецификаций по коду. Или документации по коду. Или кода из спецификации. В общем какие-то попытки генерации чего-то связанного с openapi. А дальше мы ушли в углубленное изучение того, как это можно использовать в контексте нашего продукта и большого количества взаимодействий сервисов.
Немного итогов
Читать: https://habr.com/ru/articles/776434/?utm_campaign=776434
Новое место, новая позиция, новый продукт! Финтех, камунда, ~ 40 (!) микросервисов за которые отвечает наша команда. Первый спринт. Я в роли наблюдателя. В спринте вроде бы обычная задача - нужно вызвать из одного сервиса другой, и обработать результат. Ребята оценивают, начинают работу, и что я вижу в течение следующих дней: один разработчик берёт сервис-сервер, другой сервис-клиент, и каждый начинает реализацию контракта описанного в табличке в confluence. Что-от около десятка полей, если мне не изменяет память. Они уходят на пару дней, возвращаются, начинают тестирование контракта, выясняется что одно или два поля немного различаются в названии, уходят править нейминг, возвращаются, тестируют и только после этого переходят к написанию какой-то логики.
И тут меня понесло. Да, дело не конкретно в этих ребятах или задаче. Или продукте. Или компании. Они просто делают работу как привыкли делать. С точки зрения разработчика - закрыть такую задачу за 3 или 6 дней - нет особой разницы. Над сроками вообще начинаешь заморачиваться только после перехода в роль которая за эти самые сроки хоть как-то отвечает. Но потратить 4 дня силами двух разработчиков только на контрактую обвязку...
Здесь в памяти начали всплывать давние попытки генерации спецификаций по коду. Или документации по коду. Или кода из спецификации. В общем какие-то попытки генерации чего-то связанного с openapi. А дальше мы ушли в углубленное изучение того, как это можно использовать в контексте нашего продукта и большого количества взаимодействий сервисов.
Немного итогов
Читать: https://habr.com/ru/articles/776434/?utm_campaign=776434
👏5😁2❤1
Простой веб-сервер Java: Простые статические HTTP-серверы
Read: https://www.infoworld.com/article/3705369/javas-simple-web-server-static-http-servers-made-easy.html#tk.rss_java
Read: https://www.infoworld.com/article/3705369/javas-simple-web-server-static-http-servers-made-easy.html#tk.rss_java
🔥3
Хроники пикирующего бота или как важно не пропускать стадию QA в проектах
Эта статья должна была рассказать вам о проекте простого телеграм-бота, который заточен на одно простое действие: мониторинг доступности сайтов. Но, опубликовав MVP и представив проект на публику, мы заранее не провели полный объем необходимых тестов, в самый ответственный момент не смогли быстро всё исправить и вместо восторженных отзывов аудитории получили порцию хейта. Поэтому мы решили не делать из статьи пиар-акцию, а просто ещё раз напомнить всем стартапам, да и вообще программистам, отделам и командам о важности каждого этапа разработки.
Читать: https://habr.com/ru/articles/778398/?utm_campaign=778398
Эта статья должна была рассказать вам о проекте простого телеграм-бота, который заточен на одно простое действие: мониторинг доступности сайтов. Но, опубликовав MVP и представив проект на публику, мы заранее не провели полный объем необходимых тестов, в самый ответственный момент не смогли быстро всё исправить и вместо восторженных отзывов аудитории получили порцию хейта. Поэтому мы решили не делать из статьи пиар-акцию, а просто ещё раз напомнить всем стартапам, да и вообще программистам, отделам и командам о важности каждого этапа разработки.
Читать: https://habr.com/ru/articles/778398/?utm_campaign=778398
🎉4
Java News Roundup: JDK 22, Spring CVEs, Liberica JDK, JDKMon 21, Jupyter for Java, Gradle 8.5
This week's Java roundup for November 27th, 2023 features news from OpenJDK, JDK 22, Jakarta Data 1.0-M2, JNoSQL 1.0.3, LibericaJDK, Spring CVEs, Spring Shell 3.2.0-RC1, Quarkus 3.6, Open Liberty 23.0.12-beta, Helidon 4.0.1, Hibernate Reactive 2.2, Hibernate Search 7.1-A1, Grails 5.3.4, Groovy 5.0.0-A3, Camel Quarkus 3.6, Maven 3.9.6, JDKMon 21, PrimeFaces 12.0.7, Jupyter for Java and Gradle 8.5.
By Michael Redlich
Read: https://www.infoq.com/news/2023/12/java-news-roundup-nov27-2023/
This week's Java roundup for November 27th, 2023 features news from OpenJDK, JDK 22, Jakarta Data 1.0-M2, JNoSQL 1.0.3, LibericaJDK, Spring CVEs, Spring Shell 3.2.0-RC1, Quarkus 3.6, Open Liberty 23.0.12-beta, Helidon 4.0.1, Hibernate Reactive 2.2, Hibernate Search 7.1-A1, Grails 5.3.4, Groovy 5.0.0-A3, Camel Quarkus 3.6, Maven 3.9.6, JDKMon 21, PrimeFaces 12.0.7, Jupyter for Java and Gradle 8.5.
By Michael Redlich
Read: https://www.infoq.com/news/2023/12/java-news-roundup-nov27-2023/
🔥3
10 лучших практик работы с Null в Java
Здравствуйте, работа с null - неизбежная часть программирования на Java, но следование лучшим практикам может помочь вам эффективно управлять ею и писать более надежный код. В этой статье мы рассмотрим десять лучших практик работы с null в Java, чтобы улучшить качество кода и избежать распространенных подводных камней. Если вы умеете работать с null, то вы будете писать более качественный код, так как null часто является причиной ошибок времени выполнения в Java, возможно, вы слышали об NullPointerException? Нет. Если нет, то я могу сказать, что вы недостаточно кодили на Java, потому что это была первая ошибка, которую я получил, когда начал писать программы на Java в студенческие годы. В то время я не знал, как лучше обрабатывать null, поэтому приходилось долго и мучительно отлаживать, пока мы не находили причину, а затем делали обходной маневр или исправление. Но если вы знаете, как лучше обрабатывать null, вы можете писать код, который выдержит испытание временем в производстве.
Вопросы и учебники для собеседования по Java
Read: http://www.java67.com/2023/12/10-best-practices-for-handling-null-in.html
Здравствуйте, работа с null - неизбежная часть программирования на Java, но следование лучшим практикам может помочь вам эффективно управлять ею и писать более надежный код. В этой статье мы рассмотрим десять лучших практик работы с null в Java, чтобы улучшить качество кода и избежать распространенных подводных камней. Если вы умеете работать с null, то вы будете писать более качественный код, так как null часто является причиной ошибок времени выполнения в Java, возможно, вы слышали об NullPointerException? Нет. Если нет, то я могу сказать, что вы недостаточно кодили на Java, потому что это была первая ошибка, которую я получил, когда начал писать программы на Java в студенческие годы. В то время я не знал, как лучше обрабатывать null, поэтому приходилось долго и мучительно отлаживать, пока мы не находили причину, а затем делали обходной маневр или исправление. Но если вы знаете, как лучше обрабатывать null, вы можете писать код, который выдержит испытание временем в производстве.
Вопросы и учебники для собеседования по Java
Read: http://www.java67.com/2023/12/10-best-practices-for-handling-null-in.html
👍2
JHipster 8 Upgrades to Spring Boot 3, Hibernate 6.2, Node 18 LTS, Vue 3 and Angular 16
JHipster - the web and microservices applications generator - released its 8th version on November 2nd. Starting with this version Hashicorp Consul will be the default service discovery mechanism, devcontainer will be available and each application that acts as a gateway or is a monolith will have CORS enabled. Also, multiple versions were updated and unmaintained components were removed.
By Olimpiu Pop
Read: https://www.infoq.com/news/2023/12/jhipster-version8-release/
JHipster - the web and microservices applications generator - released its 8th version on November 2nd. Starting with this version Hashicorp Consul will be the default service discovery mechanism, devcontainer will be available and each application that acts as a gateway or is a monolith will have CORS enabled. Also, multiple versions were updated and unmaintained components were removed.
By Olimpiu Pop
Read: https://www.infoq.com/news/2023/12/jhipster-version8-release/
❤2🎉1
Что такое JDK? Введение в комплект средств разработки Java
Read: https://www.infoworld.com/article/3296360/what-is-the-jdk-introduction-to-the-java-development-kit.html#tk.rss_java
Read: https://www.infoworld.com/article/3296360/what-is-the-jdk-introduction-to-the-java-development-kit.html#tk.rss_java
Как распараллелить тесты с базой данных
Представьте проект, в котором уже написано несколько сотен тестов. Каждый тест настраивает базу под себя: добавляет данные, вызывает
В данной статье поделюсь подходом, который позволил решить проблему без рефакторинга.
Читать: https://habr.com/ru/articles/778580/?utm_campaign=778580
Представьте проект, в котором уже написано несколько сотен тестов. Каждый тест настраивает базу под себя: добавляет данные, вызывает
truncate по окончанию. Хочется запускать тесты параллельно, чтобы ускориться, но если два теста запустить одновременно, они почти наверняка друг другу помешают.В данной статье поделюсь подходом, который позволил решить проблему без рефакторинга.
Читать: https://habr.com/ru/articles/778580/?utm_campaign=778580
❤3⚡3❤🔥1
Когда использовать абстрактные классы и интерфейсы в Java
Read: https://www.infoworld.com/article/2077421/when-to-use-abstract-classes-vs-interfaces-in-java.html#tk.rss_java
Read: https://www.infoworld.com/article/2077421/when-to-use-abstract-classes-vs-interfaces-in-java.html#tk.rss_java
😁5
Деплой приложения на Java. Хостим проект через push в Git
В статье мы рассмотрим, как развернуть в облаке приложение на Java, на примере Spring Boot приложения с встраиваемой базой данных H2. А именно, мы попробуем развернуть приложение с простым REST API, сборкой Maven и тремя эндпоинтами, позволяющими добавить продукт, получить список всех продуктов и узнать общую стоимость всех продуктов.
Код приложения из примера можно скачать по ссылке.
Подход требует некоторых усилий во время первого запуска, но в дальнейшем позволяет обновлять приложения простым push в Git.
Читать: https://habr.com/ru/companies/amvera/articles/778682/?utm_campaign=778682
В статье мы рассмотрим, как развернуть в облаке приложение на Java, на примере Spring Boot приложения с встраиваемой базой данных H2. А именно, мы попробуем развернуть приложение с простым REST API, сборкой Maven и тремя эндпоинтами, позволяющими добавить продукт, получить список всех продуктов и узнать общую стоимость всех продуктов.
Код приложения из примера можно скачать по ссылке.
Подход требует некоторых усилий во время первого запуска, но в дальнейшем позволяет обновлять приложения простым push в Git.
Читать: https://habr.com/ru/companies/amvera/articles/778682/?utm_campaign=778682
👍4☃1
JEP 457: Streamlining Java Development with the Class-File API
JEP 457, Class-File API (Preview), has been Targeted from its Proposed to Target status, proposing a new API for parsing, generating, and transforming Java class files. This API will initially replace ASM within the JDK with plans for a public API. Goetz, the Java language architect at Oracle, described ASM as outdated and provided details on the API's evolution.
By A N M Bazlur Rahman
Read: https://www.infoq.com/news/2023/12/jep-457-new-class-file-api/
JEP 457, Class-File API (Preview), has been Targeted from its Proposed to Target status, proposing a new API for parsing, generating, and transforming Java class files. This API will initially replace ASM within the JDK with plans for a public API. Goetz, the Java language architect at Oracle, described ASM as outdated and provided details on the API's evolution.
By A N M Bazlur Rahman
Read: https://www.infoq.com/news/2023/12/jep-457-new-class-file-api/
Java Digest #7
Всем привет!
Мы Java-разработчики Тинькофф: Константин, Андрей и Арсений. Собираем интересные новости, статьи, туториалы и другие материалы из мира Java-разработки и решили делиться этим не только с коллегами, но и со всем сообществом.
Добро пожаловать в волшебный мир Java, где декабрьский Java Digest обещает увлекательное приключение! В этом месяце Spring Boot 3.2.0 приносит поддержку виртуальных потоков, проекта CRaC, RestClient и JdbcClient. Kotlin 1.9.20 представляет стабильность Kotlin Multiplatform и улучшения производительности. В выпуске немного обновлений по JEP-ам, полезные статьи и видео. Пусть ваш декабрь будет полон кодовой магии и вдохновения.
Читать: https://habr.com/ru/companies/tinkoff/articles/779010/?utm_campaign=779010
Всем привет!
Мы Java-разработчики Тинькофф: Константин, Андрей и Арсений. Собираем интересные новости, статьи, туториалы и другие материалы из мира Java-разработки и решили делиться этим не только с коллегами, но и со всем сообществом.
Добро пожаловать в волшебный мир Java, где декабрьский Java Digest обещает увлекательное приключение! В этом месяце Spring Boot 3.2.0 приносит поддержку виртуальных потоков, проекта CRaC, RestClient и JdbcClient. Kotlin 1.9.20 представляет стабильность Kotlin Multiplatform и улучшения производительности. В выпуске немного обновлений по JEP-ам, полезные статьи и видео. Пусть ваш декабрь будет полон кодовой магии и вдохновения.
Читать: https://habr.com/ru/companies/tinkoff/articles/779010/?utm_campaign=779010
👏4💅1
Article: Helidon 4 Adopts Virtual Threads: Explore the Increased Performance and Improved DevEx
This article delves into Helidon 4's integration of Java 21's virtual threads from Project Loom, marking a significant shift in Java development. It highlights the transition from a reactive to an imperative model, simplifying coding and debugging. Helidon 4 claims improved performance over previous versions and some external frameworks, balancing performance with simplicity.
By Dmitry Alexandrov
Read: https://www.infoq.com/articles/helidon-4-adopts-virtual-threads/
This article delves into Helidon 4's integration of Java 21's virtual threads from Project Loom, marking a significant shift in Java development. It highlights the transition from a reactive to an imperative model, simplifying coding and debugging. Helidon 4 claims improved performance over previous versions and some external frameworks, balancing performance with simplicity.
By Dmitry Alexandrov
Read: https://www.infoq.com/articles/helidon-4-adopts-virtual-threads/
👍1
Безопасность web приложений с использованием Identity Provider
В современном цифровом мире, где взаимодействие с онлайн-ресурсами и web приложениями стало неотъемлемой частью нашей повседневной жизни, безопасность и управление личной идентификацией стали ключевыми аспектами. Именно в этом контексте становится крайне важным понятие “Identity Provider” или, сокращённо, IdP.
Identity Provider представляет собой централизованный сервис, который играет решающую роль в процессе аутентификации пользователей в сети. Это технологическое решение позволяет пользователям идентифицироваться и получать доступ к различным ресурсам и сервисам, используя единый набор учётных данных или методов аутентификации.
IdP обеспечивает не только процесс аутентификации, но и авторизации, что делает его краеугольным камнем в управлении идентификацией в цифровом мире. Он предоставляет удобный и безопасный механизм для учета пользователей, определения их ролей и разграничения доступа к ресурсам и данным на основе этих ролей. Таким образом, IdP способствует усилению безопасности и контролю над доступом, одновременно облегчая пользовательский опыт.
В этом эссе мы рассмотрим более подробно, как происходит взаимодействие с Identity Provider, его преимущества и роль в обеспечении безопасности данных и доступа в цифровой эпохе.
Читать: https://habr.com/ru/articles/779170/?utm_campaign=779170
В современном цифровом мире, где взаимодействие с онлайн-ресурсами и web приложениями стало неотъемлемой частью нашей повседневной жизни, безопасность и управление личной идентификацией стали ключевыми аспектами. Именно в этом контексте становится крайне важным понятие “Identity Provider” или, сокращённо, IdP.
Identity Provider представляет собой централизованный сервис, который играет решающую роль в процессе аутентификации пользователей в сети. Это технологическое решение позволяет пользователям идентифицироваться и получать доступ к различным ресурсам и сервисам, используя единый набор учётных данных или методов аутентификации.
IdP обеспечивает не только процесс аутентификации, но и авторизации, что делает его краеугольным камнем в управлении идентификацией в цифровом мире. Он предоставляет удобный и безопасный механизм для учета пользователей, определения их ролей и разграничения доступа к ресурсам и данным на основе этих ролей. Таким образом, IdP способствует усилению безопасности и контролю над доступом, одновременно облегчая пользовательский опыт.
В этом эссе мы рассмотрим более подробно, как происходит взаимодействие с Identity Provider, его преимущества и роль в обеспечении безопасности данных и доступа в цифровой эпохе.
Читать: https://habr.com/ru/articles/779170/?utm_campaign=779170
❤3
Польза создания однородных задач для параллельного вычисления
Как правильно использовать возможности параллельного программирования?
Зачем программистам математика и зачем знать алгоритмы?
На примере небольшой задачи мы вместе ответим на эти вопросы. А так же хочу наглядно продемонстрировать преимущества создания однородных задач.
Весь код из статьи находится здесь.
Читать: https://habr.com/ru/articles/779188/?utm_campaign=779188
Как правильно использовать возможности параллельного программирования?
Зачем программистам математика и зачем знать алгоритмы?
На примере небольшой задачи мы вместе ответим на эти вопросы. А так же хочу наглядно продемонстрировать преимущества создания однородных задач.
Весь код из статьи находится здесь.
Читать: https://habr.com/ru/articles/779188/?utm_campaign=779188
❤4
Немного о гигиене Java кода
Во время код-ревью или работы над новым проектом может раздражать многое: стиль, подходы, качество. Но больше всего расстраивает банальный недостаток гигиены кода. В связи с регулярностью проблемы хочется на неё обратить внимание и напомнить, как гигиену поддерживать.
Читать: https://habr.com/ru/companies/pvs-studio/articles/779300/?utm_campaign=779300
Во время код-ревью или работы над новым проектом может раздражать многое: стиль, подходы, качество. Но больше всего расстраивает банальный недостаток гигиены кода. В связи с регулярностью проблемы хочется на неё обратить внимание и напомнить, как гигиену поддерживать.
Читать: https://habr.com/ru/companies/pvs-studio/articles/779300/?utm_campaign=779300
Генерация PDF-документации из OpenAPI-спецификации в SpringBoot-приложении
При интеграции с нашим приложением, написанном на "классическом" SpringBoot-стэке встал вопрос о предоставлении описания АПИ партнеру. Фактически из коробки SpringBoot позволяет развернуть на стороне приложения тонкий Swagger-клиент и сгенерировать на лету спецификацию в формате Swagger (OpenAPI), которая представляет собой JSON особой структуры (хотя если читатель не знает, что это, наверное нет никакого смысла вообще читать эту статью).
Проблема осложнялась тем, что наш партнер разрабатывал на 1С, и во всех современных спецификациях для него были слишком сложно освоиться, поэтому встала задача предоставить документацию в человекориентированном виде - DOC, PDF и прочее.
В ходе изысканий в google, была найдена статья - https://www.baeldung.com/swagger-generate-pdf, и советы на stackoverflow, которые фактически повторяли эту статью. Фактически было найдено 2 варианта решения:
1) Использовать онлайн-конвертер https://www.swdoc.org/
2) Настроить цепочку из 3 maven-плагинов:
Читать: https://habr.com/ru/articles/779542/?utm_campaign=779542
При интеграции с нашим приложением, написанном на "классическом" SpringBoot-стэке встал вопрос о предоставлении описания АПИ партнеру. Фактически из коробки SpringBoot позволяет развернуть на стороне приложения тонкий Swagger-клиент и сгенерировать на лету спецификацию в формате Swagger (OpenAPI), которая представляет собой JSON особой структуры (хотя если читатель не знает, что это, наверное нет никакого смысла вообще читать эту статью).
Проблема осложнялась тем, что наш партнер разрабатывал на 1С, и во всех современных спецификациях для него были слишком сложно освоиться, поэтому встала задача предоставить документацию в человекориентированном виде - DOC, PDF и прочее.
В ходе изысканий в google, была найдена статья - https://www.baeldung.com/swagger-generate-pdf, и советы на stackoverflow, которые фактически повторяли эту статью. Фактически было найдено 2 варианта решения:
1) Использовать онлайн-конвертер https://www.swdoc.org/
2) Настроить цепочку из 3 maven-плагинов:
Читать: https://habr.com/ru/articles/779542/?utm_campaign=779542
👏5❤1⚡1
Kafka Connect на примере Debezium PostgresConnector
В предыдущей статье про микросервисную архитектуру на основе событий с использованием Kafka Streams достаточно поверхностно был упомянут
Читать: https://habr.com/ru/articles/779620/?utm_campaign=779620
В предыдущей статье про микросервисную архитектуру на основе событий с использованием Kafka Streams достаточно поверхностно был упомянут
io.confluent.connect.jdbc.JdbcSourceConnector, который использовался для вычитания данных из SQLite и отправки их в топик Kafka. Сейчас я бы хотел более подробно разобрать технологию Kafka Connect на примере io.debezium.connector.postgresql.PostgresConnector. Как и в прошлый раз, я реализовал небольшой демо проект, код которого доступен на GitHub. В проекте кода совсем немного, однако чтобы понять все настройки, примененные в коннекторе, придется достаточно подробно пройтись по теоретической части. Итак, приступим.Читать: https://habr.com/ru/articles/779620/?utm_campaign=779620
👍7⚡1