Откуда вы сейчас читаете нас?
Anonymous Poll
59%
Россия
7%
Беларусь
6%
Украина
6%
Казахстан
0%
Армения
1%
Грузия
1%
США
6%
Страна ЕС
2%
Солнечное Бали 🌴
12%
Другое
Фасад — это структурный паттерн, который предоставляет унифицированный интерфейс для работы с набором сложных подсистем. Он скрывает сложность системы и упрощает взаимодействие с ней, предоставляя более простой и понятный API для клиента.
Использование:
🔹 Когда система состоит из множества классов, и нужно упростить доступ к её функционалу.
🔹 Когда нужно предоставить клиенту единый интерфейс для работы с несколькими подсистемами.
🔹 Когда необходимо уменьшить зависимость между клиентом и сложной системой, скрыв внутренние детали реализации.
Преимущества:
Недостатки:
Please open Telegram to view this post
VIEW IN TELEGRAM
⚙️ Подпишись на нашу еженедельную email-рассылку, чтобы быть в курсе последних открытий и тенденций в мире бэкенда.
В еженедельных письмах ты найдешь:
● Языки программирования и фреймворки для бэкенда
● Архитектура и проектирование серверных приложений
● Базы данных и управление данными
● Безопасность и защита данных
● Облачные технологии и DevOps
● API и интеграции
● Тестирование и отладка
● Инструменты и утилиты для бэкенд-разработчиков
● Лучшие практики и паттерны проектирования
👉Подписаться👈
В еженедельных письмах ты найдешь:
● Языки программирования и фреймворки для бэкенда
● Архитектура и проектирование серверных приложений
● Базы данных и управление данными
● Безопасность и защита данных
● Облачные технологии и DevOps
● API и интеграции
● Тестирование и отладка
● Инструменты и утилиты для бэкенд-разработчиков
● Лучшие практики и паттерны проектирования
👉Подписаться👈
Forwarded from Java jobs — вакансии для java-разработчиков
#дайджест #Javadevjob
Вакансии Java разработчиков уровня Junior
▪️ Junior Java Developer
Гибрид (Санкт-Петербург), Just AI
Подробнее
▪️ Junior Java Developer
Офис (Москва) / Удалёнка, Trend Soft
Подробнее
Вакансии Java разработчиков уровня Middle
▪️ Java-разработчик
Офис (Москва), Газпромбанк
Подробнее
▪️ Java Developer (middle+)
Удалёнка, ОЦРВ
Подробнее
Вакансии Java разработчиков уровня Senior
▪️ Java-разработчик (проект СЭД)
Офис (Москва), Гринатом
Подробнее
▪️ Java Developer + ELK
Удалёнка, Hoff Tech
Подробнее
Понравились вакансии?
❤️ — да
🤔 — нет
Вакансии Java разработчиков уровня Junior
▪️ Junior Java Developer
Гибрид (Санкт-Петербург), Just AI
Подробнее
▪️ Junior Java Developer
Офис (Москва) / Удалёнка, Trend Soft
Подробнее
Вакансии Java разработчиков уровня Middle
▪️ Java-разработчик
Офис (Москва), Газпромбанк
Подробнее
▪️ Java Developer (middle+)
Удалёнка, ОЦРВ
Подробнее
Вакансии Java разработчиков уровня Senior
▪️ Java-разработчик (проект СЭД)
Офис (Москва), Гринатом
Подробнее
▪️ Java Developer + ELK
Удалёнка, Hoff Tech
Подробнее
Понравились вакансии?
❤️ — да
🤔 — нет
spb.hh.ru
Вакансия Junior Java Developer в Санкт-Петербурге, работа в компании Just AI (вакансия в архиве c 20 декабря 2024)
Зарплата: не указана. Санкт-Петербург. Требуемый опыт: не требуется. Полная. Дата публикации: 11.12.2024.
Задачи, которые требуют асинхронного выполнения, могут стать настоящей головной болью, если использовать устаревшие методы. Однако, есть мощный инструмент — CompletableFuture, который упрощает работу с параллельными вычислениями, обеспечивая гибкость, читаемость и исключение возможных ошибок в многозадачности. Статья содержит интересный пример использования этого инструмента. В ней описана реализация веб-сканера, который будет по ссылкам искать новости, посвященные хакингу.
Please open Telegram to view this post
VIEW IN TELEGRAM
volatile — это ключевое слово, которое используется для указания компилятору и JVM, что значение переменной может изменяться из нескольких потоков. Это гарантирует, что чтение и запись переменной будут происходить непосредственно в основной памяти, а не в кэше процессора, что позволяет избежать различных проблем синхронизации между потоками.
▪️ Синхронизация чтения и записи: Переменная, помеченная как volatile, всегда будет читать свое значение из основной памяти, а не из локальных кешей потоков.
▪️ Обеспечение видимости: Когда один поток изменяет значение переменной, все другие потоки немедленно видят эти изменения.
▪️ Отсутствие блокировок: В отличие от использования synchronized, volatile не блокирует выполнение потоков, что делает его более легковесным способом синхронизации.
Когда использовать volatile?
- Когда переменная должна быть доступна для записи и чтения несколькими потоками, но нет необходимости в сложной синхронизации (например, для флагов, флагов завершения, индикаторов состояний).
- В случаях, когда нужно просто гарантировать видимость изменений, но не требуется атомарность или операции с несколькими шагами (для этих случаев лучше использовать synchronized или java.util.concurrent).
Пример:
public class VolatileExample {
private static volatile boolean flag = false;
public static void main(String[] args) throws InterruptedException {
Thread writer = new Thread(() -> {
try {
Thread.sleep(1000); // эмулируем задержку
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
flag = true;
System.out.println("Flag set to true");
});
Thread reader = new Thread(() -> {
while (!flag) {
}
System.out.println("Flag is now true");
});
writer.start();
reader.start();
writer.join();
reader.join();
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Привет, друзья! 👋
2024-й год подходит к концу, и пока LLM не написали за нас все программы, а квантовые компьютеры не взломали все пароли, самое время подвести итоги. Какие технологии действительно «выстрелили», а какие не оправдали ожиданий? Что изменилось в работе разработчиков, и какие навыки оказались самыми востребованными?
💻 Поделитесь своим мнением, и самое важное и интересное войдет в нашу статью. 🏆
2024-й год подходит к концу, и пока LLM не написали за нас все программы, а квантовые компьютеры не взломали все пароли, самое время подвести итоги. Какие технологии действительно «выстрелили», а какие не оправдали ожиданий? Что изменилось в работе разработчиков, и какие навыки оказались самыми востребованными?
💻 Поделитесь своим мнением, и самое важное и интересное войдет в нашу статью. 🏆
Forwarded from Библиотека собеса по Java | вопросы с собеседований
Проблема бриллианта (или Diamond Problem) — это ситуация, которая возникает в языках программирования с поддержкой множественного наследования. Она заключается в том, что если один класс наследует два или более класса, которые имеют общий предок, то возникает неопределенность, с какого родительского класса должны быть унаследованы члены (методы или поля).
В Java множественное наследование классов не поддерживается, но проблема все равно может возникнуть при использовании интерфейсов.
interface A {
void method();
}
interface B extends A {
@Override
default void method() {
System.out.println("Method from B");
}
}
interface C extends A {
@Override
default void method() {
System.out.println("Method from C");
}
}
class D implements B, C { }
public class Main {
public static void main(String[] args) {
D d = new D();
d.method(); // Какая версия метода будет вызвана?
}
}
Когда класс D реализует оба интерфейса B и C, которые оба предоставляют дефолтные реализации метода method(), возникает неопределенность — какую версию метода должен использовать класс D? При компиляции будет выброшен error: class D inherits unrelated defaults for method() from types B and C.
Это решается с помощью явного переопределения метода в классе D, что позволяет избежать конфликтов.
class D implements B, C {
@Override
public void method() {
B.super.method();
// или можно использовать C.super.method(), если хотите вызвать метод из C
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
🔹 Инструменты для работы в команде: Освойте Jira, Confluence, Slack, MS Teams, Zoom и другие.
🔹 Языки программирования: Углубитесь в 1-2 языка, например, Python, С#.
🔹 Разработка API: Изучите REST, GraphQL, gRPC.
🔹 Серверы и хостинг: Ознакомьтесь с AWS, Azure, GCP, Kubernetes.
🔹 Аутентификация и тестирование: Освойте JWT, OAuth2, TDD и нагрузочное тестирование.
🔹 Базы данных: Работайте с SQL (Postgres, MySQL) и NoSQL (MongoDB).
🔹 CI/CD: Изучите GitHub Actions, Jenkins.
🔹 Алгоритмы: Разберитесь в Big O, деревьях, графах.
🔹 Системный дизайн: Погрузитесь в кэширование, микросервисы, балансировку нагрузки.
🔹 Паттерны проектирования: Изучите DI, фабрику и другие паттерны.
🔹 AI-инструменты: Научитесь использовать GitHub Copilot, ChatGPT.
Please open Telegram to view this post
VIEW IN TELEGRAM
CopyOnWriteArrayList — это потокобезопасная реализация списка, оптимизированная для сценариев с частым чтением и редкими изменениями. Когда происходит изменение в CopyOnWriteArrayList, создаётся новая копия базового массива, в которую вносятся изменения. Таким образом, чтение и запись изолированы: до завершения модификации читающие потоки получают доступ к старому массиву, а запись завершает свою работу, не блокируя других потоков.
🔹 До завершения операции модификации все читающие потоки продолжают работать с текущей неизменяемой версией массива.
🔹 При вызове методов, изменяющих список (например, add, remove), создаётся новый массив на основе старого. Изменения применяются именно к новому массиву.
🔹 После завершения модификации ссылка на массив обновляется на новую версию. Теперь все новые операции чтения будут работать с обновлённой версией.
▪️ Высокие накладные расходы на запись из-за создания копий.
▪️ Подходит для случаев, где чтение доминирует над изменением.
▪️ Не рекомендуется для сценариев с частыми обновлениями из-за увеличения потребления памяти.
CopyOnWriteArrayList идеально подходит для кешей, обработчиков событий и других структур данных, где важна стабильность чтения при редких изменениях.
Документация
Please open Telegram to view this post
VIEW IN TELEGRAM
🎄🎅 Настало время решать весёлые, праздничные головоломки по программированию
Advent of Code 2024 — адвент-календарь с небольшими головоломками по программированию. Всё, что вам нужно для участия, — это немного знаний в области программирования. Решать можно на любом ЯП.
👉 Врывайтесь, ведь позади уже шесть дней
Advent of Code 2024 — адвент-календарь с небольшими головоломками по программированию. Всё, что вам нужно для участия, — это немного знаний в области программирования. Решать можно на любом ЯП.
👉 Врывайтесь, ведь позади уже шесть дней
Visitor — это поведенческий паттерн, который позволяет добавлять новые операции к объектам без изменения их классов. Он выделяет операции в отдельный объект, называемый "посетитель", что позволяет избежать дублирования кода и поддерживать open/closed архитектуру.
Использование:
🔹 Когда нужно добавлять новые операции к иерархии классов без изменения их структуры.
🔹 Когда объектам требуется обработка, зависящая от их типов, но нежелательно добавлять логику внутрь самих классов.
Преимущества:
Недостатки:
Please open Telegram to view this post
VIEW IN TELEGRAM
🐍☕️ Тайные питонисты среди нас?
Не секрет, что среди Java-разработчиков скрываются те, кто втайне любит Python. Кто украдкой пишет скрипты на Python для автоматизации или просто мечтает о жизни без фигурных скобок.
📌 Пройдите тест и проверьте, не живет ли внутри вас тайный питонист.
P.S. Не волнуйтесь, никто не будет осуждать, если вам вдруг понравится 🙂
Не секрет, что среди Java-разработчиков скрываются те, кто втайне любит Python. Кто украдкой пишет скрипты на Python для автоматизации или просто мечтает о жизни без фигурных скобок.
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Java jobs — вакансии для java-разработчиков
#дайджест #Javadevjob
Вакансии Java разработчиков уровня Junior
▪️ Junior Java разработчик (Стажер)
Офис (Санкт-Петербург), Центр финансовых технологий
Подробнее
▪️ Junior Java Developer (Пенза)
Офис (Пенза), Тортуга
Подробнее
Вакансии Java разработчиков уровня Middle
▪️ Java-разработчик
Офис (Москва, Санкт-Петербург, Екатеринбург) / Удалёнка, Т-Банк
Подробнее
▪️ Middle+ Java разработчик
Гибрид (Москва), СберКорус
Подробнее
Вакансии Java разработчиков уровня Senior
▪️ Java-разработчик Middle\Senior
Удалёнка, RedLab
Подробнее
▪️ Senior Java разработчик
Удалёнка / Офис (Москва), Синхро
Подробнее
Понравились вакансии?
❤️ — да
🤔 — нет
Вакансии Java разработчиков уровня Junior
▪️ Junior Java разработчик (Стажер)
Офис (Санкт-Петербург), Центр финансовых технологий
Подробнее
▪️ Junior Java Developer (Пенза)
Офис (Пенза), Тортуга
Подробнее
Вакансии Java разработчиков уровня Middle
▪️ Java-разработчик
Офис (Москва, Санкт-Петербург, Екатеринбург) / Удалёнка, Т-Банк
Подробнее
▪️ Middle+ Java разработчик
Гибрид (Москва), СберКорус
Подробнее
Вакансии Java разработчиков уровня Senior
▪️ Java-разработчик Middle\Senior
Удалёнка, RedLab
Подробнее
▪️ Senior Java разработчик
Удалёнка / Офис (Москва), Синхро
Подробнее
Понравились вакансии?
❤️ — да
🤔 — нет
spb.hh.ru
Вакансия Junior Java разработчик (Стажер) в Санкт-Петербурге, работа в компании Центр финансовых технологий (вакансия в архиве…
Зарплата: не указана. Санкт-Петербург. Требуемый опыт: не требуется. Полная. Дата публикации: 07.02.2025.
🐛🔍 Как найти баг в 2088 коммитах с помощью git bisect
Метод
Задача: найти конкретный коммит, который вызвал регрессионную ошибку в проекте.
Исходные данные:
✔️ Ошибка была зарегистрирована 21 октября. Она находится в текущей версии на ветке main.
✔️ Ошибка отсутствует в более ранней версии, которая была выделена в отдельную ветку
✔️ Ветку
🔗 Читать статью
🔗 Зеркало
Метод
git bisect
— мощный инструмент для поиска изменения, вызвавшего баг в коде: с его помощью разработчику удалось быстро локализовать проблему, просмотрев всего 11 коммитов вместо изначальных 2088.Задача: найти конкретный коммит, который вызвал регрессионную ошибку в проекте.
Исходные данные:
✔️ Ошибка была зарегистрирована 21 октября. Она находится в текущей версии на ветке main.
✔️ Ошибка отсутствует в более ранней версии, которая была выделена в отдельную ветку
release-5.7.0
.✔️ Ветку
release-5.7.0
создали 2 месяца назад, а с тех пор в ветке main
было сделано много изменений — баг может находиться в любом из нескольких тысяч коммитов, которые невозможно быстро просмотреть.🔗 Читать статью
🔗 Зеркало