25698
Все самое полезное для Java-разработчика в одном канале. Список наших каналов: https://t.me/proglibrary/9197 Обратная связь: @proglibrary_feedback_bot По рекламе: @proglib_adv Прайс: @proglib_advertising
🛠️ Свежий релиз Docker Desktop 4.35
🐳 Токены доступа для организаций (Beta) — Эта функция улучшает управление доступом на уровне организаций. Она позволяет централизовано управлять правами пользователей, обеспечивая лучшее управление и масштабируемость для бизнеса.
🐳 Docker Home (Beta) — Новый интерфейс Docker Home служит центральным «хабом» для доступа к продуктам Docker, управления подписками и настройками.
🐳 Интерфейс терминала в Docker Desktop — Эта функция позволяет интегрировать терминал в интерфейс Docker Desktop, упрощая работу разработчиков и снижая необходимость переключаться между CLI и GUI.
🐳 Резервное копирование томов — В Docker Desktop теперь доступна улучшенная функция резервного копирования томов, которая упрощает процесс создания бэкапов данных и делает его более удобным.
🐳 Улучшенная производительность на macOS — Введение Docker VMM для Apple Silicon улучшает производительность на Mac, ускоряя выполнение множества задач.
📎 Подробнее в блоге компании
🕯 Паттерн Синглтон (Singleton)
Singleton — это порождающий паттерн, который гарантирует, что у класса есть только один экземпляр, и предоставляет глобальную точку доступа к этому экземпляру. Он часто используется для управления доступом к общим ресурсам, таким как базы данных, файлы конфигурации или сетевые соединения.
Использование:
🔹 Когда необходимо гарантировать, что класс имеет только один экземпляр (например, для работы с конфигурацией приложения).
🔹 Когда требуется предоставить глобальную точку доступа к объекту.
🔹 В случаях, когда управление состоянием одного объекта критично для приложения (например, пул соединений).
Преимущества:
1️⃣ Гарантирует наличие только одного экземпляра, что удобно для управления ресурсами и предотвращения конфликтов.
2️⃣ Обеспечивает ленивую инициализацию, что позволяет создавать объект только при необходимости (если реализовано правильно).
3️⃣ Удобен для централизованного управления состоянием или ресурсами в системе.
Недостатки:
1️⃣ Нарушает принцип единственной ответственности (SRP), так как класс управляет своим созданием и жизненным циклом.
2️⃣ Усложняет тестирование, поскольку сложно замещать или мокать объект.
3️⃣ Может создавать скрытые зависимости, что приводит к сложности поддержки и масштабирования кода.
4️⃣ В многопоточной среде требуется дополнительная синхронизация для обеспечения безопасности, что может снижать производительность.
📌 Паттерн полезен, если требуется строгий контроль над количеством экземпляров класса. Например, он часто применяется в логировании, управлении настройками приложения или в реализации драйверов доступа к базам данных. Однако его использование должно быть обоснованным, так как чрезмерное применение может усложнить архитектуру.
🔐 🔑 OAuth 2: как работает современная авторизация
Помнишь кнопку «Войти через Google»? Та самая кнопка, которая избавляет от необходимости запоминать очередной пароль. Сегодня разберем, как работает эта магия изнутри, почему гиганты вроде Spotify и Medium используют такой способ входа, и как внедрить его в свое приложение. Спойлер: это проще, чем кажется, и гораздо безопаснее традиционной формы регистрации.
Читать статью
🗑 Как устроен сборщик мусора?
В Java управление памятью происходит автоматически, но работа сборщика мусора (GC) гораздо сложнее. Разберем ключевые аспекты работы GC.
🔍 Генерации памяти (Heap Generations)
GC делит память на несколько областей или генераций, каждая из которых соответствует "возрасту" объектов:
🔹 Young Generation (Молодое поколение): Эта область для новых объектов, которые живут кратковременно. Молодое поколение делится на:
▪️ Eden Space: В этой области создаются все новые объекты.
▪️ Survivor Spaces (S0 и S1): Выжившие после очистки в Eden объекты перемещаются сюда. Объекты могут несколько раз перемещаться между S0 и S1, и после определенного количества циклов они переходят в Старое поколение. Эти перемещения также позволяют JVM определять «горячие» (т.е. часто используемые) объекты.
🔹 Old Generation (Старое поколение): Сюда попадают долгоживущие объекты, которые успешно пережили несколько циклов очистки в Young Generation. Эта область требует менее частых, но более длительных операций очистки.
🔹 Metaspace: Содержит метаданные классов, информацию о методах и другую информацию, не относящуюся к объектам напрямую.
⚙️ Алгоритмы и процессы очистки:
🔹 Minor GC (очистка молодого поколения):
- При заполнении Eden Space происходит Minor GC. Этот процесс быстрый, так как большинство объектов в молодом поколении недолговечны.
- GC проверяет ссылки на объекты в Eden и перемещает выжившие объекты в Survivor Space.
- Minor GC обычно не вызывает длительных пауз в программе, так как при использовании многопоточных алгоритмов паузы минимальны. В процессе применяется "write barrier", что позволяет избежать необходимости полного сканирования ссылок из Старого поколения.
🔹 Major GC (или Full GC):
- Когда Old Generation заполняется, запускается Major GC или Full GC. Этот процесс требует больше времени, так как нужно обработать долгоживущие объекты.
- В этом процессе может возникать пауза Stop-the-World, когда JVM останавливает выполнение приложения на время очистки.
- В Major GC используется либо маркировка-сжатие (Mark-Compact), либо маркировка-очистка (Mark-Sweep), что позволяет устранить фрагментацию памяти.
⌛ Алгоритмы и стратегии GC
- Mark-Sweep-Compact: Алгоритм сначала маркирует живые объекты, затем удаляет неиспользуемые, а в конце сжимает память, чтобы устранить фрагментацию.
- Copying (для Young Generation): Используется для быстрого перемещения объектов из Eden в Survivor Space, что позволяет быстро очищать Eden.
- Generational Hypothesis: Основная гипотеза GC — большинство объектов "умирает" молодыми, поэтому Young Generation обрабатывается быстрее и чаще.
💡 Особенности различных типов GC
- Serial GC: Однопоточный, использует Stop-the-World паузы и подходит для небольших приложений.
- Parallel GC: Применяет многопоточность для быстрого удаления мусора, что повышает пропускную способность.
- G1 GC (Garbage-First GC): Подразделяет память на регионы и работает с ними независимо, что минимизирует фрагментацию и "Stop-the-World" паузы. Подходит для приложений с большими объемами памяти.
- ZGC и Shenandoah GC: Эти алгоритмы разработаны для работы практически без остановок, что актуально для интерактивных и критичных приложений.
🛠 Выбор GC зависит от требований приложения
Если критичны низкие задержки, предпочтителен ZGC или Shenandoah GC.
Для приложений с высокой нагрузкой и большим объемом данных — G1 GC.
Для часто выделяющих и освобождающих объекты приложений, таких как веб-приложения, G1 или ZGC также могут обеспечить оптимальную производительность.
Самые полезные каналы для программистов в одной подборке!
Сохраняйте себе, чтобы не потерять 💾
🔥Для всех
Библиотека программиста — новости, статьи, досуг, фундаментальные темы
Книги для программистов
IT-мемы
Proglib Academy — тут мы рассказываем про обучение и курсы
Азбука айтишника — здесь мы познаем азы из мира программирования
🤖Про нейросети
Библиотека робототехники и беспилотников | Роботы, ИИ, интернет вещей
Библиотека нейрозвука | Транскрибация, синтез речи, ИИ-музыка
Библиотека нейротекста | ChatGPT, Gemini, Bing
Библиотека нейровидео | Sora AI, Runway ML, дипфейки
Библиотека нейрокартинок | Midjourney, DALL-E, Stable Diffusion
#️⃣C#
Книги для шарпистов | C#, .NET, F#
Библиотека шарписта — полезные статьи, новости и обучающие материалы по C#
Библиотека задач по C# — код, квизы и тесты
Библиотека собеса по C# — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Вакансии по C#, .NET, Unity Вакансии по PHP, Symfony, Laravel
☁️DevOps
Библиотека devops’а — полезные статьи, новости и обучающие материалы по DevOps
Вакансии по DevOps & SRE
Библиотека задач по DevOps — код, квизы и тесты
Библиотека собеса по DevOps — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
🐘PHP
Библиотека пхпшника — полезные статьи, новости и обучающие материалы по PHP
Вакансии по PHP, Symfony, Laravel
Библиотека PHP для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по PHP — код, квизы и тесты
🐍Python
Библиотека питониста — полезные статьи, новости и обучающие материалы по Python
Вакансии по питону, Django, Flask
Библиотека Python для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Python — код, квизы и тесты
☕Java
Книги для джавистов | Java
Библиотека джависта — полезные статьи по Java, новости и обучающие материалы
Библиотека Java для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Java — код, квизы и тесты
Вакансии для java-разработчиков
👾Data Science
Книги для дата сайентистов | Data Science
Библиотека Data Science — полезные статьи, новости и обучающие материалы по Data Science
Библиотека Data Science для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Data Science — код, квизы и тесты
Вакансии по Data Science, анализу данных, аналитике, искусственному интеллекту
🦫Go
Книги для Go разработчиков
Библиотека Go разработчика — полезные статьи, новости и обучающие материалы по Go
Библиотека Go для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Go — код, квизы и тесты
Вакансии по Go
🧠C++
Книги для C/C++ разработчиков
Библиотека C/C++ разработчика — полезные статьи, новости и обучающие материалы по C++
Библиотека C++ для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по C++ — код, квизы и тесты
Вакансии по C++
💻Другие каналы
Библиотека фронтендера
Библиотека мобильного разработчика
Библиотека хакера
Библиотека тестировщика
Вакансии по фронтенду, джаваскрипт, React, Angular, Vue
Вакансии для мобильных разработчиков
Вакансии по QA тестированию
InfoSec Jobs — вакансии по информационной безопасности
Библиотека разработчика игр | Gamedev, Unity, Unreal Engine
📁Чтобы добавить папку с нашими каналами, нажмите 👉сюда👈
Также у нас есть боты:
Бот с IT-вакансиями
Бот с мероприятиями в сфере IT
Мы в других соцсетях:
🔸VK
🔸YouTube
🔸Дзен
🔸Facebook *
🔸Instagram *
* Организация Meta запрещена на территории РФ
🐳 Шпаргалка по основным командам Docker
От запуска контейнеров до их управления — все ключевые команды в одном месте. Сохраняйте, чтобы не потерять.
🖥 Полнотекстовый поиск с помощью Elasticsearch
Пишите приложение, которое мгновенно обрабатывает огромные объемы данных, обеспечивая молниеносный и точный поиск? Интеграция Elasticsearch с Spring Boot и PostgreSQL открывает новые горизонты, позволяя создавать высокопроизводительные системы с продвинутыми возможностями поиска. Погрузитесь в практическое руководство, которое шаг за шагом проведет вас через процесс настройки и оптимизации этой мощной связки технологий. Узнайте, как эффективно индексировать данные, настраивать весовые коэффициенты и реализовывать сложные синонимические связи для повышения релевантности результатов поиска.
Подробнее читайте в статье.
ℹ️ Модели жизненного цикла разработки ПО
Жизненный цикл разработки ПО — это структура, описывающая процесс создания программного обеспечения, позволяя планировать и управлять разработкой систематично. Вот основные и часто используемые модели:
🔵 Водопадная модель
- Линейный и последовательный подход, где каждый этап строго следует за предыдущим.
- Проект разбивается на отдельные фазы: Сбор требований, Дизайн, Реализация, Верификация, Поддержка.
- Подходит для проектов с четкими, неизменяемыми требованиями.
🔵 Agile-модель
- Разработка ведется небольшими, управляемыми итерациями, называемыми спринтами, что позволяет быстро реагировать на изменения.
- Включает популярные методологии: Scrum (спринты с командными встречами), Kanban (визуализация задач) и Extreme Programming (XP, акцент на частых релизах).
- Применяется для проектов с неопределенными или часто меняющимися требованиями, благодаря гибкости и акценту на обратную связь.
🔵 V-модель (Модель верификации и валидации)
- Расширение водопадной модели, где для каждой фазы разработки предусмотрена фаза тестирования, формирующая визуальную «V»-структуру.
- Подходит для проектов, где критична строгая проверка и верификация на каждом этапе.
🔵 Итеративная модель
- Продукт создается поэтапно, каждая новая итерация улучшает предыдущие, пока не будет достигнут окончательный результат.
- Хорошо подходит для крупных проектов, где сложно сразу определить все требования, но есть понимание общего направления.
🔵 Спиральная модель
- Комбинирует итеративный подход с этапами водопадной модели, что позволяет постепенно создавать продукт с учетом анализа рисков.
- Каждый цикл включает фазы: планирование, анализ рисков, разработка, оценка.
- Идеальна для сложных и масштабных проектов, требующих многократного анализа и управления рисками.
🔵 Модель "Большой взрыв"
- Минимальное планирование, основное внимание уделяется коду, и только в конце идет интеграция и тестирование.
- Применяется для небольших проектов или для экспериментов, когда структура не важна и требуется быстрый результат.
🔵 RAD-модель (Быстрая разработка приложений)
- Сосредоточена на быстром прототипировании и регулярной обратной связи от пользователя.
- Цель — ускорить разработку и адаптацию, что полезно для проектов, где важна скорость релизов.
🔵 Инкрементальная модель
- Продукт разрабатывается и тестируется по частям (инкрементам), каждый из которых добавляет новую функциональность.
- Удобна для проектов с определенными частями функционала, которые можно разрабатывать независимо друг от друга.
- Каждая модель имеет свои плюсы и минусы. Выбор подходящей модели зависит от сложности проекта, стабильности требований, нужной гибкости и степени важности тестирования.
💬 Какая модель используется на вашем текущем проекте?
Yandex DEVent PRO: митап для опытных бэкенд-разработчиков
Приготовили для вас три хардовых доклада:
🔸 Роман Косарев, руководитель разработки Яндекс Недвижимости. Расскажет, как и почему ребята пришли к федеративному GraphQl в архитектуре синхронного API сервиса
🔸 Никита Макаров, руководитель Универсального поиска. Подробно покажет, как внедрение YandexGPT помогло пользователям быстрее принимать решения при покупке товара
🔸 Дмитрий Плещеев, руководитель группы разработки сервисов картографии. Расскажет, как команда Автономного транспорта создаёт высокоточные карты и зачем они нужны
✏️ Зарегистрироваться на митап можно тут.
Мероприятие пройдёт в офлайн-формате. Количество мест ограничено. Пожалуйста, после регистрации дождитесь подтверждения вашего участия — мы пришлём его на электронную почту.
Реклама. ООО "Яндекс", ИНН 7736207543.
🕯 Паттерн Прототип (Prototype)
Prototype — это порождающий паттерн, который позволяет создавать новые объекты путем клонирования уже существующих. Вместо создания объектов с нуля, можно копировать существующие, что сокращает время и ресурсы на создание объектов с похожими параметрами.
Использование:
🔹 Когда необходимо создать объект, похожий на уже существующий, без повторного создания его с нуля.
🔹 В случаях, когда создание объекта «вручную» слишком затратно (например, сложная инициализация).
🔹 Если объект имеет много различных вариантов состояния, и требуется быстро получать новый экземпляр с определенным набором свойств.
Преимущества:
1️⃣ Позволяет создавать новые объекты путем клонирования, что может быть гораздо быстрее, чем создание с нуля.
2️⃣ Можно легко менять клонированные объекты, не затрагивая исходный.
3️⃣ Клонирование полезно для объектов с множеством состояний или структур (например, сложные графические объекты).
Недостатки:
1️⃣ Если объект имеет сложные вложенные структуры, потребуется реализация глубокого копирования, что может быть сложно и затратно.
2️⃣ Для копирования объектов может потребоваться много памяти, особенно если объекты большие.
3️⃣ Клон напрямую зависит от структуры исходного объекта, что может затруднить масштабирование или изменение логики.
📌 Паттерн полезен, когда нужно быстро и гибко создавать объекты, особенно если они имеют множество состояний. Например, при работе с графическими редакторами или в играх, где нужно дублировать сложные сущности с минимальными изменениями.
🔀 Асинхронность — не баг, а фича: 4 паттерна, которые спасут ваш распределённый сервис
Представь, что ты отправляешь сообщение в мессенджере, а оно доходит с задержкой в минуту. Бесит? А теперь представь, что у тебя сервис с миллионами пользователей, и каждое их действие должно мгновенно отражаться везде. Звучит как кошмар? Спокойно, есть четыре проверенных способа решить эту головоломку, и они реально работают.
👉 Читать статью
#дайджест #javadevjob
Вакансии Java разработчиков уровня Junior
▪️Java Developer
Новосибирск. Динамика — разработчик ПО для финансового сектора
Подробнее
▪️Инженер-программист
Удаленка. ИНИТИ — разработчик ПО
Подробнее
Вакансии Java разработчиков уровня Middle
▪️Backend-разработчик
Москва. Grokhotov Studio — ecommerce и сложная разработка
Подробнее
▪️Java-разработчик
Удаленка. УМНЫЙ ПОИСК — разработка ПО
Подробнее
Вакансии Java разработчиков уровня Senior
▪️Java разработчик
Удаленка. СИГМА — ИТ-решения для энергетики и ЖКХ
Подробнее
▪️Java-разработчик
Москва. Data World — ПО для ФинТеха
Подробнее
Понравились вакансии?
❤️ — да
🤔 — нет
Привет, друзья! 👋
Мы готовим статью о том, как эффективно изучать программирование, и хотим услышать ваше мнение! 🤓💻 Поделитесь своим опытом, и самые полезные советы войдут в нашу публикацию.
⚙️ Подпишись на нашу еженедельную email-рассылку, чтобы быть в курсе последних открытий и тенденций в мире бэкенда.
В еженедельных письмах ты найдешь:
● Языки программирования и фреймворки для бэкенда
● Архитектура и проектирование серверных приложений
● Базы данных и управление данными
● Безопасность и защита данных
● Облачные технологии и DevOps
● API и интеграции
● Тестирование и отладка
● Инструменты и утилиты для бэкенд-разработчиков
● Лучшие практики и паттерны проектирования
👉Подписаться👈
Привет, друзья! 👋
Мы готовим статью о секретах мастерства в программировании и хотим узнать ваше мнение! 💻
Какие качества, по вашему мнению, отличают действительно выдающегося программиста? 🏆
Т-Банк ищет Java-разработчиков уровня middle и senior
23 и 24 ноября можно пройти собеседование за выходные и получить оффер, если всем все понравится.
Вот что вас ждет в компании:
— Выстроенный процесс разработки и запуска проектов.
— Современный стек технологий — здесь быстро внедряют новое в работу.
— Разработка на актуальной версии Java.
— Баланс между использованием самописных и стандартных инструментов.
— Сильное комьюнити и обмен опытом на конференциях и митапах.
Узнайте больше и оставьте заявку до 20 ноября
📊 CI/CD Pipeline
CI/CD пайплайн — это система, которая позволяет автоматизировать ключевые этапы разработки: от сборки и тестирования до развертывания программного обеспечения. Такой подход объединяет все стадии жизненного цикла проекта — написание кода, его проверку, тестирование и публикацию — в единый поток, где каждый шаг выполняется автоматически и последовательно.
На диаграмме выше представлены инструменты, которые часто используются для создания эффективного CI/CD пайплайна.
💬 Вы применяете какие-то из них в своих проектах?
Podlodka Java Crew возвращается с новой темой — Асинхронной архитектурой, чтобы помочь Java-разработчикам освоить самые востребованные подходы и инструменты.
Пять дней насыщенной программы, сессии утром и вечером, полезный нетворкинг в уютном чатике.
Погружаемся в асинхронность вместе:
- Рулетка кейсов: "Spring, Micronaut, Quarkus и Helidon" — Григорий Кошелев и Андрей Когунь о плюсах и минусах каждого фреймворка 🛠️
- "Проектирование Event Driven-систем с DDD и Event Storming" — Кирилл Ветчинкин расскажет, как создавать масштабируемые и управляемые системы 📈
- Воркшоп "Apache EventMesh на практике" — Павел Бодячевский поможет внедрить Event Mesh в проект 🎯
- "Debezium: окно в асинхронный мир данных" — Евгений Ефименко раскроет секреты работы с данными в реальном времени 🔄
Присоединяйтесь, чтобы освоить асинхронность на практике: https://podlodka.io/javacrew
А наш специальный промокод javaproglib5 даёт скидку в 500 руб🥳
ℹ️ Какие виды тестирования существуют?
🧪 Unit-тесты: Проверяют работу отдельных, минимальных единиц кода, например, методов или классов, в изоляции. Основная цель — убедиться, что каждый отдельный модуль работает корректно.
🔗 Integration-тесты: Проверяют, как разные модули приложения взаимодействуют между собой. Часто требуют настройки окружения, например, базы данных или API, и помогают выявить ошибки на уровне интеграции.
🎭 End-to-End (E2E) тесты: Проверяют полную цепочку действий в приложении, начиная от пользовательского интерфейса и заканчивая бекендом и базой данных. Цель — убедиться, что вся система работает корректно от начала до конца.
🔄 Regression-тесты: Направлены на проверку, что новые изменения в коде не сломали существующую функциональность. Обычно включают в себя повторение уже существующих тестов.
🛠 Acceptance-тесты: Проверяют, соответствует ли функциональность приложения требованиям заказчика или конечного пользователя. Обычно проводятся на последнем этапе, перед выпуском продукта в продакшн.
💡 Performance-тесты: Оценивают производительность системы — время отклика, пропускную способность и поведение под нагрузкой. Помогают убедиться, что приложение остаётся стабильным при большом количестве запросов.
🚀🐘 Оптимизация хранимых процедур в PostgreSQL: 4 трюка для взрывного ускорения
Кто из нас не сталкивался с медленными хранимыми процедурами в PostgreSQL? Наверняка таких мало. Сегодня поговорим о том, как реально ускорить их работу. Никакой сухой теории — только проверенные на практике методы. Разберем, как анализировать запросы, правильно использовать индексы и применять другие хитрости, которые действительно работают.
Читать статью
⚡️Самые полезные каналы по Java в одной папке
В ней:
➖канал для подготовки к собеседованиям
➖интересные задачи
➖основной канал (этот)
➖книги по Java
➖лучшие вакансии из сферы
➖и наш чат, в котором можно общаться и задавать вопросы
Добавляйте 👉 тык сюда
👀 Задачи с собеседований: Поиск первого уникального символа в строке (jun+)
— Как найти первый уникальный символ в строке?
💡 Ключевые моменты:
- Используйте доп. структуру данных для хранения количества вхождений каждого символа
- Предложите в комментарии другие варианты решения.
Реализация через Map на картинке 👆🏻
🎅 Какой подарок вы бы хотели на НГ? Пишите в комментариях👇
Админ на НГ не отказался бы от вашей активности. Реакции, комментарии, конструктивные предложения будем ждать под ёлкой 🎄
📎 Шпаргалка по OAuth
OAuth в Java — тема, с которой рано или поздно сталкиваются почти все разработчики. Разобраться в тонкостях этого процесса поможет отличная шпаргалка, которую точно стоит сохранить. Если нужно настроить безопасную авторизацию или просто понять, что такое OAuth, смело заглядывай в неё и сохраняй на будущее.
В ней наглядно показано, как работают разные типы авторизации и какие шаги нужны для получения токенов доступа. От простых определений до ключевых этапов Authorization Code Grant Flow. 🔐
🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Неожиданная потеря для Java-сообщества
JetBrains опубликовали прощание с человеком, которого многие из нас знали, но не до конца понимали его вклад. Stiver, известный как создатель Флибусты, также был автором одного из важных инструментов, ставшего основой для IntelliJ IDEA — декомпилятора Fernflower.
Stiver не был сотрудником JetBrains, но его вклад в экосистему Java трудно переоценить. В память о нём JetBrains планируют продолжить развитие Fernflower как open-source проекта, и создать мемориал в его память. Более того, они рассматривают создание грантов и стипендий для тех, кто трудится над подобными проектами.
Уважение и благодарность JetBrains за то, что ценят вклад тех, кто остался за кулисами нашего кода.
📊 Оркестрация и хореография: что выбрать?
Когда дело доходит до координации взаимодействий между микросервисами, выбор между оркестрацией и хореографией — один из ключевых вопросов. Оба подхода имеют свои плюсы и минусы, а также подходят для разных архитектурных сценариев.
🔹 Оркестрация — это централизованный подход, при котором один сервис (оркестратор) управляет всеми взаимодействиями между сервисами. Он выступает дирижером, направляя выполнение процессов и следя за их последовательностью.
▪️ Плюсы:
- Четкий контроль за процессом выполнения задач.
- Упрощенная отладка и мониторинг.
▪️ Минусы:
- Слабая гибкость при изменении требований.
- Если оркестратор падает, система теряет управление процессами.
🔹 Хореография — децентрализованный подход, при котором каждый сервис реагирует на события и инициирует свои действия на основе этих событий. Здесь нет центрального контроллера; сервисы взаимодействуют по принципу «реакции».
▪️ Плюсы:
- Высокая гибкость и легкость в добавлении новых сервисов.
- Отсутствие единой точки отказа.
▪️ Минусы:
- Сложность в отслеживании последовательности выполнения.
- Потенциальные проблемы с согласованностью данных.
🎯 Когда что выбрать?
- Оркестрация хорошо подходит для бизнес-процессов с четкой последовательностью действий, когда требуется строгий контроль выполнения.
- Хореография лучше подходит для распределенных систем, где важно масштабирование и гибкость, а также в сценариях с высокой скоростью событий и реакций.
🤝 8 важных soft skills для сеньоров, тимлидов и других старших «джедаев»
За каждым успешным IT-проектом стоят не только строчки кода, но и применение soft skills. Мы раскрываем 8 ключевых навыков, которые превратят тебя из рядового кодера в тимлида.
👉 Читать статью
ℹ️ Как устроен под капотом TreeMap?
TreeMap — это реализация интерфейса Map в Java, которая сохраняет элементы в отсортированном порядке. В отличие от HashMap и LinkedHashMap, которые не гарантируют порядок, TreeMap организует элементы по естественному порядку или с помощью заданного Comparator. Это достигается с помощью красно-чёрного дерева, структуры данных, поддерживающей отсортированный порядок с высокой эффективностью.
🔹 Структура TreeMap
TreeMap основан на красно-чёрном дереве, что позволяет выполнять операции вставки, удаления и поиска за логарифмическое время:
▪️ Каждая запись (node) в TreeMap содержит ссылки на левый и правый дочерние узлы, а также на родительский узел. Красно-чёрное дерево поддерживает сбалансированность, что минимизирует высоту дерева.
▪️ Каждый узел имеет атрибут «цвет» — красный или чёрный, что позволяет TreeMap быстро балансировать дерево при добавлении или удалении элементов.
🔹 Производительность
▪️ Вставка: Добавление новых элементов выполняется за O(log n), так как операция требует соблюдения порядка и может потребовать перестройки дерева для поддержания баланса.
▪️ Удаление: Удаление элементов также выполняется за O(log n), с обязательной корректировкой баланса дерева.
▪️ Поиск: Поиск элементов по ключу также занимает O(log n), благодаря сбалансированному дереву.
🔹 Использование памяти
Каждый узел в TreeMap содержит ссылки на дочерние узлы и родительский узел, а также информацию о цвете. Из-за этого TreeMap требует больше памяти, чем обычный HashMap, но сохраняет отсортированный порядок ключей.
🔹 Преимущества и недостатки
▪️ Преимущества:
- Поддержание отсортированного порядка: TreeMap гарантирует, что элементы будут отсортированы по возрастанию (или согласно Comparator), что полезно для приложений, где важен порядок ключей.
- Быстрая навигация: TreeMap поддерживает методы для нахождения минимальных и максимальных элементов, а также диапазонные операции, такие как subMap, headMap и tailMap.
- Балансировка: Красно-чёрное дерево автоматически балансируется, что обеспечивает высокую производительность на больших наборах данных.
▪️ Недостатки:
- Более высокие временные затраты на вставку и удаление: В отличие от HashMap и LinkedHashMap, TreeMap требует логарифмическое время на операции из-за необходимости поддержания баланса.
- Более высокое потребление памяти: Дополнительные ссылки и атрибуты для балансировки увеличивают использование памяти по сравнению с HashMap.
- Не поддерживает null ключи: В TreeMap нельзя использовать null в качестве ключа, что ограничивает его использование в некоторых сценариях.
🔗 Хотите быстрее настроить Spring Boot проект?
Spring Initializr – инструмент, который поможет вам с начальной конфигурацией Spring-приложения. Выберите сборщик, зависимости, версию Java, и он сгенерирует базовую структуру проекта, готовую для импорта в вашу IDE и начала разработки.
🔼 Сразу переходите к разработке, избегая рутинной конфигурации.
🛡 Исключите риск несовместимых библиотек.
➕ Начинайте с простого набора функций и по мере роста добавляйте новые зависимости.