Вопрос с собеседований
Как уменьшить паузы GC?🤓
Ответ:
Используют современные сборщики (G1, ZGC, Shenandoah), уменьшают количество объектов, применяют пулы, избегают временных коллекций.
Иногда — тюнят параметры JVM (-Xms, -Xmx, -XX:+UseG1GC).
Главное — баланс между скоростью и стабильностью.
#собеседование
Как уменьшить паузы GC?
Ответ:
Иногда — тюнят параметры JVM (-Xms, -Xmx, -XX:+UseG1GC).
Главное — баланс между скоростью и стабильностью.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
История IT-технологий сегодня — 01 ноября
ℹ️ Кто родился в этот день
Алексе́й Константи́нович Фёдоров (1 ноября 1993, Москва, Россия) — российский физик-теоретик, работает в области квантовых вычислений и блокчейн-технологий; автор обзоров и исследований по устойчивости блокчейн-схем и квантовым протоколам.
Райко Томович (серб. Рајко Томовић; 1 ноября 1919, Байя — 30 мая 2001, Белград)— югославский/сербский инженер и пионер робототехники и медицинской биотехники; внёс вклад в ранние исследования искусственного интеллекта для медицинских приложений.
Бабак Ходжат ( перс . بابک حجت ; родился 1 ноября 1967 г.) — ученый в области искусственного интеллекта и машино-ориентированных интерфейсов; сооснователь Sentient Technologies, его ранние разработки в NLP/AI использовались в технологиях голосовых помощников.
Ти́моти (Тим) До́нальд Кук (англ. Timothy Donald Cook; род. 1 ноября 1960 года, Мобил, Алабама, США) — топ-менеджер и технологический руководитель (CEO Apple); сыграл ключевую роль в масштабировании производства, продуктов и сервисов, формирующих совремую цифровую экосистему.
🌐 Знаковые события
1954 — в США поступил в продажу первый в мире полностью транзисторный радиоприёмник — Regency TR-1.
1962 — в СССР осуществлён запуск автоматической межпланетной станции «Марс-1».
2015 — прекращение существования корпорации Hewlett-Packard.
#Biography #Birth_Date #Events #1Ноября
Алексе́й Константи́нович Фёдоров (1 ноября 1993, Москва, Россия) — российский физик-теоретик, работает в области квантовых вычислений и блокчейн-технологий; автор обзоров и исследований по устойчивости блокчейн-схем и квантовым протоколам.
Райко Томович (серб. Рајко Томовић; 1 ноября 1919, Байя — 30 мая 2001, Белград)— югославский/сербский инженер и пионер робототехники и медицинской биотехники; внёс вклад в ранние исследования искусственного интеллекта для медицинских приложений.
Бабак Ходжат ( перс . بابک حجت ; родился 1 ноября 1967 г.) — ученый в области искусственного интеллекта и машино-ориентированных интерфейсов; сооснователь Sentient Technologies, его ранние разработки в NLP/AI использовались в технологиях голосовых помощников.
Ти́моти (Тим) До́нальд Кук (англ. Timothy Donald Cook; род. 1 ноября 1960 года, Мобил, Алабама, США) — топ-менеджер и технологический руководитель (CEO Apple); сыграл ключевую роль в масштабировании производства, продуктов и сервисов, формирующих совремую цифровую экосистему.
1954 — в США поступил в продажу первый в мире полностью транзисторный радиоприёмник — Regency TR-1.
1962 — в СССР осуществлён запуск автоматической межпланетной станции «Марс-1».
2015 — прекращение существования корпорации Hewlett-Packard.
#Biography #Birth_Date #Events #1Ноября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Protocol Buffers: сердце gRPC
Если gRPC — это двигатель взаимодействия сервисов, то Protocol Buffers (protobuf) — это его сердце.
Именно protobuf определяет, как описываются данные, как они сериализуются, и как из одной схемы генерируются типобезопасные классы для разных языков.
Чтобы по-настоящему понимать gRPC, нужно уверенно работать с .proto-файлами.
1. Что такое .proto файл
.proto — это файл описания структуры данных и интерфейсов (API).
Он играет сразу три роли:
Документирует контракт между клиентом и сервером (описывает, какие методы и какие данные доступны).
Генерирует код для разных языков с помощью protoc (компилятора Protocol Buffers).
Определяет схему сериализации — то, как объекты превращаются в байты и обратно.
Фактически .proto — это единый источник правды для вашего API.
2. Базовая структура .proto файла
Пример простого файла:
3. Ключевые элементы .proto
3.1. syntax
Первая строка файла:
Обязательно указывает версию синтаксиса.
На практике используется только proto3, потому что она проще, строже типизирована и лучше поддерживается в gRPC.
3.2. package
Задает логическое пространство имён, чтобы избежать конфликтов:
В Java и других языках это превращается в пакеты/модули.
3.3. option
Позволяет задавать настройки генерации кода, например:
Без этого весь код попадёт в один файл, что неудобно для больших схем.
3.4. message — описание структуры данных
message — это аналог класса в объектно-ориентированных языках.
Каждое поле внутри него — это свойство (переменная), которое сериализуется в бинарный поток.
Пример:
3.5. enum — перечисление значений
enum — это список допустимых констант.
Значение 0 обязательно — это значение по умолчанию.
При сериализации хранится не текстовое имя ("ACTIVE"), а его числовое значение (0), что делает protobuf компактным.
3.6. service — описание API
service определяет набор удалённых методов, которые сервер предоставляет клиенту.
Это аналог интерфейса в Java:
Каждый rpc определяет:
имя метода (BuyCar),
входной тип (CarRequest),
выходной тип (CarResponse).
4. Типы данных в Protocol Buffers
Protobuf поддерживает ограниченный, но универсальный набор типов.
Некоторые часто используемые:
string - Текст
bool - Логическое значение
int32, int64 - Целые числа
float, double - Числа с плавающей точкой
bytes - Массив байтов
repeated - Массив
map<key, value> - Словарь
Пример:
#Java #middle #gRPC #proto
Если gRPC — это двигатель взаимодействия сервисов, то Protocol Buffers (protobuf) — это его сердце.
Именно protobuf определяет, как описываются данные, как они сериализуются, и как из одной схемы генерируются типобезопасные классы для разных языков.
Чтобы по-настоящему понимать gRPC, нужно уверенно работать с .proto-файлами.
1. Что такое .proto файл
.proto — это файл описания структуры данных и интерфейсов (API).
Он играет сразу три роли:
Документирует контракт между клиентом и сервером (описывает, какие методы и какие данные доступны).
Генерирует код для разных языков с помощью protoc (компилятора Protocol Buffers).
Определяет схему сериализации — то, как объекты превращаются в байты и обратно.
Фактически .proto — это единый источник правды для вашего API.
2. Базовая структура .proto файла
Пример простого файла:
syntax = "proto3";
package car;
option java_multiple_files = true;
option java_package = "com.example.car";
option java_outer_classname = "CarProto";
// Определение сообщений
message Car {
string model = 1;
int32 year = 2;
CarStatus status = 3;
}
// Перечисление (enum)
enum CarStatus {
ACTIVE = 0;
INACTIVE = 1;
}
// Определение сервиса
service CarService {
rpc BuyCar (CarRequest) returns (CarResponse);
}
message CarRequest {
string model = 1;
}
message CarResponse {
string confirmation = 1;
}
3. Ключевые элементы .proto
3.1. syntax
Первая строка файла:
syntax = "proto3";
Обязательно указывает версию синтаксиса.
На практике используется только proto3, потому что она проще, строже типизирована и лучше поддерживается в gRPC.
3.2. package
Задает логическое пространство имён, чтобы избежать конфликтов:
package car;
В Java и других языках это превращается в пакеты/модули.
3.3. option
Позволяет задавать настройки генерации кода, например:
option java_package = "com.example.car";
option java_multiple_files = true;
option java_outer_classname = "CarProto";
Без этого весь код попадёт в один файл, что неудобно для больших схем.
3.4. message — описание структуры данных
message — это аналог класса в объектно-ориентированных языках.
Каждое поле внутри него — это свойство (переменная), которое сериализуется в бинарный поток.
Пример:
message User {
string name = 1;
int32 age = 2;
repeated string hobbies = 3;
}
string name = 1; — поле с типом string и номером 1.
int32 age = 2; — целочисленное поле.
repeated string hobbies = 3; — массив строк.
Важно: номер поля (= 1, = 2, = 3) — это не просто индекс. Это ключ в бинарной сериализации, который должен быть уникален и неизменен.3.5. enum — перечисление значений
enum — это список допустимых констант.
enum CarStatus {
ACTIVE = 0;
INACTIVE = 1;
SOLD = 2;
}Значение 0 обязательно — это значение по умолчанию.
При сериализации хранится не текстовое имя ("ACTIVE"), а его числовое значение (0), что делает protobuf компактным.
3.6. service — описание API
service определяет набор удалённых методов, которые сервер предоставляет клиенту.
Это аналог интерфейса в Java:
service CarService {
rpc BuyCar (CarRequest) returns (CarResponse);
rpc ListCars (Empty) returns (CarList);
}Каждый rpc определяет:
имя метода (BuyCar),
входной тип (CarRequest),
выходной тип (CarResponse).
4. Типы данных в Protocol Buffers
Protobuf поддерживает ограниченный, но универсальный набор типов.
Некоторые часто используемые:
string - Текст
bool - Логическое значение
int32, int64 - Целые числа
float, double - Числа с плавающей точкой
bytes - Массив байтов
repeated - Массив
map<key, value> - Словарь
Пример:
message Garage {
map<string, Car> cars = 1;
}#Java #middle #gRPC #proto
👍1
5. Нумерация полей — почему это критично
Каждое поле имеет свой уникальный номер — это его идентификатор в бинарном потоке.
Если поменять номера, клиент и сервер перестанут понимать друг друга.
Например, если у старой версии клиента year = 2, а у новой year = 3, при сериализации они будут читать разные данные.
6. Почему важно резервировать поля
Когда вы удаляете или переименовываете поле, нельзя просто убрать строку — нужно зарезервировать номер и имя.
Пример:
Это предотвращает случайное переиспользование старого номера под другое поле, что может привести к неправильной интерпретации данных.
7. Эволюция и миграция схем (Schema Evolution)
Protobuf специально спроектирован так, чтобы позволять обновлять схемы без поломки совместимости.
Главное — соблюдать несколько правил.
Что можно делать безопасно:
Добавлять новые поля с новыми номерами.
Удалять поля (с их резервированием).
Изменять имя поля (номер должен остаться прежним).
Изменять порядок полей — не влияет на сериализацию.
Что делать нельзя:
Менять тип поля (например, int32 → string).
Менять номер поля.
Удалять поле без reserved.
Пример миграции
Старая версия:
Новая версия:
Старый клиент, который не знает про email, просто проигнорирует это поле.
А новый клиент не столкнётся с конфликтом, потому что старый 2 зарезервирован.
8. Компиляция .proto файла и генерация кода
protoc — компилятор, который читает .proto и создаёт Java-классы.
Пример команды:
Результат:
Для каждого message создаются классы с Builder-паттерном.
Для service создаются классы CarServiceGrpc, CarServiceImplBase, CarServiceStub.
9. Пример полного цикла
Файл car.proto:
Сгенерированный код в Java (упрощённо):
Серверная реализация:
#Java #middle #gRPC #proto
Каждое поле имеет свой уникальный номер — это его идентификатор в бинарном потоке.
message Car {
string model = 1;
int32 year = 2;
}Если поменять номера, клиент и сервер перестанут понимать друг друга.
Например, если у старой версии клиента year = 2, а у новой year = 3, при сериализации они будут читать разные данные.
6. Почему важно резервировать поля
Когда вы удаляете или переименовываете поле, нельзя просто убрать строку — нужно зарезервировать номер и имя.
Пример:
message Car {
string model = 1;
reserved 2; // резервируем номер
reserved "status_old"; // резервируем имя
}Это предотвращает случайное переиспользование старого номера под другое поле, что может привести к неправильной интерпретации данных.
7. Эволюция и миграция схем (Schema Evolution)
Protobuf специально спроектирован так, чтобы позволять обновлять схемы без поломки совместимости.
Главное — соблюдать несколько правил.
Что можно делать безопасно:
Добавлять новые поля с новыми номерами.
Удалять поля (с их резервированием).
Изменять имя поля (номер должен остаться прежним).
Изменять порядок полей — не влияет на сериализацию.
Что делать нельзя:
Менять тип поля (например, int32 → string).
Менять номер поля.
Удалять поле без reserved.
Пример миграции
Старая версия:
message User {
string name = 1;
int32 age = 2;
}Новая версия:
message User {
string name = 1;
reserved 2;
string email = 3;
}Старый клиент, который не знает про email, просто проигнорирует это поле.
А новый клиент не столкнётся с конфликтом, потому что старый 2 зарезервирован.
8. Компиляция .proto файла и генерация кода
protoc — компилятор, который читает .proto и создаёт Java-классы.
Пример команды:
protoc \
--java_out=./build/generated \
--grpc-java_out=./build/generated \
proto/car.proto
Результат:
Для каждого message создаются классы с Builder-паттерном.
Для service создаются классы CarServiceGrpc, CarServiceImplBase, CarServiceStub.
9. Пример полного цикла
Файл car.proto:
syntax = "proto3";
service CarService {
rpc BuyCar (CarRequest) returns (CarResponse);
}
message CarRequest {
string model = 1;
int32 budget = 2;
}
message CarResponse {
string message = 1;
}
Сгенерированный код в Java (упрощённо):
// Отправитель (клиент)
CarRequest request = CarRequest.newBuilder()
.setModel("BMW")
.setBudget(20000)
.build();
CarResponse response = stub.buyCar(request);
System.out.println(response.getMessage());
Серверная реализация:
public class CarServiceImpl extends CarServiceGrpc.CarServiceImplBase {
@Override
public void buyCar(CarRequest request, StreamObserver<CarResponse> responseObserver) {
String msg = "Car purchased: " + request.getModel();
CarResponse response = CarResponse.newBuilder().setMessage(msg).build();
responseObserver.onNext(response);
responseObserver.onCompleted();
}
}#Java #middle #gRPC #proto
👍2
Что выведет код?
#Tasks
import java.util.Optional;
public class Task011125 {
public static void main(String[] args) {
Optional<String> opt1 = Optional.ofNullable(null);
Optional<String> opt2 = Optional.of("java");
String result1 = opt1.or(()-> opt2).orElse("default");
String result2 = opt2.filter(s -> s.length() > 10)
.or(()-> Optional.of("fallback"))
.get();
System.out.println(result1);
System.out.println(result2);
}
}
#Tasks
Варианты ответа:
Anonymous Quiz
40%
java fallback
20%
default java
20%
default fallback
20%
java java
Вопрос с собеседований
Что такое ForkJoinPool?🤓
Ответ:
ForkJoinPool — это пул потоков, оптимизированный для рекурсивных задач, разделяющихся на подзадачи (fork) и объединяющихся (join).
Используется в parallelStream().
Каждый поток имеет собственную очередь задач, что уменьшает блокировки.
#собеседование
Что такое ForkJoinPool?
Ответ:
Используется в parallelStream().
Каждый поток имеет собственную очередь задач, что уменьшает блокировки.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
История IT-технологий сегодня — 02 ноября
ℹ️ Кто родился в этот день
Леони́д Анато́льевич Ле́вин (род. 2 ноября 1948, Днепропетровск) — советско-американский математик и теоретик информатики, независимо от Стивена Кука сформулировал одну из основ теории NP-полноты и внёс ключевой вклад в теорию вычислительной сложности.
Серге́й Алексе́евич Ле́бедев (20 октября [2 ноября] 1902, Нижний Новгород, Российская империя — 3 июля 1974, Москва, СССР) — советский конструктор вычислительной техники, руководитель разработки первых отечественных ЭВМ (МЭСМ и др.), один из основателей советской компьютерной школы.
🌐 Знаковые события
1988 — «Червь», запущенный студентом Робертом Моррисом, впервые обнаружен в Массачусетском технологическом институте. Вирус поразил компьютерную сеть ARPANET, выводя узлы сети из строя. Студент попал под суд, был оштрафован и 26 июля 1989 условно осуждён.
#Biography #Birth_Date #Events #2Ноября
Леони́д Анато́льевич Ле́вин (род. 2 ноября 1948, Днепропетровск) — советско-американский математик и теоретик информатики, независимо от Стивена Кука сформулировал одну из основ теории NP-полноты и внёс ключевой вклад в теорию вычислительной сложности.
Серге́й Алексе́евич Ле́бедев (20 октября [2 ноября] 1902, Нижний Новгород, Российская империя — 3 июля 1974, Москва, СССР) — советский конструктор вычислительной техники, руководитель разработки первых отечественных ЭВМ (МЭСМ и др.), один из основателей советской компьютерной школы.
1988 — «Червь», запущенный студентом Робертом Моррисом, впервые обнаружен в Массачусетском технологическом институте. Вирус поразил компьютерную сеть ARPANET, выводя узлы сети из строя. Студент попал под суд, был оштрафован и 26 июля 1989 условно осуждён.
#Biography #Birth_Date #Events #2Ноября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
С 25.10 по 31.10
Предыдущий пост(с 18.10 по 24.10)
Воскресный мотивационный пост:
Измерим твою цену в рублях?
Запись встреч/видео:
Не проводилась
Обучающие статьи:
Java:
Коллекции в Java
Глава 4. Queue и Deque
Практика: проект «Библиотека»
Глава 5. Map — отображения (словари)
Реализации: HashMap, LinkedHashMap, TreeMap и остальные
gRPC
Что такое gRPC и зачем он нужен
Архитектура gRPC: как всё работает под капотом
Полезные статьи и видео:
Поддержка HTTP/3 в Java: что нового в JDK 26 и как это использовать
Транзакции в Spring: сила управления данными
Как и всегда, задачи можно найти под тегом - #Tasks, вопросы с собеседований - #собеседование
Предыдущий пост(с 18.10 по 24.10)
Воскресный мотивационный пост:
Измерим твою цену в рублях?
Запись встреч/видео:
Не проводилась
Обучающие статьи:
Java:
Коллекции в Java
Глава 4. Queue и Deque
Практика: проект «Библиотека»
Глава 5. Map — отображения (словари)
Реализации: HashMap, LinkedHashMap, TreeMap и остальные
gRPC
Что такое gRPC и зачем он нужен
Архитектура gRPC: как всё работает под капотом
Полезные статьи и видео:
Поддержка HTTP/3 в Java: что нового в JDK 26 и как это использовать
Транзакции в Spring: сила управления данными
Как и всегда, задачи можно найти под тегом - #Tasks, вопросы с собеседований - #собеседование
👍1
История IT-технологий сегодня — 03 ноября
ℹ️ Кто родился в этот день
Гейб Ло́ган Нью́элл (англ. Gabe Logan Newell; род. 3 ноября 1962, Колорадо, США), также известен под ником Ге́йбен (в русском произношении Габе́н, англ. Gaben) — американский программист и предприниматель, сооснователь Valve; ключевая фигура в развитии игровой индустрии и платформы цифровой дистрибуции Steam.
Вольфганг Хайдрих (родился 3 ноября 1968 года) — немецко-канадский исследователь в области визуальных вычислений и компьютерной графики, профессор и руководитель центров визуальных вычислений (важные работы по рендерингу и HDR).
Филлип Уолтер Кац (англ. Phillip Walter Katz, 3 ноября 1962 года — 14 апреля 2000 года) — автор формата ZIP/утилиты PKZIP, оказавший значительное влияние на распространение сжатия данных и обмен файлами в 1990-е.
🌐 Знаковые события
1957 — в СССР запущен КА «Спутник-2» с собакой Лайкой на борту. Собака погибла через 7 часов после старта от перегрева.
#Biography #Birth_Date #Events #3Ноября
Гейб Ло́ган Нью́элл (англ. Gabe Logan Newell; род. 3 ноября 1962, Колорадо, США), также известен под ником Ге́йбен (в русском произношении Габе́н, англ. Gaben) — американский программист и предприниматель, сооснователь Valve; ключевая фигура в развитии игровой индустрии и платформы цифровой дистрибуции Steam.
Вольфганг Хайдрих (родился 3 ноября 1968 года) — немецко-канадский исследователь в области визуальных вычислений и компьютерной графики, профессор и руководитель центров визуальных вычислений (важные работы по рендерингу и HDR).
Филлип Уолтер Кац (англ. Phillip Walter Katz, 3 ноября 1962 года — 14 апреля 2000 года) — автор формата ZIP/утилиты PKZIP, оказавший значительное влияние на распространение сжатия данных и обмен файлами в 1990-е.
1957 — в СССР запущен КА «Спутник-2» с собакой Лайкой на борту. Собака погибла через 7 часов после старта от перегрева.
#Biography #Birth_Date #Events #3Ноября
Please open Telegram to view this post
VIEW IN TELEGRAM