Работа в аутсорсинге — это всегда вызов: одним кажется, что она приносит больше стресса, чем пользы, а другие видят в ней отличный шанс для быстрого развития и получения разнообразного опыта.
Но устраиваться в первую попавшуюся компанию — не лучший план. Часто возникают проблемы с финансами, и стабильность здесь — редкость. Поэтому важно выбрать правильную студию, которая поддержит ваши карьерные амбиции.
📖 Читать статью
Please open Telegram to view this post
VIEW IN TELEGRAM
Устали от скучной рутины? Хочется чего-то необычного и интересного? Эта статья точно для вас! Здесь вы узнаете, как создать полноценное веб-приложение на Java без использования фреймворков и библиотек, работая только с JDK. Автор предлагает заново открыть забытые методы разработки и создать проект "с нуля" в духе "старой школы". Вас ждёт увлекательное погружение в разработку без современных зависимостей, что откроет новые горизонты в вашем понимании программирования.
Please open Telegram to view this post
VIEW IN TELEGRAM
Хабр
«Голая Java» или разработка без всего
Рассказываю что можно сделать на одном только голом JDK . Это старое и ныне почти забытое искусство разработки без внешних библиотек и фреймворков . Работать будем «как в былинные...
🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Forwarded from Библиотека тестировщика | QA, тестирование, quality assurance, manual testing, autotesting, ручное тестирование, автотесты
Forwarded from Библиотека собеса по Java | вопросы с собеседований
HashSet — это реализация множества (set), которое не допускает дублирующихся элементов. В его основе используется механизм хеширования для быстрого поиска, добавления и удаления элементов.
🔹 Хеш-таблица как основа
В основе HashSet лежит HashMap. Каждый элемент множества хранится в качестве ключа внутри объекта HashMap, а его значение всегда фиксированное — это специальный объект-заглушка. Этот объект используется для обозначения присутствия элемента, так как HashMap требует наличие пары "ключ-значение".
🔹 Хеширование
Когда вы добавляете элемент в HashSet, для него вычисляется хеш-код с помощью метода hashCode(). Этот хеш-код помогает определить, в какую "корзину" (bucket) поместится элемент. Если два элемента имеют одинаковый хеш-код (коллизия), они будут помещены в один и тот же бакет, и далее будут различаться с помощью метода equals().
🔹 Коллизии и структура бакета
До Java 8, если в бакет попадало несколько элементов (коллизия), они сохранялись в виде односвязного списка. Это приводило к тому, что в худшем случае производительность поиска и добавления элементов могла падать до O(n), если список становился слишком длинным.
С Java 8 при превышении 8 элементов в одном бакете, односвязный список преобразуется в красно-чёрное дерево, что улучшает производительность операций до O(log n). Когда количество элементов в бакете падает ниже 6, структура снова преобразуется обратно в связанный список для экономии памяти.
🔹 Добавление элементов
▪️ В среднем: добавление элемента занимает O(1), потому что благодаря хеш-кодам можно быстро находить нужную корзину для элемента.
▪️ В худшем случае: добавление элемента может занять O(n) до Java 8 (связный список) и O(log n) начиная с Java 8 (красно-чёрное дерево).
🔹 Удаление элементов
Удаление происходит также через хеш-код: ищется соответствующая корзина, а затем элемент удаляется, если он там есть. Сложность удаления аналогична добавлению: O(1) в среднем и O(n) или O(log n) в худшем случае (в зависимости от структуры бакета).
🔹 Преимущества и недостатки
▪️ Преимущества: Быстрое добавление, удаление и поиск элементов в среднем за O(1), так как используется хеширование. Улучшенная производительность с Java 8 благодаря использованию красно-чёрного дерева.
▪️ Недостатки: Не гарантирует порядок элементов, а при частых коллизиях, особенно в старых версиях Java, производительность может падать до O(n).
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет, друзья! 👋
Мы хотим обсудить важную тему — токсичность в среде разработчиков и значимость поддержки и наставничества. Нам интересно узнать ваше мнение и опыт! Поделитесь своими мыслями, и самые полезные советы мы включим в нашу статью. Вот несколько вопросов для вас:
🤔 Приходилось ли вам сталкиваться с токсичными коллегами на работе? Как вы справлялись с этой ситуацией?
🌟 Какие качества вы считаете важными для хорошего наставника в IT-сфере?
💡 Какие советы вы бы дали тем, кто хочет создать более поддерживающую и позитивную рабочую атмосферу?
Спасибо за ваше участие! Ваши ответы помогут сделать рабочую среду лучше для всех. 🚀
Мы хотим обсудить важную тему — токсичность в среде разработчиков и значимость поддержки и наставничества. Нам интересно узнать ваше мнение и опыт! Поделитесь своими мыслями, и самые полезные советы мы включим в нашу статью. Вот несколько вопросов для вас:
🤔 Приходилось ли вам сталкиваться с токсичными коллегами на работе? Как вы справлялись с этой ситуацией?
🌟 Какие качества вы считаете важными для хорошего наставника в IT-сфере?
💡 Какие советы вы бы дали тем, кто хочет создать более поддерживающую и позитивную рабочую атмосферу?
Спасибо за ваше участие! Ваши ответы помогут сделать рабочую среду лучше для всех. 🚀
Observer — это поведенческий паттерн, который создаёт механизм подписки, позволяющий одним объектам следить и реагировать на изменения состояния других объектов. Наблюдатель предоставляет гибкую систему взаимодействия между объектами, исключая жесткую связанность.
Использование:
🔹 Когда нужно оповещать несколько объектов об изменениях состояния другого объекта.
🔹 Когда важно обеспечить слабую связанность между компонентами системы.
🔹 При разработке систем, где одни объекты должны реагировать на изменения в других, без жёсткой привязки.
Преимущества:
Недостатки:
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Библиотека питониста | Python, Django, Flask
⚡️🔫 Секретное оружие бэкендера: 6 инструментов, о которых вы не знали
В новой статье рассказываем о шести малоизвестных, но невероятно мощных инструментах, которые превратят вас в настоящего супергероя бэкенд-разработки.
👉 Читать по этой ссылке
В новой статье рассказываем о шести малоизвестных, но невероятно мощных инструментах, которые превратят вас в настоящего супергероя бэкенд-разработки.
👉 Читать по этой ссылке
Логирование, трассировка и метрики — это три столпа наблюдаемости системы
🔹 Логирование
Логирование фиксирует дискретные события в системе. Например, мы можем записывать входящие запросы или обращения к базам данных как события. Это самый объемный тип данных. Для построения платформы анализа логов часто используют стек ELK (Elastic-Logstash-Kibana). Мы часто определяем стандартизированный формат логов для разных команд, чтобы использовать ключевые слова при поиске среди большого объема логов.
🔹 Трассировка
Трассировка обычно привязана к запросам. Например, пользовательский запрос проходит через API-шлюз, балансировщик нагрузки, сервис A, сервис B и базу данных — это можно визуализировать в системах трассировки. Это полезно для выявления узких мест в системе. OpenTelemetry используется для демонстрации типичной архитектуры, которая объединяет три столпа в одной платформе.
🔹 Метрики
Метрики — это обычно агрегируемая информация из системы. Например, QPS сервиса, отзывчивость API, задержка сервиса и т.д. Сырые данные записываются в базы данных временных рядов, такие как InfluxDB. Prometheus извлекает данные и преобразует их на основе предопределенных правил оповещений. Затем данные отправляются в Grafana для отображения или в менеджер оповещений, который затем рассылает уведомления по email, SMS или в Slack.
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Библиотека задач по Java | тесты, код, задания
Forwarded from Библиотека задач по Java | тесты, код, задания
Какой результат выведет программа?
Anonymous Quiz
19%
20000, так как оба потока добавят по 10000 символов "A"
5%
10000, так как второй поток не завершит выполнение до вывода результата
20%
ConcurrentModificationException, так как StringBuilder не поддерживает многопоточность
55%
Непредсказуемое значение меньше 20000, StringBuilder не потокобезопасен, и возможно состояние гонки
2%
5000, так как один поток начнет выполнение до того, как второй подключится
Forwarded from Java jobs — вакансии для java-разработчиков
#дайджест #javadevjob
Вакансии Java разработчиков уровня Junior
▪️Java разработчик
Москва. Datanomica — работа с данными
Подробнее
▪️Java Developer
Череповец. BIV — поставщик услуг для федеральных страховых и финансовых компаний
Подробнее
Вакансии Java разработчиков уровня Middle
▪️Java разработчик
Екатеринбург. СКБ ЛАБ — разработка ПО
Подробнее
▪️Java Developer
Ростов-на-Дону. FIRECODE — инновационные решения для крупных бизнесов
Подробнее
Вакансии Java разработчиков уровня Senior
▪️Full-stack разработчик
Удаленка. Dex — мобильные приложения и web-сервисы для среднего и крупного бизнеса
Подробнее
▪️Разработчик Java
Удаленка. Орбита — разработка ПО
Подробнее
Понравились вакансии?
❤️ — да
🤔 — нет
Вакансии Java разработчиков уровня Junior
▪️Java разработчик
Москва. Datanomica — работа с данными
Подробнее
▪️Java Developer
Череповец. BIV — поставщик услуг для федеральных страховых и финансовых компаний
Подробнее
Вакансии Java разработчиков уровня Middle
▪️Java разработчик
Екатеринбург. СКБ ЛАБ — разработка ПО
Подробнее
▪️Java Developer
Ростов-на-Дону. FIRECODE — инновационные решения для крупных бизнесов
Подробнее
Вакансии Java разработчиков уровня Senior
▪️Full-stack разработчик
Удаленка. Dex — мобильные приложения и web-сервисы для среднего и крупного бизнеса
Подробнее
▪️Разработчик Java
Удаленка. Орбита — разработка ПО
Подробнее
Понравились вакансии?
❤️ — да
🤔 — нет
hh.ru
Вакансия Junior Java разработчик в Москве, работа в компании Datanomica (вакансия в архиве c 24 октября 2024)
Зарплата: от 80000 до 100000 ₽ за месяц. Москва. Требуемый опыт: 1–3 года. Полная занятость. Дата публикации: 21.10.2024.
Когда дело касается выполнения асинхронных задач, класс CompletableFuture является мощным инструментом для упрощения работы с многопоточностью и асинхронным программированием. Он позволяет строить цепочки задач, обрабатывать ошибки и объединять несколько будущих значений без использования блокирующих операций.
CompletableFuture — это расширение интерфейса Future, которое упрощает работу с асинхронными вычислениями. В отличие от стандартного Future, он позволяет:
▪️ Запускать задачи асинхронно;
▪️ Комбинировать несколько задач;
▪️ Обрабатывать ошибки без try-catch;
▪️ Строить цепочки зависимостей.
Пример создания асинхронной задачи:
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
// Эмуляция долгой задачи
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new IllegalStateException(e);
}
return "Задача завершена!";
});
System.out.println(future.join()); // Ожидание завершения и получение результата
Здесь задача выполняется в фоновом потоке, а основной поток продолжает свою работу.
Часто нужно дождаться завершения нескольких задач и собрать их результаты. С помощью thenCombine() можно комбинировать результаты нескольких асинхронных вычислений:
CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 50);
CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 20);
CompletableFuture<Integer> result = future1.thenCombine(future2, Integer::sum);
System.out.println(result.join()); // 70
Здесь задачи выполняются параллельно, и их результаты комбинируются, когда обе завершены.
Одним из главных преимуществ CompletableFuture является возможность обрабатывать ошибки без try-catch через метод exceptionally():
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
if (true) throw new RuntimeException("Ошибка!");
return 42;
}).exceptionally(ex -> {
System.out.println("Произошла ошибка: " + ex.getMessage());
return 0; // Возвращаем дефолтное значение в случае ошибки
});
System.out.println(future.join()); // 0
Этот подход улучшает читаемость и упрощает обработку исключений в асинхронном коде.
Вы можете строить целые цепочки задач с помощью методов thenApply(), thenAccept() и т.д. Пример использования:
CompletableFuture.supplyAsync(() -> "Hello")
.thenApply(result -> result + " World")
.thenAccept(finalResult -> System.out.println(finalResult)); // Hello World
Каждая следующая задача запускается после завершения предыдущей, что позволяет гибко управлять зависимостями.
🛠 Применение на практике
CompletableFuture идеально подходит для задач, требующих асинхронности: запросы к API, обработка данных в фоне и т.д. Пример с вызовом нескольких API параллельно:
CompletableFuture<String> api1 = CompletableFuture.supplyAsync(() -> {
// Эмуляция запроса к первому API
return "Response from API 1";
});
CompletableFuture<String> api2 = CompletableFuture.supplyAsync(() -> {
// Эмуляция запроса ко второму API
return "Response from API 2";
});
CompletableFuture<Void> allOf = CompletableFuture.allOf(api1, api2);
allOf.thenRun(() -> {
try {
System.out.println(api1.get() + " & " + api2.get());
} catch (Exception e) {
e.printStackTrace();
}
});
Please open Telegram to view this post
VIEW IN TELEGRAM