Это не просто подборка, а реально огромные библиотеки
от художки до научных статей, диссертаций и учебников.
И главное
базы постоянно обновляются
• planetebook.com
• oceanofpdf.com
• freecomputerbooks.com
• zlibrary.to
• bookboon.com
• gutenberg.org
• manybooks.net
• pdfdrive.com
• digilibraries.com
• openlibrary.org
• standardebooks.org
• librivox.org
• getfreeebooks.com
• authorama.com
Если читаешь и прокачиваешься
сохрани, пригодится
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍3
Spring Boot может уронить API из-за одного лишнего поля в JSON
Классика: приходит запрос с дополнительным полем, которого нет в DTO и ты ловишь UnrecognizedPropertyException. Клиент добавил поле, ты не обновил модель - всё падает.
Решение в одну строку:
Теперь Jackson просто игнорирует лишние поля вместо того, чтобы ломать приложение.
Полезно, когда API живёт долго, клиенты обновляются быстрее бэка, а ломать совместимость нельзя.
Классика: приходит запрос с дополнительным полем, которого нет в DTO и ты ловишь UnrecognizedPropertyException. Клиент добавил поле, ты не обновил модель - всё падает.
Решение в одну строку:
@JsonIgnoreProperties(ignoreUnknown = true)
public class UserDTO {
private String name;
private int age;
}
Теперь Jackson просто игнорирует лишние поля вместо того, чтобы ломать приложение.
Полезно, когда API живёт долго, клиенты обновляются быстрее бэка, а ломать совместимость нельзя.
❤6👍6🔥1😁1
⚡️ Перестаём писать методы с 7+ параметрами
Если сигнатура выглядит как:
Это уже сигнал, что модель данных развалилась.
Проблема не только в читаемости.
Такие методы сложнее поддерживать, расширять и тестировать. Любое изменение ломает сигнатуру и тянет за собой каскад правок.
Нормальный вариант - собрать связанные данные в объект:
Получаем:
- чище API
- проще добавлять поля
- меньше ошибок при передаче параметров
- код начинает отражать доменную модель, а не список строк
Это базовый приём, но именно на нём чаще всего экономят, а потом платят сложностью.
Если сигнатура выглядит как:
createUser(firstName, lastName, email, phone, address, city, country)
Это уже сигнал, что модель данных развалилась.
Проблема не только в читаемости.
Такие методы сложнее поддерживать, расширять и тестировать. Любое изменение ломает сигнатуру и тянет за собой каскад правок.
Нормальный вариант - собрать связанные данные в объект:
UserInfo userInfoПолучаем:
- чище API
- проще добавлять поля
- меньше ошибок при передаче параметров
- код начинает отражать доменную модель, а не список строк
Это базовый приём, но именно на нём чаще всего экономят, а потом платят сложностью.
❤11👎3👍2✍1🔥1
Если frontend и backend живут на разных доменах или портах, браузер начнет резать запросы по CORS. Это не баг Spring Boot и не проблема React. Это нормальный механизм безопасности браузера.
Правильный способ - настроить CORS на стороне backend.
В Spring Boot это можно сделать глобально через
WebMvcConfigurer: указать маршруты, разрешенные origins, HTTP-методы, заголовки и работу с credentials.Главное - не ставить бездумно
* везде подряд, особенно если используете cookies, токены или allowCredentials(true). В проде лучше явно перечислять доверенные домены, например frontend-домен приложения.Такой подход дает централизованный контроль: вы один раз задаете политику CORS и не размазываете настройки по каждому контроллеру.
Для Java backend-разработчика это базовая, но важная вещь: CORS должен быть частью архитектуры API, а не случайной правкой перед деплоем.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍5🔥1
Небольшой, но полезный совет для Spring Boot.
Если у вас есть scheduled task, не стоит хардкодить интервал прямо в аннотации:
Лучше вынести значение в конфиг:
А в
Почему так лучше:
• интервал можно менять без правки кода;
• настройки проще различать для dev, staging и production;
• меньше магических чисел в бизнес-логике;
• конфигурация становится прозрачнее.
Мелочь, но именно из таких мелочей и складывается нормальная поддерживаемость Spring Boot-проекта.
Если у вас есть scheduled task, не стоит хардкодить интервал прямо в аннотации:
`@Scheduled(fixedRate = 5000)`
Лучше вынести значение в конфиг:
`@Scheduled(fixedRateString = "${task.interval}")`
А в
application.properties указать:
`task.interval=5000`
Почему так лучше:
• интервал можно менять без правки кода;
• настройки проще различать для dev, staging и production;
• меньше магических чисел в бизнес-логике;
• конфигурация становится прозрачнее.
Мелочь, но именно из таких мелочей и складывается нормальная поддерживаемость Spring Boot-проекта.
👍10❤7
N+1 в Spring Boot выглядит безобидно, пока прод не начинает молиться на базу данных.
Классический сценарий:
Вы грузите список заказов:
А потом в цикле обращаетесь к
Hibernate сначала делает один запрос за заказами, а потом ещё по одному запросу на каждый заказ, чтобы достать items.
100 заказов = 101 SQL-запрос.
И вот здесь спасает
Он позволяет явно сказать репозиторию, какие связи нужно подтянуть сразу:
В итоге Hibernate может сгенерировать один запрос с
Что получаем:
- меньше SQL-запросов
- меньше нагрузки на БД
- чище код репозитория
- без ручного JPQL
- fetch-стратегия управляется точечно под конкретный кейс
Классический сценарий:
Вы грузите список заказов:
orderRepository.findAll()А потом в цикле обращаетесь к
order.getItems().Hibernate сначала делает один запрос за заказами, а потом ещё по одному запросу на каждый заказ, чтобы достать items.
100 заказов = 101 SQL-запрос.
И вот здесь спасает
@EntityGraph.Он позволяет явно сказать репозиторию, какие связи нужно подтянуть сразу:
@EntityGraph(attributePaths = {"items"})В итоге Hibernate может сгенерировать один запрос с
JOIN, вместо десятков лишних походов в базу.Что получаем:
- меньше SQL-запросов
- меньше нагрузки на БД
- чище код репозитория
- без ручного JPQL
- fetch-стратегия управляется точечно под конкретный кейс
LAZY сам по себе не зло. Зло - когда вы не контролируете, где и как он срабатывает.@EntityGraph - один из самых простых способов держать N+1 под контролем в Spring Boot.❤12👍5
Spring Boot: уберите try/catch из контроллеров
В Spring Boot не нужно размазывать обработку ошибок по каждому endpoint через бесконечные
Для этого есть
Идея простая: вы выносите обработку исключений в один глобальный класс, а контроллеры оставляете чистыми.
Например:
После этого контроллер может выглядеть спокойно:
Если пользователь не найден - сервис кидает ResourceNotFoundException, а Spring сам отправит нормальный 404.
Что это даёт:
• меньше мусора в контроллерах
• единый формат ошибок
• проще поддерживать API
• легче логировать исключения
• меньше копипасты в endpoint-ах
Контроллер должен описывать сценарий запроса, а не превращаться в свалку обработки ошибок.
В Spring Boot не нужно размазывать обработку ошибок по каждому endpoint через бесконечные
try/catch.Для этого есть
@RestControllerAdvice.Идея простая: вы выносите обработку исключений в один глобальный класс, а контроллеры оставляете чистыми.
Например:
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<?> handleNotFound(ResourceNotFoundException ex) {
return ResponseEntity
.status(HttpStatus.NOT_FOUND)
.body(new ErrorResponse("NOT_FOUND", ex.getMessage()));
}
@ExceptionHandler(IllegalArgumentException.class)
public ResponseEntity<?> handleBadRequest(IllegalArgumentException ex) {
return ResponseEntity
.badRequest()
.body(new ErrorResponse("BAD_REQUEST", ex.getMessage()));
}
@ExceptionHandler(Exception.class)
public ResponseEntity<?> handleGeneric(Exception ex) {
return ResponseEntity
.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("INTERNAL_ERROR", "Something went wrong"));
}
}
После этого контроллер может выглядеть спокойно:
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
Если пользователь не найден - сервис кидает ResourceNotFoundException, а Spring сам отправит нормальный 404.
Что это даёт:
• меньше мусора в контроллерах
• единый формат ошибок
• проще поддерживать API
• легче логировать исключения
• меньше копипасты в endpoint-ах
Контроллер должен описывать сценарий запроса, а не превращаться в свалку обработки ошибок.
❤6👍3🔥1🥰1👏1
Forwarded from Java
N+1 в Spring Boot выглядит безобидно, пока прод не начинает молиться на базу данных.
Классический сценарий:
Вы грузите список заказов:
А потом в цикле обращаетесь к
Hibernate сначала делает один запрос за заказами, а потом ещё по одному запросу на каждый заказ, чтобы достать items.
100 заказов = 101 SQL-запрос.
И вот здесь спасает
Он позволяет явно сказать репозиторию, какие связи нужно подтянуть сразу:
В итоге Hibernate может сгенерировать один запрос с
Что получаем:
- меньше SQL-запросов
- меньше нагрузки на БД
- чище код репозитория
- без ручного JPQL
- fetch-стратегия управляется точечно под конкретный кейс
Классический сценарий:
Вы грузите список заказов:
orderRepository.findAll()А потом в цикле обращаетесь к
order.getItems().Hibernate сначала делает один запрос за заказами, а потом ещё по одному запросу на каждый заказ, чтобы достать items.
100 заказов = 101 SQL-запрос.
И вот здесь спасает
@EntityGraph.Он позволяет явно сказать репозиторию, какие связи нужно подтянуть сразу:
@EntityGraph(attributePaths = {"items"})В итоге Hibernate может сгенерировать один запрос с
JOIN, вместо десятков лишних походов в базу.Что получаем:
- меньше SQL-запросов
- меньше нагрузки на БД
- чище код репозитория
- без ручного JPQL
- fetch-стратегия управляется точечно под конкретный кейс
LAZY сам по себе не зло. Зло - когда вы не контролируете, где и как он срабатывает.@EntityGraph - один из самых простых способов держать N+1 под контролем в Spring Boot.❤4👍1🥰1
📌 Magic numbers в Java - мелкая привычка, которая потом превращает поддержку кода в археологию.
Когда в коде встречается
Плохой вариант выглядит так:
Формально код работает. Но смысл спрятан внутри чисел.
Нормальный вариант:
Теперь намерение видно прямо в месте вызова. Не нужно угадывать, почему именно 7, что означает 5000 и можно ли безопасно поменять значение.
Это особенно важно в бизнес-логике, где числа редко бывают случайными. Лимиты, комиссии, таймауты, скидки, сроки жизни сессии, количество попыток - всё это правила продукта, а не просто цифры в коде.
Хорошее правило простое: если число несёт смысл, дай ему имя. Исключения вроде
Чистый код часто начинается не с архитектуры, а с таких скучных вещей: убрать загадочные числа и оставить будущему разработчику понятный контекст.
#java #cleancode
Когда в коде встречается
86400, 7, 1.21 или 5000, компилятору всё равно. Человеку - нет. Через месяц уже приходится вспоминать, что это было: секунд в дне, дней сессии, НДС или задержка перед повторной попыткой.Плохой вариант выглядит так:
if (sessionAgeSeconds > 86400 * 7)Формально код работает. Но смысл спрятан внутри чисел.
Нормальный вариант:
SECONDS_PER_DAYSESSION_DAYSVAT_RATERETRY_DELAY_MSТеперь намерение видно прямо в месте вызова. Не нужно угадывать, почему именно 7, что означает 5000 и можно ли безопасно поменять значение.
Это особенно важно в бизнес-логике, где числа редко бывают случайными. Лимиты, комиссии, таймауты, скидки, сроки жизни сессии, количество попыток - всё это правила продукта, а не просто цифры в коде.
Хорошее правило простое: если число несёт смысл, дай ему имя. Исключения вроде
0, 1, индексов и простых счётчиков можно не трогать.Чистый код часто начинается не с архитектуры, а с таких скучных вещей: убрать загадочные числа и оставить будущему разработчику понятный контекст.
#java #cleancode
❤10👍9
Если работаете с
BufferedReader, InputStream, OutputStream, FileReader, соединениями или другими ресурсами, которые нужно закрывать, используйте try-with-resources.Плохо:
BufferedReader reader = new BufferedReader(new FileReader("data.txt"));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
На первый взгляд всё нормально.
Но если внутри чтения файла вылетит исключение,
reader.close() может не выполниться. В итоге останутся открытые file handles, stream’ы или соединения.Лучше так:
try (BufferedReader reader =
new BufferedReader(new FileReader("data.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}
try-with-resources автоматически вызовет close() даже при исключении.Почему это важно:
* не нужен ручной
finally* меньше boilerplate-кода
* ниже риск утечек ресурсов
* код проще читать
* безопаснее работать с файлами, сетью и БД
Правило простое:
если объект реализует
AutoCloseable или Closeable, почти всегда стоит использовать try-with-resources.Это одна из тех привычек, которые делают Java-код чище и надёжнее.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍4🔥3
Обычный вариант быстро разрастается:
User user = userRepository.findByEmail(email);
if (user != null) {
Address address = user.getAddress();
if (address != null) {
return address.getCity();
}
}
return "unknown";
Проблема не только в количестве строк.
В таких вложенных
if легко забыть один уровень проверки и получить NPE в самом неожиданном месте.С
Optional это можно записать короче и безопаснее:
return userRepository.findByEmail(email)
.map(User::getAddress)
.map(Address::getCity)
.orElse("unknown");
Каждый
map() выполняется только если предыдущее значение существует.Если пользователя нет, адреса нет или город не задан - цепочка спокойно дойдёт до
orElse().Для таких случаев
Optional хорошо работает как способ явно показать:значение может отсутствовать, и это нормальная часть логики.
Главное не превращать
Optional в новую религию.Он особенно полезен на границах методов и в цепочках, где каждый следующий шаг может вернуть
null.Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤3🔥2
Новая фича затрагивает десятки файлов? Тесты становятся сложнее самого кода? А когда бизнес меняет требования — приходится переписывать половину сервиса?
Если это знакомо, то проблема, скорее всего, не в коде.
🚫 Проблема в архитектуре.
🔥 15 июля стартует практический курс по Domain-Driven Design и Clean Architecture на Java.
За 6 недель вы научитесь:
✔️ Организовывать код так, чтобы новые требования не приводили к переписыванию половины сервиса
✔️ Изолировать бизнес-логику от HTTP, Kafka, БД и других технических деталей
✔️ Строить сервисы, которые проще поддерживать, тестировать и развивать
✔️ Писать тесты, которые проверяют поведение системы, а не набор моков
✔️ Добавлять новые интеграции без изменений в ядре приложения
✔️ Уверенно работать со сложной бизнес-логикой без постоянного роста технического долга
Для этого на практике разберёте Domain-Driven Design, Aggregate, Entity и Value Object, освоите Domain Events, Clean Architecture, Hexagonal и Onion Architecture.
📦 На курсе вы соберёте полноценный сервис диспетчеризации заказов и получите готовый шаблон микросервиса, который сможете использовать в рабочих проектах.
Автор курса — Кирилл Ветчинкин, архитектор Авито, ex Staff Engineer в Купер.
👉 Посмотрите первый модуль и оцените, насколько этот подход подходит для ваших проектов: https://microarch.ru/courses/ddd/languages/java?utm_source=posev&utm_medium=erid:2VtzqwyW4fK&utm_campaign=1
Реклама. ИП Ветчинкин К.Е. ИНН: 773376451099 Erid: 2VtzqwyW4fK
Если это знакомо, то проблема, скорее всего, не в коде.
🚫 Проблема в архитектуре.
🔥 15 июля стартует практический курс по Domain-Driven Design и Clean Architecture на Java.
За 6 недель вы научитесь:
✔️ Организовывать код так, чтобы новые требования не приводили к переписыванию половины сервиса
✔️ Изолировать бизнес-логику от HTTP, Kafka, БД и других технических деталей
✔️ Строить сервисы, которые проще поддерживать, тестировать и развивать
✔️ Писать тесты, которые проверяют поведение системы, а не набор моков
✔️ Добавлять новые интеграции без изменений в ядре приложения
✔️ Уверенно работать со сложной бизнес-логикой без постоянного роста технического долга
Для этого на практике разберёте Domain-Driven Design, Aggregate, Entity и Value Object, освоите Domain Events, Clean Architecture, Hexagonal и Onion Architecture.
📦 На курсе вы соберёте полноценный сервис диспетчеризации заказов и получите готовый шаблон микросервиса, который сможете использовать в рабочих проектах.
Автор курса — Кирилл Ветчинкин, архитектор Авито, ex Staff Engineer в Купер.
👉 Посмотрите первый модуль и оцените, насколько этот подход подходит для ваших проектов: https://microarch.ru/courses/ddd/languages/java?utm_source=posev&utm_medium=erid:2VtzqwyW4fK&utm_campaign=1
Реклама. ИП Ветчинкин К.Е. ИНН: 773376451099 Erid: 2VtzqwyW4fK
❤1👍1
Forwarded from Java
N+1 в Spring Boot выглядит безобидно, пока прод не начинает молиться на базу данных.
Классический сценарий:
Вы грузите список заказов:
А потом в цикле обращаетесь к
Hibernate сначала делает один запрос за заказами, а потом ещё по одному запросу на каждый заказ, чтобы достать items.
100 заказов = 101 SQL-запрос.
И вот здесь спасает
Он позволяет явно сказать репозиторию, какие связи нужно подтянуть сразу:
В итоге Hibernate может сгенерировать один запрос с
Что получаем:
- меньше SQL-запросов
- меньше нагрузки на БД
- чище код репозитория
- без ручного JPQL
- fetch-стратегия управляется точечно под конкретный кейс
Классический сценарий:
Вы грузите список заказов:
orderRepository.findAll()А потом в цикле обращаетесь к
order.getItems().Hibernate сначала делает один запрос за заказами, а потом ещё по одному запросу на каждый заказ, чтобы достать items.
100 заказов = 101 SQL-запрос.
И вот здесь спасает
@EntityGraph.Он позволяет явно сказать репозиторию, какие связи нужно подтянуть сразу:
@EntityGraph(attributePaths = {"items"})В итоге Hibernate может сгенерировать один запрос с
JOIN, вместо десятков лишних походов в базу.Что получаем:
- меньше SQL-запросов
- меньше нагрузки на БД
- чище код репозитория
- без ручного JPQL
- fetch-стратегия управляется точечно под конкретный кейс
LAZY сам по себе не зло. Зло - когда вы не контролируете, где и как он срабатывает.@EntityGraph - один из самых простых способов держать N+1 под контролем в Spring Boot.👍7❤4🥰2🔥1
💡 Java: делегирование часто безопаснее наследования
Наследование кажется удобным, пока суперкласс не начинает жить своей жизнью.
Если класс наследуется от родителя, он получает весь его API. Любое изменение сверху может внезапно сломать поведение дочернего класса.
С делегированием проще: объект хранит внутри helper/service и передаёт ему нужные вызовы.
Плюсы:
* меньше жёсткой связности
* проще тестировать и мокать
* легче менять реализацию
* меньше риска сломаться из-за изменений в родителе
Правило простое: наследуйтесь только когда связь is-a действительно железная. В остальных случаях чаще лучше композиция и делегирование.
Наследование кажется удобным, пока суперкласс не начинает жить своей жизнью.
Если класс наследуется от родителя, он получает весь его API. Любое изменение сверху может внезапно сломать поведение дочернего класса.
С делегированием проще: объект хранит внутри helper/service и передаёт ему нужные вызовы.
Плюсы:
* меньше жёсткой связности
* проще тестировать и мокать
* легче менять реализацию
* меньше риска сломаться из-за изменений в родителе
Правило простое: наследуйтесь только когда связь is-a действительно железная. В остальных случаях чаще лучше композиция и делегирование.
👍6❤4🔥1
Если хочешь развиваться в бэкенд-разработке — выстроить сильную базу, углубиться в архитектуру или перейти в роль тимлида — в Центральном университете есть магистратура под каждый сценарий. И на нее можно получить грант до 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