Если хочешь развиваться в бэкенд-разработке — выстроить сильную базу, углубиться в архитектуру или перейти в роль тимлида — в Центральном университете есть магистратура под каждый сценарий. И на нее можно получить грант до 75%. Места ограничены, дедлайн подачи заявок — 20 августа.
«Бэкенд-разработка» — это офлайн-направление (пары по вечерам и в выходные в центре Москвы) с тремя треками на выбор:
⚫️ Технический — для студентов старших курсов и разработчиков в начале карьеры. Языки программирования, DevOps-инструменты, базы данных, архитектура ПО и распределенные системы. Программа ежегодно обновляется под реальные запросы компаний, а преподают разработчики, тимлиды и CTO из ведущих IT-компаний. К выпуску — сильное портфолио бэкенд-проектов
⚫️ Совместный с MAGNIT TECH — обучение на реальных кейсах и архитектуре распределенных систем федерального масштаба, буткемп с экспертами компании и возможность выйти на оплачиваемую стажировку в техническую команду в течение первого года
⚫️ Тимлидский — для опытных разработчиков, которые хотят перейти к роли руководителя команды: выстраивать процессы разработки, принимать архитектурные решения и развивать команду
Магистратура в Центральном университете — это 2 года обучения, которое можно совмещать с работой, и диплом государственного образца. Карьерная поддержка начинается еще во время учебы: консультации, тренировочные собеседования и помощь с трудоустройством. Студенты уже в процессе обучения выходят на новые позиции или повышаются в грейде в Яндексе, Авито, Т-Банке и других компаниях.
Поступление проходит через грантовый конкурс — это одновременно способ попасть на программу и возможность выиграть финансовую поддержку на все время обучения: грант покрывает до 75% стоимости. В 2026 году доступно 550 грантов на все программы магистратуры.
Подробнее о программе и условиях участия в конкурсе — по ссылке
«Бэкенд-разработка» — это офлайн-направление (пары по вечерам и в выходные в центре Москвы) с тремя треками на выбор:
Магистратура в Центральном университете — это 2 года обучения, которое можно совмещать с работой, и диплом государственного образца. Карьерная поддержка начинается еще во время учебы: консультации, тренировочные собеседования и помощь с трудоустройством. Студенты уже в процессе обучения выходят на новые позиции или повышаются в грейде в Яндексе, Авито, Т-Банке и других компаниях.
Поступление проходит через грантовый конкурс — это одновременно способ попасть на программу и возможность выиграть финансовую поддержку на все время обучения: грант покрывает до 75% стоимости. В 2026 году доступно 550 грантов на все программы магистратуры.
Подробнее о программе и условиях участия в конкурсе — по ссылке
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Кто-то разобрал Claude Code почти до винтика
Автор собрал разбор Claude Code по публичным источникам: цикл агента, систему инструментов, разрешения, работу с контекстом, сессии, подпроцессы, MCP, удалённые настройки, телеметрию и скрытые флаги.
Получился не “гайд по использованию”, а карта внутренней логики CLI-агента: как он принимает решение, когда просит разрешение, как вызывает инструменты, как хранит историю и как расширяется через внешние интеграции.
https://github.com/justxor/Claudecourse/
learn-coding-agent - репозиторий для тех, кто хочет понять, как устроены современные coding agents не на уровне промо-страниц, а на уровне архитектуры.Автор собрал разбор Claude Code по публичным источникам: цикл агента, систему инструментов, разрешения, работу с контекстом, сессии, подпроцессы, MCP, удалённые настройки, телеметрию и скрытые флаги.
Получился не “гайд по использованию”, а карта внутренней логики CLI-агента: как он принимает решение, когда просит разрешение, как вызывает инструменты, как хранит историю и как расширяется через внешние интеграции.
https://github.com/justxor/Claudecourse/
❤6🔥3👍1
🔥 Хочешь быстрее расти в IT? Хватит учиться в одиночку
В IT прокачивается тот, кто каждый день видит сильные идеи, новые инструменты, реальные задачи, вакансии и разборы.
Окружение решает больше, чем кажется.
Собрал папки и каналы, где можно быстрее влиться в нужное направление, следить за трендами и не вариться в своём пузыре.
AI: t.me/ai_machinelearning_big_data
Python: t.me/pythonl
Linux: t.me/linuxacademiya
Хакинг: t.me/linuxkalii
DevOps: t.me/DevOPSitsec
Docker: t.me/DevopsDocker
Golang: t.me/Golang_google
Rust: t.me/rust_code
C++: t.me/cpluspluc
C#: t.me/csharp_1001_notes
Java: t.me/java_library
JavaScript: t.me/javascriptv
React: t.me/react_tg
Frontend: t.me/front
PHP: t.me/phpshka
Android: t.me/android_its
Мобильная разработка: t.me/mobdevelop
Базы данных: t.me/sqlhub
Data Science: t.me/data_analysis_ml
Big Data: t.me/bigdatai
Математика: t.me/data_math
Физика: t.me/fizmat
Kubernetes: t.me/kubernetc
GameDev: https://t.me/gamedev
Haskell: t.me/haskell_tg
Собеседования и карьера:
DS собеседования: t.me/machinelearning_interview
Python собеседования: t.me/python_job_interview
Папка с вакансиями: t.me/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.me/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.me/addlist/eEPya-HF6mkxMGIy
Папка ML: https://t.me/addlist/2Ls-snqEeytkMDgy
Папка Frontend: https://t.me/addlist/mzMMG3RPZhY2M2Iy
Полезное сверху:
ИТ-мемы: t.me/memes_prog
Английский для программистов: t.me/english_forprogrammers
ИИ и технологии: t.me/vistehno
954 ГБ open-source курсов: @courses
ИТ-книги бесплатно: https://t.me/addlist/BkskQciUW_FhNjEy
Max Ai: https://max.ru/ai_machinelearning_big_data
Max python: https://max.ru/pythonl
ТЕХНО: https://max.ru/vistehno
Max Go: https://max.ru/Golang_google
Max Linux: https://max.ru/linuxkalii
Devops: https://max.ru/DevOPSitsec
C#: https://max.ru/csharp_ci
C++: https://max.ru/cpluspluc
SQL: https://max.ru/sqlhub
Java: https://max.ru/javatg
Подписывайся на нужные направления и собирай себе ленту, которая реально двигает вперёд.
Пока кто-то листает шум, ты будешь видеть инструменты, задачи и идеи, которые помогают расти в профессии.
В IT прокачивается тот, кто каждый день видит сильные идеи, новые инструменты, реальные задачи, вакансии и разборы.
Окружение решает больше, чем кажется.
Собрал папки и каналы, где можно быстрее влиться в нужное направление, следить за трендами и не вариться в своём пузыре.
AI: t.me/ai_machinelearning_big_data
Python: t.me/pythonl
Linux: t.me/linuxacademiya
Хакинг: t.me/linuxkalii
DevOps: t.me/DevOPSitsec
Docker: t.me/DevopsDocker
Golang: t.me/Golang_google
Rust: t.me/rust_code
C++: t.me/cpluspluc
C#: t.me/csharp_1001_notes
Java: t.me/java_library
JavaScript: t.me/javascriptv
React: t.me/react_tg
Frontend: t.me/front
PHP: t.me/phpshka
Android: t.me/android_its
Мобильная разработка: t.me/mobdevelop
Базы данных: t.me/sqlhub
Data Science: t.me/data_analysis_ml
Big Data: t.me/bigdatai
Математика: t.me/data_math
Физика: t.me/fizmat
Kubernetes: t.me/kubernetc
GameDev: https://t.me/gamedev
Haskell: t.me/haskell_tg
Собеседования и карьера:
DS собеседования: t.me/machinelearning_interview
Python собеседования: t.me/python_job_interview
Папка с вакансиями: t.me/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.me/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.me/addlist/eEPya-HF6mkxMGIy
Папка ML: https://t.me/addlist/2Ls-snqEeytkMDgy
Папка Frontend: https://t.me/addlist/mzMMG3RPZhY2M2Iy
Полезное сверху:
ИТ-мемы: t.me/memes_prog
Английский для программистов: t.me/english_forprogrammers
ИИ и технологии: t.me/vistehno
954 ГБ open-source курсов: @courses
ИТ-книги бесплатно: https://t.me/addlist/BkskQciUW_FhNjEy
Max Ai: https://max.ru/ai_machinelearning_big_data
Max python: https://max.ru/pythonl
ТЕХНО: https://max.ru/vistehno
Max Go: https://max.ru/Golang_google
Max Linux: https://max.ru/linuxkalii
Devops: https://max.ru/DevOPSitsec
C#: https://max.ru/csharp_ci
C++: https://max.ru/cpluspluc
SQL: https://max.ru/sqlhub
Java: https://max.ru/javatg
Подписывайся на нужные направления и собирай себе ленту, которая реально двигает вперёд.
Пока кто-то листает шум, ты будешь видеть инструменты, задачи и идеи, которые помогают расти в профессии.
❤2👍1🔥1
❓Что из вариантов лучше всего описывается определением: Операция, которая содержит серию задач, которые должны быть выполнены либо все, либо не выполнена ни одн
#spring
#spring
❤1
❓Что из вариантов лучше всего описывается определением: Операция, которая содержит серию задач, которые должны быть выполнены либо все, либо не выполнена ни одна.
Anonymous Quiz
6%
Query
89%
Transaction
3%
Prepared statement
1%
Callback
👍1
Rust, который наконец становится понятным 🦀
Давно хочешь выучить Rust, но ownership, borrowing и lifetimes выглядят как отдельный вид боли?
Этот курс проведёт тебя с самого начала до уровня, где ты уже пишешь реальные системные и сетевые программы.
Ты разберёшь:
Ownership → Borrowing → ошибки → коллекции → Generics → Traits → модули → тесты → сетевой код
Никакого бесконечного чтения документации. После каждого урока ты сразу пишешь код, проходишь тесты и решаешь задачу с автопроверкой.
🔥 Rust с нуля
🔥 5–6 часов в неделю
🔥 Практика после каждого урока
🔥 Подойдёт после Python, JavaScript, Java и других языков
🔥 Можно начать сразу
В конце у тебя будет понимание Rust, с которым уже можно писать быстрые backend-сервисы, сетевые приложения и системные утилиты, а не смотреть на borrow checker как на врага.
Пора добавить Rust в свой стек. Начинай курс и пиши первый код уже сегодня: https://stepik.org/a/294885/
Давно хочешь выучить Rust, но ownership, borrowing и lifetimes выглядят как отдельный вид боли?
Этот курс проведёт тебя с самого начала до уровня, где ты уже пишешь реальные системные и сетевые программы.
Ты разберёшь:
Ownership → Borrowing → ошибки → коллекции → Generics → Traits → модули → тесты → сетевой код
Никакого бесконечного чтения документации. После каждого урока ты сразу пишешь код, проходишь тесты и решаешь задачу с автопроверкой.
🔥 Rust с нуля
🔥 5–6 часов в неделю
🔥 Практика после каждого урока
🔥 Подойдёт после Python, JavaScript, Java и других языков
🔥 Можно начать сразу
В конце у тебя будет понимание Rust, с которым уже можно писать быстрые backend-сервисы, сетевые приложения и системные утилиты, а не смотреть на borrow checker как на врага.
Пора добавить Rust в свой стек. Начинай курс и пиши первый код уже сегодня: https://stepik.org/a/294885/
❤3👍1
Java-совет: два разных пути могут вести к одному файлу
Сравнение через
Чтобы проверить, указывают ли они на один и тот же реальный файл, используйте:
Метод учитывает:
- относительные и абсолютные пути;
- символические ссылки;
- особенности файловой системы;
- разные способы записи одного расположения.
Пример:
Важно: метод обращается к файловой системе и может выбросить
Сравнение через
Path.equals() проверяет только сами пути. Поэтому эти значения считаются разными:
Path path1 = Path.of("data/report.txt");
Path path2 = Path.of("data/../data/report.txt");
Чтобы проверить, указывают ли они на один и тот же реальный файл, используйте:
boolean same = Files.isSameFile(path1, path2);
Метод учитывает:
- относительные и абсолютные пути;
- символические ссылки;
- особенности файловой системы;
- разные способы записи одного расположения.
Пример:
Path original = Path.of("/app/config.json");
Path symlink = Path.of("/app/current-config");
if (Files.isSameFile(original, symlink)) {
System.out.println("Это один файл");
}
Важно: метод обращается к файловой системе и может выбросить
IOException.Files.isSameFile() полезен перед копированием, перемещением или удалением файлов — особенно когда в проекте используются символические ссылки и нестандартные пути.👍7❤3
💡 Редкий совет Java: используйте `ClassValue` для кэша, привязанного к классу
Обычно метаданные кэшируют так:
Map<Class<?>, Metadata> cache = new ConcurrentHashMap<>();
Но такой кэш способен удерживать классы и их
Для подобных случаев в Java есть
private static final ClassValue<Metadata> CACHE =
new ClassValue<>() {
@Override
protected Metadata computeValue(Class<?> type) {
return inspect(type);
}
};
Metadata metadata = CACHE.get(User.class);
Значение вычисляется отдельно для каждого класса и может быть очищено после его выгрузки.
Редкий инструмент JVM, который часто безопаснее, чем
#Java #JVM #Backend #Performance
Обычно метаданные кэшируют так:
Map<Class<?>, Metadata> cache = new ConcurrentHashMap<>();
Но такой кэш способен удерживать классы и их
ClassLoader, создавая утечки памяти в плагинах, серверах приложений и системах с динамической загрузкой.Для подобных случаев в Java есть
ClassValue:private static final ClassValue<Metadata> CACHE =
new ClassValue<>() {
@Override
protected Metadata computeValue(Class<?> type) {
return inspect(type);
}
};
Metadata metadata = CACHE.get(User.class);
Значение вычисляется отдельно для каждого класса и может быть очищено после его выгрузки.
ClassValue особенно полезен для reflection-кэшей, сериализаторов, ORM, прокси и плагинных архитектур.Редкий инструмент JVM, который часто безопаснее, чем
ConcurrentHashMap<Class<?>, ...>.#Java #JVM #Backend #Performance
👍4🔥2🥰1
Курс «Java: с нуля до сетевого гуру» построен так, чтобы ты как можно быстрее перешёл от теории к рабочему коду.
Сначала разберёшь основы языка, ООП, коллекции и исключения. Затем перейдёшь к тому, ради чего многие и выбирают Java:
- многопоточность;
- TCP/IP и сокеты;
- клиент-серверные приложения;
- обработка нескольких подключений;
- собственные сетевые проекты.
Каждая новая тема закрепляется практикой. Ты будешь запускать серверы, подключать клиентов, передавать данные и постепенно собирать проекты, которые уже можно показывать в портфолио.
Курс подходит новичкам. Никакой подготовки не требуется: обучение начинается с базы и шаг за шагом выводит к задачам реальной backend-разработки.
В результате ты получишь крепкую основу Java, поймёшь, как работают сетевые приложения, и перестанешь смотреть на серверный код как на магию.
Начни сейчас - и преврати Java из «когда-нибудь выучу» в навык, которым уже можно пользоваться.
Курс доступен на Stepik: https://stepik.org/a/295392/
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
💡 Java cj:
Эти два варианта выглядят похоже, но работают по-разному:
Используйте:
-
-
Так внешний код не сможет изменить внутреннюю коллекцию, а последующие изменения
#Java #JavaTips #Backend
unmodifiableList() не делает настоящую копиюЭти два варианта выглядят похоже, но работают по-разному:
List<String> source = new ArrayList<>();
source.add("Java");
List<String> view = Collections.unmodifiableList(source);
List<String> copy = List.copyOf(source);
source.add("Spring");
System.out.println(view); // [Java, Spring]
System.out.println(copy); // [Java]
Collections.unmodifiableList() создаёт только неизменяемое представление исходного списка. Если source изменится, изменения появятся и в view.List.copyOf() создаёт отдельный неизменяемый снимок данных.Используйте:
-
unmodifiableList() — когда нужен read-only view актуального списка;-
List.copyOf() — когда нужно зафиксировать состояние и безопасно вернуть его наружу.
public List<String> getUsers() {
return List.copyOf(users);
}
Так внешний код не сможет изменить внутреннюю коллекцию, а последующие изменения
users не повлияют на уже возвращённый результат.List.copyOf() доступен начиная с Java 10.#Java #JavaTips #Backend
👍3👏1
Собираем бэкенд-комьюнити на JVM Day
Бэкендеры, 29 августа в Москве пройдет хардкорная конференция. Ждут своих: Java-, Scala- и Kotlin-разработчиков, архитекторов и тимлидов.
Здесь выступят и расскажут:
— Андрей Кулешов — что нового в мире JVM за год.
— Сергей Петрелевич — разработка по Mechanical Sympathy.
— Александр Ланцов — Java после Loom: другие модели concurrency.
— Антон Курако — как бенчмарки вводят в заблуждение.
А вечером во дворе T-Space — посиделки, интерактивы и открытый микрофон с историями ошибок.
Мест мало, а цена билета будет расти.
Успевай зарегистрироваться
Бэкендеры, 29 августа в Москве пройдет хардкорная конференция. Ждут своих: Java-, Scala- и Kotlin-разработчиков, архитекторов и тимлидов.
Здесь выступят и расскажут:
— Андрей Кулешов — что нового в мире JVM за год.
— Сергей Петрелевич — разработка по Mechanical Sympathy.
— Александр Ланцов — Java после Loom: другие модели concurrency.
— Антон Курако — как бенчмарки вводят в заблуждение.
А вечером во дворе T-Space — посиделки, интерактивы и открытый микрофон с историями ошибок.
Мест мало, а цена билета будет расти.
Успевай зарегистрироваться
❤4
💡 Java совет: два пути могут указывать на один и тот же файл
Хотя оба пути могут вести к одному файлу.
Для проверки используйте:
- относительные пути;
- символические ссылки;
- реальное расположение файла.
Полезно при поиске дубликатов, проверке пользовательских путей и защите от повторной обработки одного файла.
Учтите: метод может обращаться к диску и выбрасывать
Доступно начиная с Java 7.
#Java #JavaTips #Files
Path.equals() сравнивает только представление пути:
Path a = Path.of("data.txt");
Path b = Path.of("./data.txt");
System.out.println(a.equals(b)); // false
Хотя оба пути могут вести к одному файлу.
Для проверки используйте:
boolean same = Files.isSameFile(a, b);
Files.isSameFile() обращается к файловой системе и учитывает:- относительные пути;
- символические ссылки;
- реальное расположение файла.
Path file = Path.of("data.txt");
Path link = Path.of("data-link.txt");
Files.isSameFile(file, link); // true, если link ведёт к data.txt
Полезно при поиске дубликатов, проверке пользовательских путей и защите от повторной обработки одного файла.
Учтите: метод может обращаться к диску и выбрасывать
IOException, поэтому это не просто строковое сравнение.Доступно начиная с Java 7.
#Java #JavaTips #Files
❤3👍2
Лето, ИТ-Пикник и музыка известных артистов уже через несколько дней!
8 августа в Коломенском пройдет ИТ-Пикник.
В программе — выступления проекта LAB Антона Беляева, IOWA, Cream Soda, Pompeya, мартина и Совы.
А днем — научпоп-лекции, дискуссии об ИИ и больших языковых моделях, мастер-классы и интерактивы. Полезные знакомства и развлечения тоже будут.
Зарегистрироваться и узнать подробности можно на сайте мероприятия.
В билет входит +1 — можно позвать близких и друзей.
До встречи в месте притяжения ИТ.
8 августа в Коломенском пройдет ИТ-Пикник.
В программе — выступления проекта LAB Антона Беляева, IOWA, Cream Soda, Pompeya, мартина и Совы.
А днем — научпоп-лекции, дискуссии об ИИ и больших языковых моделях, мастер-классы и интерактивы. Полезные знакомства и развлечения тоже будут.
Зарегистрироваться и узнать подробности можно на сайте мероприятия.
В билет входит +1 — можно позвать близких и друзей.
До встречи в месте притяжения ИТ.
👍5❤1
☕️ Java-совет: не запускайте блокирующий I/O через `CompletableFuture` без собственного пула
Такой код выглядит асинхронным:
Но без явного
Если
Лучше выделить отдельный пул для блокирующего I/O:
И не забыть корректно его закрыть:
Для цепочки тоже важно явно выбирать executor:
Почему это полезно:
- медленный внешний сервис не блокирует общий пул;
- нагрузку можно ограничить размером executor;
- проще наблюдать очередь и время выполнения;
- разные типы задач не мешают друг другу.
Асинхронность без контроля executor - это просто блокировка в менее заметном месте.
Такой код выглядит асинхронным:
CompletableFuture<User> future =
CompletableFuture.supplyAsync(() -> userClient.loadUser(id));
Но без явного
Executor задача обычно попадёт в общий ForkJoinPool.commonPool().Если
loadUser() ждёт HTTP, базу данных или файловую систему, поток блокируется. Несколько медленных вызовов могут занять весь общий пул и затормозить совершенно несвязанные операции приложения.Лучше выделить отдельный пул для блокирующего I/O:
private static final ExecutorService IO_POOL =
Executors.newFixedThreadPool(32);
CompletableFuture<User> future =
CompletableFuture.supplyAsync(
() -> userClient.loadUser(id),
IO_POOL
);
И не забыть корректно его закрыть:
IO_POOL.shutdown();
Для цепочки тоже важно явно выбирать executor:
future.thenApplyAsync(
user -> enrichUser(user),
IO_POOL
);
Почему это полезно:
- медленный внешний сервис не блокирует общий пул;
- нагрузку можно ограничить размером executor;
- проще наблюдать очередь и время выполнения;
- разные типы задач не мешают друг другу.
CompletableFuture не делает блокирующий код неблокирующим. Он лишь переносит ожидание в другой поток.Асинхронность без контроля executor - это просто блокировка в менее заметном месте.
❤5👍4🔥2
💻 Как прокачать фронтенд, бэкенд и зайти в разработку ИИ-систем
Современный веб-интерфейс на React, сложные архитектуры, асинхронность или сборка RAG-пайплайнов — все эти вещи требуют плотной практики. Если планируете расти в грейде, освоить новую профессию или менять стек, скоро завершается прием документов на двухлетнюю онлайн-магистратуру ИТМО в партнерстве с Яндекс Практикумом «Фронтенд-, бэкенд‑разработка и ИИ‑решения».
Учеба идет по вечерам, так что бросать текущую работу не придется. При этом сохраняются все бонусы очников, включая студенческие льготы.
Что ждет студентов:
— Разделение по уровням. Сетка из 9 треков на выбор: от старта с нуля на Java, Python, C++ или JS до хардовых программ для продвинутых. Там уже будут разбирать Spring Boot, Kafka, Cloud Native, C++ под Boost, NestJS и асинхронный бэкенд.
— Отдельное направление «ИИ-решения в разработке». Оно заточено под проектирование LLM-систем, сборку RAG-пайплайнов и работу с мультиагентными сетями.
— Практика, которой очень много. Сможете пополнить портфолио 10+ проектами, а еще будете решать реальные задачи от партнеров программы и команд Яндекса.
— Применение AI с пользой. Научат отдавать нейросетям рутину: от дебага и рефакторинга до генерации тестов и документации.
Выпускники получают диплом магистра ИТМО и официальный диплом о профпереподготовке от Яндекса. Отбор проходит по вступительным испытаниям или по рекомендательному письму для выпускников Практикума.
Узнать подробности.
Современный веб-интерфейс на React, сложные архитектуры, асинхронность или сборка RAG-пайплайнов — все эти вещи требуют плотной практики. Если планируете расти в грейде, освоить новую профессию или менять стек, скоро завершается прием документов на двухлетнюю онлайн-магистратуру ИТМО в партнерстве с Яндекс Практикумом «Фронтенд-, бэкенд‑разработка и ИИ‑решения».
Учеба идет по вечерам, так что бросать текущую работу не придется. При этом сохраняются все бонусы очников, включая студенческие льготы.
Что ждет студентов:
— Разделение по уровням. Сетка из 9 треков на выбор: от старта с нуля на Java, Python, C++ или JS до хардовых программ для продвинутых. Там уже будут разбирать Spring Boot, Kafka, Cloud Native, C++ под Boost, NestJS и асинхронный бэкенд.
— Отдельное направление «ИИ-решения в разработке». Оно заточено под проектирование LLM-систем, сборку RAG-пайплайнов и работу с мультиагентными сетями.
— Практика, которой очень много. Сможете пополнить портфолио 10+ проектами, а еще будете решать реальные задачи от партнеров программы и команд Яндекса.
— Применение AI с пользой. Научат отдавать нейросетям рутину: от дебага и рефакторинга до генерации тестов и документации.
Выпускники получают диплом магистра ИТМО и официальный диплом о профпереподготовке от Яндекса. Отбор проходит по вступительным испытаниям или по рекомендательному письму для выпускников Практикума.
Узнать подробности.
❤2
⚡️ Java-приём: не храни метаданные классов в `static Map<Class<?>, ...>` — используй `ClassValue`.
Допустим, библиотека кеширует информацию о каждом классе:
На первый взгляд всё нормально.
Но в приложениях с динамической загрузкой классов — plugins, application servers, hot reload — такой кеш может удерживать
И получить неприятную утечку памяти.
В Java для этого есть малоизвестный
Использование:
Что даёт
- ленивое вычисление значения для каждого класса;
- thread-safe доступ;
- не нужен собственный
- кеш лучше согласован с жизненным циклом загруженных классов.
Особенно полезно для reflection, serializers, ORM, DI-контейнеров и framework-кода, где постоянно кешируются данные по
🔥 Если видишь в библиотеке:
стоит хотя бы задать вопрос:
а почему здесь не `ClassValue`?
#Java #JVM #Backend #Programming
Допустим, библиотека кеширует информацию о каждом классе:
private static final Map<Class<?>, Metadata> CACHE =
new ConcurrentHashMap<>();
На первый взгляд всё нормально.
Но в приложениях с динамической загрузкой классов — plugins, application servers, hot reload — такой кеш может удерживать
Class, а вместе с ним и его ClassLoader.И получить неприятную утечку памяти.
В Java для этого есть малоизвестный
ClassValue<T>:
private static final ClassValue<Metadata> CACHE =
new ClassValue<>() {
@Override
protected Metadata computeValue(Class<?> type) {
return buildMetadata(type);
}
};
Использование:
Metadata metadata = CACHE.get(MyClass.class);
Что даёт
ClassValue:- ленивое вычисление значения для каждого класса;
- thread-safe доступ;
- не нужен собственный
ConcurrentHashMap;- кеш лучше согласован с жизненным циклом загруженных классов.
Особенно полезно для reflection, serializers, ORM, DI-контейнеров и framework-кода, где постоянно кешируются данные по
Class<?>.🔥 Если видишь в библиотеке:
static ConcurrentHashMap<Class<?>, ...>
стоит хотя бы задать вопрос:
а почему здесь не `ClassValue`?
#Java #JVM #Backend #Programming
❤2👍1